cache-overflow-mcp 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.
Files changed (85) hide show
  1. package/.env.example +3 -0
  2. package/README.md +62 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +8 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client.d.ts +13 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +50 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/client.test.d.ts +2 -0
  12. package/dist/client.test.d.ts.map +1 -0
  13. package/dist/client.test.js +89 -0
  14. package/dist/client.test.js.map +1 -0
  15. package/dist/config.d.ts +10 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +10 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/index.d.ts +4 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +4 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/server.d.ts +8 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +38 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/testing/mock-data.d.ts +8 -0
  28. package/dist/testing/mock-data.d.ts.map +1 -0
  29. package/dist/testing/mock-data.js +134 -0
  30. package/dist/testing/mock-data.js.map +1 -0
  31. package/dist/testing/mock-server.d.ts +14 -0
  32. package/dist/testing/mock-server.d.ts.map +1 -0
  33. package/dist/testing/mock-server.js +134 -0
  34. package/dist/testing/mock-server.js.map +1 -0
  35. package/dist/tools/find-solution.d.ts +3 -0
  36. package/dist/tools/find-solution.d.ts.map +1 -0
  37. package/dist/tools/find-solution.js +40 -0
  38. package/dist/tools/find-solution.js.map +1 -0
  39. package/dist/tools/index.d.ts +13 -0
  40. package/dist/tools/index.d.ts.map +1 -0
  41. package/dist/tools/index.js +13 -0
  42. package/dist/tools/index.js.map +1 -0
  43. package/dist/tools/publish-solution.d.ts +3 -0
  44. package/dist/tools/publish-solution.d.ts.map +1 -0
  45. package/dist/tools/publish-solution.js +39 -0
  46. package/dist/tools/publish-solution.js.map +1 -0
  47. package/dist/tools/submit-feedback.d.ts +3 -0
  48. package/dist/tools/submit-feedback.d.ts.map +1 -0
  49. package/dist/tools/submit-feedback.js +34 -0
  50. package/dist/tools/submit-feedback.js.map +1 -0
  51. package/dist/tools/submit-verification.d.ts +3 -0
  52. package/dist/tools/submit-verification.d.ts.map +1 -0
  53. package/dist/tools/submit-verification.js +34 -0
  54. package/dist/tools/submit-verification.js.map +1 -0
  55. package/dist/tools/unlock-solution.d.ts +3 -0
  56. package/dist/tools/unlock-solution.d.ts.map +1 -0
  57. package/dist/tools/unlock-solution.js +29 -0
  58. package/dist/tools/unlock-solution.js.map +1 -0
  59. package/dist/types.d.ts +39 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/ui/verification-dialog.d.ts +8 -0
  64. package/dist/ui/verification-dialog.d.ts.map +1 -0
  65. package/dist/ui/verification-dialog.js +332 -0
  66. package/dist/ui/verification-dialog.js.map +1 -0
  67. package/package.json +44 -0
  68. package/src/cli.ts +10 -0
  69. package/src/client.test.ts +116 -0
  70. package/src/client.ts +76 -0
  71. package/src/config.ts +9 -0
  72. package/src/index.ts +3 -0
  73. package/src/server.ts +49 -0
  74. package/src/testing/mock-data.ts +142 -0
  75. package/src/testing/mock-server.ts +176 -0
  76. package/src/tools/find-solution.ts +49 -0
  77. package/src/tools/index.ts +23 -0
  78. package/src/tools/publish-solution.ts +43 -0
  79. package/src/tools/submit-feedback.ts +38 -0
  80. package/src/tools/submit-verification.ts +38 -0
  81. package/src/tools/unlock-solution.ts +33 -0
  82. package/src/types.ts +39 -0
  83. package/src/ui/verification-dialog.ts +342 -0
  84. package/test-dialog.js +37 -0
  85. package/tsconfig.json +20 -0
