@insightsentry/mcp 1.4.42 → 1.4.44

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 +36 -2
  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 +67 -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 +14 -8
  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 +20 -10
  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";
@@ -287,6 +287,7 @@ const toolExamples = {
287
287
  'insight get_symbol_history_period --symbol "NASDAQ:AAPL" --bar_type minute --start_date 2025-01',
288
288
  ],
289
289
  get_sip_quotes: ['insight get_sip_quotes --codes "SIP:AAPL,SIP:MSFT"'],
290
+ get_sip_trades: ['insight get_sip_trades --code "SIP:AAPL" --date YYYY-MM-DD'],
290
291
  get_sip_series: [
291
292
  'insight get_sip_series --code "SIP:AAPL" --bar_type minute --bar_interval 5 --dp 100',
292
293
  ],
@@ -437,6 +438,20 @@ function formatTypeName(t) {
437
438
  }
438
439
  const REQUIRED_DOWNLOAD_HISTORY_ARGS = ["symbol", "bar_type", "from", "to", "output_dir"];
439
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
+ }
440
455
  try {
441
456
  await runCliInner(argv, io);
442
457
  }
@@ -448,6 +463,9 @@ export async function runCli(argv, io) {
448
463
  }
449
464
  throw error;
450
465
  }
466
+ finally {
467
+ refresh.abort();
468
+ }
451
469
  }
452
470
  function isPromptAbortError(error) {
453
471
  if (!error || typeof error !== "object")
@@ -484,6 +502,18 @@ async function runCliInner(argv, io) {
484
502
  io.exit(0);
485
503
  return;
486
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
+ }
487
517
  // Built-in commands
488
518
  if (toolName === "login") {
489
519
  const key = await resolveLoginKey(args, io);
@@ -581,6 +611,7 @@ async function runCliInner(argv, io) {
581
611
  }
582
612
  reportArgUsage(io, historyArgs, Object.keys(downloadHistorySchema), inputArgs);
583
613
  const result = await downloadHistory(parseDownloadHistoryArgs(historyArgs), {
614
+ signal: io.signal,
584
615
  request,
585
616
  onProgress: (event) => {
586
617
  const target = event.files.length ? ` -> ${event.files.join(", ")}` : "";
@@ -589,6 +620,8 @@ async function runCliInner(argv, io) {
589
620
  },
590
621
  });
591
622
  io.write(JSON.stringify(result, null, 2));
623
+ if (result.failed > 0)
624
+ io.exit(1);
592
625
  await maybeWritePostToolUpgradeNotice(io);
593
626
  }
594
627
  catch (error) {
@@ -635,7 +668,7 @@ async function runCliInner(argv, io) {
635
668
  const { config, width, height } = parseRenderChartArgs(resolvedArgs);
636
669
  reportArgUsage(io, resolvedArgs, Object.keys(RENDER_CHART_SCHEMA), inputArgs);
637
670
  const renderer = io.renderChart ?? renderChart;
638
- const result = await renderer(config, width, height);
671
+ const result = await renderer(config, width, height, io.signal);
639
672
  io.write(JSON.stringify({
640
673
  file: result.filePath,
641
674
  mime_type: "image/png",
@@ -730,6 +763,7 @@ async function runCliInner(argv, io) {
730
763
  toolName: tool.name,
731
764
  method: tool.method,
732
765
  pathTemplate: tool.pathTemplate,
766
+ signal: io.signal,
733
767
  args: coerceArgs(apiArgs, tool.schema),
734
768
  request,
735
769
  });
@@ -1106,7 +1140,7 @@ async function runVersionCommand(io) {
1106
1140
  async function maybeWritePostToolUpgradeNotice(io) {
1107
1141
  if (!io.writeNotice)
1108
1142
  return;
1109
- const status = await getCachedVersionStatus(io);
1143
+ const status = peekVersionStatus(PACKAGE_JSON, getVersionCacheLocation());
1110
1144
  const notice = formatUpgradeNotice(status);
1111
1145
  if (notice)
1112
1146
  io.writeNotice(notice);
@@ -1205,7 +1239,7 @@ function resolveRequest(io, apiKeyOverride) {
1205
1239
  const client = new ApiClient(apiKey, {
1206
1240
  onRetry: (event) => io.progress?.(formatRetryNotice(event)),
1207
1241
  });
1208
- return (method, path, params) => client.request(method, path, params);
1242
+ return (method, path, params, options) => client.request(method, path, params, options);
1209
1243
  }
1210
1244
  function formatRetryNotice(event) {
1211
1245
  const seconds = Math.max(1, Math.ceil(event.delayMs / 1000));
@@ -1276,13 +1310,27 @@ async function resolveToolArgs(args, tool, io) {
1276
1310
  resolved[key] = answer;
1277
1311
  }
1278
1312
  }
1279
- const storageAnswer = await resolveInteractiveStorageMode(resolved, tool.name, io);
1280
- if (storageAnswer === null)
1281
- return null;
1282
- await resolveStorageDestination(resolved, tool.name, io);
1283
- const filterAnswer = await resolveInteractiveFilter(resolved, io);
1284
- if (filterAnswer === null)
1285
- 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
+ }
1286
1334
  }
1287
1335
  else if (missingToolArgs(resolved, tool).length > 0) {
1288
1336
  return null;
@@ -1386,7 +1434,10 @@ async function promptForOptionalStorageDestinationArg(key, zodType, resolved, to
1386
1434
  }
1387
1435
  async function validateStorageDestinationAnswer(key, resolved, toolName, answer) {
1388
1436
  try {
1389
- await validateResponseStorageTarget({
1437
+ const validate = toolName === "get_document" && coerceArgs(resolved, { text: z.boolean() }).text === false
1438
+ ? validateDocumentStorageTarget
1439
+ : validateResponseStorageTarget;
1440
+ await validate({
1390
1441
  toolName,
1391
1442
  store: resolved.store,
1392
1443
  output_file: key === "output_file" ? answer : undefined,
@@ -2001,6 +2052,7 @@ export function main() {
2001
2052
  prompt: (question) => rl.question(question),
2002
2053
  selectTool: canUseKeyboardToolSelection() ? selectToolWithKeyboard : undefined,
2003
2054
  isInteractive: interactive,
2055
+ signal: streamAbort.signal,
2004
2056
  streamSignal: streamAbort.signal,
2005
2057
  getStreamSignalExitCode: () => signalExitCode,
2006
2058
  runStream: async (options) => {
@@ -2013,12 +2065,12 @@ export function main() {
2013
2065
  }
2014
2066
  },
2015
2067
  exit: (code) => {
2016
- process.exitCode = code;
2068
+ process.exitCode = signalExitCode ?? code;
2017
2069
  },
2018
2070
  })
2019
2071
  .catch((error) => {
2020
2072
  process.stderr.write(`Error: ${errorMessage(error)}\n`);
2021
- process.exitCode = 1;
2073
+ process.exitCode = signalExitCode ?? 1;
2022
2074
  })
2023
2075
  .finally(() => {
2024
2076
  process.removeListener("SIGINT", handleSigint);