@insightsentry/mcp 1.4.43 → 1.4.45

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 (51) hide show
  1. package/README.md +44 -3
  2. package/dist/api-client.d.ts +17 -5
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/api-client.js +125 -70
  5. package/dist/api-client.js.map +1 -1
  6. package/dist/arg-coercion.js +10 -5
  7. package/dist/arg-coercion.js.map +1 -1
  8. package/dist/cancellation.d.ts +7 -0
  9. package/dist/cancellation.d.ts.map +1 -0
  10. package/dist/cancellation.js +48 -0
  11. package/dist/cancellation.js.map +1 -0
  12. package/dist/chart.d.ts +1 -1
  13. package/dist/chart.d.ts.map +1 -1
  14. package/dist/chart.js +96 -23
  15. package/dist/chart.js.map +1 -1
  16. package/dist/cli.d.ts +3 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +66 -15
  19. package/dist/cli.js.map +1 -1
  20. package/dist/csv.d.ts +14 -0
  21. package/dist/csv.d.ts.map +1 -0
  22. package/dist/csv.js +88 -0
  23. package/dist/csv.js.map +1 -0
  24. package/dist/history-merge.d.ts +2 -0
  25. package/dist/history-merge.d.ts.map +1 -0
  26. package/dist/history-merge.js +238 -0
  27. package/dist/history-merge.js.map +1 -0
  28. package/dist/history.d.ts +3 -1
  29. package/dist/history.d.ts.map +1 -1
  30. package/dist/history.js +59 -100
  31. package/dist/history.js.map +1 -1
  32. package/dist/index.js +22 -11
  33. package/dist/index.js.map +1 -1
  34. package/dist/response-storage.d.ts +7 -0
  35. package/dist/response-storage.d.ts.map +1 -1
  36. package/dist/response-storage.js +15 -2
  37. package/dist/response-storage.js.map +1 -1
  38. package/dist/tool-definitions.d.ts.map +1 -1
  39. package/dist/tool-definitions.js +19 -4
  40. package/dist/tool-definitions.js.map +1 -1
  41. package/dist/tool-runner.d.ts +3 -1
  42. package/dist/tool-runner.d.ts.map +1 -1
  43. package/dist/tool-runner.js +23 -3
  44. package/dist/tool-runner.js.map +1 -1
  45. package/dist/version-status.d.ts +4 -2
  46. package/dist/version-status.d.ts.map +1 -1
  47. package/dist/version-status.js +83 -33
  48. package/dist/version-status.js.map +1 -1
  49. package/dist/websocket-stream.js +2 -2
  50. package/dist/websocket-stream.js.map +1 -1
  51. package/package.json +2 -2
package/dist/chart.js CHANGED
@@ -1,32 +1,105 @@
1
- import { writeFileSync } from "node:fs";
1
+ import { randomUUID } from "node:crypto";
2
+ import { writeFile } from "node:fs/promises";
2
3
  import { tmpdir } from "node:os";
3
4
  import { join } from "node:path";
4
5
  import { ChartJSNodeCanvas } from "chartjs-node-canvas";
6
+ import { abortable } from "./cancellation.js";
5
7
  const DEFAULT_WIDTH = 800;
6
8
  const DEFAULT_HEIGHT = 400;
