@snutils/snu 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 (67) hide show
  1. package/README.md +156 -0
  2. package/bin/snu.js +8 -0
  3. package/dist/cli/format.d.ts +14 -0
  4. package/dist/cli/format.d.ts.map +1 -0
  5. package/dist/cli/format.js +231 -0
  6. package/dist/cli/format.js.map +1 -0
  7. package/dist/cli/index.d.ts +4 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +296 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/stdin.d.ts +14 -0
  12. package/dist/cli/stdin.d.ts.map +1 -0
  13. package/dist/cli/stdin.js +75 -0
  14. package/dist/cli/stdin.js.map +1 -0
  15. package/dist/client.d.ts +43 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +350 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +28 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/mcp/index.d.ts +4 -0
  24. package/dist/mcp/index.d.ts.map +1 -0
  25. package/dist/mcp/index.js +185 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/registry.d.ts +5 -0
  28. package/dist/registry.d.ts.map +1 -0
  29. package/dist/registry.js +527 -0
  30. package/dist/registry.js.map +1 -0
  31. package/dist/server/canonical.d.ts +10 -0
  32. package/dist/server/canonical.d.ts.map +1 -0
  33. package/dist/server/canonical.js +72 -0
  34. package/dist/server/canonical.js.map +1 -0
  35. package/dist/server/config.d.ts +9 -0
  36. package/dist/server/config.d.ts.map +1 -0
  37. package/dist/server/config.js +117 -0
  38. package/dist/server/config.js.map +1 -0
  39. package/dist/server/dispatcher.d.ts +32 -0
  40. package/dist/server/dispatcher.d.ts.map +1 -0
  41. package/dist/server/dispatcher.js +631 -0
  42. package/dist/server/dispatcher.js.map +1 -0
  43. package/dist/server/httpBridge.d.ts +20 -0
  44. package/dist/server/httpBridge.d.ts.map +1 -0
  45. package/dist/server/httpBridge.js +219 -0
  46. package/dist/server/httpBridge.js.map +1 -0
  47. package/dist/server/pendingRegistry.d.ts +26 -0
  48. package/dist/server/pendingRegistry.d.ts.map +1 -0
  49. package/dist/server/pendingRegistry.js +76 -0
  50. package/dist/server/pendingRegistry.js.map +1 -0
  51. package/dist/server/policy.d.ts +18 -0
  52. package/dist/server/policy.d.ts.map +1 -0
  53. package/dist/server/policy.js +53 -0
  54. package/dist/server/policy.js.map +1 -0
  55. package/dist/server/standalone.d.ts +24 -0
  56. package/dist/server/standalone.d.ts.map +1 -0
  57. package/dist/server/standalone.js +152 -0
  58. package/dist/server/standalone.js.map +1 -0
  59. package/dist/server/wsBridge.d.ts +45 -0
  60. package/dist/server/wsBridge.d.ts.map +1 -0
  61. package/dist/server/wsBridge.js +321 -0
  62. package/dist/server/wsBridge.js.map +1 -0
  63. package/dist/types.d.ts +123 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +6 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +51 -0
