@intutic/cli 2.3.0 → 2.4.0
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/dist/cli.js +101 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/budgetLimits.d.ts +70 -0
- package/dist/commands/budgetLimits.d.ts.map +1 -0
- package/dist/commands/budgetLimits.js +223 -0
- package/dist/commands/budgetLimits.js.map +1 -0
- package/dist/commands/credentials.d.ts +5 -1
- package/dist/commands/credentials.d.ts.map +1 -1
- package/dist/commands/credentials.js +98 -9
- package/dist/commands/credentials.js.map +1 -1
- package/dist/commands/incidents.d.ts +32 -0
- package/dist/commands/incidents.d.ts.map +1 -0
- package/dist/commands/incidents.js +94 -0
- package/dist/commands/incidents.js.map +1 -0
- package/dist/commands/settings.d.ts +5 -4
- package/dist/commands/settings.d.ts.map +1 -1
- package/dist/commands/settings.js +8 -6
- package/dist/commands/settings.js.map +1 -1
- package/dist/lib/providerProbe.d.ts +1 -1
- package/dist/lib/providerProbe.d.ts.map +1 -1
- package/dist/lib/providerProbe.js +13 -5
- package/dist/lib/providerProbe.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `intutic budget set|keys|key|members|member` — the workspace caps, and the
|
|
3
|
+
* spend budgets and rate limits on virtual keys and members.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* - `intutic budget set [--daily <usd|default>] [--monthly <usd|default>] [--threshold <pct>]
|
|
7
|
+
* [--daily-enforcement hard|soft] [--monthly-enforcement hard|soft]`
|
|
8
|
+
* - `intutic budget keys [--json]`
|
|
9
|
+
* - `intutic budget key <keyId> [--daily <usd|none>] [--monthly <usd|none>]
|
|
10
|
+
* [--daily-enforcement hard|soft] [--monthly-enforcement hard|soft]
|
|
11
|
+
* [--rpm <n|none>] [--tpm <n|none>]`
|
|
12
|
+
* - `intutic budget members [--json]`
|
|
13
|
+
* - `intutic budget member <memberId|default> [--daily <usd|none>]
|
|
14
|
+
* [--monthly <usd|none>] [--daily-enforcement hard|soft]
|
|
15
|
+
* [--monthly-enforcement hard|soft]`
|
|
16
|
+
*
|
|
17
|
+
* Server side (services/control-plane/src/routes/budget.ts, routes/keys.ts):
|
|
18
|
+
* `PUT /api/v1/budget`, `GET /api/v1/budget/keys`, `PATCH /api/v1/keys/:id`,
|
|
19
|
+
* `GET /api/v1/budget/members`, `PUT /api/v1/budget/members/:memberId`. The
|
|
20
|
+
* writes need OWNER or ADMIN, and member budgets a plan with them; the
|
|
21
|
+
* server's refusal is printed as it says it.
|
|
22
|
+
*
|
|
23
|
+
* Every write here changes only what its flags name. `budget set` sends only
|
|
24
|
+
* those fields (the route is a partial update); the key and member writes
|
|
25
|
+
* read the subject's budgets first and send them back with the change,
|
|
26
|
+
* because those routes replace a subject's budgets whole.
|
|
27
|
+
*
|
|
28
|
+
* @module
|
|
29
|
+
*/
|
|
30
|
+
import { log } from '../lib/logger.js';
|
|
31
|
+
import { fail, runApiCommand } from './apiCommand.js';
|
|
32
|
+
const usd = (n) => `$${n.toFixed(2)}`;
|
|
33
|
+
/** A dollar amount, or `none` (returned as `null`), or fails naming the flag. */
|
|
34
|
+
function amountOrNone(value, flag) {
|
|
35
|
+
if (value.trim().toLowerCase() === 'none')
|
|
36
|
+
return null;
|
|
37
|
+
const n = Number(value);
|
|
38
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
39
|
+
fail(`${flag} must be a dollar amount above 0, or "none", got "${value}"`);
|
|
40
|
+
return n;
|
|
41
|
+
}
|
|
42
|
+
/** A whole number, or `none` (returned as `null`), or fails naming the flag. */
|
|
43
|
+
function countOrNone(value, flag) {
|
|
44
|
+
if (value.trim().toLowerCase() === 'none')
|
|
45
|
+
return null;
|
|
46
|
+
const n = Number(value);
|
|
47
|
+
if (!Number.isInteger(n) || n <= 0)
|
|
48
|
+
fail(`${flag} must be a positive whole number, or "none", got "${value}"`);
|
|
49
|
+
return n;
|
|
50
|
+
}
|
|
51
|
+
function enforcement(value, flag) {
|
|
52
|
+
if (value === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (value !== 'hard' && value !== 'soft')
|
|
55
|
+
fail(`${flag} must be hard or soft, got "${value}"`);
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* `current` with the periods the flags name changed: `--daily none` removes
|
|
60
|
+
* the day budget, `--daily 5` sets it (keeping its enforcement unless
|
|
61
|
+
* `--daily-enforcement` says otherwise, hard for a new one), and an
|
|
62
|
+
* enforcement flag alone changes an existing budget's.
|
|
63
|
+
*/
|
|
64
|
+
export function applyBudgetFlags(current, flags) {
|
|
65
|
+
const out = new Map(current.map((b) => [b.period, { ...b }]));
|
|
66
|
+
for (const [period, amount, mode, flag] of [
|
|
67
|
+
['day', flags.daily, flags.dailyEnforcement, '--daily'],
|
|
68
|
+
['month', flags.monthly, flags.monthlyEnforcement, '--monthly'],
|
|
69
|
+
]) {
|
|
70
|
+
const how = enforcement(mode, `${flag}-enforcement`);
|
|
71
|
+
if (amount !== undefined) {
|
|
72
|
+
const limitUsd = amountOrNone(amount, flag);
|
|
73
|
+
if (limitUsd === null)
|
|
74
|
+
out.delete(period);
|
|
75
|
+
else
|
|
76
|
+
out.set(period, { period, limitUsd, enforcement: how ?? out.get(period)?.enforcement ?? 'hard' });
|
|
77
|
+
}
|
|
78
|
+
else if (how) {
|
|
79
|
+
const existing = out.get(period);
|
|
80
|
+
if (!existing)
|
|
81
|
+
fail(`${flag}-enforcement needs a ${period} budget: set one with ${flag} <usd>`);
|
|
82
|
+
existing.enforcement = how;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return [...out.values()].sort((a, b) => (a.period === b.period ? 0 : a.period === 'day' ? -1 : 1));
|
|
86
|
+
}
|
|
87
|
+
/** One budget list in words: `$5.00/day hard, $50.00/month soft`, or `none`. */
|
|
88
|
+
export function describeBudgets(budgets) {
|
|
89
|
+
if (budgets.length === 0)
|
|
90
|
+
return 'none';
|
|
91
|
+
return budgets.map((b) => `${usd(b.limitUsd)}/${b.period} ${b.enforcement}`).join(', ');
|
|
92
|
+
}
|
|
93
|
+
function describeRateLimit(r) {
|
|
94
|
+
const parts = [r.rpm ? `${r.rpm} requests/min` : '', r.tpm ? `${r.tpm} tokens/min` : ''].filter(Boolean);
|
|
95
|
+
return parts.length ? parts.join(', ') : 'none';
|
|
96
|
+
}
|
|
97
|
+
function hasBudgetFlags(flags) {
|
|
98
|
+
return [flags.daily, flags.monthly, flags.dailyEnforcement, flags.monthlyEnforcement].some((v) => v !== undefined);
|
|
99
|
+
}
|
|
100
|
+
/** A cap flag: a dollar amount (0 is no cap), or `default` (sent as `null`) to return to the default. */
|
|
101
|
+
function capOrDefault(value, flag) {
|
|
102
|
+
if (value === undefined)
|
|
103
|
+
return undefined;
|
|
104
|
+
if (value.trim().toLowerCase() === 'default')
|
|
105
|
+
return null;
|
|
106
|
+
const n = Number(value);
|
|
107
|
+
if (!(n >= 0))
|
|
108
|
+
fail(`${flag} must be a dollar amount (0 for no cap) or "default", got "${value}"`);
|
|
109
|
+
return n;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The `PUT /api/v1/budget` body for the flags given: only those, so a cap
|
|
113
|
+
* nobody named stays as it is — in particular a daily cap that was never
|
|
114
|
+
* saved stays on the default.
|
|
115
|
+
*/
|
|
116
|
+
export function budgetSetBody(opts) {
|
|
117
|
+
const body = {};
|
|
118
|
+
const daily = capOrDefault(opts.daily, '--daily');
|
|
119
|
+
const monthly = capOrDefault(opts.monthly, '--monthly');
|
|
120
|
+
if (daily !== undefined)
|
|
121
|
+
body.daily_budget_usd = daily;
|
|
122
|
+
if (monthly !== undefined)
|
|
123
|
+
body.monthly_budget_usd = monthly;
|
|
124
|
+
if (opts.threshold !== undefined) {
|
|
125
|
+
const t = Number(opts.threshold);
|
|
126
|
+
if (!(Number.isInteger(t) && t >= 1 && t <= 100))
|
|
127
|
+
fail(`--threshold must be a whole percentage from 1 to 100, got "${opts.threshold}"`);
|
|
128
|
+
body.alert_threshold_pct = t;
|
|
129
|
+
}
|
|
130
|
+
const dailyEnforcement = enforcement(opts.dailyEnforcement, '--daily-enforcement');
|
|
131
|
+
const monthlyEnforcement = enforcement(opts.monthlyEnforcement, '--monthly-enforcement');
|
|
132
|
+
if (dailyEnforcement)
|
|
133
|
+
body.daily_enforcement = dailyEnforcement;
|
|
134
|
+
if (monthlyEnforcement)
|
|
135
|
+
body.monthly_enforcement = monthlyEnforcement;
|
|
136
|
+
if (Object.keys(body).length === 0) {
|
|
137
|
+
fail('Nothing to change: pass --daily, --monthly, --threshold, --daily-enforcement or --monthly-enforcement');
|
|
138
|
+
}
|
|
139
|
+
return body;
|
|
140
|
+
}
|
|
141
|
+
export async function runBudgetSet(opts) {
|
|
142
|
+
const body = budgetSetBody(opts);
|
|
143
|
+
await runApiCommand(opts, 'Failed to update the workspace budget', async (client) => {
|
|
144
|
+
await client.put('/api/v1/budget', body);
|
|
145
|
+
return client.get('/api/v1/budget');
|
|
146
|
+
}, (b) => {
|
|
147
|
+
log.success('Workspace budget updated');
|
|
148
|
+
log.field('Daily cap', `${usd(b.daily_budget_usd)} (${b.daily_enforcement})${b.daily_budget_is_default ? ', the default' : ''}`);
|
|
149
|
+
log.field('Monthly cap', `${usd(b.monthly_budget_usd)} (${b.monthly_enforcement})`);
|
|
150
|
+
log.field('Alert at', `${b.alert_threshold_pct}%`);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
export async function runBudgetKeys(opts) {
|
|
154
|
+
await runApiCommand(opts, 'Failed to list key budgets', (client) => client.get('/api/v1/budget/keys'), (res) => {
|
|
155
|
+
log.header('Virtual key budgets');
|
|
156
|
+
if (res.keys.length === 0)
|
|
157
|
+
console.log(' No live keys.');
|
|
158
|
+
for (const k of res.keys) {
|
|
159
|
+
console.log(` ${k.keyPrefix}… ${k.label} (${k.keyId}, ${k.memberEmail})`);
|
|
160
|
+
console.log(` Spent today ${usd(k.spendTodayUsd)}, this month ${usd(k.spendThisMonthUsd)}`);
|
|
161
|
+
console.log(` Budgets: ${describeBudgets(k.budgets)} Rate limit: ${describeRateLimit(k.rateLimit)}`);
|
|
162
|
+
}
|
|
163
|
+
console.log(` Days reset at ${res.dayResetsAt}; months at ${res.monthResetsAt} (UTC).`);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
export async function runBudgetKey(keyId, opts) {
|
|
167
|
+
const budgetsChange = hasBudgetFlags(opts);
|
|
168
|
+
if (!budgetsChange && opts.rpm === undefined && opts.tpm === undefined) {
|
|
169
|
+
fail('Nothing to change: pass --daily, --monthly, an enforcement flag, --rpm or --tpm');
|
|
170
|
+
}
|
|
171
|
+
const rateLimit = {};
|
|
172
|
+
if (opts.rpm !== undefined)
|
|
173
|
+
rateLimit.rpm = countOrNone(opts.rpm, '--rpm');
|
|
174
|
+
if (opts.tpm !== undefined)
|
|
175
|
+
rateLimit.tpm = countOrNone(opts.tpm, '--tpm');
|
|
176
|
+
await runApiCommand(opts, `Failed to update key ${keyId}`, async (client) => {
|
|
177
|
+
let budgets;
|
|
178
|
+
if (budgetsChange) {
|
|
179
|
+
const listed = await client.get('/api/v1/budget/keys');
|
|
180
|
+
const current = listed.keys.find((k) => k.keyId === keyId);
|
|
181
|
+
if (!current)
|
|
182
|
+
throw new Error(`no live key ${keyId} in this workspace`);
|
|
183
|
+
budgets = applyBudgetFlags(current.budgets, opts);
|
|
184
|
+
}
|
|
185
|
+
return client.patch(`/api/v1/keys/${keyId}`, {
|
|
186
|
+
...(budgets ? { budgets } : {}),
|
|
187
|
+
...(Object.keys(rateLimit).length ? { rateLimit } : {}),
|
|
188
|
+
});
|
|
189
|
+
}, (k) => {
|
|
190
|
+
log.success(`Key ${k.keyId} updated`);
|
|
191
|
+
log.field('Budgets', describeBudgets(k.budgets));
|
|
192
|
+
log.field('Rate limit', describeRateLimit(k.rateLimit));
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
export async function runBudgetMembers(opts) {
|
|
196
|
+
await runApiCommand(opts, 'Failed to list member budgets', (client) => client.get('/api/v1/budget/members'), (res) => {
|
|
197
|
+
log.header('Member budgets');
|
|
198
|
+
log.field('Default (every member without their own)', describeBudgets(res.defaultBudgets));
|
|
199
|
+
for (const m of res.members) {
|
|
200
|
+
console.log(` ${m.email} (${m.memberId})`);
|
|
201
|
+
console.log(` Spent today ${usd(m.spendTodayUsd)}, this month ${usd(m.spendThisMonthUsd)}`);
|
|
202
|
+
console.log(` Own: ${describeBudgets(m.budgets)} Applies: ${describeBudgets(m.effectiveBudgets)}`);
|
|
203
|
+
}
|
|
204
|
+
console.log(` Days reset at ${res.dayResetsAt}; months at ${res.monthResetsAt} (UTC).`);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
export async function runBudgetMember(memberId, opts) {
|
|
208
|
+
if (!hasBudgetFlags(opts))
|
|
209
|
+
fail('Nothing to change: pass --daily, --monthly or an enforcement flag');
|
|
210
|
+
await runApiCommand(opts, `Failed to update the budgets of ${memberId}`, async (client) => {
|
|
211
|
+
const listed = await client.get('/api/v1/budget/members');
|
|
212
|
+
const current = memberId === 'default' ? listed.defaultBudgets : listed.members.find((m) => m.memberId === memberId)?.budgets;
|
|
213
|
+
if (!current)
|
|
214
|
+
throw new Error(`no active member ${memberId} in this workspace`);
|
|
215
|
+
return client.put(`/api/v1/budget/members/${encodeURIComponent(memberId)}`, {
|
|
216
|
+
budgets: applyBudgetFlags(current, opts),
|
|
217
|
+
});
|
|
218
|
+
}, (m) => {
|
|
219
|
+
log.success(m.memberId === 'default' ? 'Default member budget updated' : `Budgets of ${m.memberId} updated`);
|
|
220
|
+
log.field('Budgets', describeBudgets(m.budgets));
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=budgetLimits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budgetLimits.js","sourceRoot":"","sources":["../../src/commands/budgetLimits.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Subcommands:
|
|
6
6
|
* - `intutic credentials list [--json]`
|
|
7
|
-
* - `intutic credentials set <provider> --field key=value [--field key=
|
|
7
|
+
* - `intutic credentials set <provider> --field key=value [--field-file key=path ...]`
|
|
8
8
|
* - `intutic credentials unset <provider>`
|
|
9
|
+
* - `intutic credentials models <provider> [--json]`
|
|
9
10
|
*
|
|
10
11
|
* Server side: services/control-plane/src/routes/providerCredentials.ts.
|
|
11
12
|
* `list` reports every provider in the shared registry
|
|
@@ -24,8 +25,11 @@ export declare function runCredentialsList(opts: CredentialsCliOpts): Promise<vo
|
|
|
24
25
|
/** `intutic credentials set <provider>` */
|
|
25
26
|
export declare function runCredentialsSet(provider: string, opts: CredentialsCliOpts & {
|
|
26
27
|
field?: string[];
|
|
28
|
+
fieldFile?: string[];
|
|
27
29
|
}): Promise<void>;
|
|
28
30
|
/** `intutic credentials unset <provider>` */
|
|
29
31
|
export declare function runCredentialsUnset(provider: string, opts: CredentialsCliOpts): Promise<void>;
|
|
32
|
+
/** `intutic credentials models <provider>` */
|
|
33
|
+
export declare function runCredentialsModels(provider: string, opts: CredentialsCliOpts): Promise<void>;
|
|
30
34
|
export {};
|
|
31
35
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA6CD,iCAAiC;AACjC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChF;AAED,2CAA2C;AAC3C,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,kBAAkB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CA2Hf;AAED,6CAA6C;AAC7C,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,8CAA8C;AAC9C,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCpG"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Subcommands:
|
|
6
6
|
* - `intutic credentials list [--json]`
|
|
7
|
-
* - `intutic credentials set <provider> --field key=value [--field key=
|
|
7
|
+
* - `intutic credentials set <provider> --field key=value [--field-file key=path ...]`
|
|
8
8
|
* - `intutic credentials unset <provider>`
|
|
9
|
+
* - `intutic credentials models <provider> [--json]`
|
|
9
10
|
*
|
|
10
11
|
* Server side: services/control-plane/src/routes/providerCredentials.ts.
|
|
11
12
|
* `list` reports every provider in the shared registry
|
|
@@ -19,9 +20,18 @@ import { log } from '../lib/logger.js';
|
|
|
19
20
|
import { loadCredentials } from '../config/store.js';
|
|
20
21
|
import { resolveControlPlaneUrl } from '../config/paths.js';
|
|
21
22
|
import { createApiClient } from '../lib/api.js';
|
|
22
|
-
import {
|
|
23
|
+
import { readFileSync } from 'node:fs';
|
|
24
|
+
import { PROVIDER_REGISTRY, checkCloudCredentialFields, getProviderDefinition } from '@intutic/shared-types';
|
|
23
25
|
import pc from 'picocolors';
|
|
24
26
|
const NOT_AUTHENTICATED = 'Not authenticated. Run `intutic login` first.';
|
|
27
|
+
function requireProvider(provider) {
|
|
28
|
+
const def = getProviderDefinition(provider);
|
|
29
|
+
if (!def) {
|
|
30
|
+
log.error(`Unknown provider "${provider}". Must be one of: ${PROVIDER_REGISTRY.map((p) => p.id).join(', ')}`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
return def;
|
|
34
|
+
}
|
|
25
35
|
async function getClient(opts) {
|
|
26
36
|
const creds = await loadCredentials();
|
|
27
37
|
if (!creds) {
|
|
@@ -58,7 +68,26 @@ export async function runCredentialsList(opts) {
|
|
|
58
68
|
}
|
|
59
69
|
/** `intutic credentials set <provider>` */
|
|
60
70
|
export async function runCredentialsSet(provider, opts) {
|
|
61
|
-
|
|
71
|
+
// `--field-file key=path` reads the value from a file: a Vertex AI
|
|
72
|
+
// service-account key is a multi-line JSON document no shell quotes well.
|
|
73
|
+
const fromFiles = [];
|
|
74
|
+
for (const f of opts.fieldFile ?? []) {
|
|
75
|
+
const idx = f.indexOf('=');
|
|
76
|
+
if (idx <= 0) {
|
|
77
|
+
log.error(`--field-file "${f}" is not in key=path form`);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
let value;
|
|
81
|
+
try {
|
|
82
|
+
value = readFileSync(f.slice(idx + 1), 'utf8');
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
log.error(`--field-file ${f.slice(0, idx)}: could not read ${f.slice(idx + 1)}`);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
fromFiles.push(`${f.slice(0, idx)}=${value}`);
|
|
89
|
+
}
|
|
90
|
+
const fields = [...(opts.field ?? []), ...fromFiles];
|
|
62
91
|
if (fields.length === 0) {
|
|
63
92
|
log.error('At least one --field key=value is required (e.g. --field apiKey=sk-ant-... for a single-key ' +
|
|
64
93
|
'provider, or multiple --field flags for a multi-field one like Azure OpenAI).');
|
|
@@ -73,11 +102,7 @@ export async function runCredentialsSet(provider, opts) {
|
|
|
73
102
|
// that has a missing field. The server (`providerCredentials.ts`) remains
|
|
74
103
|
// the authoritative validator (length bounds, etc.) — this is a faster,
|
|
75
104
|
// local UX check, not a replacement for it.
|
|
76
|
-
const def =
|
|
77
|
-
if (!def) {
|
|
78
|
-
log.error(`Unknown provider "${provider}". Must be one of: ${PROVIDER_REGISTRY.map((p) => p.id).join(', ')}`);
|
|
79
|
-
process.exit(1);
|
|
80
|
-
}
|
|
105
|
+
const def = requireProvider(provider);
|
|
81
106
|
const knownKeys = new Set(def.fields.map((f) => f.key));
|
|
82
107
|
const body = {};
|
|
83
108
|
for (const f of fields) {
|
|
@@ -99,14 +124,47 @@ export async function runCredentialsSet(provider, opts) {
|
|
|
99
124
|
process.exit(1);
|
|
100
125
|
}
|
|
101
126
|
}
|
|
127
|
+
if (def.requiresOneOf && !def.requiresOneOf.some((set) => set.every((k) => body[k]))) {
|
|
128
|
+
log.error(`${def.displayName} requires one of: ${def.requiresOneOf.map((set) => set.map((k) => `--field ${k}=<value>`).join(' ')).join(' or ')}`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
const trimmed = Object.fromEntries(Object.entries(body).map(([k, v]) => [k, v.trim()]));
|
|
132
|
+
const cloudError = checkCloudCredentialFields(def.id, trimmed);
|
|
133
|
+
if (cloudError) {
|
|
134
|
+
log.error(cloudError);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
102
137
|
const client = await getClient(opts);
|
|
103
138
|
try {
|
|
104
139
|
const res = await client.put(`/api/v1/workspace/provider-credentials/${encodeURIComponent(provider)}`, body);
|
|
140
|
+
// Checked against the provider as soon as it is saved, server-side, so
|
|
141
|
+
// the operator learns now — not on the first failed request — whether
|
|
142
|
+
// the credential works. A failed check never undoes the save.
|
|
143
|
+
let verification = null;
|
|
144
|
+
try {
|
|
145
|
+
verification = await client.post(`/api/v1/workspace/provider-credentials/${encodeURIComponent(provider)}/verify`, {});
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
verification = null;
|
|
149
|
+
}
|
|
105
150
|
if (opts.json) {
|
|
106
|
-
console.log(JSON.stringify(res, null, 2));
|
|
151
|
+
console.log(JSON.stringify({ ...res, verification }, null, 2));
|
|
107
152
|
return;
|
|
108
153
|
}
|
|
109
154
|
log.success(`${provider}: provisioned (…${res.lastFour ?? '????'}).`);
|
|
155
|
+
if (verification?.status === 'valid')
|
|
156
|
+
log.success(` Verified: ${verification.detail}`);
|
|
157
|
+
else if (verification?.status === 'invalid') {
|
|
158
|
+
log.warn(` ${verification.detail}. Check the values and run this command again.`);
|
|
159
|
+
}
|
|
160
|
+
else if (verification)
|
|
161
|
+
log.dim(` Not verified: ${verification.detail}`);
|
|
162
|
+
if (verification?.models) {
|
|
163
|
+
log.dim(` The key can reach ${verification.models.length} model${verification.models.length === 1 ? '' : 's'}; ` +
|
|
164
|
+
`\`intutic credentials models ${provider}\` lists them.`);
|
|
165
|
+
}
|
|
166
|
+
if (def.usageHint)
|
|
167
|
+
log.dim(` ${def.usageHint}`);
|
|
110
168
|
if (!res.routingLive) {
|
|
111
169
|
log.warn(`${provider} is stored but not yet routable — the proxy does not forward requests to it. ` +
|
|
112
170
|
'Its credential is safe to have on file ahead of that support landing.');
|
|
@@ -131,4 +189,35 @@ export async function runCredentialsUnset(provider, opts) {
|
|
|
131
189
|
process.exit(1);
|
|
132
190
|
}
|
|
133
191
|
}
|
|
192
|
+
/** `intutic credentials models <provider>` */
|
|
193
|
+
export async function runCredentialsModels(provider, opts) {
|
|
194
|
+
const def = requireProvider(provider);
|
|
195
|
+
const client = await getClient(opts);
|
|
196
|
+
try {
|
|
197
|
+
const res = await client.get(`/api/v1/workspace/provider-credentials/${encodeURIComponent(provider)}/models`);
|
|
198
|
+
if (opts.json) {
|
|
199
|
+
console.log(JSON.stringify(res, null, 2));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// The list is recorded when a saved key is checked against the provider,
|
|
203
|
+
// so `null` means no check has listed models yet, not that the key
|
|
204
|
+
// reaches none.
|
|
205
|
+
if (!res.models) {
|
|
206
|
+
log.dim(`No models discovered for ${def.displayName} yet.`);
|
|
207
|
+
log.dim(` \`intutic credentials set ${provider} --field ...\` checks the key against the provider and records the models it can reach.`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
log.header(`Intutic — ${def.displayName} models`);
|
|
211
|
+
if (res.checkedAt)
|
|
212
|
+
log.field('Checked', res.checkedAt);
|
|
213
|
+
log.field('Models', String(res.models.length));
|
|
214
|
+
console.log('');
|
|
215
|
+
for (const model of res.models)
|
|
216
|
+
console.log(` ${model}`);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
log.error(`Failed to list ${provider} models: ${err instanceof Error ? err.message : String(err)}`);
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
134
223
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC5G,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,MAAM,iBAAiB,GAAG,+CAA+C,CAAA;AA+BzE,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,GAAG,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,KAAK,CAAC,qBAAqB,QAAQ,sBAAsB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAwB;IAC/C,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxD,OAAO,eAAe,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;AACvD,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAwB;IAC/D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,wCAAwC,CACzC,CAAA;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;QAE3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACzC,OAAM;QACR,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAA;YACjC,GAAG,CAAC,KAAK,CACP,SAAS,EACT,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CACrG,CAAA;YACD,GAAG,CAAC,KAAK,CACP,aAAa,EACb,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAC1E,CAAA;YACD,IAAI,CAAC,CAAC,SAAS;gBAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,IAAqE;IAErE,mEAAmE;IACnE,0EAA0E;IAC1E,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,KAAa,CAAA;QACjB,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,CAAA;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,KAAK,CACP,8FAA8F;YAC5F,+EAA+E,CAClF,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,8DAA8D;IAC9D,kEAAkE;IAClE,0EAA0E;IAC1E,oEAAoE;IACpE,uEAAuE;IACvE,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,4CAA4C;IAC5C,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAEvD,MAAM,IAAI,GAA2B,EAAE,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAA;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,KAAK,CACP,IAAI,GAAG,oBAAoB,GAAG,CAAC,WAAW,qBAAqB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3G,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,WAAW,qBAAqB,KAAK,CAAC,GAAG,UAAU,CAAC,CAAA;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,KAAK,CACP,GAAG,GAAG,CAAC,WAAW,qBAAqB,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CACzI,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACvF,MAAM,UAAU,GAAG,0BAA0B,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9D,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,0CAA0C,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EACxE,IAAI,CACL,CAAA;QAED,uEAAuE;QACvE,sEAAsE;QACtE,8DAA8D;QAC9D,IAAI,YAAY,GAAwB,IAAI,CAAA;QAC5C,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAC9B,0CAA0C,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAC/E,EAAE,CACH,CAAA;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC9D,OAAM;QACR,CAAC;QAED,GAAG,CAAC,OAAO,CAAC,GAAG,QAAQ,mBAAmB,GAAG,CAAC,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAA;QACrE,IAAI,YAAY,EAAE,MAAM,KAAK,OAAO;YAAE,GAAG,CAAC,OAAO,CAAC,eAAe,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;aAClF,IAAI,YAAY,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,MAAM,gDAAgD,CAAC,CAAA;QACpF,CAAC;aAAM,IAAI,YAAY;YAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1E,IAAI,YAAY,EAAE,MAAM,EAAE,CAAC;YACzB,GAAG,CAAC,GAAG,CACL,uBAAuB,YAAY,CAAC,MAAM,CAAC,MAAM,SAAS,YAAY,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI;gBACvG,gCAAgC,QAAQ,gBAAgB,CAC3D,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CACN,GAAG,QAAQ,+EAA+E;gBACxF,uEAAuE,CAC1E,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,iBAAiB,QAAQ,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,IAAwB;IAExB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IAEpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,CAAC,0CAA0C,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC1F,GAAG,CAAC,OAAO,CAAC,GAAG,QAAQ,uBAAuB,CAAC,CAAA;QAC/C,GAAG,CAAC,GAAG,CACL,0FAA0F;YACxF,yCAAyC,CAC5C,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,oBAAoB,QAAQ,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,IAAwB;IACnF,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,0CAA0C,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAChF,CAAA;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACzC,OAAM;QACR,CAAC;QAED,yEAAyE;QACzE,mEAAmE;QACnE,gBAAgB;QAChB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,GAAG,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,WAAW,OAAO,CAAC,CAAA;YAC3D,GAAG,CAAC,GAAG,CACL,+BAA+B,QAAQ,yFAAyF,CACjI,CAAA;YACD,OAAM;QACR,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,WAAW,SAAS,CAAC,CAAA;QACjD,IAAI,GAAG,CAAC,SAAS;YAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACtD,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,kBAAkB,QAAQ,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `intutic incidents` — the workspace's governance incidents, as on the
|
|
3
|
+
* dashboard's Findings › Incidents tab.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* - `intutic incidents list [--status] [--severity] [--type] [--page] [--limit] [--json]`
|
|
7
|
+
* - `intutic incidents show <incidentId> [--json]`
|
|
8
|
+
*
|
|
9
|
+
* Server side: `GET /api/v1/incidents` and `GET /api/v1/incidents/:id`
|
|
10
|
+
* (services/control-plane/src/routes/incidents.ts), OWNER, ADMIN and EM only.
|
|
11
|
+
* The list is ranked by review priority, not time, and bounded by a review
|
|
12
|
+
* budget; the CLI says so when the budget withholds incidents, as the
|
|
13
|
+
* dashboard does. `--severity` and `--type` are checked here before any
|
|
14
|
+
* request, against the same lists the control plane checks.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { type ApiCommandOpts } from './apiCommand.js';
|
|
19
|
+
export interface IncidentListOpts extends ApiCommandOpts {
|
|
20
|
+
status?: string;
|
|
21
|
+
severity?: string;
|
|
22
|
+
type?: string;
|
|
23
|
+
page?: string;
|
|
24
|
+
limit?: string;
|
|
25
|
+
}
|
|
26
|
+
/** The route's query string for the given filters; fails on a severity or type the control plane would refuse. */
|
|
27
|
+
export declare function incidentQuery(opts: IncidentListOpts): string;
|
|
28
|
+
/** `intutic incidents list` */
|
|
29
|
+
export declare function runIncidentsList(opts: IncidentListOpts): Promise<void>;
|
|
30
|
+
/** `intutic incidents show <incidentId>` */
|
|
31
|
+
export declare function runIncidentsShow(incidentId: string, opts: ApiCommandOpts): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=incidents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incidents.d.ts","sourceRoot":"","sources":["../../src/commands/incidents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAsBvF,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAKD,kHAAkH;AAClH,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAqB5D;AAMD,+BAA+B;AAC/B,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5E;AAED,4CAA4C;AAC5C,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9F"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `intutic incidents` — the workspace's governance incidents, as on the
|
|
3
|
+
* dashboard's Findings › Incidents tab.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* - `intutic incidents list [--status] [--severity] [--type] [--page] [--limit] [--json]`
|
|
7
|
+
* - `intutic incidents show <incidentId> [--json]`
|
|
8
|
+
*
|
|
9
|
+
* Server side: `GET /api/v1/incidents` and `GET /api/v1/incidents/:id`
|
|
10
|
+
* (services/control-plane/src/routes/incidents.ts), OWNER, ADMIN and EM only.
|
|
11
|
+
* The list is ranked by review priority, not time, and bounded by a review
|
|
12
|
+
* budget; the CLI says so when the budget withholds incidents, as the
|
|
13
|
+
* dashboard does. `--severity` and `--type` are checked here before any
|
|
14
|
+
* request, against the same lists the control plane checks.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import pc from 'picocolors';
|
|
19
|
+
import { INCIDENT_TYPES, RiskLevel } from '@intutic/shared-types';
|
|
20
|
+
import { log } from '../lib/logger.js';
|
|
21
|
+
import { fail, positiveInt, runApiCommand } from './apiCommand.js';
|
|
22
|
+
/** Most severe first, as the dashboard lists them. */
|
|
23
|
+
const SEVERITIES = Object.values(RiskLevel).reverse();
|
|
24
|
+
/** The route's query string for the given filters; fails on a severity or type the control plane would refuse. */
|
|
25
|
+
export function incidentQuery(opts) {
|
|
26
|
+
const q = new URLSearchParams();
|
|
27
|
+
if (opts.status)
|
|
28
|
+
q.set('status', opts.status.toUpperCase());
|
|
29
|
+
if (opts.severity) {
|
|
30
|
+
const severity = opts.severity.toUpperCase();
|
|
31
|
+
if (!SEVERITIES.includes(severity))
|
|
32
|
+
fail(`--severity must be one of ${SEVERITIES.join(', ')}, got "${opts.severity}"`);
|
|
33
|
+
q.set('severity', severity);
|
|
34
|
+
}
|
|
35
|
+
if (opts.type) {
|
|
36
|
+
const type = opts.type.toUpperCase();
|
|
37
|
+
if (!INCIDENT_TYPES.includes(type))
|
|
38
|
+
fail(`--type must be one of ${INCIDENT_TYPES.join(', ')}, got "${opts.type}"`);
|
|
39
|
+
q.set('type', type);
|
|
40
|
+
}
|
|
41
|
+
if (opts.page !== undefined)
|
|
42
|
+
q.set('page', String(positiveInt(opts.page, '--page')));
|
|
43
|
+
if (opts.limit !== undefined) {
|
|
44
|
+
const limit = positiveInt(opts.limit, '--limit');
|
|
45
|
+
if (limit > 100)
|
|
46
|
+
fail(`--limit is at most 100, got ${limit}`);
|
|
47
|
+
q.set('limit', String(limit));
|
|
48
|
+
}
|
|
49
|
+
const s = q.toString();
|
|
50
|
+
return s ? `?${s}` : '';
|
|
51
|
+
}
|
|
52
|
+
function severityLabel(severity) {
|
|
53
|
+
return severity === 'CRITICAL' || severity === 'HIGH' ? pc.red(severity) : severity === 'MEDIUM' ? pc.yellow(severity) : severity;
|
|
54
|
+
}
|
|
55
|
+
/** `intutic incidents list` */
|
|
56
|
+
export async function runIncidentsList(opts) {
|
|
57
|
+
const path = `/api/v1/incidents${incidentQuery(opts)}`;
|
|
58
|
+
await runApiCommand(opts, 'Failed to list incidents', (client) => client.get(path), (res) => {
|
|
59
|
+
log.header('Intutic — Incidents');
|
|
60
|
+
if (res.data.length === 0) {
|
|
61
|
+
log.dim(' No incidents match.');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
for (const i of res.data) {
|
|
65
|
+
console.log(` ${i.incident_id} ${severityLabel(i.severity)} ${i.anomaly_type} ${i.resolution_status ?? 'OPEN'} ${pc.dim(i.created_at ?? '')}`);
|
|
66
|
+
log.dim(` ${i.description}`);
|
|
67
|
+
}
|
|
68
|
+
const { total, page, limit, audit } = res.meta;
|
|
69
|
+
log.dim(` Page ${page} of ${Math.max(1, Math.ceil(total / limit))}, ${total} matching, ranked by review priority.`);
|
|
70
|
+
if (audit?.overBudget) {
|
|
71
|
+
log.warn(`The review queue covers the ${audit.budget} most suspicious of ${audit.matched} matching incidents: ${audit.withheld} not shown.`);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** `intutic incidents show <incidentId>` */
|
|
76
|
+
export async function runIncidentsShow(incidentId, opts) {
|
|
77
|
+
await runApiCommand(opts, `Failed to read incident ${incidentId}`, async (client) => (await client.get(`/api/v1/incidents/${encodeURIComponent(incidentId)}`)).data, (i) => {
|
|
78
|
+
log.header(`Intutic — Incident ${i.incident_id}`);
|
|
79
|
+
log.field('Type', i.anomaly_type);
|
|
80
|
+
log.field('Severity', severityLabel(i.severity));
|
|
81
|
+
log.field('Status', i.resolution_status ?? 'OPEN');
|
|
82
|
+
log.field('Created', i.created_at ?? '—');
|
|
83
|
+
if (i.resolved_at)
|
|
84
|
+
log.field('Resolved', `${i.resolved_at}${i.resolved_by ? ` by ${i.resolved_by}` : ''}`);
|
|
85
|
+
if (i.session_id)
|
|
86
|
+
log.field('Session', i.session_id);
|
|
87
|
+
if (i.trace_id)
|
|
88
|
+
log.field('Trace', i.trace_id);
|
|
89
|
+
log.field('Description', i.description);
|
|
90
|
+
if (i.escalation_chain)
|
|
91
|
+
log.field('Details', JSON.stringify(i.escalation_chain));
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=incidents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incidents.js","sourceRoot":"","sources":["../../src/commands/incidents.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,12 +12,13 @@
|
|
|
12
12
|
* value with a 400 naming it, so the CLI stays correct as settings are added.
|
|
13
13
|
* The MCP policy (`mcpDefaultPolicy`, `mcpHighRiskToolChange`, `mcpBudgets`,
|
|
14
14
|
* `mcpInjectionAction`, `mcpAnomalyMode`, …), the group policy
|
|
15
|
-
* (`sso_group_policy`), the PII detector actions (`piiDetectors`)
|
|
16
|
-
* `configBodyUpload` are all set
|
|
15
|
+
* (`sso_group_policy`), the PII detector actions (`piiDetectors`), upstream
|
|
16
|
+
* retries and fallbacks (`upstreamRetry`) and `configBodyUpload` are all set
|
|
17
|
+
* this way.
|
|
17
18
|
*
|
|
18
19
|
* The structured settings with a schema in `@intutic/shared-types` are
|
|
19
|
-
* checked here first, so a mistake in a budgets, group-policy or
|
|
20
|
-
* file is reported with the path of the field at fault rather than only the
|
|
20
|
+
* checked here first, so a mistake in a budgets, group-policy, detector or
|
|
21
|
+
* retry file is reported with the path of the field at fault rather than only the
|
|
21
22
|
* top-level key the server's 400 names.
|
|
22
23
|
*
|
|
23
24
|
* @module
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAOxF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAYnE;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED,mCAAmC;AACnC,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BjG;AAED,2DAA2D;AAC3D,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,cAAc,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|