couchloop-eq-mcp 1.0.2 → 1.0.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.
Files changed (90) hide show
  1. package/README.md +29 -4
  2. package/dist/clients/shrinkChatClient.d.ts +10 -0
  3. package/dist/clients/shrinkChatClient.d.ts.map +1 -1
  4. package/dist/clients/shrinkChatClient.js +5 -1
  5. package/dist/clients/shrinkChatClient.js.map +1 -1
  6. package/dist/db/client.d.ts.map +1 -1
  7. package/dist/db/client.js +5 -3
  8. package/dist/db/client.js.map +1 -1
  9. package/dist/db/schema.d.ts +363 -0
  10. package/dist/db/schema.d.ts.map +1 -1
  11. package/dist/db/schema.js +47 -0
  12. package/dist/db/schema.js.map +1 -1
  13. package/dist/governance/config.d.ts +66 -0
  14. package/dist/governance/config.d.ts.map +1 -0
  15. package/dist/governance/config.js +238 -0
  16. package/dist/governance/config.js.map +1 -0
  17. package/dist/governance/detectors/hallucination.d.ts +61 -0
  18. package/dist/governance/detectors/hallucination.d.ts.map +1 -0
  19. package/dist/governance/detectors/hallucination.js +338 -0
  20. package/dist/governance/detectors/hallucination.js.map +1 -0
  21. package/dist/governance/detectors/inconsistency.d.ts +99 -0
  22. package/dist/governance/detectors/inconsistency.d.ts.map +1 -0
  23. package/dist/governance/detectors/inconsistency.js +548 -0
  24. package/dist/governance/detectors/inconsistency.js.map +1 -0
  25. package/dist/governance/detectors/toneDrift.d.ts +63 -0
  26. package/dist/governance/detectors/toneDrift.d.ts.map +1 -0
  27. package/dist/governance/detectors/toneDrift.js +421 -0
  28. package/dist/governance/detectors/toneDrift.js.map +1 -0
  29. package/dist/governance/detectors/unsafeReasoning.d.ts +54 -0
  30. package/dist/governance/detectors/unsafeReasoning.d.ts.map +1 -0
  31. package/dist/governance/detectors/unsafeReasoning.js +473 -0
  32. package/dist/governance/detectors/unsafeReasoning.js.map +1 -0
  33. package/dist/governance/evaluationEngine.d.ts +112 -0
  34. package/dist/governance/evaluationEngine.d.ts.map +1 -0
  35. package/dist/governance/evaluationEngine.js +265 -0
  36. package/dist/governance/evaluationEngine.js.map +1 -0
  37. package/dist/governance/intervention.d.ts +81 -0
  38. package/dist/governance/intervention.d.ts.map +1 -0
  39. package/dist/governance/intervention.js +405 -0
  40. package/dist/governance/intervention.js.map +1 -0
  41. package/dist/server/chatgpt-mcp.d.ts +10 -0
  42. package/dist/server/chatgpt-mcp.d.ts.map +1 -0
  43. package/dist/server/chatgpt-mcp.js +233 -0
  44. package/dist/server/chatgpt-mcp.js.map +1 -0
  45. package/dist/server/index.d.ts.map +1 -1
  46. package/dist/server/index.js +94 -3
  47. package/dist/server/index.js.map +1 -1
  48. package/dist/server/middleware/localNetworkAccess.d.ts +16 -0
  49. package/dist/server/middleware/localNetworkAccess.d.ts.map +1 -0
  50. package/dist/server/middleware/localNetworkAccess.js +97 -0
  51. package/dist/server/middleware/localNetworkAccess.js.map +1 -0
  52. package/dist/server/sse.d.ts +16 -0
  53. package/dist/server/sse.d.ts.map +1 -0
  54. package/dist/server/sse.js +215 -0
  55. package/dist/server/sse.js.map +1 -0
  56. package/dist/tools/checkpoint.d.ts.map +1 -1
  57. package/dist/tools/index.d.ts +1 -0
  58. package/dist/tools/index.d.ts.map +1 -1
  59. package/dist/tools/index.js +4 -2
  60. package/dist/tools/index.js.map +1 -1
  61. package/dist/tools/insight.d.ts +1 -0
  62. package/dist/tools/insight.d.ts.map +1 -1
  63. package/dist/tools/sendMessage-complex-backup.d.ts +6 -0
  64. package/dist/tools/sendMessage-complex-backup.d.ts.map +1 -0
  65. package/dist/tools/sendMessage-complex-backup.js +545 -0
  66. package/dist/tools/sendMessage-complex-backup.js.map +1 -0
  67. package/dist/tools/sendMessage-revised.d.ts +11 -0
  68. package/dist/tools/sendMessage-revised.d.ts.map +1 -0
  69. package/dist/tools/sendMessage-revised.js +429 -0
  70. package/dist/tools/sendMessage-revised.js.map +1 -0
  71. package/dist/tools/sendMessage-truly-simple.d.ts +8 -0
  72. package/dist/tools/sendMessage-truly-simple.d.ts.map +1 -0
  73. package/dist/tools/sendMessage-truly-simple.js +299 -0
  74. package/dist/tools/sendMessage-truly-simple.js.map +1 -0
  75. package/dist/tools/sendMessage.d.ts +4 -2
  76. package/dist/tools/sendMessage.d.ts.map +1 -1
  77. package/dist/tools/sendMessage.js +240 -186
  78. package/dist/tools/sendMessage.js.map +1 -1
  79. package/dist/tools/session.d.ts.map +1 -1
  80. package/dist/tools/session.js +35 -29
  81. package/dist/tools/session.js.map +1 -1
  82. package/dist/types/auth.d.ts +21 -13
  83. package/dist/types/auth.d.ts.map +1 -1
  84. package/dist/types/auth.js +108 -25
  85. package/dist/types/auth.js.map +1 -1
  86. package/dist/types/insight.d.ts +10 -0
  87. package/dist/types/insight.d.ts.map +1 -1
  88. package/dist/types/session.d.ts +10 -0
  89. package/dist/types/session.d.ts.map +1 -1
  90. package/package.json +10 -5
