@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.
- package/.github/workflows/publish.yml +92 -0
- package/CHANGELOG.md +47 -0
- package/LICENSE +45 -0
- package/README.md +165 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +142 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/db/client.d.ts +10 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +23 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/schema.d.ts +551 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +65 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/cache-manager.test.d.ts +2 -0
- package/dist/lib/__tests__/cache-manager.test.d.ts.map +1 -0
- package/dist/lib/__tests__/cache-manager.test.js +202 -0
- package/dist/lib/__tests__/cache-manager.test.js.map +1 -0
- package/dist/lib/__tests__/connection-manager.test.d.ts +2 -0
- package/dist/lib/__tests__/connection-manager.test.d.ts.map +1 -0
- package/dist/lib/__tests__/connection-manager.test.js +188 -0
- package/dist/lib/__tests__/connection-manager.test.js.map +1 -0
- package/dist/lib/__tests__/proxy-server.test.d.ts +2 -0
- package/dist/lib/__tests__/proxy-server.test.d.ts.map +1 -0
- package/dist/lib/__tests__/proxy-server.test.js +205 -0
- package/dist/lib/__tests__/proxy-server.test.js.map +1 -0
- package/dist/lib/__tests__/qwickbrain-client.test.d.ts +2 -0
- package/dist/lib/__tests__/qwickbrain-client.test.d.ts.map +1 -0
- package/dist/lib/__tests__/qwickbrain-client.test.js +233 -0
- package/dist/lib/__tests__/qwickbrain-client.test.js.map +1 -0
- package/dist/lib/cache-manager.d.ts +25 -0
- package/dist/lib/cache-manager.d.ts.map +1 -0
- package/dist/lib/cache-manager.js +149 -0
- package/dist/lib/cache-manager.js.map +1 -0
- package/dist/lib/connection-manager.d.ts +26 -0
- package/dist/lib/connection-manager.d.ts.map +1 -0
- package/dist/lib/connection-manager.js +130 -0
- package/dist/lib/connection-manager.js.map +1 -0
- package/dist/lib/proxy-server.d.ts +19 -0
- package/dist/lib/proxy-server.d.ts.map +1 -0
- package/dist/lib/proxy-server.js +258 -0
- package/dist/lib/proxy-server.js.map +1 -0
- package/dist/lib/qwickbrain-client.d.ts +24 -0
- package/dist/lib/qwickbrain-client.d.ts.map +1 -0
- package/dist/lib/qwickbrain-client.js +197 -0
- package/dist/lib/qwickbrain-client.js.map +1 -0
- package/dist/types/config.d.ts +186 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +42 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/mcp.d.ts +223 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +78 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- package/drizzle/0000_fat_rafael_vega.sql +41 -0
- package/drizzle/0001_goofy_invisible_woman.sql +2 -0
- package/drizzle/meta/0000_snapshot.json +276 -0
- package/drizzle/meta/0001_snapshot.json +295 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.ts +12 -0
- package/package.json +65 -0
- package/src/bin/cli.ts +158 -0
- package/src/db/client.ts +34 -0
- package/src/db/schema.ts +68 -0
- package/src/index.ts +6 -0
- package/src/lib/__tests__/cache-manager.test.ts +264 -0
- package/src/lib/__tests__/connection-manager.test.ts +255 -0
- package/src/lib/__tests__/proxy-server.test.ts +261 -0
- package/src/lib/__tests__/qwickbrain-client.test.ts +310 -0
- package/src/lib/cache-manager.ts +201 -0
- package/src/lib/connection-manager.ts +156 -0
- package/src/lib/proxy-server.ts +320 -0
- package/src/lib/qwickbrain-client.ts +260 -0
- package/src/types/config.ts +47 -0
- package/src/types/mcp.ts +97 -0
- package/src/version.ts +11 -0
- package/test/fixtures/test-mcp.json +5 -0
- package/test-mcp-client.js +67 -0
- package/test-proxy.sh +25 -0
- package/tsconfig.json +22 -0
package/src/types/mcp.ts
ADDED
|
@@ -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,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
|
+
}
|