@cogniguard/mcp-server 0.1.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/README.md ADDED
@@ -0,0 +1,109 @@
1
+ # @cogniguard/mcp-server
2
+
3
+ CogniGuard MCP server + CLI capture for AI coding agents.
4
+
5
+ Track the cognitive impact of your AI coding sessions — the same analysis CogniGuard provides for ChatGPT/Claude/Gemini on the web, now for Claude Code, Cursor, Cline, and other MCP-compatible agents.
6
+
7
+ ## Quick Setup (Claude Code)
8
+
9
+ ### Option A: One-command MCP registration
10
+
11
+ ```bash
12
+ claude mcp add cogniguard -- npx @cogniguard/mcp-server
13
+ ```
14
+
15
+ This registers CogniGuard as an MCP tool server. Claude Code can then call `get_cognitive_score`, `get_session_metrics`, and `get_coaching_advice` during your sessions.
16
+
17
+ ### Option B: Full setup with automatic prompt capture
18
+
19
+ ```bash
20
+ npx @cogniguard/mcp-server setup
21
+ ```
22
+
23
+ This interactive wizard:
24
+ 1. Stores your CogniGuard credentials in `~/.cogniguard/config.json`
25
+ 2. Registers the MCP server in Claude Code
26
+ 3. Registers a `UserPromptSubmit` hook for automatic prompt capture
27
+ 4. Tests the connection
28
+
29
+ After setup, every prompt you send to Claude Code is automatically captured and analyzed — same as the Chrome extension, but for your terminal.
30
+
31
+ ## What You Need
32
+
33
+ - A CogniGuard account at [cogniguard.eu](https://cogniguard.eu) (email + password)
34
+ - That's it — the setup wizard handles everything else
35
+
36
+ ## MCP Tools
37
+
38
+ | Tool | Description |
39
+ |------|-------------|
40
+ | `log_prompt` | Capture a prompt for cognitive analysis |
41
+ | `get_cognitive_score` | Your cognitive health score (0-100) for the last 7 days |
42
+ | `get_session_metrics` | Today's prompt count, zone distribution, session duration |
43
+ | `get_coaching_advice` | Personalized cognitive coaching based on your patterns |
44
+
45
+ ## How It Works
46
+
47
+ ```
48
+ You type a prompt in Claude Code
49
+
50
+ UserPromptSubmit hook fires automatically
51
+
52
+ cogniguard-capture reads the prompt from stdin
53
+
54
+ POST to Supabase prompt_analyses table
55
+
56
+ cognitive-agent-langgraph enriches with semantic analysis
57
+
58
+ Same dashboard at cogniguard.eu shows all your data
59
+ ```
60
+
61
+ The MCP tools let the agent proactively check your cognitive state and surface recommendations during the session.
62
+
63
+ ## Manual Configuration
64
+
65
+ If the setup wizard can't find your Claude Code installation, add to `~/.claude/settings.json`:
66
+
67
+ ```json
68
+ {
69
+ "hooks": {
70
+ "UserPromptSubmit": [
71
+ {
72
+ "matcher": "",
73
+ "hooks": [
74
+ {
75
+ "type": "command",
76
+ "command": "npx @cogniguard/mcp-server capture"
77
+ }
78
+ ]
79
+ }
80
+ ]
81
+ },
82
+ "mcpServers": {
83
+ "cogniguard": {
84
+ "command": "npx",
85
+ "args": ["@cogniguard/mcp-server"]
86
+ }
87
+ }
88
+ }
89
+ ```
90
+
91
+ ## Other Agents
92
+
93
+ The MCP server works with any MCP-compatible agent. Config locations differ:
94
+
95
+ - **Cursor**: Settings > MCP Servers
96
+ - **Cline**: VS Code settings
97
+ - **Windsurf**: MCP configuration
98
+ - **Codex CLI**: `~/.codex/config.json`
99
+
100
+ The capture hook is Claude Code–specific. For other agents, use the `log_prompt` MCP tool or integrate at the shell level.
101
+
102
+ ## Development
103
+
104
+ ```bash
105
+ cd packages/mcp-server
106
+ npm install
107
+ npm run build
108
+ npm run dev # watch mode
109
+ ```
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CogniGuard CLI capture script.
4
+ *
5
+ * Designed to be invoked by Claude Code's UserPromptSubmit hook.
6
+ * Reads hook payload from stdin, fires a prompt capture to Supabase,
7
+ * and exits immediately. Must never block or throw — the user's
8
+ * agent session depends on this returning fast.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CogniGuard CLI capture script.
4
+ *
5
+ * Designed to be invoked by Claude Code's UserPromptSubmit hook.
6
+ * Reads hook payload from stdin, fires a prompt capture to Supabase,
7
+ * and exits immediately. Must never block or throw — the user's
8
+ * agent session depends on this returning fast.
9
+ */
10
+ import { loadConfig, saveConfig, SUPABASE_URL, SUPABASE_ANON_KEY } from "./lib/config.js";
11
+ async function getValidToken(config) {
12
+ let expired = false;
13
+ try {
14
+ const payload = config.accessToken.split(".")[1];
15
+ const decoded = JSON.parse(Buffer.from(payload, "base64url").toString());
16
+ expired = Date.now() >= decoded.exp * 1000 - 60_000;
17
+ }
18
+ catch { /* assume valid */ }
19
+ if (!expired)
20
+ return config;
21
+ if (!config.refreshToken)
22
+ return config;
23
+ try {
24
+ const res = await fetch(`${SUPABASE_URL}/auth/v1/token?grant_type=refresh_token`, {
25
+ method: "POST",
26
+ headers: { "Content-Type": "application/json", apikey: SUPABASE_ANON_KEY },
27
+ body: JSON.stringify({ refresh_token: config.refreshToken }),
28
+ signal: AbortSignal.timeout(3000),
29
+ });
30
+ if (!res.ok)
31
+ return config;
32
+ const data = (await res.json());
33
+ const updated = {
34
+ ...config,
35
+ accessToken: data.access_token,
36
+ refreshToken: data.refresh_token,
37
+ tokenExpiresAt: Date.now() + data.expires_in * 1000,
38
+ };
39
+ saveConfig(updated);
40
+ return updated;
41
+ }
42
+ catch {
43
+ return config;
44
+ }
45
+ }
46
+ async function main() {
47
+ try {
48
+ const raw = await readStdin();
49
+ if (!raw.trim())
50
+ return;
51
+ const payload = JSON.parse(raw);
52
+ const promptText = extractPromptText(payload);
53
+ if (!promptText || promptText.length < 2)
54
+ return;
55
+ const config = await getValidToken(loadConfig());
56
+ const row = {
57
+ user_id: config.userId,
58
+ prompt_text: promptText.slice(0, 10000),
59
+ ai_tool: "claude-code",
60
+ ai_model: payload.model ?? null,
61
+ conversation_id: payload.session_id ?? null,
62
+ cognitive_impact: "medium",
63
+ complexity_score: 50,
64
+ thinking_required: 50,
65
+ skills_engaged: [],
66
+ analyzed_at: new Date().toISOString(),
67
+ task_category: "Practical / Task-Oriented Skills",
68
+ };
69
+ const hdrs = {
70
+ "Content-Type": "application/json",
71
+ apikey: config.supabaseAnonKey,
72
+ Authorization: `Bearer ${config.accessToken}`,
73
+ };
74
+ const insertRes = await fetch(`${config.supabaseUrl}/rest/v1/prompt_analyses`, {
75
+ method: "POST",
76
+ headers: { ...hdrs, Prefer: "return=representation" },
77
+ body: JSON.stringify(row),
78
+ signal: AbortSignal.timeout(5000),
79
+ });
80
+ if (!insertRes.ok)
81
+ return;
82
+ const inserted = (await insertRes.json());
83
+ const promptId = inserted?.[0]?.id;
84
+ if (!promptId)
85
+ return;
86
+ fetch(`${config.supabaseUrl}/functions/v1/cognitive-agent-langgraph`, {
87
+ method: "POST",
88
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${config.accessToken}` },
89
+ body: JSON.stringify({
90
+ promptText: promptText.slice(0, 10000),
91
+ aiTool: "claude",
92
+ userId: config.userId,
93
+ promptId,
94
+ basicAnalysis: null,
95
+ conversationContext: null,
96
+ sessionContext: { source: "cli", working_directory: payload.cwd ?? null },
97
+ }),
98
+ signal: AbortSignal.timeout(10000),
99
+ }).catch(() => { });
100
+ }
101
+ catch {
102
+ // Never throw, never block
103
+ }
104
+ }
105
+ function extractPromptText(payload) {
106
+ if (typeof payload.prompt === "string")
107
+ return payload.prompt;
108
+ if (payload.prompt && typeof payload.prompt.content === "string")
109
+ return payload.prompt.content;
110
+ return null;
111
+ }
112
+ function readStdin() {
113
+ return new Promise((resolve) => {
114
+ const chunks = [];
115
+ const timeout = setTimeout(() => resolve(""), 2000);
116
+ process.stdin.on("data", (chunk) => chunks.push(chunk));
117
+ process.stdin.on("end", () => {
118
+ clearTimeout(timeout);
119
+ resolve(Buffer.concat(chunks).toString("utf-8"));
120
+ });
121
+ process.stdin.on("error", () => {
122
+ clearTimeout(timeout);
123
+ resolve("");
124
+ });
125
+ });
126
+ }
127
+ main();
128
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const SUPABASE_URL = "https://xofsmvbttpsxvtsrccfh.supabase.co";
2
+ export declare const SUPABASE_ANON_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InhvZnNtdmJ0dHBzeHZ0c3JjY2ZoIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTAxMDE5OTQsImV4cCI6MjA2NTY3Nzk5NH0.UgRxyx9p2qou2vOQS5M9y9M2n5ej28D6ldH0e72V038";
3
+ export interface CogniGuardConfig {
4
+ supabaseUrl: string;
5
+ supabaseAnonKey: string;
6
+ accessToken: string;
7
+ refreshToken: string;
8
+ userId: string;
9
+ email?: string;
10
+ tokenExpiresAt?: number;
11
+ }
12
+ export declare function getConfigDir(): string;
13
+ export declare function getConfigPath(): string;
14
+ export declare function configExists(): boolean;
15
+ export declare function loadConfig(): CogniGuardConfig;
16
+ export declare function saveConfig(config: CogniGuardConfig): void;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,6CAA6C,CAAC;AACvE,eAAO,MAAM,iBAAiB,qNACsL,CAAC;AAErN,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAoB7C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAKzD"}
@@ -0,0 +1,36 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ export const SUPABASE_URL = "https://xofsmvbttpsxvtsrccfh.supabase.co";
5
+ export const SUPABASE_ANON_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InhvZnNtdmJ0dHBzeHZ0c3JjY2ZoIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTAxMDE5OTQsImV4cCI6MjA2NTY3Nzk5NH0.UgRxyx9p2qou2vOQS5M9y9M2n5ej28D6ldH0e72V038";
6
+ const CONFIG_DIR = join(homedir(), ".cogniguard");
7
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
8
+ export function getConfigDir() {
9
+ return CONFIG_DIR;
10
+ }
11
+ export function getConfigPath() {
12
+ return CONFIG_FILE;
13
+ }
14
+ export function configExists() {
15
+ return existsSync(CONFIG_FILE);
16
+ }
17
+ export function loadConfig() {
18
+ if (!existsSync(CONFIG_FILE)) {
19
+ throw new Error(`CogniGuard not configured. Run "npx @cogniguard/mcp-server setup" first.`);
20
+ }
21
+ const raw = readFileSync(CONFIG_FILE, "utf-8");
22
+ const config = JSON.parse(raw);
23
+ if (!config.accessToken || !config.userId) {
24
+ throw new Error(`CogniGuard config is incomplete. Run "npx @cogniguard/mcp-server setup" again.`);
25
+ }
26
+ config.supabaseUrl ??= SUPABASE_URL;
27
+ config.supabaseAnonKey ??= SUPABASE_ANON_KEY;
28
+ return config;
29
+ }
30
+ export function saveConfig(config) {
31
+ if (!existsSync(CONFIG_DIR)) {
32
+ mkdirSync(CONFIG_DIR, { recursive: true });
33
+ }
34
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), "utf-8");
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,YAAY,GAAG,0CAA0C,CAAC;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAC5B,kNAAkN,CAAC;AAYrN,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8B,CAAC;IAE5D,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,KAAK,YAAY,CAAC;IACpC,MAAM,CAAC,eAAe,KAAK,iBAAiB,CAAC;IAE7C,OAAO,MAA0B,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAwB;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function supabaseRest<T = unknown>(path: string, options?: {
2
+ method?: string;
3
+ body?: unknown;
4
+ params?: Record<string, string>;
5
+ extraHeaders?: Record<string, string>;
6
+ }): Promise<T>;
7
+ export declare function supabaseFunction<T = unknown>(functionName: string, body: unknown): Promise<T>;
8
+ export declare function getUserId(): string;
9
+ export declare function resetConfigCache(): void;
10
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAgFA,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,GACL,OAAO,CAAC,CAAC,CAAC,CA0BZ;AAED,wBAAsB,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAChD,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,CAAC,CAAC,CAKZ;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,100 @@
1
+ import { loadConfig, saveConfig } from "./config.js";
2
+ let cachedConfig = null;
3
+ function getConfig() {
4
+ if (!cachedConfig) {
5
+ cachedConfig = loadConfig();
6
+ }
7
+ return cachedConfig;
8
+ }
9
+ function isTokenExpired(config) {
10
+ if (config.tokenExpiresAt) {
11
+ return Date.now() >= (config.tokenExpiresAt - 60_000);
12
+ }
13
+ // Decode JWT exp claim as fallback
14
+ try {
15
+ const payload = config.accessToken.split(".")[1];
16
+ const decoded = JSON.parse(Buffer.from(payload, "base64url").toString());
17
+ const expiresMs = decoded.exp * 1000;
18
+ return Date.now() >= (expiresMs - 60_000);
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ async function refreshToken(config) {
25
+ if (!config.refreshToken) {
26
+ throw new Error("Token expired and no refresh token available. Run setup again.");
27
+ }
28
+ const res = await fetch(`${config.supabaseUrl}/auth/v1/token?grant_type=refresh_token`, {
29
+ method: "POST",
30
+ headers: {
31
+ "Content-Type": "application/json",
32
+ apikey: config.supabaseAnonKey,
33
+ },
34
+ body: JSON.stringify({ refresh_token: config.refreshToken }),
35
+ });
36
+ if (!res.ok) {
37
+ throw new Error(`Token refresh failed (${res.status}). Run "npx @cogniguard/mcp-server setup" again.`);
38
+ }
39
+ const data = (await res.json());
40
+ const updated = {
41
+ ...config,
42
+ accessToken: data.access_token,
43
+ refreshToken: data.refresh_token,
44
+ userId: data.user.id,
45
+ tokenExpiresAt: Date.now() + data.expires_in * 1000,
46
+ };
47
+ saveConfig(updated);
48
+ cachedConfig = updated;
49
+ return updated;
50
+ }
51
+ async function ensureValidToken() {
52
+ let config = getConfig();
53
+ if (isTokenExpired(config)) {
54
+ config = await refreshToken(config);
55
+ }
56
+ return config;
57
+ }
58
+ function headers(config) {
59
+ return {
60
+ "Content-Type": "application/json",
61
+ apikey: config.supabaseAnonKey,
62
+ Authorization: `Bearer ${config.accessToken}`,
63
+ };
64
+ }
65
+ export async function supabaseRest(path, options = {}) {
66
+ const cfg = await ensureValidToken();
67
+ const url = new URL(path, cfg.supabaseUrl);
68
+ if (options.params) {
69
+ for (const [k, v] of Object.entries(options.params)) {
70
+ url.searchParams.set(k, v);
71
+ }
72
+ }
73
+ const res = await fetch(url.toString(), {
74
+ method: options.method ?? "GET",
75
+ headers: { ...headers(cfg), ...options.extraHeaders },
76
+ body: options.body ? JSON.stringify(options.body) : undefined,
77
+ });
78
+ if (!res.ok) {
79
+ const text = await res.text();
80
+ throw new Error(`Supabase ${options.method ?? "GET"} ${path} failed (${res.status}): ${text}`);
81
+ }
82
+ const contentType = res.headers.get("content-type") ?? "";
83
+ if (contentType.includes("application/json")) {
84
+ return (await res.json());
85
+ }
86
+ return (await res.text());
87
+ }
88
+ export async function supabaseFunction(functionName, body) {
89
+ return supabaseRest(`/functions/v1/${functionName}`, {
90
+ method: "POST",
91
+ body,
92
+ });
93
+ }
94
+ export function getUserId() {
95
+ return getConfig().userId;
96
+ }
97
+ export function resetConfigCache() {
98
+ cachedConfig = null;
99
+ }
100
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAA0D,MAAM,aAAa,CAAC;AAE7G,IAAI,YAAY,GAA4B,IAAI,CAAC;AAEjD,SAAS,SAAS;IAChB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,cAAc,CAAC,MAAwB;IAC9C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC;IACxD,CAAC;IACD,mCAAmC;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;QACrC,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAwB;IAClD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,yCAAyC,EAAE;QACtF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,MAAM,CAAC,eAAe;SAC/B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;KAC7D,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,kDAAkD,CAAC,CAAC;IACzG,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAK7B,CAAC;IAEF,MAAM,OAAO,GAAqB;QAChC,GAAG,MAAM;QACT,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;QAChC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QACpB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;KACpD,CAAC;IAEF,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,YAAY,GAAG,OAAO,CAAC;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,MAAwB;IACvC,OAAO;QACL,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,MAAM,CAAC,eAAe;QAC9B,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,UAKI,EAAE;IAEN,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACtC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE;QACrD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9D,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAoB,EACpB,IAAa;IAEb,OAAO,YAAY,CAAI,iBAAiB,YAAY,EAAE,EAAE;QACtD,MAAM,EAAE,MAAM;QACd,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,SAAS,EAAE,CAAC,MAAM,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { logPrompt, logPromptSchema } from "./tools/logPrompt.js";
5
+ import { getCognitiveScore } from "./tools/getScore.js";
6
+ import { getSessionMetrics } from "./tools/getMetrics.js";
7
+ import { getCoachingAdvice, getAdviceSchema } from "./tools/getAdvice.js";
8
+ const server = new McpServer({
9
+ name: "cogniguard",
10
+ version: "0.1.0",
11
+ });
12
+ server.tool("log_prompt", "Log an AI prompt to CogniGuard for cognitive impact analysis. " +
13
+ "Captures the prompt text, which AI tool was used, and triggers " +
14
+ "background cognitive zone classification.", logPromptSchema.shape, async ({ prompt_text, ai_tool, ai_model, working_directory, session_id }) => {
15
+ const result = await logPrompt({ prompt_text, ai_tool, ai_model, working_directory, session_id });
16
+ return { content: [{ type: "text", text: result }] };
17
+ });
18
+ server.tool("get_cognitive_score", "Get the user's cognitive health score (0-100) based on the last 7 days " +
19
+ "of AI interactions. Returns zone distribution (Manual, Empowerment, " +
20
+ "Efficiency, Skill Atrophy), risk level, trend, and a recommendation.", {}, async () => {
21
+ const result = await getCognitiveScore();
22
+ return { content: [{ type: "text", text: result }] };
23
+ });
24
+ server.tool("get_session_metrics", "Get today's AI usage metrics: prompt count, session duration, " +
25
+ "tool breakdown, cognitive zone distribution, and task categories.", {}, async () => {
26
+ const result = await getSessionMetrics();
27
+ return { content: [{ type: "text", text: result }] };
28
+ });
29
+ server.tool("get_coaching_advice", "Get personalized cognitive coaching advice based on current AI usage " +
30
+ "patterns. Optionally provide context about the current task.", getAdviceSchema.shape, async ({ context }) => {
31
+ const result = await getCoachingAdvice({ context });
32
+ return { content: [{ type: "text", text: result }] };
33
+ });
34
+ async function main() {
35
+ const transport = new StdioServerTransport();
36
+ await server.connect(transport);
37
+ }
38
+ main().catch((err) => {
39
+ process.stderr.write(`CogniGuard MCP server error: ${err}\n`);
40
+ process.exit(1);
41
+ });
42
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,gEAAgE;IAC9D,iEAAiE;IACjE,2CAA2C,EAC7C,eAAe,CAAC,KAAK,EACrB,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAC;IAClG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,yEAAyE;IACvE,sEAAsE;IACtE,sEAAsE,EACxE,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,gEAAgE;IAC9D,mEAAmE,EACrE,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,uEAAuE;IACrE,8DAA8D,EAChE,eAAe,CAAC,KAAK,EACrB,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACpB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC,CACF,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":""}
package/dist/setup.js ADDED
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ import { createInterface } from "node:readline";
6
+ import { saveConfig, configExists, loadConfig, getConfigPath, SUPABASE_URL, SUPABASE_ANON_KEY, } from "./lib/config.js";
7
+ const CLAUDE_SETTINGS_PATH = join(homedir(), ".claude", "settings.json");
8
+ const CLAUDE_DIR = join(homedir(), ".claude");
9
+ async function main() {
10
+ console.log("");
11
+ console.log(" CogniGuard CLI Setup");
12
+ console.log(" ====================");
13
+ console.log("");
14
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
15
+ const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
16
+ try {
17
+ if (configExists()) {
18
+ const existing = loadConfig();
19
+ console.log(` Found existing config (${existing.email ?? existing.userId})`);
20
+ const overwrite = await ask(" Reconfigure? (y/N): ");
21
+ if (overwrite.toLowerCase() !== "y") {
22
+ console.log(" Keeping existing config. Checking hooks...\n");
23
+ await ensureHooks();
24
+ rl.close();
25
+ return;
26
+ }
27
+ }
28
+ console.log(" Log in with your CogniGuard account.");
29
+ console.log(" (Don't have one? Sign up at https://cogniguard.eu)\n");
30
+ const email = await ask(" Email: ");
31
+ const password = await ask(" Password: ");
32
+ console.log("\n Authenticating...");
33
+ const authRes = await fetch(`${SUPABASE_URL}/auth/v1/token?grant_type=password`, {
34
+ method: "POST",
35
+ headers: {
36
+ "Content-Type": "application/json",
37
+ apikey: SUPABASE_ANON_KEY,
38
+ },
39
+ body: JSON.stringify({ email, password }),
40
+ });
41
+ if (!authRes.ok) {
42
+ const err = (await authRes.json().catch(() => ({})));
43
+ console.error(` Login failed: ${err.error_description ?? `HTTP ${authRes.status}`}`);
44
+ console.error(" Check your email and password, then try again.");
45
+ rl.close();
46
+ process.exit(1);
47
+ }
48
+ const authData = (await authRes.json());
49
+ console.log(` Logged in as: ${authData.user.email ?? authData.user.id}\n`);
50
+ saveConfig({
51
+ supabaseUrl: SUPABASE_URL,
52
+ supabaseAnonKey: SUPABASE_ANON_KEY,
53
+ accessToken: authData.access_token,
54
+ refreshToken: authData.refresh_token,
55
+ userId: authData.user.id,
56
+ email: authData.user.email,
57
+ tokenExpiresAt: Date.now() + authData.expires_in * 1000,
58
+ });
59
+ console.log(` Config saved to ${getConfigPath()}\n`);
60
+ await ensureHooks();
61
+ console.log(" Testing connection...");
62
+ const testRes = await fetch(`${SUPABASE_URL}/rest/v1/prompt_analyses?user_id=eq.${authData.user.id}&limit=1&select=id`, {
63
+ headers: {
64
+ apikey: SUPABASE_ANON_KEY,
65
+ Authorization: `Bearer ${authData.access_token}`,
66
+ },
67
+ });
68
+ if (testRes.ok) {
69
+ console.log(" Connection verified.\n");
70
+ }
71
+ else {
72
+ console.log(" WARNING: Connection test returned non-200. Check permissions.\n");
73
+ }
74
+ console.log(" Setup complete!");
75
+ console.log(" CogniGuard will now track your Claude Code sessions.");
76
+ console.log(" Your token refreshes automatically — no need to re-login.");
77
+ console.log("");
78
+ rl.close();
79
+ }
80
+ catch (err) {
81
+ console.error(`\n Setup failed: ${err}`);
82
+ rl.close();
83
+ process.exit(1);
84
+ }
85
+ }
86
+ async function ensureHooks() {
87
+ const captureBin = getBinPath("cogniguard-capture");
88
+ if (!existsSync(CLAUDE_DIR)) {
89
+ console.log(" Claude Code settings directory not found.");
90
+ console.log(` Expected: ${CLAUDE_DIR}`);
91
+ console.log(" You can manually add the MCP server later.\n");
92
+ printManualInstructions(captureBin);
93
+ return;
94
+ }
95
+ let settings = {};
96
+ if (existsSync(CLAUDE_SETTINGS_PATH)) {
97
+ try {
98
+ settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_PATH, "utf-8"));
99
+ }
100
+ catch {
101
+ settings = {};
102
+ }
103
+ }
104
+ const hooks = (settings.hooks ?? {});
105
+ const existingHooks = hooks.UserPromptSubmit ?? [];
106
+ const alreadyInstalled = Array.isArray(existingHooks) &&
107
+ existingHooks.some((h) => h?.hooks?.some?.((sub) => typeof sub?.command === "string" &&
108
+ sub.command.includes("cogniguard-capture")));
109
+ if (!alreadyInstalled) {
110
+ if (!Array.isArray(hooks.UserPromptSubmit)) {
111
+ hooks.UserPromptSubmit = [];
112
+ }
113
+ hooks.UserPromptSubmit.push({
114
+ matcher: "",
115
+ hooks: [{ type: "command", command: captureBin }],
116
+ });
117
+ settings.hooks = hooks;
118
+ writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2), "utf-8");
119
+ console.log(" Claude Code hook registered (UserPromptSubmit).");
120
+ }
121
+ else {
122
+ console.log(" Claude Code hook already registered.");
123
+ }
124
+ const mcpBin = getBinPath("cogniguard-mcp");
125
+ const mcpServers = (settings.mcpServers ?? {});
126
+ if (!mcpServers.cogniguard) {
127
+ mcpServers.cogniguard = { command: mcpBin, args: [] };
128
+ settings.mcpServers = mcpServers;
129
+ writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2), "utf-8");
130
+ console.log(" Claude Code MCP server registered (cogniguard).\n");
131
+ }
132
+ else {
133
+ console.log(" Claude Code MCP server already registered.\n");
134
+ }
135
+ }
136
+ function getBinPath(name) {
137
+ const localPath = join(import.meta.url.replace("file:///", "").replace(/\/[^/]+$/, ""), `${name === "cogniguard-mcp" ? "server" : "capture"}.js`);
138
+ return `node ${localPath}`;
139
+ }
140
+ function printManualInstructions(captureBin) {
141
+ console.log(" Manual setup instructions:");
142
+ console.log("");
143
+ console.log(" 1. Add to ~/.claude/settings.json:");
144
+ console.log(` "hooks": {`);
145
+ console.log(` "UserPromptSubmit": [{`);
146
+ console.log(` "matcher": "",`);
147
+ console.log(` "hooks": [{ "type": "command", "command": "${captureBin}" }]`);
148
+ console.log(` }]`);
149
+ console.log(` }`);
150
+ console.log("");
151
+ console.log(" 2. Or register the MCP server:");
152
+ console.log(` claude mcp add cogniguard -- npx @cogniguard/mcp-server`);
153
+ console.log("");
154
+ }
155
+ main();
156
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AACzE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,CAAC,CAAS,EAAmB,EAAE,CACzC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,IAAI,YAAY,EAAE,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,4BAA4B,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtD,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;gBAC9D,MAAM,WAAW,EAAE,CAAC;gBACpB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,CAAC;QAE3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,MAAM,KAAK,CACzB,GAAG,YAAY,oCAAoC,EACnD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,iBAAiB;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SAC1C,CACF,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAmC,CAAC;YACvF,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,iBAAiB,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtF,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAKrC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAE5E,UAAU,CAAC;YACT,WAAW,EAAE,YAAY;YACzB,eAAe,EAAE,iBAAiB;YAClC,WAAW,EAAE,QAAQ,CAAC,YAAY;YAClC,YAAY,EAAE,QAAQ,CAAC,aAAa;YACpC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;YACxB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;YAC1B,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,UAAU,GAAG,IAAI;SACxD,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,aAAa,EAAE,IAAI,CAAC,CAAC;QAEtD,MAAM,WAAW,EAAE,CAAC;QAEpB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,KAAK,CACzB,GAAG,YAAY,uCAAuC,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,EAC1F;YACE,OAAO,EAAE;gBACP,MAAM,EAAE,iBAAiB;gBACzB,aAAa,EAAE,UAAU,QAAQ,CAAC,YAAY,EAAE;aACjD;SACF,CACF,CAAC;QAEF,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,UAAU,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAEpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAA8B,CAAC;IAClE,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACnD,MAAM,gBAAgB,GACpB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QAC5B,aAAa,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAC5B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CACd,CAAC,GAAQ,EAAE,EAAE,CACX,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ;YAChC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAC7C,CACF,CAAC;IAEJ,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC9B,CAAC;QACA,KAAK,CAAC,gBAA8B,CAAC,IAAI,CAAC;YACzC,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;SAClD,CAAC,CAAC;QACH,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,aAAa,CACX,oBAAoB,EACpB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,OAAO,CACR,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;IAE1E,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,UAAU,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,aAAa,CACX,oBAAoB,EACpB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,OAAO,CACR,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,SAAS,GAAG,IAAI,CACpB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAC/D,GAAG,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,CACzD,CAAC;IACF,OAAO,QAAQ,SAAS,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CACT,uDAAuD,UAAU,MAAM,CACxE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CACT,8DAA8D,CAC/D,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from "zod";
2
+ export declare const getAdviceSchema: z.ZodObject<{
3
+ context: z.ZodOptional<z.ZodString>;
4
+ }, "strip", z.ZodTypeAny, {
5
+ context?: string | undefined;
6
+ }, {
7
+ context?: string | undefined;
8
+ }>;
9
+ export type GetAdviceInput = z.infer<typeof getAdviceSchema>;
10
+ export declare function getCoachingAdvice(input: GetAdviceInput): Promise<string>;
11
+ //# sourceMappingURL=getAdvice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAdvice.d.ts","sourceRoot":"","sources":["../../src/tools/getAdvice.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;;;EAK1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA0B9E"}
@@ -0,0 +1,32 @@
1
+ import { supabaseFunction, getUserId } from "../lib/supabase.js";
2
+ import { z } from "zod";
3
+ export const getAdviceSchema = z.object({
4
+ context: z
5
+ .string()
6
+ .optional()
7
+ .describe("Optional context about what the user is working on right now"),
8
+ });
9
+ export async function getCoachingAdvice(input) {
10
+ const userId = getUserId();
11
+ try {
12
+ const result = await supabaseFunction("cognitive-coach-ai", {
13
+ userId,
14
+ sessionType: "quick_check",
15
+ cognitiveState: {
16
+ source: "cli",
17
+ context: input.context ?? "Coding session with AI agent",
18
+ },
19
+ });
20
+ return JSON.stringify({
21
+ advice: result.advice ?? result.message ?? "Keep a healthy balance between AI assistance and independent thinking.",
22
+ source: "cognitive-coach-ai",
23
+ });
24
+ }
25
+ catch {
26
+ return JSON.stringify({
27
+ advice: "Take a moment to think through the problem before asking the AI. Manual problem-solving strengthens your cognitive muscles.",
28
+ source: "fallback",
29
+ });
30
+ }
31
+ }
32
+ //# sourceMappingURL=getAdvice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAdvice.js","sourceRoot":"","sources":["../../src/tools/getAdvice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8DAA8D,CAAC;CAC5E,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAqB;IAC3D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,oBAAoB,EACpB;YACE,MAAM;YACN,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE;gBACd,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,8BAA8B;aACzD;SACF,CACF,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,wEAAwE;YACnH,MAAM,EAAE,oBAAoB;SAC7B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,MAAM,EAAE,6HAA6H;YACrI,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getSessionMetrics(): Promise<string>;
2
+ //# sourceMappingURL=getMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMetrics.d.ts","sourceRoot":"","sources":["../../src/tools/getMetrics.ts"],"names":[],"mappings":"AASA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAqDzD"}
@@ -0,0 +1,46 @@
1
+ import { supabaseRest, getUserId } from "../lib/supabase.js";
2
+ export async function getSessionMetrics() {
3
+ const userId = getUserId();
4
+ const todayStart = new Date();
5
+ todayStart.setHours(0, 0, 0, 0);
6
+ const rows = await supabaseRest("/rest/v1/prompt_analyses", {
7
+ params: {
8
+ select: "ai_tool,cognitive_zone,task_category,created_at",
9
+ user_id: `eq.${userId}`,
10
+ created_at: `gte.${todayStart.toISOString()}`,
11
+ order: "created_at.desc",
12
+ },
13
+ });
14
+ if (!rows.length) {
15
+ return JSON.stringify({
16
+ today: { prompt_count: 0, tools: {}, zones: {}, categories: {} },
17
+ message: "No AI prompts captured today.",
18
+ });
19
+ }
20
+ const tools = {};
21
+ const zones = {};
22
+ const categories = {};
23
+ for (const r of rows) {
24
+ const tool = r.ai_tool ?? "unknown";
25
+ tools[tool] = (tools[tool] ?? 0) + 1;
26
+ if (r.cognitive_zone) {
27
+ zones[r.cognitive_zone] = (zones[r.cognitive_zone] ?? 0) + 1;
28
+ }
29
+ if (r.task_category) {
30
+ categories[r.task_category] = (categories[r.task_category] ?? 0) + 1;
31
+ }
32
+ }
33
+ const first = new Date(rows[rows.length - 1].created_at);
34
+ const last = new Date(rows[0].created_at);
35
+ const sessionMinutes = Math.round((last.getTime() - first.getTime()) / 60000);
36
+ return JSON.stringify({
37
+ today: {
38
+ prompt_count: rows.length,
39
+ session_duration_minutes: sessionMinutes,
40
+ tools,
41
+ zones,
42
+ categories,
43
+ },
44
+ });
45
+ }
46
+ //# sourceMappingURL=getMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMetrics.js","sourceRoot":"","sources":["../../src/tools/getMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAS7D,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9B,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,MAAM,YAAY,CAC7B,0BAA0B,EAC1B;QACE,MAAM,EAAE;YACN,MAAM,EAAE,iDAAiD;YACzD,OAAO,EAAE,MAAM,MAAM,EAAE;YACvB,UAAU,EAAE,OAAO,UAAU,CAAC,WAAW,EAAE,EAAE;YAC7C,KAAK,EAAE,iBAAiB;SACzB;KACF,CACF,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;YAChE,OAAO,EAAE,+BAA+B;SACzC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;YACrB,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpB,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;IAE9E,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,KAAK,EAAE;YACL,YAAY,EAAE,IAAI,CAAC,MAAM;YACzB,wBAAwB,EAAE,cAAc;YACxC,KAAK;YACL,KAAK;YACL,UAAU;SACX;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getCognitiveScore(): Promise<string>;
2
+ //# sourceMappingURL=getScore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getScore.d.ts","sourceRoot":"","sources":["../../src/tools/getScore.ts"],"names":[],"mappings":"AASA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CA+EzD"}
@@ -0,0 +1,76 @@
1
+ import { supabaseRest, getUserId } from "../lib/supabase.js";
2
+ export async function getCognitiveScore() {
3
+ const userId = getUserId();
4
+ const since = new Date();
5
+ since.setDate(since.getDate() - 7);
6
+ const rows = await supabaseRest("/rest/v1/prompt_analyses", {
7
+ params: {
8
+ select: "cognitive_zone,thinking_required,complexity_score,ai_delegation_score",
9
+ user_id: `eq.${userId}`,
10
+ created_at: `gte.${since.toISOString()}`,
11
+ order: "created_at.desc",
12
+ limit: "200",
13
+ },
14
+ });
15
+ if (!rows.length) {
16
+ return JSON.stringify({
17
+ overall_score: 75,
18
+ risk_level: "Low",
19
+ zone_distribution: { manual: 0, empowerment: 0, efficiency: 0, atrophy: 0 },
20
+ trend: "stable",
21
+ recommendation: "Start using AI tools to build your cognitive profile.",
22
+ prompts_analyzed: 0,
23
+ period: "last_7_days",
24
+ });
25
+ }
26
+ const zones = { manual: 0, empowerment: 0, efficiency: 0, atrophy: 0 };
27
+ for (const r of rows) {
28
+ const z = (r.cognitive_zone ?? "").toLowerCase();
29
+ if (z.includes("manual"))
30
+ zones.manual++;
31
+ else if (z.includes("empowerment"))
32
+ zones.empowerment++;
33
+ else if (z.includes("efficiency"))
34
+ zones.efficiency++;
35
+ else if (z.includes("atrophy"))
36
+ zones.atrophy++;
37
+ }
38
+ const total = rows.length;
39
+ const pct = {
40
+ manual: Math.round((zones.manual / total) * 100),
41
+ empowerment: Math.round((zones.empowerment / total) * 100),
42
+ efficiency: Math.round((zones.efficiency / total) * 100),
43
+ atrophy: Math.round((zones.atrophy / total) * 100),
44
+ };
45
+ let score = 50;
46
+ score += Math.min(25, pct.manual * 0.5);
47
+ score += Math.min(20, pct.empowerment * 0.4);
48
+ score += Math.min(15, pct.efficiency * 0.3);
49
+ score -= Math.min(30, pct.atrophy * 0.6);
50
+ score = Math.max(0, Math.min(100, Math.round(score)));
51
+ const riskLevel = score >= 80 ? "Low" : score >= 60 ? "Moderate" : score >= 40 ? "High" : "Critical";
52
+ const trend = pct.atrophy > 50 ? "declining" : pct.manual > 30 && pct.empowerment > 20 ? "improving" : "stable";
53
+ let recommendation;
54
+ if (pct.atrophy > 50) {
55
+ recommendation = "Critical: Reduce AI dependency and engage in manual problem-solving.";
56
+ }
57
+ else if (pct.manual < 20) {
58
+ recommendation = "Try solving some problems manually to maintain cognitive strength.";
59
+ }
60
+ else if (score >= 80) {
61
+ recommendation = "Great balance! Continue your current AI collaboration approach.";
62
+ }
63
+ else {
64
+ recommendation = "Explore using AI as a collaborative partner rather than a replacement.";
65
+ }
66
+ return JSON.stringify({
67
+ overall_score: score,
68
+ risk_level: riskLevel,
69
+ zone_distribution: pct,
70
+ trend,
71
+ recommendation,
72
+ prompts_analyzed: total,
73
+ period: "last_7_days",
74
+ });
75
+ }
76
+ //# sourceMappingURL=getScore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getScore.js","sourceRoot":"","sources":["../../src/tools/getScore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ export declare const logPromptSchema: z.ZodObject<{
3
+ prompt_text: z.ZodString;
4
+ ai_tool: z.ZodEnum<["claude-code", "cursor", "cline", "copilot", "windsurf", "other"]>;
5
+ ai_model: z.ZodOptional<z.ZodString>;
6
+ working_directory: z.ZodOptional<z.ZodString>;
7
+ session_id: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ prompt_text: string;
10
+ ai_tool: "claude-code" | "cursor" | "cline" | "copilot" | "windsurf" | "other";
11
+ ai_model?: string | undefined;
12
+ working_directory?: string | undefined;
13
+ session_id?: string | undefined;
14
+ }, {
15
+ prompt_text: string;
16
+ ai_tool: "claude-code" | "cursor" | "cline" | "copilot" | "windsurf" | "other";
17
+ ai_model?: string | undefined;
18
+ working_directory?: string | undefined;
19
+ session_id?: string | undefined;
20
+ }>;
21
+ export type LogPromptInput = z.infer<typeof logPromptSchema>;
22
+ export declare function logPrompt(input: LogPromptInput): Promise<string>;
23
+ //# sourceMappingURL=logPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logPrompt.d.ts","sourceRoot":"","sources":["../../src/tools/logPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;EAqB1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCtE"}
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+ import { supabaseRest, supabaseFunction, getUserId } from "../lib/supabase.js";
3
+ export const logPromptSchema = z.object({
4
+ prompt_text: z
5
+ .string()
6
+ .min(1)
7
+ .max(10000)
8
+ .describe("The prompt text the user sent to the AI agent"),
9
+ ai_tool: z
10
+ .enum(["claude-code", "cursor", "cline", "copilot", "windsurf", "other"])
11
+ .describe("Which AI coding tool the prompt was sent to"),
12
+ ai_model: z
13
+ .string()
14
+ .optional()
15
+ .describe("The AI model used (e.g. claude-sonnet-4-20250514)"),
16
+ working_directory: z
17
+ .string()
18
+ .optional()
19
+ .describe("Project directory the agent is running in"),
20
+ session_id: z
21
+ .string()
22
+ .optional()
23
+ .describe("Agent session ID for grouping prompts"),
24
+ });
25
+ export async function logPrompt(input) {
26
+ const userId = getUserId();
27
+ const now = new Date().toISOString();
28
+ const row = {
29
+ user_id: userId,
30
+ prompt_text: input.prompt_text,
31
+ ai_tool: input.ai_tool,
32
+ ai_model: input.ai_model ?? null,
33
+ conversation_id: input.session_id ?? null,
34
+ cognitive_impact: "medium",
35
+ complexity_score: 50,
36
+ thinking_required: 50,
37
+ skills_engaged: [],
38
+ analyzed_at: now,
39
+ task_category: "Practical / Task-Oriented Skills",
40
+ };
41
+ const inserted = await supabaseRest("/rest/v1/prompt_analyses", {
42
+ method: "POST",
43
+ body: row,
44
+ extraHeaders: { Prefer: "return=representation" },
45
+ });
46
+ const promptId = inserted?.[0]?.id;
47
+ if (promptId) {
48
+ triggerAgentEnrichment(input, userId, promptId).catch(() => {
49
+ // Fire-and-forget — don't block the tool response
50
+ });
51
+ }
52
+ return JSON.stringify({
53
+ success: true,
54
+ prompt_id: promptId ?? null,
55
+ message: `Prompt captured and queued for cognitive analysis.`,
56
+ });
57
+ }
58
+ async function triggerAgentEnrichment(input, userId, promptId) {
59
+ const toolMap = {
60
+ "claude-code": "claude",
61
+ cursor: "other",
62
+ cline: "other",
63
+ copilot: "copilot",
64
+ windsurf: "other",
65
+ other: "other",
66
+ };
67
+ await supabaseFunction("cognitive-agent-langgraph", {
68
+ promptText: input.prompt_text,
69
+ aiTool: toolMap[input.ai_tool] ?? "other",
70
+ userId,
71
+ promptId,
72
+ basicAnalysis: null,
73
+ conversationContext: null,
74
+ sessionContext: input.working_directory
75
+ ? { source: "cli", working_directory: input.working_directory }
76
+ : { source: "cli" },
77
+ });
78
+ }
79
+ //# sourceMappingURL=logPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logPrompt.js","sourceRoot":"","sources":["../../src/tools/logPrompt.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@cogniguard/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "CogniGuard MCP server — cognitive fitness tracking for AI coding agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "cogniguard-mcp": "./dist/server.js",
8
+ "cogniguard-capture": "./dist/capture.js",
9
+ "cogniguard-setup": "./dist/setup.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/server.js"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.29.0",
24
+ "zod": "^3.23.0"
25
+ },
26
+ "devDependencies": {
27
+ "typescript": "^5.5.0",
28
+ "@types/node": "^20.0.0"
29
+ },
30
+ "keywords": [
31
+ "mcp",
32
+ "cogniguard",
33
+ "cognitive-fitness",
34
+ "ai-tracking",
35
+ "claude-code"
36
+ ],
37
+ "license": "MIT"
38
+ }