@@ -72,50 +72,56 @@ export async function resumeSession(args) {
72
72
  try {
73
73
  const input = ResumeSessionSchema.parse(args);
74
74
  const db = getDb();
75
- // Extract user ID from auth context or generate anonymous user
76
- const externalUserId = await extractUserFromContext(input.auth);
77
- const [user] = await db
78
- .select()
79
- .from(users)
80
- .where(eq(users.externalId, externalUserId))
81
- .limit(1);
82
- if (!user) {
83
- // Create user if doesn't exist
84
- const [newUser] = await db
85
- .insert(users)
86
- .values({
87
- externalId: externalUserId,
88
- preferences: {},
89
- })
90
- .returning();
91
- if (!newUser) {
92
- throw new NotFoundError('User');
93
- }
94
- return {
95
- message: 'No previous sessions found for this user. Please create a new session.',
96
- session: null,
97
- };
98
- }
99
75
  // Find session to resume
100
76
  let session;
101
77
  if (input.session_id) {
78
+ // Direct session lookup - skip user validation
79
+ // This allows resuming sessions when MCP clients don't maintain consistent user context
102
80
  [session] = await db
103
81
  .select()
104
82
  .from(sessions)
105
- .where(and(eq(sessions.id, input.session_id), eq(sessions.userId, user.id)))
83
+ .where(eq(sessions.id, input.session_id))
106
84
  .limit(1);
85
+ if (!session) {
86
+ throw new NotFoundError('Session with ID', input.session_id);
87
+ }
107
88
  }
108
89
  else {
109
- // Get most recent pausable session
90
+ // Resume most recent session - requires user context
91
+ // Extract user ID from auth context or generate anonymous user
92
+ const externalUserId = await extractUserFromContext(input.auth);
93
+ const [user] = await db
94
+ .select()
95
+ .from(users)
96
+ .where(eq(users.externalId, externalUserId))
97
+ .limit(1);
98
+ if (!user) {
99
+ // Create user if doesn't exist
100
+ const [newUser] = await db
101
+ .insert(users)
102
+ .values({
103
+ externalId: externalUserId,
104
+ preferences: {},
105
+ })
106
+ .returning();
107
+ if (!newUser) {
108
+ throw new NotFoundError('User');
109
+ }
110
+ return {
111
+ message: 'No previous sessions found for this user. Please create a new session.',
112
+ session: null,
113
+ };
114
+ }
115
+ // Get most recent pausable session for this user
110
116
  [session] = await db
111
117
  .select()
112
118
  .from(sessions)
113
119
  .where(and(eq(sessions.userId, user.id), eq(sessions.status, 'paused')))
114
120
  .orderBy(desc(sessions.lastActiveAt))
115
121
  .limit(1);
116
- }
117
- if (!session) {
118
- throw new NotFoundError('Session to resume');
122
+ if (!session) {
123
+ throw new NotFoundError('Session to resume for user');
124
+ }
119
125
  }
120
126
  // Get journey if linked
121
127
  let journey = null;
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
@@ -4,34 +4,42 @@ import { z } from 'zod';
4
4
  * This allows the AI agent to provide user authentication info
5
5
  */
6
6
  export declare const AuthContextSchema: z.ZodObject<{
7
- /**
8
- * OAuth access token or session identifier
9
- * This will be validated against the OAuth tokens table
10
- */
11
7
  token: z.ZodOptional<z.ZodString>;
12
- /**
13
- * External user identifier (from OAuth provider)
14
- * Used as a fallback if token validation fails
15
- */
16
8
  user_id: z.ZodOptional<z.ZodString>;
17
- /**
18
- * Client identifier (ChatGPT, Claude, etc.)
19
- * Helps track which AI agent is making the request
20
- */
21
9
  client_id: z.ZodOptional<z.ZodString>;
10
+ conversation_id: z.ZodOptional<z.ZodString>;
22
11
  }, "strip", z.ZodTypeAny, {
23
12
  user_id?: string | undefined;
24
13
  client_id?: string | undefined;
25
14
  token?: string | undefined;
15
+ conversation_id?: string | undefined;
26
16
  }, {
27
17
  user_id?: string | undefined;
28
18
  client_id?: string | undefined;
29
19
  token?: string | undefined;
20
+ conversation_id?: string | undefined;
30
21
  }>;
31
22
  export type AuthContext = z.infer<typeof AuthContextSchema>;
32
23
  /**
33
24
  * Extract user ID from authentication context
34
- * Returns a mock user ID if no context is provided (backward compatibility)
25
+ * Implements tiered identity:
26
+ * - Priority 1: OAuth token validation (Pro tier - cross-device)
27
+ * - Priority 2: External user ID + client ID (ChatGPT OAuth)
28
+ * - Priority 3: Local file-based identity (Free tier - single machine)
29
+ * - Priority 4: Conversation-based ID (single window only)
30
+ * - Fallback: Ephemeral IDs (no persistence)
35
31
  */
36
32
  export declare function extractUserFromContext(authContext?: AuthContext): Promise<string>;
33
+ /**
34
+ * Get user tier from identity prefix
35
+ */
36
+ export declare function getUserTier(userId: string): 'pro' | 'free' | 'ephemeral';
37
+ /**
38
+ * Check if user has Pro tier features
39
+ */
40
+ export declare function hasProFeatures(userId: string): boolean;
41
+ /**
42
+ * Get the local identity file path for debugging/support
43
+ */
44
+ export declare function getIdentityFilePath(): string;
37
45
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;;;;;;;;;EAEH,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBvF"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EAK5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AA2D5D;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCvF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAMxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -1,44 +1,127 @@
1
1
  import { z } from 'zod';
2
+ import { createHash } from 'crypto';
3
+ import { homedir } from 'os';
4
+ import { join } from 'path';
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
6
  /**
3
7
  * Authentication context that can be passed through MCP tool calls
4
8
  * This allows the AI agent to provide user authentication info
5
9
  */
6
10
  export const AuthContextSchema = z.object({
7
- /**
8
- * OAuth access token or session identifier
9
- * This will be validated against the OAuth tokens table
10
- */
11
11
  token: z.string().optional().describe('OAuth access token or session identifier'),
12
- /**
13
- * External user identifier (from OAuth provider)
14
- * Used as a fallback if token validation fails
15
- */
16
12
  user_id: z.string().optional().describe('External user identifier from OAuth provider'),
17
- /**
18
- * Client identifier (ChatGPT, Claude, etc.)
19
- * Helps track which AI agent is making the request
20
- */
21
13
  client_id: z.string().optional().describe('Client application identifier'),
14
+ conversation_id: z.string().optional().describe('Stable conversation identifier for user binding'),
22
15
  });
16
+ const IDENTITY_DIR = join(homedir(), '.couchloop-mcp');
17
+ const IDENTITY_FILE = join(IDENTITY_DIR, 'identity.json');
18
+ /**
19
+ * Get or create local identity file for free tier users
20
+ * This provides single-machine persistence without requiring OAuth
21
+ */
22
+ function getOrCreateLocalIdentity() {
23
+ try {
24
+ // Ensure directory exists
25
+ if (!existsSync(IDENTITY_DIR)) {
26
+ mkdirSync(IDENTITY_DIR, { recursive: true });
27
+ }
28
+ // Check if identity file exists
29
+ if (existsSync(IDENTITY_FILE)) {
30
+ const data = readFileSync(IDENTITY_FILE, 'utf-8');
31
+ const identity = JSON.parse(data);
32
+ if (identity.user_id && identity.user_id.startsWith('local_')) {
33
+ return identity.user_id;
34
+ }
35
+ }
36
+ // Create new local identity
37
+ const { hostname } = require('os');
38
+ const machineId = createHash('sha256')
39
+ .update(hostname() + ':' + homedir() + ':' + Date.now())
40
+ .digest('hex')
41
+ .substring(0, 24);
42
+ const newIdentity = {
43
+ user_id: 'local_' + machineId,
44
+ created_at: new Date().toISOString(),
45
+ machine: hostname(),
46
+ tier: 'free',
47
+ };
48
+ writeFileSync(IDENTITY_FILE, JSON.stringify(newIdentity, null, 2));
49
+ console.log('Created local identity: ' + newIdentity.user_id + ' at ' + IDENTITY_FILE);
50
+ return newIdentity.user_id;
51
+ }
52
+ catch (error) {
53
+ console.warn('Failed to create/read local identity file:', error);
54
+ return '';
55
+ }
56
+ }
23
57
  /**
24
58
  * Extract user ID from authentication context
25
- * Returns a mock user ID if no context is provided (backward compatibility)
59
+ * Implements tiered identity:
60
+ * - Priority 1: OAuth token validation (Pro tier - cross-device)
61
+ * - Priority 2: External user ID + client ID (ChatGPT OAuth)
62
+ * - Priority 3: Local file-based identity (Free tier - single machine)
63
+ * - Priority 4: Conversation-based ID (single window only)
64
+ * - Fallback: Ephemeral IDs (no persistence)
26
65
  */
27
66
  export async function extractUserFromContext(authContext) {
28
- // If we have a user_id directly, use it
29
- if (authContext?.user_id) {
30
- return authContext.user_id;
31
- }
32
- // If we have a token, we could validate it here
33
- // For now, we'll extract a user ID from the token if it's a JWT-like structure
67
+ // Priority 1: OAuth token validation (Pro tier - future)
34
68
  if (authContext?.token) {
35
- // TODO: Implement proper JWT validation and extraction
36
- // For now, just use the token as a user identifier
37
- return `oauth_${authContext.token.substring(0, 16)}`;
69
+ const hash = createHash('sha256').update(authContext.token).digest('hex');
70
+ return 'oauth_' + hash.substring(0, 24);
71
+ }
72
+ // Priority 2: Hash-based persistent ID from external user identifier
73
+ // For ChatGPT: this is the openai/subject that persists across all chat windows
74
+ if (authContext?.user_id && authContext?.client_id) {
75
+ const hash = createHash('sha256')
76
+ .update(authContext.client_id + ':' + authContext.user_id)
77
+ .digest('hex');
78
+ return authContext.client_id + '_' + hash.substring(0, 24);
79
+ }
80
+ // Priority 3: Local file-based identity (Free tier)
81
+ // Provides single-machine persistence for VS Code, Cursor, Claude Desktop, etc.
82
+ const localIdentity = getOrCreateLocalIdentity();
83
+ if (localIdentity) {
84
+ return localIdentity;
85
+ }
86
+ // Priority 4: Conversation-based ID (single chat window only)
87
+ if (authContext?.client_id && authContext?.conversation_id) {
88
+ const hash = createHash('sha256')
89
+ .update(authContext.client_id + ':conv:' + authContext.conversation_id)
90
+ .digest('hex');
91
+ return 'conv_' + hash.substring(0, 28);
38
92
  }
39
- // Fallback to anonymous user with optional client tracking
40
- const clientPrefix = authContext?.client_id ? `${authContext.client_id}_` : '';
93
+ // Fallback: Create ephemeral user with warning
94
+ console.warn('Creating ephemeral user - no stable identity provided', {
95
+ client_id: authContext?.client_id,
96
+ has_conversation_id: !!authContext?.conversation_id,
97
+ timestamp: new Date().toISOString()
98
+ });
41
99
  const { nanoid } = await import('nanoid');
42
- return `usr_${clientPrefix}${nanoid(8)}`;
100
+ return 'ephemeral_' + nanoid(12);
101
+ }
102
+ /**
103
+ * Get user tier from identity prefix
104
+ */
105
+ export function getUserTier(userId) {
106
+ if (userId.startsWith('oauth_'))
107
+ return 'pro';
108
+ if (userId.startsWith('local_'))
109
+ return 'free';
110
+ if (userId.startsWith('ephemeral_'))
111
+ return 'ephemeral';
112
+ // Client-based IDs (chatgpt_, claude_, etc.) could be either
113
+ return 'free';
114
+ }
115
+ /**
116
+ * Check if user has Pro tier features
117
+ */
118
+ export function hasProFeatures(userId) {
119
+ return getUserTier(userId) === 'pro';
120
+ }
121
+ /**
122
+ * Get the local identity file path for debugging/support
123
+ */
124
+ export function getIdentityFilePath() {
125
+ return IDENTITY_FILE;
43
126
  }
44
127
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IAEjF;;;OAGG;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAEvF;;;OAGG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;CAC3E,CAAC,CAAC;AAIH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAyB;IACpE,wCAAwC;IACxC,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,gDAAgD;IAChD,+EAA+E;IAC/E,IAAI,WAAW,EAAE,KAAK,EAAE,CAAC;QACvB,uDAAuD;QACvD,mDAAmD;QACnD,OAAO,SAAS,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,2DAA2D;IAC3D,MAAM,YAAY,GAAG,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,OAAO,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"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"}
@@ -7,14 +7,17 @@ export declare const SaveInsightSchema: z.ZodObject<{
7
7
  token: z.ZodOptional<z.ZodString>;
8
8
  user_id: z.ZodOptional<z.ZodString>;
9
9
  client_id: z.ZodOptional<z.ZodString>;
10
+ conversation_id: z.ZodOptional<z.ZodString>;
10
11
  }, "strip", z.ZodTypeAny, {
11
12
  user_id?: string | undefined;
12
13
  client_id?: string | undefined;
13
14
  token?: string | undefined;
15
+ conversation_id?: string | undefined;
14
16
  }, {
15
17
  user_id?: string | undefined;
16
18
  client_id?: string | undefined;
17
19
  token?: string | undefined;
20
+ conversation_id?: string | undefined;
18
21
  }>>;
19
22
  }, "strip", z.ZodTypeAny, {
20
23
  tags: string[];
@@ -24,6 +27,7 @@ export declare const SaveInsightSchema: z.ZodObject<{
24
27
  user_id?: string | undefined;
25
28
  client_id?: string | undefined;
26
29
  token?: string | undefined;
30
+ conversation_id?: string | undefined;
27
31
  } | undefined;
28
32
  }, {
29
33
  content: string;
@@ -33,6 +37,7 @@ export declare const SaveInsightSchema: z.ZodObject<{
33
37
  user_id?: string | undefined;
34
38
  client_id?: string | undefined;
35
39
  token?: string | undefined;
40
+ conversation_id?: string | undefined;
36
41
  } | undefined;
37
42
  }>;
