@qwickapps/qwickbrain-proxy 1.0.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.
Files changed (90) hide show
  1. package/.github/workflows/publish.yml +92 -0
  2. package/CHANGELOG.md +47 -0
  3. package/LICENSE +45 -0
  4. package/README.md +165 -0
  5. package/dist/bin/cli.d.ts +3 -0
  6. package/dist/bin/cli.d.ts.map +1 -0
  7. package/dist/bin/cli.js +142 -0
  8. package/dist/bin/cli.js.map +1 -0
  9. package/dist/db/client.d.ts +10 -0
  10. package/dist/db/client.d.ts.map +1 -0
  11. package/dist/db/client.js +23 -0
  12. package/dist/db/client.js.map +1 -0
  13. package/dist/db/schema.d.ts +551 -0
  14. package/dist/db/schema.d.ts.map +1 -0
  15. package/dist/db/schema.js +65 -0
  16. package/dist/db/schema.js.map +1 -0
  17. package/dist/index.d.ts +7 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +5 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/lib/__tests__/cache-manager.test.d.ts +2 -0
  22. package/dist/lib/__tests__/cache-manager.test.d.ts.map +1 -0
  23. package/dist/lib/__tests__/cache-manager.test.js +202 -0
  24. package/dist/lib/__tests__/cache-manager.test.js.map +1 -0
  25. package/dist/lib/__tests__/connection-manager.test.d.ts +2 -0
  26. package/dist/lib/__tests__/connection-manager.test.d.ts.map +1 -0
  27. package/dist/lib/__tests__/connection-manager.test.js +188 -0
  28. package/dist/lib/__tests__/connection-manager.test.js.map +1 -0
  29. package/dist/lib/__tests__/proxy-server.test.d.ts +2 -0
  30. package/dist/lib/__tests__/proxy-server.test.d.ts.map +1 -0
  31. package/dist/lib/__tests__/proxy-server.test.js +205 -0
  32. package/dist/lib/__tests__/proxy-server.test.js.map +1 -0
  33. package/dist/lib/__tests__/qwickbrain-client.test.d.ts +2 -0
  34. package/dist/lib/__tests__/qwickbrain-client.test.d.ts.map +1 -0
  35. package/dist/lib/__tests__/qwickbrain-client.test.js +233 -0
  36. package/dist/lib/__tests__/qwickbrain-client.test.js.map +1 -0
  37. package/dist/lib/cache-manager.d.ts +25 -0
  38. package/dist/lib/cache-manager.d.ts.map +1 -0
  39. package/dist/lib/cache-manager.js +149 -0
  40. package/dist/lib/cache-manager.js.map +1 -0
  41. package/dist/lib/connection-manager.d.ts +26 -0
  42. package/dist/lib/connection-manager.d.ts.map +1 -0
  43. package/dist/lib/connection-manager.js +130 -0
  44. package/dist/lib/connection-manager.js.map +1 -0
  45. package/dist/lib/proxy-server.d.ts +19 -0
  46. package/dist/lib/proxy-server.d.ts.map +1 -0
  47. package/dist/lib/proxy-server.js +258 -0
  48. package/dist/lib/proxy-server.js.map +1 -0
  49. package/dist/lib/qwickbrain-client.d.ts +24 -0
  50. package/dist/lib/qwickbrain-client.d.ts.map +1 -0
  51. package/dist/lib/qwickbrain-client.js +197 -0
  52. package/dist/lib/qwickbrain-client.js.map +1 -0
  53. package/dist/types/config.d.ts +186 -0
  54. package/dist/types/config.d.ts.map +1 -0
  55. package/dist/types/config.js +42 -0
  56. package/dist/types/config.js.map +1 -0
  57. package/dist/types/mcp.d.ts +223 -0
  58. package/dist/types/mcp.d.ts.map +1 -0
  59. package/dist/types/mcp.js +78 -0
  60. package/dist/types/mcp.js.map +1 -0
  61. package/dist/version.d.ts +2 -0
  62. package/dist/version.d.ts.map +1 -0
  63. package/dist/version.js +9 -0
  64. package/dist/version.js.map +1 -0
  65. package/drizzle/0000_fat_rafael_vega.sql +41 -0
  66. package/drizzle/0001_goofy_invisible_woman.sql +2 -0
  67. package/drizzle/meta/0000_snapshot.json +276 -0
  68. package/drizzle/meta/0001_snapshot.json +295 -0
  69. package/drizzle/meta/_journal.json +20 -0
  70. package/drizzle.config.ts +12 -0
  71. package/package.json +65 -0
  72. package/src/bin/cli.ts +158 -0
  73. package/src/db/client.ts +34 -0
  74. package/src/db/schema.ts +68 -0
  75. package/src/index.ts +6 -0
  76. package/src/lib/__tests__/cache-manager.test.ts +264 -0
  77. package/src/lib/__tests__/connection-manager.test.ts +255 -0
  78. package/src/lib/__tests__/proxy-server.test.ts +261 -0
  79. package/src/lib/__tests__/qwickbrain-client.test.ts +310 -0
  80. package/src/lib/cache-manager.ts +201 -0
  81. package/src/lib/connection-manager.ts +156 -0
  82. package/src/lib/proxy-server.ts +320 -0
  83. package/src/lib/qwickbrain-client.ts +260 -0
  84. package/src/types/config.ts +47 -0
  85. package/src/types/mcp.ts +97 -0
  86. package/src/version.ts +11 -0
  87. package/test/fixtures/test-mcp.json +5 -0
  88. package/test-mcp-client.js +67 -0
  89. package/test-proxy.sh +25 -0
  90. package/tsconfig.json +22 -0
