@chaaskit/server 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 (189) hide show
  1. package/dist/api/admin.js +438 -0
  2. package/dist/api/admin.js.map +1 -0
  3. package/dist/api/agents.js +21 -0
  4. package/dist/api/agents.js.map +1 -0
  5. package/dist/api/api-keys.js +122 -0
  6. package/dist/api/api-keys.js.map +1 -0
  7. package/dist/api/auth.js +399 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/chat.js +900 -0
  10. package/dist/api/chat.js.map +1 -0
  11. package/dist/api/config.js +91 -0
  12. package/dist/api/config.js.map +1 -0
  13. package/dist/api/documents.js +237 -0
  14. package/dist/api/documents.js.map +1 -0
  15. package/dist/api/export.js +107 -0
  16. package/dist/api/export.js.map +1 -0
  17. package/dist/api/health.js +25 -0
  18. package/dist/api/health.js.map +1 -0
  19. package/dist/api/mcp-server.js +84 -0
  20. package/dist/api/mcp-server.js.map +1 -0
  21. package/dist/api/mcp.js +400 -0
  22. package/dist/api/mcp.js.map +1 -0
  23. package/dist/api/mentions.js +94 -0
  24. package/dist/api/mentions.js.map +1 -0
  25. package/dist/api/oauth.js +366 -0
  26. package/dist/api/oauth.js.map +1 -0
  27. package/dist/api/payments.js +473 -0
  28. package/dist/api/payments.js.map +1 -0
  29. package/dist/api/projects.js +301 -0
  30. package/dist/api/projects.js.map +1 -0
  31. package/dist/api/scheduled-prompts.js +617 -0
  32. package/dist/api/scheduled-prompts.js.map +1 -0
  33. package/dist/api/search.js +85 -0
  34. package/dist/api/search.js.map +1 -0
  35. package/dist/api/share.js +188 -0
  36. package/dist/api/share.js.map +1 -0
  37. package/dist/api/slack.js +468 -0
  38. package/dist/api/slack.js.map +1 -0
  39. package/dist/api/teams.js +693 -0
  40. package/dist/api/teams.js.map +1 -0
  41. package/dist/api/templates.js +134 -0
  42. package/dist/api/templates.js.map +1 -0
  43. package/dist/api/threads.js +323 -0
  44. package/dist/api/threads.js.map +1 -0
  45. package/dist/api/upload.js +57 -0
  46. package/dist/api/upload.js.map +1 -0
  47. package/dist/api/user.js +111 -0
  48. package/dist/api/user.js.map +1 -0
  49. package/dist/api/v1/openai.js +245 -0
  50. package/dist/api/v1/openai.js.map +1 -0
  51. package/dist/app.js +168 -0
  52. package/dist/app.js.map +1 -0
  53. package/dist/bin/cli.js +57 -0
  54. package/dist/bin/cli.js.map +1 -0
  55. package/dist/commands/db-sync.js +108 -0
  56. package/dist/commands/db-sync.js.map +1 -0
  57. package/dist/config/loader.js +374 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/documents/extractors.js +136 -0
  60. package/dist/documents/extractors.js.map +1 -0
  61. package/dist/extensions/glob.js +53 -0
  62. package/dist/extensions/glob.js.map +1 -0
  63. package/dist/extensions/loader.js +72 -0
  64. package/dist/extensions/loader.js.map +1 -0
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/loaders/index.js +75 -0
  68. package/dist/loaders/index.js.map +1 -0
  69. package/dist/mcp/client.js +551 -0
  70. package/dist/mcp/client.js.map +1 -0
  71. package/dist/mcp/server.js +335 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/middleware/apiKeyAuth.js +136 -0
  74. package/dist/middleware/apiKeyAuth.js.map +1 -0
  75. package/dist/middleware/auth.js +192 -0
  76. package/dist/middleware/auth.js.map +1 -0
  77. package/dist/middleware/errorHandler.js +41 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/mcpServerAuth.js +164 -0
  80. package/dist/middleware/mcpServerAuth.js.map +1 -0
  81. package/dist/middleware/requestLogger.js +9 -0
  82. package/dist/middleware/requestLogger.js.map +1 -0
  83. package/dist/middleware/team.js +132 -0
  84. package/dist/middleware/team.js.map +1 -0
  85. package/dist/oauth/server.js +410 -0
  86. package/dist/oauth/server.js.map +1 -0
  87. package/dist/queue/cli.js +93 -0
  88. package/dist/queue/cli.js.map +1 -0
  89. package/dist/queue/handlers/index.js +91 -0
  90. package/dist/queue/handlers/index.js.map +1 -0
  91. package/dist/queue/handlers/scheduled-prompt.js +270 -0
  92. package/dist/queue/handlers/scheduled-prompt.js.map +1 -0
  93. package/dist/queue/index.js +91 -0
  94. package/dist/queue/index.js.map +1 -0
  95. package/dist/queue/providers/memory.js +296 -0
  96. package/dist/queue/providers/memory.js.map +1 -0
  97. package/dist/queue/providers/sqs.js +275 -0
  98. package/dist/queue/providers/sqs.js.map +1 -0
  99. package/dist/queue/scheduler.js +355 -0
  100. package/dist/queue/scheduler.js.map +1 -0
  101. package/dist/queue/types.js +5 -0
  102. package/dist/queue/types.js.map +1 -0
  103. package/dist/queue/worker.js +230 -0
  104. package/dist/queue/worker.js.map +1 -0
  105. package/dist/registry/index.js +40 -0
  106. package/dist/registry/index.js.map +1 -0
  107. package/dist/server.js +207 -0
  108. package/dist/server.js.map +1 -0
  109. package/dist/services/agent.js +530 -0
  110. package/dist/services/agent.js.map +1 -0
  111. package/dist/services/agents.js +194 -0
  112. package/dist/services/agents.js.map +1 -0
  113. package/dist/services/documents.js +507 -0
  114. package/dist/services/documents.js.map +1 -0
  115. package/dist/services/email/index.js +91 -0
  116. package/dist/services/email/index.js.map +1 -0
  117. package/dist/services/email/providers/ses.js +97 -0
  118. package/dist/services/email/providers/ses.js.map +1 -0
  119. package/dist/services/email/templates.js +194 -0
  120. package/dist/services/email/templates.js.map +1 -0
  121. package/dist/services/email/types.js +5 -0
  122. package/dist/services/email/types.js.map +1 -0
  123. package/dist/services/encryption.js +69 -0
  124. package/dist/services/encryption.js.map +1 -0
  125. package/dist/services/oauth-discovery.js +226 -0
  126. package/dist/services/oauth-discovery.js.map +1 -0
  127. package/dist/services/pendingConfirmation.js +105 -0
  128. package/dist/services/pendingConfirmation.js.map +1 -0
  129. package/dist/services/scheduledPrompts.js +70 -0
  130. package/dist/services/scheduledPrompts.js.map +1 -0
  131. package/dist/services/slack/client.js +174 -0
  132. package/dist/services/slack/client.js.map +1 -0
  133. package/dist/services/slack/events.js +189 -0
  134. package/dist/services/slack/events.js.map +1 -0
  135. package/dist/services/slack/index.js +6 -0
  136. package/dist/services/slack/index.js.map +1 -0
  137. package/dist/services/slack/notifications.js +124 -0
  138. package/dist/services/slack/notifications.js.map +1 -0
  139. package/dist/services/slack/signature.js +74 -0
  140. package/dist/services/slack/signature.js.map +1 -0
  141. package/dist/services/slack/thread-context.js +191 -0
  142. package/dist/services/slack/thread-context.js.map +1 -0
  143. package/dist/services/toolConfirmation.js +55 -0
  144. package/dist/services/toolConfirmation.js.map +1 -0
  145. package/dist/services/usage.js +241 -0
  146. package/dist/services/usage.js.map +1 -0
  147. package/dist/ssr/build.js +90 -0
  148. package/dist/ssr/build.js.map +1 -0
  149. package/dist/ssr/components/SSRMessageList.js +120 -0
  150. package/dist/ssr/components/SSRMessageList.js.map +1 -0
  151. package/dist/ssr/entry.client.js +8 -0
  152. package/dist/ssr/entry.client.js.map +1 -0
  153. package/dist/ssr/entry.server.js +71 -0
  154. package/dist/ssr/entry.server.js.map +1 -0
  155. package/dist/ssr/handler.js +51 -0
  156. package/dist/ssr/handler.js.map +1 -0
  157. package/dist/ssr/root.js +184 -0
  158. package/dist/ssr/root.js.map +1 -0
  159. package/dist/ssr/routes/login.js +140 -0
  160. package/dist/ssr/routes/login.js.map +1 -0
  161. package/dist/ssr/routes/pricing.js +195 -0
  162. package/dist/ssr/routes/pricing.js.map +1 -0
  163. package/dist/ssr/routes/privacy.js +39 -0
  164. package/dist/ssr/routes/privacy.js.map +1 -0
  165. package/dist/ssr/routes/register.js +148 -0
  166. package/dist/ssr/routes/register.js.map +1 -0
  167. package/dist/ssr/routes/shared.$shareId.js +153 -0
  168. package/dist/ssr/routes/shared.$shareId.js.map +1 -0
  169. package/dist/ssr/routes/terms.js +39 -0
  170. package/dist/ssr/routes/terms.js.map +1 -0
  171. package/dist/storage/index.js +43 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/providers/database.js +38 -0
  174. package/dist/storage/providers/database.js.map +1 -0
  175. package/dist/storage/providers/filesystem.js +51 -0
  176. package/dist/storage/providers/filesystem.js.map +1 -0
  177. package/dist/storage/types.js +2 -0
  178. package/dist/storage/types.js.map +1 -0
  179. package/dist/tools/documents.js +336 -0
  180. package/dist/tools/documents.js.map +1 -0
  181. package/dist/tools/get-plan-usage.js +82 -0
  182. package/dist/tools/get-plan-usage.js.map +1 -0
  183. package/dist/tools/index.js +106 -0
  184. package/dist/tools/index.js.map +1 -0
  185. package/dist/tools/types.js +2 -0
  186. package/dist/tools/types.js.map +1 -0
  187. package/dist/tools/web-scrape.js +145 -0
  188. package/dist/tools/web-scrape.js.map +1 -0
  189. package/package.json +93 -0
