workos 0.7.3 → 0.8.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 (146) hide show
  1. package/README.md +353 -8
  2. package/dist/bin.js +938 -128
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/api-key-mgmt.d.ts +16 -0
  5. package/dist/commands/api-key-mgmt.js +96 -0
  6. package/dist/commands/api-key-mgmt.js.map +1 -0
  7. package/dist/commands/audit-log.d.ts +26 -0
  8. package/dist/commands/audit-log.js +155 -0
  9. package/dist/commands/audit-log.js.map +1 -0
  10. package/dist/commands/config.d.ts +3 -0
  11. package/dist/commands/config.js +54 -0
  12. package/dist/commands/config.js.map +1 -0
  13. package/dist/commands/connection.d.ts +13 -0
  14. package/dist/commands/connection.js +94 -0
  15. package/dist/commands/connection.js.map +1 -0
  16. package/dist/commands/debug-sso.d.ts +1 -0
  17. package/dist/commands/debug-sso.js +78 -0
  18. package/dist/commands/debug-sso.js.map +1 -0
  19. package/dist/commands/debug-sync.d.ts +1 -0
  20. package/dist/commands/debug-sync.js +102 -0
  21. package/dist/commands/debug-sync.js.map +1 -0
  22. package/dist/commands/directory.d.ts +27 -0
  23. package/dist/commands/directory.js +174 -0
  24. package/dist/commands/directory.js.map +1 -0
  25. package/dist/commands/env.js +41 -28
  26. package/dist/commands/env.js.map +1 -1
  27. package/dist/commands/event.d.ts +9 -0
  28. package/dist/commands/event.js +43 -0
  29. package/dist/commands/event.js.map +1 -0
  30. package/dist/commands/feature-flag.d.ts +12 -0
  31. package/dist/commands/feature-flag.js +96 -0
  32. package/dist/commands/feature-flag.js.map +1 -0
  33. package/dist/commands/install.js +13 -20
  34. package/dist/commands/install.js.map +1 -1
  35. package/dist/commands/invitation.d.ts +19 -0
  36. package/dist/commands/invitation.js +94 -0
  37. package/dist/commands/invitation.js.map +1 -0
  38. package/dist/commands/membership.d.ts +20 -0
  39. package/dist/commands/membership.js +129 -0
  40. package/dist/commands/membership.js.map +1 -0
  41. package/dist/commands/onboard-user.d.ts +7 -0
  42. package/dist/commands/onboard-user.js +61 -0
  43. package/dist/commands/onboard-user.js.map +1 -0
  44. package/dist/commands/org-domain.d.ts +4 -0
  45. package/dist/commands/org-domain.js +45 -0
  46. package/dist/commands/org-domain.js.map +1 -0
  47. package/dist/commands/organization.d.ts +1 -5
  48. package/dist/commands/organization.js +34 -73
  49. package/dist/commands/organization.js.map +1 -1
  50. package/dist/commands/permission.d.ts +20 -0
  51. package/dist/commands/permission.js +93 -0
  52. package/dist/commands/permission.js.map +1 -0
  53. package/dist/commands/portal.d.ts +7 -0
  54. package/dist/commands/portal.js +26 -0
  55. package/dist/commands/portal.js.map +1 -0
  56. package/dist/commands/role.d.ts +17 -0
  57. package/dist/commands/role.js +122 -0
  58. package/dist/commands/role.js.map +1 -0
  59. package/dist/commands/seed.d.ts +4 -0
  60. package/dist/commands/seed.js +238 -0
  61. package/dist/commands/seed.js.map +1 -0
  62. package/dist/commands/session.d.ts +8 -0
  63. package/dist/commands/session.js +63 -0
  64. package/dist/commands/session.js.map +1 -0
  65. package/dist/commands/setup-org.d.ts +6 -0
  66. package/dist/commands/setup-org.js +99 -0
  67. package/dist/commands/setup-org.js.map +1 -0
  68. package/dist/commands/user.js +35 -71
  69. package/dist/commands/user.js.map +1 -1
  70. package/dist/commands/vault.d.ts +24 -0
  71. package/dist/commands/vault.js +120 -0
  72. package/dist/commands/vault.js.map +1 -0
  73. package/dist/commands/webhook.d.ts +3 -0
  74. package/dist/commands/webhook.js +73 -0
  75. package/dist/commands/webhook.js.map +1 -0
  76. package/dist/dashboard/components/DiffPanel.js.map +1 -1
  77. package/dist/dashboard/lib/logo-frames.js +1 -1
  78. package/dist/dashboard/lib/logo-frames.js.map +1 -1
  79. package/dist/doctor/checks/dashboard.js.map +1 -1
  80. package/dist/doctor/checks/environment.js.map +1 -1
  81. package/dist/integrations/go/index.js +1 -3
  82. package/dist/integrations/go/index.js.map +1 -1
  83. package/dist/lib/adapters/headless-adapter.d.ts +67 -0
  84. package/dist/lib/adapters/headless-adapter.js +263 -0
  85. package/dist/lib/adapters/headless-adapter.js.map +1 -0
  86. package/dist/lib/adapters/index.d.ts +1 -0
  87. package/dist/lib/adapters/index.js +1 -0
  88. package/dist/lib/adapters/index.js.map +1 -1
  89. package/dist/lib/agent-interface.d.ts +3 -11
  90. package/dist/lib/agent-interface.js +1 -13
  91. package/dist/lib/agent-interface.js.map +1 -1
  92. package/dist/lib/api-error-handler.d.ts +6 -0
  93. package/dist/lib/api-error-handler.js +58 -0
  94. package/dist/lib/api-error-handler.js.map +1 -0
  95. package/dist/lib/api-key.js +5 -1
  96. package/dist/lib/api-key.js.map +1 -1
  97. package/dist/lib/config.js.map +1 -1
  98. package/dist/lib/credential-proxy.js +0 -6
  99. package/dist/lib/credential-proxy.js.map +1 -1
  100. package/dist/lib/device-auth.js +1 -1
  101. package/dist/lib/device-auth.js.map +1 -1
  102. package/dist/lib/ensure-auth.js +25 -4
  103. package/dist/lib/ensure-auth.js.map +1 -1
  104. package/dist/lib/installer-core.d.ts +12 -12
  105. package/dist/lib/run-with-core.js +25 -4
  106. package/dist/lib/run-with-core.js.map +1 -1
  107. package/dist/lib/validation/validator.js +0 -1
  108. package/dist/lib/validation/validator.js.map +1 -1
  109. package/dist/lib/workos-client.d.ts +58 -0
  110. package/dist/lib/workos-client.js +137 -0
  111. package/dist/lib/workos-client.js.map +1 -0
  112. package/dist/run.d.ts +7 -0
  113. package/dist/run.js +5 -2
  114. package/dist/run.js.map +1 -1
  115. package/dist/smoke-test.ts +881 -0
  116. package/dist/steps/run-prettier.js +1 -1
  117. package/dist/steps/run-prettier.js.map +1 -1
  118. package/dist/utils/analytics.d.ts +1 -1
  119. package/dist/utils/analytics.js.map +1 -1
  120. package/dist/utils/clack-utils.js +1 -1
  121. package/dist/utils/clack-utils.js.map +1 -1
  122. package/dist/utils/environment.js +8 -0
  123. package/dist/utils/environment.js.map +1 -1
  124. package/dist/utils/exit-codes.d.ts +22 -0
  125. package/dist/utils/exit-codes.js +30 -0
  126. package/dist/utils/exit-codes.js.map +1 -0
  127. package/dist/utils/help-json.d.ts +45 -0
  128. package/dist/utils/help-json.js +1161 -0
  129. package/dist/utils/help-json.js.map +1 -0
  130. package/dist/utils/ndjson.d.ts +16 -0
  131. package/dist/utils/ndjson.js +18 -0
  132. package/dist/utils/ndjson.js.map +1 -0
  133. package/dist/utils/output.d.ts +40 -0
  134. package/dist/utils/output.js +95 -0
  135. package/dist/utils/output.js.map +1 -0
  136. package/dist/utils/package-manager.js +2 -3
  137. package/dist/utils/package-manager.js.map +1 -1
  138. package/dist/utils/register-subcommand.d.ts +7 -0
  139. package/dist/utils/register-subcommand.js +36 -0
  140. package/dist/utils/register-subcommand.js.map +1 -0
  141. package/dist/utils/telemetry-types.d.ts +1 -1
  142. package/dist/utils/telemetry-types.js.map +1 -1
  143. package/dist/utils/types.d.ts +12 -0
  144. package/dist/utils/types.js.map +1 -1
  145. package/package.json +20 -16
  146. package/skills/workos-management/SKILL.md +250 -0
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { workosRequest, WorkOSApiError } from '../lib/workos-api.js';\nimport type { WorkOSListResponse } from '../lib/workos-api.js';\nimport { formatTable } from '../utils/table.js';\n\ninterface User {\n id: string;\n email: string;\n first_name: string;\n last_name: string;\n email_verified: boolean;\n created_at: string;\n updated_at: string;\n}\n\nfunction handleApiError(error: unknown): never {\n if (error instanceof WorkOSApiError) {\n if (error.statusCode === 401) {\n console.error(chalk.red('Invalid API key. Check your environment configuration.'));\n } else if (error.statusCode === 404) {\n console.error(chalk.red('User not found.'));\n } else if (error.statusCode === 422 && error.errors?.length) {\n console.error(chalk.red(error.errors.map((e) => e.message).join(', ')));\n } else {\n console.error(chalk.red(error.message));\n }\n } else {\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n }\n process.exit(1);\n}\n\nexport async function runUserGet(userId: string, apiKey: string, baseUrl?: string): Promise<void> {\n try {\n const user = await workosRequest<User>({\n method: 'GET',\n path: `/user_management/users/${userId}`,\n apiKey,\n baseUrl,\n });\n console.log(JSON.stringify(user, null, 2));\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface UserListOptions {\n email?: string;\n organization?: string;\n limit?: number;\n before?: string;\n after?: string;\n order?: string;\n}\n\nexport async function runUserList(options: UserListOptions, apiKey: string, baseUrl?: string): Promise<void> {\n try {\n const result = await workosRequest<WorkOSListResponse<User>>({\n method: 'GET',\n path: '/user_management/users',\n apiKey,\n baseUrl,\n params: {\n email: options.email,\n organization_id: options.organization,\n limit: options.limit,\n before: options.before,\n after: options.after,\n order: options.order,\n },\n });\n\n if (result.data.length === 0) {\n console.log('No users found.');\n return;\n }\n\n const rows = result.data.map((user) => [\n user.id,\n user.email,\n user.first_name || chalk.dim('-'),\n user.last_name || chalk.dim('-'),\n user.email_verified ? 'Yes' : 'No',\n ]);\n\n console.log(\n formatTable(\n [\n { header: 'ID' },\n { header: 'Email' },\n { header: 'First Name' },\n { header: 'Last Name' },\n { header: 'Verified' },\n ],\n rows,\n ),\n );\n\n const { before, after } = result.list_metadata;\n if (before && after) {\n console.log(chalk.dim(`Before: ${before} After: ${after}`));\n } else if (before) {\n console.log(chalk.dim(`Before: ${before}`));\n } else if (after) {\n console.log(chalk.dim(`After: ${after}`));\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface UserUpdateOptions {\n firstName?: string;\n lastName?: string;\n emailVerified?: boolean;\n password?: string;\n externalId?: string;\n}\n\nexport async function runUserUpdate(\n userId: string,\n apiKey: string,\n options: UserUpdateOptions,\n baseUrl?: string,\n): Promise<void> {\n const body: Record<string, unknown> = {};\n if (options.firstName !== undefined) body.first_name = options.firstName;\n if (options.lastName !== undefined) body.last_name = options.lastName;\n if (options.emailVerified !== undefined) body.email_verified = options.emailVerified;\n if (options.password !== undefined) body.password = options.password;\n if (options.externalId !== undefined) body.external_id = options.externalId;\n\n try {\n const user = await workosRequest<User>({\n method: 'PUT',\n path: `/user_management/users/${userId}`,\n apiKey,\n baseUrl,\n body,\n });\n console.log(chalk.green('Updated user'));\n console.log(JSON.stringify(user, null, 2));\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runUserDelete(userId: string, apiKey: string, baseUrl?: string): Promise<void> {\n try {\n await workosRequest({\n method: 'DELETE',\n path: `/user_management/users/${userId}`,\n apiKey,\n baseUrl,\n });\n console.log(chalk.green(`Deleted user ${userId}`));\n } catch (error) {\n handleApiError(error);\n }\n}\n"]}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { createWorkOSClient } from '../lib/workos-client.js';\nimport { formatTable } from '../utils/table.js';\nimport { outputSuccess, outputJson, isJsonMode } from '../utils/output.js';\nimport { createApiErrorHandler } from '../lib/api-error-handler.js';\n\nconst handleApiError = createApiErrorHandler('User');\n\nexport async function runUserGet(userId: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const user = await client.sdk.userManagement.getUser(userId);\n outputJson(user);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface UserListOptions {\n email?: string;\n organization?: string;\n limit?: number;\n before?: string;\n after?: string;\n order?: string;\n}\n\nexport async function runUserList(options: UserListOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.userManagement.listUsers({\n email: options.email,\n organizationId: options.organization,\n limit: options.limit,\n before: options.before,\n after: options.after,\n order: options.order as 'asc' | 'desc' | undefined,\n });\n\n if (isJsonMode()) {\n outputJson({ data: result.data, listMetadata: result.listMetadata });\n return;\n }\n\n if (result.data.length === 0) {\n console.log('No users found.');\n return;\n }\n\n const rows = result.data.map((user) => [\n user.id,\n user.email,\n user.firstName || chalk.dim('-'),\n user.lastName || chalk.dim('-'),\n user.emailVerified ? 'Yes' : 'No',\n ]);\n\n console.log(\n formatTable(\n [\n { header: 'ID' },\n { header: 'Email' },\n { header: 'First Name' },\n { header: 'Last Name' },\n { header: 'Verified' },\n ],\n rows,\n ),\n );\n\n const { before, after } = result.listMetadata;\n if (before && after) {\n console.log(chalk.dim(`Before: ${before} After: ${after}`));\n } else if (before) {\n console.log(chalk.dim(`Before: ${before}`));\n } else if (after) {\n console.log(chalk.dim(`After: ${after}`));\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface UserUpdateOptions {\n firstName?: string;\n lastName?: string;\n emailVerified?: boolean;\n password?: string;\n externalId?: string;\n}\n\nexport async function runUserUpdate(\n userId: string,\n apiKey: string,\n options: UserUpdateOptions,\n baseUrl?: string,\n): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const user = await client.sdk.userManagement.updateUser({\n userId,\n ...(options.firstName !== undefined && { firstName: options.firstName }),\n ...(options.lastName !== undefined && { lastName: options.lastName }),\n ...(options.emailVerified !== undefined && { emailVerified: options.emailVerified }),\n ...(options.password !== undefined && { password: options.password }),\n ...(options.externalId !== undefined && { externalId: options.externalId }),\n });\n outputSuccess('Updated user', user);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runUserDelete(userId: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n await client.sdk.userManagement.deleteUser(userId);\n outputSuccess('Deleted user', { id: userId });\n } catch (error) {\n handleApiError(error);\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ export interface VaultListOptions {
2
+ limit?: number;
3
+ before?: string;
4
+ after?: string;
5
+ order?: string;
6
+ }
7
+ export declare function runVaultList(options: VaultListOptions, apiKey: string, baseUrl?: string): Promise<void>;
8
+ export declare function runVaultGet(id: string, apiKey: string, baseUrl?: string): Promise<void>;
9
+ export declare function runVaultGetByName(name: string, apiKey: string, baseUrl?: string): Promise<void>;
10
+ export interface VaultCreateOptions {
11
+ name: string;
12
+ value: string;
13
+ org?: string;
14
+ }
15
+ export declare function runVaultCreate(options: VaultCreateOptions, apiKey: string, baseUrl?: string): Promise<void>;
16
+ export interface VaultUpdateOptions {
17
+ id: string;
18
+ value: string;
19
+ versionCheck?: string;
20
+ }
21
+ export declare function runVaultUpdate(options: VaultUpdateOptions, apiKey: string, baseUrl?: string): Promise<void>;
22
+ export declare function runVaultDelete(id: string, apiKey: string, baseUrl?: string): Promise<void>;
23
+ export declare function runVaultDescribe(id: string, apiKey: string, baseUrl?: string): Promise<void>;
24
+ export declare function runVaultListVersions(id: string, apiKey: string, baseUrl?: string): Promise<void>;
@@ -0,0 +1,120 @@
1
+ import chalk from 'chalk';
2
+ import { createWorkOSClient } from '../lib/workos-client.js';
3
+ import { formatTable } from '../utils/table.js';
4
+ import { outputSuccess, outputJson, isJsonMode } from '../utils/output.js';
5
+ import { createApiErrorHandler } from '../lib/api-error-handler.js';
6
+ const handleApiError = createApiErrorHandler('Vault');
7
+ export async function runVaultList(options, apiKey, baseUrl) {
8
+ const client = createWorkOSClient(apiKey, baseUrl);
9
+ try {
10
+ const result = await client.sdk.vault.listObjects({
11
+ limit: options.limit,
12
+ before: options.before,
13
+ after: options.after,
14
+ order: options.order,
15
+ });
16
+ if (isJsonMode()) {
17
+ outputJson({ data: result.data, listMetadata: result.listMetadata });
18
+ return;
19
+ }
20
+ if (result.data.length === 0) {
21
+ console.log('No vault objects found.');
22
+ return;
23
+ }
24
+ const rows = result.data.map((obj) => [obj.id, obj.name, obj.updatedAt ? String(obj.updatedAt) : chalk.dim('-')]);
25
+ console.log(formatTable([{ header: 'ID' }, { header: 'Name' }, { header: 'Updated At' }], rows));
26
+ const { before, after } = result.listMetadata;
27
+ if (before && after) {
28
+ console.log(chalk.dim(`Before: ${before} After: ${after}`));
29
+ }
30
+ else if (before) {
31
+ console.log(chalk.dim(`Before: ${before}`));
32
+ }
33
+ else if (after) {
34
+ console.log(chalk.dim(`After: ${after}`));
35
+ }
36
+ }
37
+ catch (error) {
38
+ handleApiError(error);
39
+ }
40
+ }
41
+ export async function runVaultGet(id, apiKey, baseUrl) {
42
+ const client = createWorkOSClient(apiKey, baseUrl);
43
+ try {
44
+ const result = await client.sdk.vault.readObject({ id });
45
+ outputJson(result);
46
+ }
47
+ catch (error) {
48
+ handleApiError(error);
49
+ }
50
+ }
51
+ export async function runVaultGetByName(name, apiKey, baseUrl) {
52
+ const client = createWorkOSClient(apiKey, baseUrl);
53
+ try {
54
+ const result = await client.sdk.vault.readObjectByName(name);
55
+ outputJson(result);
56
+ }
57
+ catch (error) {
58
+ handleApiError(error);
59
+ }
60
+ }
61
+ export async function runVaultCreate(options, apiKey, baseUrl) {
62
+ const client = createWorkOSClient(apiKey, baseUrl);
63
+ try {
64
+ const context = options.org ? { organizationId: options.org } : {};
65
+ const result = await client.sdk.vault.createObject({
66
+ name: options.name,
67
+ value: options.value,
68
+ context,
69
+ });
70
+ outputSuccess('Created vault object', result);
71
+ }
72
+ catch (error) {
73
+ handleApiError(error);
74
+ }
75
+ }
76
+ export async function runVaultUpdate(options, apiKey, baseUrl) {
77
+ const client = createWorkOSClient(apiKey, baseUrl);
78
+ try {
79
+ const result = await client.sdk.vault.updateObject({
80
+ id: options.id,
81
+ value: options.value,
82
+ ...(options.versionCheck && { versionCheck: options.versionCheck }),
83
+ });
84
+ outputSuccess('Updated vault object', result);
85
+ }
86
+ catch (error) {
87
+ handleApiError(error);
88
+ }
89
+ }
90
+ export async function runVaultDelete(id, apiKey, baseUrl) {
91
+ const client = createWorkOSClient(apiKey, baseUrl);
92
+ try {
93
+ await client.sdk.vault.deleteObject({ id });
94
+ outputSuccess('Deleted vault object', { id });
95
+ }
96
+ catch (error) {
97
+ handleApiError(error);
98
+ }
99
+ }
100
+ export async function runVaultDescribe(id, apiKey, baseUrl) {
101
+ const client = createWorkOSClient(apiKey, baseUrl);
102
+ try {
103
+ const result = await client.sdk.vault.describeObject({ id });
104
+ outputJson(result);
105
+ }
106
+ catch (error) {
107
+ handleApiError(error);
108
+ }
109
+ }
110
+ export async function runVaultListVersions(id, apiKey, baseUrl) {
111
+ const client = createWorkOSClient(apiKey, baseUrl);
112
+ try {
113
+ const result = await client.sdk.vault.listObjectVersions({ id });
114
+ outputJson(result);
115
+ }
116
+ catch (error) {
117
+ handleApiError(error);
118
+ }
119
+ }
120
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { createWorkOSClient } from '../lib/workos-client.js';\nimport { formatTable } from '../utils/table.js';\nimport { outputSuccess, outputJson, isJsonMode } from '../utils/output.js';\nimport { createApiErrorHandler } from '../lib/api-error-handler.js';\n\nconst handleApiError = createApiErrorHandler('Vault');\n\nexport interface VaultListOptions {\n limit?: number;\n before?: string;\n after?: string;\n order?: string;\n}\n\nexport async function runVaultList(options: VaultListOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.listObjects({\n limit: options.limit,\n before: options.before,\n after: options.after,\n order: options.order as 'asc' | 'desc' | undefined,\n });\n\n if (isJsonMode()) {\n outputJson({ data: result.data, listMetadata: result.listMetadata });\n return;\n }\n\n if (result.data.length === 0) {\n console.log('No vault objects found.');\n return;\n }\n\n const rows = result.data.map((obj) => [obj.id, obj.name, obj.updatedAt ? String(obj.updatedAt) : chalk.dim('-')]);\n\n console.log(formatTable([{ header: 'ID' }, { header: 'Name' }, { header: 'Updated At' }], rows));\n\n const { before, after } = result.listMetadata;\n if (before && after) {\n console.log(chalk.dim(`Before: ${before} After: ${after}`));\n } else if (before) {\n console.log(chalk.dim(`Before: ${before}`));\n } else if (after) {\n console.log(chalk.dim(`After: ${after}`));\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultGet(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.readObject({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultGetByName(name: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.readObjectByName(name);\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface VaultCreateOptions {\n name: string;\n value: string;\n org?: string;\n}\n\nexport async function runVaultCreate(options: VaultCreateOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const context = options.org ? { organizationId: options.org } : {};\n const result = await client.sdk.vault.createObject({\n name: options.name,\n value: options.value,\n context,\n });\n outputSuccess('Created vault object', result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface VaultUpdateOptions {\n id: string;\n value: string;\n versionCheck?: string;\n}\n\nexport async function runVaultUpdate(options: VaultUpdateOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.updateObject({\n id: options.id,\n value: options.value,\n ...(options.versionCheck && { versionCheck: options.versionCheck }),\n });\n outputSuccess('Updated vault object', result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultDelete(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n await client.sdk.vault.deleteObject({ id });\n outputSuccess('Deleted vault object', { id });\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultDescribe(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.describeObject({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultListVersions(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.listObjectVersions({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function runWebhookList(apiKey: string, baseUrl?: string): Promise<void>;
2
+ export declare function runWebhookCreate(url: string, events: string[], apiKey: string, baseUrl?: string): Promise<void>;
3
+ export declare function runWebhookDelete(id: string, apiKey: string, baseUrl?: string): Promise<void>;
@@ -0,0 +1,73 @@
1
+ import chalk from 'chalk';
2
+ import { createWorkOSClient } from '../lib/workos-client.js';
3
+ import { formatTable } from '../utils/table.js';
4
+ import { outputJson, outputSuccess, isJsonMode } from '../utils/output.js';
5
+ import { createApiErrorHandler } from '../lib/api-error-handler.js';
6
+ const handleApiError = createApiErrorHandler('Webhook');
7
+ export async function runWebhookList(apiKey, baseUrl) {
8
+ const client = createWorkOSClient(apiKey, baseUrl);
9
+ try {
10
+ const result = await client.webhooks.list();
11
+ if (isJsonMode()) {
12
+ // Normalize snake_case list_metadata to camelCase for consistent CLI output
13
+ outputJson({
14
+ data: result.data,
15
+ listMetadata: {
16
+ before: result.list_metadata.before,
17
+ after: result.list_metadata.after,
18
+ },
19
+ });
20
+ return;
21
+ }
22
+ if (result.data.length === 0) {
23
+ console.log('No webhook endpoints found.');
24
+ return;
25
+ }
26
+ const rows = result.data.map((ep) => [ep.id, ep.url, ep.events.join(', '), ep.created_at]);
27
+ console.log(formatTable([{ header: 'ID' }, { header: 'URL' }, { header: 'Events' }, { header: 'Created' }], rows));
28
+ const { before, after } = result.list_metadata;
29
+ if (before && after) {
30
+ console.log(chalk.dim(`Before: ${before} After: ${after}`));
31
+ }
32
+ else if (before) {
33
+ console.log(chalk.dim(`Before: ${before}`));
34
+ }
35
+ else if (after) {
36
+ console.log(chalk.dim(`After: ${after}`));
37
+ }
38
+ }
39
+ catch (error) {
40
+ handleApiError(error);
41
+ }
42
+ }
43
+ export async function runWebhookCreate(url, events, apiKey, baseUrl) {
44
+ const client = createWorkOSClient(apiKey, baseUrl);
45
+ try {
46
+ const endpoint = await client.webhooks.create(url, events);
47
+ if (isJsonMode()) {
48
+ outputJson({ status: 'ok', message: 'Created webhook endpoint', data: endpoint });
49
+ return;
50
+ }
51
+ console.log(chalk.green('Created webhook endpoint'));
52
+ console.log(JSON.stringify(endpoint, null, 2));
53
+ if (endpoint.secret) {
54
+ console.log('');
55
+ console.log(chalk.yellow('Signing secret: ') + endpoint.secret);
56
+ console.log(chalk.yellow('Save this secret now — it will not be shown again.'));
57
+ }
58
+ }
59
+ catch (error) {
60
+ handleApiError(error);
61
+ }
62
+ }
63
+ export async function runWebhookDelete(id, apiKey, baseUrl) {
64
+ const client = createWorkOSClient(apiKey, baseUrl);
65
+ try {
66
+ await client.webhooks.delete(id);
67
+ outputSuccess('Deleted webhook endpoint', { id });
68
+ }
69
+ catch (error) {
70
+ handleApiError(error);
71
+ }
72
+ }
73
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { createWorkOSClient } from '../lib/workos-client.js';\nimport { formatTable } from '../utils/table.js';\nimport { outputJson, outputSuccess, isJsonMode } from '../utils/output.js';\nimport { createApiErrorHandler } from '../lib/api-error-handler.js';\n\nconst handleApiError = createApiErrorHandler('Webhook');\n\nexport async function runWebhookList(apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.webhooks.list();\n\n if (isJsonMode()) {\n // Normalize snake_case list_metadata to camelCase for consistent CLI output\n outputJson({\n data: result.data,\n listMetadata: {\n before: result.list_metadata.before,\n after: result.list_metadata.after,\n },\n });\n return;\n }\n\n if (result.data.length === 0) {\n console.log('No webhook endpoints found.');\n return;\n }\n\n const rows = result.data.map((ep) => [ep.id, ep.url, ep.events.join(', '), ep.created_at]);\n\n console.log(formatTable([{ header: 'ID' }, { header: 'URL' }, { header: 'Events' }, { header: 'Created' }], rows));\n\n const { before, after } = result.list_metadata;\n if (before && after) {\n console.log(chalk.dim(`Before: ${before} After: ${after}`));\n } else if (before) {\n console.log(chalk.dim(`Before: ${before}`));\n } else if (after) {\n console.log(chalk.dim(`After: ${after}`));\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runWebhookCreate(url: string, events: string[], apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const endpoint = await client.webhooks.create(url, events);\n\n if (isJsonMode()) {\n outputJson({ status: 'ok', message: 'Created webhook endpoint', data: endpoint });\n return;\n }\n\n console.log(chalk.green('Created webhook endpoint'));\n console.log(JSON.stringify(endpoint, null, 2));\n if (endpoint.secret) {\n console.log('');\n console.log(chalk.yellow('Signing secret: ') + endpoint.secret);\n console.log(chalk.yellow('Save this secret now — it will not be shown again.'));\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runWebhookDelete(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n await client.webhooks.delete(id);\n outputSuccess('Deleted webhook endpoint', { id });\n } catch (error) {\n handleApiError(error);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DiffPanel.js","sourceRoot":"","sources":["../../../src/dashboard/components/DiffPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useMemo, useRef } from 'react';\nimport { Box, Text, useStdout, useInput } from 'ink';\nimport type { InstallerEventEmitter } from '../../lib/events.js';\nimport { WelcomeArt } from './WelcomeArt.js';\nimport {\n computeDiff,\n filterWithContext,\n formatDiffLine,\n getLanguage,\n tokenize,\n type FileDiff,\n type Token,\n type TokenType,\n} from '../lib/diff-utils.js';\n\ninterface DiffPanelProps {\n emitter: InstallerEventEmitter;\n focused?: boolean;\n height?: number;\n}\n\n// Color mapping for syntax tokens\nconst TOKEN_COLORS: Record<TokenType, string | undefined> = {\n keyword: 'magenta',\n string: 'yellow',\n comment: 'gray',\n number: 'cyan',\n function: 'blue',\n type: 'green',\n operator: 'white',\n punctuation: 'gray',\n plain: undefined,\n};\n\n// Render a line with syntax highlighting\nfunction HighlightedLine({\n content,\n language,\n prefix,\n dimmed,\n}: {\n content: string;\n language: string;\n prefix: string;\n dimmed?: boolean;\n}): React.ReactElement {\n const tokens = tokenize(content, language);\n\n return (\n <Text dimColor={dimmed}>\n {prefix}\n {tokens.map((token, i) => (\n <Text key={i} color={dimmed ? undefined : TOKEN_COLORS[token.type]}>\n {token.value}\n </Text>\n ))}\n </Text>\n );\n}\n\nexport function DiffPanel({ emitter, focused = true, height }: DiffPanelProps): React.ReactElement {\n const [diffs, setDiffs] = useState<FileDiff[]>([]);\n const [scrollOffset, setScrollOffset] = useState(0);\n const lastKeyRef = useRef<string>('');\n const { stdout } = useStdout();\n // Use provided height or fall back to calculated height\n const visibleLines = height ?? Math.floor((stdout?.rows || 24) * 0.55) - 4;\n\n useEffect(() => {\n const handleWrite = ({ path, content }: { path: string; content: string }) => {\n const diff = computeDiff(path, null, content);\n setDiffs((prev) => [diff, ...prev].slice(0, 10));\n setScrollOffset(0);\n };\n\n const handleEdit = ({ path, oldContent, newContent }: { path: string; oldContent: string; newContent: string }) => {\n const diff = computeDiff(path, oldContent, newContent);\n setDiffs((prev) => [diff, ...prev].slice(0, 10));\n setScrollOffset(0);\n };\n\n emitter.on('file:write', handleWrite);\n emitter.on('file:edit', handleEdit);\n\n return () => {\n emitter.off('file:write', handleWrite);\n emitter.off('file:edit', handleEdit);\n };\n }, [emitter]);\n\n // Flatten all diffs for display with language info\n const allLines = useMemo(() => {\n const lines: Array<{\n type: 'header' | 'add' | 'remove' | 'unchanged';\n content: string;\n language: string;\n }> = [];\n\n for (const diff of diffs) {\n const language = getLanguage(diff.path);\n lines.push({\n type: 'header',\n content: `── ${diff.path} ${diff.isNew ? '(new file)' : '(modified)'} ──`,\n language: 'plain',\n });\n\n const filteredChanges = filterWithContext(diff.changes, 3);\n for (const change of filteredChanges) {\n lines.push({\n type: change.type,\n content: formatDiffLine(change),\n language,\n });\n }\n\n lines.push({ type: 'unchanged', content: '', language: 'plain' });\n }\n\n return lines;\n }, [diffs]);\n\n // Vim-style keyboard navigation (only when focused)\n useInput((input, key) => {\n if (!focused || diffs.length === 0) return;\n\n const maxOffset = Math.max(0, allLines.length - visibleLines);\n const halfPage = Math.floor(visibleLines / 2);\n\n // j/k or arrow keys for line-by-line\n if (input === 'j' || key.downArrow) {\n setScrollOffset((prev) => Math.min(maxOffset, prev + 1));\n } else if (input === 'k' || key.upArrow) {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n }\n // Ctrl-d / Ctrl-u for half-page\n else if (key.ctrl && input === 'd') {\n setScrollOffset((prev) => Math.min(maxOffset, prev + halfPage));\n } else if (key.ctrl && input === 'u') {\n setScrollOffset((prev) => Math.max(0, prev - halfPage));\n }\n // G for bottom, gg for top\n else if (input === 'G') {\n setScrollOffset(maxOffset);\n } else if (input === 'g') {\n if (lastKeyRef.current === 'g') {\n setScrollOffset(0);\n lastKeyRef.current = '';\n } else {\n lastKeyRef.current = 'g';\n setTimeout(() => {\n lastKeyRef.current = '';\n }, 500);\n }\n }\n });\n\n // Show welcome art if no diffs yet\n if (diffs.length === 0) {\n return <WelcomeArt />;\n }\n\n // Reserve 1 line for scroll indicator if needed\n const hasScroll = allLines.length > visibleLines - 1;\n const contentLines = hasScroll ? visibleLines - 1 : visibleLines;\n const displayLines = allLines.slice(scrollOffset, scrollOffset + contentLines);\n const maxOffset = Math.max(0, allLines.length - contentLines);\n\n // Calculate scrollbar position\n const scrollbarHeight = Math.max(1, Math.floor((contentLines / allLines.length) * contentLines));\n const scrollbarPosition =\n maxOffset > 0 ? Math.floor((scrollOffset / maxOffset) * (contentLines - scrollbarHeight)) : 0;\n\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayLines.map((line, i) => {\n if (line.type === 'header') {\n return (\n <Text key={i} color=\"cyan\" bold>\n {line.content}\n </Text>\n );\n }\n\n // Extract the prefix (+ - or space) and the actual content\n const prefix = line.content.slice(0, 2);\n const codeContent = line.content.slice(2);\n\n if (line.type === 'add') {\n return (\n <Box key={i}>\n <Text color=\"green\" bold>\n {prefix}\n </Text>\n <HighlightedLine content={codeContent} language={line.language} prefix=\"\" dimmed={false} />\n </Box>\n );\n }\n\n if (line.type === 'remove') {\n return (\n <Box key={i}>\n <Text color=\"red\" bold>\n {prefix}\n </Text>\n <HighlightedLine content={codeContent} language={line.language} prefix=\"\" dimmed={false} />\n </Box>\n );\n }\n\n // Unchanged lines - dimmed with syntax highlighting\n return (\n <HighlightedLine key={i} content={codeContent} language={line.language} prefix={prefix} dimmed={true} />\n );\n })}\n {hasScroll && (\n <Text dimColor>\n [{scrollOffset + 1}-{Math.min(scrollOffset + contentLines, allLines.length)}/{allLines.length}]\n </Text>\n )}\n </Box>\n {hasScroll && (\n <Box flexDirection=\"column\" width={1}>\n {Array.from({ length: contentLines }).map((_, i) => (\n <Text key={i} color={i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? 'cyan' : 'gray'}>\n {i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? '█' : '░'}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n"]}
1
+ {"version":3,"file":"DiffPanel.js","sourceRoot":"","sources":["../../../src/dashboard/components/DiffPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect, useMemo, useRef } from 'react';\nimport { Box, Text, useStdout, useInput } from 'ink';\nimport type { InstallerEventEmitter } from '../../lib/events.js';\nimport { WelcomeArt } from './WelcomeArt.js';\nimport {\n computeDiff,\n filterWithContext,\n formatDiffLine,\n getLanguage,\n tokenize,\n type FileDiff,\n type TokenType,\n} from '../lib/diff-utils.js';\n\ninterface DiffPanelProps {\n emitter: InstallerEventEmitter;\n focused?: boolean;\n height?: number;\n}\n\n// Color mapping for syntax tokens\nconst TOKEN_COLORS: Record<TokenType, string | undefined> = {\n keyword: 'magenta',\n string: 'yellow',\n comment: 'gray',\n number: 'cyan',\n function: 'blue',\n type: 'green',\n operator: 'white',\n punctuation: 'gray',\n plain: undefined,\n};\n\n// Render a line with syntax highlighting\nfunction HighlightedLine({\n content,\n language,\n prefix,\n dimmed,\n}: {\n content: string;\n language: string;\n prefix: string;\n dimmed?: boolean;\n}): React.ReactElement {\n const tokens = tokenize(content, language);\n\n return (\n <Text dimColor={dimmed}>\n {prefix}\n {tokens.map((token, i) => (\n <Text key={i} color={dimmed ? undefined : TOKEN_COLORS[token.type]}>\n {token.value}\n </Text>\n ))}\n </Text>\n );\n}\n\nexport function DiffPanel({ emitter, focused = true, height }: DiffPanelProps): React.ReactElement {\n const [diffs, setDiffs] = useState<FileDiff[]>([]);\n const [scrollOffset, setScrollOffset] = useState(0);\n const lastKeyRef = useRef<string>('');\n const { stdout } = useStdout();\n // Use provided height or fall back to calculated height\n const visibleLines = height ?? Math.floor((stdout?.rows || 24) * 0.55) - 4;\n\n useEffect(() => {\n const handleWrite = ({ path, content }: { path: string; content: string }) => {\n const diff = computeDiff(path, null, content);\n setDiffs((prev) => [diff, ...prev].slice(0, 10));\n setScrollOffset(0);\n };\n\n const handleEdit = ({ path, oldContent, newContent }: { path: string; oldContent: string; newContent: string }) => {\n const diff = computeDiff(path, oldContent, newContent);\n setDiffs((prev) => [diff, ...prev].slice(0, 10));\n setScrollOffset(0);\n };\n\n emitter.on('file:write', handleWrite);\n emitter.on('file:edit', handleEdit);\n\n return () => {\n emitter.off('file:write', handleWrite);\n emitter.off('file:edit', handleEdit);\n };\n }, [emitter]);\n\n // Flatten all diffs for display with language info\n const allLines = useMemo(() => {\n const lines: Array<{\n type: 'header' | 'add' | 'remove' | 'unchanged';\n content: string;\n language: string;\n }> = [];\n\n for (const diff of diffs) {\n const language = getLanguage(diff.path);\n lines.push({\n type: 'header',\n content: `── ${diff.path} ${diff.isNew ? '(new file)' : '(modified)'} ──`,\n language: 'plain',\n });\n\n const filteredChanges = filterWithContext(diff.changes, 3);\n for (const change of filteredChanges) {\n lines.push({\n type: change.type,\n content: formatDiffLine(change),\n language,\n });\n }\n\n lines.push({ type: 'unchanged', content: '', language: 'plain' });\n }\n\n return lines;\n }, [diffs]);\n\n // Vim-style keyboard navigation (only when focused)\n useInput((input, key) => {\n if (!focused || diffs.length === 0) return;\n\n const maxOffset = Math.max(0, allLines.length - visibleLines);\n const halfPage = Math.floor(visibleLines / 2);\n\n // j/k or arrow keys for line-by-line\n if (input === 'j' || key.downArrow) {\n setScrollOffset((prev) => Math.min(maxOffset, prev + 1));\n } else if (input === 'k' || key.upArrow) {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n }\n // Ctrl-d / Ctrl-u for half-page\n else if (key.ctrl && input === 'd') {\n setScrollOffset((prev) => Math.min(maxOffset, prev + halfPage));\n } else if (key.ctrl && input === 'u') {\n setScrollOffset((prev) => Math.max(0, prev - halfPage));\n }\n // G for bottom, gg for top\n else if (input === 'G') {\n setScrollOffset(maxOffset);\n } else if (input === 'g') {\n if (lastKeyRef.current === 'g') {\n setScrollOffset(0);\n lastKeyRef.current = '';\n } else {\n lastKeyRef.current = 'g';\n setTimeout(() => {\n lastKeyRef.current = '';\n }, 500);\n }\n }\n });\n\n // Show welcome art if no diffs yet\n if (diffs.length === 0) {\n return <WelcomeArt />;\n }\n\n // Reserve 1 line for scroll indicator if needed\n const hasScroll = allLines.length > visibleLines - 1;\n const contentLines = hasScroll ? visibleLines - 1 : visibleLines;\n const displayLines = allLines.slice(scrollOffset, scrollOffset + contentLines);\n const maxOffset = Math.max(0, allLines.length - contentLines);\n\n // Calculate scrollbar position\n const scrollbarHeight = Math.max(1, Math.floor((contentLines / allLines.length) * contentLines));\n const scrollbarPosition =\n maxOffset > 0 ? Math.floor((scrollOffset / maxOffset) * (contentLines - scrollbarHeight)) : 0;\n\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box flexDirection=\"column\" flexGrow={1}>\n {displayLines.map((line, i) => {\n if (line.type === 'header') {\n return (\n <Text key={i} color=\"cyan\" bold>\n {line.content}\n </Text>\n );\n }\n\n // Extract the prefix (+ - or space) and the actual content\n const prefix = line.content.slice(0, 2);\n const codeContent = line.content.slice(2);\n\n if (line.type === 'add') {\n return (\n <Box key={i}>\n <Text color=\"green\" bold>\n {prefix}\n </Text>\n <HighlightedLine content={codeContent} language={line.language} prefix=\"\" dimmed={false} />\n </Box>\n );\n }\n\n if (line.type === 'remove') {\n return (\n <Box key={i}>\n <Text color=\"red\" bold>\n {prefix}\n </Text>\n <HighlightedLine content={codeContent} language={line.language} prefix=\"\" dimmed={false} />\n </Box>\n );\n }\n\n // Unchanged lines - dimmed with syntax highlighting\n return (\n <HighlightedLine key={i} content={codeContent} language={line.language} prefix={prefix} dimmed={true} />\n );\n })}\n {hasScroll && (\n <Text dimColor>\n [{scrollOffset + 1}-{Math.min(scrollOffset + contentLines, allLines.length)}/{allLines.length}]\n </Text>\n )}\n </Box>\n {hasScroll && (\n <Box flexDirection=\"column\" width={1}>\n {Array.from({ length: contentLines }).map((_, i) => (\n <Text key={i} color={i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? 'cyan' : 'gray'}>\n {i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight ? '█' : '░'}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n"]}
@@ -45,7 +45,7 @@ export function generateSpinFrames() {
45
45
  // Project characters
46
46
  const projectedLines = LOGO_SMALL.map((line) => {
47
47
  const centerX = line.length / 2;
48
- const outChars = new Array(line.length).fill(' ');
48
+ const outChars = Array.from({ length: line.length }, () => ' ');
49
49
  for (let col = 0; col < line.length; col++) {
50
50
  const ch = line[col];
51
51
  if (ch === ' ')
@@ -1 +1 @@
1
- {"version":3,"file":"logo-frames.js","sourceRoot":"","sources":["../../../src/dashboard/lib/logo-frames.ts"],"names":[],"mappings":"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","sourcesContent":["// Scaled-down WorkOS logo frames for animation\n// Original is 20 lines tall; this is ~10 lines for panel fit\n\nconst LOGO_SMALL = [\n ' *+++++++*++++* ',\n ' *++++++++*++++++ ',\n ' *+++++* *+++++* ',\n ' *+++++* *+++++* ',\n ' *++++* *++++* ',\n ' *+++++* *+++++* ',\n ' *+++++* *+++++* ',\n ' *++++++**++++++* ',\n ' *++++*++*++++* ',\n];\n\n// Purple gradient colors (256 color mode)\nexport const COLORS = {\n brightest: '38;5;225', // light lavender\n bright: '38;5;183', // lavender\n medium: '38;5;141', // medium purple\n dark: '38;5;135', // purple\n darker: '38;5;93', // deep purple\n darkest: '38;5;54', // dark purple\n};\n\nexport type AnimationMode = 'spin' | 'pulse';\n\nexport interface LogoFrame {\n lines: string[];\n color: string;\n}\n\n// Pre-generate frames for spin animation\nexport function generateSpinFrames(): LogoFrame[] {\n const NUM_FRAMES = 32;\n const frames: LogoFrame[] = [];\n\n for (let f = 0; f < NUM_FRAMES; f++) {\n const angle = (f / NUM_FRAMES) * 2 * Math.PI;\n const cosA = Math.cos(angle);\n const absCos = Math.abs(cosA);\n\n // Color based on facing angle\n let color: string;\n if (absCos > 0.9) color = COLORS.brightest;\n else if (absCos > 0.7) color = COLORS.bright;\n else if (absCos > 0.5) color = COLORS.medium;\n else if (absCos > 0.3) color = COLORS.dark;\n else if (absCos > 0.15) color = COLORS.darker;\n else color = COLORS.darkest;\n\n // Project characters\n const projectedLines = LOGO_SMALL.map((line) => {\n const centerX = line.length / 2;\n const outChars = new Array(line.length).fill(' ');\n\n for (let col = 0; col < line.length; col++) {\n const ch = line[col];\n if (ch === ' ') continue;\n\n const x = col - centerX;\n const newX = x * cosA;\n const screenX = Math.round(centerX + newX);\n\n if (screenX >= 0 && screenX < line.length) {\n outChars[screenX] = ch;\n }\n }\n\n return outChars.join('');\n });\n\n frames.push({ lines: projectedLines, color });\n }\n\n return frames;\n}\n\n// Pre-generate frames for pulse animation\nexport function generatePulseFrames(): LogoFrame[] {\n const NUM_FRAMES = 24;\n const frames: LogoFrame[] = [];\n\n for (let f = 0; f < NUM_FRAMES; f++) {\n const angle = (f / NUM_FRAMES) * 2 * Math.PI;\n const brightness = (Math.cos(angle) + 1) / 2; // 0 to 1\n\n let color: string;\n if (brightness > 0.85) color = COLORS.brightest;\n else if (brightness > 0.7) color = COLORS.bright;\n else if (brightness > 0.5) color = COLORS.medium;\n else if (brightness > 0.35) color = COLORS.dark;\n else if (brightness > 0.2) color = COLORS.darker;\n else color = COLORS.darkest;\n\n frames.push({ lines: [...LOGO_SMALL], color });\n }\n\n return frames;\n}\n\n// Cache frames on first use\nlet spinFramesCache: LogoFrame[] | null = null;\nlet pulseFramesCache: LogoFrame[] | null = null;\n\nexport function getFrames(mode: AnimationMode): LogoFrame[] {\n if (mode === 'spin') {\n if (!spinFramesCache) spinFramesCache = generateSpinFrames();\n return spinFramesCache;\n } else {\n if (!pulseFramesCache) pulseFramesCache = generatePulseFrames();\n return pulseFramesCache;\n }\n}\n\nexport const FRAME_DELAYS = {\n spin: 55,\n pulse: 80,\n} as const;\n"]}
1
+ {"version":3,"file":"logo-frames.js","sourceRoot":"","sources":["../../../src/dashboard/lib/logo-frames.ts"],"names":[],"mappings":"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","sourcesContent":["// Scaled-down WorkOS logo frames for animation\n// Original is 20 lines tall; this is ~10 lines for panel fit\n\nconst LOGO_SMALL = [\n ' *+++++++*++++* ',\n ' *++++++++*++++++ ',\n ' *+++++* *+++++* ',\n ' *+++++* *+++++* ',\n ' *++++* *++++* ',\n ' *+++++* *+++++* ',\n ' *+++++* *+++++* ',\n ' *++++++**++++++* ',\n ' *++++*++*++++* ',\n];\n\n// Purple gradient colors (256 color mode)\nexport const COLORS = {\n brightest: '38;5;225', // light lavender\n bright: '38;5;183', // lavender\n medium: '38;5;141', // medium purple\n dark: '38;5;135', // purple\n darker: '38;5;93', // deep purple\n darkest: '38;5;54', // dark purple\n};\n\nexport type AnimationMode = 'spin' | 'pulse';\n\nexport interface LogoFrame {\n lines: string[];\n color: string;\n}\n\n// Pre-generate frames for spin animation\nexport function generateSpinFrames(): LogoFrame[] {\n const NUM_FRAMES = 32;\n const frames: LogoFrame[] = [];\n\n for (let f = 0; f < NUM_FRAMES; f++) {\n const angle = (f / NUM_FRAMES) * 2 * Math.PI;\n const cosA = Math.cos(angle);\n const absCos = Math.abs(cosA);\n\n // Color based on facing angle\n let color: string;\n if (absCos > 0.9) color = COLORS.brightest;\n else if (absCos > 0.7) color = COLORS.bright;\n else if (absCos > 0.5) color = COLORS.medium;\n else if (absCos > 0.3) color = COLORS.dark;\n else if (absCos > 0.15) color = COLORS.darker;\n else color = COLORS.darkest;\n\n // Project characters\n const projectedLines = LOGO_SMALL.map((line) => {\n const centerX = line.length / 2;\n const outChars = Array.from({ length: line.length }, () => ' ');\n\n for (let col = 0; col < line.length; col++) {\n const ch = line[col];\n if (ch === ' ') continue;\n\n const x = col - centerX;\n const newX = x * cosA;\n const screenX = Math.round(centerX + newX);\n\n if (screenX >= 0 && screenX < line.length) {\n outChars[screenX] = ch;\n }\n }\n\n return outChars.join('');\n });\n\n frames.push({ lines: projectedLines, color });\n }\n\n return frames;\n}\n\n// Pre-generate frames for pulse animation\nexport function generatePulseFrames(): LogoFrame[] {\n const NUM_FRAMES = 24;\n const frames: LogoFrame[] = [];\n\n for (let f = 0; f < NUM_FRAMES; f++) {\n const angle = (f / NUM_FRAMES) * 2 * Math.PI;\n const brightness = (Math.cos(angle) + 1) / 2; // 0 to 1\n\n let color: string;\n if (brightness > 0.85) color = COLORS.brightest;\n else if (brightness > 0.7) color = COLORS.bright;\n else if (brightness > 0.5) color = COLORS.medium;\n else if (brightness > 0.35) color = COLORS.dark;\n else if (brightness > 0.2) color = COLORS.darker;\n else color = COLORS.darkest;\n\n frames.push({ lines: [...LOGO_SMALL], color });\n }\n\n return frames;\n}\n\n// Cache frames on first use\nlet spinFramesCache: LogoFrame[] | null = null;\nlet pulseFramesCache: LogoFrame[] | null = null;\n\nexport function getFrames(mode: AnimationMode): LogoFrame[] {\n if (mode === 'spin') {\n if (!spinFramesCache) spinFramesCache = generateSpinFrames();\n return spinFramesCache;\n } else {\n if (!pulseFramesCache) pulseFramesCache = generatePulseFrames();\n return pulseFramesCache;\n }\n}\n\nexport const FRAME_DELAYS = {\n spin: 55,\n pulse: 80,\n} as const;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/doctor/checks/dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CredentialValidation,\n DashboardSettings,\n DashboardFetchResult,\n DoctorOptions,\n RedirectUriComparison,\n EnvironmentRaw,\n} from '../types.js';\n\nconst WORKOS_API_URL = 'https://api.workos.com';\n\nexport async function checkDashboardSettings(\n options: DoctorOptions,\n apiKeyType: 'staging' | 'production' | null,\n raw: EnvironmentRaw,\n): Promise<DashboardFetchResult> {\n // Never call API with production keys\n if (apiKeyType === 'production') {\n return { settings: null, error: 'Skipped (production API key)' };\n }\n\n if (options.skipApi) {\n return { settings: null, error: 'Skipped (--skip-api)' };\n }\n\n const apiKey = raw.apiKey;\n if (!apiKey) {\n return { settings: null, error: 'No API key configured' };\n }\n\n try {\n return await fetchDashboardSettings(apiKey, raw.baseUrl);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n return { settings: null, error: message };\n }\n}\n\nasync function fetchDashboardSettings(apiKey: string, baseUrlOverride: string | null): Promise<DashboardFetchResult> {\n const baseUrl = baseUrlOverride ?? WORKOS_API_URL;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\n const redirectUris: string[] = [];\n\n // Single /organizations?limit=1 call — validates credentials AND gets org count\n const orgsResponse = await fetch(`${baseUrl}/organizations?limit=1`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n\n if (orgsResponse.status === 401) {\n return {\n settings: null,\n credentialValidation: { valid: false, clientIdMatch: true, error: 'Invalid API key' },\n error: 'Invalid API key (401)',\n };\n }\n if (orgsResponse.status === 403) {\n return {\n settings: null,\n credentialValidation: { valid: false, clientIdMatch: true, error: 'API key lacks permissions' },\n error: 'API key lacks permissions (403)',\n };\n }\n if (!orgsResponse.ok) {\n return {\n settings: null,\n credentialValidation: { valid: false, clientIdMatch: true, error: `API error: ${orgsResponse.status}` },\n error: `API error: ${orgsResponse.status}`,\n };\n }\n\n // Credentials valid — extract org count from the same response\n const credentialValidation: CredentialValidation = { valid: true, clientIdMatch: true };\n\n let organizationCount = 0;\n const orgsData = (await orgsResponse.json()) as {\n list_metadata?: { total_count?: number };\n data?: unknown[];\n };\n organizationCount = orgsData.list_metadata?.total_count ?? orgsData.data?.length ?? 0;\n\n // Fetch environment settings\n const envResponse = await fetch(`${baseUrl}/environments/current`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n\n let authMethods: string[] = [];\n let sessionTimeout: string | null = null;\n let mfa: 'optional' | 'required' | 'disabled' | null = null;\n\n if (envResponse.ok) {\n const envData = (await envResponse.json()) as {\n auth_methods?: string[];\n session_timeout?: string;\n mfa_policy?: 'optional' | 'required' | 'disabled';\n };\n authMethods = envData.auth_methods ?? [];\n sessionTimeout = envData.session_timeout ?? null;\n mfa = envData.mfa_policy ?? null;\n }\n\n return {\n settings: { redirectUris, authMethods, sessionTimeout, mfa, organizationCount },\n credentialValidation,\n };\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error('Request timeout (10s)');\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Normalize a URI for comparison:\n * - Remove trailing slashes\n * - Normalize localhost variants (127.0.0.1 → localhost)\n * - Lowercase the host portion\n */\nfunction normalizeUri(uri: string): string {\n try {\n const url = new URL(uri);\n // Normalize localhost variants\n if (url.hostname === '127.0.0.1' || url.hostname === '[::1]') {\n url.hostname = 'localhost';\n }\n // Lowercase hostname (but preserve path case for compatibility)\n url.hostname = url.hostname.toLowerCase();\n // Remove trailing slash from pathname (unless it's just \"/\")\n if (url.pathname.length > 1 && url.pathname.endsWith('/')) {\n url.pathname = url.pathname.slice(0, -1);\n }\n return url.toString();\n } catch {\n // If URL parsing fails, return as-is for exact match fallback\n return uri;\n }\n}\n\nexport function compareRedirectUris(\n codeUri: string | null,\n dashboardUris: string[],\n source?: 'env' | 'inferred',\n): RedirectUriComparison {\n if (!codeUri) {\n return { codeUri, dashboardUris, match: false, source };\n }\n\n const normalizedCode = normalizeUri(codeUri);\n const normalizedDashboard = dashboardUris.map(normalizeUri);\n const match = normalizedDashboard.includes(normalizedCode);\n\n return { codeUri, dashboardUris, match, source };\n}\n"]}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/doctor/checks/dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CredentialValidation,\n DashboardFetchResult,\n DoctorOptions,\n RedirectUriComparison,\n EnvironmentRaw,\n} from '../types.js';\n\nconst WORKOS_API_URL = 'https://api.workos.com';\n\nexport async function checkDashboardSettings(\n options: DoctorOptions,\n apiKeyType: 'staging' | 'production' | null,\n raw: EnvironmentRaw,\n): Promise<DashboardFetchResult> {\n // Never call API with production keys\n if (apiKeyType === 'production') {\n return { settings: null, error: 'Skipped (production API key)' };\n }\n\n if (options.skipApi) {\n return { settings: null, error: 'Skipped (--skip-api)' };\n }\n\n const apiKey = raw.apiKey;\n if (!apiKey) {\n return { settings: null, error: 'No API key configured' };\n }\n\n try {\n return await fetchDashboardSettings(apiKey, raw.baseUrl);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n return { settings: null, error: message };\n }\n}\n\nasync function fetchDashboardSettings(apiKey: string, baseUrlOverride: string | null): Promise<DashboardFetchResult> {\n const baseUrl = baseUrlOverride ?? WORKOS_API_URL;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\n const redirectUris: string[] = [];\n\n // Single /organizations?limit=1 call — validates credentials AND gets org count\n const orgsResponse = await fetch(`${baseUrl}/organizations?limit=1`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n\n if (orgsResponse.status === 401) {\n return {\n settings: null,\n credentialValidation: { valid: false, clientIdMatch: true, error: 'Invalid API key' },\n error: 'Invalid API key (401)',\n };\n }\n if (orgsResponse.status === 403) {\n return {\n settings: null,\n credentialValidation: { valid: false, clientIdMatch: true, error: 'API key lacks permissions' },\n error: 'API key lacks permissions (403)',\n };\n }\n if (!orgsResponse.ok) {\n return {\n settings: null,\n credentialValidation: { valid: false, clientIdMatch: true, error: `API error: ${orgsResponse.status}` },\n error: `API error: ${orgsResponse.status}`,\n };\n }\n\n // Credentials valid — extract org count from the same response\n const credentialValidation: CredentialValidation = { valid: true, clientIdMatch: true };\n\n let organizationCount = 0;\n const orgsData = (await orgsResponse.json()) as {\n list_metadata?: { total_count?: number };\n data?: unknown[];\n };\n organizationCount = orgsData.list_metadata?.total_count ?? orgsData.data?.length ?? 0;\n\n // Fetch environment settings\n const envResponse = await fetch(`${baseUrl}/environments/current`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n });\n\n let authMethods: string[] = [];\n let sessionTimeout: string | null = null;\n let mfa: 'optional' | 'required' | 'disabled' | null = null;\n\n if (envResponse.ok) {\n const envData = (await envResponse.json()) as {\n auth_methods?: string[];\n session_timeout?: string;\n mfa_policy?: 'optional' | 'required' | 'disabled';\n };\n authMethods = envData.auth_methods ?? [];\n sessionTimeout = envData.session_timeout ?? null;\n mfa = envData.mfa_policy ?? null;\n }\n\n return {\n settings: { redirectUris, authMethods, sessionTimeout, mfa, organizationCount },\n credentialValidation,\n };\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error('Request timeout (10s)');\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Normalize a URI for comparison:\n * - Remove trailing slashes\n * - Normalize localhost variants (127.0.0.1 → localhost)\n * - Lowercase the host portion\n */\nfunction normalizeUri(uri: string): string {\n try {\n const url = new URL(uri);\n // Normalize localhost variants\n if (url.hostname === '127.0.0.1' || url.hostname === '[::1]') {\n url.hostname = 'localhost';\n }\n // Lowercase hostname (but preserve path case for compatibility)\n url.hostname = url.hostname.toLowerCase();\n // Remove trailing slash from pathname (unless it's just \"/\")\n if (url.pathname.length > 1 && url.pathname.endsWith('/')) {\n url.pathname = url.pathname.slice(0, -1);\n }\n return url.toString();\n } catch {\n // If URL parsing fails, return as-is for exact match fallback\n return uri;\n }\n}\n\nexport function compareRedirectUris(\n codeUri: string | null,\n dashboardUris: string[],\n source?: 'env' | 'inferred',\n): RedirectUriComparison {\n if (!codeUri) {\n return { codeUri, dashboardUris, match: false, source };\n }\n\n const normalizedCode = normalizeUri(codeUri);\n const normalizedDashboard = dashboardUris.map(normalizeUri);\n const match = normalizedDashboard.includes(normalizedCode);\n\n return { codeUri, dashboardUris, match, source };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/doctor/checks/environment.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { EnvironmentInfo, EnvironmentCheckResult, DoctorOptions } from '../types.js';\n\nfunction parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Strip optional `export ` prefix\n const entry = trimmed.startsWith('export ') ? trimmed.slice(7) : trimmed;\n const eqIndex = entry.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = entry.slice(0, eqIndex).trim();\n let value = entry.slice(eqIndex + 1).trim();\n\n // Remove surrounding quotes (single or double)\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Load environment variables from project's .env files.\n * Priority: .env.local > .env (matching Next.js/Vite conventions)\n */\nfunction loadProjectEnv(installDir: string): Record<string, string> {\n const env: Record<string, string> = {};\n\n // Load in order: .env first, then .env.local (later overrides earlier)\n const envFiles = ['.env', '.env.local'];\n\n for (const file of envFiles) {\n const filePath = join(installDir, file);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n Object.assign(env, parseEnvFile(content));\n } catch {\n // Ignore read errors\n }\n }\n }\n\n return env;\n}\n\nexport function checkEnvironment(options?: DoctorOptions): EnvironmentCheckResult {\n // Load project env files, then fall back to process.env\n const projectEnv = options?.installDir ? loadProjectEnv(options.installDir) : {};\n\n const apiKey = projectEnv.WORKOS_API_KEY ?? process.env.WORKOS_API_KEY ?? null;\n const clientId = projectEnv.WORKOS_CLIENT_ID ?? process.env.WORKOS_CLIENT_ID ?? null;\n const redirectUri = projectEnv.WORKOS_REDIRECT_URI ?? process.env.WORKOS_REDIRECT_URI ?? null;\n const cookieDomain = projectEnv.WORKOS_COOKIE_DOMAIN ?? process.env.WORKOS_COOKIE_DOMAIN ?? null;\n const baseUrl = projectEnv.WORKOS_BASE_URL ?? process.env.WORKOS_BASE_URL ?? null;\n\n return {\n info: {\n apiKeyConfigured: !!apiKey,\n apiKeyType: getApiKeyType(apiKey),\n clientId: truncateClientId(clientId),\n redirectUri: redirectUri,\n cookieDomain: cookieDomain,\n baseUrl: baseUrl ?? 'https://api.workos.com',\n },\n raw: {\n apiKey,\n clientId,\n baseUrl: baseUrl ?? 'https://api.workos.com',\n },\n };\n}\n\nfunction getApiKeyType(apiKey: string | undefined): 'staging' | 'production' | null {\n if (!apiKey) return null;\n if (apiKey.startsWith('sk_test_')) return 'staging';\n if (apiKey.startsWith('sk_live_')) return 'production';\n return null; // Unknown format\n}\n\nfunction truncateClientId(clientId: string | undefined): string | null {\n if (!clientId) return null;\n if (clientId.length <= 15) return clientId;\n return `${clientId.slice(0, 10)}...${clientId.slice(-3)}`;\n}\n"]}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/doctor/checks/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,kCAAkC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACzE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,SAAS;QAE7B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5C,+CAA+C;QAC/C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,UAAkB;IACxC,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,uEAAuE;IACvE,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,wDAAwD;IACxD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC;IAC/E,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACrF,MAAM,WAAW,GAAG,UAAU,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC;IAC9F,MAAM,YAAY,GAAG,UAAU,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC;IACjG,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC;IAElF,OAAO;QACL,IAAI,EAAE;YACJ,gBAAgB,EAAE,CAAC,CAAC,MAAM;YAC1B,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC;YACjC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC;YACpC,WAAW,EAAE,WAAW;YACxB,YAAY,EAAE,YAAY;YAC1B,OAAO,EAAE,OAAO,IAAI,wBAAwB;SAC7C;QACD,GAAG,EAAE;YACH,MAAM;YACN,QAAQ;YACR,OAAO,EAAE,OAAO,IAAI,wBAAwB;SAC7C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAA0B;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,YAAY,CAAC;IACvD,OAAO,IAAI,CAAC,CAAC,iBAAiB;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA4B;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC","sourcesContent":["import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { EnvironmentCheckResult, DoctorOptions } from '../types.js';\n\nfunction parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Strip optional `export ` prefix\n const entry = trimmed.startsWith('export ') ? trimmed.slice(7) : trimmed;\n const eqIndex = entry.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = entry.slice(0, eqIndex).trim();\n let value = entry.slice(eqIndex + 1).trim();\n\n // Remove surrounding quotes (single or double)\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Load environment variables from project's .env files.\n * Priority: .env.local > .env (matching Next.js/Vite conventions)\n */\nfunction loadProjectEnv(installDir: string): Record<string, string> {\n const env: Record<string, string> = {};\n\n // Load in order: .env first, then .env.local (later overrides earlier)\n const envFiles = ['.env', '.env.local'];\n\n for (const file of envFiles) {\n const filePath = join(installDir, file);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n Object.assign(env, parseEnvFile(content));\n } catch {\n // Ignore read errors\n }\n }\n }\n\n return env;\n}\n\nexport function checkEnvironment(options?: DoctorOptions): EnvironmentCheckResult {\n // Load project env files, then fall back to process.env\n const projectEnv = options?.installDir ? loadProjectEnv(options.installDir) : {};\n\n const apiKey = projectEnv.WORKOS_API_KEY ?? process.env.WORKOS_API_KEY ?? null;\n const clientId = projectEnv.WORKOS_CLIENT_ID ?? process.env.WORKOS_CLIENT_ID ?? null;\n const redirectUri = projectEnv.WORKOS_REDIRECT_URI ?? process.env.WORKOS_REDIRECT_URI ?? null;\n const cookieDomain = projectEnv.WORKOS_COOKIE_DOMAIN ?? process.env.WORKOS_COOKIE_DOMAIN ?? null;\n const baseUrl = projectEnv.WORKOS_BASE_URL ?? process.env.WORKOS_BASE_URL ?? null;\n\n return {\n info: {\n apiKeyConfigured: !!apiKey,\n apiKeyType: getApiKeyType(apiKey),\n clientId: truncateClientId(clientId),\n redirectUri: redirectUri,\n cookieDomain: cookieDomain,\n baseUrl: baseUrl ?? 'https://api.workos.com',\n },\n raw: {\n apiKey,\n clientId,\n baseUrl: baseUrl ?? 'https://api.workos.com',\n },\n };\n}\n\nfunction getApiKeyType(apiKey: string | undefined): 'staging' | 'production' | null {\n if (!apiKey) return null;\n if (apiKey.startsWith('sk_test_')) return 'staging';\n if (apiKey.startsWith('sk_live_')) return 'production';\n return null; // Unknown format\n}\n\nfunction truncateClientId(clientId: string | undefined): string | null {\n if (!clientId) return null;\n if (clientId.length <= 15) return clientId;\n return `${clientId.slice(0, 10)}...${clientId.slice(-3)}`;\n}\n"]}
@@ -73,9 +73,7 @@ export const config = {
73
73
  getTags: (context) => (context?.framework ? { 'go-framework': context.framework } : {}),
74
74
  },
75
75
  prompts: {
76
- getAdditionalContextLines: (context) => [
77
- ...(context?.framework ? [`Go web framework: ${context.framework}`] : []),
78
- ],
76
+ getAdditionalContextLines: (context) => (context?.framework ? [`Go web framework: ${context.framework}`] : []),
79
77
  },
80
78
  ui: {
81
79
  successMessage: 'WorkOS AuthKit integration complete',