@zivis/mcp 0.1.0-alpha.18 → 0.1.0-alpha.2
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/api-client.d.ts +0 -8
- package/dist/api-client.js +3 -35
- package/dist/api-client.js.map +1 -1
- package/dist/auth/index.d.ts +5 -8
- package/dist/auth/index.js +17 -32
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/keychain.d.ts +5 -6
- package/dist/auth/keychain.js +45 -50
- package/dist/auth/keychain.js.map +1 -1
- package/dist/auth/oauth.d.ts +0 -18
- package/dist/auth/oauth.js +6 -55
- package/dist/auth/oauth.js.map +1 -1
- package/dist/auth/sessions.d.ts +4 -5
- package/dist/auth/sessions.js +14 -20
- package/dist/auth/sessions.js.map +1 -1
- package/dist/auth/token-refresh.d.ts +2 -2
- package/dist/auth/token-refresh.js +9 -42
- package/dist/auth/token-refresh.js.map +1 -1
- package/dist/cli.js +20 -32
- package/dist/cli.js.map +1 -1
- package/dist/project-binding.d.ts +0 -6
- package/dist/project-binding.js +0 -21
- package/dist/project-binding.js.map +1 -1
- package/dist/server.js +6 -62
- package/dist/server.js.map +1 -1
- package/dist/tools/check-project.d.ts +4 -4
- package/dist/tools/check-project.js +63 -109
- package/dist/tools/check-project.js.map +1 -1
- package/dist/tools/check-repo-trust.d.ts +10 -4
- package/dist/tools/check-repo-trust.js +27 -56
- package/dist/tools/check-repo-trust.js.map +1 -1
- package/dist/tools/enterprise/list-agents.d.ts +1 -1
- package/dist/tools/enterprise/manage-finding.d.ts +1 -1
- package/dist/tools/get-finding-details.d.ts +10 -4
- package/dist/tools/get-finding-details.js +10 -28
- package/dist/tools/get-finding-details.js.map +1 -1
- package/dist/tools/get-findings.d.ts +10 -4
- package/dist/tools/get-findings.js +23 -44
- package/dist/tools/get-findings.js.map +1 -1
- package/dist/tools/list-applications.d.ts +1 -1
- package/dist/tools/list-scans.d.ts +10 -4
- package/dist/tools/list-scans.js +21 -55
- package/dist/tools/list-scans.js.map +1 -1
- package/dist/tools/list-test-scenarios.d.ts +10 -4
- package/dist/tools/list-test-scenarios.js +13 -41
- package/dist/tools/list-test-scenarios.js.map +1 -1
- package/dist/tools/local-scan.d.ts +1 -1
- package/dist/tools/open-in-ide.d.ts +1 -1
- package/dist/tools/setup-red-team-target.d.ts +12 -6
- package/dist/tools/setup-red-team-target.js +20 -51
- package/dist/tools/setup-red-team-target.js.map +1 -1
- package/dist/tools/triage-finding.d.ts +10 -4
- package/dist/tools/triage-finding.js +21 -30
- package/dist/tools/triage-finding.js.map +1 -1
- package/dist/types.d.ts +2 -42
- package/dist/types.js +23 -29
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/next-steps.d.ts +0 -57
- package/dist/lib/next-steps.js +0 -45
- package/dist/lib/next-steps.js.map +0 -1
- package/dist/prompts/audit-dependencies.d.ts +0 -10
- package/dist/prompts/audit-dependencies.js +0 -56
- package/dist/prompts/audit-dependencies.js.map +0 -1
- package/dist/prompts/getting-started.d.ts +0 -12
- package/dist/prompts/getting-started.js +0 -48
- package/dist/prompts/getting-started.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -14
- package/dist/prompts/index.js +0 -25
- package/dist/prompts/index.js.map +0 -1
- package/dist/prompts/prep-for-launch.d.ts +0 -9
- package/dist/prompts/prep-for-launch.js +0 -62
- package/dist/prompts/prep-for-launch.js.map +0 -1
- package/dist/prompts/secure-my-app.d.ts +0 -9
- package/dist/prompts/secure-my-app.js +0 -70
- package/dist/prompts/secure-my-app.js.map +0 -1
- package/dist/prompts/weekly-check.d.ts +0 -9
- package/dist/prompts/weekly-check.js +0 -48
- package/dist/prompts/weekly-check.js.map +0 -1
- package/dist/tools/enterprise/get-campaign.d.ts +0 -27
- package/dist/tools/enterprise/get-campaign.js +0 -31
- package/dist/tools/enterprise/get-campaign.js.map +0 -1
- package/dist/tools/enterprise/list-attack-scenarios.d.ts +0 -29
- package/dist/tools/enterprise/list-attack-scenarios.js +0 -69
- package/dist/tools/enterprise/list-attack-scenarios.js.map +0 -1
- package/dist/tools/enterprise/list-attack-step-library-tests.d.ts +0 -29
- package/dist/tools/enterprise/list-attack-step-library-tests.js +0 -61
- package/dist/tools/enterprise/list-attack-step-library-tests.js.map +0 -1
- package/dist/tools/enterprise/list-campaigns.d.ts +0 -37
- package/dist/tools/enterprise/list-campaigns.js +0 -60
- package/dist/tools/enterprise/list-campaigns.js.map +0 -1
- package/dist/tools/enterprise/list-threat-model-review-items.d.ts +0 -35
- package/dist/tools/enterprise/list-threat-model-review-items.js +0 -60
- package/dist/tools/enterprise/list-threat-model-review-items.js.map +0 -1
- package/dist/tools/enterprise/list-threat-model-versions.d.ts +0 -29
- package/dist/tools/enterprise/list-threat-model-versions.js +0 -60
- package/dist/tools/enterprise/list-threat-model-versions.js.map +0 -1
- package/dist/tools/enterprise/manage-campaign-agent-instance.d.ts +0 -42
- package/dist/tools/enterprise/manage-campaign-agent-instance.js +0 -68
- package/dist/tools/enterprise/manage-campaign-agent-instance.js.map +0 -1
- package/dist/tools/enterprise/manage-campaign-target.d.ts +0 -44
- package/dist/tools/enterprise/manage-campaign-target.js +0 -70
- package/dist/tools/enterprise/manage-campaign-target.js.map +0 -1
- package/dist/tools/enterprise/manage-campaign.d.ts +0 -62
- package/dist/tools/enterprise/manage-campaign.js +0 -114
- package/dist/tools/enterprise/manage-campaign.js.map +0 -1
- package/dist/tools/enterprise/manage-threat-model-analysis.d.ts +0 -52
- package/dist/tools/enterprise/manage-threat-model-analysis.js +0 -92
- package/dist/tools/enterprise/manage-threat-model-analysis.js.map +0 -1
- package/dist/tools/enterprise/manage-threat-model-review.d.ts +0 -47
- package/dist/tools/enterprise/manage-threat-model-review.js +0 -82
- package/dist/tools/enterprise/manage-threat-model-review.js.map +0 -1
- package/dist/tools/get-application-auth-config.d.ts +0 -27
- package/dist/tools/get-application-auth-config.js +0 -44
- package/dist/tools/get-application-auth-config.js.map +0 -1
- package/dist/tools/get-started.d.ts +0 -28
- package/dist/tools/get-started.js +0 -364
- package/dist/tools/get-started.js.map +0 -1
- package/dist/tools/manage-application.d.ts +0 -72
- package/dist/tools/manage-application.js +0 -138
- package/dist/tools/manage-application.js.map +0 -1
- package/dist/tools/manage-endpoint-lifecycle.d.ts +0 -90
- package/dist/tools/manage-endpoint-lifecycle.js +0 -191
- package/dist/tools/manage-endpoint-lifecycle.js.map +0 -1
package/dist/auth/oauth.js
CHANGED
|
@@ -19,7 +19,7 @@ import { URL } from "node:url";
|
|
|
19
19
|
import open from "open";
|
|
20
20
|
import { keychainStore, getSessionAccount } from "./keychain.js";
|
|
21
21
|
import { decodeJwtPayload } from "./jwt.js";
|
|
22
|
-
import { DEFAULT_CONFIG
|
|
22
|
+
import { DEFAULT_CONFIG } from "../types.js";
|
|
23
23
|
const LOGIN_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
24
24
|
function generatePKCE() {
|
|
25
25
|
const verifier = crypto.randomBytes(32).toString("base64url");
|
|
@@ -169,18 +169,6 @@ async function exchangeCodeForTokens(config, code, codeVerifier) {
|
|
|
169
169
|
throw new Error(errorMsg);
|
|
170
170
|
}
|
|
171
171
|
const data = (await response.json());
|
|
172
|
-
if (!data.refresh_token) {
|
|
173
|
-
// This means WorkOS isn't issuing refresh tokens for this client.
|
|
174
|
-
// Most likely cause: the OAuth client in the WorkOS dashboard doesn't have
|
|
175
|
-
// "Refresh Tokens" enabled, or offline_access scope was rejected.
|
|
176
|
-
// Without a refresh token the user will be logged out after every access token expiry.
|
|
177
|
-
console.error("[zivis] WARNING: WorkOS did not return a refresh_token. " +
|
|
178
|
-
"Verify the OAuth client has Refresh Tokens / offline_access enabled in the WorkOS dashboard. " +
|
|
179
|
-
"Without this, sessions will expire and require manual re-login.");
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
console.error("[zivis] Token exchange complete — refresh_token received, session will auto-renew.");
|
|
183
|
-
}
|
|
184
172
|
return {
|
|
185
173
|
access_token: data.access_token,
|
|
186
174
|
refresh_token: data.refresh_token,
|
|
@@ -201,8 +189,7 @@ export async function login(config = DEFAULT_CONFIG, session, organizationId, op
|
|
|
201
189
|
const orgLabel = opts.orgName
|
|
202
190
|
? `${opts.orgName} (${organizationId})`
|
|
203
191
|
: organizationId;
|
|
204
|
-
const
|
|
205
|
-
const sessionLabel = displaySession ? ` as session "${displaySession}"` : "";
|
|
192
|
+
const sessionLabel = session ? ` as session "${session}"` : "";
|
|
206
193
|
console.error("");
|
|
207
194
|
console.error(`[zivis] About to authenticate to org: ${orgLabel}${sessionLabel}`);
|
|
208
195
|
const rl = readline.createInterface({
|
|
@@ -224,45 +211,9 @@ export async function login(config = DEFAULT_CONFIG, session, organizationId, op
|
|
|
224
211
|
}
|
|
225
212
|
// Start callback server before opening browser
|
|
226
213
|
const codePromise = startCallbackServer(config.callbackPort, state);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
console.error(` ${authUrl}`);
|
|
231
|
-
console.error("");
|
|
232
|
-
console.error("[zivis] Waiting for login...");
|
|
233
|
-
}
|
|
234
|
-
else if (opts.incognito) {
|
|
235
|
-
let opened = false;
|
|
236
|
-
// Try Chrome incognito, then Firefox private, then fall back to printing URL
|
|
237
|
-
for (const app of [
|
|
238
|
-
{ name: "google chrome", args: ["--incognito"] },
|
|
239
|
-
{ name: "chromium", args: ["--incognito"] },
|
|
240
|
-
{ name: "firefox", args: ["-private-window"] },
|
|
241
|
-
]) {
|
|
242
|
-
try {
|
|
243
|
-
await open(authUrl, { app: { name: app.name, arguments: [authUrl, ...app.args] } });
|
|
244
|
-
console.error(`[zivis] Opened private window in ${app.name} — waiting for login...`);
|
|
245
|
-
opened = true;
|
|
246
|
-
break;
|
|
247
|
-
}
|
|
248
|
-
catch {
|
|
249
|
-
// browser not found, try next
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
if (!opened) {
|
|
253
|
-
console.error("[zivis] Could not open an incognito window automatically.");
|
|
254
|
-
console.error("[zivis] Paste this URL into a private/incognito browser window:");
|
|
255
|
-
console.error("");
|
|
256
|
-
console.error(` ${authUrl}`);
|
|
257
|
-
console.error("");
|
|
258
|
-
console.error("[zivis] Waiting for login...");
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
console.error("[zivis] Opening browser for authentication...");
|
|
263
|
-
await open(authUrl);
|
|
264
|
-
console.error("[zivis] Waiting for login...");
|
|
265
|
-
}
|
|
214
|
+
console.error("[zivis] Opening browser for authentication...");
|
|
215
|
+
await open(authUrl);
|
|
216
|
+
console.error("[zivis] Waiting for login...");
|
|
266
217
|
// Wait for the authorization code
|
|
267
218
|
const code = await codePromise;
|
|
268
219
|
// Exchange code for tokens
|
|
@@ -284,7 +235,7 @@ export async function login(config = DEFAULT_CONFIG, session, organizationId, op
|
|
|
284
235
|
console.error(`[zivis] \u2713 JWT org_id verified: ${jwtOrgId}`);
|
|
285
236
|
}
|
|
286
237
|
// Store in keychain (session-qualified key for multi-tenant isolation)
|
|
287
|
-
await keychainStore(getSessionAccount(session), JSON.stringify(tokens)
|
|
238
|
+
await keychainStore(getSessionAccount(session), JSON.stringify(tokens));
|
|
288
239
|
return tokens;
|
|
289
240
|
}
|
|
290
241
|
//# sourceMappingURL=oauth.js.map
|
package/dist/auth/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/sessions.d.ts
CHANGED
|
@@ -7,23 +7,22 @@
|
|
|
7
7
|
* Session index file: ~/.config/{configDir}/sessions.json
|
|
8
8
|
*/
|
|
9
9
|
import type { SessionIndex, SessionInfo } from "../types.js";
|
|
10
|
-
import { type CredentialStorage } from "../types.js";
|
|
11
10
|
/**
|
|
12
11
|
* Load the session index from disk.
|
|
13
12
|
* Returns an empty object if the file doesn't exist.
|
|
14
13
|
*/
|
|
15
|
-
export declare function loadSessionIndex(
|
|
14
|
+
export declare function loadSessionIndex(): Promise<SessionIndex>;
|
|
16
15
|
/**
|
|
17
16
|
* Add or update a session entry in the index.
|
|
18
17
|
*/
|
|
19
|
-
export declare function saveSessionEntry(name: string, email: string
|
|
18
|
+
export declare function saveSessionEntry(name: string, email: string): Promise<void>;
|
|
20
19
|
/**
|
|
21
20
|
* Remove a session entry from the index.
|
|
22
21
|
*/
|
|
23
|
-
export declare function removeSessionEntry(name: string
|
|
22
|
+
export declare function removeSessionEntry(name: string): Promise<void>;
|
|
24
23
|
/**
|
|
25
24
|
* List all sessions with their metadata.
|
|
26
25
|
*/
|
|
27
|
-
export declare function listSessions(
|
|
26
|
+
export declare function listSessions(): Promise<Array<{
|
|
28
27
|
name: string;
|
|
29
28
|
} & SessionInfo>>;
|
package/dist/auth/sessions.js
CHANGED
|
@@ -10,14 +10,8 @@ import * as fs from "node:fs/promises";
|
|
|
10
10
|
import * as path from "node:path";
|
|
11
11
|
import * as os from "node:os";
|
|
12
12
|
import { ENV_CONFIG } from "../types.js";
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
keychainPrefix: ENV_CONFIG.keychainPrefix,
|
|
16
|
-
configDir: ENV_CONFIG.configDir,
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
function getSessionIndexPath(storage) {
|
|
20
|
-
const { configDir } = resolveSessionStorage(storage);
|
|
13
|
+
function getSessionIndexPath() {
|
|
14
|
+
const configDir = ENV_CONFIG.configDir;
|
|
21
15
|
const base = process.platform === "win32"
|
|
22
16
|
? process.env.APPDATA || os.homedir()
|
|
23
17
|
: path.join(os.homedir(), ".config");
|
|
@@ -27,9 +21,9 @@ function getSessionIndexPath(storage) {
|
|
|
27
21
|
* Load the session index from disk.
|
|
28
22
|
* Returns an empty object if the file doesn't exist.
|
|
29
23
|
*/
|
|
30
|
-
export async function loadSessionIndex(
|
|
24
|
+
export async function loadSessionIndex() {
|
|
31
25
|
try {
|
|
32
|
-
const raw = await fs.readFile(getSessionIndexPath(
|
|
26
|
+
const raw = await fs.readFile(getSessionIndexPath(), "utf8");
|
|
33
27
|
return JSON.parse(raw);
|
|
34
28
|
}
|
|
35
29
|
catch {
|
|
@@ -39,8 +33,8 @@ export async function loadSessionIndex(storage) {
|
|
|
39
33
|
/**
|
|
40
34
|
* Save the full session index to disk.
|
|
41
35
|
*/
|
|
42
|
-
async function saveSessionIndex(index
|
|
43
|
-
const filePath = getSessionIndexPath(
|
|
36
|
+
async function saveSessionIndex(index) {
|
|
37
|
+
const filePath = getSessionIndexPath();
|
|
44
38
|
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
45
39
|
await fs.writeFile(filePath, JSON.stringify(index, null, 2) + "\n", {
|
|
46
40
|
mode: 0o600,
|
|
@@ -49,27 +43,27 @@ async function saveSessionIndex(index, storage) {
|
|
|
49
43
|
/**
|
|
50
44
|
* Add or update a session entry in the index.
|
|
51
45
|
*/
|
|
52
|
-
export async function saveSessionEntry(name, email
|
|
53
|
-
const index = await loadSessionIndex(
|
|
46
|
+
export async function saveSessionEntry(name, email) {
|
|
47
|
+
const index = await loadSessionIndex();
|
|
54
48
|
index[name] = {
|
|
55
49
|
email,
|
|
56
50
|
createdAt: index[name]?.createdAt || new Date().toISOString(),
|
|
57
51
|
};
|
|
58
|
-
await saveSessionIndex(index
|
|
52
|
+
await saveSessionIndex(index);
|
|
59
53
|
}
|
|
60
54
|
/**
|
|
61
55
|
* Remove a session entry from the index.
|
|
62
56
|
*/
|
|
63
|
-
export async function removeSessionEntry(name
|
|
64
|
-
const index = await loadSessionIndex(
|
|
57
|
+
export async function removeSessionEntry(name) {
|
|
58
|
+
const index = await loadSessionIndex();
|
|
65
59
|
delete index[name];
|
|
66
|
-
await saveSessionIndex(index
|
|
60
|
+
await saveSessionIndex(index);
|
|
67
61
|
}
|
|
68
62
|
/**
|
|
69
63
|
* List all sessions with their metadata.
|
|
70
64
|
*/
|
|
71
|
-
export async function listSessions(
|
|
72
|
-
const index = await loadSessionIndex(
|
|
65
|
+
export async function listSessions() {
|
|
66
|
+
const index = await loadSessionIndex();
|
|
73
67
|
return Object.entries(index).map(([name, info]) => ({ name, ...info }));
|
|
74
68
|
}
|
|
75
69
|
//# sourceMappingURL=sessions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/auth/sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/auth/sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,mBAAmB;IAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE;QACrC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,KAAmB;IACjD,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAClE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,KAAa;IAEb,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,GAAG;QACZ,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC9D,CAAC;IACF,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAGhC,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* refresh token. Checks expiry with a 5-minute buffer to avoid
|
|
6
6
|
* mid-request expirations.
|
|
7
7
|
*/
|
|
8
|
-
import type { OAuthTokens, ZivisConfig
|
|
8
|
+
import type { OAuthTokens, ZivisConfig } from "../types.js";
|
|
9
9
|
/**
|
|
10
10
|
* Load OAuth tokens from keychain
|
|
11
11
|
* @param session - Optional named session for multi-tenant isolation
|
|
12
12
|
*/
|
|
13
|
-
export declare function loadTokens(session?: string
|
|
13
|
+
export declare function loadTokens(session?: string): Promise<OAuthTokens | null>;
|
|
14
14
|
/**
|
|
15
15
|
* Check if the access token is still valid (with 5-min buffer)
|
|
16
16
|
*/
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* mid-request expirations.
|
|
7
7
|
*/
|
|
8
8
|
import { keychainRead, keychainStore, keychainDelete, getSessionAccount } from "./keychain.js";
|
|
9
|
-
import { DEFAULT_CONFIG
|
|
10
|
-
const EXPIRY_BUFFER_MS =
|
|
9
|
+
import { DEFAULT_CONFIG } from "../types.js";
|
|
10
|
+
const EXPIRY_BUFFER_MS = 5 * 60 * 1000; // 5 minutes
|
|
11
11
|
/**
|
|
12
12
|
* Load OAuth tokens from keychain
|
|
13
13
|
* @param session - Optional named session for multi-tenant isolation
|
|
14
14
|
*/
|
|
15
|
-
export async function loadTokens(session
|
|
16
|
-
const raw = await keychainRead(getSessionAccount(session)
|
|
15
|
+
export async function loadTokens(session) {
|
|
16
|
+
const raw = await keychainRead(getSessionAccount(session));
|
|
17
17
|
if (!raw)
|
|
18
18
|
return null;
|
|
19
19
|
try {
|
|
@@ -29,16 +29,6 @@ export async function loadTokens(session, storage) {
|
|
|
29
29
|
export function isTokenValid(tokens) {
|
|
30
30
|
return tokens.expires_at > Date.now() + EXPIRY_BUFFER_MS;
|
|
31
31
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Errors that indicate the refresh token itself is permanently invalid.
|
|
34
|
-
* On these we should clear stored credentials and force re-login.
|
|
35
|
-
* Anything else (network error, server error) is transient — keep credentials.
|
|
36
|
-
*/
|
|
37
|
-
const FATAL_REFRESH_ERRORS = new Set([
|
|
38
|
-
"invalid_grant", // refresh token expired or revoked
|
|
39
|
-
"invalid_client", // client ID mismatch
|
|
40
|
-
"unauthorized_client", // client not allowed to use refresh tokens
|
|
41
|
-
]);
|
|
42
32
|
/**
|
|
43
33
|
* Refresh the access token using the refresh token
|
|
44
34
|
*/
|
|
@@ -57,12 +47,7 @@ async function refreshAccessToken(refreshToken, config) {
|
|
|
57
47
|
});
|
|
58
48
|
if (!response.ok) {
|
|
59
49
|
const error = (await response.json().catch(() => ({})));
|
|
60
|
-
|
|
61
|
-
const errorMsg = error.error_description || errorCode || "Token refresh failed";
|
|
62
|
-
// Attach the OAuth error code so the caller can decide whether to clear credentials
|
|
63
|
-
const err = new Error(errorMsg);
|
|
64
|
-
err.oauthErrorCode = errorCode;
|
|
65
|
-
throw err;
|
|
50
|
+
throw new Error(error.error_description || error.error || "Token refresh failed");
|
|
66
51
|
}
|
|
67
52
|
const data = (await response.json());
|
|
68
53
|
return {
|
|
@@ -82,43 +67,25 @@ async function refreshAccessToken(refreshToken, config) {
|
|
|
82
67
|
export async function getValidAccessToken(config = DEFAULT_CONFIG) {
|
|
83
68
|
const session = config.session;
|
|
84
69
|
const account = getSessionAccount(session);
|
|
85
|
-
const
|
|
86
|
-
const tokens = await loadTokens(session, st);
|
|
70
|
+
const tokens = await loadTokens(session);
|
|
87
71
|
if (!tokens) {
|
|
88
72
|
return null;
|
|
89
73
|
}
|
|
90
74
|
if (isTokenValid(tokens)) {
|
|
91
75
|
return tokens.access_token;
|
|
92
76
|
}
|
|
93
|
-
const expiresInSec = Math.round((tokens.expires_at - Date.now()) / 1000);
|
|
94
77
|
if (tokens.refresh_token) {
|
|
95
|
-
console.error(`[zivis] Access token expiring in ${expiresInSec}s — refreshing silently...`);
|
|
96
78
|
try {
|
|
97
79
|
const newTokens = await refreshAccessToken(tokens.refresh_token, config);
|
|
98
|
-
await keychainStore(account, JSON.stringify(newTokens)
|
|
99
|
-
const newExpiresInMin = Math.round((newTokens.expires_at - Date.now()) / 1000 / 60);
|
|
100
|
-
console.error(`[zivis] Token refreshed successfully — new token valid for ~${newExpiresInMin}m`);
|
|
80
|
+
await keychainStore(account, JSON.stringify(newTokens));
|
|
101
81
|
return newTokens.access_token;
|
|
102
82
|
}
|
|
103
83
|
catch (err) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
console.error(`[zivis] Token refresh failed (${oauthCode ?? "network/server error"}):`, err instanceof Error ? err.message : err);
|
|
107
|
-
if (isFatal) {
|
|
108
|
-
// Refresh token is permanently invalid — clear credentials so the user
|
|
109
|
-
// gets a clear "please re-login" message rather than silent failures.
|
|
110
|
-
console.error("[zivis] Refresh token revoked or expired — clearing stored credentials. Run: zivis auth login");
|
|
111
|
-
await keychainDelete(account, st);
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
// Transient failure (network, 5xx, timeout) — keep credentials so the
|
|
115
|
-
// next request can retry. Don't log the user out over a bad network.
|
|
116
|
-
console.error("[zivis] Transient refresh error — keeping stored credentials, will retry on next request.");
|
|
117
|
-
}
|
|
84
|
+
console.error("[zivis] Token refresh failed:", err instanceof Error ? err.message : err);
|
|
85
|
+
await keychainDelete(account);
|
|
118
86
|
return null;
|
|
119
87
|
}
|
|
120
88
|
}
|
|
121
|
-
console.error(`[zivis] Access token expired ${Math.abs(expiresInSec)}s ago and no refresh token stored — re-login required`);
|
|
122
89
|
return null;
|
|
123
90
|
}
|
|
124
91
|
//# sourceMappingURL=token-refresh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-refresh.js","sourceRoot":"","sources":["../../src/auth/token-refresh.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE/F,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"token-refresh.js","sourceRoot":"","sources":["../../src/auth/token-refresh.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -13,9 +13,9 @@ import { login, keychainClearAll, keychainClearSession, getStorageName, keychain
|
|
|
13
13
|
import { resolveAuth } from "./auth/index.js";
|
|
14
14
|
import { decodeJwtPayload } from "./auth/jwt.js";
|
|
15
15
|
import { getValidAccessToken } from "./auth/token-refresh.js";
|
|
16
|
-
import { detectProjectBinding
|
|
16
|
+
import { detectProjectBinding } from "./project-binding.js";
|
|
17
17
|
import { startServer } from "./server.js";
|
|
18
|
-
import { DEFAULT_CONFIG
|
|
18
|
+
import { DEFAULT_CONFIG } from "./types.js";
|
|
19
19
|
import * as readline from "node:readline/promises";
|
|
20
20
|
import * as fs from "node:fs";
|
|
21
21
|
import * as path from "node:path";
|
|
@@ -62,29 +62,23 @@ export function parseArgs(argv) {
|
|
|
62
62
|
* Run the appropriate CLI command
|
|
63
63
|
*/
|
|
64
64
|
export async function runCli(command, options, config = DEFAULT_CONFIG) {
|
|
65
|
-
const cwdResolved = resolveConfigFromBinding(process.cwd());
|
|
66
|
-
const merged = {
|
|
67
|
-
...DEFAULT_CONFIG,
|
|
68
|
-
...cwdResolved,
|
|
69
|
-
...config,
|
|
70
|
-
};
|
|
71
65
|
switch (command) {
|
|
72
66
|
case "login":
|
|
73
|
-
return handleLogin(options,
|
|
67
|
+
return handleLogin(options, config);
|
|
74
68
|
case "configure":
|
|
75
|
-
return handleConfigure(options,
|
|
69
|
+
return handleConfigure(options, config);
|
|
76
70
|
case "status":
|
|
77
|
-
return handleStatus(options,
|
|
71
|
+
return handleStatus(options, config);
|
|
78
72
|
case "logout":
|
|
79
73
|
return handleLogout(options);
|
|
80
74
|
case "sessions":
|
|
81
75
|
return handleSessions(options);
|
|
82
76
|
case "init":
|
|
83
|
-
return handleInit(options,
|
|
77
|
+
return handleInit(options, config);
|
|
84
78
|
case "setup-ide":
|
|
85
79
|
return handleSetupIde(options);
|
|
86
80
|
case "serve":
|
|
87
|
-
return handleServe(
|
|
81
|
+
return handleServe(config);
|
|
88
82
|
case "help":
|
|
89
83
|
case "--help":
|
|
90
84
|
case "-h":
|
|
@@ -140,7 +134,7 @@ async function handleLogin(options, config) {
|
|
|
140
134
|
const email = extractEmail(tokens.id_token);
|
|
141
135
|
// Update session index
|
|
142
136
|
const sessionName = session || "default";
|
|
143
|
-
await saveSessionEntry(sessionName, email
|
|
137
|
+
await saveSessionEntry(sessionName, email);
|
|
144
138
|
const sessionLabel = session ? ` (session: ${session})` : "";
|
|
145
139
|
console.log(`\u2713 Logged in as ${email}${sessionLabel}`);
|
|
146
140
|
console.log(`\u2713 Credentials stored in ${storageName}`);
|
|
@@ -180,7 +174,7 @@ async function handleLogin(options, config) {
|
|
|
180
174
|
process.exit(1);
|
|
181
175
|
}
|
|
182
176
|
}
|
|
183
|
-
async function handleConfigure(options,
|
|
177
|
+
async function handleConfigure(options, _config) {
|
|
184
178
|
let apiKey = options["api-key"];
|
|
185
179
|
if (!apiKey) {
|
|
186
180
|
// Interactive mode — read from stdin
|
|
@@ -197,7 +191,7 @@ async function handleConfigure(options, config) {
|
|
|
197
191
|
apiKey = apiKey.trim();
|
|
198
192
|
}
|
|
199
193
|
try {
|
|
200
|
-
await keychainStore("apikey", apiKey
|
|
194
|
+
await keychainStore("apikey", apiKey);
|
|
201
195
|
const storageName = getStorageName();
|
|
202
196
|
const masked = apiKey.startsWith("sk_")
|
|
203
197
|
? `sk_...${apiKey.slice(-4)}`
|
|
@@ -262,32 +256,28 @@ async function handleStatus(options, config) {
|
|
|
262
256
|
console.log(`API: ${resolveConfig.apiBaseUrl}`);
|
|
263
257
|
}
|
|
264
258
|
async function handleLogout(options) {
|
|
265
|
-
const config = resolveConfigFromBinding(process.cwd());
|
|
266
|
-
const st = credentialStorageFromConfig(config);
|
|
267
259
|
const session = options["session"];
|
|
268
260
|
if (session) {
|
|
269
|
-
await keychainClearSession(session
|
|
270
|
-
await removeSessionEntry(session
|
|
261
|
+
await keychainClearSession(session);
|
|
262
|
+
await removeSessionEntry(session);
|
|
271
263
|
console.log(`\u2713 Session "${session}" credentials cleared`);
|
|
272
264
|
}
|
|
273
265
|
else {
|
|
274
|
-
await keychainClearAll(
|
|
266
|
+
await keychainClearAll();
|
|
275
267
|
console.log("\u2713 Default credentials cleared");
|
|
276
268
|
console.log(" Note: Named sessions are not affected. Use 'zivis auth sessions' to list them.");
|
|
277
269
|
}
|
|
278
270
|
}
|
|
279
271
|
async function handleSessions(options) {
|
|
280
|
-
const config = resolveConfigFromBinding(process.cwd());
|
|
281
|
-
const st = credentialStorageFromConfig(config);
|
|
282
272
|
// Sub-command: zivis auth sessions remove <name>
|
|
283
273
|
const subCommand = options["remove"] || options["delete"];
|
|
284
274
|
if (subCommand) {
|
|
285
|
-
await keychainClearSession(subCommand
|
|
286
|
-
await removeSessionEntry(subCommand
|
|
275
|
+
await keychainClearSession(subCommand);
|
|
276
|
+
await removeSessionEntry(subCommand);
|
|
287
277
|
console.log(`\u2713 Session "${subCommand}" removed`);
|
|
288
278
|
return;
|
|
289
279
|
}
|
|
290
|
-
const sessions = await listSessions(
|
|
280
|
+
const sessions = await listSessions();
|
|
291
281
|
const activeSession = process.env.ZIVIS_SESSION;
|
|
292
282
|
if (sessions.length === 0) {
|
|
293
283
|
console.log("No sessions stored.");
|
|
@@ -501,7 +491,7 @@ async function handleInit(options, config) {
|
|
|
501
491
|
const tokens = await login(config);
|
|
502
492
|
accessToken = tokens.access_token;
|
|
503
493
|
const email = extractEmail(tokens.id_token);
|
|
504
|
-
await saveSessionEntry("default", email
|
|
494
|
+
await saveSessionEntry("default", email);
|
|
505
495
|
console.log(` \u2713 Logged in as ${email}`);
|
|
506
496
|
console.log("");
|
|
507
497
|
}
|
|
@@ -562,7 +552,7 @@ async function handleInit(options, config) {
|
|
|
562
552
|
});
|
|
563
553
|
tokenForApi = tokens.access_token;
|
|
564
554
|
const email = extractEmail(tokens.id_token);
|
|
565
|
-
await saveSessionEntry(session, email
|
|
555
|
+
await saveSessionEntry(session, email);
|
|
566
556
|
console.log(` \u2713 Logged in as ${email} (org: ${selectedOrg.name})`);
|
|
567
557
|
console.log(` \u2713 JWT scoped to organization: ${selectedOrg.workosOrgId}`);
|
|
568
558
|
console.log("");
|
|
@@ -961,11 +951,9 @@ SETUP IDE OPTIONS
|
|
|
961
951
|
ENVIRONMENT VARIABLES
|
|
962
952
|
ZIVIS_SESSION Named session for multi-tenant isolation
|
|
963
953
|
ZIVIS_API_KEY API key (fallback when keychain is unavailable)
|
|
964
|
-
ZIVIS_API_URL API base URL (default: https://
|
|
954
|
+
ZIVIS_API_URL API base URL (default: https://api.zivis.ai)
|
|
965
955
|
ZIVIS_OAUTH_CLIENT_ID OAuth client ID (optional, overrides default)
|
|
966
|
-
ZIVIS_OAUTH_API_URL OAuth API URL (default: https://
|
|
967
|
-
ZIVIS_KEYCHAIN_PREFIX Keychain namespace override (optional)
|
|
968
|
-
ZIVIS_CONFIG_DIR Local config dir override under ~/.config (optional)
|
|
956
|
+
ZIVIS_OAUTH_API_URL OAuth API URL (default: https://auth.workos.com)
|
|
969
957
|
`);
|
|
970
958
|
}
|
|
971
959
|
function handleVersion() {
|