@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.
Files changed (134) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +77 -91
  3. package/dist/authoring/toolbox.d.ts +7 -7
  4. package/dist/authoring/toolbox.d.ts.map +1 -1
  5. package/dist/authoring/toolbox.js +5 -5
  6. package/dist/authoring/toolbox.js.map +1 -1
  7. package/dist/cli/auth-resolve.d.ts +4 -1
  8. package/dist/cli/auth-resolve.d.ts.map +1 -1
  9. package/dist/cli/auth-resolve.js +5 -3
  10. package/dist/cli/auth-resolve.js.map +1 -1
  11. package/dist/cli/commands/deploy-cmd.js +1 -1
  12. package/dist/cli/commands/deploy-cmd.js.map +1 -1
  13. package/dist/cli/commands/login.d.ts +10 -1
  14. package/dist/cli/commands/login.d.ts.map +1 -1
  15. package/dist/cli/commands/login.js +33 -5
  16. package/dist/cli/commands/login.js.map +1 -1
  17. package/dist/cli/commands/logout.d.ts +12 -2
  18. package/dist/cli/commands/logout.d.ts.map +1 -1
  19. package/dist/cli/commands/logout.js +29 -5
  20. package/dist/cli/commands/logout.js.map +1 -1
  21. package/dist/cli/commands/triggers-cmd.d.ts +19 -0
  22. package/dist/cli/commands/triggers-cmd.d.ts.map +1 -0
  23. package/dist/cli/commands/{connections-cmd.js → triggers-cmd.js} +12 -12
  24. package/dist/cli/commands/triggers-cmd.js.map +1 -0
  25. package/dist/cli/commands/whoami.js +1 -1
  26. package/dist/cli/commands/whoami.js.map +1 -1
  27. package/dist/cli/commands/workflows-cmd.d.ts +8 -1
  28. package/dist/cli/commands/workflows-cmd.d.ts.map +1 -1
  29. package/dist/cli/commands/workflows-cmd.js +23 -2
  30. package/dist/cli/commands/workflows-cmd.js.map +1 -1
  31. package/dist/cli/create-cli-client.d.ts +2 -0
  32. package/dist/cli/create-cli-client.d.ts.map +1 -1
  33. package/dist/cli/create-cli-client.js +11 -6
  34. package/dist/cli/create-cli-client.js.map +1 -1
  35. package/dist/cli/credentials.d.ts +38 -4
  36. package/dist/cli/credentials.d.ts.map +1 -1
  37. package/dist/cli/credentials.js +69 -4
  38. package/dist/cli/credentials.js.map +1 -1
  39. package/dist/cli/index.d.ts +1 -1
  40. package/dist/cli/index.js +37 -39
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/client/approvals-types.d.ts +47 -0
  43. package/dist/client/approvals-types.d.ts.map +1 -0
  44. package/dist/client/approvals-types.js +6 -0
  45. package/dist/client/approvals-types.js.map +1 -0
  46. package/dist/client/approvals.d.ts +18 -0
  47. package/dist/client/approvals.d.ts.map +1 -0
  48. package/dist/client/approvals.js +52 -0
  49. package/dist/client/approvals.js.map +1 -0
  50. package/dist/client/connectors.d.ts +1 -1
  51. package/dist/client/connectors.d.ts.map +1 -1
  52. package/dist/client/connectors.js +1 -1
  53. package/dist/client/connectors.js.map +1 -1
  54. package/dist/client/data-products-types.d.ts +1 -1
  55. package/dist/client/data-products-types.d.ts.map +1 -1
  56. package/dist/client/data-products.d.ts +1 -1
  57. package/dist/client/data-products.d.ts.map +1 -1
  58. package/dist/client/data-products.js +1 -1
  59. package/dist/client/data-products.js.map +1 -1
  60. package/dist/client/discovery.d.ts +4 -4
  61. package/dist/client/discovery.d.ts.map +1 -1
  62. package/dist/client/discovery.js +4 -4
  63. package/dist/client/discovery.js.map +1 -1
  64. package/dist/client/index.d.ts +5 -3
  65. package/dist/client/index.d.ts.map +1 -1
  66. package/dist/client/index.js +1 -0
  67. package/dist/client/index.js.map +1 -1
  68. package/dist/client/loxtep-client.d.ts +36 -21
  69. package/dist/client/loxtep-client.d.ts.map +1 -1
  70. package/dist/client/loxtep-client.js +42 -25
  71. package/dist/client/loxtep-client.js.map +1 -1
  72. package/dist/client/projects.d.ts +1 -1
  73. package/dist/client/projects.d.ts.map +1 -1
  74. package/dist/client/projects.js +1 -1
  75. package/dist/client/projects.js.map +1 -1
  76. package/dist/client/{delivery-types.d.ts → target-types.d.ts} +18 -18
  77. package/dist/client/target-types.d.ts.map +1 -0
  78. package/dist/client/target-types.js +10 -0
  79. package/dist/client/target-types.js.map +1 -0
  80. package/dist/client/targets.d.ts +21 -0
  81. package/dist/client/targets.d.ts.map +1 -0
  82. package/dist/client/{delivery.js → targets.js} +31 -33
  83. package/dist/client/targets.js.map +1 -0
  84. package/dist/client/thesaurus.d.ts +2 -2
  85. package/dist/client/thesaurus.d.ts.map +1 -1
  86. package/dist/client/thesaurus.js +4 -4
  87. package/dist/client/thesaurus.js.map +1 -1
  88. package/dist/client/{connection-types.d.ts → trigger-types.d.ts} +22 -21
  89. package/dist/client/trigger-types.d.ts.map +1 -0
  90. package/dist/client/trigger-types.js +19 -0
  91. package/dist/client/trigger-types.js.map +1 -0
  92. package/dist/client/triggers.d.ts +19 -0
  93. package/dist/client/triggers.d.ts.map +1 -0
  94. package/dist/client/{connections.js → triggers.js} +12 -11
  95. package/dist/client/triggers.js.map +1 -0
  96. package/dist/client/workflows.d.ts +38 -6
  97. package/dist/client/workflows.d.ts.map +1 -1
  98. package/dist/client/workflows.js +192 -8
  99. package/dist/client/workflows.js.map +1 -1
  100. package/dist/codegen/load-workspace-context.d.ts.map +1 -1
  101. package/dist/codegen/load-workspace-context.js +6 -4
  102. package/dist/codegen/load-workspace-context.js.map +1 -1
  103. package/dist/config/workspace-config.d.ts +2 -1
  104. package/dist/config/workspace-config.d.ts.map +1 -1
  105. package/dist/config/workspace-config.js +5 -6
  106. package/dist/config/workspace-config.js.map +1 -1
  107. package/docs/getting-started.md +0 -12
  108. package/docs/quick-reference.md +6 -19
  109. package/docs/sdk-mcp-mapping.md +15 -8
  110. package/docs/sdk-pairing.md +5 -5
  111. package/package.json +2 -2
  112. package/dist/cli/commands/connections-cmd.d.ts +0 -19
  113. package/dist/cli/commands/connections-cmd.d.ts.map +0 -1
  114. package/dist/cli/commands/connections-cmd.js.map +0 -1
  115. package/dist/cli/commands/flows-cmd.d.ts +0 -19
  116. package/dist/cli/commands/flows-cmd.d.ts.map +0 -1
  117. package/dist/cli/commands/flows-cmd.js +0 -37
  118. package/dist/cli/commands/flows-cmd.js.map +0 -1
  119. package/dist/client/connection-types.d.ts.map +0 -1
  120. package/dist/client/connection-types.js +0 -18
  121. package/dist/client/connection-types.js.map +0 -1
  122. package/dist/client/connections.d.ts +0 -18
  123. package/dist/client/connections.d.ts.map +0 -1
  124. package/dist/client/connections.js.map +0 -1
  125. package/dist/client/delivery-types.d.ts.map +0 -1
  126. package/dist/client/delivery-types.js +0 -10
  127. package/dist/client/delivery-types.js.map +0 -1
  128. package/dist/client/delivery.d.ts +0 -23
  129. package/dist/client/delivery.d.ts.map +0 -1
  130. package/dist/client/delivery.js.map +0 -1
  131. package/dist/client/flows.d.ts +0 -33
  132. package/dist/client/flows.d.ts.map +0 -1
  133. package/dist/client/flows.js +0 -218
  134. 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 { getCredentialsPath, writeCredentials } from '../credentials.js';
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
- console.log(`\nLogged in successfully. Tokens saved to ${credentialsPath}`);
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
- }, options.credentialsPath);
110
- console.log('Logged in successfully.');
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":"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"}
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":"AAEA;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAG/C"}
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
- await deleteCredentials();
7
- console.log('Logged out.');
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,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,iBAAiB,EAAE,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7B,CAAC"}
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 connections list | connections get <id> | connections create ... | connections test <id>
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 runConnectionsList(options = {}) {
5
+ export async function runTriggersList(options = {}) {
6
6
  const { client } = await requireCliClient(options);
7
- const result = await client.connections.list({ page_size: 50 });
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 runConnectionsGet(connectionId, options = {}) {
10
+ export async function runTriggersGet(triggerId, options = {}) {
11
11
  const { client } = await requireCliClient(options);
12
- const conn = await client.connections.get(connectionId);
13
- console.log(JSON.stringify(conn, null, 2));
12
+ const trigger = await client.triggers.get(triggerId);
13
+ console.log(JSON.stringify(trigger, null, 2));
14
14
  }
15
- export async function runConnectionsCreate(params, options = {}) {
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 conn = await client.connections.create({
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(conn, null, 2));
32
+ console.log(JSON.stringify(trigger, null, 2));
33
33
  }
34
- export async function runConnectionsTest(connectionId, options = {}) {
34
+ export async function runTriggersTest(triggerId, options = {}) {
35
35
  const { client } = await requireCliClient(options);
36
- const result = await client.connections.test(connectionId);
36
+ const result = await client.triggers.test(triggerId);
37
37
  console.log(JSON.stringify(result, null, 2));
38
38
  }
39
- //# sourceMappingURL=connections-cmd.js.map
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 | npx @loxtep/customer-mcp-server 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,yKAAyK,CAC1K,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
+ {"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.listWorkflows({ project_id: projectId, page_size: 50 });
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,aAAa,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAKC,EACD,UAA+B,EAAE;IAEjC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC;IAC3F,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CACX,oFAAoF,CACrF,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QAC3C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,UAAU;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;KAC/C,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,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,CA2DhC;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"}
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, getCredentialsPath } from './credentials.js';
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, options) {
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(options.credentialsPath);
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
- }, options.credentialsPath);
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, options);
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 ?? getCredentialsPath();
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":"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"}
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` or `@loxtep/customer-mcp-server login`. Optional: config / env can supply api_url.
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
- /** Read credentials from file. Returns null if missing or invalid. */
20
- export declare function readCredentials(filePath?: string): Promise<CliCredentials | null>;
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":"AAIA,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,gEAAgE;AAChE,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,sEAAsE;AACtE,wBAAsB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BvF;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"}
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"}
@@ -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
- /** Read credentials from file. Returns null if missing or invalid. */
11
- export async function readCredentials(filePath) {
12
- const path = filePath ?? getCredentialsPath();
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 {