@elliotding/ai-agent-mcp 0.1.26 → 0.1.28

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 (186) hide show
  1. package/README.md +330 -30
  2. package/dist/api/cached-client.d.ts +48 -0
  3. package/dist/api/cached-client.d.ts.map +1 -0
  4. package/dist/api/cached-client.js +126 -0
  5. package/dist/api/cached-client.js.map +1 -0
  6. package/dist/api/client.d.ts +295 -0
  7. package/dist/api/client.d.ts.map +1 -0
  8. package/dist/api/client.js +385 -0
  9. package/dist/api/client.js.map +1 -0
  10. package/dist/auth/index.d.ts +8 -0
  11. package/dist/auth/index.d.ts.map +1 -0
  12. package/dist/auth/index.js +26 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/middleware.d.ts +36 -0
  15. package/dist/auth/middleware.d.ts.map +1 -0
  16. package/dist/auth/middleware.js +194 -0
  17. package/dist/auth/middleware.js.map +1 -0
  18. package/dist/auth/permissions.d.ts +60 -0
  19. package/dist/auth/permissions.d.ts.map +1 -0
  20. package/dist/auth/permissions.js +262 -0
  21. package/dist/auth/permissions.js.map +1 -0
  22. package/dist/auth/token-validator.d.ts +52 -0
  23. package/dist/auth/token-validator.d.ts.map +1 -0
  24. package/dist/auth/token-validator.js +215 -0
  25. package/dist/auth/token-validator.js.map +1 -0
  26. package/dist/cache/cache-manager.d.ts +49 -0
  27. package/dist/cache/cache-manager.d.ts.map +1 -0
  28. package/dist/cache/cache-manager.js +191 -0
  29. package/dist/cache/cache-manager.js.map +1 -0
  30. package/dist/cache/index.d.ts +6 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +12 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cache/redis-client.d.ts +45 -0
  35. package/dist/cache/redis-client.d.ts.map +1 -0
  36. package/dist/cache/redis-client.js +210 -0
  37. package/dist/cache/redis-client.js.map +1 -0
  38. package/dist/config/constants.d.ts +28 -0
  39. package/dist/config/constants.d.ts.map +1 -0
  40. package/dist/config/constants.js +31 -0
  41. package/dist/config/constants.js.map +1 -0
  42. package/dist/config/index.d.ts +71 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +190 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/filesystem/manager.d.ts +45 -0
  47. package/dist/filesystem/manager.d.ts.map +1 -0
  48. package/dist/filesystem/manager.js +246 -0
  49. package/dist/filesystem/manager.js.map +1 -0
  50. package/dist/git/multi-source-manager.d.ts +105 -0
  51. package/dist/git/multi-source-manager.d.ts.map +1 -0
  52. package/dist/git/multi-source-manager.js +677 -0
  53. package/dist/git/multi-source-manager.js.map +1 -0
  54. package/dist/git/operations.d.ts +27 -0
  55. package/dist/git/operations.d.ts.map +1 -0
  56. package/dist/git/operations.js +83 -0
  57. package/dist/git/operations.js.map +1 -0
  58. package/dist/index.d.ts +6 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +122 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/monitoring/health.d.ts +35 -0
  63. package/dist/monitoring/health.d.ts.map +1 -0
  64. package/dist/monitoring/health.js +105 -0
  65. package/dist/monitoring/health.js.map +1 -0
  66. package/dist/prompts/cache.d.ts +69 -0
  67. package/dist/prompts/cache.d.ts.map +1 -0
  68. package/dist/prompts/cache.js +163 -0
  69. package/dist/prompts/cache.js.map +1 -0
  70. package/dist/prompts/generator.d.ts +49 -0
  71. package/dist/prompts/generator.d.ts.map +1 -0
  72. package/dist/prompts/generator.js +160 -0
  73. package/dist/prompts/generator.js.map +1 -0
  74. package/dist/prompts/index.d.ts +13 -0
  75. package/dist/prompts/index.d.ts.map +1 -0
  76. package/dist/prompts/index.js +24 -0
  77. package/dist/prompts/index.js.map +1 -0
  78. package/dist/prompts/manager.d.ts +213 -0
  79. package/dist/prompts/manager.d.ts.map +1 -0
  80. package/dist/prompts/manager.js +587 -0
  81. package/dist/prompts/manager.js.map +1 -0
  82. package/dist/resources/index.d.ts +6 -0
  83. package/dist/resources/index.d.ts.map +1 -0
  84. package/dist/resources/index.js +10 -0
  85. package/dist/resources/index.js.map +1 -0
  86. package/dist/resources/loader.d.ts +88 -0
  87. package/dist/resources/loader.d.ts.map +1 -0
  88. package/dist/resources/loader.js +492 -0
  89. package/dist/resources/loader.js.map +1 -0
  90. package/dist/server/http.d.ts +57 -0
  91. package/dist/server/http.d.ts.map +1 -0
  92. package/dist/server/http.js +435 -0
  93. package/dist/server/http.js.map +1 -0
  94. package/dist/server.d.ts +13 -0
  95. package/dist/server.d.ts.map +1 -0
  96. package/dist/server.js +201 -0
  97. package/dist/server.js.map +1 -0
  98. package/dist/session/manager.d.ts +91 -0
  99. package/dist/session/manager.d.ts.map +1 -0
  100. package/dist/session/manager.js +251 -0
  101. package/dist/session/manager.js.map +1 -0
  102. package/dist/telemetry/index.d.ts +3 -0
  103. package/dist/telemetry/index.d.ts.map +1 -0
  104. package/dist/telemetry/index.js +7 -0
  105. package/dist/telemetry/index.js.map +1 -0
  106. package/dist/telemetry/manager.d.ts +151 -0
  107. package/dist/telemetry/manager.d.ts.map +1 -0
  108. package/dist/telemetry/manager.js +367 -0
  109. package/dist/telemetry/manager.js.map +1 -0
  110. package/dist/tools/index.d.ts +13 -0
  111. package/dist/tools/index.d.ts.map +1 -0
  112. package/dist/tools/index.js +29 -0
  113. package/dist/tools/index.js.map +1 -0
  114. package/dist/tools/manage-subscription.d.ts +47 -0
  115. package/dist/tools/manage-subscription.d.ts.map +1 -0
  116. package/dist/tools/manage-subscription.js +317 -0
  117. package/dist/tools/manage-subscription.js.map +1 -0
  118. package/dist/tools/registry.d.ts +40 -0
  119. package/dist/tools/registry.d.ts.map +1 -0
  120. package/dist/tools/registry.js +85 -0
  121. package/dist/tools/registry.js.map +1 -0
  122. package/dist/tools/resolve-prompt-content.d.ts +35 -0
  123. package/dist/tools/resolve-prompt-content.d.ts.map +1 -0
  124. package/dist/tools/resolve-prompt-content.js +99 -0
  125. package/dist/tools/resolve-prompt-content.js.map +1 -0
  126. package/dist/tools/search-resources.d.ts +35 -0
  127. package/dist/tools/search-resources.d.ts.map +1 -0
  128. package/dist/tools/search-resources.js +159 -0
  129. package/dist/tools/search-resources.js.map +1 -0
  130. package/dist/tools/sync-resources.d.ts +54 -0
  131. package/dist/tools/sync-resources.d.ts.map +1 -0
  132. package/dist/tools/sync-resources.js +793 -0
  133. package/dist/tools/sync-resources.js.map +1 -0
  134. package/dist/tools/track-usage.d.ts +63 -0
  135. package/dist/tools/track-usage.d.ts.map +1 -0
  136. package/dist/tools/track-usage.js +90 -0
  137. package/dist/tools/track-usage.js.map +1 -0
  138. package/dist/tools/uninstall-resource.d.ts +30 -0
  139. package/dist/tools/uninstall-resource.d.ts.map +1 -0
  140. package/dist/tools/uninstall-resource.js +186 -0
  141. package/dist/tools/uninstall-resource.js.map +1 -0
  142. package/dist/tools/upload-resource.d.ts +81 -0
  143. package/dist/tools/upload-resource.d.ts.map +1 -0
  144. package/dist/tools/upload-resource.js +393 -0
  145. package/dist/tools/upload-resource.js.map +1 -0
  146. package/dist/transport/sse.d.ts +29 -0
  147. package/dist/transport/sse.d.ts.map +1 -0
  148. package/dist/transport/sse.js +271 -0
  149. package/dist/transport/sse.js.map +1 -0
  150. package/dist/types/errors.d.ts +60 -0
  151. package/dist/types/errors.d.ts.map +1 -0
  152. package/dist/types/errors.js +112 -0
  153. package/dist/types/errors.js.map +1 -0
  154. package/dist/types/index.d.ts +7 -0
  155. package/dist/types/index.d.ts.map +1 -0
  156. package/dist/types/index.js +23 -0
  157. package/dist/types/index.js.map +1 -0
  158. package/dist/types/mcp.d.ts +50 -0
  159. package/dist/types/mcp.d.ts.map +1 -0
  160. package/dist/types/mcp.js +6 -0
  161. package/dist/types/mcp.js.map +1 -0
  162. package/dist/types/resources.d.ts +109 -0
  163. package/dist/types/resources.d.ts.map +1 -0
  164. package/dist/types/resources.js +7 -0
  165. package/dist/types/resources.js.map +1 -0
  166. package/dist/types/tools.d.ts +274 -0
  167. package/dist/types/tools.d.ts.map +1 -0
  168. package/dist/types/tools.js +6 -0
  169. package/dist/types/tools.js.map +1 -0
  170. package/dist/utils/cursor-paths.d.ts +84 -0
  171. package/dist/utils/cursor-paths.d.ts.map +1 -0
  172. package/dist/utils/cursor-paths.js +166 -0
  173. package/dist/utils/cursor-paths.js.map +1 -0
  174. package/dist/utils/log-cleaner.d.ts +18 -0
  175. package/dist/utils/log-cleaner.d.ts.map +1 -0
  176. package/dist/utils/log-cleaner.js +112 -0
  177. package/dist/utils/log-cleaner.js.map +1 -0
  178. package/dist/utils/logger.d.ts +59 -0
  179. package/dist/utils/logger.d.ts.map +1 -0
  180. package/dist/utils/logger.js +292 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/utils/validation.d.ts +58 -0
  183. package/dist/utils/validation.d.ts.map +1 -0
  184. package/dist/utils/validation.js +214 -0
  185. package/dist/utils/validation.js.map +1 -0
  186. package/package.json +1 -1
