workos 0.15.2 → 0.16.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 (107) hide show
  1. package/README.md +37 -11
  2. package/dist/bin.js +1439 -1257
  3. package/dist/bin.js.map +1 -1
  4. package/dist/cli.config.d.ts +1 -0
  5. package/dist/cli.config.js +1 -0
  6. package/dist/cli.config.js.map +1 -1
  7. package/dist/commands/api/index.js +7 -2
  8. package/dist/commands/api/index.js.map +1 -1
  9. package/dist/commands/api/interactive.js +9 -3
  10. package/dist/commands/api/interactive.js.map +1 -1
  11. package/dist/commands/debug.d.ts +2 -1
  12. package/dist/commands/debug.js +43 -3
  13. package/dist/commands/debug.js.map +1 -1
  14. package/dist/commands/dev.js +5 -4
  15. package/dist/commands/dev.js.map +1 -1
  16. package/dist/commands/doctor.js +13 -4
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/emulate.js +2 -2
  19. package/dist/commands/emulate.js.map +1 -1
  20. package/dist/commands/env.js +5 -4
  21. package/dist/commands/env.js.map +1 -1
  22. package/dist/commands/install-skill.js +4 -3
  23. package/dist/commands/install-skill.js.map +1 -1
  24. package/dist/commands/install.js +2 -2
  25. package/dist/commands/install.js.map +1 -1
  26. package/dist/commands/login.js +3 -3
  27. package/dist/commands/login.js.map +1 -1
  28. package/dist/commands/migrations.d.ts +1 -1
  29. package/dist/commands/migrations.js +4 -1
  30. package/dist/commands/migrations.js.map +1 -1
  31. package/dist/commands/telemetry.d.ts +3 -0
  32. package/dist/commands/telemetry.js +88 -0
  33. package/dist/commands/telemetry.js.map +1 -0
  34. package/dist/commands/uninstall-skill.js +3 -2
  35. package/dist/commands/uninstall-skill.js.map +1 -1
  36. package/dist/commands/vault-run.d.ts +13 -0
  37. package/dist/commands/vault-run.js +194 -0
  38. package/dist/commands/vault-run.js.map +1 -0
  39. package/dist/commands/vault.d.ts +3 -2
  40. package/dist/commands/vault.js +41 -8
  41. package/dist/commands/vault.js.map +1 -1
  42. package/dist/lib/api-error-handler.d.ts +15 -3
  43. package/dist/lib/api-error-handler.js +52 -34
  44. package/dist/lib/api-error-handler.js.map +1 -1
  45. package/dist/lib/command-aliases.d.ts +8 -0
  46. package/dist/lib/command-aliases.js +12 -0
  47. package/dist/lib/command-aliases.js.map +1 -0
  48. package/dist/lib/constants.d.ts +0 -1
  49. package/dist/lib/constants.js +0 -1
  50. package/dist/lib/constants.js.map +1 -1
  51. package/dist/lib/device-id.d.ts +25 -0
  52. package/dist/lib/device-id.js +102 -0
  53. package/dist/lib/device-id.js.map +1 -0
  54. package/dist/lib/preferences.d.ts +101 -0
  55. package/dist/lib/preferences.js +198 -0
  56. package/dist/lib/preferences.js.map +1 -0
  57. package/dist/lib/run-with-core.js +15 -15
  58. package/dist/lib/run-with-core.js.map +1 -1
  59. package/dist/lib/settings.d.ts +6 -0
  60. package/dist/lib/settings.js +7 -0
  61. package/dist/lib/settings.js.map +1 -1
  62. package/dist/lib/telemetry-notice.d.ts +25 -0
  63. package/dist/lib/telemetry-notice.js +56 -0
  64. package/dist/lib/telemetry-notice.js.map +1 -0
  65. package/dist/test/force-insecure-storage.d.ts +1 -0
  66. package/dist/test/force-insecure-storage.js +9 -0
  67. package/dist/test/force-insecure-storage.js.map +1 -0
  68. package/dist/test/setup.d.ts +1 -0
  69. package/dist/test/setup.js +38 -0
  70. package/dist/test/setup.js.map +1 -0
  71. package/dist/utils/analytics.d.ts +41 -0
  72. package/dist/utils/analytics.js +199 -12
  73. package/dist/utils/analytics.js.map +1 -1
  74. package/dist/utils/box.d.ts +29 -1
  75. package/dist/utils/box.js +92 -4
  76. package/dist/utils/box.js.map +1 -1
  77. package/dist/utils/cli-exit.d.ts +15 -0
  78. package/dist/utils/cli-exit.js +11 -0
  79. package/dist/utils/cli-exit.js.map +1 -0
  80. package/dist/utils/cli-symbols.d.ts +1 -1
  81. package/dist/utils/command-telemetry.d.ts +17 -0
  82. package/dist/utils/command-telemetry.js +67 -0
  83. package/dist/utils/command-telemetry.js.map +1 -0
  84. package/dist/utils/crash-reporter.d.ts +13 -0
  85. package/dist/utils/crash-reporter.js +91 -0
  86. package/dist/utils/crash-reporter.js.map +1 -0
  87. package/dist/utils/debug.d.ts +1 -0
  88. package/dist/utils/debug.js +4 -1
  89. package/dist/utils/debug.js.map +1 -1
  90. package/dist/utils/exit-codes.d.ts +5 -0
  91. package/dist/utils/exit-codes.js +30 -1
  92. package/dist/utils/exit-codes.js.map +1 -1
  93. package/dist/utils/help-json.d.ts +6 -0
  94. package/dist/utils/help-json.js +87 -10
  95. package/dist/utils/help-json.js.map +1 -1
  96. package/dist/utils/output.d.ts +7 -2
  97. package/dist/utils/output.js +9 -2
  98. package/dist/utils/output.js.map +1 -1
  99. package/dist/utils/telemetry-client.d.ts +30 -2
  100. package/dist/utils/telemetry-client.js +122 -12
  101. package/dist/utils/telemetry-client.js.map +1 -1
  102. package/dist/utils/telemetry-store-forward.d.ts +11 -0
  103. package/dist/utils/telemetry-store-forward.js +94 -0
  104. package/dist/utils/telemetry-store-forward.js.map +1 -0
  105. package/dist/utils/telemetry-types.d.ts +58 -9
  106. package/dist/utils/telemetry-types.js.map +1 -1
  107. package/package.json +1 -1
@@ -6,6 +6,7 @@ export declare const config: {
6
6
  readonly clientId: "client_01KFKHSZWK9ADVJV854PDFQCCR";
7
7
  readonly authkitDomain: "https://signin.workos.com";
8
8
  readonly llmGatewayUrl: "https://api.workos.com/llm-gateway";
9
+ readonly telemetryUrl: "https://api.workos.com/cli";
9
10
  };