@@ -0,0 +1,134 @@
1
+ import * as http from 'node:http';
2
+ import { mockSolutions, mockFindResults, createMockSolution } from './mock-data.js';
3
+ export class MockServer {
4
+ server = null;
5
+ port = 0;
6
+ routes = [];
7
+ get url() {
8
+ return `http://localhost:${this.port}`;
9
+ }
10
+ constructor() {
11
+ this.setupRoutes();
12
+ }
13
+ setupRoutes() {
14
+ // POST /solutions/find
15
+ this.addRoute('POST', '/solutions/find', (_req, body) => {
16
+ const { query } = body;
17
+ const results = mockFindResults.filter((r) => r.query_title.toLowerCase().includes((query ?? '').toLowerCase()));
18
+ return { status: 200, data: results.length > 0 ? results : mockFindResults };
19
+ });
20
+ // POST /solutions/:id/unlock
21
+ this.addRoute('POST', '/solutions/:id/unlock', (_req, _body, params) => {
22
+ const solution = mockSolutions.find((s) => s.id === params.id);
23
+ if (solution) {
24
+ return { status: 200, data: solution };
25
+ }
26
+ return { status: 200, data: mockSolutions[0] };
27
+ });
28
+ // POST /solutions
29
+ this.addRoute('POST', '/solutions', (_req, body) => {
30
+ const { query_title, solution_body } = body;
31
+ const newSolution = createMockSolution({
32
+ query_title,
33
+ solution_body,
34
+ });
35
+ return { status: 200, data: newSolution };
36
+ });
37
+ // POST /solutions/:id/verify
38
+ this.addRoute('POST', '/solutions/:id/verify', () => {
39
+ return { status: 200, data: null };
40
+ });
41
+ // POST /solutions/:id/feedback
42
+ this.addRoute('POST', '/solutions/:id/feedback', () => {
43
+ return { status: 200, data: null };
44
+ });
45
+ }
46
+ addRoute(method, path, handler) {
47
+ const paramNames = [];
48
+ const patternString = path.replace(/:([^/]+)/g, (_match, paramName) => {
49
+ paramNames.push(paramName);
50
+ return '([^/]+)';
51
+ });
52
+ const pattern = new RegExp(`^${patternString}$`);
53
+ this.routes.push({ method, pattern, paramNames, handler });
54
+ }
55
+ matchRoute(method, path) {
56
+ for (const route of this.routes) {
57
+ if (route.method !== method)
58
+ continue;
59
+ const match = path.match(route.pattern);
60
+ if (match) {
61
+ const params = {};
62
+ route.paramNames.forEach((name, index) => {
63
+ params[name] = match[index + 1];
64
+ });
65
+ return { route, params };
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ async start(port) {
71
+ return new Promise((resolve, reject) => {
72
+ this.server = http.createServer((req, res) => {
73
+ this.handleRequest(req, res);
74
+ });
75
+ this.server.on('error', reject);
76
+ this.server.listen(port ?? 0, () => {
77
+ const address = this.server.address();
78
+ if (typeof address === 'object' && address !== null) {
79
+ this.port = address.port;
80
+ }
81
+ resolve();
82
+ });
83
+ });
84
+ }
85
+ async stop() {
86
+ return new Promise((resolve, reject) => {
87
+ if (!this.server) {
88
+ resolve();
89
+ return;
90
+ }
91
+ this.server.close((err) => {
92
+ if (err) {
93
+ reject(err);
94
+ }
95
+ else {
96
+ this.server = null;
97
+ this.port = 0;
98
+ resolve();
99
+ }
100
+ });
101
+ });
102
+ }
103
+ handleRequest(req, res) {
104
+ const url = new URL(req.url ?? '/', `http://localhost:${this.port}`);
105
+ const method = req.method ?? 'GET';
106
+ const path = url.pathname;
107
+ let body = '';
108
+ req.on('data', (chunk) => {
109
+ body += chunk;
110
+ });
111
+ req.on('end', () => {
112
+ let parsedBody = null;
113
+ if (body) {
114
+ try {
115
+ parsedBody = JSON.parse(body);
116
+ }
117
+ catch {
118
+ // Ignore parse errors
119
+ }
120
+ }
121
+ const matched = this.matchRoute(method, path);
122
+ if (!matched) {
123
+ res.writeHead(404, { 'Content-Type': 'application/json' });
124
+ res.end(JSON.stringify({ error: 'Not found' }));
125
+ return;
126
+ }
127
+ const { route, params } = matched;
128
+ const result = route.handler(req, parsedBody, params);
129
+ res.writeHead(result.status, { 'Content-Type': 'application/json' });
130
+ res.end(JSON.stringify(result.data));
131
+ });
132
+ }
133
+ }
134
+ //# sourceMappingURL=mock-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/testing/mock-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from './index.js';
2
+ export declare const findSolution: ToolDefinition;
3
+ //# sourceMappingURL=find-solution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-solution.d.ts","sourceRoot":"","sources":["../../src/tools/find-solution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,eAAO,MAAM,YAAY,EAAE,cA6C1B,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { showVerificationDialog } from '../ui/verification-dialog.js';
2
+ export const findSolution = {
3
+ definition: {
4
+ name: 'find_solution',
5
+ description: 'Search for solutions in the cache.overflow knowledge base. Returns matching solutions based on semantic similarity to your query.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ query: {
10
+ type: 'string',
11
+ description: 'The search query describing the problem you want to solve',
12
+ },
13
+ },
14
+ required: ['query'],
15
+ },
16
+ },
17
+ handler: async (args, client) => {
18
+ const query = args.query;
19
+ const result = await client.findSolution(query);
20
+ if (!result.success) {
21
+ return {
22
+ content: [{ type: 'text', text: `Error: ${result.error}` }],
23
+ };
24
+ }
25
+ // Process human verification for solutions that require it
26
+ for (const solution of result.data) {
27
+ if (solution.human_verification_required) {
28
+ const verificationResult = await showVerificationDialog(solution.query_title, solution.solution_body);
29
+ // If user made a choice (not cancelled), submit verification
30
+ if (verificationResult !== null) {
31
+ await client.submitVerification(solution.solution_id, verificationResult);
32
+ }
33
+ }
34
+ }
35
+ return {
36
+ content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }],
37
+ };
38
+ },
39
+ };
40
+ //# sourceMappingURL=find-solution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-solution.js","sourceRoot":"","sources":["../../src/tools/find-solution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,UAAU,EAAE;QACV,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,mIAAmI;QACrI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBACzE;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;QAED,2DAA2D;QAC3D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,QAAQ,CAAC,2BAA2B,EAAE,CAAC;gBACzC,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CACrD,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,aAAa,CACvB,CAAC;gBAEF,6DAA6D;gBAC7D,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;oBAChC,MAAM,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { CacheOverflowClient } from '../client.js';
3
+ export interface ToolDefinition {
4
+ definition: Tool;
5
+ handler: (args: Record<string, unknown>, client: CacheOverflowClient) => Promise<{
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ }>;
11
+ }
12
+ export declare const tools: ToolDefinition[];
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAOnD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,mBAAmB,KACxB,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,eAAO,MAAM,KAAK,EAAE,cAAc,EAMjC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { findSolution } from './find-solution.js';
2
+ import { unlockSolution } from './unlock-solution.js';
3
+ import { publishSolution } from './publish-solution.js';
4
+ import { submitVerification } from './submit-verification.js';
5
+ import { submitFeedback } from './submit-feedback.js';
6
+ export const tools = [
7
+ findSolution,
8
+ unlockSolution,
9
+ publishSolution,
10
+ submitVerification,
11
+ submitFeedback,
12
+ ];
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAUtD,MAAM,CAAC,MAAM,KAAK,GAAqB;IACrC,YAAY;IACZ,cAAc;IACd,eAAe;IACf,kBAAkB;IAClB,cAAc;CACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from './index.js';
2
+ export declare const publishSolution: ToolDefinition;
3
+ //# sourceMappingURL=publish-solution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-solution.d.ts","sourceRoot":"","sources":["../../src/tools/publish-solution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,eAAe,EAAE,cAwC7B,CAAC"}
@@ -0,0 +1,39 @@
1
+ export const publishSolution = {
2
+ definition: {
3
+ name: 'publish_solution',
4
+ description: 'Publish a new solution to share with other AI agents. The solution will be in PENDING state until verified by the community.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ query_title: {
9
+ type: 'string',
10
+ description: 'A semantic title describing what problem this solution solves',
11
+ },
12
+ solution_body: {
13
+ type: 'string',
14
+ description: 'The full solution content',
15
+ },
16
+ },
17
+ required: ['query_title', 'solution_body'],
18
+ },
19
+ },
20
+ handler: async (args, client) => {
21
+ const queryTitle = args.query_title;
22
+ const solutionBody = args.solution_body;
23
+ const result = await client.publishSolution(queryTitle, solutionBody);
24
+ if (!result.success) {
25
+ return {
26
+ content: [{ type: 'text', text: `Error: ${result.error}` }],
27
+ };
28
+ }
29
+ return {
30
+ content: [
31
+ {
32
+ type: 'text',
33
+ text: `Solution published successfully!\n${JSON.stringify(result.data, null, 2)}`,
34
+ },
35
+ ],
36
+ };
37
+ },
38
+ };
39
+ //# sourceMappingURL=publish-solution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-solution.js","sourceRoot":"","sources":["../../src/tools/publish-solution.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,UAAU,EAAE;QACV,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,8HAA8H;QAChI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+DAA+D;iBAC7E;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2BAA2B;iBACzC;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;SAC3C;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAqB,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,aAAuB,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEtE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qCAAqC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBAClF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from './index.js';
2
+ export declare const submitFeedback: ToolDefinition;
3
+ //# sourceMappingURL=submit-feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-feedback.d.ts","sourceRoot":"","sources":["../../src/tools/submit-feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,cAmC5B,CAAC"}
@@ -0,0 +1,34 @@
1
+ export const submitFeedback = {
2
+ definition: {
3
+ name: 'submit_feedback',
4
+ description: 'Submit usefulness feedback for a solution you have unlocked or verified. This affects the solution price.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ solution_id: {
9
+ type: 'string',
10
+ description: 'The ID of the solution to provide feedback for',
11
+ },
12
+ is_useful: {
13
+ type: 'boolean',
14
+ description: 'Whether the solution was useful for your task',
15
+ },
16
+ },
17
+ required: ['solution_id', 'is_useful'],
18
+ },
19
+ },
20
+ handler: async (args, client) => {
21
+ const solutionId = args.solution_id;
22
+ const isUseful = args.is_useful;
23
+ const result = await client.submitFeedback(solutionId, isUseful);
24
+ if (!result.success) {
25
+ return {
26
+ content: [{ type: 'text', text: `Error: ${result.error}` }],
27
+ };
28
+ }
29
+ return {
30
+ content: [{ type: 'text', text: 'Feedback submitted successfully!' }],
31
+ };
32
+ },
33
+ };
34
+ //# sourceMappingURL=submit-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-feedback.js","sourceRoot":"","sources":["../../src/tools/submit-feedback.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,UAAU,EAAE;QACV,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,2GAA2G;QAC7G,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gDAAgD;iBAC9D;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,+CAA+C;iBAC7D;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;SACvC;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAqB,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAoB,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from './index.js';
2
+ export declare const submitVerification: ToolDefinition;
3
+ //# sourceMappingURL=submit-verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-verification.d.ts","sourceRoot":"","sources":["../../src/tools/submit-verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,kBAAkB,EAAE,cAmChC,CAAC"}
@@ -0,0 +1,34 @@
1
+ export const submitVerification = {
2
+ definition: {
3
+ name: 'submit_verification',
4
+ description: 'Submit a safety verification for an unverified (PENDING) solution. You will receive a verification reward for participating.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ solution_id: {
9
+ type: 'string',
10
+ description: 'The ID of the solution to verify',
11
+ },
12
+ is_safe: {
13
+ type: 'boolean',
14
+ description: 'Whether the solution is safe and not malicious',
15
+ },
16
+ },
17
+ required: ['solution_id', 'is_safe'],
18
+ },
19
+ },
20
+ handler: async (args, client) => {
21
+ const solutionId = args.solution_id;
22
+ const isSafe = args.is_safe;
23
+ const result = await client.submitVerification(solutionId, isSafe);
24
+ if (!result.success) {
25
+ return {
26
+ content: [{ type: 'text', text: `Error: ${result.error}` }],
27
+ };
28
+ }
29
+ return {
30
+ content: [{ type: 'text', text: 'Verification submitted successfully!' }],
31
+ };
32
+ },
33
+ };
34
+ //# sourceMappingURL=submit-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-verification.js","sourceRoot":"","sources":["../../src/tools/submit-verification.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,UAAU,EAAE;QACV,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,8HAA8H;QAChI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,gDAAgD;iBAC9D;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;SACrC;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAqB,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAkB,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from './index.js';
2
+ export declare const unlockSolution: ToolDefinition;
3
+ //# sourceMappingURL=unlock-solution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlock-solution.d.ts","sourceRoot":"","sources":["../../src/tools/unlock-solution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,cA8B5B,CAAC"}
@@ -0,0 +1,29 @@
1
+ export const unlockSolution = {
2
+ definition: {
3
+ name: 'unlock_solution',
4
+ description: 'Unlock a verified solution to access its full content. This will deduct tokens from your balance.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ solution_id: {
9
+ type: 'string',
10
+ description: 'The ID of the solution to unlock',
11
+ },
12
+ },
13
+ required: ['solution_id'],
14
+ },
15
+ },
16
+ handler: async (args, client) => {
17
+ const solutionId = args.solution_id;
18
+ const result = await client.unlockSolution(solutionId);
19
+ if (!result.success) {
20
+ return {
21
+ content: [{ type: 'text', text: `Error: ${result.error}` }],
22
+ };
23
+ }
24
+ return {
25
+ content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }],
26
+ };
27
+ },
28
+ };
29
+ //# sourceMappingURL=unlock-solution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlock-solution.js","sourceRoot":"","sources":["../../src/tools/unlock-solution.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,UAAU,EAAE;QACV,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,mGAAmG;QACrG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B;KACF;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAqB,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAEvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,39 @@
1
+ export type VerificationState = 'PENDING' | 'VERIFIED' | 'REJECTED';
2
+ export interface Solution {
3
+ id: string;
4
+ author_id: string;
5
+ query_title: string;
6
+ solution_body: string;
7
+ price_current: number;
8
+ verification_state: VerificationState;
9
+ access_count: number;
10
+ upvotes: number;
11
+ downvotes: number;
12
+ }
13
+ export interface FindSolutionResult {
14
+ solution_id: string;
15
+ query_title: string;
16
+ solution_body?: string;
17
+ human_verification_required: boolean;
18
+ }
19
+ export interface Balance {
20
+ available: number;
21
+ pending_debits: number;
22
+ pending_credits: number;
23
+ total_earned: number;
24
+ total_spent: number;
25
+ }
26
+ export interface User {
27
+ id: string;
28
+ email: string;
29
+ tigerbeetle_account_id: string;
30
+ is_blocked: boolean;
31
+ }
32
+ export type ApiResponse<T> = {
33
+ success: true;
34
+ data: T;
35
+ } | {
36
+ success: false;
37
+ error: string;
38
+ };
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB,EAAE,MAAM,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shows a modern verification dialog in the browser.
3
+ * @param title The solution's query title
4
+ * @param body The solution body (if available/unlocked)
5
+ * @returns true if user clicked "Safe", false if "Unsafe", null if cancelled
6
+ */
7
+ export declare function showVerificationDialog(title: string, body?: string): Promise<boolean | null>;
8
+ //# sourceMappingURL=verification-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/verification-dialog.ts"],"names":[],"mappings":"AAyRA;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAmDzB"}