@indemn/cli 1.7.7 → 1.7.8
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +3 -1
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +95 -62
- package/dist/cli/auth.js.map +1 -1
- package/dist/mcp/registry.d.ts +12 -0
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +36 -3
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +15 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +16 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/sdk/access.d.ts +60 -0
- package/dist/sdk/access.d.ts.map +1 -0
- package/dist/sdk/access.js +115 -0
- package/dist/sdk/access.js.map +1 -0
- package/dist/sdk/auth.d.ts +7 -0
- package/dist/sdk/auth.d.ts.map +1 -1
- package/dist/sdk/auth.js +21 -2
- package/dist/sdk/auth.js.map +1 -1
- package/dist/sdk/browser-login.d.ts +49 -0
- package/dist/sdk/browser-login.d.ts.map +1 -0
- package/dist/sdk/browser-login.js +159 -0
- package/dist/sdk/browser-login.js.map +1 -0
- package/dist/sdk/client.d.ts +2 -0
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +31 -3
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/credentials.d.ts +2 -0
- package/dist/sdk/credentials.d.ts.map +1 -1
- package/dist/sdk/credentials.js +4 -0
- package/dist/sdk/credentials.js.map +1 -1
- package/dist/sdk/eval.d.ts +3 -3
- package/dist/sdk/eval.js +3 -3
- package/dist/sdk/types.d.ts +3 -0
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/types.js +0 -1
- package/dist/sdk/types.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/auth.ts +93 -63
- package/src/mcp/registry.ts +43 -4
- package/src/mcp/server.ts +20 -1
- package/src/mcp/tools.ts +15 -0
- package/src/sdk/access.ts +143 -0
- package/src/sdk/auth.ts +23 -2
- package/src/sdk/browser-login.ts +193 -0
- package/src/sdk/client.ts +25 -3
- package/src/sdk/credentials.ts +5 -0
- package/src/sdk/eval.ts +3 -3
- package/src/sdk/types.ts +3 -0
- package/test/mcp/access.test.ts +158 -0
- package/test/sdk/auth.test.ts +2 -1
- package/test/sdk/browser-login.test.ts +147 -0
- package/test/sdk/client.test.ts +134 -1
- package/test/sdk/credentials.test.ts +6 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { IndemnClient } from './client.js';
|
|
2
|
+
/**
|
|
3
|
+
* What the signed-in person may do, as copilot-server reports it
|
|
4
|
+
* (GET /auth/me/access). Display information only: copilot-server and
|
|
5
|
+
* darwin-service still decide every request. The CLI uses it to hide MCP
|
|
6
|
+
* tools the person can't use anywhere and to explain refusals by role.
|
|
7
|
+
* Unknown access (older server, offline) hides nothing.
|
|
8
|
+
*/
|
|
9
|
+
export interface AccessProject {
|
|
10
|
+
project_id: string;
|
|
11
|
+
name: string | null;
|
|
12
|
+
role: string;
|
|
13
|
+
capabilities: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface AccessOrg {
|
|
16
|
+
org_id: string;
|
|
17
|
+
org_name: string;
|
|
18
|
+
role: string | null;
|
|
19
|
+
is_org_admin: boolean;
|
|
20
|
+
capabilities: string[];
|
|
21
|
+
projects: AccessProject[];
|
|
22
|
+
}
|
|
23
|
+
export interface Access {
|
|
24
|
+
user: {
|
|
25
|
+
id: string;
|
|
26
|
+
email: string;
|
|
27
|
+
name: string | null;
|
|
28
|
+
};
|
|
29
|
+
is_indemn_staff: boolean;
|
|
30
|
+
capabilities: string[];
|
|
31
|
+
orgs: AccessOrg[];
|
|
32
|
+
fetched_at?: string;
|
|
33
|
+
}
|
|
34
|
+
type Scope = 'user' | 'org' | 'project';
|
|
35
|
+
/** MCP tools whose use depends on a role, staff email or org setting (copilot config/cliCapabilities.js). */
|
|
36
|
+
export declare const TOOL_REQUIRES: Readonly<Record<string, {
|
|
37
|
+
scope: Scope;
|
|
38
|
+
capability: string;
|
|
39
|
+
}>>;
|
|
40
|
+
/** The last known access: this process's, else the one saved with the login (config credential only). */
|
|
41
|
+
export declare function currentAccess(client?: IndemnClient): Access | null;
|
|
42
|
+
/** Forget the in-process copy (tests, logout). */
|
|
43
|
+
export declare function resetAccess(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Ask copilot again. Saved with the login only when the credential is the saved
|
|
46
|
+
* login; a host's session (INDEMN_TOKEN) never writes to this machine's config.
|
|
47
|
+
* Returns null when it can't be read (older server, offline): callers then hide nothing.
|
|
48
|
+
*/
|
|
49
|
+
export declare function refreshAccess(client: IndemnClient): Promise<Access | null>;
|
|
50
|
+
/** True unless access is known and says the tool can't be used in any org/project in view. */
|
|
51
|
+
export declare function usableSomewhere(tool: string, access: Access | null, onlyOrgId?: string): boolean;
|
|
52
|
+
/** The person's role in an org, for messages ("agent in Acme"). */
|
|
53
|
+
export declare function roleIn(access: Access | null, orgId: string | undefined): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* For org-scoped requirements: why this org can't be used, or null. Project-scoped
|
|
56
|
+
* requirements are decided by the server (the project comes from the agent).
|
|
57
|
+
*/
|
|
58
|
+
export declare function orgDenial(tool: string, access: Access | null, orgId: string | undefined): string | null;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/sdk/access.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzD,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAExC,6GAA6G;AAC7G,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAcvF,CAAC;AAIH,yGAAyG;AACzG,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAKlE;AAiBD,kDAAkD;AAClD,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWhF;AAMD,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAOhG;AAED,mEAAmE;AACnE,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKtF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAgBvG"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { IndemnClient } from './client.js';
|
|
2
|
+
/** MCP tools whose use depends on a role, staff email or org setting (copilot config/cliCapabilities.js). */
|
|
3
|
+
export const TOOL_REQUIRES = Object.freeze({
|
|
4
|
+
create_sandbox_org: { scope: 'user', capability: 'org:sandbox_create' },
|
|
5
|
+
set_org_admin_settings: { scope: 'user', capability: 'org:admin_settings' },
|
|
6
|
+
get_conversation: { scope: 'project', capability: 'conversations:read' },
|
|
7
|
+
chat_with_agent: { scope: 'project', capability: 'conversations:read' },
|
|
8
|
+
mark_conversation_test: { scope: 'project', capability: 'conversations:mark_test' },
|
|
9
|
+
list_tickets: { scope: 'org', capability: 'tickets' },
|
|
10
|
+
get_ticket: { scope: 'org', capability: 'tickets' },
|
|
11
|
+
create_ticket: { scope: 'org', capability: 'tickets' },
|
|
12
|
+
update_ticket: { scope: 'org', capability: 'tickets' },
|
|
13
|
+
archive_ticket: { scope: 'org', capability: 'tickets' },
|
|
14
|
+
list_ticket_rules: { scope: 'org', capability: 'tickets' },
|
|
15
|
+
save_ticket_rule: { scope: 'org', capability: 'tickets' },
|
|
16
|
+
delete_ticket_rule: { scope: 'org', capability: 'tickets' },
|
|
17
|
+
});
|
|
18
|
+
let memo = null;
|
|
19
|
+
/** The last known access: this process's, else the one saved with the login (config credential only). */
|
|
20
|
+
export function currentAccess(client) {
|
|
21
|
+
if (memo)
|
|
22
|
+
return memo;
|
|
23
|
+
// A host session (INDEMN_TOKEN) may be a different identity than the saved login; don't use its access.
|
|
24
|
+
const source = (client ?? new IndemnClient()).getCredential()?.source;
|
|
25
|
+
return source === 'config' ? IndemnClient.loadConfig()?.access ?? null : null;
|
|
26
|
+
}
|
|
27
|
+
/** Defend against a malformed payload: every array field defaults to empty, bad orgs are dropped. */
|
|
28
|
+
function normalize(raw) {
|
|
29
|
+
const strings = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string') : []);
|
|
30
|
+
const orgs = (Array.isArray(raw.orgs) ? raw.orgs : [])
|
|
31
|
+
.filter((o) => Boolean(o) && typeof o.org_id === 'string')
|
|
32
|
+
.map((o) => ({
|
|
33
|
+
...o,
|
|
34
|
+
capabilities: strings(o.capabilities),
|
|
35
|
+
projects: (Array.isArray(o.projects) ? o.projects : [])
|
|
36
|
+
.filter((pr) => Boolean(pr) && typeof pr.project_id === 'string')
|
|
37
|
+
.map((pr) => ({ ...pr, capabilities: strings(pr.capabilities) })),
|
|
38
|
+
}));
|
|
39
|
+
return { capabilities: strings(raw.capabilities), orgs };
|
|
40
|
+
}
|
|
41
|
+
/** Forget the in-process copy (tests, logout). */
|
|
42
|
+
export function resetAccess() {
|
|
43
|
+
memo = null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Ask copilot again. Saved with the login only when the credential is the saved
|
|
47
|
+
* login; a host's session (INDEMN_TOKEN) never writes to this machine's config.
|
|
48
|
+
* Returns null when it can't be read (older server, offline): callers then hide nothing.
|
|
49
|
+
*/
|
|
50
|
+
export async function refreshAccess(client) {
|
|
51
|
+
try {
|
|
52
|
+
const raw = await client.copilotGet('/auth/me/access');
|
|
53
|
+
if (!raw || !Array.isArray(raw.orgs))
|
|
54
|
+
return null;
|
|
55
|
+
const stamped = { ...raw, ...normalize(raw), fetched_at: new Date().toISOString() };
|
|
56
|
+
memo = stamped;
|
|
57
|
+
if (client.getCredential()?.source === 'config')
|
|
58
|
+
IndemnClient.saveConfig({ access: stamped });
|
|
59
|
+
return stamped;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function orgsInView(access, onlyOrgId) {
|
|
66
|
+
return onlyOrgId ? access.orgs.filter((o) => o.org_id === onlyOrgId) : access.orgs;
|
|
67
|
+
}
|
|
68
|
+
/** True unless access is known and says the tool can't be used in any org/project in view. */
|
|
69
|
+
export function usableSomewhere(tool, access, onlyOrgId) {
|
|
70
|
+
const rule = TOOL_REQUIRES[tool];
|
|
71
|
+
if (!rule || !access)
|
|
72
|
+
return true;
|
|
73
|
+
if (rule.scope === 'user')
|
|
74
|
+
return access.capabilities.includes(rule.capability);
|
|
75
|
+
const orgs = orgsInView(access, onlyOrgId);
|
|
76
|
+
if (rule.scope === 'org')
|
|
77
|
+
return orgs.some((o) => o.capabilities.includes(rule.capability));
|
|
78
|
+
return orgs.some((o) => o.projects.some((p) => p.capabilities.includes(rule.capability)));
|
|
79
|
+
}
|
|
80
|
+
/** The person's role in an org, for messages ("agent in Acme"). */
|
|
81
|
+
export function roleIn(access, orgId) {
|
|
82
|
+
if (!access || !orgId)
|
|
83
|
+
return null;
|
|
84
|
+
const org = access.orgs.find((o) => o.org_id === orgId);
|
|
85
|
+
if (!org)
|
|
86
|
+
return null;
|
|
87
|
+
return `${org.role ?? 'member'} in ${org.org_name}`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* For org-scoped requirements: why this org can't be used, or null. Project-scoped
|
|
91
|
+
* requirements are decided by the server (the project comes from the agent).
|
|
92
|
+
*/
|
|
93
|
+
export function orgDenial(tool, access, orgId) {
|
|
94
|
+
const rule = TOOL_REQUIRES[tool];
|
|
95
|
+
if (!rule || !access || rule.scope === 'project')
|
|
96
|
+
return null;
|
|
97
|
+
if (rule.scope === 'user') {
|
|
98
|
+
if (access.capabilities.includes(rule.capability))
|
|
99
|
+
return null;
|
|
100
|
+
return rule.capability === 'org:sandbox_create'
|
|
101
|
+
? 'Only the Indemn support account can create sandbox organizations.'
|
|
102
|
+
: 'This is for Indemn staff only.';
|
|
103
|
+
}
|
|
104
|
+
if (!orgId)
|
|
105
|
+
return null;
|
|
106
|
+
const org = access.orgs.find((o) => o.org_id === orgId);
|
|
107
|
+
if (!org)
|
|
108
|
+
return null; // not in the list: let the server answer
|
|
109
|
+
if (org.capabilities.includes(rule.capability))
|
|
110
|
+
return null;
|
|
111
|
+
return rule.capability === 'tickets'
|
|
112
|
+
? `Tickets are not turned on for ${org.org_name}.`
|
|
113
|
+
: `Your role (${org.role ?? 'member'} in ${org.org_name}) does not allow this.`;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/sdk/access.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/auth.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Credential } from './credentials.js';
|
|
2
|
+
import { type BrowserLoginOptions } from './browser-login.js';
|
|
2
3
|
import type { Environment, EnvironmentHosts, OrgSummary } from './types.js';
|
|
3
4
|
export declare const FIREBASE_CONFIGS: Record<Environment, Record<string, string>>;
|
|
4
5
|
export type FirebaseSignIn = (email: string, password: string, env: Environment) => Promise<{
|
|
@@ -21,6 +22,12 @@ export declare function login(email: string, password: string, env?: Environment
|
|
|
21
22
|
mfaCodePrompt?: () => Promise<string>;
|
|
22
23
|
firebaseSignIn?: FirebaseSignIn;
|
|
23
24
|
}): Promise<LoginResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Log in through the browser: the dashboard's sign-in (with the emailed code when
|
|
27
|
+
* the account uses it) approves this computer, and the CLI gets its own 24-hour
|
|
28
|
+
* session. Same storage and same rules as the password login.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loginWithBrowser(env?: Environment, opts?: BrowserLoginOptions): Promise<LoginResult>;
|
|
24
31
|
/** Revoke the session on the server, then forget it locally. */
|
|
25
32
|
export declare function logout(): Promise<{
|
|
26
33
|
revoked: boolean;
|
package/dist/sdk/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI5E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBxE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAWvI,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,WAAmB,EAAE,IAAI,CAAC,EAAE;IAC5F,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI5E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBxE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAWvI,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,WAAmB,EAAE,IAAI,CAAC,EAAE;IAC5F,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,GAAG,OAAO,CAAC,WAAW,CAAC,CAUvB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,GAAE,WAAmB,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAGjH;AA2BD,gEAAgE;AAChE,wBAAsB,MAAM,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAe5D;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,yCAAyC;AACzC,wBAAgB,MAAM,IAAI,MAAM,GAAG,IAAI,CAgBtC;AAED,mHAAmH;AACnH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAMhH"}
|
package/dist/sdk/auth.js
CHANGED
|
@@ -2,6 +2,8 @@ import { initializeApp, getApp } from '@firebase/app';
|
|
|
2
2
|
import { getAuth, signInWithEmailAndPassword } from '@firebase/auth';
|
|
3
3
|
import { DEFAULT_HOSTS, IndemnClient } from './client.js';
|
|
4
4
|
import { exchangeIdToken, toStoredSession } from './session.js';
|
|
5
|
+
import { browserSignIn } from './browser-login.js';
|
|
6
|
+
import { refreshAccess, resetAccess } from './access.js';
|
|
5
7
|
// Firebase client configs per environment — public configuration (not secrets),
|
|
6
8
|
// bundled the same way the Copilot Dashboard bundles them via envsubst
|
|
7
9
|
export const FIREBASE_CONFIGS = {
|
|
@@ -44,6 +46,19 @@ export async function login(email, password, env = 'dev', opts) {
|
|
|
44
46
|
const { idToken } = await (opts?.firebaseSignIn ?? firebaseSignIn)(email, password, env);
|
|
45
47
|
const unauth = new IndemnClient({ environment: env });
|
|
46
48
|
const session = await exchangeIdToken((path, body, headers) => unauth.copilotPostUnauth(path, body, headers), idToken, opts?.mfaCodePrompt);
|
|
49
|
+
return saveLogin(env, { ...session, email: session.email ?? email });
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Log in through the browser: the dashboard's sign-in (with the emailed code when
|
|
53
|
+
* the account uses it) approves this computer, and the CLI gets its own 24-hour
|
|
54
|
+
* session. Same storage and same rules as the password login.
|
|
55
|
+
*/
|
|
56
|
+
export async function loginWithBrowser(env = 'dev', opts) {
|
|
57
|
+
const session = await browserSignIn(env, opts);
|
|
58
|
+
return saveLogin(env, session);
|
|
59
|
+
}
|
|
60
|
+
/** Keep a fresh copilot session with the person's orgs, replacing any earlier login. */
|
|
61
|
+
async function saveLogin(env, session) {
|
|
47
62
|
// Which orgs this person belongs to, asked with the new session itself.
|
|
48
63
|
const authed = new IndemnClient({ environment: env, token: session.token });
|
|
49
64
|
const res = await authed.copilotGet('/organization');
|
|
@@ -53,12 +68,15 @@ export async function login(email, password, env = 'dev', opts) {
|
|
|
53
68
|
IndemnClient.saveConfig({
|
|
54
69
|
environment: env,
|
|
55
70
|
user_id: session.userId,
|
|
56
|
-
email: session.email
|
|
71
|
+
email: session.email,
|
|
57
72
|
session: stored,
|
|
58
73
|
orgs,
|
|
59
74
|
hosts: DEFAULT_HOSTS,
|
|
60
75
|
});
|
|
61
|
-
|
|
76
|
+
// What the person may do, kept with the login (best effort: an older server has no such endpoint).
|
|
77
|
+
resetAccess();
|
|
78
|
+
await refreshAccess(new IndemnClient({ environment: env }));
|
|
79
|
+
return { userId: session.userId, email: session.email ?? '', environment: env, orgs, expiresAt: stored.expires_at };
|
|
62
80
|
}
|
|
63
81
|
/** Revoke the session on the server, then forget it locally. */
|
|
64
82
|
export async function logout() {
|
|
@@ -75,6 +93,7 @@ export async function logout() {
|
|
|
75
93
|
}
|
|
76
94
|
}
|
|
77
95
|
IndemnClient.clearConfig();
|
|
96
|
+
resetAccess();
|
|
78
97
|
return { revoked };
|
|
79
98
|
}
|
|
80
99
|
/** Who and where, without any secret. */
|
package/dist/sdk/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/sdk/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Environment } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* `indemn login` through the browser (OAuth-style loopback + PKCE):
|
|
4
|
+
* 1. listen on 127.0.0.1 (random port) and open the dashboard's /cli-login page
|
|
5
|
+
* with a random `state` and the SHA-256 challenge of a secret verifier;
|
|
6
|
+
* 2. the person signs in there (with the emailed code if their account uses it)
|
|
7
|
+
* and approves; the browser comes back to 127.0.0.1 with a one-time code;
|
|
8
|
+
* 3. the CLI trades code + verifier for its own 24-hour session.
|
|
9
|
+
* No token ever travels in a URL, and the verifier never leaves this process.
|
|
10
|
+
*/
|
|
11
|
+
export declare const LOGIN_TIMEOUT_MS: number;
|
|
12
|
+
export interface Pkce {
|
|
13
|
+
verifier: string;
|
|
14
|
+
challenge: string;
|
|
15
|
+
state: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function createPkce(): Pkce;
|
|
18
|
+
/** The dashboard that serves /cli-login: INDEMN_DASHBOARD_URL, else the copilot host without `/api`. */
|
|
19
|
+
export declare function dashboardUrl(copilotHost: string): string;
|
|
20
|
+
export declare function approveUrl(dashboard: string, port: number, pkce: Pkce): string;
|
|
21
|
+
export type CallbackResult = {
|
|
22
|
+
code: string;
|
|
23
|
+
} | {
|
|
24
|
+
error: string;
|
|
25
|
+
};
|
|
26
|
+
export interface Loopback {
|
|
27
|
+
port: number;
|
|
28
|
+
/** First callback whose `state` matches; others are refused and ignored. */
|
|
29
|
+
result: Promise<CallbackResult>;
|
|
30
|
+
close: () => void;
|
|
31
|
+
}
|
|
32
|
+
/** Listen on 127.0.0.1 only, for one `GET /callback` carrying our `state`. */
|
|
33
|
+
export declare function startLoopback(state: string, timeoutMs?: number): Promise<Loopback>;
|
|
34
|
+
/** Open a URL in the default browser without a shell. Resolves false if nothing could be started. */
|
|
35
|
+
export declare function openBrowser(url: string): Promise<boolean>;
|
|
36
|
+
export interface BrowserLoginOptions {
|
|
37
|
+
/** Opens the approve page; defaults to the system browser. */
|
|
38
|
+
open?: (url: string) => Promise<boolean>;
|
|
39
|
+
/** Told the URL (always), so it can be opened by hand. */
|
|
40
|
+
showUrl?: (url: string, opened: boolean) => void;
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
}
|
|
43
|
+
/** Run the browser flow; returns the copilot session (without the "JWT " prefix). */
|
|
44
|
+
export declare function browserSignIn(env: Environment, opts?: BrowserLoginOptions): Promise<{
|
|
45
|
+
token: string;
|
|
46
|
+
userId: string;
|
|
47
|
+
email?: string;
|
|
48
|
+
}>;
|
|
49
|
+
//# sourceMappingURL=browser-login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-login.d.ts","sourceRoot":"","sources":["../../src/sdk/browser-login.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;GAQG;AAEH,eAAO,MAAM,gBAAgB,QAAa,CAAC;AAE3C,MAAM,WAAW,IAAI;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,UAAU,IAAI,IAAI,CAKjC;AAQD,wGAAwG;AACxG,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAG9E;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAOD,8EAA8E;AAC9E,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAyB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwE1G;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBzD;AAED,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qFAAqF;AACrF,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBhJ"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { IndemnClient } from './client.js';
|
|
5
|
+
import { CliError, indemnHost } from '../core/runtime.js';
|
|
6
|
+
/**
|
|
7
|
+
* `indemn login` through the browser (OAuth-style loopback + PKCE):
|
|
8
|
+
* 1. listen on 127.0.0.1 (random port) and open the dashboard's /cli-login page
|
|
9
|
+
* with a random `state` and the SHA-256 challenge of a secret verifier;
|
|
10
|
+
* 2. the person signs in there (with the emailed code if their account uses it)
|
|
11
|
+
* and approves; the browser comes back to 127.0.0.1 with a one-time code;
|
|
12
|
+
* 3. the CLI trades code + verifier for its own 24-hour session.
|
|
13
|
+
* No token ever travels in a URL, and the verifier never leaves this process.
|
|
14
|
+
*/
|
|
15
|
+
export const LOGIN_TIMEOUT_MS = 5 * 60_000;
|
|
16
|
+
export function createPkce() {
|
|
17
|
+
const verifier = randomBytes(32).toString('base64url');
|
|
18
|
+
const challenge = createHash('sha256').update(verifier).digest('base64url');
|
|
19
|
+
const state = randomBytes(32).toString('base64url');
|
|
20
|
+
return { verifier, challenge, state };
|
|
21
|
+
}
|
|
22
|
+
function sameSecret(a, b) {
|
|
23
|
+
const x = Buffer.from(a);
|
|
24
|
+
const y = Buffer.from(b);
|
|
25
|
+
return x.length === y.length && timingSafeEqual(x, y);
|
|
26
|
+
}
|
|
27
|
+
/** The dashboard that serves /cli-login: INDEMN_DASHBOARD_URL, else the copilot host without `/api`. */
|
|
28
|
+
export function dashboardUrl(copilotHost) {
|
|
29
|
+
const explicit = process.env.INDEMN_DASHBOARD_URL;
|
|
30
|
+
if (explicit)
|
|
31
|
+
return indemnHost(explicit, 'INDEMN_DASHBOARD_URL').replace(/\/+$/, '');
|
|
32
|
+
return copilotHost.replace(/\/+$/, '').replace(/\/api$/, '');
|
|
33
|
+
}
|
|
34
|
+
export function approveUrl(dashboard, port, pkce) {
|
|
35
|
+
const query = new URLSearchParams({ port: String(port), state: pkce.state, challenge: pkce.challenge });
|
|
36
|
+
return `${dashboard}/#/cli-login?${query.toString()}`;
|
|
37
|
+
}
|
|
38
|
+
const PAGE = (title, body) => `<!doctype html><html><head><meta charset="utf-8"><title>${title}</title></head>` +
|
|
39
|
+
`<body style="font-family:system-ui,sans-serif;max-width:32rem;margin:4rem auto;padding:0 1rem">` +
|
|
40
|
+
`<h1 style="font-size:1.1rem">${title}</h1><p>${body}</p></body></html>`;
|
|
41
|
+
/** Listen on 127.0.0.1 only, for one `GET /callback` carrying our `state`. */
|
|
42
|
+
export async function startLoopback(state, timeoutMs = LOGIN_TIMEOUT_MS) {
|
|
43
|
+
let settle;
|
|
44
|
+
let fail;
|
|
45
|
+
const result = new Promise((resolve, reject) => {
|
|
46
|
+
settle = resolve;
|
|
47
|
+
fail = reject;
|
|
48
|
+
});
|
|
49
|
+
let done = false;
|
|
50
|
+
const server = createServer((req, res) => {
|
|
51
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
52
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
53
|
+
// The page has no subresources and echoes nothing; these just harden it.
|
|
54
|
+
res.setHeader('Referrer-Policy', 'no-referrer');
|
|
55
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
56
|
+
res.setHeader('Content-Security-Policy', "default-src 'none'; style-src 'unsafe-inline'");
|
|
57
|
+
// A raw socket can send a target that URL() rejects; never let that crash login.
|
|
58
|
+
let url;
|
|
59
|
+
try {
|
|
60
|
+
url = new URL(req.url ?? '/', 'http://127.0.0.1');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
res.writeHead(400).end(PAGE('Bad request', 'Nothing to see here.'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// DNS-rebinding defence: only our own loopback Host is served.
|
|
67
|
+
const host = (req.headers.host ?? '').toLowerCase();
|
|
68
|
+
if (host && !/^(127\.0\.0\.1|localhost)(:\d+)?$/.test(host)) {
|
|
69
|
+
res.writeHead(400).end(PAGE('Bad request', 'Nothing to see here.'));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (req.method !== 'GET' || url.pathname !== '/callback' || done) {
|
|
73
|
+
res.writeHead(404).end(PAGE('Not found', 'Nothing to see here.'));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const got = url.searchParams.get('state') ?? '';
|
|
77
|
+
if (!sameSecret(got, state)) {
|
|
78
|
+
res.writeHead(400).end(PAGE('Sign-in link mismatch', 'This sign-in did not come from your terminal. Run <code>indemn login</code> again.'));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const code = url.searchParams.get('code');
|
|
82
|
+
const error = url.searchParams.get('error');
|
|
83
|
+
done = true;
|
|
84
|
+
if (code) {
|
|
85
|
+
res.writeHead(200).end(PAGE('Signed in to the Indemn CLI', 'You can close this tab and return to your terminal.'));
|
|
86
|
+
settle({ code });
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
res.writeHead(200).end(PAGE('Sign-in cancelled', 'The CLI was not signed in. You can close this tab.'));
|
|
90
|
+
settle({ error: error || 'access_denied' });
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
await new Promise((resolve, reject) => {
|
|
94
|
+
server.once('error', reject);
|
|
95
|
+
server.listen(0, '127.0.0.1', () => resolve());
|
|
96
|
+
});
|
|
97
|
+
const { port } = server.address();
|
|
98
|
+
const timer = setTimeout(() => {
|
|
99
|
+
if (!done) {
|
|
100
|
+
done = true;
|
|
101
|
+
fail(new CliError('Timed out waiting for the browser (5 minutes). Run `indemn login` again.'));
|
|
102
|
+
}
|
|
103
|
+
}, timeoutMs);
|
|
104
|
+
timer.unref();
|
|
105
|
+
const close = () => {
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
server.closeAllConnections?.();
|
|
108
|
+
server.close();
|
|
109
|
+
};
|
|
110
|
+
result.then(close, close);
|
|
111
|
+
return { port, result, close };
|
|
112
|
+
}
|
|
113
|
+
/** Open a URL in the default browser without a shell. Resolves false if nothing could be started. */
|
|
114
|
+
export function openBrowser(url) {
|
|
115
|
+
const [cmd, args] = process.platform === 'darwin' ? ['open', [url]]
|
|
116
|
+
: process.platform === 'win32' ? ['rundll32', ['url.dll,FileProtocolHandler', url]]
|
|
117
|
+
: ['xdg-open', [url]];
|
|
118
|
+
return new Promise((resolve) => {
|
|
119
|
+
try {
|
|
120
|
+
const child = spawn(cmd, args, { stdio: 'ignore', detached: true });
|
|
121
|
+
child.once('error', () => resolve(false));
|
|
122
|
+
child.once('spawn', () => {
|
|
123
|
+
child.unref();
|
|
124
|
+
resolve(true);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
resolve(false);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/** Run the browser flow; returns the copilot session (without the "JWT " prefix). */
|
|
133
|
+
export async function browserSignIn(env, opts = {}) {
|
|
134
|
+
const client = new IndemnClient({ environment: env });
|
|
135
|
+
const pkce = createPkce();
|
|
136
|
+
const loop = await startLoopback(pkce.state, opts.timeoutMs);
|
|
137
|
+
try {
|
|
138
|
+
const url = approveUrl(dashboardUrl(client.getHosts().copilot), loop.port, pkce);
|
|
139
|
+
const opened = await (opts.open ?? openBrowser)(url);
|
|
140
|
+
opts.showUrl?.(url, opened);
|
|
141
|
+
const outcome = await loop.result;
|
|
142
|
+
if ('error' in outcome)
|
|
143
|
+
throw new CliError('Sign-in was cancelled in the browser.');
|
|
144
|
+
let res;
|
|
145
|
+
try {
|
|
146
|
+
res = await client.copilotPostUnauth('/auth/cli/token', { code: outcome.code, code_verifier: pkce.verifier });
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
throw new CliError('The sign-in code was not accepted (it may have expired). Run `indemn login` again.');
|
|
150
|
+
}
|
|
151
|
+
if (!res?.token || !res.user?._id)
|
|
152
|
+
throw new CliError('Sign-in returned no session. Run `indemn login` again.');
|
|
153
|
+
return { token: res.token.replace(/^JWT\s+/i, ''), userId: String(res.user._id), email: res.user.email };
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
loop.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=browser-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/sdk/browser-login.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/client.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export declare class IndemnClient {
|
|
|
21
21
|
private environment;
|
|
22
22
|
private hosts;
|
|
23
23
|
private resolvedOrg?;
|
|
24
|
+
/** The org `resolvedOrg` settled on, readable without waiting or asking. */
|
|
25
|
+
private settledOrgId?;
|
|
24
26
|
private linkCache?;
|
|
25
27
|
private membershipCache?;
|
|
26
28
|
private ignoreLink;
|
package/dist/sdk/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sdk/client.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sdk/client.ts"],"names":[],"mappings":"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"}
|