package/dist/client.js ADDED
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ScriptSyncClient = exports.ScriptSyncClientError = exports.HEALTH_CHECK_TIMEOUT_MS = exports.REVIEWED_COMMAND_TIMEOUT_MS = exports.DEFAULT_COMMAND_TIMEOUT_MS = exports.MIN_API_VERSION = void 0;
37
+ exports.getGlobalPortFilePath = getGlobalPortFilePath;
38
+ exports.findWorkspacePortFile = findWorkspacePortFile;
39
+ exports.discoverBridge = discoverBridge;
40
+ exports.checkHealth = checkHealth;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const os = __importStar(require("os"));
44
+ const crypto = __importStar(require("crypto"));
45
+ const policy_js_1 = require("./server/policy.js");
46
+ exports.MIN_API_VERSION = 7;
47
+ exports.DEFAULT_COMMAND_TIMEOUT_MS = 70_000;
48
+ exports.REVIEWED_COMMAND_TIMEOUT_MS = 310_000; // 5m 10s
49
+ exports.HEALTH_CHECK_TIMEOUT_MS = 1_500;
50
+ class ScriptSyncClientError extends Error {
51
+ code;
52
+ status;
53
+ details;
54
+ constructor(message, code, status, details) {
55
+ super(message);
56
+ this.code = code;
57
+ this.status = status;
58
+ this.details = details;
59
+ this.name = 'ScriptSyncClientError';
60
+ }
61
+ }
62
+ exports.ScriptSyncClientError = ScriptSyncClientError;
63
+ /**
64
+ * Global port file path (~/.sn-scriptsync/agent-port.json).
65
+ * Written when a Pro/Trial/Enterprise license is connected in the browser.
66
+ */
67
+ function getGlobalPortFilePath() {
68
+ return path.join(os.homedir(), '.sn-scriptsync', 'agent-port.json');
69
+ }
70
+ /**
71
+ * Walk up directory tree from startDir looking for .vscode/sn-agent-port.json.
72
+ */
73
+ function findWorkspacePortFile(startDir) {
74
+ let current = path.resolve(startDir);
75
+ while (true) {
76
+ const candidate = path.join(current, '.vscode', 'sn-agent-port.json');
77
+ if (fs.existsSync(candidate)) {
78
+ return candidate;
79
+ }
80
+ const parent = path.dirname(current);
81
+ if (parent === current) {
82
+ break; // Reached filesystem root
83
+ }
84
+ current = parent;
85
+ }
86
+ return undefined;
87
+ }
88
+ /**
89
+ * Discover the active ScriptSync bridge port and token using deterministic precedence.
90
+ */
91
+ async function discoverBridge(options = {}) {
92
+ const cwd = options.cwd || process.cwd();
93
+ // 1. Explicit port-file option if provided
94
+ if (options.portFile) {
95
+ if (!fs.existsSync(options.portFile)) {
96
+ throw new ScriptSyncClientError(`Specified port file does not exist: ${options.portFile}`, 'E_PORT_FILE_NOT_FOUND');
97
+ }
98
+ return await validatePortFile(options.portFile, false);
99
+ }
100
+ // 2. Upward traversal in current workspace for .vscode/sn-agent-port.json
101
+ const wsPortFile = findWorkspacePortFile(cwd);
102
+ if (wsPortFile) {
103
+ try {
104
+ return await validatePortFile(wsPortFile, false);
105
+ }
106
+ catch (err) {
107
+ // Stale or dead workspace port file
108
+ if (err.code === 'E_STALE_PORT_FILE' || err.code === 'E_BRIDGE_UNREACHABLE') {
109
+ // Fall through to global port file check
110
+ }
111
+ else {
112
+ throw err;
113
+ }
114
+ }
115
+ }
116
+ // 3. Fallback to global user port file (~/.sn-scriptsync/agent-port.json)
117
+ const globalPortFile = getGlobalPortFilePath();
118
+ if (fs.existsSync(globalPortFile)) {
119
+ try {
120
+ return await validatePortFile(globalPortFile, true);
121
+ }
122
+ catch (err) {
123
+ if (err.code === 'E_STALE_PORT_FILE' || err.code === 'E_BRIDGE_UNREACHABLE') {
124
+ // Drop through to final error
125
+ }
126
+ else {
127
+ throw err;
128
+ }
129
+ }
130
+ }
131
+ throw new ScriptSyncClientError('No active ScriptSync bridge found. Open your ServiceNow project folder in VS Code with sn-scriptsync active, or start standalone with `snu serve`.', 'E_BRIDGE_NOT_FOUND');
132
+ }
133
+ /**
134
+ * Validate a candidate port file: parse JSON, check PID liveness, and verify /api/health.
135
+ */
136
+ async function validatePortFile(filePath, isGlobal) {
137
+ let raw;
138
+ try {
139
+ raw = fs.readFileSync(filePath, 'utf8');
140
+ }
141
+ catch (err) {
142
+ throw new ScriptSyncClientError(`Failed to read port file at ${filePath}: ${err?.message || err}`, 'E_PORT_FILE_READ_ERROR');
143
+ }
144
+ let data;
145
+ try {
146
+ data = JSON.parse(raw);
147
+ }
148
+ catch (err) {
149
+ throw new ScriptSyncClientError(`Corrupt port file JSON at ${filePath}`, 'E_PORT_FILE_CORRUPT');
150
+ }
151
+ if (!data.port || !data.token || typeof data.pid !== 'number') {
152
+ throw new ScriptSyncClientError(`Invalid port file structure at ${filePath}`, 'E_PORT_FILE_INVALID');
153
+ }
154
+ // Validate process liveness via PID (kill -0)
155
+ if (typeof process.kill === 'function') {
156
+ try {
157
+ process.kill(data.pid, 0);
158
+ }
159
+ catch {
160
+ throw new ScriptSyncClientError(`Bridge process with PID ${data.pid} is no longer running (stale port file at ${filePath})`, 'E_STALE_PORT_FILE');
161
+ }
162
+ }
163
+ // Probe /api/health to ensure the bridge is healthy and API version is compatible
164
+ await checkHealth(data.port, data.pid);
165
+ return {
166
+ port: data.port,
167
+ token: data.token,
168
+ pid: data.pid,
169
+ apiVersion: data.apiVersion || 8,
170
+ portFilePath: filePath,
171
+ isGlobal,
172
+ };
173
+ }
174
+ /**
175
+ * Probe GET /api/health with a short timeout.
176
+ */
177
+ async function checkHealth(port, expectedPid) {
178
+ const url = `http://127.0.0.1:${port}/api/health`;
179
+ const controller = new AbortController();
180
+ const timer = setTimeout(() => controller.abort(), exports.HEALTH_CHECK_TIMEOUT_MS);
181
+ try {
182
+ const res = await fetch(url, { signal: controller.signal });
183
+ if (!res.ok) {
184
+ throw new Error(`Health check returned HTTP ${res.status}`);
185
+ }
186
+ const health = (await res.json());
187
+ if (health.status !== 'success') {
188
+ throw new Error('Health check response missing status=success');
189
+ }
190
+ if (typeof health.apiVersion === 'number' && health.apiVersion < exports.MIN_API_VERSION) {
191
+ throw new ScriptSyncClientError(`ScriptSync server API version ${health.apiVersion} is older than minimum supported ${exports.MIN_API_VERSION}`, 'E_API_VERSION_INCOMPATIBLE');
192
+ }
193
+ if (expectedPid !== undefined && health.pid !== expectedPid) {
194
+ throw new ScriptSyncClientError(`PID mismatch: port file declared PID ${expectedPid}, but server on port ${port} is running as PID ${health.pid}`, 'E_STALE_PORT_FILE');
195
+ }
196
+ return health;
197
+ }
198
+ catch (err) {
199
+ if (err instanceof ScriptSyncClientError)
200
+ throw err;
201
+ throw new ScriptSyncClientError(`Cannot reach ScriptSync bridge on 127.0.0.1:${port}: ${err?.message || err}`, 'E_BRIDGE_UNREACHABLE');
202
+ }
203
+ finally {
204
+ clearTimeout(timer);
205
+ }
206
+ }
207
+ /**
208
+ * ScriptSync Client for sending typed commands to the bridge.
209
+ */
210
+ class ScriptSyncClient {
211
+ options;
212
+ discoveryResult;
213
+ constructor(options) {
214
+ this.options = options;
215
+ }
216
+ async getDiscovery() {
217
+ if (!this.discoveryResult) {
218
+ this.discoveryResult = await discoverBridge(this.options);
219
+ }
220
+ return this.discoveryResult;
221
+ }
222
+ async execute(mapped, timeoutMs) {
223
+ const discovery = await this.getDiscovery();
224
+ const url = `http://127.0.0.1:${discovery.port}/api`;
225
+ const requestId = `snu_${Date.now()}_${crypto.randomBytes(3).toString('hex')}`;
226
+ const payload = {
227
+ id: requestId,
228
+ command: mapped.command,
229
+ params: mapped.params,
230
+ };
231
+ if (mapped.instance) {
232
+ payload.instance = mapped.instance;
233
+ }
234
+ const policy = (0, policy_js_1.getCommandPolicy)(payload);
235
+ const isReviewedCommand = policy.review === 'required';
236
+ const effectiveTimeout = timeoutMs !== undefined
237
+ ? timeoutMs
238
+ : isReviewedCommand
239
+ ? exports.REVIEWED_COMMAND_TIMEOUT_MS
240
+ : exports.DEFAULT_COMMAND_TIMEOUT_MS;
241
+ const controller = new AbortController();
242
+ const timer = setTimeout(() => controller.abort(), effectiveTimeout);
243
+ try {
244
+ const res = await fetch(url, {
245
+ method: 'POST',
246
+ headers: {
247
+ 'Content-Type': 'application/json',
248
+ 'X-Agent-Token': discovery.token,
249
+ },
250
+ body: JSON.stringify(payload),
251
+ signal: controller.signal,
252
+ });
253
+ let json;
254
+ try {
255
+ json = (await res.json());
256
+ }
257
+ catch (parseErr) {
258
+ throw new ScriptSyncClientError(`Failed to parse server response: ${parseErr?.message || parseErr}`, 'E_INVALID_RESPONSE', res.status);
259
+ }
260
+ if (json.status === 'error' || !res.ok) {
261
+ // Auto-fallback: If multiple instances exist and none was specified, check if there is a unique recently-active defaultInstance
262
+ if (json.code === 'E_INSTANCE_REQUIRED' && !mapped.instance && mapped.command !== 'list_instances') {
263
+ try {
264
+ const listResp = await this.execute({ command: 'list_instances', params: {} }, 3000);
265
+ const defaultInst = listResp.result?.defaultInstance;
266
+ if (defaultInst) {
267
+ return await this.execute({ ...mapped, instance: defaultInst }, effectiveTimeout);
268
+ }
269
+ }
270
+ catch {
271
+ // Ignore failure to fetch default instance and throw original error
272
+ }
273
+ }
274
+ throw new ScriptSyncClientError(json.error || `Command ${mapped.command} failed`, json.code || 'E_COMMAND_FAILED', res.status, json.details || json.result);
275
+ }
276
+ return json;
277
+ }
278
+ catch (err) {
279
+ if (err instanceof ScriptSyncClientError)
280
+ throw err;
281
+ if (err.name === 'AbortError') {
282
+ throw new ScriptSyncClientError(`Command '${mapped.command}' timed out after ${effectiveTimeout / 1000}s`, 'E_TIMEOUT');
283
+ }
284
+ throw new ScriptSyncClientError(`Failed to communicate with ScriptSync Agent API: ${err?.message || err}`, 'E_NETWORK_ERROR');
285
+ }
286
+ finally {
287
+ clearTimeout(timer);
288
+ }
289
+ }
290
+ /**
291
+ * Composite context fetcher for `snu context` / `snu_get_context`
292
+ */
293
+ async getContext(instance) {
294
+ // 1. Connection check
295
+ const connResp = await this.execute({ command: 'check_connection', params: {} });
296
+ const conn = connResp.result || {};
297
+ // 2. List instances roster
298
+ const instancesResp = await this.execute({ command: 'list_instances', params: {} });
299
+ const instancesData = instancesResp.result || {};
300
+ let specificInstanceInfo = null;
301
+ if (instance) {
302
+ try {
303
+ const instResp = await this.execute({ command: 'get_instance_info', instance, params: {} });
304
+ specificInstanceInfo = instResp.result;
305
+ }
306
+ catch { }
307
+ }
308
+ // 3. Try get_capabilities
309
+ let capabilities = null;
310
+ let browserConnected = conn.browserConnected === true;
311
+ if (browserConnected) {
312
+ try {
313
+ const capResp = await this.execute({ command: 'get_capabilities', params: {} });
314
+ capabilities = capResp.result;
315
+ }
316
+ catch (e) {
317
+ if (e.code === 'E_BROWSER_DISCONNECTED') {
318
+ browserConnected = false;
319
+ }
320
+ }
321
+ }
322
+ const bridgeReady = conn.serverRunning === true;
323
+ const serviceNowReady = bridgeReady && browserConnected;
324
+ return {
325
+ bridgeReady,
326
+ serviceNowReady,
327
+ browserConnected,
328
+ message: serviceNowReady
329
+ ? 'Connected and ready'
330
+ : bridgeReady
331
+ ? 'Bridge active. Helper tab disconnected (open via /token in ServiceNow tab).'
332
+ : 'WebSocket server not running.',
333
+ helper: capabilities
334
+ ? {
335
+ tier: capabilities.tier,
336
+ proFeatures: capabilities.proFeatures,
337
+ cdp: capabilities.cdp,
338
+ capabilities: capabilities.capabilities,
339
+ }
340
+ : conn.helper || null,
341
+ gates: capabilities?.gates || null,
342
+ instanceGates: capabilities?.instanceGates || null,
343
+ instances: instancesData.instances || [],
344
+ defaultInstance: instancesData.defaultInstance || null,
345
+ selectedInstance: specificInstanceInfo,
346
+ };
347
+ }
348
+ }
349
+ exports.ScriptSyncClient = ScriptSyncClient;
350
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './types.js';
2
+ export * from './client.js';
3
+ export * from './registry.js';
4
+ export { runCli } from './cli/index.js';
5
+ export { createMcpServer, startMcpServer } from './mcp/index.js';
6
+ export { StandaloneBridge } from './server/standalone.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.StandaloneBridge = exports.startMcpServer = exports.createMcpServer = exports.runCli = void 0;
18
+ __exportStar(require("./types.js"), exports);
19
+ __exportStar(require("./client.js"), exports);
20
+ __exportStar(require("./registry.js"), exports);
21
+ var index_js_1 = require("./cli/index.js");
22
+ Object.defineProperty(exports, "runCli", { enumerable: true, get: function () { return index_js_1.runCli; } });
23
+ var index_js_2 = require("./mcp/index.js");
24
+ Object.defineProperty(exports, "createMcpServer", { enumerable: true, get: function () { return index_js_2.createMcpServer; } });
25
+ Object.defineProperty(exports, "startMcpServer", { enumerable: true, get: function () { return index_js_2.startMcpServer; } });
26
+ var standalone_js_1 = require("./server/standalone.js");
27
+ Object.defineProperty(exports, "StandaloneBridge", { enumerable: true, get: function () { return standalone_js_1.StandaloneBridge; } });
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,8CAA4B;AAC5B,gDAA8B;AAC9B,2CAAwC;AAA/B,kGAAA,MAAM,OAAA;AACf,2CAAiE;AAAxD,2GAAA,eAAe,OAAA;AAAE,0GAAA,cAAc,OAAA;AACxC,wDAA0D;AAAjD,iHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createMcpServer(): Promise<McpServer>;
3
+ export declare function startMcpServer(): Promise<void>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,CAAC,CA+O1D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBpD"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMcpServer = createMcpServer;
4
+ exports.startMcpServer = startMcpServer;
5
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
6
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
7
+ const zod_1 = require("zod");
8
+ const registry_js_1 = require("../registry.js");
9
+ const client_js_1 = require("../client.js");
10
+ const standalone_js_1 = require("../server/standalone.js");
11
+ async function createMcpServer() {
12
+ const server = new mcp_js_1.McpServer({
13
+ name: 'sn-utils',
14
+ version: '0.1.0',
15
+ });
16
+ const client = new client_js_1.ScriptSyncClient();
17
+ // Helper to execute a tool and wrap errors into isError tool responses
18
+ async function executeTool(name, args) {
19
+ const tool = (0, registry_js_1.getToolByName)(name);
20
+ if (!tool) {
21
+ return {
22
+ isError: true,
23
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
24
+ };
25
+ }
26
+ try {
27
+ if (name === 'snu_get_context') {
28
+ const result = await client.getContext(args.instance);
29
+ return {
30
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
31
+ };
32
+ }
33
+ const mapped = tool.mapInput(args);
34
+ const resp = await client.execute(mapped);
35
+ return {
36
+ content: [{ type: 'text', text: JSON.stringify(resp.result, null, 2) }],
37
+ };
38
+ }
39
+ catch (err) {
40
+ console.error(`[snu-mcp] Error executing ${name}:`, err?.message || err);
41
+ const userFeedback = err.details?.userFeedback ? ` - User Feedback: "${err.details.userFeedback}"` : '';
42
+ return {
43
+ isError: true,
44
+ content: [
45
+ {
46
+ type: 'text',
47
+ text: `Error (${err?.code || 'E_COMMAND_FAILED'}): ${err?.message || err}${userFeedback}`,
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ }
53
+ // 1. Code Search
54
+ server.tool('snu_code_search', 'Fast SN Utils GraphQL field-index code search across Script Includes, Business Rules, Client Scripts, UI Actions, and Flow Actions. Requires SN Utils Pro.', {
55
+ term: zod_1.z.string().min(2).describe('Search keyword or phrase (min 2 chars)'),
56
+ tables: zod_1.z.string().optional().describe('Optional comma-separated table names to filter search'),
57
+ limit: zod_1.z.number().int().min(1).max(500).default(50).optional().describe('Max hits to return'),
58
+ activeOnly: zod_1.z.boolean().default(false).optional().describe('Only search active records'),
59
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
60
+ }, async (args) => executeTool('snu_code_search', args));
61
+ // 2. Schema
62
+ server.tool('snu_get_schema', 'Fetch column dictionary metadata for a table (types, labels, references, choice lists, mandatory/read-only flags).', {
63
+ table: zod_1.z.string().describe('ServiceNow table name (e.g. incident, sys_user)'),
64
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
65
+ }, async (args) => executeTool('snu_get_schema', args));
66
+ // 3. Context
67
+ server.tool('snu_get_context', 'Inspect active ServiceNow connection status, helper tab state, license tier, available instances, and permission gates.', {
68
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
69
+ }, async (args) => executeTool('snu_get_context', args));
70
+ // 4. Query Records
71
+ server.tool('snu_query_records', 'Query records from any ServiceNow table with an encoded query string, projection fields, and limit.', {
72
+ table: zod_1.z.string().describe('Table name to query'),
73
+ query: zod_1.z.string().optional().describe('ServiceNow encoded query string (e.g. active=true^priority=1)'),
74
+ fields: zod_1.z.string().optional().describe('Comma-separated field list to project'),
75
+ limit: zod_1.z.number().int().min(1).max(500).default(10).optional().describe('Max records to return'),
76
+ orderBy: zod_1.z.string().optional().describe('Order by field expression (e.g. sys_created_on or ORDERBYDESCsys_created_on)'),
77
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
78
+ }, async (args) => executeTool('snu_query_records', args));
79
+ // 5. Get Record
80
+ server.tool('snu_get_record', 'Fetch a single record by sys_id with optional field projection.', {
81
+ table: zod_1.z.string().describe('Table name'),
82
+ sys_id: zod_1.z.string().describe('32-character record sys_id'),
83
+ fields: zod_1.z.string().optional().describe('Comma-separated field list (optional)'),
84
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
85
+ }, async (args) => executeTool('snu_get_record', args));
86
+ // 6. Create Artifact
87
+ server.tool('snu_create_artifact', 'Create a new scriptable artifact (Script Include, Business Rule, etc.) in ServiceNow and track it locally. Requires fields.name and createArtifacts.enabled gate. Note: If review mode is enabled in VS Code settings, the write is staged for manual approval rather than applied immediately.', {
88
+ table: zod_1.z.string().describe('Target ServiceNow artifact table (e.g. sys_script_include)'),
89
+ name: zod_1.z.string().describe('Artifact name (will be mapped into fields.name)'),
90
+ fields: zod_1.z.record(zod_1.z.any()).optional().describe('Additional field-value dictionary (e.g. script, description)'),
91
+ scope: zod_1.z.string().optional().describe('Application scope (optional)'),
92
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
93
+ }, async (args) => executeTool('snu_create_artifact', args));
94
+ // 7. Update Record
95
+ server.tool('snu_update_record', 'Update a field on an existing ServiceNow record with synchronous persistence verification. Note: If review mode is enabled in VS Code settings, the write is staged for manual approval rather than applied immediately.', {
96
+ table: zod_1.z.string().describe('Table name'),
97
+ sys_id: zod_1.z.string().describe('Record sys_id'),
98
+ field: zod_1.z.string().describe('Field name to update (e.g. script, short_description)'),
99
+ value: zod_1.z.string().describe('New field content'),
100
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
101
+ }, async (args) => executeTool('snu_update_record', args));
102
+ // 8. Delete Record
103
+ server.tool('snu_delete_record', 'Delete a single record from ServiceNow by sys_id. Destructive: disabled by default (deleteRecords.enabled) and requires confirm: true or dryRun: true.', {
104
+ table: zod_1.z.string().describe('Table name'),
105
+ sys_id: zod_1.z.string().describe('Record sys_id'),
106
+ confirm: zod_1.z.boolean().describe('Must be set to true to execute deletion'),
107
+ dryRun: zod_1.z.boolean().optional().describe('When true, returns the record that would be deleted without deleting it'),
108
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
109
+ }, async (args) => executeTool('snu_delete_record', args));
110
+ // 9. Run Background Script
111
+ server.tool('snu_run_background_script', 'Execute server-side JavaScript on the instance via Background Scripts and return captured output. Gated by backgroundScripts.enabled.', {
112
+ script: zod_1.z.string().describe('JavaScript code to execute on the instance'),
113
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
114
+ }, async (args) => executeTool('snu_run_background_script', args));
115
+ // 10. Get Form State
116
+ server.tool('snu_get_form_state', 'Read live form table, sys_id, new-record state, and field values from the active connected ServiceNow browser tab.', {
117
+ fields: zod_1.z.array(zod_1.z.string()).optional().describe('Optional list of specific field names to read'),
118
+ url: zod_1.z.string().optional().describe('Target tab URL pattern (optional)'),
119
+ tabId: zod_1.z.number().int().optional().describe('Specific browser tab ID (optional)'),
120
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
121
+ }, async (args) => executeTool('snu_get_form_state', args));
122
+ // 11. Set Form Field
123
+ server.tool('snu_set_form_field', 'Set a field value on the active ServiceNow form via g_form.setValue (triggers client scripts and UI policies).', {
124
+ field: zod_1.z.string().describe('Field name to set'),
125
+ value: zod_1.z.string().describe('New value to set'),
126
+ displayValue: zod_1.z.string().optional().describe('Optional display value for reference fields'),
127
+ url: zod_1.z.string().optional().describe('Target tab URL pattern (optional)'),
128
+ tabId: zod_1.z.number().int().optional().describe('Specific browser tab ID (optional)'),
129
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
130
+ }, async (args) => executeTool('snu_set_form_field', args));
131
+ // 12. Run UI Action
132
+ server.tool('snu_run_ui_action', 'Trigger a UI action on the active form (e.g. save, submit, sysverb_update).', {
133
+ uiAction: zod_1.z.string().describe('Action name or sysverb verb (e.g. save, sysverb_update)'),
134
+ suppressDialogs: zod_1.z.boolean().default(true).optional().describe('Auto-confirm browser dialogs'),
135
+ url: zod_1.z.string().optional().describe('Target tab URL pattern (optional)'),
136
+ tabId: zod_1.z.number().int().optional().describe('Specific browser tab ID (optional)'),
137
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
138
+ }, async (args) => executeTool('snu_run_ui_action', args));
139
+ // 13. Navigate
140
+ server.tool('snu_navigate', 'Navigate connected ServiceNow browser tab to a URL and wait for page load to finish.', {
141
+ url: zod_1.z.string().describe('ServiceNow URL to navigate to'),
142
+ tabId: zod_1.z.number().int().optional().describe('Specific tab ID to navigate (optional)'),
143
+ newTab: zod_1.z.boolean().default(false).optional().describe('Open in a new tab instead of active tab'),
144
+ waitForLoad: zod_1.z.boolean().default(true).optional().describe('Wait for page load event before returning'),
145
+ discardUnsaved: zod_1.z.boolean().default(true).optional().describe('Bypass unsaved changes warnings'),
146
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
147
+ }, async (args) => executeTool('snu_navigate', args));
148
+ // 14. Take Screenshot
149
+ server.tool('snu_take_screenshot', 'Capture a screenshot of a ServiceNow page tab (auto-routes between standard capture and debugger if available). Saves under workspace screenshots/.', {
150
+ url: zod_1.z.string().optional().describe('URL pattern of the tab to capture'),
151
+ tabId: zod_1.z.number().int().optional().describe('Specific tab ID to capture'),
152
+ fileName: zod_1.z.string().optional().describe('Optional custom filename (defaults to timestamped PNG)'),
153
+ exactUrl: zod_1.z.boolean().default(false).optional().describe('Require exact URL match'),
154
+ instance: zod_1.z.string().optional().describe('Target instance name/folder (optional)'),
155
+ }, async (args) => {
156
+ if (!args.url && args.tabId === undefined) {
157
+ args.url = 'https://*.service-now.com/*';
158
+ }
159
+ return executeTool('snu_take_screenshot', args);
160
+ });
161
+ return server;
162
+ }
163
+ async function startMcpServer() {
164
+ // Ensure all logging goes strictly to stderr
165
+ console.error('[snu-mcp] Starting SN Utils MCP Server on stdio...');
166
+ // Auto-start in-process standalone bridge if no bridge is currently reachable
167
+ try {
168
+ await (0, client_js_1.discoverBridge)();
169
+ }
170
+ catch (err) {
171
+ if (err?.code === 'E_BRIDGE_NOT_FOUND' ||
172
+ err?.code === 'E_BRIDGE_UNREACHABLE' ||
173
+ err?.code === 'E_STALE_PORT_FILE') {
174
+ console.error('[snu-mcp] No active VS Code bridge found. Starting in-process standalone bridge on WS 1978 & HTTP 1977...');
175
+ const standalone = new standalone_js_1.StandaloneBridge();
176
+ await standalone.start();
177
+ console.error('[snu-mcp] In-process standalone bridge active.');
178
+ }
179
+ }
180
+ const server = await createMcpServer();
181
+ const transport = new stdio_js_1.StdioServerTransport();
182
+ await server.connect(transport);
183
+ console.error('[snu-mcp] Connected on stdio. 14 tools registered.');
184
+ }
185
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";;AAOA,0CA+OC;AAED,wCAwBC;AAhRD,oEAAoE;AACpE,wEAAiF;AACjF,6BAAwB;AACxB,gDAAsD;AACtD,4CAAgE;AAChE,2DAA2D;AAEpD,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,4BAAgB,EAAE,CAAC;IAEtC,uEAAuE;IACvE,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAyB;QAChE,MAAM,IAAI,GAAG,IAAA,2BAAa,EAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;aACpE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;iBAC5E,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACjF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,6BAA6B,IAAI,GAAG,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,sBAAsB,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,GAAG,EAAE,IAAI,IAAI,kBAAkB,MAAM,GAAG,EAAE,OAAO,IAAI,GAAG,GAAG,YAAY,EAAE;qBAC1F;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4JAA4J,EAC5J;QACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAC1E,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QAC/F,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC7F,UAAU,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACxF,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CACrD,CAAC;IAEF,YAAY;IACZ,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,oHAAoH,EACpH;QACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC7E,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CACpD,CAAC;IAEF,aAAa;IACb,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,yHAAyH,EACzH;QACE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CACrD,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,qGAAqG,EACrG;QACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACjD,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;QACtG,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC/E,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAChG,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8EAA8E,CAAC;QACvH,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,CACvD,CAAC;IAEF,gBAAgB;IAChB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,iEAAiE,EACjE;QACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACzD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC/E,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CACpD,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,iSAAiS,EACjS;QACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACxF,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC5E,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QAC7G,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACrE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,qBAAqB,EAAE,IAAI,CAAC,CACzD,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,0NAA0N,EAC1N;QACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QACnF,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC/C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,CACvD,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,wJAAwJ,EACxJ;QACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5C,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACxE,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yEAAyE,CAAC;QAClH,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,CACvD,CAAC;IAEF,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,uIAAuI,EACvI;QACE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACzE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAC/D,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,oHAAoH,EACpH;QACE,MAAM,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAChG,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACxE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACjF,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,oBAAoB,EAAE,IAAI,CAAC,CACxD,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,gHAAgH,EAChH;QACE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC/C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC9C,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC3F,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACxE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACjF,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,oBAAoB,EAAE,IAAI,CAAC,CACxD,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,6EAA6E,EAC7E;QACE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QACxF,eAAe,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC9F,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACxE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACjF,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,CACvD,CAAC;IAEF,eAAe;IACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,sFAAsF,EACtF;QACE,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACzD,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QACrF,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACjG,WAAW,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACvG,cAAc,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChG,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAClD,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,qJAAqJ,EACrJ;QACE,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACxE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACzE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QAClG,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACnF,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,GAAG,6BAA6B,CAAC;QAC3C,CAAC;QACD,OAAO,WAAW,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,6CAA6C;IAC7C,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAEpE,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,IAAA,0BAAc,GAAE,CAAC;IACzB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IACE,GAAG,EAAE,IAAI,KAAK,oBAAoB;YAClC,GAAG,EAAE,IAAI,KAAK,sBAAsB;YACpC,GAAG,EAAE,IAAI,KAAK,mBAAmB,EACjC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,2GAA2G,CAAC,CAAC;YAC3H,MAAM,UAAU,GAAG,IAAI,gCAAgB,EAAE,CAAC;YAC1C,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ToolDefinition } from './types.js';
2
+ export declare const TOOLS: ToolDefinition[];
3
+ export declare function getToolByName(name: string): ToolDefinition | undefined;
4
+ export declare function getToolByCliCommand(cliCmd: string): ToolDefinition | undefined;
5
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAU3D,eAAO,MAAM,KAAK,EAAE,cAAc,EAygBjC,CAAC;AAUF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE9E"}