7
- // Cache canvases by dimension to avoid re-creating them
8
- const canvasCache = new Map();
9
- function getCanvas(width, height) {
10
- const key = `${width}x${height}`;
11
- let canvas = canvasCache.get(key);
12
- if (!canvas) {
13
- canvas = new ChartJSNodeCanvas({
14
- width,
15
- height,
16
- backgroundColour: "white",
17
- });
18
- canvasCache.set(key, canvas);
9
+ const MAX_ACTIVE = 2;
10
+ const MAX_PENDING = 32;
11
+ // Reuse the installed renderer's protected canvas/Chart.js facilities. Creating
12
+ // a renderer for every dimension reloads Chart.js and retains module instances.
13
+ class SizedRenderer extends ChartJSNodeCanvas {
14
+ constructor() {
15
+ super({ width: 1, height: 1 });
19
16
  }
20
- return canvas;
17
+ async renderSized(config, width, height) {
18
+ const canvas = this._createCanvas(width, height);
19
+ try {
20
+ new this._chartJs(canvas, {
21
+ ...config,
22
+ options: { ...config.options, responsive: false, animation: false },
23
+ plugins: [
24
+ ...(config.plugins ?? []),
25
+ {
26
+ id: "insight-white-background",
27
+ beforeDraw(chart) {
28
+ const ctx = chart.ctx;
29
+ ctx.save();
30
+ ctx.globalCompositeOperation = "destination-over";
31
+ ctx.fillStyle = "white";
32
+ ctx.fillRect(0, 0, chart.width, chart.height);
33
+ ctx.restore();
34
+ },
35
+ },
36
+ ],
37
+ });
38
+ return await new Promise((resolve, reject) => canvas.toBuffer((error, buffer) => {
39
+ if (error)
40
+ reject(error);
41
+ else
42
+ resolve(buffer);
43
+ }, "image/png"));
44
+ }
45
+ finally {
46
+ this._chartJs.getChart(canvas)?.destroy();
47
+ canvas.width = 0;
48
+ canvas.height = 0;
49
+ }
50
+ }
51
+ }
52
+ const idleRenderers = [];
53
+ let active = 0;
54
+ const pending = [];
55
+ async function acquire(signal) {
56
+ signal?.throwIfAborted();
57
+ if (active < MAX_ACTIVE) {
58
+ active++;
59
+ return;
60
+ }
61
+ if (pending.length >= MAX_PENDING)
62
+ throw new Error("Chart renderer is busy. Retry render_chart after the current renders finish.");
63
+ let resume;
64
+ const ready = new Promise((resolve) => {
65
+ resume = resolve;
66
+ pending.push(resume);
67
+ });
68
+ try {
69
+ await abortable(ready, signal);
70
+ }
71
+ catch (error) {
72
+ const index = pending.indexOf(resume);
73
+ if (index >= 0)
74
+ pending.splice(index, 1);
75
+ else
76
+ release(); // The permit was assigned just before cancellation.
77
+ throw error;
78
+ }
79
+ }
80
+ function release() {
81
+ const next = pending.shift();
82
+ if (next)
83
+ next();
84
+ else
85
+ active--;
21
86
  }
22
- export async function renderChart(config, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT) {
23
- const canvas = getCanvas(width, height);
24
- const buffer = await canvas.renderToBuffer(config);
25
- const base64 = buffer.toString("base64");
26
- // Save to a temp file so the LLM can pass the path directly to the user
27
- const fileName = `insightsentry_chart_${Date.now()}.png`;
28
- const filePath = join(tmpdir(), fileName);
29
- writeFileSync(filePath, buffer);
30
- return { base64, filePath };
87
+ export async function renderChart(config, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT, signal) {
88
+ await acquire(signal);
89
+ let renderer;
90
+ try {
91
+ signal?.throwIfAborted();
92
+ renderer = idleRenderers.pop() ?? new SizedRenderer();
93
+ const buffer = await renderer.renderSized(config, width, height);
94
+ signal?.throwIfAborted();
95
+ const filePath = join(tmpdir(), `insightsentry_chart_${randomUUID()}.png`);
96
+ await writeFile(filePath, buffer, { flag: "wx" });
97
+ return { base64: buffer.toString("base64"), filePath };
98
+ }
99
+ finally {
100
+ if (renderer)
101
+ idleRenderers.push(renderer);
102
+ release();
103
+ }
31
104
  }
32
105
  //# sourceMappingURL=chart.js.map
package/dist/chart.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"chart.js","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,wDAAwD;AACxD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEzD,SAAS,SAAS,CAAC,KAAa,EAAE,MAAc;IAC9C,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,iBAAiB,CAAC;YAC7B,KAAK;YACL,MAAM;YACN,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QACH,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAA0B,EAC1B,QAAgB,aAAa,EAC7B,SAAiB,cAAc;IAE/B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,wEAAwE;IACxE,MAAM,QAAQ,GAAG,uBAAuB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1C,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"chart.js","sourceRoot":"","sources":["../src/chart.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { ChartConfiguration } from "chart.js";
2
+ import { type ApiRequestOptions } from "./api-client.js";
2
3
  import { type AuthStatus } from "./auth-status.js";
3
4
  import { type StreamOutput, type StreamOutputOptions } from "./stream-output.js";
4
5
  import { type ToolDefinition } from "./tool-definitions.js";
@@ -19,7 +20,7 @@ export declare function buildDownloadHistoryHelp(commandName?: string): string;
19
20
  export declare function buildRenderChartHelp(): string;
20
21
  export declare function buildStreamHelp(commandName: string): string;
21
22
  export declare function buildToolHelp(tool: ToolDefinition): string;
22
- type RequestFn = (method: string, pathTemplate: string, params: Record<string, any>) => Promise<any>;
23
+ type RequestFn = (method: string, pathTemplate: string, params: Record<string, any>, options?: ApiRequestOptions) => Promise<any>;
23
24
  type RunCommandFn = (command: string, args: string[]) => Promise<{
24
25
  stdout?: string;
25
26
  stderr?: string;
@@ -29,6 +30,7 @@ type RenderChartFn = (config: ChartConfiguration, width?: number, height?: numbe
29
30
  filePath: string;
30
31
  }>;
31
32
  interface CliIO {
33
+ signal?: AbortSignal;
32
34
  write: (s: string) => void;
33
35
  exit: (code: number) => void;
34
36
  request?: RequestFn;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -14,13 +14,13 @@ import { downloadHistorySchema } from "./download-history-schema.js";
14
14
  import { downloadHistory, validateOutputDirectory, } from "./history.js";
15
15
  import { validateHistoryIntervalArgs } from "./history-validation.js";
16
16
  import { PACKAGE_JSON } from "./package-info.js";
17
- import { supportsCsvStorage, validateResponseStorageTarget, } from "./response-storage.js";
17
+ import { supportsCsvStorage, validateDocumentStorageTarget, validateResponseStorageTarget, } from "./response-storage.js";
18
18
  import { createStreamOutput, } from "./stream-output.js";
19
19
  import { analyzeSymbolCodes, shouldPromptSymbolScopedParam } from "./symbol-param-applicability.js";
20
20
  import { validateSymbolLikeArg } from "./symbol-validation.js";
21
21
  import { toolDefinitions } from "./tool-definitions.js";
22
22
  import { runApiTool, validateFilterExpression } from "./tool-runner.js";
23
- import { fetchLatestPackageVersion, formatUpgradeNotice, formatVersionStatus, getVersionStatus, } from "./version-status.js";
23
+ import { fetchLatestPackageVersion, formatUpgradeNotice, formatVersionStatus, getVersionStatus, peekVersionStatus, } from "./version-status.js";
24
24
  import { buildLiveStreamRequest, buildNewsfeedStreamRequest, } from "./websocket-contract.js";
25
25
  import { LIVE_STREAM_SCHEMA, NEWSFEED_STREAM_SCHEMA, STREAM_OUTPUT_SCHEMA, } from "./websocket-schemas.js";
26
26
  import { runWebSocketStream, } from "./websocket-stream.js";
@@ -438,6 +438,20 @@ function formatTypeName(t) {
438
438
  }
439
439
  const REQUIRED_DOWNLOAD_HISTORY_ARGS = ["symbol", "bar_type", "from", "to", "output_dir"];
440
440
  export async function runCli(argv, io) {
441
+ const parsed = parseArgs(argv);
442
+ const refresh = new AbortController();
443
+ if (io.writeNotice &&
444
+ !parsed.help &&
445
+ !parsed.version &&
446
+ parsed.toolName &&
447
+ (toolDefinitions.some((tool) => tool.name === parsed.toolName) ||
448
+ isHistoryDownloadCommand(parsed.toolName) ||
449
+ parsed.toolName === "render_chart")) {
450
+ void getVersionStatus(PACKAGE_JSON, io.getLatestVersion ?? fetchLatestPackageVersion, {
451
+ cachePath: getVersionCacheLocation(),
452
+ signal: refresh.signal,
453
+ });
454
+ }
441
455
  try {
442
456
  await runCliInner(argv, io);
443
457
  }
@@ -449,6 +463,9 @@ export async function runCli(argv, io) {
449
463
  }
450
464
  throw error;
451
465
  }
466
+ finally {
467
+ refresh.abort();
468
+ }
452
469
  }
453
470
  function isPromptAbortError(error) {
454
471
  if (!error || typeof error !== "object")
@@ -485,6 +502,18 @@ async function runCliInner(argv, io) {
485
502
  io.exit(0);
486
503
  return;
487
504
  }
505
+ const builtinHelp = {
506
+ login: "Usage: insight login --key <api-key>\nSave your InsightSentry API key locally.",
507
+ logout: "Usage: insight logout\nRemove the saved API key.",
508
+ update: "Usage: insight update\nInstall the latest InsightSentry Tool package.",
509
+ version: "Usage: insight version\nShow installed and latest package versions.",
510
+ whoami: "Usage: insight whoami\nShow the configured user's email or UUID.",
511
+ };
512
+ if (help && builtinHelp[toolName]) {
513
+ io.write(builtinHelp[toolName]);
514
+ io.exit(0);
515
+ return;
516
+ }
488
517
  // Built-in commands
489
518
  if (toolName === "login") {
490
519
  const key = await resolveLoginKey(args, io);
@@ -582,6 +611,7 @@ async function runCliInner(argv, io) {
582
611
  }
583
612
  reportArgUsage(io, historyArgs, Object.keys(downloadHistorySchema), inputArgs);
584
613
  const result = await downloadHistory(parseDownloadHistoryArgs(historyArgs), {
614
+ signal: io.signal,
585
615
  request,
586
616
  onProgress: (event) => {
587
617
  const target = event.files.length ? ` -> ${event.files.join(", ")}` : "";
@@ -590,6 +620,8 @@ async function runCliInner(argv, io) {
590
620
  },
591
621
  });
592
622
  io.write(JSON.stringify(result, null, 2));
623
+ if (result.failed > 0)
624
+ io.exit(1);
593
625
  await maybeWritePostToolUpgradeNotice(io);
594
626
  }
595
627
  catch (error) {
@@ -636,7 +668,7 @@ async function runCliInner(argv, io) {
636
668
  const { config, width, height } = parseRenderChartArgs(resolvedArgs);
637
669
  reportArgUsage(io, resolvedArgs, Object.keys(RENDER_CHART_SCHEMA), inputArgs);
638
670
  const renderer = io.renderChart ?? renderChart;
639
- const result = await renderer(config, width, height);
671
+ const result = await renderer(config, width, height, io.signal);
640
672
  io.write(JSON.stringify({
641
673
  file: result.filePath,
642
674
  mime_type: "image/png",
@@ -731,6 +763,7 @@ async function runCliInner(argv, io) {
731
763
  toolName: tool.name,
732
764
  method: tool.method,
733
765
  pathTemplate: tool.pathTemplate,
766
+ signal: io.signal,
734
767
  args: coerceArgs(apiArgs, tool.schema),
735
768
  request,
736
769
  });
@@ -1107,7 +1140,7 @@ async function runVersionCommand(io) {
1107
1140
  async function maybeWritePostToolUpgradeNotice(io) {
1108
1141
  if (!io.writeNotice)
1109
1142
  return;
1110
- const status = await getCachedVersionStatus(io);
1143
+ const status = peekVersionStatus(PACKAGE_JSON, getVersionCacheLocation());
1111
1144
  const notice = formatUpgradeNotice(status);
1112
1145
  if (notice)
1113
1146
  io.writeNotice(notice);
@@ -1206,7 +1239,7 @@ function resolveRequest(io, apiKeyOverride) {
1206
1239
  const client = new ApiClient(apiKey, {
1207
1240
  onRetry: (event) => io.progress?.(formatRetryNotice(event)),
1208
1241
  });
1209
- return (method, path, params) => client.request(method, path, params);
1242
+ return (method, path, params, options) => client.request(method, path, params, options);
1210
1243
  }
1211
1244
  function formatRetryNotice(event) {
1212
1245
  const seconds = Math.max(1, Math.ceil(event.delayMs / 1000));
@@ -1277,13 +1310,27 @@ async function resolveToolArgs(args, tool, io) {
1277
1310
  resolved[key] = answer;
1278
1311
  }
1279
1312
  }
1280
- const storageAnswer = await resolveInteractiveStorageMode(resolved, tool.name, io);
1281
- if (storageAnswer === null)
1282
- return null;
1283
- await resolveStorageDestination(resolved, tool.name, io);
1284
- const filterAnswer = await resolveInteractiveFilter(resolved, io);
1285
- if (filterAnswer === null)
1286
- return null;
1313
+ if (tool.name === "get_document" && coerceArgs(resolved, tool.schema).text === false) {
1314
+ if (!resolved.output_file && !resolved.output_dir) {
1315
+ const answer = await promptForOptionalStorageDestinationArg("output_file", z
1316
+ .string()
1317
+ .describe("PDF file path. Leave blank to save under ./.tmp/insight.")
1318
+ .optional(), resolved, tool.name, io);
1319
+ if (answer === null)
1320
+ return null;
1321
+ if (answer !== undefined)
1322
+ resolved.output_file = answer;
1323
+ }
1324
+ }
1325
+ else {
1326
+ const storageAnswer = await resolveInteractiveStorageMode(resolved, tool.name, io);
1327
+ if (storageAnswer === null)
1328
+ return null;
1329
+ await resolveStorageDestination(resolved, tool.name, io);
1330
+ const filterAnswer = await resolveInteractiveFilter(resolved, io);
1331
+ if (filterAnswer === null)
1332
+ return null;
1333
+ }
1287
1334
  }
1288
1335
  else if (missingToolArgs(resolved, tool).length > 0) {
1289
1336
  return null;
@@ -1387,7 +1434,10 @@ async function promptForOptionalStorageDestinationArg(key, zodType, resolved, to
1387
1434
  }
1388
1435
  async function validateStorageDestinationAnswer(key, resolved, toolName, answer) {
1389
1436
  try {
1390
- await validateResponseStorageTarget({
1437
+ const validate = toolName === "get_document" && coerceArgs(resolved, { text: z.boolean() }).text === false
1438
+ ? validateDocumentStorageTarget
1439
+ : validateResponseStorageTarget;
1440
+ await validate({
1391
1441
  toolName,
1392
1442
  store: resolved.store,
1393
1443
  output_file: key === "output_file" ? answer : undefined,
@@ -2002,6 +2052,7 @@ export function main() {
2002
2052
  prompt: (question) => rl.question(question),
2003
2053
  selectTool: canUseKeyboardToolSelection() ? selectToolWithKeyboard : undefined,
2004
2054
  isInteractive: interactive,
2055
+ signal: streamAbort.signal,
2005
2056
  streamSignal: streamAbort.signal,
2006
2057
  getStreamSignalExitCode: () => signalExitCode,
2007
2058
  runStream: async (options) => {
@@ -2014,12 +2065,12 @@ export function main() {
2014
2065
  }
2015
2066
  },
2016
2067
  exit: (code) => {
2017
- process.exitCode = code;
2068
+ process.exitCode = signalExitCode ?? code;
2018
2069
  },
2019
2070
  })
2020
2071
  .catch((error) => {
2021
2072
  process.stderr.write(`Error: ${errorMessage(error)}\n`);
2022
- process.exitCode = 1;
2073
+ process.exitCode = signalExitCode ?? 1;
2023
2074
  })
2024
2075
  .finally(() => {
2025
2076
  process.removeListener("SIGINT", handleSigint);