@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.
- package/README.md +44 -3
- 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 +66 -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 +22 -11
- 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 +19 -4
- 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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,gFAAgF;AAChF,gFAAgF;AAChF,MAAM,aAAc,SAAQ,iBAAiB;IAC3C;QACE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,MAA0B,EAAE,KAAa,EAAE,MAAc;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,CAAC,MAA8B,EAAE;gBAChD,GAAG,MAAM;gBACT,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;gBACnE,OAAO,EAAE;oBACP,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBACzB;wBACE,EAAE,EAAE,0BAA0B;wBAC9B,UAAU,CAAC,KAAK;4BACd,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;4BACtB,GAAG,CAAC,IAAI,EAAE,CAAC;4BACX,GAAG,CAAC,wBAAwB,GAAG,kBAAkB,CAAC;4BAClD,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;4BACxB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;4BAC9C,GAAG,CAAC,OAAO,EAAE,CAAC;wBAChB,CAAC;qBACF;iBACF;aACF,CAAC,CAAC;YACH,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChC,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACpB,OAAO,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC,EAAE,WAAW,CAAC,CAChB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAsC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC1E,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;CACF;AACD,MAAM,aAAa,GAAoB,EAAE,CAAC;AAC1C,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,MAAM,OAAO,GAAsB,EAAE,CAAC;AAEtC,KAAK,UAAU,OAAO,CAAC,MAAoB;IACzC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW;QAC/B,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,IAAI,MAAmB,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC1C,MAAM,GAAG,OAAO,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;;YACpC,OAAO,EAAE,CAAC,CAAC,oDAAoD;QACpE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,OAAO;IACd,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,IAAI,IAAI;QAAE,IAAI,EAAE,CAAC;;QACZ,MAAM,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAA0B,EAC1B,QAAgB,aAAa,EAC7B,SAAiB,cAAc,EAC/B,MAAoB;IAEpB,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,IAAI,QAAmC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,QAAQ,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,IAAI,aAAa,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3E,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACzD,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ;YAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
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";
|
|
@@ -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 =
|
|
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
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
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
|
-
|
|
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);
|