spect8-mcp 0.2.1 → 0.2.4

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.
@@ -1,37 +1,29 @@
1
1
  import type { Logger } from "../logger.js";
2
2
  import type { Batcher } from "../transport/batcher.js";
3
- export interface CursorTailerOptions {
3
+ export interface CursorSqliteTailerOptions {
4
4
  sqlitePath: string;
5
5
  developerId: string;
6
6
  logger: Logger;
7
7
  batcher: Batcher;
8
- pollIntervalMs?: number;
9
8
  getSessionId: () => string;
9
+ pollIntervalMs?: number;
10
10
  }
11
11
  /**
12
- * Polls Cursor's SQLite state file for new `bubbleId:*` rows and posts any
13
- * token usage they carry to `/api/v1/token_events`. Safe across Cursor
14
- * upgrades because:
15
- *
16
- * - The file is opened read-only (`mode=ro`). If Cursor rewrites it we
17
- * simply re-open on the next tick.
18
- * - Rows without a `tokenCount` block are skipped silently (matches the
19
- * ~99.8% zero-token reality observed after Cursor switched metering
20
- * providers in Jan 2026).
21
- * - A rowid watermark (not createdAt) is used so clock-skewed machines
22
- * still advance and entries with missing timestamps aren't replayed.
12
+ * Polls Cursor's state database for new `bubbleId:*` rows and emits token
13
+ * usage to the ingest batcher. The implementation shells out to the system
14
+ * `sqlite3` binary to avoid native Node dependencies in the published package.
23
15
  */
24
16
  export declare class CursorSqliteTailer {
25
- private readonly opts;
26
- private db;
17
+ private readonly options;
27
18
  private timer;
28
19
  private watermarkRowId;
29
- private readonly pollIntervalMs;
30
- constructor(opts: CursorTailerOptions);
20
+ constructor(options: CursorSqliteTailerOptions);
31
21
  start(): void;
32
- stop(): void;
33
- private tryOpen;
34
- private tick;
22
+ stop(): Promise<void>;
23
+ private poll;
24
+ private collectLatestRows;
25
+ private readMaxRowId;
26
+ private queryJson;
35
27
  private toTokenEvent;
36
28
  }
37
29
  //# sourceMappingURL=cursor_sqlite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor_sqlite.d.ts","sourceRoot":"","sources":["../../src/collectors/cursor_sqlite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGvD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,MAAM,CAAC;CAC5B;AAoBD;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAkB;IAMjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAEX,IAAI,EAAE,mBAAmB;IAItD,KAAK,IAAI,IAAI;IAqBb,IAAI,IAAI,IAAI;IAaZ,OAAO,CAAC,OAAO;YAyBD,IAAI;IA4DlB,OAAO,CAAC,YAAY;CAsBrB"}
1
+ {"version":3,"file":"cursor_sqlite.d.ts","sourceRoot":"","sources":["../../src/collectors/cursor_sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGvD,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAqBD;;;;GAIG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,cAAc,CAAK;gBAEE,OAAO,EAAE,yBAAyB;IAE/D,KAAK,IAAI,IAAI;IAUP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,IAAI;IAwBlB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,YAAY;CAsBrB"}
@@ -1,164 +1,129 @@
1
- import Database from "better-sqlite3";
1
+ import { execFileSync } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  /**
4
- * Polls Cursor's SQLite state file for new `bubbleId:*` rows and posts any
5
- * token usage they carry to `/api/v1/token_events`. Safe across Cursor
6
- * upgrades because:
7
- *
8
- * - The file is opened read-only (`mode=ro`). If Cursor rewrites it we
9
- * simply re-open on the next tick.
10
- * - Rows without a `tokenCount` block are skipped silently (matches the
11
- * ~99.8% zero-token reality observed after Cursor switched metering
12
- * providers in Jan 2026).
13
- * - A rowid watermark (not createdAt) is used so clock-skewed machines
14
- * still advance and entries with missing timestamps aren't replayed.
4
+ * Polls Cursor's state database for new `bubbleId:*` rows and emits token
5
+ * usage to the ingest batcher. The implementation shells out to the system
6
+ * `sqlite3` binary to avoid native Node dependencies in the published package.
15
7
  */
16
8
  export class CursorSqliteTailer {
17
- opts;
18
- db = null;
9
+ options;
19
10
  timer = null;
20
11
  watermarkRowId = 0;
21
- pollIntervalMs;
22
- constructor(opts) {
23
- this.opts = opts;
24
- this.pollIntervalMs = opts.pollIntervalMs ?? 5_000;
12
+ constructor(options) {
13
+ this.options = options;
25
14
  }
26
15
  start() {
27
16
  if (this.timer)
28
17
  return;
29
- if (this.tryOpen() && this.db) {
30
- try {
31
- const max = this.db
32
- .prepare("SELECT MAX(rowid) AS maxId FROM cursorDiskKV WHERE key LIKE 'bubbleId:%'")
33
- .get();
34
- if (max?.maxId) {
35
- this.watermarkRowId = max.maxId;
36
- this.opts.logger.debug(`cursor_sqlite: initialized watermark to ${this.watermarkRowId}`);
37
- }
38
- }
39
- catch (err) {
40
- this.opts.logger.debug("cursor_sqlite: initial watermark query failed", err.message);
41
- }
42
- }
43
- this.timer = setInterval(() => void this.tick(), this.pollIntervalMs);
18
+ this.watermarkRowId = this.readMaxRowId();
19
+ const interval = this.options.pollIntervalMs ?? 5_000;
20
+ this.timer = setInterval(() => void this.poll(), interval);
44
21
  this.timer.unref?.();
22
+ void this.poll();
23
+ this.options.logger.info("Cursor SQLite tailer started (polling mode)");
45
24
  }
46
- stop() {
25
+ async stop() {
47
26
  if (this.timer) {
48
27
  clearInterval(this.timer);
49
28
  this.timer = null;
50
29
  }
51
- try {
52
- this.db?.close();
30
+ }
31
+ async poll() {
32
+ const rows = this.collectLatestRows();
33
+ if (rows.length === 0)
34
+ return;
35
+ let queued = 0;
36
+ for (const row of rows) {
37
+ try {
38
+ const event = this.toTokenEvent(JSON.parse(row.value));
39
+ if (event) {
40
+ this.options.batcher.enqueueTokenEvent(event);
41
+ queued++;
42
+ }
43
+ }
44
+ catch {
45
+ // Cursor stores mixed JSON payloads in this table; ignore malformed rows.
46
+ }
47
+ finally {
48
+ this.watermarkRowId = Math.max(this.watermarkRowId, row.rowid);
49
+ }
53
50
  }
54
- catch {
55
- // close on a readonly file is best-effort
51
+ if (queued > 0) {
52
+ this.options.logger.debug(`cursor_sqlite: queued ${queued} token events`);
56
53
  }
57
- this.db = null;
58
54
  }
59
- tryOpen() {
60
- if (this.db)
61
- return true;
62
- if (!existsSync(this.opts.sqlitePath)) {
63
- this.opts.logger.debug(`cursor_sqlite: state file not found at ${this.opts.sqlitePath}`);
64
- return false;
55
+ collectLatestRows() {
56
+ if (!existsSync(this.options.sqlitePath)) {
57
+ return [];
65
58
  }
66
59
  try {
67
- this.db = new Database(this.opts.sqlitePath, {
68
- fileMustExist: true,
69
- readonly: true,
70
- });
71
- this.db.pragma("journal_mode = WAL");
72
- return true;
60
+ const query = "SELECT rowid, key, value FROM cursorDiskKV " +
61
+ "WHERE key LIKE 'bubbleId:%' AND rowid > ? ORDER BY rowid";
62
+ const output = this.queryJson(query, String(this.watermarkRowId));
63
+ if (!output || output.trim() === "")
64
+ return [];
65
+ return JSON.parse(output);
73
66
  }
74
67
  catch (err) {
75
- this.opts.logger.warn("cursor_sqlite: failed to open db", err.message);
76
- this.db = null;
77
- return false;
68
+ this.options.logger.debug("cursor_sqlite: poll failed", err.message);
69
+ return [];
78
70
  }
79
71
  }
80
- async tick() {
81
- if (!this.tryOpen() || !this.db)
82
- return;
83
- let rows = [];
84
- try {
85
- rows = this.db
86
- .prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE 'bubbleId:%' AND rowid > ? ORDER BY rowid")
87
- .all(this.watermarkRowId);
72
+ readMaxRowId() {
73
+ if (!existsSync(this.options.sqlitePath)) {
74
+ return 0;
88
75
  }
89
- catch (err) {
90
- this.opts.logger.debug("cursor_sqlite: tick query failed (will retry)", err.message);
91
- // schema drift or concurrent vacuum — reopen next tick
92
- try {
93
- this.db.close();
94
- }
95
- catch {
96
- /* noop */
97
- }
98
- this.db = null;
99
- return;
100
- }
101
- if (rows.length === 0)
102
- return;
103
76
  try {
104
- const max = this.db
105
- .prepare("SELECT MAX(rowid) AS maxId FROM cursorDiskKV WHERE key LIKE 'bubbleId:%'")
106
- .get();
107
- if (max?.maxId)
108
- this.watermarkRowId = max.maxId;
77
+ const output = this.queryJson("SELECT MAX(rowid) AS max_rowid FROM cursorDiskKV WHERE key LIKE 'bubbleId:%'");
78
+ const [row] = JSON.parse(output || "[]");
79
+ return row?.max_rowid ?? 0;
109
80
  }
110
81
  catch {
111
- /* best-effort watermark */
112
- }
113
- if (rows.length > 0) {
114
- this.opts.logger.debug(`cursor_sqlite: found ${rows.length} new rows`);
115
- }
116
- let posted = 0;
117
- for (const row of rows) {
118
- try {
119
- const parsed = JSON.parse(row.value);
120
- const event = this.toTokenEvent(parsed);
121
- if (event) {
122
- this.opts.batcher.enqueueTokenEvent(event);
123
- posted++;
124
- }
125
- }
126
- catch {
127
- // unparsable row — ignore silently
128
- }
129
- }
130
- if (posted > 0) {
131
- this.opts.logger.debug(`cursor_sqlite: queued ${posted} events`);
82
+ return 0;
132
83
  }
133
84
  }
85
+ queryJson(query, ...params) {
86
+ const escapedParams = params.map((p) => p.replaceAll("'", "''"));
87
+ const parameterized = escapedParams.reduce((sql, param) => sql.replace("?", `'${param}'`), query);
88
+ return execFileSync("sqlite3", [
89
+ "-readonly",
90
+ "-json",
91
+ this.options.sqlitePath,
92
+ parameterized,
93
+ ], {
94
+ encoding: "utf8",
95
+ timeout: 2_000,
96
+ });
97
+ }
134
98
  toTokenEvent(bubble) {
135
- const tc = bubble.tokenCount;
136
- const input = tc?.inputTokens ?? null;
137
- const output = tc?.outputTokens ?? null;
138
99
  const requestId = bubble.requestId ?? bubble.bubbleId;
139
100
  if (!requestId)
140
101
  return null;
141
- const ts = toMs(bubble.createdAt);
102
+ const tokenCount = bubble.tokenCount;
103
+ const input = tokenCount?.inputTokens ?? null;
104
+ const output = tokenCount?.outputTokens ?? null;
105
+ if ((input ?? 0) + (output ?? 0) === 0)
106
+ return null;
142
107
  return {
143
108
  request_id: requestId,
144
- session_id: this.opts.getSessionId(),
145
- developer_id: this.opts.developerId,
146
- timestamp_ms: ts ?? Date.now(),
109
+ session_id: this.options.getSessionId(),
110
+ developer_id: this.options.developerId,
111
+ timestamp_ms: toMs(bubble.createdAt) ?? Date.now(),
147
112
  ide_name: "cursor",
148
113
  model_name: bubble.modelInfo?.modelName ?? bubble.modelInfo?.model ?? null,
149
114
  input_tokens: input,
150
115
  output_tokens: output,
151
- cache_read_input_tokens: tc?.cacheReadInputTokens ?? null,
152
- cache_creation_input_tokens: tc?.cacheCreationInputTokens ?? null,
116
+ cache_read_input_tokens: tokenCount?.cacheReadInputTokens ?? null,
117
+ cache_creation_input_tokens: tokenCount?.cacheCreationInputTokens ?? null,
153
118
  };
154
119
  }
155
120
  }
156
- function toMs(val) {
157
- if (val == null)
121
+ function toMs(value) {
122
+ if (value == null)
158
123
  return null;
159
- if (typeof val === "number")
160
- return val > 1e12 ? val : val * 1000;
161
- const parsed = Date.parse(val);
124
+ if (typeof value === "number")
125
+ return value > 1e12 ? value : value * 1000;
126
+ const parsed = Date.parse(value);
162
127
  return Number.isFinite(parsed) ? parsed : null;
163
128
  }
164
129
  //# sourceMappingURL=cursor_sqlite.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor_sqlite.js","sourceRoot":"","sources":["../../src/collectors/cursor_sqlite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor_sqlite.js","sourceRoot":"","sources":["../../src/collectors/cursor_sqlite.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -3,7 +3,7 @@ declare const ConfigFileSchema: z.ZodObject<{
3
3
  ingest_url: z.ZodOptional<z.ZodString>;
4
4
  ingest_hmac_key: z.ZodOptional<z.ZodString>;
5
5
  developer_id: z.ZodOptional<z.ZodString>;
6
- ide_name: z.ZodOptional<z.ZodEnum<["cursor", "claude_code", "other"]>>;
6
+ ide_name: z.ZodOptional<z.ZodString>;
7
7
  cursor_sqlite_path: z.ZodOptional<z.ZodString>;
8
8
  claude_projects_root: z.ZodOptional<z.ZodString>;
9
9
  batch_interval_ms: z.ZodOptional<z.ZodNumber>;
@@ -17,7 +17,7 @@ declare const ConfigFileSchema: z.ZodObject<{
17
17
  ingest_url: z.ZodOptional<z.ZodString>;
18
18
  ingest_hmac_key: z.ZodOptional<z.ZodString>;
19
19
  developer_id: z.ZodOptional<z.ZodString>;
20
- ide_name: z.ZodOptional<z.ZodEnum<["cursor", "claude_code", "other"]>>;
20
+ ide_name: z.ZodOptional<z.ZodString>;
21
21
  cursor_sqlite_path: z.ZodOptional<z.ZodString>;
22
22
  claude_projects_root: z.ZodOptional<z.ZodString>;
23
23
  batch_interval_ms: z.ZodOptional<z.ZodNumber>;
@@ -31,7 +31,7 @@ declare const ConfigFileSchema: z.ZodObject<{
31
31
  ingest_url: z.ZodOptional<z.ZodString>;
32
32
  ingest_hmac_key: z.ZodOptional<z.ZodString>;
33
33
  developer_id: z.ZodOptional<z.ZodString>;
34
- ide_name: z.ZodOptional<z.ZodEnum<["cursor", "claude_code", "other"]>>;
34
+ ide_name: z.ZodOptional<z.ZodString>;
35
35
  cursor_sqlite_path: z.ZodOptional<z.ZodString>;
36
36
  claude_projects_root: z.ZodOptional<z.ZodString>;
37
37
  batch_interval_ms: z.ZodOptional<z.ZodNumber>;
@@ -46,7 +46,7 @@ export interface ResolvedConfig {
46
46
  ingestUrl: string;
47
47
  ingestHmacKey: string;
48
48
  developerId: string;
49
- ideName: "cursor" | "claude_code" | "other";
49
+ ideName: string;
50
50
  cursorSqlitePath: string;
51
51
  claudeProjectsRoot: string;
52
52
  batchIntervalMs: number;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgBN,CAAC;AAEjB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC1D;AA+DD,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAOnF;AAED,wBAAgB,UAAU,IAAI,cAAc,CAwD3C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgBN,CAAC;AAEjB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC1D;AA+DD,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAOnF;AAED,wBAAgB,UAAU,IAAI,cAAc,CAwD3C"}
package/dist/config.js CHANGED
@@ -7,7 +7,7 @@ const ConfigFileSchema = z
7
7
  ingest_url: z.string().url().optional(),
8
8
  ingest_hmac_key: z.string().optional(),
9
9
  developer_id: z.string().optional(),
10
- ide_name: z.enum(["cursor", "claude_code", "other"]).optional(),
10
+ ide_name: z.string().min(1).optional(),
11
11
  cursor_sqlite_path: z.string().optional(),
12
12
  claude_projects_root: z.string().optional(),
13
13
  batch_interval_ms: z.number().int().positive().optional(),
@@ -66,7 +66,7 @@ export function loadConfig() {
66
66
  if (!existsSync(CONFIG_DIR)) {
67
67
  mkdirSync(CONFIG_DIR, { recursive: true });
68
68
  }
69
- const ingestUrl = process.env.SPECT8_INGEST_URL ?? file.ingest_url ?? "https://spect8-production.up.railway.app";
69
+ const ingestUrl = process.env.SPECT8_INGEST_URL ?? file.ingest_url ?? "https://cooperative-presence-production-d9a8.up.railway.app";
70
70
  const ingestHmacKey = process.env.SPECT8_INGEST_HMAC_KEY ?? file.ingest_hmac_key ?? "";
71
71
  const developerId = process.env.SPECT8_DEVELOPER_ID ?? file.developer_id ?? "";
72
72
  return {
@@ -90,7 +90,7 @@ export function loadConfig() {
90
90
  50,
91
91
  offlineQueuePath: process.env.SPECT8_OFFLINE_QUEUE_PATH ??
92
92
  file.offline_queue_path ??
93
- join(CONFIG_DIR, "offline_queue.db"),
93
+ join(CONFIG_DIR, "offline_queue.json"),
94
94
  sessionFilePath: process.env.SPECT8_SESSION_FILE ??
95
95
  file.session_file_path ??
96
96
  join(CONFIG_DIR, "session"),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import type { ToolEvent, TokenEvent } from "../types.js";
5
5
  export interface HookBundle {
6
6
  sessionId: string;
7
7
  developerId: string;
8
- ideName: "cursor" | "claude_code" | "other";
8
+ ideName: string;
9
9
  batcher: Batcher;
10
10
  client: IngestClient;
11
11
  queue: OfflineQueue;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/hooks/shared.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CA6B7C;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,EAC5B,KAAK,GAAE,OAAO,CAAC,SAAS,CAAM,GAC7B,SAAS,CAWX;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,UAAU,EAAE,CAgDd;AAiBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/hooks/shared.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CA6B7C;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,EAC5B,KAAK,GAAE,OAAO,CAAC,SAAS,CAAM,GAC7B,SAAS,CAWX;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,UAAU,EAAE,CAgDd;AAiBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE"}
@@ -0,0 +1,41 @@
1
+ export declare const DEFAULT_INGEST_URL = "https://cooperative-presence-production-d9a8.up.railway.app";
2
+ export declare const DEFAULT_FRONTEND_URL = "https://www.spect8ai.tech";
3
+ export declare const PACKAGE_NAME = "spect8-mcp";
4
+ export declare const RULES_CONTENT = "# Spect8 AI Proficiency Rules\nYou are integrated with the Spect8 Telemetry system.\n\nRequired workflow:\n1. Call `mcp_spect8_start_task` at the beginning of every user request.\n2. Call `mcp_spect8_report_activity` after reading files, writing files, running commands, searching files, or checking diffs.\n3. Call `mcp_spect8_end_task` once the objective is complete.\n\nWhen reporting activity, include the IDE name when known and pass available metadata such as file paths, command strings, exit codes, file sizes, search queries, and diff counts.\n";
5
+ export type InstallTarget = "cursor" | "claude-code" | "rules" | "all";
6
+ export interface InstallPaths {
7
+ homeDir: string;
8
+ projectDir: string;
9
+ }
10
+ export interface InstallResult {
11
+ changed: string[];
12
+ unchanged: string[];
13
+ warnings: string[];
14
+ }
15
+ export interface DoctorCheck {
16
+ name: string;
17
+ ok: boolean;
18
+ detail: string;
19
+ }
20
+ export interface DoctorResult {
21
+ checks: DoctorCheck[];
22
+ ok: boolean;
23
+ }
24
+ export interface PromptOptions {
25
+ ide?: string;
26
+ token?: string;
27
+ ingestUrl?: string;
28
+ }
29
+ export interface DoctorOptions {
30
+ target?: InstallTarget;
31
+ }
32
+ export declare function defaultInstallPaths(): InstallPaths;
33
+ export declare function createEmptyResult(): InstallResult;
34
+ export declare function mergeResults(...results: InstallResult[]): InstallResult;
35
+ export declare function installTarget(target: InstallTarget, paths?: InstallPaths): InstallResult;
36
+ export declare function installCursor(paths: InstallPaths): InstallResult;
37
+ export declare function installClaudeCode(paths: InstallPaths): InstallResult;
38
+ export declare function installRules(paths: InstallPaths): InstallResult;
39
+ export declare function runDoctor(paths?: InstallPaths, options?: DoctorOptions): DoctorResult;
40
+ export declare function generateInstallPrompt(options?: PromptOptions): string;
41
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,kBAAkB,gEAAgE,CAAC;AAChG,eAAO,MAAM,oBAAoB,8BAA8B,CAAC;AAChE,eAAO,MAAM,YAAY,eAAe,CAAC;AAEzC,eAAO,MAAM,aAAa,8iBASzB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,KAAK,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,IAAI,YAAY,CAKlD;AAED,wBAAgB,iBAAiB,IAAI,aAAa,CAEjD;AAED,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,CAMvE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,KAAK,GAAE,YAAoC,GAC1C,aAAa,CAWf;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAuBhE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAiBpE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAW/D;AAED,wBAAgB,SAAS,CACvB,KAAK,GAAE,YAAoC,EAC3C,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAyEd;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAqBzE"}