@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.
- package/README.md +36 -2
- package/dist/api-client.d.ts +17 -5
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +125 -70
- package/dist/api-client.js.map +1 -1
- package/dist/arg-coercion.js +10 -5
- package/dist/arg-coercion.js.map +1 -1
- package/dist/cancellation.d.ts +7 -0
- package/dist/cancellation.d.ts.map +1 -0
- package/dist/cancellation.js +48 -0
- package/dist/cancellation.js.map +1 -0
- package/dist/chart.d.ts +1 -1
- package/dist/chart.d.ts.map +1 -1
- package/dist/chart.js +96 -23
- package/dist/chart.js.map +1 -1
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +67 -15
- package/dist/cli.js.map +1 -1
- package/dist/csv.d.ts +14 -0
- package/dist/csv.d.ts.map +1 -0
- package/dist/csv.js +88 -0
- package/dist/csv.js.map +1 -0
- package/dist/history-merge.d.ts +2 -0
- package/dist/history-merge.d.ts.map +1 -0
- package/dist/history-merge.js +238 -0
- package/dist/history-merge.js.map +1 -0
- package/dist/history.d.ts +3 -1
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +59 -100
- package/dist/history.js.map +1 -1
- package/dist/index.js +14 -8
- package/dist/index.js.map +1 -1
- package/dist/response-storage.d.ts +7 -0
- package/dist/response-storage.d.ts.map +1 -1
- package/dist/response-storage.js +15 -2
- package/dist/response-storage.js.map +1 -1
- package/dist/tool-definitions.d.ts.map +1 -1
- package/dist/tool-definitions.js +20 -10
- package/dist/tool-definitions.js.map +1 -1
- package/dist/tool-runner.d.ts +3 -1
- package/dist/tool-runner.d.ts.map +1 -1
- package/dist/tool-runner.js +23 -3
- package/dist/tool-runner.js.map +1 -1
- package/dist/version-status.d.ts +4 -2
- package/dist/version-status.d.ts.map +1 -1
- package/dist/version-status.js +83 -33
- package/dist/version-status.js.map +1 -1
- package/dist/websocket-stream.js +2 -2
- package/dist/websocket-stream.js.map +1 -1
- package/package.json +2 -2
package/dist/chart.js
CHANGED
|
@@ -1,32 +1,105 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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,
|
|
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
|
|
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":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;
|
|
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 =
|
|
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
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
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
|
-
|
|
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);
|