@sembix/cli 1.2.1 → 1.4.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 (205) hide show
  1. package/COMMANDS.md +1522 -0
  2. package/QUICKSTART.md +829 -0
  3. package/README.md +1976 -309
  4. package/USAGE-EXAMPLES.md +872 -0
  5. package/config.example.yaml +3 -0
  6. package/dist/commands/configure.d.ts.map +1 -1
  7. package/dist/commands/configure.js +172 -2
  8. package/dist/commands/configure.js.map +1 -1
  9. package/dist/commands/index.d.ts +10 -0
  10. package/dist/commands/index.d.ts.map +1 -0
  11. package/dist/commands/index.js +11 -0
  12. package/dist/commands/index.js.map +1 -0
  13. package/dist/commands/login.d.ts +19 -0
  14. package/dist/commands/login.d.ts.map +1 -0
  15. package/dist/commands/login.js +118 -0
  16. package/dist/commands/login.js.map +1 -0
  17. package/dist/commands/logout.d.ts +21 -0
  18. package/dist/commands/logout.d.ts.map +1 -0
  19. package/dist/commands/logout.js +66 -0
  20. package/dist/commands/logout.js.map +1 -0
  21. package/dist/commands/profile-project.d.ts +14 -0
  22. package/dist/commands/profile-project.d.ts.map +1 -0
  23. package/dist/commands/profile-project.js +123 -0
  24. package/dist/commands/profile-project.js.map +1 -0
  25. package/dist/commands/profile.d.ts +26 -0
  26. package/dist/commands/profile.d.ts.map +1 -0
  27. package/dist/commands/profile.js +177 -0
  28. package/dist/commands/profile.js.map +1 -0
  29. package/dist/commands/project.d.ts +16 -0
  30. package/dist/commands/project.d.ts.map +1 -0
  31. package/dist/commands/project.js +153 -0
  32. package/dist/commands/project.js.map +1 -0
  33. package/dist/commands/setup.js +3 -0
  34. package/dist/commands/setup.js.map +1 -1
  35. package/dist/commands/workflow.d.ts +91 -0
  36. package/dist/commands/workflow.d.ts.map +1 -0
  37. package/dist/commands/workflow.js +1201 -0
  38. package/dist/commands/workflow.js.map +1 -0
  39. package/dist/config-schema.d.ts +26 -0
  40. package/dist/config-schema.d.ts.map +1 -1
  41. package/dist/config-schema.js +24 -1
  42. package/dist/config-schema.js.map +1 -1
  43. package/dist/config.d.ts +4 -0
  44. package/dist/config.d.ts.map +1 -1
  45. package/dist/config.js +23 -2
  46. package/dist/config.js.map +1 -1
  47. package/dist/index.js +324 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/prompts/environment-setup.d.ts.map +1 -1
  50. package/dist/prompts/environment-setup.js +12 -0
  51. package/dist/prompts/environment-setup.js.map +1 -1
  52. package/dist/prompts/project-selection.d.ts +8 -0
  53. package/dist/prompts/project-selection.d.ts.map +1 -0
  54. package/dist/prompts/project-selection.js +132 -0
  55. package/dist/prompts/project-selection.js.map +1 -0
  56. package/dist/prompts/workflow-inputs.d.ts +10 -0
  57. package/dist/prompts/workflow-inputs.d.ts.map +1 -0
  58. package/dist/prompts/workflow-inputs.js +71 -0
  59. package/dist/prompts/workflow-inputs.js.map +1 -0
  60. package/dist/prompts/workflow-selection.d.ts +8 -0
  61. package/dist/prompts/workflow-selection.d.ts.map +1 -0
  62. package/dist/prompts/workflow-selection.js +147 -0
  63. package/dist/prompts/workflow-selection.js.map +1 -0
  64. package/dist/sembix-cli-1.4.0.tgz +0 -0
  65. package/dist/services/cognito-auth.d.ts +92 -0
  66. package/dist/services/cognito-auth.d.ts.map +1 -0
  67. package/dist/services/cognito-auth.js +319 -0
  68. package/dist/services/cognito-auth.js.map +1 -0
  69. package/dist/services/studio-api-client.d.ts +127 -0
  70. package/dist/services/studio-api-client.d.ts.map +1 -0
  71. package/dist/services/studio-api-client.js +291 -0
  72. package/dist/services/studio-api-client.js.map +1 -0
  73. package/dist/types/studio.d.ts +82 -0
  74. package/dist/types/studio.d.ts.map +1 -0
  75. package/dist/types/studio.js +7 -0
  76. package/dist/types/studio.js.map +1 -0
  77. package/dist/types.d.ts +286 -0
  78. package/dist/types.d.ts.map +1 -1
  79. package/dist/types.js +5 -0
  80. package/dist/types.js.map +1 -1
  81. package/dist/utils/browser-auth.d.ts +45 -0
  82. package/dist/utils/browser-auth.d.ts.map +1 -0
  83. package/dist/utils/browser-auth.js +168 -0
  84. package/dist/utils/browser-auth.js.map +1 -0
  85. package/dist/utils/cognito-auth.d.ts +3 -0
  86. package/dist/utils/cognito-auth.d.ts.map +1 -0
  87. package/dist/utils/cognito-auth.js +3 -0
  88. package/dist/utils/cognito-auth.js.map +1 -0
  89. package/dist/utils/config-file.d.ts +40 -0
  90. package/dist/utils/config-file.d.ts.map +1 -1
  91. package/dist/utils/config-file.js +158 -4
  92. package/dist/utils/config-file.js.map +1 -1
  93. package/dist/utils/config-loader.d.ts.map +1 -1
  94. package/dist/utils/config-loader.js +15 -2
  95. package/dist/utils/config-loader.js.map +1 -1
  96. package/dist/utils/environment.d.ts +22 -0
  97. package/dist/utils/environment.d.ts.map +1 -0
  98. package/dist/utils/environment.js +39 -0
  99. package/dist/utils/environment.js.map +1 -0
  100. package/dist/utils/error-handler.d.ts +53 -0
  101. package/dist/utils/error-handler.d.ts.map +1 -0
  102. package/dist/utils/error-handler.js +174 -0
  103. package/dist/utils/error-handler.js.map +1 -0
  104. package/dist/utils/fuzzy-match.d.ts +31 -0
  105. package/dist/utils/fuzzy-match.d.ts.map +1 -0
  106. package/dist/utils/fuzzy-match.js +138 -0
  107. package/dist/utils/fuzzy-match.js.map +1 -0
  108. package/dist/utils/input-parser.d.ts +14 -0
  109. package/dist/utils/input-parser.d.ts.map +1 -0
  110. package/dist/utils/input-parser.js +34 -0
  111. package/dist/utils/input-parser.js.map +1 -0
  112. package/dist/utils/output.d.ts +55 -0
  113. package/dist/utils/output.d.ts.map +1 -0
  114. package/dist/utils/output.js +80 -0
  115. package/dist/utils/output.js.map +1 -0
  116. package/dist/utils/recent-workflows.d.ts +37 -0
  117. package/dist/utils/recent-workflows.d.ts.map +1 -0
  118. package/dist/utils/recent-workflows.js +172 -0
  119. package/dist/utils/recent-workflows.js.map +1 -0
  120. package/dist/utils/studio-api-client.d.ts +3 -0
  121. package/dist/utils/studio-api-client.d.ts.map +1 -0
  122. package/dist/utils/studio-api-client.js +3 -0
  123. package/dist/utils/studio-api-client.js.map +1 -0
  124. package/dist/utils/studio-api.d.ts +53 -0
  125. package/dist/utils/studio-api.d.ts.map +1 -0
  126. package/dist/utils/studio-api.js +102 -0
  127. package/dist/utils/studio-api.js.map +1 -0
  128. package/dist/utils/studio-config.d.ts +74 -0
  129. package/dist/utils/studio-config.d.ts.map +1 -0
  130. package/dist/utils/studio-config.js +213 -0
  131. package/dist/utils/studio-config.js.map +1 -0
  132. package/dist/utils/token-manager.d.ts +4 -0
  133. package/dist/utils/token-manager.d.ts.map +1 -0
  134. package/dist/utils/token-manager.js +3 -0
  135. package/dist/utils/token-manager.js.map +1 -0
  136. package/dist/utils/ui.d.ts +55 -1
  137. package/dist/utils/ui.d.ts.map +1 -1
  138. package/dist/utils/ui.js +151 -2
  139. package/dist/utils/ui.js.map +1 -1
  140. package/package.json +4 -1
  141. package/dist/__tests__/config-schema.test.d.ts +0 -2
  142. package/dist/__tests__/config-schema.test.d.ts.map +0 -1
  143. package/dist/__tests__/config-schema.test.js +0 -471
  144. package/dist/__tests__/config-schema.test.js.map +0 -1
  145. package/dist/__tests__/config.test.d.ts +0 -2
  146. package/dist/__tests__/config.test.d.ts.map +0 -1
  147. package/dist/__tests__/config.test.js +0 -75
  148. package/dist/__tests__/config.test.js.map +0 -1
  149. package/dist/__tests__/integration/configure.test.d.ts +0 -2
  150. package/dist/__tests__/integration/configure.test.d.ts.map +0 -1
  151. package/dist/__tests__/integration/configure.test.js +0 -247
  152. package/dist/__tests__/integration/configure.test.js.map +0 -1
  153. package/dist/__tests__/integration/fixtures/configs.d.ts +0 -477
  154. package/dist/__tests__/integration/fixtures/configs.d.ts.map +0 -1
  155. package/dist/__tests__/integration/fixtures/configs.js +0 -175
  156. package/dist/__tests__/integration/fixtures/configs.js.map +0 -1
  157. package/dist/__tests__/integration/helpers/cli-runner.d.ts +0 -63
  158. package/dist/__tests__/integration/helpers/cli-runner.d.ts.map +0 -1
  159. package/dist/__tests__/integration/helpers/cli-runner.js +0 -152
  160. package/dist/__tests__/integration/helpers/cli-runner.js.map +0 -1
  161. package/dist/__tests__/integration/helpers/command-runner.d.ts +0 -53
  162. package/dist/__tests__/integration/helpers/command-runner.d.ts.map +0 -1
  163. package/dist/__tests__/integration/helpers/command-runner.js +0 -117
  164. package/dist/__tests__/integration/helpers/command-runner.js.map +0 -1
  165. package/dist/__tests__/integration/studio-create.test.d.ts +0 -2
  166. package/dist/__tests__/integration/studio-create.test.d.ts.map +0 -1
  167. package/dist/__tests__/integration/studio-create.test.js +0 -209
  168. package/dist/__tests__/integration/studio-create.test.js.map +0 -1
  169. package/dist/__tests__/integration/studio-update.test.d.ts +0 -2
  170. package/dist/__tests__/integration/studio-update.test.d.ts.map +0 -1
  171. package/dist/__tests__/integration/studio-update.test.js +0 -166
  172. package/dist/__tests__/integration/studio-update.test.js.map +0 -1
  173. package/dist/commands/__tests__/configure.test.d.ts +0 -2
  174. package/dist/commands/__tests__/configure.test.d.ts.map +0 -1
  175. package/dist/commands/__tests__/configure.test.js +0 -229
  176. package/dist/commands/__tests__/configure.test.js.map +0 -1
  177. package/dist/prompts/__tests__/environment-setup.test.d.ts +0 -2
  178. package/dist/prompts/__tests__/environment-setup.test.d.ts.map +0 -1
  179. package/dist/prompts/__tests__/environment-setup.test.js +0 -206
  180. package/dist/prompts/__tests__/environment-setup.test.js.map +0 -1
  181. package/dist/prompts/__tests__/hub-integration.test.d.ts +0 -2
  182. package/dist/prompts/__tests__/hub-integration.test.d.ts.map +0 -1
  183. package/dist/prompts/__tests__/hub-integration.test.js +0 -126
  184. package/dist/prompts/__tests__/hub-integration.test.js.map +0 -1
  185. package/dist/prompts/__tests__/prompt-helpers.test.d.ts +0 -2
  186. package/dist/prompts/__tests__/prompt-helpers.test.d.ts.map +0 -1
  187. package/dist/prompts/__tests__/prompt-helpers.test.js +0 -235
  188. package/dist/prompts/__tests__/prompt-helpers.test.js.map +0 -1
  189. package/dist/sembix-cli-1.2.1.tgz +0 -0
  190. package/dist/utils/__tests__/config-file.test.d.ts +0 -2
  191. package/dist/utils/__tests__/config-file.test.d.ts.map +0 -1
  192. package/dist/utils/__tests__/config-file.test.js +0 -218
  193. package/dist/utils/__tests__/config-file.test.js.map +0 -1
  194. package/dist/utils/__tests__/config-loader.test.d.ts +0 -2
  195. package/dist/utils/__tests__/config-loader.test.d.ts.map +0 -1
  196. package/dist/utils/__tests__/config-loader.test.js +0 -325
  197. package/dist/utils/__tests__/config-loader.test.js.map +0 -1
  198. package/dist/utils/__tests__/github.test.d.ts +0 -2
  199. package/dist/utils/__tests__/github.test.d.ts.map +0 -1
  200. package/dist/utils/__tests__/github.test.js +0 -282
  201. package/dist/utils/__tests__/github.test.js.map +0 -1
  202. package/dist/utils/__tests__/ui.test.d.ts +0 -2
  203. package/dist/utils/__tests__/ui.test.d.ts.map +0 -1
  204. package/dist/utils/__tests__/ui.test.js +0 -256
  205. package/dist/utils/__tests__/ui.test.js.map +0 -1