10
11
  readonly telemetry: {
11
12
  readonly enabled: true;
@@ -8,6 +8,7 @@ export const config = {
8
8
  clientId: 'client_01KFKHSZWK9ADVJV854PDFQCCR',
9
9
  authkitDomain: 'https://signin.workos.com',
10
10
  llmGatewayUrl: 'https://api.workos.com/llm-gateway',
11
+ telemetryUrl: 'https://api.workos.com/cli',
11
12
  },
12
13
  telemetry: {
13
14
  enabled: true,
@@ -1 +1 @@
1
- {"version":3,"file":"cli.config.js","sourceRoot":"","sources":["../src/cli.config.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAEnC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,0BAA0B;IACjC,WAAW,EAAE,2BAA2B;IAExC,4DAA4D;IAC5D,MAAM,EAAE;QACN,QAAQ,EAAE,mCAAmC;QAC7C,aAAa,EAAE,2BAA2B;QAC1C,aAAa,EAAE,oCAAoC;KACpD;IAED,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,uBAAuB;KACnC;IAED,KAAK,EAAE;QACL,uEAAuE;QACvE,kBAAkB,EAAE,MAAM;KAC3B;IAED,WAAW,EAAE,SAAS;IAEtB,OAAO,EAAE;QACP,SAAS,EAAE,KAAK;KACjB;IAED,aAAa,EAAE;QACb,aAAa,EAAE,iCAAiC;QAChD,YAAY,EAAE,8BAA8B;QAC5C,SAAS,EAAE,sCAAsC;KAClD;IAED,UAAU,EAAE;QACV,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,KAAK,EAAE;YACL,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,WAAW;SAC1B;QACD,aAAa,EAAE;YACb,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,oBAAoB;SACnC;QACD,WAAW,EAAE;YACX,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,WAAW;SAC1B;QACD,SAAS,EAAE;YACT,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,WAAW;SAC1B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,iBAAiB;SAChC;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,GAAG,EAAE;YACH,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,UAAU,EAAE;YACV,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,EAAE,EAAE;YACF,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;KACF;IAED,MAAM,EAAE;QACN,SAAS,EAAE,IAAI;KAChB;IAED,QAAQ,EAAE;QACR,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,4BAA4B;QAC7C,QAAQ,EAAE;;;;;;;;;;;;;;;;wEAgB0D;KACrE;CACiC,CAAC","sourcesContent":["import type { InstallerConfig } from './lib/settings.js';\nimport pkg from '../package.json' with { type: 'json' };\n\nexport const version = pkg.version;\n\nexport const config = {\n model: 'claude-opus-4-5-20251101',\n doctorModel: 'claude-haiku-4-5-20251001',\n\n // Production defaults - override via env vars for local dev\n workos: {\n clientId: 'client_01KFKHSZWK9ADVJV854PDFQCCR',\n authkitDomain: 'https://signin.workos.com',\n llmGatewayUrl: 'https://api.workos.com/llm-gateway',\n },\n\n telemetry: {\n enabled: true,\n eventName: 'installer interaction',\n },\n\n proxy: {\n // Refresh token when it expires within this window (default: 1 minute)\n refreshThresholdMs: 60_000,\n },\n\n nodeVersion: '>=20.20',\n\n logging: {\n debugMode: false,\n },\n\n documentation: {\n workosDocsUrl: 'https://workos.com/docs/authkit',\n dashboardUrl: 'https://dashboard.workos.com',\n issuesUrl: 'https://github.com/workos/cli/issues',\n },\n\n frameworks: {\n nextjs: {\n port: 3000,\n callbackPath: '/auth/callback',\n },\n react: {\n port: 5173,\n callbackPath: '/callback',\n },\n tanstackStart: {\n port: 3000,\n callbackPath: '/api/auth/callback',\n },\n reactRouter: {\n port: 5173,\n callbackPath: '/callback',\n },\n vanillaJs: {\n port: 5173,\n callbackPath: '/callback',\n },\n python: {\n port: 8000,\n callbackPath: '/auth/callback/',\n },\n ruby: {\n port: 3000,\n callbackPath: '/auth/callback',\n },\n php: {\n port: 8000,\n callbackPath: '/auth/callback',\n },\n phpLaravel: {\n port: 8000,\n callbackPath: '/auth/callback',\n },\n go: {\n port: 8080,\n callbackPath: '/auth/callback',\n },\n dotnet: {\n port: 5000,\n callbackPath: '/auth/callback',\n },\n elixir: {\n port: 4000,\n callbackPath: '/auth/callback',\n },\n kotlin: {\n port: 8080,\n callbackPath: '/auth/callback',\n },\n },\n\n legacy: {\n oauthPort: 8239,\n },\n\n branding: {\n showAsciiArt: true,\n useCompact: false,\n compactAsciiArt: `⚡ WorkOS AuthKit Installer`,\n asciiArt: `░██ ░██ ░██ ░██████ ░██████\n░██ ░██ ░██ ░██ ░██ ░██ ░██\n░██ ░██ ░██ ░███████ ░██░████ ░██ ░██░██ ░██ ░██\n░██ ░████ ░██ ░██ ░██ ░███ ░██ ░██ ░██ ░██ ░████████\n░██░██ ░██░██ ░██ ░██ ░██ ░███████ ░██ ░██ ░██\n░████ ░████ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██\n░███ ░███ ░███████ ░██ ░██ ░██ ░██████ ░██████\n\n\n\n ░███ ░██ ░██ ░██ ░██ ░██ ░██\n ░██░██ ░██ ░██ ░██ ░██ ░██\n ░██ ░██ ░██ ░██ ░████████ ░████████ ░██ ░██ ░██░████████\n░█████████ ░██ ░██ ░██ ░██ ░██ ░███████ ░██ ░██\n░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██\n░██ ░██ ░██ ░███ ░██ ░██ ░██ ░██ ░██ ░██ ░██\n░██ ░██ ░█████░██ ░████ ░██ ░██ ░██ ░██ ░██ ░████ `,\n },\n} as const satisfies InstallerConfig;\n"]}
1
+ {"version":3,"file":"cli.config.js","sourceRoot":"","sources":["../src/cli.config.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAEnC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,0BAA0B;IACjC,WAAW,EAAE,2BAA2B;IAExC,4DAA4D;IAC5D,MAAM,EAAE;QACN,QAAQ,EAAE,mCAAmC;QAC7C,aAAa,EAAE,2BAA2B;QAC1C,aAAa,EAAE,oCAAoC;QACnD,YAAY,EAAE,4BAA4B;KAC3C;IAED,SAAS,EAAE;QACT,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,uBAAuB;KACnC;IAED,KAAK,EAAE;QACL,uEAAuE;QACvE,kBAAkB,EAAE,MAAM;KAC3B;IAED,WAAW,EAAE,SAAS;IAEtB,OAAO,EAAE;QACP,SAAS,EAAE,KAAK;KACjB;IAED,aAAa,EAAE;QACb,aAAa,EAAE,iCAAiC;QAChD,YAAY,EAAE,8BAA8B;QAC5C,SAAS,EAAE,sCAAsC;KAClD;IAED,UAAU,EAAE;QACV,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,KAAK,EAAE;YACL,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,WAAW;SAC1B;QACD,aAAa,EAAE;YACb,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,oBAAoB;SACnC;QACD,WAAW,EAAE;YACX,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,WAAW;SAC1B;QACD,SAAS,EAAE;YACT,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,WAAW;SAC1B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,iBAAiB;SAChC;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,GAAG,EAAE;YACH,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,UAAU,EAAE;YACV,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,EAAE,EAAE;YACF,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,gBAAgB;SAC/B;KACF;IAED,MAAM,EAAE;QACN,SAAS,EAAE,IAAI;KAChB;IAED,QAAQ,EAAE;QACR,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,4BAA4B;QAC7C,QAAQ,EAAE;;;;;;;;;;;;;;;;wEAgB0D;KACrE;CACiC,CAAC","sourcesContent":["import type { InstallerConfig } from './lib/settings.js';\nimport pkg from '../package.json' with { type: 'json' };\n\nexport const version = pkg.version;\n\nexport const config = {\n model: 'claude-opus-4-5-20251101',\n doctorModel: 'claude-haiku-4-5-20251001',\n\n // Production defaults - override via env vars for local dev\n workos: {\n clientId: 'client_01KFKHSZWK9ADVJV854PDFQCCR',\n authkitDomain: 'https://signin.workos.com',\n llmGatewayUrl: 'https://api.workos.com/llm-gateway',\n telemetryUrl: 'https://api.workos.com/cli',\n },\n\n telemetry: {\n enabled: true,\n eventName: 'installer interaction',\n },\n\n proxy: {\n // Refresh token when it expires within this window (default: 1 minute)\n refreshThresholdMs: 60_000,\n },\n\n nodeVersion: '>=20.20',\n\n logging: {\n debugMode: false,\n },\n\n documentation: {\n workosDocsUrl: 'https://workos.com/docs/authkit',\n dashboardUrl: 'https://dashboard.workos.com',\n issuesUrl: 'https://github.com/workos/cli/issues',\n },\n\n frameworks: {\n nextjs: {\n port: 3000,\n callbackPath: '/auth/callback',\n },\n react: {\n port: 5173,\n callbackPath: '/callback',\n },\n tanstackStart: {\n port: 3000,\n callbackPath: '/api/auth/callback',\n },\n reactRouter: {\n port: 5173,\n callbackPath: '/callback',\n },\n vanillaJs: {\n port: 5173,\n callbackPath: '/callback',\n },\n python: {\n port: 8000,\n callbackPath: '/auth/callback/',\n },\n ruby: {\n port: 3000,\n callbackPath: '/auth/callback',\n },\n php: {\n port: 8000,\n callbackPath: '/auth/callback',\n },\n phpLaravel: {\n port: 8000,\n callbackPath: '/auth/callback',\n },\n go: {\n port: 8080,\n callbackPath: '/auth/callback',\n },\n dotnet: {\n port: 5000,\n callbackPath: '/auth/callback',\n },\n elixir: {\n port: 4000,\n callbackPath: '/auth/callback',\n },\n kotlin: {\n port: 8080,\n callbackPath: '/auth/callback',\n },\n },\n\n legacy: {\n oauthPort: 8239,\n },\n\n branding: {\n showAsciiArt: true,\n useCompact: false,\n compactAsciiArt: `⚡ WorkOS AuthKit Installer`,\n asciiArt: `░██ ░██ ░██ ░██████ ░██████\n░██ ░██ ░██ ░██ ░██ ░██ ░██\n░██ ░██ ░██ ░███████ ░██░████ ░██ ░██░██ ░██ ░██\n░██ ░████ ░██ ░██ ░██ ░███ ░██ ░██ ░██ ░██ ░████████\n░██░██ ░██░██ ░██ ░██ ░██ ░███████ ░██ ░██ ░██\n░████ ░████ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██\n░███ ░███ ░███████ ░██ ░██ ░██ ░██████ ░██████\n\n\n\n ░███ ░██ ░██ ░██ ░██ ░██ ░██\n ░██░██ ░██ ░██ ░██ ░██ ░██\n ░██ ░██ ░██ ░██ ░████████ ░████████ ░██ ░██ ░██░████████\n░█████████ ░██ ░██ ░██ ░██ ░██ ░███████ ░██ ░██\n░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██\n░██ ░██ ░██ ░███ ░██ ░██ ░██ ░██ ░██ ░██ ░██\n░██ ░██ ░█████░██ ░████ ░██ ░██ ░██ ░██ ░██ ░████ `,\n },\n} as const satisfies InstallerConfig;\n"]}
@@ -4,6 +4,7 @@ import { loadCatalog, endpointsByTag } from './catalog.js';
4
4
  import { apiRequest } from './request.js';
5
5
  import { resolveApiBaseUrl } from '../../lib/api-key.js';
6
6
  import { exitWithError, isJsonMode, outputJson } from '../../utils/output.js';
7
+ import { ExitCode, exitWithCode } from '../../utils/exit-codes.js';
7
8
  import { isCiMode, isPromptAllowed } from '../../utils/interaction-mode.js';
8
9
  import { confirmationRecovery } from '../../utils/recovery-hints.js';
9
10
  import { formatWorkOSCommandArgs } from '../../utils/command-invocation.js';
@@ -121,7 +122,7 @@ export async function runApiRequest(endpoint, options) {
121
122
  prettyPrint(body);
122
123
  const ok = await clack.confirm({ message: 'Proceed?' });
123
124
  if (!ok || clack.isCancel(ok)) {
124
- process.exit(0);
125
+ exitWithCode(ExitCode.CANCELLED);
125
126
  }
126
127
  }
127
128
  const response = await apiRequest({
@@ -133,7 +134,11 @@ export async function runApiRequest(endpoint, options) {
133
134
  });
134
135
  printResponse(response, { includeStatus: options.include });
135
136
  if (response.status >= 400) {
136
- process.exit(1);
137
+ exitWithError({
138
+ code: `http_${response.status}`,
139
+ message: `API request failed with status ${response.status}`,
140
+ apiContext: { status: response.status },
141
+ });
137
142
  }
138
143
  }
139
144
  function normalizePath(path) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { readFile } from 'node:fs/promises';\nimport { loadCatalog, endpointsByTag } from './catalog.js';\nimport { apiRequest } from './request.js';\nimport { resolveApiBaseUrl } from '../../lib/api-key.js';\nimport { exitWithError, isJsonMode, outputJson } from '../../utils/output.js';\nimport { isCiMode, isPromptAllowed } from '../../utils/interaction-mode.js';\nimport { confirmationRecovery } from '../../utils/recovery-hints.js';\nimport { formatWorkOSCommandArgs } from '../../utils/command-invocation.js';\nimport { colorMethod, printResponse } from './format.js';\n\nexport { colorMethod } from './format.js';\n\nexport interface ApiCommandOptions {\n method?: string;\n data?: string;\n file?: string;\n include?: boolean;\n apiKey?: string;\n dryRun?: boolean;\n yes?: boolean;\n}\n\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\nexport async function runApiInteractive(options?: { apiKey?: string }): Promise<void> {\n // Interactive mode is inherently human-oriented (clack prompts, preview text,\n // etc.). Refuse to enter it whenever JSON output was requested, regardless of\n // TTY status, so stdout stays machine-readable.\n if (isJsonMode()) {\n exitWithError({\n code: 'tty_required',\n message: 'Interactive mode is not available with --json. Provide an endpoint or use `workos api ls`.',\n details: {\n usage: ['workos api <endpoint>', 'workos api ls [filter]'],\n },\n });\n }\n\n if (!isPromptAllowed()) {\n exitWithError({\n code: 'tty_required',\n message:\n 'Interactive API mode requires human mode. Usage: workos api <endpoint> or workos api ls [filter]. Example: workos api /user_management/users',\n });\n }\n\n const { apiInteractive } = await import('./interactive.js');\n await apiInteractive({ apiKey: options?.apiKey });\n}\n\nexport async function runApiLs(filter?: string): Promise<void> {\n const catalog = await loadCatalog();\n let endpoints = catalog.endpoints;\n\n if (filter) {\n const lower = filter.toLowerCase();\n endpoints = endpoints.filter(\n (e) =>\n e.path.toLowerCase().includes(lower) ||\n e.tag.toLowerCase().includes(lower) ||\n e.summary.toLowerCase().includes(lower) ||\n e.operationId.toLowerCase().includes(lower),\n );\n }\n\n if (isJsonMode()) {\n outputJson({\n data: endpoints.map((e) => ({\n method: e.method,\n path: e.path,\n summary: e.summary,\n tag: e.tag,\n })),\n });\n return;\n }\n\n if (endpoints.length === 0) {\n console.log(filter ? `No endpoints matching \"${filter}\".` : 'No endpoints found.');\n return;\n }\n\n const grouped = endpointsByTag(endpoints);\n\n for (const [tag, eps] of grouped) {\n console.log(`\\n${chalk.bold(tag)}`);\n for (const ep of eps) {\n const method = colorMethod(ep.method).padEnd(18);\n console.log(` ${method} ${ep.path} ${chalk.dim(ep.summary)}`);\n }\n }\n console.log();\n}\n\nexport async function runApiRequest(endpoint: string, options: ApiCommandOptions): Promise<void> {\n const body = await resolveBody(options);\n const hasBody = body !== undefined;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n const baseUrl = resolveApiBaseUrl();\n\n if (options.dryRun) {\n if (isJsonMode()) {\n let parsedBody: unknown;\n if (hasBody) {\n try {\n parsedBody = JSON.parse(body);\n } catch {\n exitWithError({ code: 'invalid_json_body', message: 'Request body is not valid JSON.' });\n }\n }\n outputJson({\n dryRun: true,\n method,\n url: `${baseUrl}${normalizePath(endpoint)}`,\n body: parsedBody,\n });\n } else {\n console.log(`${chalk.dim('[dry-run]')} ${method} ${baseUrl}${normalizePath(endpoint)}`);\n if (hasBody) prettyPrint(body);\n }\n return;\n }\n\n if (MUTATING_METHODS.has(method) && !options.yes) {\n const confirmCommand = buildConfirmationCommand(endpoint, method, options);\n if (!isPromptAllowed()) {\n exitWithError({\n code: 'confirmation_required',\n message: isCiMode()\n ? `Mutating requests in CI mode require --yes. Refusing to ${method} ${endpoint}.`\n : `Mutating requests in agent mode require --yes. Refusing to ${method} ${endpoint}.`,\n recovery: confirmationRecovery(confirmCommand),\n });\n }\n if (isJsonMode()) {\n exitWithError({\n code: 'confirmation_required',\n message: 'Mutating requests in JSON mode require --yes to keep stdout machine-readable.',\n recovery: confirmationRecovery(confirmCommand),\n });\n }\n const clack = (await import('../../utils/clack.js')).default;\n console.log(`\\n${chalk.yellow('About to')} ${method} ${endpoint}`);\n if (hasBody) prettyPrint(body);\n const ok = await clack.confirm({ message: 'Proceed?' });\n if (!ok || clack.isCancel(ok)) {\n process.exit(0);\n }\n }\n\n const response = await apiRequest({\n method,\n path: normalizePath(endpoint),\n apiKey: options.apiKey,\n body,\n baseUrl,\n });\n\n printResponse(response, { includeStatus: options.include });\n\n if (response.status >= 400) {\n process.exit(1);\n }\n}\n\nfunction normalizePath(path: string): string {\n if (!path.startsWith('/')) return `/${path}`;\n return path;\n}\n\nfunction buildConfirmationCommand(endpoint: string, method: string, options: ApiCommandOptions): string | undefined {\n if (options.apiKey || options.file === '-') {\n return undefined;\n }\n\n const args = ['api', endpoint, '--method', method];\n if (options.data !== undefined) {\n args.push(`--data=${options.data}`);\n }\n if (options.file) {\n args.push(`--file=${options.file}`);\n }\n if (options.include) {\n args.push('--include');\n }\n args.push('--yes');\n return formatWorkOSCommandArgs(args);\n}\n\nasync function resolveBody(options: ApiCommandOptions): Promise<string | undefined> {\n if (options.data !== undefined) return options.data;\n if (options.file) {\n if (options.file === '-') {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const stdinBody = Buffer.concat(chunks).toString('utf-8');\n if (stdinBody.length === 0) {\n exitWithError({\n code: 'empty_stdin_body',\n message:\n 'Reading request body from stdin (--file -) yielded no data. Pipe data into the command or pass --data instead.',\n });\n }\n return stdinBody;\n }\n try {\n return await readFile(options.file, 'utf-8');\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n exitWithError({\n code: 'file_read_error',\n message: `Could not read request body file \"${options.file}\": ${message}`,\n });\n }\n }\n return undefined;\n}\n\nfunction prettyPrint(jsonString: string): void {\n try {\n console.log(JSON.stringify(JSON.parse(jsonString), null, 2));\n } catch {\n console.log(jsonString);\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { readFile } from 'node:fs/promises';\nimport { loadCatalog, endpointsByTag } from './catalog.js';\nimport { apiRequest } from './request.js';\nimport { resolveApiBaseUrl } from '../../lib/api-key.js';\nimport { exitWithError, isJsonMode, outputJson } from '../../utils/output.js';\nimport { ExitCode, exitWithCode } from '../../utils/exit-codes.js';\nimport { isCiMode, isPromptAllowed } from '../../utils/interaction-mode.js';\nimport { confirmationRecovery } from '../../utils/recovery-hints.js';\nimport { formatWorkOSCommandArgs } from '../../utils/command-invocation.js';\nimport { colorMethod, printResponse } from './format.js';\n\nexport { colorMethod } from './format.js';\n\nexport interface ApiCommandOptions {\n method?: string;\n data?: string;\n file?: string;\n include?: boolean;\n apiKey?: string;\n dryRun?: boolean;\n yes?: boolean;\n}\n\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\nexport async function runApiInteractive(options?: { apiKey?: string }): Promise<void> {\n // Interactive mode is inherently human-oriented (clack prompts, preview text,\n // etc.). Refuse to enter it whenever JSON output was requested, regardless of\n // TTY status, so stdout stays machine-readable.\n if (isJsonMode()) {\n exitWithError({\n code: 'tty_required',\n message: 'Interactive mode is not available with --json. Provide an endpoint or use `workos api ls`.',\n details: {\n usage: ['workos api <endpoint>', 'workos api ls [filter]'],\n },\n });\n }\n\n if (!isPromptAllowed()) {\n exitWithError({\n code: 'tty_required',\n message:\n 'Interactive API mode requires human mode. Usage: workos api <endpoint> or workos api ls [filter]. Example: workos api /user_management/users',\n });\n }\n\n const { apiInteractive } = await import('./interactive.js');\n await apiInteractive({ apiKey: options?.apiKey });\n}\n\nexport async function runApiLs(filter?: string): Promise<void> {\n const catalog = await loadCatalog();\n let endpoints = catalog.endpoints;\n\n if (filter) {\n const lower = filter.toLowerCase();\n endpoints = endpoints.filter(\n (e) =>\n e.path.toLowerCase().includes(lower) ||\n e.tag.toLowerCase().includes(lower) ||\n e.summary.toLowerCase().includes(lower) ||\n e.operationId.toLowerCase().includes(lower),\n );\n }\n\n if (isJsonMode()) {\n outputJson({\n data: endpoints.map((e) => ({\n method: e.method,\n path: e.path,\n summary: e.summary,\n tag: e.tag,\n })),\n });\n return;\n }\n\n if (endpoints.length === 0) {\n console.log(filter ? `No endpoints matching \"${filter}\".` : 'No endpoints found.');\n return;\n }\n\n const grouped = endpointsByTag(endpoints);\n\n for (const [tag, eps] of grouped) {\n console.log(`\\n${chalk.bold(tag)}`);\n for (const ep of eps) {\n const method = colorMethod(ep.method).padEnd(18);\n console.log(` ${method} ${ep.path} ${chalk.dim(ep.summary)}`);\n }\n }\n console.log();\n}\n\nexport async function runApiRequest(endpoint: string, options: ApiCommandOptions): Promise<void> {\n const body = await resolveBody(options);\n const hasBody = body !== undefined;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n const baseUrl = resolveApiBaseUrl();\n\n if (options.dryRun) {\n if (isJsonMode()) {\n let parsedBody: unknown;\n if (hasBody) {\n try {\n parsedBody = JSON.parse(body);\n } catch {\n exitWithError({ code: 'invalid_json_body', message: 'Request body is not valid JSON.' });\n }\n }\n outputJson({\n dryRun: true,\n method,\n url: `${baseUrl}${normalizePath(endpoint)}`,\n body: parsedBody,\n });\n } else {\n console.log(`${chalk.dim('[dry-run]')} ${method} ${baseUrl}${normalizePath(endpoint)}`);\n if (hasBody) prettyPrint(body);\n }\n return;\n }\n\n if (MUTATING_METHODS.has(method) && !options.yes) {\n const confirmCommand = buildConfirmationCommand(endpoint, method, options);\n if (!isPromptAllowed()) {\n exitWithError({\n code: 'confirmation_required',\n message: isCiMode()\n ? `Mutating requests in CI mode require --yes. Refusing to ${method} ${endpoint}.`\n : `Mutating requests in agent mode require --yes. Refusing to ${method} ${endpoint}.`,\n recovery: confirmationRecovery(confirmCommand),\n });\n }\n if (isJsonMode()) {\n exitWithError({\n code: 'confirmation_required',\n message: 'Mutating requests in JSON mode require --yes to keep stdout machine-readable.',\n recovery: confirmationRecovery(confirmCommand),\n });\n }\n const clack = (await import('../../utils/clack.js')).default;\n console.log(`\\n${chalk.yellow('About to')} ${method} ${endpoint}`);\n if (hasBody) prettyPrint(body);\n const ok = await clack.confirm({ message: 'Proceed?' });\n if (!ok || clack.isCancel(ok)) {\n exitWithCode(ExitCode.CANCELLED);\n }\n }\n\n const response = await apiRequest({\n method,\n path: normalizePath(endpoint),\n apiKey: options.apiKey,\n body,\n baseUrl,\n });\n\n printResponse(response, { includeStatus: options.include });\n\n if (response.status >= 400) {\n exitWithError({\n code: `http_${response.status}`,\n message: `API request failed with status ${response.status}`,\n apiContext: { status: response.status },\n });\n }\n}\n\nfunction normalizePath(path: string): string {\n if (!path.startsWith('/')) return `/${path}`;\n return path;\n}\n\nfunction buildConfirmationCommand(endpoint: string, method: string, options: ApiCommandOptions): string | undefined {\n if (options.apiKey || options.file === '-') {\n return undefined;\n }\n\n const args = ['api', endpoint, '--method', method];\n if (options.data !== undefined) {\n args.push(`--data=${options.data}`);\n }\n if (options.file) {\n args.push(`--file=${options.file}`);\n }\n if (options.include) {\n args.push('--include');\n }\n args.push('--yes');\n return formatWorkOSCommandArgs(args);\n}\n\nasync function resolveBody(options: ApiCommandOptions): Promise<string | undefined> {\n if (options.data !== undefined) return options.data;\n if (options.file) {\n if (options.file === '-') {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const stdinBody = Buffer.concat(chunks).toString('utf-8');\n if (stdinBody.length === 0) {\n exitWithError({\n code: 'empty_stdin_body',\n message:\n 'Reading request body from stdin (--file -) yielded no data. Pipe data into the command or pass --data instead.',\n });\n }\n return stdinBody;\n }\n try {\n return await readFile(options.file, 'utf-8');\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n exitWithError({\n code: 'file_read_error',\n message: `Could not read request body file \"${options.file}\": ${message}`,\n });\n }\n }\n return undefined;\n}\n\nfunction prettyPrint(jsonString: string): void {\n try {\n console.log(JSON.stringify(JSON.parse(jsonString), null, 2));\n } catch {\n console.log(jsonString);\n }\n}\n"]}
@@ -3,9 +3,11 @@ import { loadCatalog, endpointsByTag } from './catalog.js';
3
3
  import { apiRequest } from './request.js';
4
4
  import { colorMethod, printResponse } from './format.js';
5
5
  import { resolveApiKey, resolveApiBaseUrl } from '../../lib/api-key.js';
6
+ import { ExitCode, exitWithCode } from '../../utils/exit-codes.js';
7
+ import { exitWithError } from '../../utils/output.js';
6
8
  function assertNotCancelled(value) {
7
9
  if (clack.isCancel(value))
8
- process.exit(0);
10
+ exitWithCode(ExitCode.CANCELLED);
9
11
  return value;
10
12
  }
11
13
  export async function apiInteractive(options) {
@@ -111,7 +113,7 @@ export async function apiInteractive(options) {
111
113
  console.log();
112
114
  const ok = assertNotCancelled(await clack.confirm({ message: 'Execute this request?' }));
113
115
  if (!ok)
114
- process.exit(0);
116
+ exitWithCode(ExitCode.CANCELLED);
115
117
  const response = await apiRequest({
116
118
  method: ep.method,
117
119
  path: fullPath,
@@ -121,7 +123,11 @@ export async function apiInteractive(options) {
121
123
  });
122
124
  printResponse(response, { includeStatus: true });
123
125
  if (response.status >= 400) {
124
- process.exit(1);
126
+ exitWithError({
127
+ code: `http_${response.status}`,
128
+ message: `API request failed with status ${response.status}`,
129
+ apiContext: { status: response.status },
130
+ });
125
131
  }
126
132
  }
127
133
  //# sourceMappingURL=interactive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../../src/commands/api/interactive.ts"],"names":[],"mappings":"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","sourcesContent":["import clack from '../../utils/clack.js';\nimport { loadCatalog, endpointsByTag, type EndpointInfo } from './catalog.js';\nimport { apiRequest } from './request.js';\nimport { colorMethod, printResponse } from './format.js';\nimport { resolveApiKey, resolveApiBaseUrl } from '../../lib/api-key.js';\n\nfunction assertNotCancelled<T>(value: T | symbol): T {\n if (clack.isCancel(value)) process.exit(0);\n return value as T;\n}\n\nexport async function apiInteractive(options?: { apiKey?: string }): Promise<void> {\n const catalog = await loadCatalog();\n const grouped = endpointsByTag(catalog.endpoints);\n\n const tag = assertNotCancelled(\n await clack.select({\n message: 'Select a category:',\n options: catalog.tags.map((t) => {\n const count = grouped.get(t)?.length ?? 0;\n return { value: t, label: `${t} (${count})` };\n }),\n }),\n );\n\n const endpoints = grouped.get(tag)!;\n const ep = assertNotCancelled(\n await clack.select<EndpointInfo>({\n message: 'Select an endpoint:',\n options: endpoints.map((e) => ({\n value: e,\n label: `${colorMethod(e.method).padEnd(18)} ${e.path}`,\n hint: e.summary,\n })),\n }),\n );\n\n let resolvedPath = ep.path;\n for (const param of ep.pathParams) {\n const value = assertNotCancelled(\n await clack.text({\n message: `${param.name}:`,\n placeholder: param.description || undefined,\n validate: (v) => {\n if (!v?.trim()) return `${param.name} is required`;\n },\n }),\n );\n resolvedPath = resolvedPath.replaceAll(`{${param.name}}`, encodeURIComponent(value.trim()));\n }\n\n let queryString = '';\n if (ep.queryParams.length > 0) {\n const requiredParams = ep.queryParams.filter((qp) => qp.required);\n const optionalParams = ep.queryParams.filter((qp) => !qp.required);\n const params: string[] = [];\n\n for (const qp of requiredParams) {\n const value = assertNotCancelled(\n await clack.text({\n message: `${qp.name} (required):`,\n placeholder: qp.description || undefined,\n validate: (v) => {\n if (!v?.trim()) return `${qp.name} is required`;\n },\n }),\n );\n params.push(`${encodeURIComponent(qp.name)}=${encodeURIComponent(value.trim())}`);\n }\n\n if (optionalParams.length > 0) {\n const wantsOptional = assertNotCancelled(\n await clack.confirm({\n message: `Add optional query parameters? (${optionalParams.length} available)`,\n initialValue: false,\n }),\n );\n\n if (wantsOptional) {\n for (const qp of optionalParams) {\n const value = assertNotCancelled(\n await clack.text({\n message: `${qp.name}:`,\n placeholder: qp.description || undefined,\n }),\n );\n const trimmed = value.trim();\n if (trimmed) {\n params.push(`${encodeURIComponent(qp.name)}=${encodeURIComponent(trimmed)}`);\n }\n }\n }\n }\n\n if (params.length > 0) {\n queryString = `?${params.join('&')}`;\n }\n }\n\n let body: string | undefined;\n if (ep.hasRequestBody) {\n let collectBody = ep.requestBodyRequired;\n if (!collectBody) {\n collectBody = assertNotCancelled(\n await clack.confirm({\n message: 'Provide a request body?',\n initialValue: ep.method === 'POST' || ep.method === 'PUT',\n }),\n );\n }\n\n if (collectBody) {\n body = assertNotCancelled(\n await clack.text({\n message: 'Request body (JSON):',\n placeholder: '{\"key\": \"value\"}',\n validate: (v) => {\n if (!v?.trim()) return 'Body cannot be empty';\n try {\n JSON.parse(v);\n } catch {\n return 'Invalid JSON';\n }\n },\n }),\n ).trim();\n }\n }\n\n const fullPath = `${resolvedPath}${queryString}`;\n\n console.log(`\\n ${colorMethod(ep.method)} ${fullPath}`);\n if (body) {\n console.log(JSON.stringify(JSON.parse(body), null, 2));\n }\n console.log();\n\n const ok = assertNotCancelled(await clack.confirm({ message: 'Execute this request?' }));\n if (!ok) process.exit(0);\n\n const response = await apiRequest({\n method: ep.method,\n path: fullPath,\n apiKey: options?.apiKey ?? resolveApiKey(),\n baseUrl: resolveApiBaseUrl(),\n body,\n });\n\n printResponse(response, { includeStatus: true });\n\n if (response.status >= 400) {\n process.exit(1);\n }\n}\n"]}
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../../src/commands/api/interactive.ts"],"names":[],"mappings":"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","sourcesContent":["import clack from '../../utils/clack.js';\nimport { loadCatalog, endpointsByTag, type EndpointInfo } from './catalog.js';\nimport { apiRequest } from './request.js';\nimport { colorMethod, printResponse } from './format.js';\nimport { resolveApiKey, resolveApiBaseUrl } from '../../lib/api-key.js';\nimport { ExitCode, exitWithCode } from '../../utils/exit-codes.js';\nimport { exitWithError } from '../../utils/output.js';\n\nfunction assertNotCancelled<T>(value: T | symbol): T {\n if (clack.isCancel(value)) exitWithCode(ExitCode.CANCELLED);\n return value as T;\n}\n\nexport async function apiInteractive(options?: { apiKey?: string }): Promise<void> {\n const catalog = await loadCatalog();\n const grouped = endpointsByTag(catalog.endpoints);\n\n const tag = assertNotCancelled(\n await clack.select({\n message: 'Select a category:',\n options: catalog.tags.map((t) => {\n const count = grouped.get(t)?.length ?? 0;\n return { value: t, label: `${t} (${count})` };\n }),\n }),\n );\n\n const endpoints = grouped.get(tag)!;\n const ep = assertNotCancelled(\n await clack.select<EndpointInfo>({\n message: 'Select an endpoint:',\n options: endpoints.map((e) => ({\n value: e,\n label: `${colorMethod(e.method).padEnd(18)} ${e.path}`,\n hint: e.summary,\n })),\n }),\n );\n\n let resolvedPath = ep.path;\n for (const param of ep.pathParams) {\n const value = assertNotCancelled(\n await clack.text({\n message: `${param.name}:`,\n placeholder: param.description || undefined,\n validate: (v) => {\n if (!v?.trim()) return `${param.name} is required`;\n },\n }),\n );\n resolvedPath = resolvedPath.replaceAll(`{${param.name}}`, encodeURIComponent(value.trim()));\n }\n\n let queryString = '';\n if (ep.queryParams.length > 0) {\n const requiredParams = ep.queryParams.filter((qp) => qp.required);\n const optionalParams = ep.queryParams.filter((qp) => !qp.required);\n const params: string[] = [];\n\n for (const qp of requiredParams) {\n const value = assertNotCancelled(\n await clack.text({\n message: `${qp.name} (required):`,\n placeholder: qp.description || undefined,\n validate: (v) => {\n if (!v?.trim()) return `${qp.name} is required`;\n },\n }),\n );\n params.push(`${encodeURIComponent(qp.name)}=${encodeURIComponent(value.trim())}`);\n }\n\n if (optionalParams.length > 0) {\n const wantsOptional = assertNotCancelled(\n await clack.confirm({\n message: `Add optional query parameters? (${optionalParams.length} available)`,\n initialValue: false,\n }),\n );\n\n if (wantsOptional) {\n for (const qp of optionalParams) {\n const value = assertNotCancelled(\n await clack.text({\n message: `${qp.name}:`,\n placeholder: qp.description || undefined,\n }),\n );\n const trimmed = value.trim();\n if (trimmed) {\n params.push(`${encodeURIComponent(qp.name)}=${encodeURIComponent(trimmed)}`);\n }\n }\n }\n }\n\n if (params.length > 0) {\n queryString = `?${params.join('&')}`;\n }\n }\n\n let body: string | undefined;\n if (ep.hasRequestBody) {\n let collectBody = ep.requestBodyRequired;\n if (!collectBody) {\n collectBody = assertNotCancelled(\n await clack.confirm({\n message: 'Provide a request body?',\n initialValue: ep.method === 'POST' || ep.method === 'PUT',\n }),\n );\n }\n\n if (collectBody) {\n body = assertNotCancelled(\n await clack.text({\n message: 'Request body (JSON):',\n placeholder: '{\"key\": \"value\"}',\n validate: (v) => {\n if (!v?.trim()) return 'Body cannot be empty';\n try {\n JSON.parse(v);\n } catch {\n return 'Invalid JSON';\n }\n },\n }),\n ).trim();\n }\n }\n\n const fullPath = `${resolvedPath}${queryString}`;\n\n console.log(`\\n ${colorMethod(ep.method)} ${fullPath}`);\n if (body) {\n console.log(JSON.stringify(JSON.parse(body), null, 2));\n }\n console.log();\n\n const ok = assertNotCancelled(await clack.confirm({ message: 'Execute this request?' }));\n if (!ok) exitWithCode(ExitCode.CANCELLED);\n\n const response = await apiRequest({\n method: ep.method,\n path: fullPath,\n apiKey: options?.apiKey ?? resolveApiKey(),\n baseUrl: resolveApiBaseUrl(),\n body,\n });\n\n printResponse(response, { includeStatus: true });\n\n if (response.status >= 400) {\n exitWithError({\n code: `http_${response.status}`,\n message: `API request failed with status ${response.status}`,\n apiContext: { status: response.status },\n });\n }\n}\n"]}
@@ -6,11 +6,12 @@ export declare function runDebugReset({ force, credentialsOnly, configOnly, }: {
6
6
  credentialsOnly: boolean;
7
7
  configOnly: boolean;
8
8
  }): Promise<void>;
9
- export declare function runDebugSimulate({ expiredToken, noKeyring, unclaimed, noAuth, }: {
9
+ export declare function runDebugSimulate({ expiredToken, noKeyring, unclaimed, noAuth, crash, }: {
10
10
  expiredToken: boolean;
11
11
  noKeyring: boolean;
12
12
  unclaimed: boolean;
13
13
  noAuth: boolean;
14
+ crash?: boolean;
14
15
  }): Promise<void>;
15
16
  export declare function runDebugEnv(): Promise<void>;
16
17
  export declare function runDebugToken(): Promise<void>;
@@ -2,6 +2,7 @@ import chalk from 'chalk';
2
2
  import clack from '../utils/clack.js';
3
3
  import { getCredentials, saveCredentials, clearCredentials, isTokenExpired, diagnoseCredentials, getCredentialsPath, setInsecureStorage, } from '../lib/credentials.js';
4
4
  import { getConfig, saveConfig, clearConfig, getConfigPath, setInsecureConfigStorage, diagnoseConfig, } from '../lib/config-store.js';
5
+ import { clearPreferences, getPreferencesPath, getTelemetrySource, isNoticeShown, isTelemetryEnabled, isTelemetryOptedOut, } from '../lib/preferences.js';
5
6
  import { isJsonMode, outputJson, exitWithError } from '../utils/output.js';
6
7
  import { isPromptAllowed } from '../utils/interaction-mode.js';
7
8
  function maskSecret(value) {
@@ -94,12 +95,20 @@ export async function runDebugState({ showSecrets }) {
94
95
  const configDiagnostics = diagnoseConfig();
95
96
  const configSource = determineCredentialSource(configDiagnostics);
96
97
  configOutput.source = configSource;
98
+ const telemetryOutput = {
99
+ enabled: isTelemetryEnabled(),
100
+ optedOut: isTelemetryOptedOut(),
101
+ source: getTelemetrySource(),
102
+ noticeShown: isNoticeShown(),
103
+ };
97
104
  const result = {
98
105
  credentials: credentialsOutput,
99
106
  config: configOutput,
107
+ telemetry: telemetryOutput,
100
108
  storage: {
101
109
  credentialsPath: getCredentialsPath(),
102
110
  configPath: getConfigPath(),
111
+ preferencesPath: getPreferencesPath(),
103
112
  credentialDiagnostics: diagnostics,
104
113
  configDiagnostics,
105
114
  },
@@ -136,6 +145,12 @@ export async function runDebugState({ showSecrets }) {
136
145
  }
137
146
  }
138
147
  console.log();
148
+ console.log(chalk.bold('Telemetry'));
149
+ console.log(` enabled: ${telemetryOutput.enabled ? chalk.green('true') : chalk.yellow('false')}`);
150
+ console.log(` optedOut: ${telemetryOutput.optedOut ? chalk.yellow('true') : 'false'}`);
151
+ console.log(` source: ${telemetryOutput.source}`);
152
+ console.log(` notice: ${telemetryOutput.noticeShown ? 'shown' : chalk.dim('not shown')}`);
153
+ console.log();
139
154
  console.log(chalk.bold('Storage — Credentials'));
140
155
  console.log(` path: ${getCredentialsPath()}`);
141
156
  for (const line of diagnostics) {
@@ -147,13 +162,28 @@ export async function runDebugState({ showSecrets }) {
147
162
  for (const line of configDiagnostics) {
148
163
  console.log(` ${chalk.dim(line)}`);
149
164
  }
165
+ console.log();
166
+ console.log(chalk.bold('Storage — Preferences'));
167
+ console.log(` path: ${getPreferencesPath()}`);
150
168
  }
151
169
  // --- debug reset ---
170
+ /** Join names with an Oxford comma: ["a","b","c"] => "a, b, and c". */
171
+ function formatList(items) {
172
+ if (items.length <= 1)
173
+ return items.join('');
174
+ if (items.length === 2)
175
+ return `${items[0]} and ${items[1]}`;
176
+ return `${items.slice(0, -1).join(', ')}, and ${items[items.length - 1]}`;
177
+ }
152
178
  export async function runDebugReset({ force, credentialsOnly, configOnly, }) {
153
179
  // Both flags = clear both (same as neither)
154
180
  const clearCreds = !configOnly || credentialsOnly;
155
181
  const clearConf = !credentialsOnly || configOnly;
156
- const targets = [clearCreds && 'credentials', clearConf && 'config'].filter(Boolean).join(' and ');
182
+ // Preferences (~/.workos/preferences.json) are non-secret local CLI state, so
183
+ // they ride with the config target. Clearing config returns the CLI to a
184
+ // fresh-install state, which includes resetting the telemetry preference.
185
+ const clearPrefs = clearConf;
186
+ const targets = formatList([clearCreds && 'credentials', clearConf && 'config', clearPrefs && 'preferences'].filter(Boolean));
157
187
  if (!force) {
158
188
  if (!isPromptAllowed()) {
159
189
  exitWithError({
@@ -178,15 +208,23 @@ export async function runDebugReset({ force, credentialsOnly, configOnly, }) {
178
208
  clearCredentials();
179
209
  if (clearConf)
180
210
  clearConfig();
211
+ if (clearPrefs)
212
+ clearPreferences();
181
213
  if (isJsonMode()) {
182
- outputJson({ cleared: true, credentials: clearCreds, config: clearConf });
214
+ outputJson({ cleared: true, credentials: clearCreds, config: clearConf, preferences: clearPrefs });
183
215
  }
184
216
  else {
185
217
  clack.log.success(`Cleared ${targets}`);
186
218
  }
187
219
  }
188
220
  // --- debug simulate ---
189
- export async function runDebugSimulate({ expiredToken, noKeyring, unclaimed, noAuth, }) {
221
+ export async function runDebugSimulate({ expiredToken, noKeyring, unclaimed, noAuth, crash = false, }) {
222
+ // Simulate an unexpected crash to exercise the crash-telemetry pipeline
223
+ // end-to-end. Throws a plain Error (not CliExit) so the bin.ts lifecycle
224
+ // records a `crash` event with a sanitized stack rather than a handled exit.
225
+ if (crash) {
226
+ throw new Error('Simulated crash for telemetry verification');
227
+ }
190
228
  // Validate: at least one flag
191
229
  if (!expiredToken && !noKeyring && !unclaimed && !noAuth) {
192
230
  exitWithError({
@@ -254,6 +292,7 @@ export async function runDebugSimulate({ expiredToken, noKeyring, unclaimed, noA
254
292
  }
255
293
  }
256
294
  const ENV_VAR_CATALOG = [
295
+ { name: 'WORKOS_DEBUG', effect: 'Set to "1" to enable verbose debug logging for all commands' },
257
296
  { name: 'WORKOS_API_KEY', effect: 'Bypasses credential resolution — used directly for API calls' },
258
297
  { name: 'WORKOS_MODE', effect: 'Controls interaction behavior: human, agent, or CI' },
259
298
  { name: 'WORKOS_FORCE_TTY', effect: 'Forces human (non-JSON) output mode, even when piped' },
@@ -263,6 +302,7 @@ const ENV_VAR_CATALOG = [
263
302
  { name: 'WORKOS_DASHBOARD_URL', effect: 'Overrides dashboard URL (default: https://dashboard.workos.com)' },
264
303
  { name: 'WORKOS_AUTHKIT_DOMAIN', effect: 'Overrides AuthKit domain from settings' },
265
304
  { name: 'WORKOS_LLM_GATEWAY_URL', effect: 'Overrides LLM gateway URL from settings' },
305
+ { name: 'WORKOS_TELEMETRY_URL', effect: 'Overrides CLI telemetry URL from settings' },
266
306
  { name: 'INSTALLER_DEV', effect: 'Enables dev mode — loads .env.local at startup' },
267
307
  { name: 'INSTALLER_DISABLE_PROXY', effect: 'Disables the credential proxy for gateway auth' },
268
308
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport clack from '../utils/clack.js';\nimport {\n getCredentials,\n saveCredentials,\n clearCredentials,\n isTokenExpired,\n diagnoseCredentials,\n getCredentialsPath,\n setInsecureStorage,\n} from '../lib/credentials.js';\nimport {\n getConfig,\n saveConfig,\n clearConfig,\n getConfigPath,\n setInsecureConfigStorage,\n diagnoseConfig,\n} from '../lib/config-store.js';\nimport { isJsonMode, outputJson, exitWithError } from '../utils/output.js';\nimport { isPromptAllowed } from '../utils/interaction-mode.js';\n\nfunction maskSecret(value: string | undefined): string | undefined {\n if (!value) return undefined;\n if (value.length <= 8) return '****';\n return value.slice(0, 4) + '****' + value.slice(-4);\n}\n\nfunction formatTimeRemaining(ms: number): string {\n if (ms <= 0) return 'expired';\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n}\n\nfunction parseJwt(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));\n } catch {\n return null;\n }\n}\n\nfunction determineCredentialSource(diagnostics: string[]): 'keyring' | 'file' | 'none' {\n const hasKeyring = diagnostics.some((l) => l.startsWith('keyring: found'));\n const hasFile = diagnostics.some((l) => l.includes('exists=true'));\n const isInsecure = diagnostics.some((l) => l.includes('insecureStorage=true'));\n\n if (isInsecure) return hasFile ? 'file' : 'none';\n if (hasKeyring) return 'keyring';\n if (hasFile) return 'file';\n return 'none';\n}\n\n// --- debug state ---\n\nexport async function runDebugState({ showSecrets }: { showSecrets: boolean }): Promise<void> {\n const creds = getCredentials();\n const config = getConfig();\n const diagnostics = diagnoseCredentials();\n const credSource = determineCredentialSource(diagnostics);\n const maybeRedact = showSecrets ? (v: string | undefined) => v : maskSecret;\n\n const credentialsOutput: Record<string, unknown> = { present: !!creds, source: credSource };\n\n if (creds) {\n const timeRemaining = creds.expiresAt - Date.now();\n const expired = isTokenExpired(creds);\n Object.assign(credentialsOutput, {\n userId: creds.userId,\n email: creds.email ?? null,\n accessToken: maybeRedact(creds.accessToken),\n refreshToken: creds.refreshToken ? 'present' : 'absent',\n expiresAt: creds.expiresAt,\n expiresIn: expired\n ? `expired ${formatTimeRemaining(-timeRemaining)} ago`\n : `in ${formatTimeRemaining(timeRemaining)}`,\n isExpired: expired,\n });\n if (creds.staging) {\n credentialsOutput.staging = {\n clientId: creds.staging.clientId,\n apiKey: maybeRedact(creds.staging.apiKey),\n fetchedAt: creds.staging.fetchedAt,\n };\n }\n }\n\n const configOutput: Record<string, unknown> = { present: !!config };\n\n if (config) {\n configOutput.activeEnvironment = config.activeEnvironment ?? null;\n configOutput.environments = Object.fromEntries(\n Object.entries(config.environments).map(([key, env]) => [\n key,\n {\n name: env.name,\n type: env.type,\n apiKey: maybeRedact(env.apiKey),\n clientId: env.clientId ?? null,\n endpoint: env.endpoint ?? null,\n ...(env.type === 'unclaimed' && { claimToken: maybeRedact(env.claimToken) }),\n },\n ]),\n );\n }\n\n const configDiagnostics = diagnoseConfig();\n const configSource = determineCredentialSource(configDiagnostics);\n configOutput.source = configSource;\n\n const result = {\n credentials: credentialsOutput,\n config: configOutput,\n storage: {\n credentialsPath: getCredentialsPath(),\n configPath: getConfigPath(),\n credentialDiagnostics: diagnostics,\n configDiagnostics,\n },\n };\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n console.log(chalk.bold('Credentials'));\n console.log(` present: ${creds ? chalk.green('true') : chalk.yellow('false')}`);\n console.log(` source: ${credSource}`);\n if (creds) {\n console.log(` userId: ${creds.userId}`);\n console.log(` email: ${creds.email ?? chalk.dim('none')}`);\n console.log(` token: ${maybeRedact(creds.accessToken)}`);\n console.log(` refresh: ${creds.refreshToken ? 'present' : 'absent'}`);\n const expired = isTokenExpired(creds);\n const timeRemaining = creds.expiresAt - Date.now();\n console.log(\n ` expires: ${expired ? chalk.red(`expired ${formatTimeRemaining(-timeRemaining)} ago`) : chalk.green(`in ${formatTimeRemaining(timeRemaining)}`)}`,\n );\n if (creds.staging) {\n console.log(` staging: clientId=${creds.staging.clientId} apiKey=${maybeRedact(creds.staging.apiKey)}`);\n }\n }\n\n console.log();\n console.log(chalk.bold('Config'));\n console.log(` present: ${config ? chalk.green('true') : chalk.yellow('false')}`);\n console.log(` source: ${configSource}`);\n if (config) {\n console.log(` active: ${config.activeEnvironment ?? chalk.dim('none')}`);\n for (const [key, env] of Object.entries(config.environments)) {\n console.log(` env[${key}]: type=${env.type} apiKey=${maybeRedact(env.apiKey)}`);\n if (env.type === 'unclaimed') console.log(` claimToken=${maybeRedact(env.claimToken)}`);\n }\n }\n\n console.log();\n console.log(chalk.bold('Storage — Credentials'));\n console.log(` path: ${getCredentialsPath()}`);\n for (const line of diagnostics) {\n console.log(` ${chalk.dim(line)}`);\n }\n\n console.log();\n console.log(chalk.bold('Storage — Config'));\n console.log(` path: ${getConfigPath()}`);\n for (const line of configDiagnostics) {\n console.log(` ${chalk.dim(line)}`);\n }\n}\n\n// --- debug reset ---\n\nexport async function runDebugReset({\n force,\n credentialsOnly,\n configOnly,\n}: {\n force: boolean;\n credentialsOnly: boolean;\n configOnly: boolean;\n}): Promise<void> {\n // Both flags = clear both (same as neither)\n const clearCreds = !configOnly || credentialsOnly;\n const clearConf = !credentialsOnly || configOnly;\n\n const targets = [clearCreds && 'credentials', clearConf && 'config'].filter(Boolean).join(' and ');\n\n if (!force) {\n if (!isPromptAllowed()) {\n exitWithError({\n code: 'non_interactive_reset',\n message: 'Use --force to reset in agent or CI mode',\n });\n }\n\n const confirmed = await clack.confirm({\n message: `Clear all ${targets}? This cannot be undone.`,\n });\n\n if (clack.isCancel(confirmed) || !confirmed) {\n if (isJsonMode()) {\n outputJson({ cleared: false, cancelled: true });\n } else {\n clack.log.info('Reset cancelled');\n }\n return;\n }\n }\n\n if (clearCreds) clearCredentials();\n if (clearConf) clearConfig();\n\n if (isJsonMode()) {\n outputJson({ cleared: true, credentials: clearCreds, config: clearConf });\n } else {\n clack.log.success(`Cleared ${targets}`);\n }\n}\n\n// --- debug simulate ---\n\nexport async function runDebugSimulate({\n expiredToken,\n noKeyring,\n unclaimed,\n noAuth,\n}: {\n expiredToken: boolean;\n noKeyring: boolean;\n unclaimed: boolean;\n noAuth: boolean;\n}): Promise<void> {\n // Validate: at least one flag\n if (!expiredToken && !noKeyring && !unclaimed && !noAuth) {\n exitWithError({\n code: 'no_simulation_flags',\n message: 'Specify at least one simulation flag: --expired-token, --no-keyring, --unclaimed, --no-auth',\n });\n }\n\n // Validate: contradictory\n if (expiredToken && noAuth) {\n exitWithError({\n code: 'contradictory_flags',\n message: \"Cannot combine --expired-token and --no-auth (can't expire a cleared token)\",\n });\n }\n\n const actions: string[] = [];\n\n // Apply in order: storage tier first, then credential mutations, then config mutations\n\n if (noKeyring) {\n // Migrate current state to file storage\n const creds = getCredentials();\n const config = getConfig();\n\n setInsecureStorage(true);\n setInsecureConfigStorage(true);\n\n if (creds) saveCredentials(creds);\n if (config) saveConfig(config);\n\n actions.push('Forced file-only storage (keyring bypassed)');\n }\n\n if (expiredToken) {\n const creds = getCredentials();\n if (!creds) {\n exitWithError({\n code: 'no_credentials',\n message: 'Cannot simulate expired token — no credentials found. Log in first.',\n });\n }\n saveCredentials({ ...creds, expiresAt: Date.now() - 60_000 });\n actions.push('Set token expiresAt to 1 minute ago');\n }\n\n if (noAuth) {\n clearCredentials();\n actions.push('Cleared credentials (config preserved)');\n }\n\n if (unclaimed) {\n const config = getConfig() ?? { environments: {} };\n const envName = 'simulated-unclaimed';\n config.environments[envName] = {\n name: envName,\n type: 'unclaimed',\n apiKey: 'sk_test_simulated_unclaimed_000000000000',\n clientId: 'client_simulated',\n claimToken: 'claim_simulated_token_000000000000',\n };\n config.activeEnvironment = envName;\n saveConfig(config);\n actions.push(`Created unclaimed environment \"${envName}\" and set as active`);\n }\n\n if (isJsonMode()) {\n outputJson({ simulated: true, actions });\n } else {\n for (const action of actions) {\n clack.log.success(action);\n }\n }\n}\n\n// --- debug env ---\n\ninterface EnvVarInfo {\n name: string;\n value: string | undefined;\n effect: string;\n}\n\nconst ENV_VAR_CATALOG: { name: string; effect: string }[] = [\n { name: 'WORKOS_API_KEY', effect: 'Bypasses credential resolution — used directly for API calls' },\n { name: 'WORKOS_MODE', effect: 'Controls interaction behavior: human, agent, or CI' },\n { name: 'WORKOS_FORCE_TTY', effect: 'Forces human (non-JSON) output mode, even when piped' },\n { name: 'WORKOS_NO_PROMPT', effect: 'Legacy compatibility alias for agent interaction behavior and JSON output' },\n { name: 'WORKOS_TELEMETRY', effect: 'Set to \"false\" to disable telemetry' },\n { name: 'WORKOS_API_URL', effect: 'Overrides API base URL (default: https://api.workos.com)' },\n { name: 'WORKOS_DASHBOARD_URL', effect: 'Overrides dashboard URL (default: https://dashboard.workos.com)' },\n { name: 'WORKOS_AUTHKIT_DOMAIN', effect: 'Overrides AuthKit domain from settings' },\n { name: 'WORKOS_LLM_GATEWAY_URL', effect: 'Overrides LLM gateway URL from settings' },\n { name: 'INSTALLER_DEV', effect: 'Enables dev mode — loads .env.local at startup' },\n { name: 'INSTALLER_DISABLE_PROXY', effect: 'Disables the credential proxy for gateway auth' },\n];\n\nexport async function runDebugEnv(): Promise<void> {\n const vars: EnvVarInfo[] = ENV_VAR_CATALOG.map(({ name, effect }) => ({\n name,\n value: process.env[name],\n effect,\n }));\n\n const setVars = vars.filter((v) => v.value !== undefined);\n const unsetVars = vars.filter((v) => v.value === undefined);\n\n if (isJsonMode()) {\n outputJson({\n variables: Object.fromEntries(vars.map((v) => [v.name, { value: v.value ?? null, effect: v.effect }])),\n set: setVars.map((v) => v.name),\n unset: unsetVars.map((v) => v.name),\n });\n return;\n }\n\n if (setVars.length > 0) {\n console.log(chalk.bold('Set'));\n for (const v of setVars) {\n console.log(` ${chalk.green(v.name)}=${v.value}`);\n console.log(` ${chalk.dim(v.effect)}`);\n }\n console.log();\n }\n\n console.log(chalk.bold(`Unset${setVars.length > 0 ? '' : ' (none active)'}`));\n for (const v of unsetVars) {\n console.log(` ${chalk.dim(v.name)} — ${chalk.dim(v.effect)}`);\n }\n}\n\n// --- debug token ---\n\nexport async function runDebugToken(): Promise<void> {\n const creds = getCredentials();\n\n if (!creds) {\n if (isJsonMode()) {\n outputJson({ present: false });\n } else {\n console.log(chalk.yellow('No credentials found'));\n }\n return;\n }\n\n const claims = parseJwt(creds.accessToken);\n const expired = isTokenExpired(creds);\n const timeRemaining = creds.expiresAt - Date.now();\n\n if (isJsonMode()) {\n outputJson({\n present: true,\n format: claims ? 'jwt' : 'opaque',\n expired,\n expiresAt: creds.expiresAt,\n expiresIn: expired\n ? `expired ${formatTimeRemaining(-timeRemaining)} ago`\n : `in ${formatTimeRemaining(timeRemaining)}`,\n claims: claims ?? null,\n refreshToken: { present: !!creds.refreshToken },\n });\n return;\n }\n\n if (claims) {\n console.log(chalk.bold('JWT Token'));\n console.log(\n ` expires: ${expired ? chalk.red(`expired ${formatTimeRemaining(-timeRemaining)} ago`) : chalk.green(`in ${formatTimeRemaining(timeRemaining)}`)}`,\n );\n console.log();\n console.log(chalk.bold('Claims'));\n for (const [key, value] of Object.entries(claims)) {\n if (key === 'exp' || key === 'iat' || key === 'nbf') {\n const date = new Date((value as number) * 1000).toISOString();\n console.log(` ${key}: ${value} (${date})`);\n } else {\n console.log(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n } else {\n console.log(chalk.bold('Opaque Token'));\n console.log(chalk.dim(' Token is not a JWT — cannot decode claims'));\n console.log(\n ` expires: ${expired ? chalk.red(`expired ${formatTimeRemaining(-timeRemaining)} ago`) : chalk.green(`in ${formatTimeRemaining(timeRemaining)}`)}`,\n );\n }\n\n console.log();\n console.log(` refresh token: ${creds.refreshToken ? chalk.green('present') : chalk.yellow('absent')}`);\n}\n"]}
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport clack from '../utils/clack.js';\nimport {\n getCredentials,\n saveCredentials,\n clearCredentials,\n isTokenExpired,\n diagnoseCredentials,\n getCredentialsPath,\n setInsecureStorage,\n} from '../lib/credentials.js';\nimport {\n getConfig,\n saveConfig,\n clearConfig,\n getConfigPath,\n setInsecureConfigStorage,\n diagnoseConfig,\n} from '../lib/config-store.js';\nimport {\n clearPreferences,\n getPreferencesPath,\n getTelemetrySource,\n isNoticeShown,\n isTelemetryEnabled,\n isTelemetryOptedOut,\n} from '../lib/preferences.js';\nimport { isJsonMode, outputJson, exitWithError } from '../utils/output.js';\nimport { isPromptAllowed } from '../utils/interaction-mode.js';\n\nfunction maskSecret(value: string | undefined): string | undefined {\n if (!value) return undefined;\n if (value.length <= 8) return '****';\n return value.slice(0, 4) + '****' + value.slice(-4);\n}\n\nfunction formatTimeRemaining(ms: number): string {\n if (ms <= 0) return 'expired';\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n}\n\nfunction parseJwt(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));\n } catch {\n return null;\n }\n}\n\nfunction determineCredentialSource(diagnostics: string[]): 'keyring' | 'file' | 'none' {\n const hasKeyring = diagnostics.some((l) => l.startsWith('keyring: found'));\n const hasFile = diagnostics.some((l) => l.includes('exists=true'));\n const isInsecure = diagnostics.some((l) => l.includes('insecureStorage=true'));\n\n if (isInsecure) return hasFile ? 'file' : 'none';\n if (hasKeyring) return 'keyring';\n if (hasFile) return 'file';\n return 'none';\n}\n\n// --- debug state ---\n\nexport async function runDebugState({ showSecrets }: { showSecrets: boolean }): Promise<void> {\n const creds = getCredentials();\n const config = getConfig();\n const diagnostics = diagnoseCredentials();\n const credSource = determineCredentialSource(diagnostics);\n const maybeRedact = showSecrets ? (v: string | undefined) => v : maskSecret;\n\n const credentialsOutput: Record<string, unknown> = { present: !!creds, source: credSource };\n\n if (creds) {\n const timeRemaining = creds.expiresAt - Date.now();\n const expired = isTokenExpired(creds);\n Object.assign(credentialsOutput, {\n userId: creds.userId,\n email: creds.email ?? null,\n accessToken: maybeRedact(creds.accessToken),\n refreshToken: creds.refreshToken ? 'present' : 'absent',\n expiresAt: creds.expiresAt,\n expiresIn: expired\n ? `expired ${formatTimeRemaining(-timeRemaining)} ago`\n : `in ${formatTimeRemaining(timeRemaining)}`,\n isExpired: expired,\n });\n if (creds.staging) {\n credentialsOutput.staging = {\n clientId: creds.staging.clientId,\n apiKey: maybeRedact(creds.staging.apiKey),\n fetchedAt: creds.staging.fetchedAt,\n };\n }\n }\n\n const configOutput: Record<string, unknown> = { present: !!config };\n\n if (config) {\n configOutput.activeEnvironment = config.activeEnvironment ?? null;\n configOutput.environments = Object.fromEntries(\n Object.entries(config.environments).map(([key, env]) => [\n key,\n {\n name: env.name,\n type: env.type,\n apiKey: maybeRedact(env.apiKey),\n clientId: env.clientId ?? null,\n endpoint: env.endpoint ?? null,\n ...(env.type === 'unclaimed' && { claimToken: maybeRedact(env.claimToken) }),\n },\n ]),\n );\n }\n\n const configDiagnostics = diagnoseConfig();\n const configSource = determineCredentialSource(configDiagnostics);\n configOutput.source = configSource;\n\n const telemetryOutput = {\n enabled: isTelemetryEnabled(),\n optedOut: isTelemetryOptedOut(),\n source: getTelemetrySource(),\n noticeShown: isNoticeShown(),\n };\n\n const result = {\n credentials: credentialsOutput,\n config: configOutput,\n telemetry: telemetryOutput,\n storage: {\n credentialsPath: getCredentialsPath(),\n configPath: getConfigPath(),\n preferencesPath: getPreferencesPath(),\n credentialDiagnostics: diagnostics,\n configDiagnostics,\n },\n };\n\n if (isJsonMode()) {\n outputJson(result);\n return;\n }\n\n console.log(chalk.bold('Credentials'));\n console.log(` present: ${creds ? chalk.green('true') : chalk.yellow('false')}`);\n console.log(` source: ${credSource}`);\n if (creds) {\n console.log(` userId: ${creds.userId}`);\n console.log(` email: ${creds.email ?? chalk.dim('none')}`);\n console.log(` token: ${maybeRedact(creds.accessToken)}`);\n console.log(` refresh: ${creds.refreshToken ? 'present' : 'absent'}`);\n const expired = isTokenExpired(creds);\n const timeRemaining = creds.expiresAt - Date.now();\n console.log(\n ` expires: ${expired ? chalk.red(`expired ${formatTimeRemaining(-timeRemaining)} ago`) : chalk.green(`in ${formatTimeRemaining(timeRemaining)}`)}`,\n );\n if (creds.staging) {\n console.log(` staging: clientId=${creds.staging.clientId} apiKey=${maybeRedact(creds.staging.apiKey)}`);\n }\n }\n\n console.log();\n console.log(chalk.bold('Config'));\n console.log(` present: ${config ? chalk.green('true') : chalk.yellow('false')}`);\n console.log(` source: ${configSource}`);\n if (config) {\n console.log(` active: ${config.activeEnvironment ?? chalk.dim('none')}`);\n for (const [key, env] of Object.entries(config.environments)) {\n console.log(` env[${key}]: type=${env.type} apiKey=${maybeRedact(env.apiKey)}`);\n if (env.type === 'unclaimed') console.log(` claimToken=${maybeRedact(env.claimToken)}`);\n }\n }\n\n console.log();\n console.log(chalk.bold('Telemetry'));\n console.log(` enabled: ${telemetryOutput.enabled ? chalk.green('true') : chalk.yellow('false')}`);\n console.log(` optedOut: ${telemetryOutput.optedOut ? chalk.yellow('true') : 'false'}`);\n console.log(` source: ${telemetryOutput.source}`);\n console.log(` notice: ${telemetryOutput.noticeShown ? 'shown' : chalk.dim('not shown')}`);\n\n console.log();\n console.log(chalk.bold('Storage — Credentials'));\n console.log(` path: ${getCredentialsPath()}`);\n for (const line of diagnostics) {\n console.log(` ${chalk.dim(line)}`);\n }\n\n console.log();\n console.log(chalk.bold('Storage — Config'));\n console.log(` path: ${getConfigPath()}`);\n for (const line of configDiagnostics) {\n console.log(` ${chalk.dim(line)}`);\n }\n\n console.log();\n console.log(chalk.bold('Storage — Preferences'));\n console.log(` path: ${getPreferencesPath()}`);\n}\n\n// --- debug reset ---\n\n/** Join names with an Oxford comma: [\"a\",\"b\",\"c\"] => \"a, b, and c\". */\nfunction formatList(items: string[]): string {\n if (items.length <= 1) return items.join('');\n if (items.length === 2) return `${items[0]} and ${items[1]}`;\n return `${items.slice(0, -1).join(', ')}, and ${items[items.length - 1]}`;\n}\n\nexport async function runDebugReset({\n force,\n credentialsOnly,\n configOnly,\n}: {\n force: boolean;\n credentialsOnly: boolean;\n configOnly: boolean;\n}): Promise<void> {\n // Both flags = clear both (same as neither)\n const clearCreds = !configOnly || credentialsOnly;\n const clearConf = !credentialsOnly || configOnly;\n // Preferences (~/.workos/preferences.json) are non-secret local CLI state, so\n // they ride with the config target. Clearing config returns the CLI to a\n // fresh-install state, which includes resetting the telemetry preference.\n const clearPrefs = clearConf;\n\n const targets = formatList(\n [clearCreds && 'credentials', clearConf && 'config', clearPrefs && 'preferences'].filter(Boolean) as string[],\n );\n\n if (!force) {\n if (!isPromptAllowed()) {\n exitWithError({\n code: 'non_interactive_reset',\n message: 'Use --force to reset in agent or CI mode',\n });\n }\n\n const confirmed = await clack.confirm({\n message: `Clear all ${targets}? This cannot be undone.`,\n });\n\n if (clack.isCancel(confirmed) || !confirmed) {\n if (isJsonMode()) {\n outputJson({ cleared: false, cancelled: true });\n } else {\n clack.log.info('Reset cancelled');\n }\n return;\n }\n }\n\n if (clearCreds) clearCredentials();\n if (clearConf) clearConfig();\n if (clearPrefs) clearPreferences();\n\n if (isJsonMode()) {\n outputJson({ cleared: true, credentials: clearCreds, config: clearConf, preferences: clearPrefs });\n } else {\n clack.log.success(`Cleared ${targets}`);\n }\n}\n\n// --- debug simulate ---\n\nexport async function runDebugSimulate({\n expiredToken,\n noKeyring,\n unclaimed,\n noAuth,\n crash = false,\n}: {\n expiredToken: boolean;\n noKeyring: boolean;\n unclaimed: boolean;\n noAuth: boolean;\n crash?: boolean;\n}): Promise<void> {\n // Simulate an unexpected crash to exercise the crash-telemetry pipeline\n // end-to-end. Throws a plain Error (not CliExit) so the bin.ts lifecycle\n // records a `crash` event with a sanitized stack rather than a handled exit.\n if (crash) {\n throw new Error('Simulated crash for telemetry verification');\n }\n\n // Validate: at least one flag\n if (!expiredToken && !noKeyring && !unclaimed && !noAuth) {\n exitWithError({\n code: 'no_simulation_flags',\n message: 'Specify at least one simulation flag: --expired-token, --no-keyring, --unclaimed, --no-auth',\n });\n }\n\n // Validate: contradictory\n if (expiredToken && noAuth) {\n exitWithError({\n code: 'contradictory_flags',\n message: \"Cannot combine --expired-token and --no-auth (can't expire a cleared token)\",\n });\n }\n\n const actions: string[] = [];\n\n // Apply in order: storage tier first, then credential mutations, then config mutations\n\n if (noKeyring) {\n // Migrate current state to file storage\n const creds = getCredentials();\n const config = getConfig();\n\n setInsecureStorage(true);\n setInsecureConfigStorage(true);\n\n if (creds) saveCredentials(creds);\n if (config) saveConfig(config);\n\n actions.push('Forced file-only storage (keyring bypassed)');\n }\n\n if (expiredToken) {\n const creds = getCredentials();\n if (!creds) {\n exitWithError({\n code: 'no_credentials',\n message: 'Cannot simulate expired token — no credentials found. Log in first.',\n });\n }\n saveCredentials({ ...creds, expiresAt: Date.now() - 60_000 });\n actions.push('Set token expiresAt to 1 minute ago');\n }\n\n if (noAuth) {\n clearCredentials();\n actions.push('Cleared credentials (config preserved)');\n }\n\n if (unclaimed) {\n const config = getConfig() ?? { environments: {} };\n const envName = 'simulated-unclaimed';\n config.environments[envName] = {\n name: envName,\n type: 'unclaimed',\n apiKey: 'sk_test_simulated_unclaimed_000000000000',\n clientId: 'client_simulated',\n claimToken: 'claim_simulated_token_000000000000',\n };\n config.activeEnvironment = envName;\n saveConfig(config);\n actions.push(`Created unclaimed environment \"${envName}\" and set as active`);\n }\n\n if (isJsonMode()) {\n outputJson({ simulated: true, actions });\n } else {\n for (const action of actions) {\n clack.log.success(action);\n }\n }\n}\n\n// --- debug env ---\n\ninterface EnvVarInfo {\n name: string;\n value: string | undefined;\n effect: string;\n}\n\nconst ENV_VAR_CATALOG: { name: string; effect: string }[] = [\n { name: 'WORKOS_DEBUG', effect: 'Set to \"1\" to enable verbose debug logging for all commands' },\n { name: 'WORKOS_API_KEY', effect: 'Bypasses credential resolution — used directly for API calls' },\n { name: 'WORKOS_MODE', effect: 'Controls interaction behavior: human, agent, or CI' },\n { name: 'WORKOS_FORCE_TTY', effect: 'Forces human (non-JSON) output mode, even when piped' },\n { name: 'WORKOS_NO_PROMPT', effect: 'Legacy compatibility alias for agent interaction behavior and JSON output' },\n { name: 'WORKOS_TELEMETRY', effect: 'Set to \"false\" to disable telemetry' },\n { name: 'WORKOS_API_URL', effect: 'Overrides API base URL (default: https://api.workos.com)' },\n { name: 'WORKOS_DASHBOARD_URL', effect: 'Overrides dashboard URL (default: https://dashboard.workos.com)' },\n { name: 'WORKOS_AUTHKIT_DOMAIN', effect: 'Overrides AuthKit domain from settings' },\n { name: 'WORKOS_LLM_GATEWAY_URL', effect: 'Overrides LLM gateway URL from settings' },\n { name: 'WORKOS_TELEMETRY_URL', effect: 'Overrides CLI telemetry URL from settings' },\n { name: 'INSTALLER_DEV', effect: 'Enables dev mode — loads .env.local at startup' },\n { name: 'INSTALLER_DISABLE_PROXY', effect: 'Disables the credential proxy for gateway auth' },\n];\n\nexport async function runDebugEnv(): Promise<void> {\n const vars: EnvVarInfo[] = ENV_VAR_CATALOG.map(({ name, effect }) => ({\n name,\n value: process.env[name],\n effect,\n }));\n\n const setVars = vars.filter((v) => v.value !== undefined);\n const unsetVars = vars.filter((v) => v.value === undefined);\n\n if (isJsonMode()) {\n outputJson({\n variables: Object.fromEntries(vars.map((v) => [v.name, { value: v.value ?? null, effect: v.effect }])),\n set: setVars.map((v) => v.name),\n unset: unsetVars.map((v) => v.name),\n });\n return;\n }\n\n if (setVars.length > 0) {\n console.log(chalk.bold('Set'));\n for (const v of setVars) {\n console.log(` ${chalk.green(v.name)}=${v.value}`);\n console.log(` ${chalk.dim(v.effect)}`);\n }\n console.log();\n }\n\n console.log(chalk.bold(`Unset${setVars.length > 0 ? '' : ' (none active)'}`));\n for (const v of unsetVars) {\n console.log(` ${chalk.dim(v.name)} — ${chalk.dim(v.effect)}`);\n }\n}\n\n// --- debug token ---\n\nexport async function runDebugToken(): Promise<void> {\n const creds = getCredentials();\n\n if (!creds) {\n if (isJsonMode()) {\n outputJson({ present: false });\n } else {\n console.log(chalk.yellow('No credentials found'));\n }\n return;\n }\n\n const claims = parseJwt(creds.accessToken);\n const expired = isTokenExpired(creds);\n const timeRemaining = creds.expiresAt - Date.now();\n\n if (isJsonMode()) {\n outputJson({\n present: true,\n format: claims ? 'jwt' : 'opaque',\n expired,\n expiresAt: creds.expiresAt,\n expiresIn: expired\n ? `expired ${formatTimeRemaining(-timeRemaining)} ago`\n : `in ${formatTimeRemaining(timeRemaining)}`,\n claims: claims ?? null,\n refreshToken: { present: !!creds.refreshToken },\n });\n return;\n }\n\n if (claims) {\n console.log(chalk.bold('JWT Token'));\n console.log(\n ` expires: ${expired ? chalk.red(`expired ${formatTimeRemaining(-timeRemaining)} ago`) : chalk.green(`in ${formatTimeRemaining(timeRemaining)}`)}`,\n );\n console.log();\n console.log(chalk.bold('Claims'));\n for (const [key, value] of Object.entries(claims)) {\n if (key === 'exp' || key === 'iat' || key === 'nbf') {\n const date = new Date((value as number) * 1000).toISOString();\n console.log(` ${key}: ${value} (${date})`);\n } else {\n console.log(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n } else {\n console.log(chalk.bold('Opaque Token'));\n console.log(chalk.dim(' Token is not a JWT — cannot decode claims'));\n console.log(\n ` expires: ${expired ? chalk.red(`expired ${formatTimeRemaining(-timeRemaining)} ago`) : chalk.green(`in ${formatTimeRemaining(timeRemaining)}`)}`,\n );\n }\n\n console.log();\n console.log(` refresh token: ${creds.refreshToken ? chalk.green('present') : chalk.yellow('absent')}`);\n}\n"]}
@@ -6,11 +6,12 @@ import { resolve } from 'node:path';
6
6
  import { parse as parseYaml } from 'yaml';
7
7
  import chalk from 'chalk';
8
8
  import { IS_WINDOWS, SPAWN_OPTS } from '../utils/platform.js';
9
+ import { ExitCode, exitWithCode } from '../utils/exit-codes.js';
10
+ import { exitWithError } from '../utils/output.js';
9
11
  function loadSeedFile(filePath) {
10
12
  const resolved = resolve(filePath);
11
13
  if (!existsSync(resolved)) {
12
- console.error(`Seed file not found: ${resolved}`);
13
- process.exit(1);
14
+ exitWithError({ code: 'seed_not_found', message: `Seed file not found: ${resolved}` });
14
15
  }
15
16
  const content = readFileSync(resolved, 'utf-8');
16
17
  if (resolved.endsWith('.json')) {
@@ -112,7 +113,7 @@ export async function runDev(argv) {
112
113
  console.error(chalk.red(`Failed to start: ${devCmd.command} ${devCmd.args.join(' ')}`));
113
114
  console.error(chalk.dim('Try specifying the command explicitly: workos dev -- <your-command>'));
114
115
  await emulator.close();
115
- process.exit(1);
116
+ exitWithCode(ExitCode.GENERAL_ERROR);
116
117
  }
117
118
  child.on('error', async (err) => {
118
119
  console.error(chalk.red(`Failed to start: ${devCmd.command}`));
@@ -124,7 +125,7 @@ export async function runDev(argv) {
124
125
  console.error(chalk.dim(err.message));
125
126
  }
126
127
  await emulator.close();
127
- process.exit(1);
128
+ exitWithCode(ExitCode.GENERAL_ERROR);
128
129
  });
129
130
  // 5. Signal handling — forward to child, then close emulator
130
131
  const shutdown = (signal) => {
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { createEmulator, type EmulatorSeedConfig } from '../emulate/index.js';\nimport { resolveDevCommand } from '../lib/dev-command.js';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport chalk from 'chalk';\nimport { IS_WINDOWS, SPAWN_OPTS } from '../utils/platform.js';\n\nexport interface DevArgs {\n port: number;\n seed?: string;\n '--'?: string[];\n}\n\nfunction loadSeedFile(filePath: string): EmulatorSeedConfig {\n const resolved = resolve(filePath);\n if (!existsSync(resolved)) {\n console.error(`Seed file not found: ${resolved}`);\n process.exit(1);\n }\n\n const content = readFileSync(resolved, 'utf-8');\n if (resolved.endsWith('.json')) {\n return JSON.parse(content) as EmulatorSeedConfig;\n }\n return parseYaml(content) as EmulatorSeedConfig;\n}\n\nfunction autoDetectSeedFile(): EmulatorSeedConfig | null {\n const candidates = ['workos-emulate.config.yaml', 'workos-emulate.config.yml', 'workos-emulate.config.json'];\n\n for (const name of candidates) {\n const filePath = resolve(name);\n if (existsSync(filePath)) {\n return loadSeedFile(filePath);\n }\n }\n return null;\n}\n\n/**\n * Build the env vars object to inject into the child process.\n *\n * Sets both the base URL style (`WORKOS_API_BASE_URL`) and the decomposed\n * style (`WORKOS_API_HOSTNAME` + `WORKOS_API_PORT` + `WORKOS_API_HTTPS`)\n * so the emulator works with authkit SDKs (which read the decomposed vars)\n * and direct SDK consumers (which may use the base URL).\n */\n/**\n * Default seed data for `workos dev` so the AuthKit login flow works\n * out of the box. Provides a test user, an organization with a verified\n * domain, and a membership linking the two. Skipped when the user\n * provides `--seed` or a `workos-emulate.config.*` file is auto-detected.\n */\nexport const DEFAULT_DEV_SEED: EmulatorSeedConfig = {\n users: [\n {\n email: 'test@example.com',\n first_name: 'Test',\n last_name: 'User',\n password: 'password',\n email_verified: true,\n },\n ],\n organizations: [\n {\n name: 'Test Organization',\n domains: [{ domain: 'example.com', state: 'verified' }],\n },\n ],\n};\n\nexport function buildDevEnv(emulatorUrl: string, apiKey = 'sk_test_default'): Record<string, string> {\n const url = new URL(emulatorUrl);\n return {\n WORKOS_API_BASE_URL: emulatorUrl,\n WORKOS_API_HOSTNAME: url.hostname,\n WORKOS_API_PORT: url.port,\n WORKOS_API_HTTPS: 'false',\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: 'client_emulated',\n };\n}\n\nexport async function runDev(argv: DevArgs): Promise<void> {\n const userSeed = argv.seed ? loadSeedFile(argv.seed) : autoDetectSeedFile();\n const seedConfig = userSeed ?? DEFAULT_DEV_SEED;\n\n // 1. Start emulator\n const emulator = await createEmulator({\n port: argv.port,\n seed: seedConfig,\n });\n\n // 2. Resolve dev command\n const explicit = argv['--'];\n const devCmd =\n explicit && explicit.length > 0\n ? { command: explicit[0], args: explicit.slice(1), framework: null as string | null }\n : await resolveDevCommand(process.cwd());\n\n // 3. Print status banner\n console.log();\n console.log(`${chalk.cyan('WorkOS Emulate')} ${chalk.dim(emulator.url)}`);\n if (devCmd.framework) {\n console.log(chalk.dim(`Detected ${devCmd.framework}`));\n }\n console.log(chalk.dim(`Running: ${devCmd.command} ${devCmd.args.join(' ')}`));\n if (!userSeed) {\n console.log();\n console.log(` ${chalk.dim('Email:')} test@example.com`);\n console.log(` ${chalk.dim('Password:')} password`);\n }\n console.log();\n\n // 4. Spawn child process with env vars\n let child: ChildProcess;\n try {\n child = spawn(devCmd.command, devCmd.args, {\n stdio: 'inherit',\n env: {\n ...process.env,\n ...buildDevEnv(emulator.url, emulator.apiKey),\n },\n ...SPAWN_OPTS,\n });\n } catch {\n console.error(chalk.red(`Failed to start: ${devCmd.command} ${devCmd.args.join(' ')}`));\n console.error(chalk.dim('Try specifying the command explicitly: workos dev -- <your-command>'));\n await emulator.close();\n process.exit(1);\n }\n\n child.on('error', async (err) => {\n console.error(chalk.red(`Failed to start: ${devCmd.command}`));\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n console.error(chalk.dim(`Command not found: ${devCmd.command}`));\n console.error(chalk.dim('Try specifying the command explicitly: workos dev -- <your-command>'));\n } else {\n console.error(chalk.dim(err.message));\n }\n await emulator.close();\n process.exit(1);\n });\n\n // 5. Signal handling — forward to child, then close emulator\n const shutdown = (signal: NodeJS.Signals) => {\n child.kill(signal);\n emulator.close().then(() => process.exit(0));\n };\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n if (IS_WINDOWS) {\n process.on('SIGBREAK', () => shutdown('SIGINT'));\n }\n\n // 6. If child exits, close emulator and exit with same code\n child.on('exit', (code) => {\n emulator.close().then(() => process.exit(code ?? 0));\n });\n}\n"]}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA2B,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnD,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,wBAAwB,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CAAuB,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,UAAU,GAAG,CAAC,4BAA4B,EAAE,2BAA2B,EAAE,4BAA4B,CAAC,CAAC;IAE7G,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAuB;IAClD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,kBAAkB;YACzB,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,UAAU;YACpB,cAAc,EAAE,IAAI;SACrB;KACF;IACD,aAAa,EAAE;QACb;YACE,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;SACxD;KACF;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,MAAM,GAAG,iBAAiB;IACzE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,OAAO;QACL,mBAAmB,EAAE,WAAW;QAChC,mBAAmB,EAAE,GAAG,CAAC,QAAQ;QACjC,eAAe,EAAE,GAAG,CAAC,IAAI;QACzB,gBAAgB,EAAE,OAAO;QACzB,cAAc,EAAE,MAAM;QACtB,gBAAgB,EAAE,iBAAiB;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAa;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC5E,MAAM,UAAU,GAAG,QAAQ,IAAI,gBAAgB,CAAC;IAEhD,oBAAoB;IACpB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC;QACpC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,UAAU;KACjB,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,MAAM,GACV,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC7B,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAqB,EAAE;QACrF,CAAC,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE7C,yBAAyB;IACzB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,uCAAuC;IACvC,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;YACzC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC;aAC9C;YACD,GAAG,UAAU;SACd,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAChG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAClG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAE,EAAE;QAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { createEmulator, type EmulatorSeedConfig } from '../emulate/index.js';\nimport { resolveDevCommand } from '../lib/dev-command.js';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport chalk from 'chalk';\nimport { IS_WINDOWS, SPAWN_OPTS } from '../utils/platform.js';\nimport { ExitCode, exitWithCode } from '../utils/exit-codes.js';\nimport { exitWithError } from '../utils/output.js';\n\nexport interface DevArgs {\n port: number;\n seed?: string;\n '--'?: string[];\n}\n\nfunction loadSeedFile(filePath: string): EmulatorSeedConfig {\n const resolved = resolve(filePath);\n if (!existsSync(resolved)) {\n exitWithError({ code: 'seed_not_found', message: `Seed file not found: ${resolved}` });\n }\n\n const content = readFileSync(resolved, 'utf-8');\n if (resolved.endsWith('.json')) {\n return JSON.parse(content) as EmulatorSeedConfig;\n }\n return parseYaml(content) as EmulatorSeedConfig;\n}\n\nfunction autoDetectSeedFile(): EmulatorSeedConfig | null {\n const candidates = ['workos-emulate.config.yaml', 'workos-emulate.config.yml', 'workos-emulate.config.json'];\n\n for (const name of candidates) {\n const filePath = resolve(name);\n if (existsSync(filePath)) {\n return loadSeedFile(filePath);\n }\n }\n return null;\n}\n\n/**\n * Build the env vars object to inject into the child process.\n *\n * Sets both the base URL style (`WORKOS_API_BASE_URL`) and the decomposed\n * style (`WORKOS_API_HOSTNAME` + `WORKOS_API_PORT` + `WORKOS_API_HTTPS`)\n * so the emulator works with authkit SDKs (which read the decomposed vars)\n * and direct SDK consumers (which may use the base URL).\n */\n/**\n * Default seed data for `workos dev` so the AuthKit login flow works\n * out of the box. Provides a test user, an organization with a verified\n * domain, and a membership linking the two. Skipped when the user\n * provides `--seed` or a `workos-emulate.config.*` file is auto-detected.\n */\nexport const DEFAULT_DEV_SEED: EmulatorSeedConfig = {\n users: [\n {\n email: 'test@example.com',\n first_name: 'Test',\n last_name: 'User',\n password: 'password',\n email_verified: true,\n },\n ],\n organizations: [\n {\n name: 'Test Organization',\n domains: [{ domain: 'example.com', state: 'verified' }],\n },\n ],\n};\n\nexport function buildDevEnv(emulatorUrl: string, apiKey = 'sk_test_default'): Record<string, string> {\n const url = new URL(emulatorUrl);\n return {\n WORKOS_API_BASE_URL: emulatorUrl,\n WORKOS_API_HOSTNAME: url.hostname,\n WORKOS_API_PORT: url.port,\n WORKOS_API_HTTPS: 'false',\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: 'client_emulated',\n };\n}\n\nexport async function runDev(argv: DevArgs): Promise<void> {\n const userSeed = argv.seed ? loadSeedFile(argv.seed) : autoDetectSeedFile();\n const seedConfig = userSeed ?? DEFAULT_DEV_SEED;\n\n // 1. Start emulator\n const emulator = await createEmulator({\n port: argv.port,\n seed: seedConfig,\n });\n\n // 2. Resolve dev command\n const explicit = argv['--'];\n const devCmd =\n explicit && explicit.length > 0\n ? { command: explicit[0], args: explicit.slice(1), framework: null as string | null }\n : await resolveDevCommand(process.cwd());\n\n // 3. Print status banner\n console.log();\n console.log(`${chalk.cyan('WorkOS Emulate')} ${chalk.dim(emulator.url)}`);\n if (devCmd.framework) {\n console.log(chalk.dim(`Detected ${devCmd.framework}`));\n }\n console.log(chalk.dim(`Running: ${devCmd.command} ${devCmd.args.join(' ')}`));\n if (!userSeed) {\n console.log();\n console.log(` ${chalk.dim('Email:')} test@example.com`);\n console.log(` ${chalk.dim('Password:')} password`);\n }\n console.log();\n\n // 4. Spawn child process with env vars\n let child: ChildProcess;\n try {\n child = spawn(devCmd.command, devCmd.args, {\n stdio: 'inherit',\n env: {\n ...process.env,\n ...buildDevEnv(emulator.url, emulator.apiKey),\n },\n ...SPAWN_OPTS,\n });\n } catch {\n console.error(chalk.red(`Failed to start: ${devCmd.command} ${devCmd.args.join(' ')}`));\n console.error(chalk.dim('Try specifying the command explicitly: workos dev -- <your-command>'));\n await emulator.close();\n exitWithCode(ExitCode.GENERAL_ERROR);\n }\n\n child.on('error', async (err) => {\n console.error(chalk.red(`Failed to start: ${devCmd.command}`));\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n console.error(chalk.dim(`Command not found: ${devCmd.command}`));\n console.error(chalk.dim('Try specifying the command explicitly: workos dev -- <your-command>'));\n } else {\n console.error(chalk.dim(err.message));\n }\n await emulator.close();\n exitWithCode(ExitCode.GENERAL_ERROR);\n });\n\n // 5. Signal handling — forward to child, then close emulator\n const shutdown = (signal: NodeJS.Signals) => {\n child.kill(signal);\n emulator.close().then(() => process.exit(0));\n };\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n if (IS_WINDOWS) {\n process.on('SIGBREAK', () => shutdown('SIGINT'));\n }\n\n // 6. If child exits, close emulator and exit with same code\n child.on('exit', (code) => {\n emulator.close().then(() => process.exit(code ?? 0));\n });\n}\n"]}