38
43
  export type SaveInsightInput = z.infer<typeof SaveInsightSchema>;
@@ -43,14 +48,17 @@ export declare const GetUserContextSchema: z.ZodObject<{
43
48
  token: z.ZodOptional<z.ZodString>;
44
49
  user_id: z.ZodOptional<z.ZodString>;
45
50
  client_id: z.ZodOptional<z.ZodString>;
51
+ conversation_id: z.ZodOptional<z.ZodString>;
46
52
  }, "strip", z.ZodTypeAny, {
47
53
  user_id?: string | undefined;
48
54
  client_id?: string | undefined;
49
55
  token?: string | undefined;
56
+ conversation_id?: string | undefined;
50
57
  }, {
51
58
  user_id?: string | undefined;
52
59
  client_id?: string | undefined;
53
60
  token?: string | undefined;
61
+ conversation_id?: string | undefined;
54
62
  }>>;
55
63
  }, "strip", z.ZodTypeAny, {
56
64
  include_recent_insights: boolean;
@@ -59,12 +67,14 @@ export declare const GetUserContextSchema: z.ZodObject<{
59
67
  user_id?: string | undefined;
60
68
  client_id?: string | undefined;
61
69
  token?: string | undefined;
70
+ conversation_id?: string | undefined;
62
71
  } | undefined;
63
72
  }, {
64
73
  auth?: {
65
74
  user_id?: string | undefined;
66
75
  client_id?: string | undefined;
67
76
  token?: string | undefined;
77
+ conversation_id?: string | undefined;
68
78
  } | undefined;
69
79
  include_recent_insights?: boolean | undefined;
70
80
  include_session_history?: boolean | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"insight.d.ts","sourceRoot":"","sources":["../../src/types/insight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,GAAG,CAAC;IACV,eAAe,EAAE,GAAG,EAAE,CAAC;IACvB,eAAe,EAAE,GAAG,EAAE,CAAC;IACvB,cAAc,EAAE,GAAG,GAAG,IAAI,CAAC;CAC5B"}
1
+ {"version":3,"file":"insight.d.ts","sourceRoot":"","sources":["../../src/types/insight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,GAAG,CAAC;IACV,eAAe,EAAE,GAAG,EAAE,CAAC;IACvB,eAAe,EAAE,GAAG,EAAE,CAAC;IACvB,cAAc,EAAE,GAAG,GAAG,IAAI,CAAC;CAC5B"}
@@ -8,14 +8,17 @@ export declare const CreateSessionSchema: z.ZodObject<{
8
8
  token: z.ZodOptional<z.ZodString>;
9
9
  user_id: z.ZodOptional<z.ZodString>;
10
10
  client_id: z.ZodOptional<z.ZodString>;
11
+ conversation_id: z.ZodOptional<z.ZodString>;
11
12
  }, "strip", z.ZodTypeAny, {
12
13
  user_id?: string | undefined;
13
14
  client_id?: string | undefined;
14
15
  token?: string | undefined;
16
+ conversation_id?: string | undefined;
15
17
  }, {
16
18
  user_id?: string | undefined;
17
19
  client_id?: string | undefined;
18
20
  token?: string | undefined;
21
+ conversation_id?: string | undefined;
19
22
  }>>;
20
23
  }, "strip", z.ZodTypeAny, {
21
24
  journey_slug?: string | undefined;
@@ -24,6 +27,7 @@ export declare const CreateSessionSchema: z.ZodObject<{
24
27
  user_id?: string | undefined;
25
28
  client_id?: string | undefined;
26
29
  token?: string | undefined;
30
+ conversation_id?: string | undefined;
27
31
  } | undefined;
28
32
  }, {
29
33
  journey_slug?: string | undefined;
@@ -32,6 +36,7 @@ export declare const CreateSessionSchema: z.ZodObject<{
32
36
  user_id?: string | undefined;
33
37
  client_id?: string | undefined;
34
38
  token?: string | undefined;
39
+ conversation_id?: string | undefined;
35
40
  } | undefined;
36
41
  }>;
37
42
  export type CreateSessionInput = z.infer<typeof CreateSessionSchema>;
@@ -41,14 +46,17 @@ export declare const ResumeSessionSchema: z.ZodObject<{
41
46
  token: z.ZodOptional<z.ZodString>;
42
47
  user_id: z.ZodOptional<z.ZodString>;
43
48
  client_id: z.ZodOptional<z.ZodString>;
49
+ conversation_id: z.ZodOptional<z.ZodString>;
44
50
  }, "strip", z.ZodTypeAny, {
45
51
  user_id?: string | undefined;
46
52
  client_id?: string | undefined;
47
53
  token?: string | undefined;
54
+ conversation_id?: string | undefined;
48
55
  }, {
49
56
  user_id?: string | undefined;
50
57
  client_id?: string | undefined;
51
58
  token?: string | undefined;
59
+ conversation_id?: string | undefined;
52
60
  }>>;
53
61
  }, "strip", z.ZodTypeAny, {
54
62
  session_id?: string | undefined;
@@ -56,6 +64,7 @@ export declare const ResumeSessionSchema: z.ZodObject<{
56
64
  user_id?: string | undefined;
57
65
  client_id?: string | undefined;
58
66
  token?: string | undefined;
67
+ conversation_id?: string | undefined;
59
68
  } | undefined;
60
69
  }, {
61
70
  session_id?: string | undefined;
@@ -63,6 +72,7 @@ export declare const ResumeSessionSchema: z.ZodObject<{
63
72
  user_id?: string | undefined;
64
73
  client_id?: string | undefined;
65
74
  token?: string | undefined;
75
+ conversation_id?: string | undefined;
66
76
  } | undefined;
67
77
  }>;