@@ -0,0 +1,97 @@
1
+ import { z } from 'zod';
2
+
3
+ // Base MCP request schema
4
+ export const MCPRequestSchema = z.object({
5
+ operation: z.string(),
6
+ arguments: z.record(z.unknown()).optional(),
7
+ });
8
+
9
+ export type MCPRequest = z.infer<typeof MCPRequestSchema>;
10
+
11
+ // Document operations
12
+ export const GetWorkflowArgsSchema = z.object({
13
+ name: z.string(),
14
+ });
15
+
16
+ export const GetDocumentArgsSchema = z.object({
17
+ name: z.string(),
18
+ doc_type: z.string(),
19
+ project: z.string().optional(),
20
+ });
21
+
22
+ export const CreateDocumentArgsSchema = z.object({
23
+ doc_type: z.string(),
24
+ name: z.string(),
25
+ content: z.string(),
26
+ project: z.string().optional(),
27
+ metadata: z.record(z.unknown()).optional(),
28
+ });
29
+
30
+ export const UpdateDocumentArgsSchema = z.object({
31
+ doc_type: z.string(),
32
+ name: z.string(),
33
+ project: z.string().optional(),
34
+ content: z.string().optional(),
35
+ metadata: z.record(z.unknown()).optional(),
36
+ });
37
+
38
+ export const ListDocumentsArgsSchema = z.object({
39
+ doc_type: z.string().optional(),
40
+ project: z.string().optional(),
41
+ limit: z.number().default(100),
42
+ });
43
+
44
+ export const SearchDocumentsArgsSchema = z.object({
45
+ query: z.string(),
46
+ doc_type: z.string().optional(),
47
+ project: z.string().optional(),
48
+ limit: z.number().default(10),
49
+ min_score: z.number().default(0.3),
50
+ });
51
+
52
+ // Memory operations
53
+ export const GetMemoryArgsSchema = z.object({
54
+ name: z.string(),
55
+ project: z.string().optional(),
56
+ });
57
+
58
+ export const SetMemoryArgsSchema = z.object({
59
+ name: z.string(),
60
+ content: z.string(),
61
+ project: z.string().optional(),
62
+ metadata: z.record(z.unknown()).optional(),
63
+ });
64
+
65
+ // MCP Response with metadata
66
+ export const MCPResponseMetadataSchema = z.object({
67
+ source: z.enum(['live', 'cache', 'stale_cache']),
68
+ age_seconds: z.number().optional(),
69
+ status: z.enum(['connected', 'disconnected', 'reconnecting', 'offline']),
70
+ warning: z.string().optional(),
71
+ cached_at: z.string().optional(),
72
+ latency_ms: z.number().optional(),
73
+ });
74
+
75
+ export type MCPResponseMetadata = z.infer<typeof MCPResponseMetadataSchema>;
76
+
77
+ export const MCPResponseSchema = z.object({
78
+ data: z.unknown().optional(),
79
+ error: z.object({
80
+ code: z.string(),
81
+ message: z.string(),
82
+ suggestions: z.array(z.string()).optional(),
83
+ }).optional(),
84
+ _metadata: MCPResponseMetadataSchema,
85
+ });
86
+
87
+ export type MCPResponse = z.infer<typeof MCPResponseSchema>;
88
+
89
+ // Connection states
90
+ export const ConnectionState = z.enum([
91
+ 'connected',
92
+ 'disconnected',
93
+ 'reconnecting',
94
+ 'offline',
95
+ ]);
96
+
97
+ export type ConnectionState = z.infer<typeof ConnectionState>;
package/src/version.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+
8
+ const packageJsonPath = join(__dirname, '../package.json');
9
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
10
+
11
+ export const VERSION = packageJson.version as string;
@@ -0,0 +1,5 @@
1
+ {
2
+ "jsonrpc": "2.0",
3
+ "id": 1,
4
+ "method": "tools/list"
5
+ }
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Test MCP client to verify the proxy works correctly
4
+ * Simulates how Claude Code communicates with the proxy
5
+ */
6
+
7
+ import { spawn } from 'child_process';
8
+ import { createInterface } from 'readline';
9
+
10
+ const proxy = spawn('node', ['dist/bin/cli.js', 'serve'], {
11
+ stdio: ['pipe', 'pipe', 'pipe']
12
+ });
13
+
14
+ let messageId = 1;
15
+
16
+ // Handle stderr (connection logs)
17
+ const rl = createInterface({ input: proxy.stderr });
18
+ rl.on('line', (line) => {
19
+ console.error('[PROXY]', line);
20
+ });
21
+
22
+ // Handle stdout (MCP responses)
23
+ const responseReader = createInterface({ input: proxy.stdout });
24
+ responseReader.on('line', (line) => {
25
+ console.log('[RESPONSE]', line);
26
+ try {
27
+ const response = JSON.parse(line);
28
+ console.log(JSON.stringify(response, null, 2));
29
+ } catch (e) {
30
+ // Not JSON, ignore
31
+ }
32
+ });
33
+
34
+ function sendRequest(method, params = {}) {
35
+ const request = {
36
+ jsonrpc: '2.0',
37
+ id: messageId++,
38
+ method,
39
+ params
40
+ };
41
+ console.log('[REQUEST]', JSON.stringify(request));
42
+ proxy.stdin.write(JSON.stringify(request) + '\n');
43
+ }
44
+
45
+ // Wait for proxy to start
46
+ setTimeout(() => {
47
+ console.log('\n=== Testing tools/list ===');
48
+ sendRequest('tools/list');
49
+ }, 2000);
50
+
51
+ setTimeout(() => {
52
+ console.log('\n=== Testing get_workflow ===');
53
+ sendRequest('tools/call', {
54
+ name: 'get_workflow',
55
+ arguments: { name: 'feature' }
56
+ });
57
+ }, 4000);
58
+
59
+ setTimeout(() => {
60
+ console.log('\n=== Cleanup ===');
61
+ proxy.kill();
62
+ process.exit(0);
63
+ }, 8000);
64
+
65
+ proxy.on('exit', (code) => {
66
+ console.log(`Proxy exited with code ${code}`);
67
+ });
package/test-proxy.sh ADDED
@@ -0,0 +1,25 @@
1
+ #!/bin/bash
2
+ # Test the QwickBrain proxy MCP server
3
+
4
+ echo "Starting proxy server..."
5
+ node dist/bin/cli.js serve &
6
+ PROXY_PID=$!
7
+ sleep 2
8
+
9
+ echo "Testing tools/list..."
10
+ echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node dist/bin/cli.js serve 2>/dev/null &
11
+ TEST_PID=$!
12
+ sleep 1
13
+
14
+ echo "Testing get_workflow..."
15
+ echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_workflow","arguments":{"name":"feature"}}}' | node dist/bin/cli.js serve 2>/dev/null &
16
+ TEST_PID2=$!
17
+ sleep 2
18
+
19
+ echo "Checking cache..."
20
+ sqlite3 ~/.qwickbrain/cache/qwickbrain.db "SELECT doc_type, name FROM documents;"
21
+
22
+ echo "Cleanup..."
23
+ kill $PROXY_PID $TEST_PID $TEST_PID2 2>/dev/null || true
24
+
25
+ echo "Done!"
package/tsconfig.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "lib": ["ES2022"],
6
+ "moduleResolution": "bundler",
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "declaration": true,
10
+ "declarationMap": true,
11
+ "sourceMap": true,
12
+ "strict": true,
13
+ "esModuleInterop": true,
14
+ "skipLibCheck": true,
15
+ "forceConsistentCasingInFileNames": true,
16
+ "resolveJsonModule": true,
17
+ "allowSyntheticDefaultImports": true,
18
+ "types": ["node"]
19
+ },
20
+ "include": ["src/**/*"],
21
+ "exclude": ["node_modules", "dist", "tests"]
22
+ }