@@ -0,0 +1,53 @@
1
+ import { StudioApiClient } from '../services/studio-api-client.js';
2
+ import type { StudioProfile, StudioAuthTokens, StartWorkflowConfiguration, WorkflowStartResponse, FetchWorkflowRunResponse, FetchWorkflowRunListItem, SearchParams } from '../types.js';
3
+ /**
4
+ * Creates a Studio API client with automatic token refresh handling.
5
+ *
6
+ * This factory function:
7
+ * 1. Loads the specified profile (or default) and validates authentication
8
+ * 2. Creates a StudioApiClient instance
9
+ * 3. Wraps API calls to handle token refresh on 401 errors
10
+ *
11
+ * @param profileName - Optional profile name (defaults to active profile)
12
+ * @returns StudioApiClient instance with token refresh capability
13
+ * @throws Error if profile not found or tokens invalid/expired
14
+ */
15
+ export declare function createStudioApiClient(profileName?: string): Promise<StudioApiClient>;
16
+ /**
17
+ * Convenience function to start a workflow execution.
18
+ *
19
+ * @param projectId - Project ID containing the workflow
20
+ * @param workflowId - Workflow ID to execute
21
+ * @param startConfiguration - Workflow input configuration
22
+ * @param profileName - Optional profile name
23
+ * @returns Workflow start response with run ID and task ARN
24
+ */
25
+ export declare function startWorkflow(projectId: string, workflowId: string, startConfiguration: StartWorkflowConfiguration, profileName?: string): Promise<WorkflowStartResponse>;
26
+ /**
27
+ * Convenience function to get workflow run details.
28
+ *
29
+ * @param workflowId - Workflow ID
30
+ * @param runId - Run ID to fetch
31
+ * @param profileName - Optional profile name
32
+ * @returns Workflow run details
33
+ */
34
+ export declare function getWorkflowRun(workflowId: string, runId: string, profileName?: string): Promise<FetchWorkflowRunResponse>;
35
+ /**
36
+ * Convenience function to search workflow runs.
37
+ *
38
+ * @param params - Search parameters (filters, pagination, sorting)
39
+ * @param profileName - Optional profile name
40
+ * @returns List of workflow runs matching search criteria
41
+ */
42
+ export declare function searchWorkflowRuns(params: SearchParams, profileName?: string): Promise<FetchWorkflowRunListItem>;
43
+ /**
44
+ * Convenience function to stop a running workflow.
45
+ *
46
+ * @param projectId - Project ID containing the workflow
47
+ * @param workflowId - Workflow ID
48
+ * @param runId - Run ID to stop
49
+ * @param profileName - Optional profile name
50
+ */
51
+ export declare function stopWorkflowRun(projectId: string, workflowId: string, runId: string, profileName?: string): Promise<void>;
52
+ export type { StudioProfile, StudioAuthTokens, StartWorkflowConfiguration, WorkflowStartResponse, FetchWorkflowRunResponse, FetchWorkflowRunListItem, SearchParams };
53
+ //# sourceMappingURL=studio-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-api.d.ts","sourceRoot":"","sources":["../../src/utils/studio-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAOnE,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA+C1F;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,0BAA0B,EAC9C,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAGhC;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAGnC;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAGnC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAGf;AAGD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,YAAY,EACb,CAAC"}
@@ -0,0 +1,102 @@
1
+ // Service layer imports
2
+ import { StudioApiClient } from '../services/studio-api-client.js';
3
+ import { CognitoAuthService } from '../services/cognito-auth.js';
4
+ // Utility imports
5
+ import { getAuthenticatedProfile, saveTokens } from './studio-config.js';
6
+ /**
7
+ * Creates a Studio API client with automatic token refresh handling.
8
+ *
9
+ * This factory function:
10
+ * 1. Loads the specified profile (or default) and validates authentication
11
+ * 2. Creates a StudioApiClient instance
12
+ * 3. Wraps API calls to handle token refresh on 401 errors
13
+ *
14
+ * @param profileName - Optional profile name (defaults to active profile)
15
+ * @returns StudioApiClient instance with token refresh capability
16
+ * @throws Error if profile not found or tokens invalid/expired
17
+ */
18
+ export async function createStudioApiClient(profileName) {
19
+ const { profile, tokens } = await getAuthenticatedProfile(profileName);
20
+ // Create base client
21
+ const client = new StudioApiClient(profile, tokens);
22
+ // Wrap client methods to handle token refresh on 401
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ const originalRequest = client._makeRequest.bind(client);
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ client._makeRequest = async function (method, path, body, queryParams) {
27
+ try {
28
+ return await originalRequest(method, path, body, queryParams);
29
+ }
30
+ catch (error) {
31
+ // If 401 error, attempt token refresh and retry
32
+ const errorWithStatus = error;
33
+ if (errorWithStatus.statusCode === 401) {
34
+ try {
35
+ const authService = new CognitoAuthService(profile);
36
+ const newTokens = await authService.refreshTokens(tokens.refreshToken);
37
+ // Save refreshed tokens
38
+ await saveTokens(profile.name, newTokens);
39
+ // Update client tokens
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ client.tokens = newTokens;
42
+ // Retry original request with new tokens
43
+ return await originalRequest(method, path, body, queryParams);
44
+ }
45
+ catch {
46
+ throw new Error(`Authentication failed and token refresh unsuccessful. Run "sembix login --profile ${profile.name}" to re-authenticate.`);
47
+ }
48
+ }
49
+ throw error;
50
+ }
51
+ };
52
+ return client;
53
+ }
54
+ /**
55
+ * Convenience function to start a workflow execution.
56
+ *
57
+ * @param projectId - Project ID containing the workflow
58
+ * @param workflowId - Workflow ID to execute
59
+ * @param startConfiguration - Workflow input configuration
60
+ * @param profileName - Optional profile name
61
+ * @returns Workflow start response with run ID and task ARN
62
+ */
63
+ export async function startWorkflow(projectId, workflowId, startConfiguration, profileName) {
64
+ const client = await createStudioApiClient(profileName);
65
+ return client.startWorkflow(projectId, workflowId, startConfiguration);
66
+ }
67
+ /**
68
+ * Convenience function to get workflow run details.
69
+ *
70
+ * @param workflowId - Workflow ID
71
+ * @param runId - Run ID to fetch
72
+ * @param profileName - Optional profile name
73
+ * @returns Workflow run details
74
+ */
75
+ export async function getWorkflowRun(workflowId, runId, profileName) {
76
+ const client = await createStudioApiClient(profileName);
77
+ return client.getWorkflowRun(workflowId, runId);
78
+ }
79
+ /**
80
+ * Convenience function to search workflow runs.
81
+ *
82
+ * @param params - Search parameters (filters, pagination, sorting)
83
+ * @param profileName - Optional profile name
84
+ * @returns List of workflow runs matching search criteria
85
+ */
86
+ export async function searchWorkflowRuns(params, profileName) {
87
+ const client = await createStudioApiClient(profileName);
88
+ return client.searchWorkflowRuns(params);
89
+ }
90
+ /**
91
+ * Convenience function to stop a running workflow.
92
+ *
93
+ * @param projectId - Project ID containing the workflow
94
+ * @param workflowId - Workflow ID
95
+ * @param runId - Run ID to stop
96
+ * @param profileName - Optional profile name
97
+ */
98
+ export async function stopWorkflowRun(projectId, workflowId, runId, profileName) {
99
+ const client = await createStudioApiClient(profileName);
100
+ return client.stopWorkflowRun(projectId, workflowId, runId);
101
+ }
102
+ //# sourceMappingURL=studio-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-api.js","sourceRoot":"","sources":["../../src/utils/studio-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ export { readProfile, writeProfile, listProfiles, getDefaultProfile, setDefaultProfile, deleteProfile, type StudioProfile, type StudioConfig } from './config-file.js';
2
+ import type { StudioAuthTokens } from '../types.js';
3
+ import type { StudioProfile } from './config-file.js';
4
+ /**
5
+ * Saves authentication tokens for a profile
6
+ * Tokens are stored in ~/.sembix/tokens/{profile-name}.json with 0o600 permissions
7
+ *
8
+ * @param profileName - Name of the profile
9
+ * @param tokens - Authentication tokens to save
10
+ */
11
+ export declare function saveTokens(profileName: string, tokens: StudioAuthTokens): Promise<void>;
12
+ /**
13
+ * Loads authentication tokens for a profile
14
+ * Returns undefined if tokens don't exist or file cannot be read
15
+ *
16
+ * @param profileName - Name of the profile
17
+ * @returns Authentication tokens or undefined if not found
18
+ */
19
+ export declare function loadTokens(profileName: string): Promise<StudioAuthTokens | undefined>;
20
+ /**
21
+ * Deletes stored authentication tokens for a profile
22
+ *
23
+ * @param profileName - Name of the profile
24
+ */
25
+ export declare function deleteTokens(profileName: string): Promise<void>;
26
+ /**
27
+ * Checks if authentication tokens are still valid based on expiration time
28
+ *
29
+ * @param tokens - Authentication tokens to validate
30
+ * @returns true if tokens are valid and not expired
31
+ */
32
+ export declare function isTokenValid(tokens: StudioAuthTokens): boolean;
33
+ /**
34
+ * Lists all profiles that have stored authentication tokens
35
+ *
36
+ * @returns Array of profile names with stored tokens
37
+ */
38
+ export declare function listTokenProfiles(): Promise<string[]>;
39
+ /**
40
+ * Gets token information for a profile without exposing the token values
41
+ * Useful for displaying token status to users
42
+ *
43
+ * @param profileName - Name of the profile
44
+ * @returns Object with token status information or undefined if no tokens exist
45
+ */
46
+ export declare function getTokenInfo(profileName: string): Promise<{
47
+ expiresAt: string;
48
+ isValid: boolean;
49
+ } | undefined>;
50
+ /**
51
+ * Gets the active Studio profile, using the specified profile name or falling back to default
52
+ * Throws an error if no profile is found
53
+ *
54
+ * @param profileName - Optional profile name to use
55
+ * @returns The active Studio profile
56
+ * @throws Error if no profile is configured
57
+ */
58
+ export declare function getActiveProfile(profileName?: string): Promise<StudioProfile>;
59
+ /**
60
+ * Gets the active profile with valid authentication tokens
61
+ * Supports multiple authentication methods with priority:
62
+ * 1. Client credentials (CI/CD)
63
+ * 2. Stored tokens (file-based)
64
+ * 3. Interactive login (if TTY available)
65
+ *
66
+ * @param profileName - Optional profile name to use
67
+ * @returns Object containing the profile and valid tokens
68
+ * @throws Error if authentication fails
69
+ */
70
+ export declare function getAuthenticatedProfile(profileName?: string): Promise<{
71
+ profile: StudioProfile;
72
+ tokens: StudioAuthTokens;
73
+ }>;
74
+ //# sourceMappingURL=studio-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-config.d.ts","sourceRoot":"","sources":["../../src/utils/studio-config.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAwBtD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7F;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAW3F;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAU9D;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAY3D;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CASpH;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBnF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3E,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC,CAqED"}
@@ -0,0 +1,213 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ import { promises as fs } from 'fs';
4
+ import { existsSync } from 'fs';
5
+ // Re-export profile management functions from config-file
6
+ export { readProfile, writeProfile, listProfiles, getDefaultProfile, setDefaultProfile, deleteProfile } from './config-file.js';
7
+ import { readProfile, getDefaultProfile } from './config-file.js';
8
+ import { hasClientCredentials, isInteractive } from './environment.js';
9
+ import { CognitoAuthService } from '../services/cognito-auth.js';
10
+ // Token storage directory
11
+ const TOKENS_DIR = join(homedir(), '.sembix', 'tokens');
12
+ /**
13
+ * Ensures the tokens directory exists with secure permissions
14
+ */
15
+ async function ensureTokensDirectory() {
16
+ if (!existsSync(TOKENS_DIR)) {
17
+ await fs.mkdir(TOKENS_DIR, { recursive: true, mode: 0o700 });
18
+ }
19
+ }
20
+ /**
21
+ * Gets the file path for a profile's token storage
22
+ */
23
+ function getTokenFilePath(profileName) {
24
+ return join(TOKENS_DIR, `${profileName}.json`);
25
+ }
26
+ /**
27
+ * Saves authentication tokens for a profile
28
+ * Tokens are stored in ~/.sembix/tokens/{profile-name}.json with 0o600 permissions
29
+ *
30
+ * @param profileName - Name of the profile
31
+ * @param tokens - Authentication tokens to save
32
+ */
33
+ export async function saveTokens(profileName, tokens) {
34
+ await ensureTokensDirectory();
35
+ const tokenFile = getTokenFilePath(profileName);
36
+ const content = JSON.stringify(tokens, null, 2);
37
+ await fs.writeFile(tokenFile, content, { mode: 0o600 });
38
+ }
39
+ /**
40
+ * Loads authentication tokens for a profile
41
+ * Returns undefined if tokens don't exist or file cannot be read
42
+ *
43
+ * @param profileName - Name of the profile
44
+ * @returns Authentication tokens or undefined if not found
45
+ */
46
+ export async function loadTokens(profileName) {
47
+ try {
48
+ const tokenFile = getTokenFilePath(profileName);
49
+ if (!existsSync(tokenFile)) {
50
+ return undefined;
51
+ }
52
+ const content = await fs.readFile(tokenFile, 'utf-8');
53
+ return JSON.parse(content);
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ }
59
+ /**
60
+ * Deletes stored authentication tokens for a profile
61
+ *
62
+ * @param profileName - Name of the profile
63
+ */
64
+ export async function deleteTokens(profileName) {
65
+ try {
66
+ const tokenFile = getTokenFilePath(profileName);
67
+ if (existsSync(tokenFile)) {
68
+ await fs.unlink(tokenFile);
69
+ }
70
+ }
71
+ catch {
72
+ // Ignore errors if file doesn't exist
73
+ }
74
+ }
75
+ /**
76
+ * Checks if authentication tokens are still valid based on expiration time
77
+ *
78
+ * @param tokens - Authentication tokens to validate
79
+ * @returns true if tokens are valid and not expired
80
+ */
81
+ export function isTokenValid(tokens) {
82
+ try {
83
+ const expiresAt = new Date(tokens.expiresAt);
84
+ const now = new Date();
85
+ // Add 5 minute buffer to account for clock skew and request time
86
+ const bufferMs = 5 * 60 * 1000;
87
+ return expiresAt.getTime() - now.getTime() > bufferMs;
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ }
93
+ /**
94
+ * Lists all profiles that have stored authentication tokens
95
+ *
96
+ * @returns Array of profile names with stored tokens
97
+ */
98
+ export async function listTokenProfiles() {
99
+ try {
100
+ if (!existsSync(TOKENS_DIR)) {
101
+ return [];
102
+ }
103
+ const files = await fs.readdir(TOKENS_DIR);
104
+ return files
105
+ .filter(file => file.endsWith('.json'))
106
+ .map(file => file.replace('.json', ''));
107
+ }
108
+ catch {
109
+ return [];
110
+ }
111
+ }
112
+ /**
113
+ * Gets token information for a profile without exposing the token values
114
+ * Useful for displaying token status to users
115
+ *
116
+ * @param profileName - Name of the profile
117
+ * @returns Object with token status information or undefined if no tokens exist
118
+ */
119
+ export async function getTokenInfo(profileName) {
120
+ const tokens = await loadTokens(profileName);
121
+ if (!tokens) {
122
+ return undefined;
123
+ }
124
+ return {
125
+ expiresAt: tokens.expiresAt,
126
+ isValid: isTokenValid(tokens)
127
+ };
128
+ }
129
+ /**
130
+ * Gets the active Studio profile, using the specified profile name or falling back to default
131
+ * Throws an error if no profile is found
132
+ *
133
+ * @param profileName - Optional profile name to use
134
+ * @returns The active Studio profile
135
+ * @throws Error if no profile is configured
136
+ */
137
+ export async function getActiveProfile(profileName) {
138
+ // Try to get the specified profile or default profile
139
+ const targetProfile = profileName || await getDefaultProfile();
140
+ if (!targetProfile) {
141
+ throw new Error('No Studio profile configured. Run "sembix configure" to set up a profile.');
142
+ }
143
+ const profile = await readProfile(targetProfile);
144
+ if (!profile) {
145
+ throw new Error(`Profile "${targetProfile}" not found. Run "sembix profile list" to see available profiles.`);
146
+ }
147
+ return profile;
148
+ }
149
+ /**
150
+ * Gets the active profile with valid authentication tokens
151
+ * Supports multiple authentication methods with priority:
152
+ * 1. Client credentials (CI/CD)
153
+ * 2. Stored tokens (file-based)
154
+ * 3. Interactive login (if TTY available)
155
+ *
156
+ * @param profileName - Optional profile name to use
157
+ * @returns Object containing the profile and valid tokens
158
+ * @throws Error if authentication fails
159
+ */
160
+ export async function getAuthenticatedProfile(profileName) {
161
+ const profile = await getActiveProfile(profileName);
162
+ // Priority 1: Check for client credentials (CI/CD)
163
+ if (hasClientCredentials()) {
164
+ const clientId = process.env.SEMBIX_CLIENT_ID;
165
+ const clientSecret = process.env.SEMBIX_CLIENT_SECRET;
166
+ try {
167
+ const authService = new CognitoAuthService(profile);
168
+ const tokens = await authService.authenticateWithClientCredentials(clientId, clientSecret);
169
+ return { profile, tokens };
170
+ }
171
+ catch (error) {
172
+ throw new Error(`Client credentials authentication failed: ${error instanceof Error ? error.message : String(error)}\n\n` +
173
+ `Check that SEMBIX_CLIENT_ID and SEMBIX_CLIENT_SECRET are correct.`);
174
+ }
175
+ }
176
+ // Priority 2: Load stored tokens
177
+ let tokens = await loadTokens(profile.name);
178
+ if (!tokens) {
179
+ // No stored tokens - guide user based on environment
180
+ if (isInteractive()) {
181
+ throw new Error(`No authentication tokens found for profile "${profile.name}".\n\n` +
182
+ `Run: sembix login --profile ${profile.name}`);
183
+ }
184
+ else {
185
+ throw new Error(`No authentication tokens found for profile "${profile.name}".\n\n` +
186
+ `For CI/CD environments, set these environment variables:\n` +
187
+ ` SEMBIX_CLIENT_ID=<your-m2m-client-id>\n` +
188
+ ` SEMBIX_CLIENT_SECRET=<your-m2m-client-secret>\n\n` +
189
+ `For interactive environments, run: sembix login --profile ${profile.name}`);
190
+ }
191
+ }
192
+ // Validate token expiry
193
+ if (!isTokenValid(tokens)) {
194
+ // Try to refresh if we have a refresh token
195
+ if (tokens.refreshToken) {
196
+ try {
197
+ const authService = new CognitoAuthService(profile);
198
+ tokens = await authService.refreshTokens(tokens.refreshToken);
199
+ await saveTokens(profile.name, tokens);
200
+ return { profile, tokens };
201
+ }
202
+ catch {
203
+ // Refresh failed - need to re-authenticate
204
+ throw new Error(`Authentication tokens for profile "${profile.name}" have expired and could not be refreshed.\n\n` +
205
+ `Run: sembix login --profile ${profile.name}`);
206
+ }
207
+ }
208
+ throw new Error(`Authentication tokens for profile "${profile.name}" have expired.\n\n` +
209
+ `Run: sembix login --profile ${profile.name}`);
210
+ }
211
+ return { profile, tokens };
212
+ }
213
+ //# sourceMappingURL=studio-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-config.js","sourceRoot":"","sources":["../../src/utils/studio-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,0DAA0D;AAC1D,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EAGd,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,0BAA0B;AAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAExD;;GAEG;AACH,KAAK,UAAU,qBAAqB;IAClC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAwB;IAC5E,MAAM,qBAAqB,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,iEAAiE;QACjE,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAC/B,OAAO,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,OAAO,KAAK;aACT,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACtC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAoB;IACzD,sDAAsD;IACtD,MAAM,aAAa,GAAG,WAAW,IAAI,MAAM,iBAAiB,EAAE,CAAC;IAE/D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,YAAY,aAAa,mEAAmE,CAC7F,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,WAAoB;IAIhE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEpD,mDAAmD;IACnD,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAiB,CAAC;QAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAqB,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,iCAAiC,CAChE,QAAQ,EACR,YAAY,CACb,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;gBACzG,mEAAmE,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,qDAAqD;QACrD,IAAI,aAAa,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,+CAA+C,OAAO,CAAC,IAAI,QAAQ;gBACnE,+BAA+B,OAAO,CAAC,IAAI,EAAE,CAC9C,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,+CAA+C,OAAO,CAAC,IAAI,QAAQ;gBACnE,4DAA4D;gBAC5D,2CAA2C;gBAC3C,qDAAqD;gBACrD,6DAA6D,OAAO,CAAC,IAAI,EAAE,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,4CAA4C;QAC5C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACpD,MAAM,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC9D,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACvC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;gBAC3C,MAAM,IAAI,KAAK,CACb,sCAAsC,OAAO,CAAC,IAAI,gDAAgD;oBAClG,+BAA+B,OAAO,CAAC,IAAI,EAAE,CAC9C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CACb,sCAAsC,OAAO,CAAC,IAAI,qBAAqB;YACvE,+BAA+B,OAAO,CAAC,IAAI,EAAE,CAC9C,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { saveTokens, loadTokens, deleteTokens, isTokenValid, listTokenProfiles, getTokenInfo } from './studio-config.js';
2
+ export type { StudioAuthTokens } from '../types.js';
3
+ export type { StudioProfile } from './config-file.js';
4
+ //# sourceMappingURL=token-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/utils/token-manager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACb,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Re-export token management functions from studio-config
2
+ export { saveTokens, loadTokens, deleteTokens, isTokenValid, listTokenProfiles, getTokenInfo } from './studio-config.js';
3
+ //# sourceMappingURL=token-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/utils/token-manager.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACb,MAAM,oBAAoB,CAAC"}
@@ -2,7 +2,14 @@ import { Ora } from 'ora';
2
2
  /**
3
3
  * UI utilities for consistent terminal output
4
4
  */
5
- export declare function banner(): void;
5
+ /**
6
+ * Check if the CLI is running in quiet mode (JSON/PRETTY output).
7
+ * In quiet mode, UI elements like banners and spinners should be suppressed.
8
+ *
9
+ * @returns true if quiet mode (default), false if TEXT mode
10
+ */
11
+ export declare function isQuietMode(): boolean;
12
+ export declare function banner(title?: string): void;
6
13
  export declare function section(title: string): void;
7
14
  export declare function success(message: string): void;
8
15
  export declare function error(message: string): void;
@@ -15,4 +22,51 @@ export declare function link(url: string, label?: string): string;
15
22
  export declare function highlight(text: string): string;
16
23
  export declare function dim(text: string): string;
17
24
  export declare function code(text: string): string;
25
+ /**
26
+ * Clear the terminal screen for watch mode updates
27
+ */
28
+ export declare function clearScreen(): void;
29
+ /**
30
+ * Clear from cursor position to end of screen
31
+ * This allows keeping header stable while refreshing content below
32
+ */
33
+ export declare function clearFromCursorDown(): void;
34
+ /**
35
+ * Move cursor up N lines
36
+ */
37
+ export declare function moveCursorUp(lines: number): void;
38
+ /**
39
+ * Save current cursor position
40
+ */
41
+ export declare function saveCursorPosition(): void;
42
+ /**
43
+ * Restore saved cursor position
44
+ */
45
+ export declare function restoreCursorPosition(): void;
46
+ /**
47
+ * Hide cursor (prevents flicker during updates)
48
+ */
49
+ export declare function hideCursor(): void;
50
+ /**
51
+ * Show cursor
52
+ */
53
+ export declare function showCursor(): void;
54
+ /**
55
+ * Highlight a value that has changed (for watch mode change detection)
56
+ */
57
+ export declare function changed(value: string): string;
58
+ /**
59
+ * Truncate text for watch mode display
60
+ * @param text - Text to truncate
61
+ * @param maxLength - Maximum length before truncation (default: 300)
62
+ * @returns Truncated text with indicator if truncated
63
+ */
64
+ export declare function truncateForWatch(text: string, maxLength?: number): string;
65
+ /**
66
+ * Truncate and format object/value for watch mode display
67
+ * @param value - Value to format (string, object, etc.)
68
+ * @param maxLength - Maximum length for strings
69
+ * @returns Formatted string suitable for watch mode
70
+ */
71
+ export declare function formatValueForWatch(value: any, maxLength?: number): string;
18
72
  //# sourceMappingURL=ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B;;GAEG;AAEH,wBAAgB,MAAM,IAAI,IAAI,CAQ7B;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAKzC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CASxD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,OAAO,CASrC;AAED,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAoB3C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAK3C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG7C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ3C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG7C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG1C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAoBzC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAUxD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAGhC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAQ9E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAqB/E"}