68
78
  export type ResumeSessionInput = z.infer<typeof ResumeSessionSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/types/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,mBAAmB,2DAAyD,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/types/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,mBAAmB,2DAAyD,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "couchloop-eq-mcp",
3
- "version": "1.0.2",
4
- "description": "Turn conversations into guided journeys that remember where you left off - MCP server for stateful AI experiences",
3
+ "version": "1.0.4",
4
+ "description": "Behavioral governance layer for LLMs - monitors for hallucination, inconsistency, tone drift, and unsafe reasoning while managing stateful AI sessions",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
@@ -19,7 +19,8 @@
19
19
  },
20
20
  "scripts": {
21
21
  "build": "tsc",
22
- "start": "node dist/index.js",
22
+ "start": "node dist/server/index.js",
23
+ "start:mcp": "node dist/index.js",
23
24
  "dev": "tsx watch src/index.ts",
24
25
  "clean": "rm -rf dist",
25
26
  "test": "vitest",
@@ -41,9 +42,13 @@
41
42
  "keywords": [
42
43
  "mcp",
43
44
  "model-context-protocol",
44
- "ai",
45
+ "ai-safety",
46
+ "ai-governance",
47
+ "hallucination-detection",
45
48
  "chatgpt",
46
49
  "claude",
50
+ "llm-safety",
51
+ "behavioral-governance",
47
52
  "conversation",
48
53
  "state-management"
49
54
  ],
@@ -87,7 +92,7 @@
87
92
  "@typescript-eslint/eslint-plugin": "^6.15.0",
88
93
  "@typescript-eslint/parser": "^6.15.0",
89
94
  "@vercel/node": "^3.0.0",
90
- "drizzle-kit": "^0.20.7",
95
+ "drizzle-kit": "^0.20.18",
91
96
  "eslint": "^8.56.0",
92
97
  "tsx": "^4.6.2",
93
98
  "typescript": "^5.3.3",