@loxtep/sdk 0.5.0 → 0.6.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/CHANGELOG.md +13 -0
- package/dist/cli/auth-resolve.d.ts +4 -1
- package/dist/cli/auth-resolve.d.ts.map +1 -1
- package/dist/cli/auth-resolve.js +5 -3
- package/dist/cli/auth-resolve.js.map +1 -1
- package/dist/cli/commands/login.d.ts +10 -1
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +33 -5
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout.d.ts +12 -2
- package/dist/cli/commands/logout.d.ts.map +1 -1
- package/dist/cli/commands/logout.js +29 -5
- package/dist/cli/commands/logout.js.map +1 -1
- package/dist/cli/commands/whoami.js +1 -1
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/create-cli-client.d.ts +2 -0
- package/dist/cli/create-cli-client.d.ts.map +1 -1
- package/dist/cli/create-cli-client.js +11 -6
- package/dist/cli/create-cli-client.js.map +1 -1
- package/dist/cli/credentials.d.ts +38 -4
- package/dist/cli/credentials.d.ts.map +1 -1
- package/dist/cli/credentials.js +69 -4
- package/dist/cli/credentials.js.map +1 -1
- package/dist/cli/index.js +10 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/client/approvals-types.d.ts +47 -0
- package/dist/client/approvals-types.d.ts.map +1 -0
- package/dist/client/approvals-types.js +6 -0
- package/dist/client/approvals-types.js.map +1 -0
- package/dist/client/approvals.d.ts +18 -0
- package/dist/client/approvals.d.ts.map +1 -0
- package/dist/client/approvals.js +52 -0
- package/dist/client/approvals.js.map +1 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/loxtep-client.d.ts +4 -0
- package/dist/client/loxtep-client.d.ts.map +1 -1
- package/dist/client/loxtep-client.js +7 -0
- package/dist/client/loxtep-client.js.map +1 -1
- package/dist/config/workspace-config.d.ts +2 -1
- package/dist/config/workspace-config.d.ts.map +1 -1
- package/dist/config/workspace-config.js +5 -6
- package/dist/config/workspace-config.js.map +1 -1
- package/docs/sdk-mcp-mapping.md +15 -8
- package/docs/sdk-pairing.md +5 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
6
6
|
and this project adheres to
|
|
7
7
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
8
8
|
|
|
9
|
+
## [0.6.0] - 2026-07-14
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **`client.approvals`** — programmatic parity with the web inbox and
|
|
14
|
+
Slack/email channels for pipeline HITL gates. `list(filters)`,
|
|
15
|
+
`list_pending(organization_id?)`, `resolve(id, action, organization_id?)`,
|
|
16
|
+
`approve(id, organization_id?)`, `reject(id, organization_id?)`. Backed by
|
|
17
|
+
the agent-orchestration `approval-requests` REST API; resolving an approval
|
|
18
|
+
via the SDK resolves the same shared record as the inbox, Slack, and email
|
|
19
|
+
buttons. Mirrors the new `loxtep_approvals` MCP facade
|
|
20
|
+
(`list_pending_approvals` / `resolve_approval`).
|
|
21
|
+
|
|
9
22
|
## [0.5.0] - 2026-07-13
|
|
10
23
|
|
|
11
24
|
### Breaking changes — API surface redesign
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve API access token and optional api_url override for CLI.
|
|
3
|
-
* Order: LOXTEP_AUTH_TOKEN → ~/.loxtep/credentials.json.
|
|
3
|
+
* Order: LOXTEP_AUTH_TOKEN → project-local `.loxtep/credentials.json` → ~/.loxtep/credentials.json.
|
|
4
4
|
*/
|
|
5
5
|
export type CliAuthSource = 'env' | 'credentials';
|
|
6
6
|
export interface ResolvedCliAuth {
|
|
@@ -9,11 +9,14 @@ export interface ResolvedCliAuth {
|
|
|
9
9
|
/** When tokens came from credentials.json, use as api_url if config.api_url is empty. */
|
|
10
10
|
api_url_from_mcp?: string;
|
|
11
11
|
source: CliAuthSource;
|
|
12
|
+
/** File the token was read from, when `source === 'credentials'` — used to persist refreshes back to the same file. */
|
|
13
|
+
credentials_path?: string;
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
14
16
|
* Resolve bearer token for Loxtep API calls (CLI).
|
|
15
17
|
*/
|
|
16
18
|
export declare function resolveCliAccessToken(options?: {
|
|
17
19
|
credentialsPath?: string;
|
|
20
|
+
cwd?: string;
|
|
18
21
|
}): Promise<ResolvedCliAuth | null>;
|
|
19
22
|
//# sourceMappingURL=auth-resolve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-resolve.d.ts","sourceRoot":"","sources":["../../src/cli/auth-resolve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,aAAa,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-resolve.d.ts","sourceRoot":"","sources":["../../src/cli/auth-resolve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,aAAa,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,uHAAuH;IACvH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAiBlC"}
|
package/dist/cli/auth-resolve.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve API access token and optional api_url override for CLI.
|
|
3
|
-
* Order: LOXTEP_AUTH_TOKEN → ~/.loxtep/credentials.json.
|
|
3
|
+
* Order: LOXTEP_AUTH_TOKEN → project-local `.loxtep/credentials.json` → ~/.loxtep/credentials.json.
|
|
4
4
|
*/
|
|
5
|
-
import { readCredentials } from './credentials.js';
|
|
5
|
+
import { readCredentials, resolveCredentialsPath } from './credentials.js';
|
|
6
6
|
/**
|
|
7
7
|
* Resolve bearer token for Loxtep API calls (CLI).
|
|
8
8
|
*/
|
|
@@ -11,13 +11,15 @@ export async function resolveCliAccessToken(options) {
|
|
|
11
11
|
if (envTok) {
|
|
12
12
|
return { access_token: envTok, source: 'env' };
|
|
13
13
|
}
|
|
14
|
-
const
|
|
14
|
+
const resolvedPath = options?.credentialsPath ?? resolveCredentialsPath(options?.cwd).path;
|
|
15
|
+
const creds = await readCredentials(resolvedPath);
|
|
15
16
|
if (creds?.access_token) {
|
|
16
17
|
return {
|
|
17
18
|
access_token: creds.access_token,
|
|
18
19
|
refresh_token: creds.refresh_token,
|
|
19
20
|
api_url_from_mcp: creds.api_base_url,
|
|
20
21
|
source: 'credentials',
|
|
22
|
+
credentials_path: resolvedPath,
|
|
21
23
|
};
|
|
22
24
|
}
|
|
23
25
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-resolve.js","sourceRoot":"","sources":["../../src/cli/auth-resolve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-resolve.js","sourceRoot":"","sources":["../../src/cli/auth-resolve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAc3E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAG3C;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,EAAE,eAAe,IAAI,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;IAC3F,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,KAAK,EAAE,YAAY,EAAE,CAAC;QACxB,OAAO;YACL,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,gBAAgB,EAAE,KAAK,CAAC,YAAY;YACpC,MAAM,EAAE,aAAa;YACrB,gBAAgB,EAAE,YAAY;SAC/B,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type CredentialsScope } from '../credentials.js';
|
|
1
2
|
export interface LoginOptions {
|
|
2
3
|
email?: string;
|
|
3
4
|
password?: string;
|
|
@@ -16,8 +17,16 @@ export interface LoginOptions {
|
|
|
16
17
|
fetchFn?: typeof fetch;
|
|
17
18
|
/** For tests: config file path (default: env/file). */
|
|
18
19
|
configFilePath?: string;
|
|
19
|
-
/** For tests: credentials file path to write. */
|
|
20
|
+
/** For tests: credentials file path to write. Takes precedence over --local/--global. */
|
|
20
21
|
credentialsPath?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Force credentials scope: `local` writes to `<project>/.loxtep/credentials.json`
|
|
24
|
+
* (requires a project found via `.loxtep/project.json`); `global` writes to
|
|
25
|
+
* `~/.loxtep/credentials.json`. Default: local when run inside a project, else global.
|
|
26
|
+
*/
|
|
27
|
+
scope?: CredentialsScope;
|
|
28
|
+
/** Working directory used to resolve the project for local scoping (default: `process.cwd()`). */
|
|
29
|
+
cwd?: string;
|
|
21
30
|
/** Override config auth first path segment (default: `app` when omitted in config). */
|
|
22
31
|
auth_path_prefix?: string;
|
|
23
32
|
/** Don't auto-open browser — just print the URL. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,kGAAkG;IAClG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuBD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmIxE"}
|
|
@@ -2,7 +2,7 @@ import * as readline from 'node:readline';
|
|
|
2
2
|
import { login as authLogin, LoginMfaRequiredError } from '../../auth/login.js';
|
|
3
3
|
import { browserLogin } from '../../auth/browser-login.js';
|
|
4
4
|
import { loadConfig } from '../../config/load.js';
|
|
5
|
-
import {
|
|
5
|
+
import { writeCredentials, resolveCredentialsWriteTarget, ensureLocalCredentialsGitignored, } from '../credentials.js';
|
|
6
6
|
/** Prompt for a single line (e.g. email or password). */
|
|
7
7
|
function prompt(question) {
|
|
8
8
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -28,9 +28,25 @@ function parseOptionalMfaInput(raw) {
|
|
|
28
28
|
export async function runLogin(options = {}) {
|
|
29
29
|
// Default to browser login unless --console or --email/--password forces console mode
|
|
30
30
|
const useBrowser = !options.console && !options.email && !options.password;
|
|
31
|
+
let credentialsPath;
|
|
32
|
+
let scope;
|
|
33
|
+
if (options.credentialsPath) {
|
|
34
|
+
credentialsPath = options.credentialsPath;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
try {
|
|
38
|
+
const target = resolveCredentialsWriteTarget(options.cwd, options.scope);
|
|
39
|
+
credentialsPath = target.path;
|
|
40
|
+
scope = target.scope;
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
31
48
|
if (useBrowser) {
|
|
32
49
|
const config = await loadConfig(options.configFilePath);
|
|
33
|
-
const credentialsPath = options.credentialsPath ?? getCredentialsPath();
|
|
34
50
|
// Determine app URL from config or default
|
|
35
51
|
const apiUrl = (config.api_url || '').replace(/\/$/, '');
|
|
36
52
|
let appUrl;
|
|
@@ -56,7 +72,13 @@ export async function runLogin(options = {}) {
|
|
|
56
72
|
api_base_url: apiUrl || undefined,
|
|
57
73
|
aws_credentials: result.aws_credentials,
|
|
58
74
|
}, credentialsPath);
|
|
59
|
-
|
|
75
|
+
if (scope === 'local') {
|
|
76
|
+
const target = resolveCredentialsWriteTarget(options.cwd, 'local');
|
|
77
|
+
if (target.projectDir)
|
|
78
|
+
await ensureLocalCredentialsGitignored(target.projectDir);
|
|
79
|
+
}
|
|
80
|
+
const scopeNote = scope === 'local' ? ' (project-local)' : scope === 'global' ? ' (global)' : '';
|
|
81
|
+
console.log(`\nLogged in successfully. Tokens saved to ${credentialsPath}${scopeNote}`);
|
|
60
82
|
}
|
|
61
83
|
catch (err) {
|
|
62
84
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -106,8 +128,14 @@ export async function runLogin(options = {}) {
|
|
|
106
128
|
refresh_token: result.refresh_token,
|
|
107
129
|
expires_at: result.expires_at,
|
|
108
130
|
aws_credentials: result.aws_credentials,
|
|
109
|
-
},
|
|
110
|
-
|
|
131
|
+
}, credentialsPath);
|
|
132
|
+
if (scope === 'local') {
|
|
133
|
+
const target = resolveCredentialsWriteTarget(options.cwd, 'local');
|
|
134
|
+
if (target.projectDir)
|
|
135
|
+
await ensureLocalCredentialsGitignored(target.projectDir);
|
|
136
|
+
}
|
|
137
|
+
const scopeNote = scope === 'local' ? ' (project-local)' : scope === 'global' ? ' (global)' : '';
|
|
138
|
+
console.log(`Logged in successfully. Tokens saved to ${credentialsPath}${scopeNote}`);
|
|
111
139
|
}
|
|
112
140
|
catch (err) {
|
|
113
141
|
if (err instanceof LoginMfaRequiredError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
import { type CredentialsScope } from '../credentials.js';
|
|
2
|
+
export interface LogoutOptions {
|
|
3
|
+
/** Force scope instead of the default local-first resolution. */
|
|
4
|
+
scope?: CredentialsScope;
|
|
5
|
+
/** Working directory used to resolve the project for local scoping (default: `process.cwd()`). */
|
|
6
|
+
cwd?: string;
|
|
7
|
+
}
|
|
1
8
|
/**
|
|
2
|
-
* Run logout: remove stored credentials file.
|
|
9
|
+
* Run logout: remove stored credentials file. By default removes whichever
|
|
10
|
+
* credentials are currently active for `cwd` (project-local if present, else
|
|
11
|
+
* global) — same resolution used to authenticate. Pass `scope` to force
|
|
12
|
+
* removing the local or global file specifically.
|
|
3
13
|
*/
|
|
4
|
-
export declare function runLogout(): Promise<void>;
|
|
14
|
+
export declare function runLogout(options?: LogoutOptions): Promise<void>;
|
|
5
15
|
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,kGAAkG;IAClG,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B1E"}
|
|
@@ -1,9 +1,33 @@
|
|
|
1
|
-
import { deleteCredentials } from '../credentials.js';
|
|
1
|
+
import { deleteCredentials, resolveCredentialsPath, getCredentialsPath, getLocalCredentialsPath, } from '../credentials.js';
|
|
2
|
+
import { findProjectDir } from '../project-context.js';
|
|
2
3
|
/**
|
|
3
|
-
* Run logout: remove stored credentials file.
|
|
4
|
+
* Run logout: remove stored credentials file. By default removes whichever
|
|
5
|
+
* credentials are currently active for `cwd` (project-local if present, else
|
|
6
|
+
* global) — same resolution used to authenticate. Pass `scope` to force
|
|
7
|
+
* removing the local or global file specifically.
|
|
4
8
|
*/
|
|
5
|
-
export async function runLogout() {
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
export async function runLogout(options = {}) {
|
|
10
|
+
const cwd = options.cwd ?? process.cwd();
|
|
11
|
+
if (options.scope === 'global') {
|
|
12
|
+
const path = getCredentialsPath();
|
|
13
|
+
await deleteCredentials(path);
|
|
14
|
+
console.log(`Logged out (global: ${path}).`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (options.scope === 'local') {
|
|
18
|
+
const projectDir = findProjectDir(cwd);
|
|
19
|
+
if (!projectDir) {
|
|
20
|
+
console.error('No .loxtep/project.json found in this directory or any parent — nothing local to log out of.');
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const path = getLocalCredentialsPath(projectDir);
|
|
25
|
+
await deleteCredentials(path);
|
|
26
|
+
console.log(`Logged out (local: ${path}).`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const target = resolveCredentialsPath(cwd);
|
|
30
|
+
await deleteCredentials(target.path);
|
|
31
|
+
console.log(`Logged out (${target.scope}: ${target.path}).`);
|
|
8
32
|
}
|
|
9
33
|
//# sourceMappingURL=logout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASvD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAyB,EAAE;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzC,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CACX,8FAA8F,CAC/F,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -15,7 +15,7 @@ export async function runWhoami(options = {}) {
|
|
|
15
15
|
customerMcpPath: options.customerMcpPath,
|
|
16
16
|
});
|
|
17
17
|
if (!authCtx) {
|
|
18
|
-
console.error('Missing api_url or access token. Set LOXTEP_API_URL / LOXTEP_AUTH_TOKEN, or run: loxtep config set api_url <url> ; loxtep login
|
|
18
|
+
console.error('Missing api_url or access token. Set LOXTEP_API_URL / LOXTEP_AUTH_TOKEN, or run: loxtep config set api_url <url> ; loxtep login');
|
|
19
19
|
process.exitCode = 1;
|
|
20
20
|
return null;
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAuB/D,MAAM,WAAW,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAyB,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS;YAC5B,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE;YAC3B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC;oBACzC,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,eAAe,EAAE,OAAO,CAAC,eAAe;oBACxC,eAAe,EAAE,OAAO,CAAC,eAAe;iBACzC,CAAC,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CACX,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAuB/D,MAAM,WAAW,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAyB,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS;YAC5B,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE;YAC3B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC;oBACzC,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,eAAe,EAAE,OAAO,CAAC,eAAe;oBACxC,eAAe,EAAE,OAAO,CAAC,eAAe;iBACzC,CAAC,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CACX,iIAAiI,CAClI,CAAC;oBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;oBAClC,QAAQ,EAAE,OAAO,CAAC,OAAO;oBACzB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,WAAW,EAAE,WAAW;oBACxB,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;iBACnC,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC,GAAG,CAAiB,yBAAyB,CAAC,CAAC;YAC/D,CAAC,CAAC,EAAE,CAAC;QACT,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO;QACzB,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QAClF,MAAM,GAAG,GAAG,IAAI,EAAE,iBAAiB,IAAI,IAAI,EAAE,eAAe,IAAI,GAAG,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -8,6 +8,8 @@ export interface CreateCliClientOptions {
|
|
|
8
8
|
configFilePath?: string;
|
|
9
9
|
credentialsPath?: string;
|
|
10
10
|
customerMcpPath?: string;
|
|
11
|
+
/** Working directory used to resolve project-local credentials (default: `process.cwd()`). */
|
|
12
|
+
cwd?: string;
|
|
11
13
|
/** After refresh, apply STS (or other) side effects; used by {@link createCliClient} for SigV4. */
|
|
12
14
|
on_after_refresh?: (result: RefreshResponse) => void;
|
|
13
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-cli-client.d.ts","sourceRoot":"","sources":["../../src/cli/create-cli-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,EAAW,KAAK,eAAe,EAA4B,MAAM,kBAAkB,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CACtD;AA4BD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"create-cli-client.d.ts","sourceRoot":"","sources":["../../src/cli/create-cli-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,EAAW,KAAK,eAAe,EAA4B,MAAM,kBAAkB,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CACtD;AA4BD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAiEhC;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC;IACnF,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;CAChD,GAAG,IAAI,CAAC,CA4FR;AAED,mDAAmD;AACnD,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC;IACpF,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;CAChD,CAAC,CAUD"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { loadConfig } from '../config/load.js';
|
|
5
5
|
import { resolveCliAccessToken } from './auth-resolve.js';
|
|
6
|
-
import { writeCredentials, readCredentials,
|
|
6
|
+
import { writeCredentials, readCredentials, resolveCredentialsPath } from './credentials.js';
|
|
7
7
|
import { TokenManager } from '../auth/token-manager.js';
|
|
8
8
|
import { refresh } from '../auth/login.js';
|
|
9
9
|
import { decodeJwtPayload } from '../auth/jwt.js';
|
|
@@ -12,16 +12,16 @@ function jwtExpSeconds(token) {
|
|
|
12
12
|
const { exp } = decodeJwtPayload(token);
|
|
13
13
|
return exp;
|
|
14
14
|
}
|
|
15
|
-
async function persistRefreshedTokens(source, access_token, refresh_token, expires_at, aws_credentials,
|
|
15
|
+
async function persistRefreshedTokens(source, access_token, refresh_token, expires_at, aws_credentials, credentialsPath) {
|
|
16
16
|
if (source !== 'credentials')
|
|
17
17
|
return;
|
|
18
|
-
const prev = await readCredentials(
|
|
18
|
+
const prev = await readCredentials(credentialsPath);
|
|
19
19
|
await writeCredentials({
|
|
20
20
|
access_token,
|
|
21
21
|
refresh_token,
|
|
22
22
|
expires_at,
|
|
23
23
|
aws_credentials: aws_credentials ?? prev?.aws_credentials,
|
|
24
|
-
},
|
|
24
|
+
}, credentialsPath);
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* Shared CLI auth: proactive refresh near JWT expiry + {@link LoxtepHttpClient} 401 retry via refresh_auth.
|
|
@@ -30,6 +30,7 @@ export async function createCliAuthContext(options = {}) {
|
|
|
30
30
|
const config = await loadConfig(options.configFilePath);
|
|
31
31
|
const resolved = await resolveCliAccessToken({
|
|
32
32
|
credentialsPath: options.credentialsPath,
|
|
33
|
+
cwd: options.cwd,
|
|
33
34
|
});
|
|
34
35
|
const api_url = (config.api_url || resolved?.api_url_from_mcp || '').replace(/\/$/, '');
|
|
35
36
|
if (!api_url || !resolved?.access_token) {
|
|
@@ -39,13 +40,17 @@ export async function createCliAuthContext(options = {}) {
|
|
|
39
40
|
const exp = jwtExpSeconds(resolved.access_token);
|
|
40
41
|
tm.setToken(resolved.access_token, resolved.refresh_token, exp);
|
|
41
42
|
const source = resolved.source;
|
|
43
|
+
// The exact file the token was read from — refreshed tokens must be written
|
|
44
|
+
// back to this same file (local project creds vs. global ~/.loxtep), not
|
|
45
|
+
// wherever the global default happens to point.
|
|
46
|
+
const credentialsPath = options.credentialsPath ?? resolved.credentials_path ?? resolveCredentialsPath(options.cwd).path;
|
|
42
47
|
const refreshFn = async (apiUrl, refreshToken) => {
|
|
43
48
|
const r = await refresh(apiUrl, refreshToken, { auth_path_prefix: config.auth_path_prefix });
|
|
44
49
|
const nextExp = r.expires_at != null && r.expires_at !== ''
|
|
45
50
|
? Math.floor(new Date(r.expires_at).getTime() / 1000)
|
|
46
51
|
: jwtExpSeconds(r.access_token);
|
|
47
52
|
tm.setToken(r.access_token, r.refresh_token ?? refreshToken, nextExp);
|
|
48
|
-
await persistRefreshedTokens(source, r.access_token, r.refresh_token ?? refreshToken, r.expires_at, r.aws_credentials,
|
|
53
|
+
await persistRefreshedTokens(source, r.access_token, r.refresh_token ?? refreshToken, r.expires_at, r.aws_credentials, credentialsPath);
|
|
49
54
|
options.on_after_refresh?.(r);
|
|
50
55
|
return {
|
|
51
56
|
access_token: r.access_token,
|
|
@@ -80,7 +85,7 @@ export async function createCliAuthContext(options = {}) {
|
|
|
80
85
|
}
|
|
81
86
|
export async function createCliClient(options = {}) {
|
|
82
87
|
const config = await loadConfig(options.configFilePath);
|
|
83
|
-
const credsPath = options.credentialsPath ??
|
|
88
|
+
const credsPath = options.credentialsPath ?? resolveCredentialsPath(options.cwd).path;
|
|
84
89
|
const fileCreds = await readCredentials(credsPath);
|
|
85
90
|
const cliSigv4 = fileCreds?.aws_credentials
|
|
86
91
|
? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-cli-client.js","sourceRoot":"","sources":["../../src/cli/create-cli-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAsB,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"create-cli-client.js","sourceRoot":"","sources":["../../src/cli/create-cli-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ export interface CliCredentials {
|
|
|
5
5
|
expires_at?: string;
|
|
6
6
|
/**
|
|
7
7
|
* API base URL (e.g. https://apidev.loxtep.io), same as in ~/.loxtep/credentials.json
|
|
8
|
-
* after `loxtep login
|
|
8
|
+
* after `loxtep login`. Optional: config / env can supply api_url.
|
|
9
9
|
*/
|
|
10
10
|
api_base_url?: string;
|
|
11
11
|
/**
|
|
@@ -14,10 +14,44 @@ export interface CliCredentials {
|
|
|
14
14
|
*/
|
|
15
15
|
aws_credentials?: AwsCredentialsSnake;
|
|
16
16
|
}
|
|
17
|
-
/** Path to CLI credentials file: ~/.loxtep/credentials.json. */
|
|
17
|
+
/** Path to global CLI credentials file: ~/.loxtep/credentials.json. */
|
|
18
18
|
export declare function getCredentialsPath(): string;
|
|
19
|
-
/**
|
|
20
|
-
export declare function
|
|
19
|
+
/** Path to project-local credentials file: `<projectDir>/.loxtep/credentials.json`. */
|
|
20
|
+
export declare function getLocalCredentialsPath(projectDir: string): string;
|
|
21
|
+
export type CredentialsScope = 'local' | 'global';
|
|
22
|
+
export interface ResolvedCredentialsPath {
|
|
23
|
+
path: string;
|
|
24
|
+
scope: CredentialsScope;
|
|
25
|
+
/** Directory containing `.loxtep/project.json`, when one was found upward from `cwd`. */
|
|
26
|
+
projectDir?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve which credentials file to read from: a project-local
|
|
30
|
+
* `<projectDir>/.loxtep/credentials.json` (found by walking up from `cwd`, same
|
|
31
|
+
* search as `.loxtep/project.json`) takes precedence over the global
|
|
32
|
+
* `~/.loxtep/credentials.json`. Falls back to global when no local credentials
|
|
33
|
+
* file exists, even if a project directory was found — e.g. a project was
|
|
34
|
+
* scaffolded/attached but `loxtep login` was never run locally in it.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveCredentialsPath(cwd?: string): ResolvedCredentialsPath;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve where `loxtep login` should write credentials: local to the current
|
|
39
|
+
* project (if one is found upward from `cwd`) unless `forceScope` says
|
|
40
|
+
* otherwise. Unlike {@link resolveCredentialsPath}, this doesn't require the
|
|
41
|
+
* local file to already exist — it's the write target, not the read fallback.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveCredentialsWriteTarget(cwd?: string, forceScope?: CredentialsScope): ResolvedCredentialsPath;
|
|
44
|
+
/**
|
|
45
|
+
* Idempotently add the local credentials file to `<projectDir>/.gitignore` so
|
|
46
|
+
* project-scoped tokens are never committed alongside `.loxtep/project.json`.
|
|
47
|
+
*/
|
|
48
|
+
export declare function ensureLocalCredentialsGitignored(projectDir: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Read credentials from file. Defaults to the local-first resolution
|
|
51
|
+
* ({@link resolveCredentialsPath}) when no explicit `filePath` is given.
|
|
52
|
+
* Returns null if missing or invalid.
|
|
53
|
+
*/
|
|
54
|
+
export declare function readCredentials(filePath?: string, cwd?: string): Promise<CliCredentials | null>;
|
|
21
55
|
/** Write credentials to file. Creates directory if needed. Merges with an existing file so optional fields (api_base_url, etc.) are not dropped. */
|
|
22
56
|
export declare function writeCredentials(creds: CliCredentials, filePath?: string): Promise<void>;
|
|
23
57
|
/** Remove credentials file (logout). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAID,uEAAuE;AACvE,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,CAAC;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAsB,GAAG,uBAAuB,CAS3F;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,GAAE,MAAsB,EAC3B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,uBAAuB,CAiBzB;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BhC;AAED,oJAAoJ;AACpJ,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9F;AAED,wCAAwC;AACxC,wBAAsB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxE"}
|
package/dist/cli/credentials.js
CHANGED
|
@@ -2,14 +2,79 @@ import { readFile, writeFile, rm, mkdir } from 'node:fs/promises';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { join, dirname } from 'node:path';
|
|
4
4
|
import { getConfigDir } from '../config/paths.js';
|
|
5
|
+
import { findProjectDir, PROJECT_DIR_NAME } from './project-context.js';
|
|
5
6
|
const CREDENTIALS_FILENAME = 'credentials.json';
|
|
6
|
-
/** Path to CLI credentials file: ~/.loxtep/credentials.json. */
|
|
7
|
+
/** Path to global CLI credentials file: ~/.loxtep/credentials.json. */
|
|
7
8
|
export function getCredentialsPath() {
|
|
8
9
|
return join(getConfigDir(), CREDENTIALS_FILENAME);
|
|
9
10
|
}
|
|
10
|
-
/**
|
|
11
|
-
export
|
|
12
|
-
|
|
11
|
+
/** Path to project-local credentials file: `<projectDir>/.loxtep/credentials.json`. */
|
|
12
|
+
export function getLocalCredentialsPath(projectDir) {
|
|
13
|
+
return join(projectDir, PROJECT_DIR_NAME, CREDENTIALS_FILENAME);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve which credentials file to read from: a project-local
|
|
17
|
+
* `<projectDir>/.loxtep/credentials.json` (found by walking up from `cwd`, same
|
|
18
|
+
* search as `.loxtep/project.json`) takes precedence over the global
|
|
19
|
+
* `~/.loxtep/credentials.json`. Falls back to global when no local credentials
|
|
20
|
+
* file exists, even if a project directory was found — e.g. a project was
|
|
21
|
+
* scaffolded/attached but `loxtep login` was never run locally in it.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveCredentialsPath(cwd = process.cwd()) {
|
|
24
|
+
const projectDir = findProjectDir(cwd);
|
|
25
|
+
if (projectDir) {
|
|
26
|
+
const localPath = getLocalCredentialsPath(projectDir);
|
|
27
|
+
if (existsSync(localPath)) {
|
|
28
|
+
return { path: localPath, scope: 'local', projectDir };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { path: getCredentialsPath(), scope: 'global', projectDir: projectDir ?? undefined };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve where `loxtep login` should write credentials: local to the current
|
|
35
|
+
* project (if one is found upward from `cwd`) unless `forceScope` says
|
|
36
|
+
* otherwise. Unlike {@link resolveCredentialsPath}, this doesn't require the
|
|
37
|
+
* local file to already exist — it's the write target, not the read fallback.
|
|
38
|
+
*/
|
|
39
|
+
export function resolveCredentialsWriteTarget(cwd = process.cwd(), forceScope) {
|
|
40
|
+
const projectDir = findProjectDir(cwd) ?? undefined;
|
|
41
|
+
if (forceScope === 'global') {
|
|
42
|
+
return { path: getCredentialsPath(), scope: 'global', projectDir };
|
|
43
|
+
}
|
|
44
|
+
if (forceScope === 'local') {
|
|
45
|
+
if (!projectDir) {
|
|
46
|
+
throw new Error('No .loxtep/project.json found in this directory or any parent — cannot scope credentials locally. Run `loxtep init` first, or use --global.');
|
|
47
|
+
}
|
|
48
|
+
return { path: getLocalCredentialsPath(projectDir), scope: 'local', projectDir };
|
|
49
|
+
}
|
|
50
|
+
if (projectDir) {
|
|
51
|
+
return { path: getLocalCredentialsPath(projectDir), scope: 'local', projectDir };
|
|
52
|
+
}
|
|
53
|
+
return { path: getCredentialsPath(), scope: 'global', projectDir };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Idempotently add the local credentials file to `<projectDir>/.gitignore` so
|
|
57
|
+
* project-scoped tokens are never committed alongside `.loxtep/project.json`.
|
|
58
|
+
*/
|
|
59
|
+
export async function ensureLocalCredentialsGitignored(projectDir) {
|
|
60
|
+
const entry = `${PROJECT_DIR_NAME}/${CREDENTIALS_FILENAME}`;
|
|
61
|
+
const gitignorePath = join(projectDir, '.gitignore');
|
|
62
|
+
let existing = '';
|
|
63
|
+
if (existsSync(gitignorePath)) {
|
|
64
|
+
existing = String(await readFile(gitignorePath, 'utf-8'));
|
|
65
|
+
if (existing.split('\n').some(line => line.trim() === entry))
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const sep = existing.length > 0 && !existing.endsWith('\n') ? '\n' : '';
|
|
69
|
+
await writeFile(gitignorePath, `${existing}${sep}${entry}\n`, 'utf-8');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read credentials from file. Defaults to the local-first resolution
|
|
73
|
+
* ({@link resolveCredentialsPath}) when no explicit `filePath` is given.
|
|
74
|
+
* Returns null if missing or invalid.
|
|
75
|
+
*/
|
|
76
|
+
export async function readCredentials(filePath, cwd) {
|
|
77
|
+
const path = filePath ?? resolveCredentialsPath(cwd).path;
|
|
13
78
|
if (!existsSync(path))
|
|
14
79
|
return null;
|
|
15
80
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"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"}
|