@@ -0,0 +1,393 @@
1
+ "use strict";
2
+ /**
3
+ * upload_resource Tool
4
+ *
5
+ * Uploads resource files to a CSP source repository via the two-step API:
6
+ * Step 1: POST /csp/api/resources/upload → returns upload_id (server-side staging)
7
+ * Step 2: POST /csp/api/resources/finalize → triggers Git commit, returns permanent resource_id
8
+ *
9
+ * The user selects files from anywhere on their local machine. The AI reads the file
10
+ * content and passes it directly in files[]. The MCP server forwards everything to the
11
+ * CSP API — no local path resolution or server-side filesystem access is needed.
12
+ *
13
+ * target_source is passed through to the CSP API as-is; the CSP server decides
14
+ * which Git repo to commit to based on that value.
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.uploadResourceTool = void 0;
51
+ exports.uploadResource = uploadResource;
52
+ const path = __importStar(require("path"));
53
+ const logger_1 = require("../utils/logger");
54
+ const client_1 = require("../api/client");
55
+ const resources_1 = require("../resources");
56
+ const errors_1 = require("../types/errors");
57
+ const index_js_1 = require("../prompts/index.js");
58
+ /** Extract the `description` field from YAML frontmatter (--- ... ---) in Markdown content. */
59
+ function extractFrontmatterDescription(content) {
60
+ if (!content.startsWith('---'))
61
+ return undefined;
62
+ const end = content.indexOf('\n---', 3);
63
+ if (end === -1)
64
+ return undefined;
65
+ const frontmatter = content.slice(3, end);
66
+ for (const line of frontmatter.split('\n')) {
67
+ const match = /^description:\s*(.+)$/.exec(line.trim());
68
+ if (match)
69
+ return match[1].trim().replace(/^['"]|['"]$/g, '');
70
+ }
71
+ return undefined;
72
+ }
73
+ /**
74
+ * Infer the resource type from the uploaded file list ONLY when the user has
75
+ * not explicitly stated a type. If the user declared a type, that always wins.
76
+ *
77
+ * Auto-detection rules (in priority order, applied only when declaredType is absent):
78
+ * 1. Any file named "mcp-config.json" → mcp
79
+ * 2. Any file named "SKILL.md" → skill
80
+ * 3. Single file ending with ".mdc" → rule
81
+ * 4. Single file ending with ".md" → command
82
+ * 5. Cannot determine → throw validation error
83
+ */
84
+ function inferResourceType(declaredType, files) {
85
+ // User explicitly specified the type — honour it unconditionally.
86
+ if (declaredType)
87
+ return declaredType;
88
+ const names = files.map((f) => path.basename(f.path).toLowerCase());
89
+ if (names.includes('mcp-config.json'))
90
+ return 'mcp';
91
+ if (names.includes('skill.md'))
92
+ return 'skill';
93
+ if (files.length === 1) {
94
+ if (names[0].endsWith('.mdc'))
95
+ return 'rule';
96
+ if (names[0].endsWith('.md'))
97
+ return 'command';
98
+ }
99
+ throw (0, errors_1.createValidationError)('type', 'required', 'Cannot auto-detect the resource type from the provided files. ' +
100
+ 'Please specify "type" explicitly: "command" (single .md), "skill" (contains SKILL.md), ' +
101
+ '"rule" (single .mdc), or "mcp" (contains mcp-config.json).');
102
+ }
103
+ /**
104
+ * Derive a human-readable resource name from the primary file in the upload list.
105
+ * The original filename (without extension) is used as-is — never renamed.
106
+ *
107
+ * - Single-file upload: strip extension from the filename.
108
+ * "code-review.md" → "code-review"
109
+ * "csp-agent.mdc" → "csp-agent"
110
+ * - Multi-file upload: use the top-level directory name when the first
111
+ * path contains a directory component.
112
+ * "code-review/SKILL.md" → "code-review"
113
+ * Falls back to the first file's base name otherwise.
114
+ *
115
+ * Returns undefined when the files array is empty (caller should error).
116
+ */
117
+ function deriveNameFromFiles(files) {
118
+ if (!files || files.length === 0)
119
+ return undefined;
120
+ const first = files[0].path;
121
+ // For paths like "code-review/SKILL.md", use the top-level directory.
122
+ const dir = path.dirname(first);
123
+ if (dir && dir !== '.')
124
+ return dir;
125
+ // Strip extension from bare filename.
126
+ const base = path.basename(first, path.extname(first));
127
+ return base || undefined;
128
+ }
129
+ /**
130
+ * Validate and return the files[] array.
131
+ * Each entry path must be a relative path with no traversal.
132
+ * For MCP resources, mcp-config.json must be present.
133
+ *
134
+ * @param resolvedType The already-inferred resource type (never undefined here).
135
+ */
136
+ function collectFiles(typedParams, resolvedType) {
137
+ if (!typedParams.files || typedParams.files.length === 0) {
138
+ throw (0, errors_1.createValidationError)('files', 'required', '"files" must be a non-empty array of {path, content} entries.');
139
+ }
140
+ for (const entry of typedParams.files) {
141
+ const norm = path.normalize(entry.path);
142
+ if (norm.startsWith('..') || path.isAbsolute(norm)) {
143
+ throw (0, errors_1.createValidationError)('files[].path', 'relative_path', `Path traversal or absolute path not allowed: "${entry.path}"`);
144
+ }
145
+ }
146
+ // MCP resources must include mcp-config.json so the client can auto-register
147
+ // the server in ~/.cursor/mcp.json after sync_resources installs it.
148
+ if (resolvedType === 'mcp') {
149
+ const hasMcpConfig = typedParams.files.some((f) => path.basename(f.path) === 'mcp-config.json');
150
+ if (!hasMcpConfig) {
151
+ // Look for other files that might already describe the server configuration
152
+ // (e.g. pyproject.toml, package.json, README.md, config.json, server.py).
153
+ // If found, surface a targeted hint so the user knows exactly what to create.
154
+ const configHints = typedParams.files
155
+ .map((f) => path.basename(f.path))
156
+ .filter((n) => /\.(toml|yaml|yml|json|cfg|ini|conf|py|js|ts|md)$/i.test(n) &&
157
+ n !== 'mcp-config.json');
158
+ const hintNote = configHints.length > 0
159
+ ? `\nFound related files (${configHints.join(', ')}) that may already describe the server ` +
160
+ `configuration — please create "mcp-config.json" based on those files.`
161
+ : '';
162
+ throw (0, errors_1.createValidationError)('files', 'required', 'MCP resources must include a "mcp-config.json" file. ' +
163
+ 'This file tells the client how to start the MCP server after installation.' +
164
+ hintNote +
165
+ '\n\nRequired format:\n' +
166
+ '{\n' +
167
+ ' "name": "<server-name>",\n' +
168
+ ' "command": "python3", // or "node", "uvx", etc.\n' +
169
+ ' "args": ["<entry-file.py>"], // relative path resolved against install dir\n' +
170
+ ' "env": { "ENV_VAR": "" } // optional; empty string = user must fill in\n' +
171
+ '}');
172
+ }
173
+ }
174
+ return typedParams.files;
175
+ }
176
+ async function uploadResource(params) {
177
+ const startTime = Date.now();
178
+ const typedParams = params;
179
+ logger_1.logger.info({ tool: 'upload_resource', params }, 'upload_resource called');
180
+ try {
181
+ const resourceId = typedParams.resource_id;
182
+ const userToken = typedParams.user_token;
183
+ const targetSource = typedParams.target_source ?? 'csp';
184
+ const force = typedParams.force || false;
185
+ // User-declared type always wins; auto-detect only when omitted.
186
+ const resourceType = inferResourceType(typedParams.type, typedParams.files);
187
+ // Name: explicit user value > derived from filename (no extension).
188
+ // Never fall back to resource_id — that is an internal identifier, not a name.
189
+ const derivedName = typedParams.name ?? deriveNameFromFiles(typedParams.files);
190
+ if (!derivedName) {
191
+ throw (0, errors_1.createValidationError)('name', 'required', 'Could not determine a resource name from the provided files. ' +
192
+ 'Please provide a "name" field explicitly.');
193
+ }
194
+ const resourceName = derivedName;
195
+ logger_1.logger.info({ resourceId, resourceType, targetSource }, 'Upload target resolved');
196
+ // ========== Step 1: Duplicate-name check ==========
197
+ try {
198
+ if (!resources_1.resourceLoader.getStats()) {
199
+ await resources_1.resourceLoader.loadConfig();
200
+ await resources_1.resourceLoader.scanResources();
201
+ }
202
+ const existing = resources_1.resourceLoader.searchResourcesByName(resourceName, resourceType);
203
+ if (existing.length > 0 && !force) {
204
+ const conflictInfo = existing.map((r) => ({ name: r.name, type: r.type, source: r.source }));
205
+ logger_1.logger.warn({ resourceName, resourceType, conflictInfo }, 'Resource name conflict detected');
206
+ return {
207
+ success: false,
208
+ error: {
209
+ code: 'RESOURCE_NAME_CONFLICT',
210
+ message: `Resource "${resourceName}" already exists. Add "force": true to overwrite.\n` +
211
+ conflictInfo.map((c) => ` - ${c.name} (${c.type}, source: ${c.source})`).join('\n'),
212
+ details: conflictInfo,
213
+ },
214
+ };
215
+ }
216
+ }
217
+ catch (err) {
218
+ logger_1.logger.warn({ error: err.message }, 'Duplicate check failed, continuing upload');
219
+ }
220
+ // ========== Step 3: Validate commit message ==========
221
+ if (!typedParams.message || typeof typedParams.message !== 'string') {
222
+ throw (0, errors_1.createValidationError)('message', 'string', 'Commit message is required');
223
+ }
224
+ if (typedParams.message.length < 5 || typedParams.message.length > 200) {
225
+ throw (0, errors_1.createValidationError)('message', 'string', `Commit message must be 5-200 characters, got ${typedParams.message.length}`);
226
+ }
227
+ // ========== Step 4: Collect files ==========
228
+ const fileEntries = collectFiles(typedParams, resourceType);
229
+ logger_1.logger.info({ resourceId, fileCount: fileEntries.length }, 'Files collected for upload');
230
+ // ========== Step 5: Call CSP API — upload (staging) ==========
231
+ logger_1.logger.info({ resourceName, resourceType, targetSource }, 'Calling CSP upload API...');
232
+ const uploadResp = await client_1.apiClient.uploadResourceFiles({
233
+ type: resourceType,
234
+ name: resourceName,
235
+ files: fileEntries,
236
+ target_source: targetSource,
237
+ force,
238
+ }, userToken);
239
+ const uploadId = uploadResp.upload_id;
240
+ logger_1.logger.info({ uploadId, expiresAt: uploadResp.expires_at }, 'Upload staged successfully');
241
+ // ========== Step 6: Call CSP API — finalize (Git commit) ==========
242
+ logger_1.logger.info({ uploadId }, 'Calling CSP finalize API...');
243
+ const finalizeResp = await client_1.apiClient.finalizeResourceUpload(uploadId, typedParams.message, userToken);
244
+ const finalResourceId = finalizeResp.resource_id;
245
+ const version = finalizeResp.version ?? '1.0.0';
246
+ const resourceUrl = finalizeResp.url ?? '';
247
+ const commitHash = finalizeResp.commit_hash ?? '';
248
+ logger_1.logger.info({ finalResourceId, version, commitHash }, 'Upload finalized successfully');
249
+ // For Command / Skill: register the uploaded content as an MCP Prompt immediately,
250
+ // so the user can invoke it via slash-command without a full sync cycle.
251
+ if (resourceType === 'command' || resourceType === 'skill') {
252
+ try {
253
+ const primaryFile = resourceType === 'skill'
254
+ ? (fileEntries.find((f) => path.basename(f.path) === 'SKILL.md') ??
255
+ fileEntries.find((f) => f.path.endsWith('.md')) ??
256
+ fileEntries[0])
257
+ : (fileEntries.find((f) => path.basename(f.path).replace(/\.md$/, '') === resourceName) ??
258
+ fileEntries.find((f) => f.path.endsWith('.md')) ??
259
+ fileEntries[0]);
260
+ const rawContent = primaryFile?.content ?? '';
261
+ const team = typedParams.team ?? 'general';
262
+ const frontmatterDesc = extractFrontmatterDescription(rawContent);
263
+ const description = frontmatterDesc ?? typedParams.message ?? resourceName;
264
+ await index_js_1.promptManager.registerPrompt({
265
+ resource_id: finalResourceId,
266
+ resource_type: resourceType,
267
+ resource_name: resourceName,
268
+ team,
269
+ description,
270
+ rawContent,
271
+ }, userToken ?? '');
272
+ logger_1.logger.info({ finalResourceId, resourceType }, 'MCP Prompt registered after upload');
273
+ }
274
+ catch (promptErr) {
275
+ // Non-fatal: the resource is uploaded; Prompt registration is best-effort.
276
+ logger_1.logger.warn({ finalResourceId, error: promptErr.message }, 'MCP Prompt registration after upload failed (non-fatal)');
277
+ }
278
+ }
279
+ const result = {
280
+ resource_id: finalResourceId,
281
+ version,
282
+ url: resourceUrl,
283
+ commit_hash: commitHash,
284
+ message: `Resource '${resourceName}' (${resourceType}) uploaded to source '${targetSource}' (v${version}). ${resourceUrl ? `URL: ${resourceUrl}` : ''}`.trim(),
285
+ };
286
+ const duration = Date.now() - startTime;
287
+ (0, logger_1.logToolCall)('upload_resource', 'user-id', params, duration);
288
+ logger_1.logger.info({ finalResourceId, version, source: targetSource, duration }, 'upload_resource completed');
289
+ return { success: true, data: result };
290
+ }
291
+ catch (error) {
292
+ logger_1.logger.error({ error, resourceId: typedParams.resource_id }, 'upload_resource failed');
293
+ return {
294
+ success: false,
295
+ error: {
296
+ code: error instanceof errors_1.MCPServerError ? error.code : 'UNKNOWN_ERROR',
297
+ message: error instanceof Error ? error.message : String(error),
298
+ },
299
+ };
300
+ }
301
+ }
302
+ // Tool definition for registry
303
+ exports.uploadResourceTool = {
304
+ name: 'upload_resource',
305
+ description: 'Upload a new AI resource (command, skill, rule, or mcp) to a CSP source repository. ' +
306
+ 'The user selects files from their local machine — read each file and pass its content in files[]. ' +
307
+ 'ALWAYS confirm the target source repo with the user (e.g. "csp" (default) or "client-sdk-ai-hub"). ' +
308
+ '\n\nResource type rules:\n' +
309
+ ' • If the user explicitly states the type, use it as-is — no overriding.\n' +
310
+ ' • If the user does NOT state a type, auto-detect from file structure:\n' +
311
+ ' - Contains mcp-config.json → type="mcp"\n' +
312
+ ' - Contains SKILL.md → type="skill"\n' +
313
+ ' - Single .mdc file → type="rule"\n' +
314
+ ' - Single .md file → type="command"\n' +
315
+ ' • If the user says type="mcp" but mcp-config.json is missing, the tool will\n' +
316
+ ' return an error with a hint about creating mcp-config.json.\n' +
317
+ '\n\nResource name rules:\n' +
318
+ ' • If the user provides a name, use it.\n' +
319
+ ' • Otherwise derive the name from the filename WITHOUT its extension.\n' +
320
+ ' Keep the original filename — NEVER rename files (e.g. do not rename any .md file).\n' +
321
+ ' Examples: "code-review.md" → name="code-review"; "code-review/SKILL.md" → name="code-review".\n' +
322
+ '\n\nPass files[] — an array of {path, content} entries. ' +
323
+ 'path must be the original filename as-is (relative, no path traversal). ' +
324
+ 'No restriction on file extensions — mcp packages may include .py, .js, package.json, etc.\n' +
325
+ '\nThe user_token is injected automatically by the server — do NOT read or pass it manually.',
326
+ inputSchema: {
327
+ type: 'object',
328
+ properties: {
329
+ resource_id: {
330
+ type: 'string',
331
+ description: 'Unique resource identifier used as commit label and for duplicate detection',
332
+ },
333
+ name: {
334
+ type: 'string',
335
+ description: 'Human-readable resource name sent to the CSP API (defaults to resource_id if omitted)',
336
+ },
337
+ type: {
338
+ type: 'string',
339
+ enum: ['command', 'skill', 'rule', 'mcp'],
340
+ description: 'Resource category. Auto-detected from file structure — only set explicitly when detection is ambiguous. ' +
341
+ 'command: single .md slash-command file; ' +
342
+ 'skill: directory or file set containing SKILL.md; ' +
343
+ 'rule: single .mdc Cursor rule file; ' +
344
+ 'mcp: MCP server package — MUST include mcp-config.json.',
345
+ },
346
+ message: {
347
+ type: 'string',
348
+ description: 'Git commit message (5-200 characters)',
349
+ },
350
+ target_source: {
351
+ type: 'string',
352
+ description: 'Target source repo name on the CSP server. ' +
353
+ 'Ask the user which repo to target. Typical values: "csp" (default), "client-sdk-ai-hub". ' +
354
+ 'The CSP server will commit the resource to the corresponding Git repo.',
355
+ },
356
+ files: {
357
+ type: 'array',
358
+ description: 'List of files to upload. Read each file from the user\'s local machine and pass content here. ' +
359
+ 'path is the filename the resource should be stored as on the server. ' +
360
+ 'Examples (type="rule"): [{path: "csp-ai-agent.mdc", content: "..."}]. ' +
361
+ 'Examples (type="skill"): [{path: "SKILL.md", content: "..."}, {path: "examples.md", content: "..."}]. ' +
362
+ 'Examples (type="mcp"): [{path: "server.py", content: "..."}, {path: "mcp-config.json", content: "..."}]. ' +
363
+ 'No restriction on file extension.',
364
+ items: {
365
+ type: 'object',
366
+ properties: {
367
+ path: { type: 'string', description: 'Relative path under the type subdirectory' },
368
+ content: { type: 'string', description: 'Full text content of the file' },
369
+ },
370
+ required: ['path', 'content'],
371
+ },
372
+ },
373
+ team: {
374
+ type: 'string',
375
+ description: 'Team / group name (defaults to Client-Public)',
376
+ default: 'Client-Public',
377
+ },
378
+ force: {
379
+ type: 'boolean',
380
+ description: 'Overwrite if a resource with the same name already exists',
381
+ default: false,
382
+ },
383
+ user_token: {
384
+ type: 'string',
385
+ description: 'DO NOT set this field — it is automatically injected by the MCP server from ' +
386
+ 'the authenticated SSE connection. The server always provides the correct token.',
387
+ },
388
+ },
389
+ required: ['resource_id', 'message', 'files'],
390
+ },
391
+ handler: uploadResource,
392
+ };
393
+ //# sourceMappingURL=upload-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-resource.js","sourceRoot":"","sources":["../../src/tools/upload-resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * SSE Transport Implementation
3
+ * MCP protocol over Server-Sent Events
4
+ */
5
+ export interface SSEMessage {
6
+ jsonrpc: '2.0';
7
+ id?: string | number;
8
+ method?: string;
9
+ params?: unknown;
10
+ result?: unknown;
11
+ error?: {
12
+ code: number;
13
+ message: string;
14
+ data?: unknown;
15
+ };
16
+ }
17
+ export declare class SSETransport {
18
+ constructor();
19
+ /**
20
+ * Handle incoming message from client
21
+ */
22
+ handleMessage(sessionId: string, message: SSEMessage): Promise<void>;
23
+ /**
24
+ * Send message to client via SSE
25
+ */
26
+ private sendMessage;
27
+ }
28
+ export declare const sseTransport: SSETransport;
29
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/transport/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,YAAY;;IAKvB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwQ1E;;OAEG;IACH,OAAO,CAAC,WAAW;CAMpB;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}