@loxtep/sdk 0.4.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 +50 -0
- package/README.md +77 -91
- package/dist/authoring/toolbox.d.ts +7 -7
- package/dist/authoring/toolbox.d.ts.map +1 -1
- package/dist/authoring/toolbox.js +5 -5
- package/dist/authoring/toolbox.js.map +1 -1
- 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/deploy-cmd.js +1 -1
- package/dist/cli/commands/deploy-cmd.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/triggers-cmd.d.ts +19 -0
- package/dist/cli/commands/triggers-cmd.d.ts.map +1 -0
- package/dist/cli/commands/{connections-cmd.js → triggers-cmd.js} +12 -12
- package/dist/cli/commands/triggers-cmd.js.map +1 -0
- package/dist/cli/commands/whoami.js +1 -1
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/commands/workflows-cmd.d.ts +8 -1
- package/dist/cli/commands/workflows-cmd.d.ts.map +1 -1
- package/dist/cli/commands/workflows-cmd.js +23 -2
- package/dist/cli/commands/workflows-cmd.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.d.ts +1 -1
- package/dist/cli/index.js +37 -39
- 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/connectors.d.ts +1 -1
- package/dist/client/connectors.d.ts.map +1 -1
- package/dist/client/connectors.js +1 -1
- package/dist/client/connectors.js.map +1 -1
- package/dist/client/data-products-types.d.ts +1 -1
- package/dist/client/data-products-types.d.ts.map +1 -1
- package/dist/client/data-products.d.ts +1 -1
- package/dist/client/data-products.d.ts.map +1 -1
- package/dist/client/data-products.js +1 -1
- package/dist/client/data-products.js.map +1 -1
- package/dist/client/discovery.d.ts +4 -4
- package/dist/client/discovery.d.ts.map +1 -1
- package/dist/client/discovery.js +4 -4
- package/dist/client/discovery.js.map +1 -1
- package/dist/client/index.d.ts +5 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/loxtep-client.d.ts +36 -21
- package/dist/client/loxtep-client.d.ts.map +1 -1
- package/dist/client/loxtep-client.js +42 -25
- package/dist/client/loxtep-client.js.map +1 -1
- package/dist/client/projects.d.ts +1 -1
- package/dist/client/projects.d.ts.map +1 -1
- package/dist/client/projects.js +1 -1
- package/dist/client/projects.js.map +1 -1
- package/dist/client/{delivery-types.d.ts → target-types.d.ts} +18 -18
- package/dist/client/target-types.d.ts.map +1 -0
- package/dist/client/target-types.js +10 -0
- package/dist/client/target-types.js.map +1 -0
- package/dist/client/targets.d.ts +21 -0
- package/dist/client/targets.d.ts.map +1 -0
- package/dist/client/{delivery.js → targets.js} +31 -33
- package/dist/client/targets.js.map +1 -0
- package/dist/client/thesaurus.d.ts +2 -2
- package/dist/client/thesaurus.d.ts.map +1 -1
- package/dist/client/thesaurus.js +4 -4
- package/dist/client/thesaurus.js.map +1 -1
- package/dist/client/{connection-types.d.ts → trigger-types.d.ts} +22 -21
- package/dist/client/trigger-types.d.ts.map +1 -0
- package/dist/client/trigger-types.js +19 -0
- package/dist/client/trigger-types.js.map +1 -0
- package/dist/client/triggers.d.ts +19 -0
- package/dist/client/triggers.d.ts.map +1 -0
- package/dist/client/{connections.js → triggers.js} +12 -11
- package/dist/client/triggers.js.map +1 -0
- package/dist/client/workflows.d.ts +38 -6
- package/dist/client/workflows.d.ts.map +1 -1
- package/dist/client/workflows.js +192 -8
- package/dist/client/workflows.js.map +1 -1
- package/dist/codegen/load-workspace-context.d.ts.map +1 -1
- package/dist/codegen/load-workspace-context.js +6 -4
- package/dist/codegen/load-workspace-context.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/getting-started.md +0 -12
- package/docs/quick-reference.md +6 -19
- package/docs/sdk-mcp-mapping.md +15 -8
- package/docs/sdk-pairing.md +5 -5
- package/package.json +2 -2
- package/dist/cli/commands/connections-cmd.d.ts +0 -19
- package/dist/cli/commands/connections-cmd.d.ts.map +0 -1
- package/dist/cli/commands/connections-cmd.js.map +0 -1
- package/dist/cli/commands/flows-cmd.d.ts +0 -19
- package/dist/cli/commands/flows-cmd.d.ts.map +0 -1
- package/dist/cli/commands/flows-cmd.js +0 -37
- package/dist/cli/commands/flows-cmd.js.map +0 -1
- package/dist/client/connection-types.d.ts.map +0 -1
- package/dist/client/connection-types.js +0 -18
- package/dist/client/connection-types.js.map +0 -1
- package/dist/client/connections.d.ts +0 -18
- package/dist/client/connections.d.ts.map +0 -1
- package/dist/client/connections.js.map +0 -1
- package/dist/client/delivery-types.d.ts.map +0 -1
- package/dist/client/delivery-types.js +0 -10
- package/dist/client/delivery-types.js.map +0 -1
- package/dist/client/delivery.d.ts +0 -23
- package/dist/client/delivery.d.ts.map +0 -1
- package/dist/client/delivery.js.map +0 -1
- package/dist/client/flows.d.ts +0 -33
- package/dist/client/flows.d.ts.map +0 -1
- package/dist/client/flows.js +0 -218
- package/dist/client/flows.js.map +0 -1
|
@@ -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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: loxtep triggers list | triggers get <id> | triggers create ... | triggers test <id>
|
|
3
|
+
*/
|
|
4
|
+
export interface TriggersCmdOptions {
|
|
5
|
+
configFilePath?: string;
|
|
6
|
+
credentialsPath?: string;
|
|
7
|
+
customerMcpPath?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function runTriggersList(options?: TriggersCmdOptions): Promise<void>;
|
|
10
|
+
export declare function runTriggersGet(triggerId: string, options?: TriggersCmdOptions): Promise<void>;
|
|
11
|
+
export declare function runTriggersCreate(params: {
|
|
12
|
+
name?: string;
|
|
13
|
+
type?: string;
|
|
14
|
+
key?: string;
|
|
15
|
+
data?: string;
|
|
16
|
+
configuration?: Record<string, unknown>;
|
|
17
|
+
}, options?: TriggersCmdOptions): Promise<void>;
|
|
18
|
+
export declare function runTriggersTest(triggerId: string, options?: TriggersCmdOptions): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=triggers-cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/triggers-cmd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrF;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE;IACN,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC,EACD,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI: loxtep
|
|
2
|
+
* CLI: loxtep triggers list | triggers get <id> | triggers create ... | triggers test <id>
|
|
3
3
|
*/
|
|
4
4
|
import { requireCliClient } from '../create-cli-client.js';
|
|
5
|
-
export async function
|
|
5
|
+
export async function runTriggersList(options = {}) {
|
|
6
6
|
const { client } = await requireCliClient(options);
|
|
7
|
-
const result = await client.
|
|
7
|
+
const result = await client.triggers.list({ page_size: 50 });
|
|
8
8
|
console.log(JSON.stringify(result, null, 2));
|
|
9
9
|
}
|
|
10
|
-
export async function
|
|
10
|
+
export async function runTriggersGet(triggerId, options = {}) {
|
|
11
11
|
const { client } = await requireCliClient(options);
|
|
12
|
-
const
|
|
13
|
-
console.log(JSON.stringify(
|
|
12
|
+
const trigger = await client.triggers.get(triggerId);
|
|
13
|
+
console.log(JSON.stringify(trigger, null, 2));
|
|
14
14
|
}
|
|
15
|
-
export async function
|
|
15
|
+
export async function runTriggersCreate(params, options = {}) {
|
|
16
16
|
const { client } = await requireCliClient(options);
|
|
17
17
|
const name = params.name ?? '';
|
|
18
18
|
const type = params.type ?? 'api';
|
|
@@ -22,18 +22,18 @@ export async function runConnectionsCreate(params, options = {}) {
|
|
|
22
22
|
process.exitCode = 1;
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
|
-
const
|
|
25
|
+
const trigger = await client.triggers.create({
|
|
26
26
|
name,
|
|
27
27
|
type: type,
|
|
28
28
|
key,
|
|
29
29
|
data: params.data ?? '{}',
|
|
30
30
|
configuration: params.configuration,
|
|
31
31
|
});
|
|
32
|
-
console.log(JSON.stringify(
|
|
32
|
+
console.log(JSON.stringify(trigger, null, 2));
|
|
33
33
|
}
|
|
34
|
-
export async function
|
|
34
|
+
export async function runTriggersTest(triggerId, options = {}) {
|
|
35
35
|
const { client } = await requireCliClient(options);
|
|
36
|
-
const result = await client.
|
|
36
|
+
const result = await client.triggers.test(triggerId);
|
|
37
37
|
console.log(JSON.stringify(result, null, 2));
|
|
38
38
|
}
|
|
39
|
-
//# sourceMappingURL=
|
|
39
|
+
//# sourceMappingURL=triggers-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/triggers-cmd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQ3D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA8B,EAAE;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,UAA8B,EAAE;IAEhC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAMC,EACD,UAA8B,EAAE;IAEhC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3C,IAAI;QACJ,IAAI,EAAE,IAA+C;QACrD,GAAG;QACH,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,UAA8B,EAAE;IAEhC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI: loxtep workflows list | deploy (backend workflows MS).
|
|
2
|
+
* CLI: loxtep workflows list | get <id> | create ... | deploy (backend workflows MS).
|
|
3
3
|
*/
|
|
4
4
|
export interface WorkflowsCmdOptions {
|
|
5
5
|
configFilePath?: string;
|
|
@@ -9,6 +9,13 @@ export interface WorkflowsCmdOptions {
|
|
|
9
9
|
export declare function runWorkflowsList(options?: WorkflowsCmdOptions & {
|
|
10
10
|
project_id?: string;
|
|
11
11
|
}): Promise<void>;
|
|
12
|
+
export declare function runWorkflowsGet(workflowId: string, options?: WorkflowsCmdOptions): Promise<void>;
|
|
13
|
+
export declare function runWorkflowsCreate(params: {
|
|
14
|
+
name: string;
|
|
15
|
+
project_id: string;
|
|
16
|
+
template_id?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
}, options?: WorkflowsCmdOptions): Promise<void>;
|
|
12
19
|
export declare function runWorkflowsDeploy(params: {
|
|
13
20
|
project_id: string;
|
|
14
21
|
instance_id?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workflows-cmd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
1
|
+
{"version":3,"file":"workflows-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workflows-cmd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACxF,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI: loxtep workflows list | deploy (backend workflows MS).
|
|
2
|
+
* CLI: loxtep workflows list | get <id> | create ... | deploy (backend workflows MS).
|
|
3
3
|
*/
|
|
4
4
|
import { requireCliClient } from '../create-cli-client.js';
|
|
5
5
|
export async function runWorkflowsList(options = {}) {
|
|
@@ -10,9 +10,30 @@ export async function runWorkflowsList(options = {}) {
|
|
|
10
10
|
process.exitCode = 1;
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
|
-
const result = await client.workflows.
|
|
13
|
+
const result = await client.workflows.list({ project_id: projectId, page_size: 50 });
|
|
14
14
|
console.log(JSON.stringify(result, null, 2));
|
|
15
15
|
}
|
|
16
|
+
export async function runWorkflowsGet(workflowId, options = {}) {
|
|
17
|
+
const { client } = await requireCliClient(options);
|
|
18
|
+
const workflow = await client.workflows.get(workflowId);
|
|
19
|
+
console.log(JSON.stringify(workflow, null, 2));
|
|
20
|
+
}
|
|
21
|
+
export async function runWorkflowsCreate(params, options = {}) {
|
|
22
|
+
const { client, config } = await requireCliClient(options);
|
|
23
|
+
const projectId = params.project_id ?? config.project_id;
|
|
24
|
+
if (!projectId) {
|
|
25
|
+
console.error('Missing project_id. Use: loxtep workflows create --name "..." --project-id <id>');
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const workflow = await client.workflows.create({
|
|
30
|
+
project_id: projectId,
|
|
31
|
+
name: params.name,
|
|
32
|
+
description: params.description,
|
|
33
|
+
template_id: params.template_id,
|
|
34
|
+
});
|
|
35
|
+
console.log(JSON.stringify(workflow, null, 2));
|
|
36
|
+
}
|
|
16
37
|
export async function runWorkflowsDeploy(params, options = {}) {
|
|
17
38
|
const { client, config } = await requireCliClient(options);
|
|
18
39
|
const instanceId = (params.instance_id && params.instance_id.trim()) || config.instance_id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/workflows-cmd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQ3D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAyD,EAAE;IAE3D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;IAC1D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,uGAAuG,CACxG,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"workflows-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/workflows-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 {
|