@@ -0,0 +1,336 @@
1
+ import { documentService } from '../services/documents.js';
2
+ /**
3
+ * List documents available to the user
4
+ */
5
+ export const listDocumentsTool = {
6
+ name: 'list_documents',
7
+ description: 'List documents available in this conversation. Use this to see what documents can be referenced.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ query: {
12
+ type: 'string',
13
+ description: 'Optional search query to filter documents by name',
14
+ },
15
+ scope: {
16
+ type: 'string',
17
+ enum: ['all', 'my', 'team', 'project'],
18
+ description: 'Filter by scope: all (default), my (personal), team, or project',
19
+ default: 'all',
20
+ },
21
+ },
22
+ },
23
+ async execute(input, context) {
24
+ if (!context.userId) {
25
+ return {
26
+ content: [{ type: 'text', text: 'Authentication required to list documents' }],
27
+ isError: true,
28
+ };
29
+ }
30
+ const query = input.query;
31
+ const scopeInput = input.scope || 'all';
32
+ const scopes = scopeInput === 'all' ? undefined : [scopeInput];
33
+ const docs = await documentService.search(context.userId, {
34
+ query,
35
+ scopes,
36
+ limit: 50,
37
+ });
38
+ if (docs.length === 0) {
39
+ return {
40
+ content: [
41
+ {
42
+ type: 'text',
43
+ text: query
44
+ ? `No documents found matching "${query}"`
45
+ : 'No documents found. You can create documents on the Documents page.',
46
+ },
47
+ ],
48
+ };
49
+ }
50
+ const docList = docs
51
+ .map((doc) => `- ${doc.path} (${doc.charCount} chars, ${doc.mimeType})`)
52
+ .join('\n');
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'text',
57
+ text: `Found ${docs.length} document(s):\n\n${docList}`,
58
+ },
59
+ ],
60
+ structuredContent: { documents: docs },
61
+ };
62
+ },
63
+ };
64
+ /**
65
+ * Read content from a document
66
+ */
67
+ export const readDocumentTool = {
68
+ name: 'read_document',
69
+ description: 'Read content from a document. Supports pagination for large documents. Use path format like @my/doc-name, @team/slug/name, or @project/slug/name.',
70
+ inputSchema: {
71
+ type: 'object',
72
+ properties: {
73
+ path: {
74
+ type: 'string',
75
+ description: 'Document path (e.g., @my/notes, @team/engineering/guidelines)',
76
+ },
77
+ offset: {
78
+ type: 'number',
79
+ description: 'Start line (0-indexed, default: 0)',
80
+ },
81
+ limit: {
82
+ type: 'number',
83
+ description: 'Maximum lines to return (default: 100)',
84
+ },
85
+ },
86
+ required: ['path'],
87
+ },
88
+ async execute(input, context) {
89
+ if (!context.userId) {
90
+ return {
91
+ content: [{ type: 'text', text: 'Authentication required to read documents' }],
92
+ isError: true,
93
+ };
94
+ }
95
+ const path = input.path;
96
+ const offset = input.offset || 0;
97
+ const limit = input.limit || 100;
98
+ const doc = await documentService.resolvePath(path, context.userId);
99
+ if (!doc) {
100
+ return {
101
+ content: [{ type: 'text', text: `Document not found: ${path}` }],
102
+ isError: true,
103
+ };
104
+ }
105
+ const result = await documentService.getContent(doc.id, context.userId, {
106
+ offset,
107
+ limit,
108
+ });
109
+ if (!result) {
110
+ return {
111
+ content: [{ type: 'text', text: `Could not read document: ${path}` }],
112
+ isError: true,
113
+ };
114
+ }
115
+ // Add line numbers
116
+ const lines = result.content.split('\n');
117
+ const numberedContent = lines
118
+ .map((line, i) => `${(offset + i + 1).toString().padStart(4, ' ')} | ${line}`)
119
+ .join('\n');
120
+ let header = `Document: ${path}\n`;
121
+ header += `Lines ${offset + 1}-${offset + lines.length} of ${result.totalLines}`;
122
+ if (result.truncated) {
123
+ header += ` (more content available)`;
124
+ }
125
+ header += '\n\n';
126
+ return {
127
+ content: [{ type: 'text', text: header + numberedContent }],
128
+ structuredContent: {
129
+ path,
130
+ offset,
131
+ linesReturned: lines.length,
132
+ totalLines: result.totalLines,
133
+ truncated: result.truncated,
134
+ },
135
+ };
136
+ },
137
+ };
138
+ /**
139
+ * Search for text within a document
140
+ */
141
+ export const searchInDocumentTool = {
142
+ name: 'search_in_document',
143
+ description: 'Search for text within a document. Returns matching lines with surrounding context.',
144
+ inputSchema: {
145
+ type: 'object',
146
+ properties: {
147
+ path: {
148
+ type: 'string',
149
+ description: 'Document path (e.g., @my/notes)',
150
+ },
151
+ query: {
152
+ type: 'string',
153
+ description: 'Text to search for',
154
+ },
155
+ context_lines: {
156
+ type: 'number',
157
+ description: 'Number of lines to show before and after each match (default: 3)',
158
+ },
159
+ },
160
+ required: ['path', 'query'],
161
+ },
162
+ async execute(input, context) {
163
+ if (!context.userId) {
164
+ return {
165
+ content: [{ type: 'text', text: 'Authentication required to search documents' }],
166
+ isError: true,
167
+ };
168
+ }
169
+ const path = input.path;
170
+ const query = input.query;
171
+ const contextLines = input.context_lines || 3;
172
+ const doc = await documentService.resolvePath(path, context.userId);
173
+ if (!doc) {
174
+ return {
175
+ content: [{ type: 'text', text: `Document not found: ${path}` }],
176
+ isError: true,
177
+ };
178
+ }
179
+ const result = await documentService.getContent(doc.id, context.userId);
180
+ if (!result) {
181
+ return {
182
+ content: [{ type: 'text', text: `Could not read document: ${path}` }],
183
+ isError: true,
184
+ };
185
+ }
186
+ const lines = result.content.split('\n');
187
+ const lowerQuery = query.toLowerCase();
188
+ // Find matching line indices
189
+ const matches = [];
190
+ for (let i = 0; i < lines.length; i++) {
191
+ if (lines[i].toLowerCase().includes(lowerQuery)) {
192
+ matches.push(i);
193
+ }
194
+ }
195
+ if (matches.length === 0) {
196
+ return {
197
+ content: [{ type: 'text', text: `No matches found for "${query}" in ${path}` }],
198
+ };
199
+ }
200
+ // Build output with context
201
+ const outputParts = [];
202
+ let lastEndLine = -1;
203
+ for (const matchLine of matches) {
204
+ const startLine = Math.max(0, matchLine - contextLines);
205
+ const endLine = Math.min(lines.length - 1, matchLine + contextLines);
206
+ // Add separator if there's a gap
207
+ if (lastEndLine !== -1 && startLine > lastEndLine + 1) {
208
+ outputParts.push('...');
209
+ }
210
+ // Add context lines (avoid duplicates)
211
+ const actualStart = Math.max(startLine, lastEndLine + 1);
212
+ for (let i = actualStart; i <= endLine; i++) {
213
+ const prefix = i === matchLine ? '>>> ' : ' ';
214
+ outputParts.push(`${(i + 1).toString().padStart(4, ' ')} ${prefix}${lines[i]}`);
215
+ }
216
+ lastEndLine = endLine;
217
+ }
218
+ const header = `Found ${matches.length} match(es) for "${query}" in ${path}:\n\n`;
219
+ return {
220
+ content: [{ type: 'text', text: header + outputParts.join('\n') }],
221
+ structuredContent: {
222
+ path,
223
+ query,
224
+ matchCount: matches.length,
225
+ matchLines: matches.map((i) => i + 1),
226
+ },
227
+ };
228
+ },
229
+ };
230
+ /**
231
+ * Save content as a new document
232
+ */
233
+ export const saveDocumentTool = {
234
+ name: 'save_document',
235
+ description: 'Save content as a new document. Use when the user asks to save generated content, notes, or summaries.',
236
+ inputSchema: {
237
+ type: 'object',
238
+ properties: {
239
+ name: {
240
+ type: 'string',
241
+ description: 'Document name (e.g., "meeting-notes", "api-summary")',
242
+ },
243
+ content: {
244
+ type: 'string',
245
+ description: 'Content to save',
246
+ },
247
+ scope: {
248
+ type: 'string',
249
+ enum: ['my', 'team', 'project'],
250
+ description: 'Where to save: my (personal, default), team, or project',
251
+ default: 'my',
252
+ },
253
+ scopeId: {
254
+ type: 'string',
255
+ description: 'Team or project ID (required if scope is team/project)',
256
+ },
257
+ },
258
+ required: ['name', 'content'],
259
+ },
260
+ async execute(input, context) {
261
+ if (!context.userId) {
262
+ return {
263
+ content: [{ type: 'text', text: 'Authentication required to save documents' }],
264
+ isError: true,
265
+ };
266
+ }
267
+ const name = input.name;
268
+ const content = input.content;
269
+ const scope = input.scope || 'my';
270
+ const scopeId = input.scopeId;
271
+ // Validate scope requirements
272
+ if ((scope === 'team' || scope === 'project') && !scopeId) {
273
+ return {
274
+ content: [
275
+ {
276
+ type: 'text',
277
+ text: `A ${scope} ID is required when saving to ${scope} scope. Please specify scopeId.`,
278
+ },
279
+ ],
280
+ isError: true,
281
+ };
282
+ }
283
+ try {
284
+ const doc = await documentService.create({
285
+ name,
286
+ content,
287
+ mimeType: 'text/plain',
288
+ teamId: scope === 'team' ? scopeId : undefined,
289
+ projectId: scope === 'project' ? scopeId : undefined,
290
+ }, context.userId);
291
+ return {
292
+ content: [
293
+ {
294
+ type: 'text',
295
+ text: `Document saved successfully!\n\nPath: ${doc.path}\nSize: ${doc.charCount} characters\n\nYou can reference this document in future messages using ${doc.path}`,
296
+ },
297
+ ],
298
+ structuredContent: {
299
+ success: true,
300
+ path: doc.path,
301
+ id: doc.id,
302
+ charCount: doc.charCount,
303
+ },
304
+ };
305
+ }
306
+ catch (error) {
307
+ const message = error instanceof Error ? error.message : 'Unknown error';
308
+ // Check for unique constraint violation
309
+ if (message.includes('Unique constraint')) {
310
+ return {
311
+ content: [
312
+ {
313
+ type: 'text',
314
+ text: `A document named "${name}" already exists in this scope. Please choose a different name.`,
315
+ },
316
+ ],
317
+ isError: true,
318
+ };
319
+ }
320
+ return {
321
+ content: [{ type: 'text', text: `Failed to save document: ${message}` }],
322
+ isError: true,
323
+ };
324
+ }
325
+ },
326
+ };
327
+ /**
328
+ * All document-related tools
329
+ */
330
+ export const documentTools = [
331
+ listDocumentsTool,
332
+ readDocumentTool,
333
+ searchInDocumentTool,
334
+ saveDocumentTool,
335
+ ];
336
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,kGAAkG;IACpG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC;gBACtC,WAAW,EAAE,iEAAiE;gBAC9E,OAAO,EAAE,KAAK;aACf;SACF;KACF;IACD,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;QAChE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAA2B,CAAC;QAChD,MAAM,UAAU,GAAI,KAAK,CAAC,KAAgB,IAAI,KAAK,CAAC;QAEpD,MAAM,MAAM,GACV,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAuC,CAAC,CAAC;QAE/E,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;YACxD,KAAK;YACL,MAAM;YACN,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK;4BACT,CAAC,CAAC,gCAAgC,KAAK,GAAG;4BAC1C,CAAC,CAAC,qEAAqE;qBAC1E;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI;aACjB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,SAAS,WAAW,GAAG,CAAC,QAAQ,GAAG,CAAC;aACvE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,IAAI,CAAC,MAAM,oBAAoB,OAAO,EAAE;iBACxD;aACF;YACD,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;SACvC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,mJAAmJ;IACrJ,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+DAA+D;aAC7E;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wCAAwC;aACtD;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;IACD,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;QAChE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAc,CAAC;QAClC,MAAM,MAAM,GAAI,KAAK,CAAC,MAAiB,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAI,KAAK,CAAC,KAAgB,IAAI,GAAG,CAAC;QAE7C,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,IAAI,EAAE,EAAE,CAAC;gBAChE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE;YACtE,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,IAAI,EAAE,EAAE,CAAC;gBACrE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,mBAAmB;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,eAAe,GAAG,KAAK;aAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;aAC7E,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,IAAI,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC;QACnC,MAAM,IAAI,SAAS,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;QACjF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,2BAA2B,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,MAAM,CAAC;QAEjB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;YAC3D,iBAAiB,EAAE;gBACjB,IAAI;gBACJ,MAAM;gBACN,aAAa,EAAE,KAAK,CAAC,MAAM;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC9C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,qFAAqF;IACvF,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oBAAoB;aAClC;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kEAAkE;aAChF;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;KAC5B;IACD,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;QAChE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAC;gBAChF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAc,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,CAAC;QACpC,MAAM,YAAY,GAAI,KAAK,CAAC,aAAwB,IAAI,CAAC,CAAC;QAE1D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,IAAI,EAAE,EAAE,CAAC;gBAChE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,IAAI,EAAE,EAAE,CAAC;gBACrE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,6BAA6B;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,KAAK,QAAQ,IAAI,EAAE,EAAE,CAAC;aAChF,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;QAErB,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC;YAErE,iCAAiC;YACjC,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBACtD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YAED,uCAAuC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBACjD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClF,CAAC;YAED,WAAW,GAAG,OAAO,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,OAAO,CAAC,MAAM,mBAAmB,KAAK,QAAQ,IAAI,OAAO,CAAC;QAElF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,iBAAiB,EAAE;gBACjB,IAAI;gBACJ,KAAK;gBACL,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aACtC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,wGAAwG;IAC1G,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sDAAsD;aACpE;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iBAAiB;aAC/B;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC;gBAC/B,WAAW,EAAE,yDAAyD;gBACtE,OAAO,EAAE,IAAI;aACd;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wDAAwD;aACtE;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;KAC9B;IACD,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;QAChE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;gBAC9E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAc,CAAC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAC;QACxC,MAAM,KAAK,GAAI,KAAK,CAAC,KAAgB,IAAI,IAAI,CAAC;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAA6B,CAAC;QAEpD,8BAA8B;QAC9B,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,KAAK,kCAAkC,KAAK,iCAAiC;qBACzF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,MAAM,CACtC;gBACE,IAAI;gBACJ,OAAO;gBACP,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBAC9C,SAAS,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aACrD,EACD,OAAO,CAAC,MAAM,CACf,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,yCAAyC,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,SAAS,2EAA2E,GAAG,CAAC,IAAI,EAAE;qBACrK;iBACF;gBACD,iBAAiB,EAAE;oBACjB,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,SAAS,EAAE,GAAG,CAAC,SAAS;iBACzB;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAEzE,wCAAwC;YACxC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,qBAAqB,IAAI,iEAAiE;yBACjG;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,OAAO,EAAE,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,gBAAgB;CACjB,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { getConfig } from '../config/loader.js';
2
+ import { getBillingContext } from '../services/usage.js';
3
+ export const getPlanUsageTool = {
4
+ name: 'get-plan-usage',
5
+ description: 'Get the current user\'s plan information and usage statistics including messages used, message limits, and available credits.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {},
9
+ required: [],
10
+ },
11
+ _meta: {
12
+ 'ui/templateFile': 'get-plan-usage.html',
13
+ },
14
+ async execute(input, context) {
15
+ const config = getConfig();
16
+ // If payments not enabled, return simple message
17
+ if (!config.payments.enabled) {
18
+ return {
19
+ content: [{ type: 'text', text: 'Payments are not enabled. Usage tracking is disabled.' }],
20
+ structuredContent: {
21
+ planName: 'Free',
22
+ billingContext: 'personal',
23
+ messagesUsed: 0,
24
+ messageLimit: null,
25
+ credits: null,
26
+ periodEnd: null,
27
+ },
28
+ };
29
+ }
30
+ // Must have a user context
31
+ if (!context.userId) {
32
+ return {
33
+ content: [{ type: 'text', text: 'Unable to retrieve plan information: User not authenticated.' }],
34
+ isError: true,
35
+ };
36
+ }
37
+ // Get billing context (could be personal or team-based)
38
+ const billingContext = await getBillingContext(context.userId);
39
+ if (!billingContext) {
40
+ return {
41
+ content: [{ type: 'text', text: 'Unable to retrieve billing information.' }],
42
+ isError: true,
43
+ };
44
+ }
45
+ // Get plan config to get the name
46
+ const planConfig = config.payments.plans.find((p) => p.id === billingContext.plan);
47
+ const planName = planConfig?.name || billingContext.plan;
48
+ // Calculate period end (next month start)
49
+ const now = new Date();
50
+ const periodEnd = new Date(now.getFullYear(), now.getMonth() + 1, 1);
51
+ // Build text summary
52
+ const lines = [
53
+ `Plan: ${planName}`,
54
+ `Messages used this period: ${billingContext.messagesThisMonth}`,
55
+ ];
56
+ if (billingContext.monthlyLimit === -1) {
57
+ lines.push('Message limit: Unlimited');
58
+ }
59
+ else {
60
+ lines.push(`Message limit: ${billingContext.monthlyLimit}`);
61
+ const remaining = Math.max(0, billingContext.monthlyLimit - billingContext.messagesThisMonth);
62
+ lines.push(`Messages remaining: ${remaining}`);
63
+ }
64
+ if (billingContext.credits !== undefined && billingContext.credits !== null) {
65
+ lines.push(`Available credits: ${billingContext.credits}`);
66
+ }
67
+ lines.push(`Period resets: ${periodEnd.toLocaleDateString()}`);
68
+ return {
69
+ content: [{ type: 'text', text: lines.join('\n') }],
70
+ structuredContent: {
71
+ planName,
72
+ planId: billingContext.plan,
73
+ billingContext: billingContext.type,
74
+ messagesUsed: billingContext.messagesThisMonth,
75
+ messageLimit: billingContext.monthlyLimit === -1 ? null : billingContext.monthlyLimit,
76
+ credits: billingContext.credits,
77
+ periodEnd: periodEnd.toISOString(),
78
+ },
79
+ };
80
+ },
81
+ };
82
+ //# sourceMappingURL=get-plan-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-plan-usage.js","sourceRoot":"","sources":["../../src/tools/get-plan-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join } from 'path';
4
+ import { webScrapeTool } from './web-scrape.js';
5
+ import { getPlanUsageTool } from './get-plan-usage.js';
6
+ import { documentTools } from './documents.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ /**
10
+ * Registry of all available native tools
11
+ */
12
+ const nativeToolRegistry = new Map();
13
+ // Register built-in native tools
14
+ nativeToolRegistry.set('web-scrape', webScrapeTool);
15
+ nativeToolRegistry.set('get-plan-usage', getPlanUsageTool);
16
+ // Register document tools
17
+ for (const tool of documentTools) {
18
+ nativeToolRegistry.set(tool.name, tool);
19
+ }
20
+ /**
21
+ * Get all registered native tools
22
+ */
23
+ export function getAllNativeTools() {
24
+ return Array.from(nativeToolRegistry.values());
25
+ }
26
+ /**
27
+ * Get a native tool by name
28
+ */
29
+ export function getNativeTool(name) {
30
+ return nativeToolRegistry.get(name);
31
+ }
32
+ /**
33
+ * Get native tools formatted for agent consumption (matching MCP tool format)
34
+ */
35
+ export function getNativeToolsForAgent() {
36
+ return getAllNativeTools().map((tool) => ({
37
+ name: tool.name,
38
+ description: tool.description,
39
+ inputSchema: tool.inputSchema,
40
+ serverId: 'native',
41
+ _meta: tool._meta,
42
+ }));
43
+ }
44
+ /**
45
+ * Resolve the template for a native tool (inline or file-based)
46
+ */
47
+ export async function resolveNativeToolTemplate(toolName) {
48
+ const tool = getNativeTool(toolName);
49
+ if (!tool?._meta)
50
+ return null;
51
+ // Check for inline template
52
+ if (tool._meta['ui/template']) {
53
+ return {
54
+ text: tool._meta['ui/template'],
55
+ mimeType: 'text/html',
56
+ };
57
+ }
58
+ // Check for file-based template
59
+ if (tool._meta['ui/templateFile']) {
60
+ const templatePath = join(__dirname, 'templates', tool._meta['ui/templateFile']);
61
+ try {
62
+ const text = await readFile(templatePath, 'utf-8');
63
+ return { text, mimeType: 'text/html' };
64
+ }
65
+ catch (error) {
66
+ console.error(`[NativeTool] Failed to read template ${templatePath}:`, error);
67
+ return null;
68
+ }
69
+ }
70
+ return null;
71
+ }
72
+ /**
73
+ * Execute a native tool by name
74
+ */
75
+ export async function executeNativeTool(name, input, context) {
76
+ const tool = getNativeTool(name);
77
+ if (!tool) {
78
+ return {
79
+ content: [{ type: 'text', text: `Unknown native tool: ${name}` }],
80
+ isError: true,
81
+ };
82
+ }
83
+ try {
84
+ return await tool.execute(input, context);
85
+ }
86
+ catch (error) {
87
+ const message = error instanceof Error ? error.message : 'Unknown error';
88
+ return {
89
+ content: [{ type: 'text', text: `Tool execution failed: ${message}` }],
90
+ isError: true,
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * Register a custom native tool
96
+ */
97
+ export function registerNativeTool(tool) {
98
+ nativeToolRegistry.set(tool.name, tool);
99
+ }
100
+ /**
101
+ * Check if a tool name is a native tool
102
+ */
103
+ export function isNativeTool(serverId) {
104
+ return serverId === 'native';
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAItC;;GAEG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEzD,iCAAiC;AACjC,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACpD,kBAAkB,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AAE3D,0BAA0B;AAC1B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;IACjC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,QAAiB;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,QAAgB;IAEhB,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAE9B,4BAA4B;IAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAW;YACzC,QAAQ,EAAE,WAAW;SACtB,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAW,CAAC,CAAC;QAC3F,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,KAA8B,EAC9B,OAAoB;IAEpB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,IAAI,EAAE,EAAE,CAAC;YACjE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,OAAO,EAAE,EAAE,CAAC;YACtE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,QAAQ,KAAK,QAAQ,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}