@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 @@
1
+ {"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../src/lib/proxy-server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAI1C,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,MAAM,CAAS;gBAEX,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM;IA2BlC,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,aAAa;IAqGrB,OAAO,CAAC,cAAc;YAQR,iBAAiB;YAIjB,iBAAiB;YAmEjB,eAAe;IAgDvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
@@ -0,0 +1,258 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
+ import { ConnectionManager } from './connection-manager.js';
5
+ import { CacheManager } from './cache-manager.js';
6
+ import { QwickBrainClient } from './qwickbrain-client.js';
7
+ import { VERSION } from '../version.js';
8
+ export class ProxyServer {
9
+ server;
10
+ connectionManager;
11
+ cacheManager;
12
+ qwickbrainClient;
13
+ config;
14
+ constructor(db, config) {
15
+ this.config = config;
16
+ this.server = new Server({
17
+ name: 'qwickbrain-proxy',
18
+ version: VERSION,
19
+ }, {
20
+ capabilities: {
21
+ tools: {},
22
+ },
23
+ });
24
+ this.qwickbrainClient = new QwickBrainClient(config.qwickbrain);
25
+ this.connectionManager = new ConnectionManager(this.qwickbrainClient, config.connection);
26
+ this.cacheManager = new CacheManager(db, config.cache);
27
+ this.setupHandlers();
28
+ this.setupConnectionListeners();
29
+ }
30
+ setupConnectionListeners() {
31
+ this.connectionManager.on('stateChange', ({ from, to }) => {
32
+ console.error(`Connection state: ${from} → ${to}`);
33
+ });
34
+ this.connectionManager.on('reconnecting', ({ attempt, delay }) => {
35
+ console.error(`Reconnecting (attempt ${attempt}, delay ${delay}ms)...`);
36
+ });
37
+ this.connectionManager.on('connected', ({ latencyMs }) => {
38
+ console.error(`Connected to QwickBrain (latency: ${latencyMs}ms)`);
39
+ });
40
+ this.connectionManager.on('disconnected', ({ error }) => {
41
+ console.error(`Disconnected from QwickBrain: ${error}`);
42
+ });
43
+ }
44
+ setupHandlers() {
45
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
46
+ tools: [
47
+ {
48
+ name: 'get_workflow',
49
+ description: 'Get a workflow definition by name',
50
+ inputSchema: {
51
+ type: 'object',
52
+ properties: {
53
+ name: { type: 'string', description: 'Workflow name' },
54
+ },
55
+ required: ['name'],
56
+ },
57
+ },
58
+ {
59
+ name: 'get_document',
60
+ description: 'Get a document by name and type',
61
+ inputSchema: {
62
+ type: 'object',
63
+ properties: {
64
+ name: { type: 'string', description: 'Document name' },
65
+ doc_type: { type: 'string', description: 'Document type (rule, frd, design, etc.)' },
66
+ project: { type: 'string', description: 'Project name (optional)' },
67
+ },
68
+ required: ['name', 'doc_type'],
69
+ },
70
+ },
71
+ {
72
+ name: 'get_memory',
73
+ description: 'Get a memory/context document by name',
74
+ inputSchema: {
75
+ type: 'object',
76
+ properties: {
77
+ name: { type: 'string', description: 'Memory name' },
78
+ project: { type: 'string', description: 'Project name (optional)' },
79
+ },
80
+ required: ['name'],
81
+ },
82
+ },
83
+ ],
84
+ }));
85
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
86
+ const { name, arguments: args } = request.params;
87
+ try {
88
+ let result;
89
+ switch (name) {
90
+ case 'get_workflow':
91
+ result = await this.handleGetWorkflow(args?.name);
92
+ break;
93
+ case 'get_document':
94
+ result = await this.handleGetDocument(args?.doc_type, args?.name, args?.project);
95
+ break;
96
+ case 'get_memory':
97
+ result = await this.handleGetMemory(args?.name, args?.project);
98
+ break;
99
+ default:
100
+ throw new Error(`Unknown tool: ${name}`);
101
+ }
102
+ return {
103
+ content: [
104
+ {
105
+ type: 'text',
106
+ text: JSON.stringify(result, null, 2),
107
+ },
108
+ ],
109
+ };
110
+ }
111
+ catch (error) {
112
+ const errorMessage = error instanceof Error ? error.message : String(error);
113
+ return {
114
+ content: [
115
+ {
116
+ type: 'text',
117
+ text: JSON.stringify({
118
+ error: {
119
+ code: 'TOOL_ERROR',
120
+ message: errorMessage,
121
+ },
122
+ _metadata: {
123
+ source: 'cache',
124
+ status: this.connectionManager.getState(),
125
+ },
126
+ }, null, 2),
127
+ },
128
+ ],
129
+ isError: true,
130
+ };
131
+ }
132
+ });
133
+ }
134
+ createMetadata(source, age) {
135
+ return {
136
+ source,
137
+ age_seconds: age,
138
+ status: this.connectionManager.getState(),
139
+ };
140
+ }
141
+ async handleGetWorkflow(name) {
142
+ return this.handleGetDocument('workflow', name);
143
+ }
144
+ async handleGetDocument(docType, name, project) {
145
+ // Try cache first
146
+ const cached = await this.cacheManager.getDocument(docType, name, project);
147
+ if (cached && !cached.isExpired) {
148
+ return {
149
+ data: cached.data,
150
+ _metadata: this.createMetadata('cache', cached.age),
151
+ };
152
+ }
153
+ // Try remote if connected
154
+ if (this.connectionManager.getState() === 'connected') {
155
+ try {
156
+ const result = await this.connectionManager.execute(async () => {
157
+ return await this.qwickbrainClient.getDocument(docType, name, project);
158
+ });
159
+ // Cache the result
160
+ await this.cacheManager.setDocument(docType, name, result.content, project, result.metadata);
161
+ return {
162
+ data: result,
163
+ _metadata: this.createMetadata('live'),
164
+ };
165
+ }
166
+ catch (error) {
167
+ console.error('Failed to fetch from QwickBrain:', error);
168
+ // Fall through to stale cache
169
+ }
170
+ }
171
+ // Try stale cache
172
+ if (cached) {
173
+ return {
174
+ data: cached.data,
175
+ _metadata: {
176
+ ...this.createMetadata('stale_cache', cached.age),
177
+ warning: `QwickBrain unavailable - serving cached data (${cached.age}s old)`,
178
+ },
179
+ };
180
+ }
181
+ // No cache, no connection
182
+ return {
183
+ error: {
184
+ code: 'UNAVAILABLE',
185
+ message: `QwickBrain unavailable and no cached data for ${docType}:${name}`,
186
+ suggestions: [
187
+ 'Check internet connection',
188
+ 'Wait for automatic reconnection',
189
+ docType === 'workflow' ? 'Try /plan command as fallback' : undefined,
190
+ ].filter(Boolean),
191
+ },
192
+ _metadata: this.createMetadata('cache'),
193
+ };
194
+ }
195
+ async handleGetMemory(name, project) {
196
+ // Similar logic to handleGetDocument but for memories
197
+ const cached = await this.cacheManager.getMemory(name, project);
198
+ if (cached && !cached.isExpired) {
199
+ return {
200
+ data: cached.data,
201
+ _metadata: this.createMetadata('cache', cached.age),
202
+ };
203
+ }
204
+ if (this.connectionManager.getState() === 'connected') {
205
+ try {
206
+ const result = await this.connectionManager.execute(async () => {
207
+ return await this.qwickbrainClient.getMemory(name, project);
208
+ });
209
+ await this.cacheManager.setMemory(name, result.content, project, result.metadata);
210
+ return {
211
+ data: result,
212
+ _metadata: this.createMetadata('live'),
213
+ };
214
+ }
215
+ catch (error) {
216
+ console.error('Failed to fetch memory from QwickBrain:', error);
217
+ }
218
+ }
219
+ if (cached) {
220
+ return {
221
+ data: cached.data,
222
+ _metadata: {
223
+ ...this.createMetadata('stale_cache', cached.age),
224
+ warning: `QwickBrain unavailable - serving cached memory (${cached.age}s old)`,
225
+ },
226
+ };
227
+ }
228
+ return {
229
+ error: {
230
+ code: 'UNAVAILABLE',
231
+ message: `QwickBrain unavailable and no cached memory: ${name}`,
232
+ suggestions: ['Check connection', 'Wait for reconnection'],
233
+ },
234
+ _metadata: this.createMetadata('cache'),
235
+ };
236
+ }
237
+ async start() {
238
+ // Clean up expired cache entries on startup
239
+ const { documentsDeleted, memoriesDeleted } = await this.cacheManager.cleanupExpiredEntries();
240
+ if (documentsDeleted > 0 || memoriesDeleted > 0) {
241
+ console.error(`Cache cleanup: removed ${documentsDeleted} documents, ${memoriesDeleted} memories`);
242
+ }
243
+ // Connect to QwickBrain
244
+ await this.qwickbrainClient.connect();
245
+ // Start connection manager
246
+ await this.connectionManager.start();
247
+ // Start MCP server
248
+ const transport = new StdioServerTransport();
249
+ await this.server.connect(transport);
250
+ console.error('QwickBrain Proxy started');
251
+ }
252
+ async stop() {
253
+ this.connectionManager.stop();
254
+ await this.qwickbrainClient.disconnect();
255
+ await this.server.close();
256
+ }
257
+ }
258
+ //# sourceMappingURL=proxy-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-server.js","sourceRoot":"","sources":["../../src/lib/proxy-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,WAAW;IACd,MAAM,CAAS;IACf,iBAAiB,CAAoB;IACrC,YAAY,CAAe;IAC3B,gBAAgB,CAAmB;IACnC,MAAM,CAAS;IAEvB,YAAY,EAAM,EAAE,MAAc;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB;YACE,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,OAAO;SACjB,EACD;YACE,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE;aACV;SACF,CACF,CAAC;QAEF,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEhE,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAC5C,IAAI,CAAC,gBAAgB,EACrB,MAAM,CAAC,UAAU,CAClB,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAEO,wBAAwB;QAC9B,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;YACxD,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YAC/D,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;YACvD,OAAO,CAAC,KAAK,CAAC,qCAAqC,SAAS,KAAK,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACtD,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjE,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,cAAc;oBACpB,WAAW,EAAE,mCAAmC;oBAChD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;yBACvD;wBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;qBACnB;iBACF;gBACD;oBACE,IAAI,EAAE,cAAc;oBACpB,WAAW,EAAE,iCAAiC;oBAC9C,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;4BACtD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yCAAyC,EAAE;4BACpF,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;yBACpE;wBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;qBAC/B;iBACF;gBACD;oBACE,IAAI,EAAE,YAAY;oBAClB,WAAW,EAAE,uCAAuC;oBACpD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;4BACpD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;yBACpE;wBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;qBACnB;iBACF;aACF;SACF,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAEjD,IAAI,CAAC;gBACH,IAAI,MAAmB,CAAC;gBAExB,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,cAAc;wBACjB,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAc,CAAC,CAAC;wBAC5D,MAAM;oBACR,KAAK,cAAc;wBACjB,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CACnC,IAAI,EAAE,QAAkB,EACxB,IAAI,EAAE,IAAc,EACpB,IAAI,EAAE,OAA6B,CACpC,CAAC;wBACF,MAAM;oBACR,KAAK,YAAY;wBACf,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CACjC,IAAI,EAAE,IAAc,EACpB,IAAI,EAAE,OAA6B,CACpC,CAAC;wBACF,MAAM;oBACR;wBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,KAAK,EAAE;oCACL,IAAI,EAAE,YAAY;oCAClB,OAAO,EAAE,YAAY;iCACtB;gCACD,SAAS,EAAE;oCACT,MAAM,EAAE,OAAO;oCACf,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;iCAC1C;6BACF,EAAE,IAAI,EAAE,CAAC,CAAC;yBACZ;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,MAAwC,EAAE,GAAY;QAC3E,OAAO;YACL,MAAM;YACN,WAAW,EAAE,GAAG;YAChB,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;SAC1C,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAC1C,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,OAAe,EACf,IAAY,EACZ,OAAgB;QAEhB,kBAAkB;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAE3E,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;aACpD,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,WAAW,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;oBAC7D,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;gBAEH,mBAAmB;gBACnB,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CACjC,OAAO,EACP,IAAI,EACJ,MAAM,CAAC,OAAO,EACd,OAAO,EACP,MAAM,CAAC,QAAQ,CAChB,CAAC;gBAEF,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;iBACvC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;gBACzD,8BAA8B;YAChC,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE;oBACT,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC;oBACjD,OAAO,EAAE,iDAAiD,MAAM,CAAC,GAAG,QAAQ;iBAC7E;aACF,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,iDAAiD,OAAO,IAAI,IAAI,EAAE;gBAC3E,WAAW,EAAE;oBACX,2BAA2B;oBAC3B,iCAAiC;oBACjC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,SAAS;iBACrE,CAAC,MAAM,CAAC,OAAO,CAAa;aAC9B;YACD,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;SACxC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,OAAgB;QAC1D,sDAAsD;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;aACpD,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,WAAW,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;oBAC7D,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;gBAEH,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAElF,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;iBACvC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE;oBACT,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC;oBACjD,OAAO,EAAE,mDAAmD,MAAM,CAAC,GAAG,QAAQ;iBAC/E;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,gDAAgD,IAAI,EAAE;gBAC/D,WAAW,EAAE,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;aAC3D;YACD,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,4CAA4C;QAC5C,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC;QAC9F,IAAI,gBAAgB,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,0BAA0B,gBAAgB,eAAe,eAAe,WAAW,CAAC,CAAC;QACrG,CAAC;QAED,wBAAwB;QACxB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAEtC,2BAA2B;QAC3B,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAErC,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAErC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { Config } from '../types/config.js';
2
+ export interface QwickBrainResponse {
3
+ content: string;
4
+ metadata?: Record<string, unknown>;
5
+ }
6
+ export declare class QwickBrainClient {
7
+ private client;
8
+ private transport;
9
+ private mode;
10
+ private config;
11
+ constructor(config: Config['qwickbrain']);
12
+ connect(): Promise<void>;
13
+ private connectMCP;
14
+ private connectSSE;
15
+ getDocument(docType: string, name: string, project?: string): Promise<QwickBrainResponse>;
16
+ private getDocumentMCP;
17
+ private getDocumentHTTP;
18
+ getMemory(name: string, project?: string): Promise<QwickBrainResponse>;
19
+ private getMemoryMCP;
20
+ private getMemoryHTTP;
21
+ healthCheck(): Promise<boolean>;
22
+ disconnect(): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=qwickbrain-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwickbrain-client.d.ts","sourceRoot":"","sources":["../../src/lib/qwickbrain-client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA8BjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC;IAKlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAShB,UAAU;YAuBV,UAAU;IAsBlB,WAAW,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC;YAQhB,cAAc;YA4Bd,eAAe;IA0BvB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAQ9D,YAAY;YA0BZ,aAAa;IAyBrB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAuB/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAOlC"}
@@ -0,0 +1,197 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
4
+ import { z } from 'zod';
5
+ import { VERSION } from '../version.js';
6
+ // Zod schema for MCP tool response validation
7
+ const MCPToolResponseSchema = z.object({
8
+ content: z.array(z.object({
9
+ type: z.literal('text'),
10
+ text: z.string(),
11
+ })),
12
+ });
13
+ // Zod schema for the document/memory data inside the MCP response
14
+ const QwickBrainDocumentSchema = z.object({
15
+ document: z
16
+ .object({
17
+ content: z.string(),
18
+ metadata: z.record(z.unknown()).optional(),
19
+ })
20
+ .optional(),
21
+ });
22
+ // Zod schema for HTTP API responses
23
+ const HTTPResponseSchema = z.object({
24
+ content: z.string(),
25
+ metadata: z.record(z.unknown()).optional(),
26
+ });
27
+ export class QwickBrainClient {
28
+ client = null;
29
+ transport = null;
30
+ mode;
31
+ config;
32
+ constructor(config) {
33
+ this.mode = config.mode;
34
+ this.config = config;
35
+ }
36
+ async connect() {
37
+ if (this.mode === 'mcp') {
38
+ await this.connectMCP();
39
+ }
40
+ else if (this.mode === 'sse') {
41
+ await this.connectSSE();
42
+ }
43
+ // HTTP mode doesn't need persistent connection
44
+ }
45
+ async connectMCP() {
46
+ if (!this.config.command) {
47
+ throw new Error('MCP mode requires command to be configured');
48
+ }
49
+ this.client = new Client({
50
+ name: 'qwickbrain-proxy',
51
+ version: VERSION,
52
+ }, {
53
+ capabilities: {},
54
+ });
55
+ this.transport = new StdioClientTransport({
56
+ command: this.config.command,
57
+ args: this.config.args || [],
58
+ });
59
+ await this.client.connect(this.transport);
60
+ }
61
+ async connectSSE() {
62
+ if (!this.config.url) {
63
+ throw new Error('SSE mode requires url to be configured');
64
+ }
65
+ this.client = new Client({
66
+ name: 'qwickbrain-proxy',
67
+ version: VERSION,
68
+ }, {
69
+ capabilities: {},
70
+ });
71
+ this.transport = new SSEClientTransport(new URL(this.config.url));
72
+ await this.client.connect(this.transport);
73
+ }
74
+ async getDocument(docType, name, project) {
75
+ if (this.mode === 'mcp' || this.mode === 'sse') {
76
+ return this.getDocumentMCP(docType, name, project);
77
+ }
78
+ else {
79
+ return this.getDocumentHTTP(docType, name, project);
80
+ }
81
+ }
82
+ async getDocumentMCP(docType, name, project) {
83
+ if (!this.client) {
84
+ throw new Error('MCP client not connected');
85
+ }
86
+ const result = await this.client.callTool({
87
+ name: 'get_document',
88
+ arguments: {
89
+ doc_type: docType,
90
+ name,
91
+ project,
92
+ },
93
+ });
94
+ // Validate MCP response structure
95
+ const parsed = MCPToolResponseSchema.parse(result);
96
+ const data = QwickBrainDocumentSchema.parse(JSON.parse(parsed.content[0].text));
97
+ return {
98
+ content: data.document?.content || '',
99
+ metadata: data.document?.metadata,
100
+ };
101
+ }
102
+ async getDocumentHTTP(docType, name, project) {
103
+ if (!this.config.url) {
104
+ throw new Error('HTTP mode requires url to be configured');
105
+ }
106
+ const response = await fetch(`${this.config.url}/mcp/document`, {
107
+ method: 'POST',
108
+ headers: {
109
+ 'Content-Type': 'application/json',
110
+ ...(this.config.apiKey && { 'Authorization': `Bearer ${this.config.apiKey}` }),
111
+ },
112
+ body: JSON.stringify({ doc_type: docType, name, project }),
113
+ });
114
+ if (!response.ok) {
115
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
116
+ }
117
+ const json = await response.json();
118
+ return HTTPResponseSchema.parse(json);
119
+ }
120
+ async getMemory(name, project) {
121
+ if (this.mode === 'mcp' || this.mode === 'sse') {
122
+ return this.getMemoryMCP(name, project);
123
+ }
124
+ else {
125
+ return this.getMemoryHTTP(name, project);
126
+ }
127
+ }
128
+ async getMemoryMCP(name, project) {
129
+ if (!this.client) {
130
+ throw new Error('MCP client not connected');
131
+ }
132
+ const result = await this.client.callTool({
133
+ name: 'get_memory',
134
+ arguments: {
135
+ name,
136
+ project,
137
+ },
138
+ });
139
+ // Validate MCP response structure
140
+ const parsed = MCPToolResponseSchema.parse(result);
141
+ const data = QwickBrainDocumentSchema.parse(JSON.parse(parsed.content[0].text));
142
+ return {
143
+ content: data.document?.content || '',
144
+ metadata: data.document?.metadata,
145
+ };
146
+ }
147
+ async getMemoryHTTP(name, project) {
148
+ if (!this.config.url) {
149
+ throw new Error('HTTP mode requires url to be configured');
150
+ }
151
+ const response = await fetch(`${this.config.url}/mcp/memory`, {
152
+ method: 'POST',
153
+ headers: {
154
+ 'Content-Type': 'application/json',
155
+ ...(this.config.apiKey && { 'Authorization': `Bearer ${this.config.apiKey}` }),
156
+ },
157
+ body: JSON.stringify({ name, project }),
158
+ });
159
+ if (!response.ok) {
160
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
161
+ }
162
+ const json = await response.json();
163
+ return HTTPResponseSchema.parse(json);
164
+ }
165
+ async healthCheck() {
166
+ try {
167
+ if (this.mode === 'mcp' || this.mode === 'sse') {
168
+ // For MCP/SSE mode, check if client is connected
169
+ if (!this.client) {
170
+ await this.connect();
171
+ }
172
+ // Try listing tools as health check
173
+ await this.client.listTools();
174
+ return true;
175
+ }
176
+ else {
177
+ // For HTTP mode, ping health endpoint
178
+ if (!this.config.url) {
179
+ return false;
180
+ }
181
+ const response = await fetch(`${this.config.url}/health`);
182
+ return response.ok;
183
+ }
184
+ }
185
+ catch (error) {
186
+ return false;
187
+ }
188
+ }
189
+ async disconnect() {
190
+ if ((this.mode === 'mcp' || this.mode === 'sse') && this.client && this.transport) {
191
+ await this.client.close();
192
+ this.client = null;
193
+ this.transport = null;
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=qwickbrain-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwickbrain-client.js","sourceRoot":"","sources":["../../src/lib/qwickbrain-client.ts"],"names":[],"mappings":"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"}