@neurynae/toolcairn-mcp 0.8.5 → 0.8.6

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.
package/dist/index.js CHANGED
@@ -77,9 +77,442 @@ var require_dist = __commonJS({
77
77
  }
78
78
  });
79
79
 
80
+ // ../../packages/errors/dist/error-codes.js
81
+ var require_error_codes = __commonJS({
82
+ "../../packages/errors/dist/error-codes.js"(exports) {
83
+ "use strict";
84
+ init_esm_shims();
85
+ Object.defineProperty(exports, "__esModule", { value: true });
86
+ exports.ErrorCode = void 0;
87
+ exports.ErrorCode = {
88
+ // ── Database ────────────────────────────────────────────────────────────────
89
+ ERR_DB_CONNECTION: "ERR_DB_CONNECTION",
90
+ ERR_DB_QUERY: "ERR_DB_QUERY",
91
+ ERR_DB_TIMEOUT: "ERR_DB_TIMEOUT",
92
+ ERR_DB_CONSTRAINT: "ERR_DB_CONSTRAINT",
93
+ ERR_DB_NOT_FOUND: "ERR_DB_NOT_FOUND",
94
+ // ── Validation ──────────────────────────────────────────────────────────────
95
+ ERR_VALIDATION_INPUT: "ERR_VALIDATION_INPUT",
96
+ ERR_VALIDATION_SCHEMA: "ERR_VALIDATION_SCHEMA",
97
+ // ── Auth ────────────────────────────────────────────────────────────────────
98
+ ERR_AUTH_TOKEN_EXPIRED: "ERR_AUTH_TOKEN_EXPIRED",
99
+ ERR_AUTH_UNAUTHORIZED: "ERR_AUTH_UNAUTHORIZED",
100
+ ERR_AUTH_FORBIDDEN: "ERR_AUTH_FORBIDDEN",
101
+ // ── External services ───────────────────────────────────────────────────────
102
+ ERR_EXTERNAL_GITHUB: "ERR_EXTERNAL_GITHUB",
103
+ ERR_EXTERNAL_NOMIC: "ERR_EXTERNAL_NOMIC",
104
+ ERR_EXTERNAL_QDRANT: "ERR_EXTERNAL_QDRANT",
105
+ ERR_EXTERNAL_MEMGRAPH: "ERR_EXTERNAL_MEMGRAPH",
106
+ ERR_EXTERNAL_RAZORPAY: "ERR_EXTERNAL_RAZORPAY",
107
+ // ── Queue ───────────────────────────────────────────────────────────────────
108
+ ERR_QUEUE_PUBLISH: "ERR_QUEUE_PUBLISH",
109
+ ERR_QUEUE_CONSUME: "ERR_QUEUE_CONSUME",
110
+ ERR_QUEUE_TIMEOUT: "ERR_QUEUE_TIMEOUT",
111
+ // ── Search ──────────────────────────────────────────────────────────────────
112
+ ERR_SEARCH_PIPELINE: "ERR_SEARCH_PIPELINE",
113
+ ERR_SEARCH_EMBEDDING: "ERR_SEARCH_EMBEDDING",
114
+ ERR_SEARCH_NO_RESULTS: "ERR_SEARCH_NO_RESULTS",
115
+ // ── Indexer ─────────────────────────────────────────────────────────────────
116
+ ERR_INDEXER_CRAWL: "ERR_INDEXER_CRAWL",
117
+ ERR_INDEXER_PROCESS: "ERR_INDEXER_PROCESS",
118
+ ERR_INDEXER_WRITE: "ERR_INDEXER_WRITE",
119
+ // ── Network ─────────────────────────────────────────────────────────────────
120
+ ERR_NETWORK_TIMEOUT: "ERR_NETWORK_TIMEOUT",
121
+ ERR_NETWORK_UNREACHABLE: "ERR_NETWORK_UNREACHABLE",
122
+ // ── MCP ─────────────────────────────────────────────────────────────────────
123
+ ERR_MCP_HANDLER: "ERR_MCP_HANDLER",
124
+ ERR_MCP_AUTH: "ERR_MCP_AUTH",
125
+ // ── Generic ─────────────────────────────────────────────────────────────────
126
+ ERR_INTERNAL: "ERR_INTERNAL",
127
+ ERR_NOT_FOUND: "ERR_NOT_FOUND",
128
+ ERR_RATE_LIMIT: "ERR_RATE_LIMIT"
129
+ };
130
+ }
131
+ });
132
+
133
+ // ../../packages/errors/dist/errors.js
134
+ var require_errors = __commonJS({
135
+ "../../packages/errors/dist/errors.js"(exports) {
136
+ "use strict";
137
+ init_esm_shims();
138
+ Object.defineProperty(exports, "__esModule", { value: true });
139
+ exports.VectorError = exports.IndexerError = exports.SearchError = exports.QueueError = exports.ExternalServiceError = exports.AuthError = exports.ValidationError = exports.NetworkError = exports.DatabaseError = exports.AppError = void 0;
140
+ var error_codes_js_1 = require_error_codes();
141
+ var AppError = class extends Error {
142
+ code;
143
+ httpStatus;
144
+ severity;
145
+ isOperational;
146
+ context;
147
+ timestamp;
148
+ constructor(opts) {
149
+ super(opts.message, { cause: opts.cause });
150
+ this.name = this.constructor.name;
151
+ this.code = opts.code;
152
+ this.httpStatus = opts.httpStatus ?? 500;
153
+ this.severity = opts.severity ?? "medium";
154
+ this.isOperational = opts.isOperational ?? true;
155
+ this.context = opts.context ?? {};
156
+ this.timestamp = (/* @__PURE__ */ new Date()).toISOString();
157
+ Object.setPrototypeOf(this, new.target.prototype);
158
+ }
159
+ /** Structured JSON representation used by the pino error serializer */
160
+ toJSON() {
161
+ return {
162
+ name: this.name,
163
+ code: this.code,
164
+ message: this.message,
165
+ httpStatus: this.httpStatus,
166
+ severity: this.severity,
167
+ isOperational: this.isOperational,
168
+ context: this.context,
169
+ timestamp: this.timestamp,
170
+ stack: this.stack,
171
+ cause: this.cause instanceof Error ? { name: this.cause.name, message: this.cause.message, stack: this.cause.stack } : this.cause
172
+ };
173
+ }
174
+ };
175
+ exports.AppError = AppError;
176
+ var DatabaseError = class extends AppError {
177
+ constructor(opts) {
178
+ super({
179
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_DB_QUERY,
180
+ message: opts.message,
181
+ httpStatus: 503,
182
+ severity: "high",
183
+ isOperational: true,
184
+ cause: opts.cause,
185
+ context: opts.context
186
+ });
187
+ }
188
+ };
189
+ exports.DatabaseError = DatabaseError;
190
+ var NetworkError2 = class extends AppError {
191
+ constructor(opts) {
192
+ super({
193
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_NETWORK_TIMEOUT,
194
+ message: opts.message,
195
+ httpStatus: 502,
196
+ severity: "high",
197
+ isOperational: true,
198
+ cause: opts.cause,
199
+ context: opts.context
200
+ });
201
+ }
202
+ };
203
+ exports.NetworkError = NetworkError2;
204
+ var ValidationError = class extends AppError {
205
+ constructor(opts) {
206
+ super({
207
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_VALIDATION_INPUT,
208
+ message: opts.message,
209
+ httpStatus: 400,
210
+ severity: "low",
211
+ isOperational: true,
212
+ cause: opts.cause,
213
+ context: opts.context
214
+ });
215
+ }
216
+ };
217
+ exports.ValidationError = ValidationError;
218
+ var AuthError2 = class extends AppError {
219
+ constructor(opts) {
220
+ super({
221
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_AUTH_UNAUTHORIZED,
222
+ message: opts.message,
223
+ httpStatus: 401,
224
+ severity: "medium",
225
+ isOperational: true,
226
+ cause: opts.cause,
227
+ context: opts.context
228
+ });
229
+ }
230
+ };
231
+ exports.AuthError = AuthError2;
232
+ var ExternalServiceError = class extends AppError {
233
+ constructor(opts) {
234
+ super({
235
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_INTERNAL,
236
+ message: `[${opts.service}] ${opts.message}`,
237
+ httpStatus: 502,
238
+ severity: "high",
239
+ isOperational: true,
240
+ cause: opts.cause,
241
+ context: { ...opts.context, service: opts.service }
242
+ });
243
+ }
244
+ };
245
+ exports.ExternalServiceError = ExternalServiceError;
246
+ var QueueError = class extends AppError {
247
+ constructor(opts) {
248
+ super({
249
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_QUEUE_PUBLISH,
250
+ message: opts.message,
251
+ httpStatus: 503,
252
+ severity: "high",
253
+ isOperational: true,
254
+ cause: opts.cause,
255
+ context: opts.context
256
+ });
257
+ }
258
+ };
259
+ exports.QueueError = QueueError;
260
+ var SearchError = class extends AppError {
261
+ constructor(opts) {
262
+ super({
263
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_SEARCH_PIPELINE,
264
+ message: opts.message,
265
+ httpStatus: 500,
266
+ severity: "medium",
267
+ isOperational: true,
268
+ cause: opts.cause,
269
+ context: opts.context
270
+ });
271
+ }
272
+ };
273
+ exports.SearchError = SearchError;
274
+ var IndexerError = class extends AppError {
275
+ constructor(opts) {
276
+ super({
277
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_INDEXER_PROCESS,
278
+ message: opts.message,
279
+ httpStatus: 500,
280
+ severity: "medium",
281
+ isOperational: true,
282
+ cause: opts.cause,
283
+ context: opts.context
284
+ });
285
+ }
286
+ };
287
+ exports.IndexerError = IndexerError;
288
+ var VectorError = class extends AppError {
289
+ constructor(opts) {
290
+ super({
291
+ code: opts.code ?? error_codes_js_1.ErrorCode.ERR_EXTERNAL_NOMIC,
292
+ message: opts.message,
293
+ httpStatus: 502,
294
+ severity: "high",
295
+ isOperational: true,
296
+ cause: opts.cause,
297
+ context: opts.context
298
+ });
299
+ }
300
+ };
301
+ exports.VectorError = VectorError;
302
+ }
303
+ });
304
+
305
+ // ../../packages/errors/dist/serializers.js
306
+ var require_serializers = __commonJS({
307
+ "../../packages/errors/dist/serializers.js"(exports) {
308
+ "use strict";
309
+ init_esm_shims();
310
+ Object.defineProperty(exports, "__esModule", { value: true });
311
+ exports.errorSerializer = errorSerializer;
312
+ var errors_js_1 = require_errors();
313
+ function errorSerializer(err) {
314
+ if (err instanceof errors_js_1.AppError) {
315
+ return err.toJSON();
316
+ }
317
+ if (err instanceof Error) {
318
+ return {
319
+ name: err.name,
320
+ message: err.message,
321
+ stack: err.stack,
322
+ cause: err.cause instanceof Error ? { name: err.cause.name, message: err.cause.message, stack: err.cause.stack } : err.cause
323
+ };
324
+ }
325
+ return { message: String(err) };
326
+ }
327
+ }
328
+ });
329
+
330
+ // ../../packages/errors/dist/logger.js
331
+ var require_logger = __commonJS({
332
+ "../../packages/errors/dist/logger.js"(exports) {
333
+ "use strict";
334
+ init_esm_shims();
335
+ var __importDefault = exports && exports.__importDefault || function(mod) {
336
+ return mod && mod.__esModule ? mod : { "default": mod };
337
+ };
338
+ Object.defineProperty(exports, "__esModule", { value: true });
339
+ exports.createMcpLogger = createMcpLogger10;
340
+ exports.createLogger = createMcpLogger10;
341
+ var node_os_1 = __require("os");
342
+ var node_path_1 = __require("path");
343
+ var pino_1 = __importDefault(__require("pino"));
344
+ var serializers_js_1 = require_serializers();
345
+ var REDACT_PATHS = [
346
+ "password",
347
+ "token",
348
+ "accessToken",
349
+ "access_token",
350
+ "refreshToken",
351
+ "refresh_token",
352
+ "apiKey",
353
+ "api_key",
354
+ "secret",
355
+ "TOOLPILOT_API_KEY",
356
+ "authorization",
357
+ "cookie",
358
+ "*.password",
359
+ "*.token",
360
+ "*.secret",
361
+ "*.apiKey",
362
+ "*.api_key"
363
+ ];
364
+ function createMcpLogger10(opts) {
365
+ const level = opts.level ?? process.env.LOG_LEVEL ?? (process.env.NODE_ENV !== "production" ? "debug" : "info");
366
+ const pinoOpts = {
367
+ name: opts.name,
368
+ level,
369
+ serializers: {
370
+ err: serializers_js_1.errorSerializer,
371
+ error: serializers_js_1.errorSerializer
372
+ },
373
+ redact: {
374
+ paths: REDACT_PATHS,
375
+ censor: "[REDACTED]"
376
+ },
377
+ timestamp: pino_1.default.stdTimeFunctions.isoTime,
378
+ base: {
379
+ pid: process.pid,
380
+ ...opts.defaultFields
381
+ }
382
+ };
383
+ const isProd = process.env.NODE_ENV === "production";
384
+ if (!isProd) {
385
+ return (0, pino_1.default)({ ...pinoOpts, transport: { target: "pino/file", options: { destination: 2 } } });
386
+ }
387
+ const logDir = (0, node_path_1.join)((0, node_os_1.homedir)(), ".toolcairn", "logs");
388
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
389
+ const errorLogPath = (0, node_path_1.join)(logDir, `mcp-error-${today}.log`);
390
+ const transport = pino_1.default.transport({
391
+ targets: [
392
+ { target: "pino/file", options: { destination: 2 }, level },
393
+ { target: "pino/file", options: { destination: errorLogPath, mkdir: true }, level: "warn" }
394
+ ]
395
+ });
396
+ return (0, pino_1.default)(pinoOpts, transport);
397
+ }
398
+ }
399
+ });
400
+
401
+ // ../../packages/errors/dist/mcp-error-wrapper.js
402
+ var require_mcp_error_wrapper = __commonJS({
403
+ "../../packages/errors/dist/mcp-error-wrapper.js"(exports) {
404
+ "use strict";
405
+ init_esm_shims();
406
+ Object.defineProperty(exports, "__esModule", { value: true });
407
+ exports.withErrorHandling = withErrorHandling2;
408
+ var error_codes_js_1 = require_error_codes();
409
+ var errors_js_1 = require_errors();
410
+ function withErrorHandling2(toolName, logger10, handler) {
411
+ return async (args) => {
412
+ try {
413
+ return await handler(args);
414
+ } catch (err) {
415
+ if (err instanceof errors_js_1.AppError) {
416
+ const logLevel = err.severity === "critical" || err.severity === "high" ? "error" : "warn";
417
+ logger10[logLevel]({ err, tool: toolName }, `Tool ${toolName} failed: ${err.message}`);
418
+ return {
419
+ content: [
420
+ {
421
+ type: "text",
422
+ text: JSON.stringify({
423
+ ok: false,
424
+ error: err.code,
425
+ message: err.isOperational ? err.message : "An internal error occurred"
426
+ })
427
+ }
428
+ ],
429
+ isError: true
430
+ };
431
+ }
432
+ logger10.error({ err, tool: toolName }, `Unexpected error in tool ${toolName}`);
433
+ return {
434
+ content: [
435
+ {
436
+ type: "text",
437
+ text: JSON.stringify({
438
+ ok: false,
439
+ error: error_codes_js_1.ErrorCode.ERR_MCP_HANDLER,
440
+ message: err instanceof Error ? err.message : String(err)
441
+ })
442
+ }
443
+ ],
444
+ isError: true
445
+ };
446
+ }
447
+ };
448
+ }
449
+ }
450
+ });
451
+
452
+ // ../../packages/errors/dist/index.js
453
+ var require_dist2 = __commonJS({
454
+ "../../packages/errors/dist/index.js"(exports) {
455
+ "use strict";
456
+ init_esm_shims();
457
+ Object.defineProperty(exports, "__esModule", { value: true });
458
+ exports.withErrorHandling = exports.createLogger = exports.createMcpLogger = exports.errorSerializer = exports.VectorError = exports.IndexerError = exports.SearchError = exports.QueueError = exports.ExternalServiceError = exports.AuthError = exports.ValidationError = exports.NetworkError = exports.DatabaseError = exports.AppError = exports.ErrorCode = void 0;
459
+ var error_codes_js_1 = require_error_codes();
460
+ Object.defineProperty(exports, "ErrorCode", { enumerable: true, get: function() {
461
+ return error_codes_js_1.ErrorCode;
462
+ } });
463
+ var errors_js_1 = require_errors();
464
+ Object.defineProperty(exports, "AppError", { enumerable: true, get: function() {
465
+ return errors_js_1.AppError;
466
+ } });
467
+ Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function() {
468
+ return errors_js_1.DatabaseError;
469
+ } });
470
+ Object.defineProperty(exports, "NetworkError", { enumerable: true, get: function() {
471
+ return errors_js_1.NetworkError;
472
+ } });
473
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() {
474
+ return errors_js_1.ValidationError;
475
+ } });
476
+ Object.defineProperty(exports, "AuthError", { enumerable: true, get: function() {
477
+ return errors_js_1.AuthError;
478
+ } });
479
+ Object.defineProperty(exports, "ExternalServiceError", { enumerable: true, get: function() {
480
+ return errors_js_1.ExternalServiceError;
481
+ } });
482
+ Object.defineProperty(exports, "QueueError", { enumerable: true, get: function() {
483
+ return errors_js_1.QueueError;
484
+ } });
485
+ Object.defineProperty(exports, "SearchError", { enumerable: true, get: function() {
486
+ return errors_js_1.SearchError;
487
+ } });
488
+ Object.defineProperty(exports, "IndexerError", { enumerable: true, get: function() {
489
+ return errors_js_1.IndexerError;
490
+ } });
491
+ Object.defineProperty(exports, "VectorError", { enumerable: true, get: function() {
492
+ return errors_js_1.VectorError;
493
+ } });
494
+ var serializers_js_1 = require_serializers();
495
+ Object.defineProperty(exports, "errorSerializer", { enumerable: true, get: function() {
496
+ return serializers_js_1.errorSerializer;
497
+ } });
498
+ var logger_js_1 = require_logger();
499
+ Object.defineProperty(exports, "createMcpLogger", { enumerable: true, get: function() {
500
+ return logger_js_1.createMcpLogger;
501
+ } });
502
+ Object.defineProperty(exports, "createLogger", { enumerable: true, get: function() {
503
+ return logger_js_1.createLogger;
504
+ } });
505
+ var mcp_error_wrapper_js_1 = require_mcp_error_wrapper();
506
+ Object.defineProperty(exports, "withErrorHandling", { enumerable: true, get: function() {
507
+ return mcp_error_wrapper_js_1.withErrorHandling;
508
+ } });
509
+ }
510
+ });
511
+
80
512
  // src/index.prod.ts
