@insightsentry/mcp 1.4.29 → 1.4.31
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 +2 -2
- package/dist/api-client.d.ts +12 -5
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +43 -35
- package/dist/api-client.js.map +1 -1
- package/dist/auth-status.d.ts.map +1 -1
- package/dist/auth-status.js +25 -8
- package/dist/auth-status.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -21
- package/dist/cli.js.map +1 -1
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +6 -2
- package/dist/history.js.map +1 -1
- package/dist/index.js +36 -12
- package/dist/index.js.map +1 -1
- package/dist/tool-definitions.d.ts.map +1 -1
- package/dist/tool-definitions.js +7 -3
- package/dist/tool-definitions.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ insight whoami
|
|
|
32
32
|
insight logout
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
`whoami` parses the configured JWT locally and prints `
|
|
35
|
+
`whoami` parses the configured JWT locally and prints `email`, falling back to `uuid`.
|
|
36
36
|
|
|
37
37
|
## MCP Setup
|
|
38
38
|
|
|
@@ -96,7 +96,7 @@ Auth and files:
|
|
|
96
96
|
|
|
97
97
|
| Tool | Purpose |
|
|
98
98
|
|------|---------|
|
|
99
|
-
| `whoami` | Print the configured user's
|
|
99
|
+
| `whoami` | Print the configured user's email/uuid from the API key JWT |
|
|
100
100
|
| `download_history` | Download date ranges to JSON/CSV files |
|
|
101
101
|
| `get_symbol_history` | Same as `download_history`; downloads history to files |
|
|
102
102
|
| `render_chart` | Render Chart.js configs as PNG images |
|
package/dist/api-client.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare class ApiError extends Error {
|
|
2
2
|
readonly status: number;
|
|
3
3
|
readonly apiMessage: string;
|
|
4
|
-
|
|
4
|
+
readonly body: unknown;
|
|
5
|
+
readonly retryAfterMs: number | null;
|
|
6
|
+
constructor(status: number, apiMessage: string, body?: unknown, retryAfterMs?: number | null);
|
|
5
7
|
get retryable(): boolean;
|
|
6
8
|
get terminal(): boolean;
|
|
7
9
|
}
|
|
@@ -9,12 +11,15 @@ export interface ApiClientOptions {
|
|
|
9
11
|
retryDelaysMs?: readonly number[];
|
|
10
12
|
historyRateLimitRetryDelayMs?: number;
|
|
11
13
|
sleep?: (delayMs: number) => Promise<void>;
|
|
14
|
+
onRetry?: (event: ApiRetryEvent) => void;
|
|
12
15
|
}
|
|
13
|
-
export interface
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
export interface ApiRetryEvent {
|
|
17
|
+
status: number;
|
|
18
|
+
delayMs: number;
|
|
19
|
+
attempt: number;
|
|
20
|
+
pathTemplate: string;
|
|
21
|
+
reason: string;
|
|
16
22
|
}
|
|
17
|
-
export declare function validateApiPlanEntitlements(apiKey: string, pathTemplate: string): ApiPlanEntitlementError | null;
|
|
18
23
|
export declare function isTerminalApiError(error: unknown): boolean;
|
|
19
24
|
export declare class ApiClient {
|
|
20
25
|
private apiKey;
|
|
@@ -22,9 +27,11 @@ export declare class ApiClient {
|
|
|
22
27
|
private historyRateLimitRetryDelayMs;
|
|
23
28
|
private historyRateLimitPause;
|
|
24
29
|
private sleep;
|
|
30
|
+
private onRetry?;
|
|
25
31
|
constructor(apiKey: string, options?: ApiClientOptions);
|
|
26
32
|
request(method: string, pathTemplate: string, params: Record<string, any>): Promise<any>;
|
|
27
33
|
private waitForRetry;
|
|
28
34
|
private waitForHistoryRateLimitPause;
|
|
35
|
+
private sleepWithRetryNotice;
|
|
29
36
|
}
|
|
30
37
|
//# sourceMappingURL=api-client.d.ts.map
|
package/dist/api-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAaA,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAaA,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;gBAGnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,OAAc,EACpB,YAAY,GAAE,MAAM,GAAG,IAAW;IAUpC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,QAAQ,IAAI,OAAO,CAItB;CACF;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK1D;AA4CD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,4BAA4B,CAAS;IAC7C,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,OAAO,CAAC,CAAiC;gBAErC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IASpD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;YAuEhF,YAAY;YAmDZ,4BAA4B;YAsB5B,oBAAoB;CAgBnC"}
|
package/dist/api-client.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const BASE_URL = "https://api.insightsentry.com";
|
|
2
|
-
const HISTORY_PLAN_NAMES = new Set(["ultra", "mega", "enterprise"]);
|
|
3
2
|
const DEFAULT_RETRY_DELAYS_MS = [500, 1000];
|
|
4
3
|
const HISTORY_RATE_LIMIT_RETRY_DELAY_MS = 60_000;
|
|
5
4
|
const HISTORY_CONCURRENCY_MAX_RETRIES = 5;
|
|
5
|
+
const RETRY_AFTER_MAX_RETRIES = 5;
|
|
6
6
|
const RETRYABLE_TERMINAL_STATUSES = new Set([408, 429]);
|
|
7
7
|
// Symbol code must be EXCHANGE:SYMBOL format (e.g., NASDAQ:AAPL)
|
|
8
8
|
const SYMBOL_CODE_PATTERN = /^[A-Z0-9_./-]+:[A-Z0-9_./!-]+$/;
|
|
@@ -11,11 +11,15 @@ const SYMBOL_PARAM_NAMES = new Set(["symbol", "code", "codes"]);
|
|
|
11
11
|
export class ApiError extends Error {
|
|
12
12
|
status;
|
|
13
13
|
apiMessage;
|
|
14
|
-
|
|
14
|
+
body;
|
|
15
|
+
retryAfterMs;
|
|
16
|
+
constructor(status, apiMessage, body = null, retryAfterMs = null) {
|
|
15
17
|
super(`API error (${status}): ${apiMessage}`);
|
|
16
18
|
this.name = "ApiError";
|
|
17
19
|
this.status = status;
|
|
18
20
|
this.apiMessage = apiMessage;
|
|
21
|
+
this.body = body;
|
|
22
|
+
this.retryAfterMs = retryAfterMs;
|
|
19
23
|
}
|
|
20
24
|
get retryable() {
|
|
21
25
|
return this.status >= 500 && this.status <= 599;
|
|
@@ -43,31 +47,6 @@ function validateSymbolParams(params) {
|
|
|
43
47
|
function isHistoryEndpoint(pathTemplate) {
|
|
44
48
|
return /\/history(?:[/?#]|$)/.test(pathTemplate);
|
|
45
49
|
}
|
|
46
|
-
function decodeJwtPayload(token) {
|
|
47
|
-
const parts = token.split(".");
|
|
48
|
-
if (parts.length !== 3)
|
|
49
|
-
return null;
|
|
50
|
-
try {
|
|
51
|
-
const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
|
|
52
|
-
return payload && typeof payload === "object" && !Array.isArray(payload) ? payload : null;
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
export function validateApiPlanEntitlements(apiKey, pathTemplate) {
|
|
59
|
-
if (isHistoryEndpoint(pathTemplate)) {
|
|
60
|
-
const payload = decodeJwtPayload(apiKey);
|
|
61
|
-
const plan = typeof payload?.plan === "string" ? payload.plan.trim().toLowerCase() : "";
|
|
62
|
-
if (HISTORY_PLAN_NAMES.has(plan))
|
|
63
|
-
return null;
|
|
64
|
-
return {
|
|
65
|
-
key: "plan",
|
|
66
|
-
error: "The /history endpoint requires an Ultra, Mega, or Enterprise plan. Use get_symbol_series for recent data or upgrade your InsightSentry plan for deep historical access.",
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
50
|
export function isTerminalApiError(error) {
|
|
72
51
|
if (error instanceof ApiError)
|
|
73
52
|
return error.terminal;
|
|
@@ -77,15 +56,31 @@ export function isTerminalApiError(error) {
|
|
|
77
56
|
}
|
|
78
57
|
async function apiErrorFromResponse(response) {
|
|
79
58
|
const text = await response.text().catch(() => "");
|
|
59
|
+
const retryAfterMs = parseRetryAfterMs(response.headers.get("retry-after"));
|
|
80
60
|
let errorMessage;
|
|
61
|
+
let body = null;
|
|
81
62
|
try {
|
|
82
63
|
const errorJson = JSON.parse(text);
|
|
64
|
+
body = errorJson;
|
|
83
65
|
errorMessage = errorJson.message || errorJson.error || JSON.stringify(errorJson);
|
|
84
66
|
}
|
|
85
67
|
catch {
|
|
86
68
|
errorMessage = text || `HTTP ${response.status} ${response.statusText}`;
|
|
69
|
+
body = text || null;
|
|
87
70
|
}
|
|
88
|
-
return new ApiError(response.status, errorMessage);
|
|
71
|
+
return new ApiError(response.status, errorMessage, body, retryAfterMs);
|
|
72
|
+
}
|
|
73
|
+
function parseRetryAfterMs(value) {
|
|
74
|
+
if (!value?.trim())
|
|
75
|
+
return null;
|
|
76
|
+
const seconds = Number(value);
|
|
77
|
+
if (Number.isFinite(seconds) && seconds > 0) {
|
|
78
|
+
return Math.ceil(seconds * 1000);
|
|
79
|
+
}
|
|
80
|
+
const dateMs = Date.parse(value);
|
|
81
|
+
if (!Number.isFinite(dateMs))
|
|
82
|
+
return null;
|
|
83
|
+
return Math.max(0, dateMs - Date.now());
|
|
89
84
|
}
|
|
90
85
|
function sleep(delayMs) {
|
|
91
86
|
return new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
@@ -103,12 +98,14 @@ export class ApiClient {
|
|
|
103
98
|
historyRateLimitRetryDelayMs;
|
|
104
99
|
historyRateLimitPause = null;
|
|
105
100
|
sleep;
|
|
101
|
+
onRetry;
|
|
106
102
|
constructor(apiKey, options = {}) {
|
|
107
103
|
this.apiKey = apiKey;
|
|
108
104
|
this.retryDelaysMs = options.retryDelaysMs ?? DEFAULT_RETRY_DELAYS_MS;
|
|
109
105
|
this.historyRateLimitRetryDelayMs =
|
|
110
106
|
options.historyRateLimitRetryDelayMs ?? HISTORY_RATE_LIMIT_RETRY_DELAY_MS;
|
|
111
107
|
this.sleep = options.sleep ?? sleep;
|
|
108
|
+
this.onRetry = options.onRetry;
|
|
112
109
|
}
|
|
113
110
|
async request(method, pathTemplate, params) {
|
|
114
111
|
// Validate symbol codes before making the request
|
|
@@ -116,9 +113,6 @@ export class ApiClient {
|
|
|
116
113
|
if (symbolError) {
|
|
117
114
|
throw new Error(symbolError);
|
|
118
115
|
}
|
|
119
|
-
const planError = validateApiPlanEntitlements(this.apiKey, pathTemplate);
|
|
120
|
-
if (planError)
|
|
121
|
-
throw new Error(planError.error);
|
|
122
116
|
// Separate path params from query/body params
|
|
123
117
|
const pathParamNames = [...pathTemplate.matchAll(/\{(\w+)\}/g)].map((m) => m[1]);
|
|
124
118
|
let path = pathTemplate;
|
|
@@ -182,6 +176,10 @@ export class ApiClient {
|
|
|
182
176
|
}
|
|
183
177
|
async waitForRetry(error, pathTemplate, attempt) {
|
|
184
178
|
const retryDelay = this.retryDelaysMs[attempt];
|
|
179
|
+
if (error.status === 429 && error.retryAfterMs !== null && attempt < RETRY_AFTER_MAX_RETRIES) {
|
|
180
|
+
await this.sleepWithRetryNotice(error, pathTemplate, attempt, error.retryAfterMs, "rate limited");
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
185
183
|
if (error.retryable && retryDelay !== undefined) {
|
|
186
184
|
await this.sleep(retryDelay);
|
|
187
185
|
return true;
|
|
@@ -194,21 +192,21 @@ export class ApiClient {
|
|
|
194
192
|
error.status === 429 &&
|
|
195
193
|
isHistoryConcurrencyMessage(error.apiMessage) &&
|
|
196
194
|
attempt < HISTORY_CONCURRENCY_MAX_RETRIES) {
|
|
197
|
-
await this.
|
|
195
|
+
await this.sleepWithRetryNotice(error, pathTemplate, attempt, this.historyRateLimitRetryDelayMs * 2 ** attempt, "history concurrency limit");
|
|
198
196
|
return true;
|
|
199
197
|
}
|
|
200
198
|
if (attempt === 0 &&
|
|
201
199
|
isHistoryEndpoint(pathTemplate) &&
|
|
202
200
|
error.status === 429 &&
|
|
203
201
|
isRetryableHistoryRateLimitMessage(error.apiMessage)) {
|
|
204
|
-
await this.waitForHistoryRateLimitPause();
|
|
202
|
+
await this.waitForHistoryRateLimitPause(error, pathTemplate, attempt);
|
|
205
203
|
return true;
|
|
206
204
|
}
|
|
207
205
|
return false;
|
|
208
206
|
}
|
|
209
|
-
async waitForHistoryRateLimitPause() {
|
|
207
|
+
async waitForHistoryRateLimitPause(error, pathTemplate, attempt) {
|
|
210
208
|
if (!this.historyRateLimitPause) {
|
|
211
|
-
const pause = this.
|
|
209
|
+
const pause = this.sleepWithRetryNotice(error, pathTemplate, attempt, this.historyRateLimitRetryDelayMs, "history rate limit").finally(() => {
|
|
212
210
|
if (this.historyRateLimitPause === pause) {
|
|
213
211
|
this.historyRateLimitPause = null;
|
|
214
212
|
}
|
|
@@ -217,5 +215,15 @@ export class ApiClient {
|
|
|
217
215
|
}
|
|
218
216
|
await this.historyRateLimitPause;
|
|
219
217
|
}
|
|
218
|
+
async sleepWithRetryNotice(error, pathTemplate, attempt, delayMs, reason) {
|
|
219
|
+
this.onRetry?.({
|
|
220
|
+
status: error.status,
|
|
221
|
+
delayMs,
|
|
222
|
+
attempt,
|
|
223
|
+
pathTemplate,
|
|
224
|
+
reason,
|
|
225
|
+
});
|
|
226
|
+
await this.sleep(delayMs);
|
|
227
|
+
}
|
|
220
228
|
}
|
|
221
229
|
//# sourceMappingURL=api-client.js.map
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AACjD,MAAM,
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-status.d.ts","sourceRoot":"","sources":["../src/auth-status.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"auth-status.d.ts","sourceRoot":"","sources":["../src/auth-status.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,wBAAgB,aAAa,IAAI,UAAU,CAG1C;AAED,wBAAgB,SAAS,IAAI,YAAY,CAGxC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAqBhG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAmBnE;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,GAAG,OAAa,GACf,UAAU,CAsDZ;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5C"}
|
package/dist/auth-status.js
CHANGED
|
@@ -18,11 +18,11 @@ export function getWhoamiForKey(apiKey, _source) {
|
|
|
18
18
|
error: "API key is not a valid InsightSentry JWT.",
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
|
-
const identity = payload
|
|
21
|
+
const identity = getPayloadIdentity(payload);
|
|
22
22
|
if (!identity) {
|
|
23
23
|
return {
|
|
24
24
|
ok: false,
|
|
25
|
-
error: "API key JWT does not include
|
|
25
|
+
error: "API key JWT does not include email or uuid.",
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
return { ok: true, identity };
|
|
@@ -36,16 +36,18 @@ export function validateApiKeyForLogin(apiKey) {
|
|
|
36
36
|
error: "API key is not a valid InsightSentry JWT.",
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
const identity = getPayloadIdentity(payload);
|
|
40
|
+
if (!identity) {
|
|
40
41
|
return {
|
|
41
42
|
ok: false,
|
|
42
|
-
error: "API key JWT must include
|
|
43
|
+
error: "API key JWT must include email or uuid.",
|
|
43
44
|
};
|
|
44
45
|
}
|
|
45
|
-
return { ok: true, identity
|
|
46
|
+
return { ok: true, identity };
|
|
46
47
|
}
|
|
47
48
|
export function getAuthStatusForKey(apiKey, source, configPath, now = new Date()) {
|
|
48
49
|
const token = apiKey?.trim();
|
|
50
|
+
const sourceLabel = source === "environment" ? "INSIGHTSENTRY_API_KEY" : "saved config";
|
|
49
51
|
if (!token) {
|
|
50
52
|
return {
|
|
51
53
|
authenticated: false,
|
|
@@ -64,19 +66,29 @@ export function getAuthStatusForKey(apiKey, source, configPath, now = new Date()
|
|
|
64
66
|
config_path: configPath,
|
|
65
67
|
key_present: true,
|
|
66
68
|
key_format_valid: false,
|
|
67
|
-
message:
|
|
69
|
+
message: `Logged out. API key from ${sourceLabel} is not a valid API key. InsightSentry API keys are JWT tokens.`,
|
|
68
70
|
};
|
|
69
71
|
}
|
|
70
72
|
const expiresAt = payload.exp ? new Date(payload.exp * 1000) : undefined;
|
|
71
73
|
const expired = expiresAt ? expiresAt.getTime() <= now.getTime() : undefined;
|
|
72
|
-
const
|
|
74
|
+
const identity = getPayloadIdentity(payload);
|
|
75
|
+
if (!identity) {
|
|
76
|
+
return {
|
|
77
|
+
authenticated: false,
|
|
78
|
+
source,
|
|
79
|
+
config_path: configPath,
|
|
80
|
+
key_present: true,
|
|
81
|
+
key_format_valid: false,
|
|
82
|
+
message: `Logged out. API key from ${sourceLabel} must include email or uuid.`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
73
85
|
return {
|
|
74
86
|
authenticated: expired !== true,
|
|
75
87
|
source,
|
|
76
88
|
config_path: configPath,
|
|
77
89
|
key_present: true,
|
|
78
90
|
key_format_valid: true,
|
|
79
|
-
subject:
|
|
91
|
+
subject: identity,
|
|
80
92
|
expires_at: expiresAt?.toISOString(),
|
|
81
93
|
expired,
|
|
82
94
|
message: expired === true
|
|
@@ -100,4 +112,9 @@ function decodeJwtPayload(token) {
|
|
|
100
112
|
return null;
|
|
101
113
|
}
|
|
102
114
|
}
|
|
115
|
+
function getPayloadIdentity(payload) {
|
|
116
|
+
const email = typeof payload.email === "string" ? payload.email.trim() : "";
|
|
117
|
+
const uuid = typeof payload.uuid === "string" ? payload.uuid.trim() : "";
|
|
118
|
+
return email || uuid || undefined;
|
|
119
|
+
}
|
|
103
120
|
//# sourceMappingURL=auth-status.js.map
|
package/dist/auth-status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-status.js","sourceRoot":"","sources":["../src/auth-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-status.js","sourceRoot":"","sources":["../src/auth-status.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAInD,OAAO,EAAE,KAAK,UAAU,EAAyC,MAAM,kBAAkB,CAAC;AAwB1F,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAsD/C,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA0CpD;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAoDlC;AAED,wBAAgB,wBAAwB,CAAC,WAAW,SAA2B,GAAG,MAAM,CA8BvF;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C;AA0FD,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAsC1D;AAkCD,KAAK,SAAS,GAAG,CACf,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACxB,OAAO,CAAC,GAAG,CAAC,CAAC;AAClB,KAAK,YAAY,GAAG,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACnD,KAAK,aAAa,GAAG,CACnB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,KACZ,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnD,UAAU,KAAK;IACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;IACxD,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,UAAU,CAAC;CAClC;AAKD,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrE;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAInD,OAAO,EAAE,KAAK,UAAU,EAAyC,MAAM,kBAAkB,CAAC;AAwB1F,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAsD/C,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA0CpD;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAoDlC;AAED,wBAAgB,wBAAwB,CAAC,WAAW,SAA2B,GAAG,MAAM,CA8BvF;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C;AA0FD,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAsC1D;AAkCD,KAAK,SAAS,GAAG,CACf,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACxB,OAAO,CAAC,GAAG,CAAC,CAAC;AAClB,KAAK,YAAY,GAAG,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACnD,KAAK,aAAa,GAAG,CACnB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,KACZ,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnD,UAAU,KAAK;IACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;IACxD,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,UAAU,CAAC;CAClC;AAKD,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrE;AAq4CD,wBAAgB,IAAI,SAYnB"}
|
package/dist/cli.js
CHANGED
|
@@ -4,7 +4,7 @@ import { emitKeypressEvents } from "node:readline";
|
|
|
4
4
|
import { createInterface } from "node:readline/promises";
|
|
5
5
|
import { promisify } from "node:util";
|
|
6
6
|
import { z } from "zod";
|
|
7
|
-
import { ApiClient,
|
|
7
|
+
import { ApiClient, ApiError } from "./api-client.js";
|
|
8
8
|
import { coerceArgs, getZodEnumValues, getZodTypeName, isOptionalZodType } from "./arg-coercion.js";
|
|
9
9
|
import { getAuthStatus, validateApiKeyForLogin } from "./auth-status.js";
|
|
10
10
|
import { renderChart } from "./chart.js";
|
|
@@ -145,7 +145,7 @@ export function buildHelp() {
|
|
|
145
145
|
lines.push("");
|
|
146
146
|
lines.push("Authentication:");
|
|
147
147
|
lines.push(" insight login --key <your-api-key> Save API key (persisted across sessions)");
|
|
148
|
-
lines.push(" insight whoami Print the logged-in user's email");
|
|
148
|
+
lines.push(" insight whoami Print the logged-in user's email/uuid");
|
|
149
149
|
lines.push(" insight version Check current/latest CLI version");
|
|
150
150
|
lines.push(" insight logout Remove saved API key");
|
|
151
151
|
lines.push(" insight update Update this CLI with npm");
|
|
@@ -495,7 +495,7 @@ async function runCliInner(argv, io) {
|
|
|
495
495
|
await maybeWritePostToolUpgradeNotice(io);
|
|
496
496
|
}
|
|
497
497
|
catch (error) {
|
|
498
|
-
io.write(
|
|
498
|
+
io.write(formatCliError(error));
|
|
499
499
|
io.exit(1);
|
|
500
500
|
}
|
|
501
501
|
return;
|
|
@@ -627,11 +627,7 @@ async function runCliInner(argv, io) {
|
|
|
627
627
|
try {
|
|
628
628
|
const knownArgKeys = ["filter", "store", "output_file", "output_dir"];
|
|
629
629
|
const initialApiArgs = pickKnownArgs(resolvedArgs, Object.keys(tool.schema), knownArgKeys);
|
|
630
|
-
const apiArgs =
|
|
631
|
-
if (!apiArgs) {
|
|
632
|
-
io.exit(1);
|
|
633
|
-
return;
|
|
634
|
-
}
|
|
630
|
+
const apiArgs = initialApiArgs;
|
|
635
631
|
reportArgUsage(io, apiArgs, Object.keys(tool.schema), inputArgs, knownArgKeys);
|
|
636
632
|
const outputValue = await runApiTool({
|
|
637
633
|
toolName: tool.name,
|
|
@@ -645,7 +641,7 @@ async function runCliInner(argv, io) {
|
|
|
645
641
|
await maybeWritePostToolUpgradeNotice(io);
|
|
646
642
|
}
|
|
647
643
|
catch (error) {
|
|
648
|
-
io.write(
|
|
644
|
+
io.write(formatCliError(error));
|
|
649
645
|
io.exit(1);
|
|
650
646
|
}
|
|
651
647
|
}
|
|
@@ -798,9 +794,24 @@ function resolveRequest(io, apiKeyOverride) {
|
|
|
798
794
|
return null;
|
|
799
795
|
if (io.createRequestFromApiKey)
|
|
800
796
|
return io.createRequestFromApiKey(apiKey);
|
|
801
|
-
const client = new ApiClient(apiKey
|
|
797
|
+
const client = new ApiClient(apiKey, {
|
|
798
|
+
onRetry: (event) => io.progress?.(formatRetryNotice(event)),
|
|
799
|
+
});
|
|
802
800
|
return (method, path, params) => client.request(method, path, params);
|
|
803
801
|
}
|
|
802
|
+
function formatRetryNotice(event) {
|
|
803
|
+
const seconds = Math.max(1, Math.ceil(event.delayMs / 1000));
|
|
804
|
+
return `Rate limited (${event.reason}). Retrying in ${seconds} second${seconds === 1 ? "" : "s"}...`;
|
|
805
|
+
}
|
|
806
|
+
function formatCliError(error) {
|
|
807
|
+
if (error instanceof ApiError && isDisplayableJsonBody(error.body)) {
|
|
808
|
+
return `Error:\n${JSON.stringify(error.body, null, 2)}\n`;
|
|
809
|
+
}
|
|
810
|
+
return `Error: ${error?.message ?? String(error)}\n`;
|
|
811
|
+
}
|
|
812
|
+
function isDisplayableJsonBody(value) {
|
|
813
|
+
return value !== null && typeof value === "object";
|
|
814
|
+
}
|
|
804
815
|
function reportArgUsage(io, resolvedArgs, knownKeys, originalArgs, extraKnownKeys = []) {
|
|
805
816
|
if (!io.progress)
|
|
806
817
|
return;
|
|
@@ -824,17 +835,6 @@ function formatArgValue(value) {
|
|
|
824
835
|
const singleLine = value.replace(/\s+/g, " ").trim();
|
|
825
836
|
return singleLine.length <= 120 ? singleLine : `${singleLine.slice(0, 117)}...`;
|
|
826
837
|
}
|
|
827
|
-
async function resolveApiPlanEntitlementArgs(args, tool, apiKeyOverride, io) {
|
|
828
|
-
const apiKey = apiKeyOverride?.trim() || resolveApiKey();
|
|
829
|
-
if (!apiKey)
|
|
830
|
-
return args;
|
|
831
|
-
const error = validateApiPlanEntitlements(apiKey, tool.pathTemplate);
|
|
832
|
-
if (!error)
|
|
833
|
-
return args;
|
|
834
|
-
const label = toolPromptLabel(error.key);
|
|
835
|
-
io.write(`Invalid ${label}: ${error.error}\n`);
|
|
836
|
-
return null;
|
|
837
|
-
}
|
|
838
838
|
function missingToolArgs(args, tool) {
|
|
839
839
|
return Object.entries(tool.schema)
|
|
840
840
|
.filter(([_key, zodType]) => !isOptionalZodType(zodType))
|