81
513
  init_esm_shims();
82
514
  var import_config4 = __toESM(require_dist(), 1);
515
+ var import_errors11 = __toESM(require_dist2(), 1);
83
516
  import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
84
517
 
85
518
  // ../../packages/remote/dist/index.js
@@ -87,6 +520,7 @@ init_esm_shims();
87
520
 
88
521
  // ../../packages/remote/dist/client.js
89
522
  init_esm_shims();
523
+ var import_errors = __toESM(require_dist2(), 1);
90
524
  var DEFAULT_TIMEOUT_MS = 3e4;
91
525
  var ToolCairnClient = class {
92
526
  baseUrl;
@@ -167,7 +601,7 @@ var ToolCairnClient = class {
167
601
  type: "text",
168
602
  text: JSON.stringify({
169
603
  ok: false,
170
- error: "network_error",
604
+ error: import_errors.ErrorCode.ERR_NETWORK_UNREACHABLE,
171
605
  message: `ToolCairn API unreachable: ${msg}. Check your internet connection or try again later.`
172
606
  })
173
607
  }
@@ -287,6 +721,7 @@ async function clearAuthentication() {
287
721
 
288
722
  // ../../packages/remote/dist/device-auth.js
289
723
  init_esm_shims();
724
+ var import_errors2 = __toESM(require_dist2(), 1);
290
725
  async function openBrowser(url) {
291
726
  const { spawn } = await import("child_process");
292
727
  try {
@@ -310,8 +745,12 @@ async function openBrowser(url) {
310
745
  }
311
746
  async function requestDeviceCode(apiUrl) {
312
747
  const res = await fetch(`${apiUrl}/v1/auth/device-code`, { method: "POST" });
313
- if (!res.ok)
314
- throw new Error("Failed to start device auth. Check your internet connection.");
748
+ if (!res.ok) {
749
+ throw new import_errors2.NetworkError({
750
+ code: import_errors2.ErrorCode.ERR_NETWORK_UNREACHABLE,
751
+ message: "Failed to start device auth. Check your internet connection."
752
+ });
753
+ }
315
754
  const data = await res.json();
316
755
  await savePendingAuth({
317
756
  device_code: data.device_code,
@@ -379,10 +818,17 @@ async function pollForToken(apiUrl, deviceCode, intervalSec) {
379
818
  continue;
380
819
  if (data.error === "expired_token") {
381
820
  await clearPendingAuth();
382
- throw new Error("Device code expired. Please try again.");
821
+ throw new import_errors2.AuthError({
822
+ code: import_errors2.ErrorCode.ERR_AUTH_TOKEN_EXPIRED,
823
+ message: "Device code expired. Please try again."
824
+ });
825
+ }
826
+ if (data.error) {
827
+ throw new import_errors2.AuthError({
828
+ code: import_errors2.ErrorCode.ERR_AUTH_UNAUTHORIZED,
829
+ message: `Authorization failed: ${data.error}`
830
+ });
383
831
  }
384
- if (data.error)
385
- throw new Error(`Authorization failed: ${data.error}`);
386
832
  if (data.access_token)
387
833
  return data;
388
834
  }
@@ -392,15 +838,14 @@ function sleep(ms) {
392
838
  }
393
839
 
394
840
  // src/index.prod.ts
395
- import pino9 from "pino";
396
841
  import { z as z3 } from "zod";
397
842
 
398
843
  // src/project-setup.ts
399
844
  init_esm_shims();
845
+ var import_errors3 = __toESM(require_dist2(), 1);
400
846
  import { access, mkdir as mkdir2, writeFile as writeFile2 } from "fs/promises";
401
847
  import { platform, type } from "os";
402
848
  import { join as join2 } from "path";
403
- import pino from "pino";
404
849
 
405
850
  // src/tools/generate-tracker.ts
406
851
  init_esm_shims();
@@ -808,7 +1253,7 @@ if (!EVENTS_PATH || EVENTS_PATH === 'null') {
808
1253
  }
809
1254
 
810
1255
  // src/project-setup.ts
811
- var logger = pino({ name: "@toolcairn/mcp-server:project-setup" });
1256
+ var logger = (0, import_errors3.createMcpLogger)({ name: "@toolcairn/mcp-server:project-setup" });
812
1257
  var INITIAL_CONFIG = {
813
1258
  version: "1.0",
814
1259
  project: {
@@ -875,6 +1320,7 @@ async function createIfAbsent(filePath, content, label) {
875
1320
  // src/server.prod.ts
876
1321
  init_esm_shims();
877
1322
  var import_config2 = __toESM(require_dist(), 1);
1323
+ var import_errors10 = __toESM(require_dist2(), 1);
878
1324
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
879
1325
 
880
1326
  // ../../packages/tools-local/dist/index.js
@@ -1021,8 +1467,8 @@ function errResult(error, message) {
1021
1467
 
1022
1468
  // ../../packages/tools-local/dist/handlers/classify-prompt.js
1023
1469
  init_esm_shims();
1024
- import pino2 from "pino";
1025
- var logger2 = pino2({ name: "@toolcairn/tools:classify-prompt" });
1470
+ var import_errors4 = __toESM(require_dist2(), 1);
1471
+ var logger2 = (0, import_errors4.createMcpLogger)({ name: "@toolcairn/tools:classify-prompt" });
1026
1472
  var TOOL_REQUIRED_CLASSIFICATIONS = [
1027
1473
  "tool_discovery",
1028
1474
  "stack_building",
@@ -1083,7 +1529,7 @@ Respond with ONLY 0 or 1.`;
1083
1529
 
1084
1530
  // ../../packages/tools-local/dist/handlers/toolcairn-init.js
1085
1531
  init_esm_shims();
1086
- import pino3 from "pino";
1532
+ var import_errors5 = __toESM(require_dist2(), 1);
1087
1533
 
1088
1534
  // ../../packages/tools-local/dist/templates/agent-instructions.js
1089
1535
  init_esm_shims();
@@ -1633,7 +2079,7 @@ if (!EVENTS_PATH || EVENTS_PATH === 'null') {
1633
2079
  }
1634
2080
 
1635
2081
  // ../../packages/tools-local/dist/handlers/toolcairn-init.js
1636
- var logger3 = pino3({ name: "@toolcairn/tools:toolpilot-init" });
2082
+ var logger3 = (0, import_errors5.createMcpLogger)({ name: "@toolcairn/tools:toolpilot-init" });
1637
2083
  async function handleToolcairnInit(args) {
1638
2084
  try {
1639
2085
  logger3.info({ agent: args.agent, project_root: args.project_root }, "toolpilot_init called");
@@ -1721,8 +2167,8 @@ async function handleToolcairnInit(args) {
1721
2167
 
1722
2168
  // ../../packages/tools-local/dist/handlers/init-project-config.js
1723
2169
  init_esm_shims();
1724
- import pino4 from "pino";
1725
- var logger4 = pino4({ name: "@toolcairn/tools:init-project-config" });
2170
+ var import_errors6 = __toESM(require_dist2(), 1);
2171
+ var logger4 = (0, import_errors6.createMcpLogger)({ name: "@toolcairn/tools:init-project-config" });
1726
2172
  async function handleInitProjectConfig(args) {
1727
2173
  try {
1728
2174
  logger4.info({ project: args.project_name }, "init_project_config called");
@@ -1771,8 +2217,8 @@ async function handleInitProjectConfig(args) {
1771
2217
 
1772
2218
  // ../../packages/tools-local/dist/handlers/read-project-config.js
1773
2219
  init_esm_shims();
1774
- import pino5 from "pino";
1775
- var logger5 = pino5({ name: "@toolcairn/tools:read-project-config" });
2220
+ var import_errors7 = __toESM(require_dist2(), 1);
2221
+ var logger5 = (0, import_errors7.createMcpLogger)({ name: "@toolcairn/tools:read-project-config" });
1776
2222
  var STALENESS_THRESHOLD_DAYS = 90;
1777
2223
  function daysSince(isoDate) {
1778
2224
  return (Date.now() - new Date(isoDate).getTime()) / (1e3 * 60 * 60 * 24);
@@ -1832,8 +2278,8 @@ async function handleReadProjectConfig(args) {
1832
2278
 
1833
2279
  // ../../packages/tools-local/dist/handlers/update-project-config.js
1834
2280
  init_esm_shims();
1835
- import pino6 from "pino";
1836
- var logger6 = pino6({ name: "@toolcairn/tools:update-project-config" });
2281
+ var import_errors8 = __toESM(require_dist2(), 1);
2282
+ var logger6 = (0, import_errors8.createMcpLogger)({ name: "@toolcairn/tools:update-project-config" });
1837
2283
  async function handleUpdateProjectConfig(args) {
1838
2284
  try {
1839
2285
  logger6.info({ action: args.action, tool: args.tool_name }, "update_project_config called");
@@ -1940,16 +2386,15 @@ async function handleUpdateProjectConfig(args) {
1940
2386
  }
1941
2387
 
1942
2388
  // src/server.prod.ts
1943
- import pino8 from "pino";
1944
2389
  import { z as z2 } from "zod";
1945
2390
 
1946
2391
  // src/middleware/event-logger.ts
1947
2392
  init_esm_shims();
1948
2393
  var import_config = __toESM(require_dist(), 1);
2394
+ var import_errors9 = __toESM(require_dist2(), 1);
1949
2395
  import { appendFile, mkdir as mkdir3 } from "fs/promises";
1950
2396
  import { dirname } from "path";
1951
- import pino7 from "pino";
1952
- var logger7 = pino7({ name: "@toolcairn/mcp-server:event-logger" });
2397
+ var logger7 = (0, import_errors9.createMcpLogger)({ name: "@toolcairn/mcp-server:event-logger" });
1953
2398
  function isTrackingEnabled() {
1954
2399
  return process.env.TOOLCAIRN_TRACKING_ENABLED !== "false";
1955
2400
  }
@@ -2001,7 +2446,7 @@ async function sendToApi(event) {
2001
2446
  const creds = await loadCredentials();
2002
2447
  if (!creds) return;
2003
2448
  const headers = { "Content-Type": "application/json" };
2004
- if (creds.access_token) headers["Authorization"] = `Bearer ${creds.access_token}`;
2449
+ if (creds.access_token) headers.Authorization = `Bearer ${creds.access_token}`;
2005
2450
  if (creds.client_id) headers["X-ToolCairn-Key"] = creds.client_id;
2006
2451
  await fetch(`${import_config.config.TOOLPILOT_API_URL}/v1/events`, {
2007
2452
  method: "POST",
@@ -2056,7 +2501,7 @@ function withEventLogging(toolName, handler) {
2056
2501
  }
2057
2502
 
2058
2503
  // src/server.prod.ts
2059
- var logger8 = pino8({ name: "@toolcairn/mcp-server:prod" });
2504
+ var logger8 = (0, import_errors10.createMcpLogger)({ name: "@toolcairn/mcp-server:prod" });
2060
2505
  var SETUP_INSTRUCTIONS = `
2061
2506
  # ToolCairn \u2014 Agent Setup Instructions
2062
2507
 
@@ -2111,13 +2556,19 @@ async function addToolsToServer(server) {
2111
2556
  accessToken: creds.access_token
2112
2557
  });
2113
2558
  logger8.info({ user: creds.user_email }, "Registering production tools");
2559
+ function wrap(toolName, fn) {
2560
+ return withEventLogging(toolName, (0, import_errors10.withErrorHandling)(toolName, logger8, fn));
2561
+ }
2114
2562
  server.registerTool(
2115
2563
  "classify_prompt",
2116
2564
  {
2117
2565
  description: "Classify a developer prompt to determine if ToolCairn tool search is needed. Returns a structured classification prompt for the agent to evaluate.",
2118
2566
  inputSchema: classifyPromptSchema
2119
2567
  },
2120
- withEventLogging("classify_prompt", async (args) => handleClassifyPrompt(args))
2568
+ wrap(
2569
+ "classify_prompt",
2570
+ async (args) => handleClassifyPrompt(args)
2571
+ )
2121
2572
  );
2122
2573
  server.registerTool(
2123
2574
  "toolcairn_init",
@@ -2125,7 +2576,10 @@ async function addToolsToServer(server) {
2125
2576
  description: "Set up ToolCairn integration for the current project. Generates agent instruction content, MCP config entry, and project config initializer.",
2126
2577
  inputSchema: toolpilotInitSchema
2127
2578
  },
2128
- withEventLogging("toolcairn_init", async (args) => handleToolcairnInit(args))
2579
+ wrap(
2580
+ "toolcairn_init",
2581
+ async (args) => handleToolcairnInit(args)
2582
+ )
2129
2583
  );
2130
2584
  server.registerTool(
2131
2585
  "init_project_config",
@@ -2133,7 +2587,10 @@ async function addToolsToServer(server) {
2133
2587
  description: "Initialize a .toolcairn/config.json file for the current project. Returns the config JSON for the agent to write to disk.",
2134
2588
  inputSchema: initProjectConfigSchema
2135
2589
  },
2136
- withEventLogging("init_project_config", async (args) => handleInitProjectConfig(args))
2590
+ wrap(
2591
+ "init_project_config",
2592
+ async (args) => handleInitProjectConfig(args)
2593
+ )
2137
2594
  );
2138
2595
  server.registerTool(
2139
2596
  "read_project_config",
@@ -2141,7 +2598,10 @@ async function addToolsToServer(server) {
2141
2598
  description: "Parse and validate a .toolcairn/config.json file. Returns confirmed tools, pending evaluations, stale tools, and agent instructions.",
2142
2599
  inputSchema: readProjectConfigSchema
2143
2600
  },
2144
- withEventLogging("read_project_config", async (args) => handleReadProjectConfig(args))
2601
+ wrap(
2602
+ "read_project_config",
2603
+ async (args) => handleReadProjectConfig(args)
2604
+ )
2145
2605
  );
2146
2606
  server.registerTool(
2147
2607
  "update_project_config",
@@ -2149,7 +2609,10 @@ async function addToolsToServer(server) {
2149
2609
  description: "Apply a mutation to .toolcairn/config.json and return the updated content. Actions: add_tool, remove_tool, update_tool, add_evaluation.",
2150
2610
  inputSchema: updateProjectConfigSchema
2151
2611
  },
2152
- withEventLogging("update_project_config", async (args) => handleUpdateProjectConfig(args))
2612
+ wrap(
2613
+ "update_project_config",
2614
+ async (args) => handleUpdateProjectConfig(args)
2615
+ )
2153
2616
  );
2154
2617
  server.registerTool(
2155
2618
  "search_tools",
@@ -2157,7 +2620,7 @@ async function addToolsToServer(server) {
2157
2620
  description: "Search for the best tool for a specific need using a natural language query. Initiates a guided discovery session with clarification questions when needed.",
2158
2621
  inputSchema: searchToolsSchema
2159
2622
  },
2160
- withEventLogging("search_tools", async (args) => remote.searchTools(args))
2623
+ wrap("search_tools", async (args) => remote.searchTools(args))
2161
2624
  );
2162
2625
  server.registerTool(
2163
2626
  "search_tools_respond",
@@ -2165,15 +2628,15 @@ async function addToolsToServer(server) {
2165
2628
  description: "Submit clarification answers for an in-progress tool search session and receive refined results.",
2166
2629
  inputSchema: searchToolsRespondSchema
2167
2630
  },
2168
- withEventLogging("search_tools_respond", async (args) => remote.searchToolsRespond(args))
2631
+ wrap("search_tools_respond", async (args) => remote.searchToolsRespond(args))
2169
2632
  );
2170
2633
  server.registerTool(
2171
2634
  "get_stack",
2172
2635
  {
2173
- description: "Get a recommended tool stack for a specific use case with optional deployment and language constraints.",
2636
+ description: "Build a complementary tool stack for a project use case. Returns diverse, integration-aware tools across different functional layers (not competing alternatives), with docs, health signals, and notes on how stack members integrate with each other.",
2174
2637
  inputSchema: getStackSchema
2175
2638
  },
2176
- withEventLogging("get_stack", async (args) => remote.getStack(args))
2639
+ wrap("get_stack", async (args) => remote.getStack(args))
2177
2640
  );
2178
2641
  server.registerTool(
2179
2642
  "check_compatibility",
@@ -2181,7 +2644,7 @@ async function addToolsToServer(server) {
2181
2644
  description: "Check compatibility between two tools. Returns direct graph relationships and inferred compatibility from shared neighbors.",
2182
2645
  inputSchema: checkCompatibilitySchema
2183
2646
  },
2184
- withEventLogging("check_compatibility", async (args) => remote.checkCompatibility(args))
2647
+ wrap("check_compatibility", async (args) => remote.checkCompatibility(args))
2185
2648
  );
2186
2649
  server.registerTool(
2187
2650
  "compare_tools",
@@ -2189,7 +2652,7 @@ async function addToolsToServer(server) {
2189
2652
  description: "Compare two tools head-to-head using health signals, graph relationships, and community data.",
2190
2653
  inputSchema: compareToolsSchema
2191
2654
  },
2192
- withEventLogging("compare_tools", async (args) => remote.compareTools(args))
2655
+ wrap("compare_tools", async (args) => remote.compareTools(args))
2193
2656
  );
2194
2657
  server.registerTool(
2195
2658
  "refine_requirement",
@@ -2197,7 +2660,7 @@ async function addToolsToServer(server) {
2197
2660
  description: "Decompose a vague user use-case into specific, searchable tool requirements.",
2198
2661
  inputSchema: refineRequirementSchema
2199
2662
  },
2200
- withEventLogging("refine_requirement", async (args) => remote.refineRequirement(args))
2663
+ wrap("refine_requirement", async (args) => remote.refineRequirement(args))
2201
2664
  );
2202
2665
  server.registerTool(
2203
2666
  "check_issue",
@@ -2205,7 +2668,7 @@ async function addToolsToServer(server) {
2205
2668
  description: "LAST RESORT \u2014 check GitHub Issues for a known error after 4+ retries and docs review.",
2206
2669
  inputSchema: checkIssueSchema
2207
2670
  },
2208
- withEventLogging("check_issue", async (args) => remote.checkIssue(args))
2671
+ wrap("check_issue", async (args) => remote.checkIssue(args))
2209
2672
  );
2210
2673
  server.registerTool(
2211
2674
  "verify_suggestion",
@@ -2213,7 +2676,7 @@ async function addToolsToServer(server) {
2213
2676
  description: "Validate agent-suggested tools against the ToolCairn graph.",
2214
2677
  inputSchema: verifySuggestionSchema
2215
2678
  },
2216
- withEventLogging("verify_suggestion", async (args) => remote.verifySuggestion(args))
2679
+ wrap("verify_suggestion", async (args) => remote.verifySuggestion(args))
2217
2680
  );
2218
2681
  server.registerTool(
2219
2682
  "report_outcome",
@@ -2221,7 +2684,7 @@ async function addToolsToServer(server) {
2221
2684
  description: "Report the outcome of using a tool recommended by ToolCairn (fire-and-forget).",
2222
2685
  inputSchema: reportOutcomeSchema
2223
2686
  },
2224
- withEventLogging("report_outcome", async (args) => remote.reportOutcome(args))
2687
+ wrap("report_outcome", async (args) => remote.reportOutcome(args))
2225
2688
  );
2226
2689
  server.registerTool(
2227
2690
  "suggest_graph_update",
@@ -2229,7 +2692,7 @@ async function addToolsToServer(server) {
2229
2692
  description: "Suggest a new tool, relationship, use case, or health update to the ToolCairn graph.",
2230
2693
  inputSchema: suggestGraphUpdateSchema
2231
2694
  },
2232
- withEventLogging("suggest_graph_update", async (args) => remote.suggestGraphUpdate(args))
2695
+ wrap("suggest_graph_update", async (args) => remote.suggestGraphUpdate(args))
2233
2696
  );
2234
2697
  server.registerTool(
2235
2698
  "toolcairn_auth",
@@ -2323,7 +2786,7 @@ function createTransport() {
2323
2786
 
2324
2787
  // src/index.prod.ts
2325
2788
  process.env.TOOLPILOT_MODE = "production";
2326
- var logger9 = pino9({ name: "@toolcairn/mcp-server" });
2789
+ var logger9 = (0, import_errors11.createMcpLogger)({ name: "@toolcairn/mcp-server" });
2327
2790
  async function main() {
2328
2791
  await ensureProjectSetup();
2329
2792
  const creds = await loadCredentials();
@@ -2396,7 +2859,10 @@ Open the URL, sign in, and confirm the code shown. All 14 tools will appear auto
2396
2859
  logger9.info(authenticated ? "ToolCairn MCP ready" : "ToolCairn MCP ready (awaiting sign-in)");
2397
2860
  }
2398
2861
  main().catch((error) => {
2399
- pino9({ name: "@toolcairn/mcp-server" }).error({ err: error }, "Failed to start MCP server");
2862
+ (0, import_errors11.createMcpLogger)({ name: "@toolcairn/mcp-server" }).error(
2863
+ { err: error },
2864
+ "Failed to start MCP server"
2865
+ );
2400
2866
  process.exit(1);
2401
2867
  });
2402
2868
  //# sourceMappingURL=index.js.map