@posthog/wizard 1.33.0 → 1.35.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 (104) hide show
  1. package/dist/bin.js +9 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/javascript-node/javascript-node-wizard-agent.d.ts +4 -0
  4. package/dist/src/javascript-node/javascript-node-wizard-agent.js +61 -0
  5. package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +1 -0
  6. package/dist/src/javascript-web/javascript-web-wizard-agent.d.ts +3 -0
  7. package/dist/src/javascript-web/javascript-web-wizard-agent.js +150 -0
  8. package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +1 -0
  9. package/dist/src/javascript-web/utils.d.ts +23 -0
  10. package/dist/src/javascript-web/utils.js +99 -0
  11. package/dist/src/javascript-web/utils.js.map +1 -0
  12. package/dist/src/lib/__tests__/agent-interface.test.js +1 -0
  13. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  14. package/dist/src/lib/agent-interface.d.ts +5 -0
  15. package/dist/src/lib/agent-interface.js +19 -2
  16. package/dist/src/lib/agent-interface.js.map +1 -1
  17. package/dist/src/lib/agent-runner.js +8 -4
  18. package/dist/src/lib/agent-runner.js.map +1 -1
  19. package/dist/src/lib/api.js +3 -0
  20. package/dist/src/lib/api.js.map +1 -1
  21. package/dist/src/lib/constants.d.ts +6 -1
  22. package/dist/src/lib/constants.js +15 -1
  23. package/dist/src/lib/constants.js.map +1 -1
  24. package/dist/src/lib/middleware/benchmark.d.ts +54 -0
  25. package/dist/src/lib/middleware/benchmark.js +49 -0
  26. package/dist/src/lib/middleware/benchmark.js.map +1 -0
  27. package/dist/src/lib/middleware/benchmarks/cache-tracker.d.ts +44 -0
  28. package/dist/src/lib/middleware/benchmarks/cache-tracker.js +81 -0
  29. package/dist/src/lib/middleware/benchmarks/cache-tracker.js.map +1 -0
  30. package/dist/src/lib/middleware/benchmarks/compaction-tracker.d.ts +29 -0
  31. package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +60 -0
  32. package/dist/src/lib/middleware/benchmarks/compaction-tracker.js.map +1 -0
  33. package/dist/src/lib/middleware/benchmarks/context-size-tracker.d.ts +26 -0
  34. package/dist/src/lib/middleware/benchmarks/context-size-tracker.js +56 -0
  35. package/dist/src/lib/middleware/benchmarks/context-size-tracker.js.map +1 -0
  36. package/dist/src/lib/middleware/benchmarks/cost-tracker.d.ts +16 -0
  37. package/dist/src/lib/middleware/benchmarks/cost-tracker.js +76 -0
  38. package/dist/src/lib/middleware/benchmarks/cost-tracker.js.map +1 -0
  39. package/dist/src/lib/middleware/benchmarks/duration-tracker.d.ts +20 -0
  40. package/dist/src/lib/middleware/benchmarks/duration-tracker.js +40 -0
  41. package/dist/src/lib/middleware/benchmarks/duration-tracker.js.map +1 -0
  42. package/dist/src/lib/middleware/benchmarks/index.d.ts +9 -0
  43. package/dist/src/lib/middleware/benchmarks/index.js +60 -0
  44. package/dist/src/lib/middleware/benchmarks/index.js.map +1 -0
  45. package/dist/src/lib/middleware/benchmarks/json-writer.d.ts +15 -0
  46. package/dist/src/lib/middleware/benchmarks/json-writer.js +145 -0
  47. package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -0
  48. package/dist/src/lib/middleware/benchmarks/summary.d.ts +9 -0
  49. package/dist/src/lib/middleware/benchmarks/summary.js +106 -0
  50. package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -0
  51. package/dist/src/lib/middleware/benchmarks/token-tracker.d.ts +40 -0
  52. package/dist/src/lib/middleware/benchmarks/token-tracker.js +77 -0
  53. package/dist/src/lib/middleware/benchmarks/token-tracker.js.map +1 -0
  54. package/dist/src/lib/middleware/benchmarks/turn-counter.d.ts +34 -0
  55. package/dist/src/lib/middleware/benchmarks/turn-counter.js +59 -0
  56. package/dist/src/lib/middleware/benchmarks/turn-counter.js.map +1 -0
  57. package/dist/src/lib/middleware/config.d.ts +24 -0
  58. package/dist/src/lib/middleware/config.js +78 -0
  59. package/dist/src/lib/middleware/config.js.map +1 -0
  60. package/dist/src/lib/middleware/index.d.ts +11 -0
  61. package/dist/src/lib/middleware/index.js +18 -0
  62. package/dist/src/lib/middleware/index.js.map +1 -0
  63. package/dist/src/lib/middleware/phase-detector.d.ts +7 -0
  64. package/dist/src/lib/middleware/phase-detector.js +64 -0
  65. package/dist/src/lib/middleware/phase-detector.js.map +1 -0
  66. package/dist/src/lib/middleware/pipeline.d.ts +29 -0
  67. package/dist/src/lib/middleware/pipeline.js +82 -0
  68. package/dist/src/lib/middleware/pipeline.js.map +1 -0
  69. package/dist/src/lib/middleware/types.d.ts +40 -0
  70. package/dist/src/lib/middleware/types.js +9 -0
  71. package/dist/src/lib/middleware/types.js.map +1 -0
  72. package/dist/src/lib/package-manager-detection.d.ts +1 -0
  73. package/dist/src/lib/package-manager-detection.js +17 -0
  74. package/dist/src/lib/package-manager-detection.js.map +1 -1
  75. package/dist/src/lib/registry.js +8 -0
  76. package/dist/src/lib/registry.js.map +1 -1
  77. package/dist/src/python/python-wizard-agent.js +1 -78
  78. package/dist/src/python/python-wizard-agent.js.map +1 -1
  79. package/dist/src/rails/rails-wizard-agent.d.ts +8 -0
  80. package/dist/src/rails/rails-wizard-agent.js +90 -0
  81. package/dist/src/rails/rails-wizard-agent.js.map +1 -0
  82. package/dist/src/rails/utils.d.ts +37 -0
  83. package/dist/src/rails/utils.js +187 -0
  84. package/dist/src/rails/utils.js.map +1 -0
  85. package/dist/src/ruby/ruby-wizard-agent.d.ts +7 -0
  86. package/dist/src/ruby/ruby-wizard-agent.js +113 -0
  87. package/dist/src/ruby/ruby-wizard-agent.js.map +1 -0
  88. package/dist/src/ruby/utils.d.ts +25 -0
  89. package/dist/src/ruby/utils.js +158 -0
  90. package/dist/src/ruby/utils.js.map +1 -0
  91. package/dist/src/run.d.ts +2 -0
  92. package/dist/src/run.js +8 -0
  93. package/dist/src/run.js.map +1 -1
  94. package/dist/src/utils/clack-utils.d.ts +1 -1
  95. package/dist/src/utils/clack-utils.js +26 -7
  96. package/dist/src/utils/clack-utils.js.map +1 -1
  97. package/dist/src/utils/debug.d.ts +11 -3
  98. package/dist/src/utils/debug.js +25 -6
  99. package/dist/src/utils/debug.js.map +1 -1
  100. package/dist/src/utils/oauth.js +1 -0
  101. package/dist/src/utils/oauth.js.map +1 -1
  102. package/dist/src/utils/types.d.ts +11 -0
  103. package/dist/src/utils/types.js.map +1 -1
  104. package/package.json +2 -2
@@ -1,4 +1,12 @@
1
- export declare const LOG_FILE_PATH = "/tmp/posthog-wizard.log";
1
+ export declare function getLogFilePath(): string;
2
+ /**
3
+ * Configure the log file path and enable/disable state.
4
+ * Call before initLogFile() to override defaults.
5
+ */
6
+ export declare function configureLogFile(opts: {
7
+ path?: string;
8
+ enabled?: boolean;
9
+ }): void;
2
10
  /**
3
11
  * Initialize the log file with a run header.
4
12
  * Call this at the start of each wizard run.
@@ -6,8 +14,8 @@ export declare const LOG_FILE_PATH = "/tmp/posthog-wizard.log";
6
14
  */
7
15
  export declare function initLogFile(): void;
8
16
  /**
9
- * Log a message to the file at /tmp/posthog-wizard.log.
10
- * Always writes regardless of debug flag.
17
+ * Log a message to the log file.
18
+ * Always writes regardless of debug flag (when logging is enabled).
11
19
  * Fails silently to avoid masking errors in catch blocks.
12
20
  */
13
21
  export declare function logToFile(...args: unknown[]): void;
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.LOG_FILE_PATH = void 0;
6
+ exports.getLogFilePath = getLogFilePath;
7
+ exports.configureLogFile = configureLogFile;
7
8
  exports.initLogFile = initLogFile;
8
9
  exports.logToFile = logToFile;
9
10
  exports.debug = debug;
@@ -13,31 +14,49 @@ const fs_1 = require("fs");
13
14
  const logging_1 = require("./logging");
14
15
  const clack_1 = __importDefault(require("./clack"));
15
16
  let debugEnabled = false;
16
- exports.LOG_FILE_PATH = '/tmp/posthog-wizard.log';
17
+ let logFilePath = '/tmp/posthog-wizard.log';
18
+ let logEnabled = true;
19
+ function getLogFilePath() {
20
+ return logFilePath;
21
+ }
22
+ /**
23
+ * Configure the log file path and enable/disable state.
24
+ * Call before initLogFile() to override defaults.
25
+ */
26
+ function configureLogFile(opts) {
27
+ if (opts.path !== undefined)
28
+ logFilePath = opts.path;
29
+ if (opts.enabled !== undefined)
30
+ logEnabled = opts.enabled;
31
+ }
17
32
  /**
18
33
  * Initialize the log file with a run header.
19
34
  * Call this at the start of each wizard run.
20
35
  * Fails silently to avoid crashing the wizard.
21
36
  */
22
37
  function initLogFile() {
38
+ if (!logEnabled)
39
+ return;
23
40
  try {
24
41
  const header = `\n${'='.repeat(60)}\nPostHog Wizard Run: ${new Date().toISOString()}\n${'='.repeat(60)}\n`;
25
- (0, fs_1.appendFileSync)(exports.LOG_FILE_PATH, header);
42
+ (0, fs_1.appendFileSync)(logFilePath, header);
26
43
  }
27
44
  catch {
28
45
  // Silently ignore - logging is non-critical
29
46
  }
30
47
  }
31
48
  /**
32
- * Log a message to the file at /tmp/posthog-wizard.log.
33
- * Always writes regardless of debug flag.
49
+ * Log a message to the log file.
50
+ * Always writes regardless of debug flag (when logging is enabled).
34
51
  * Fails silently to avoid masking errors in catch blocks.
35
52
  */
36
53
  function logToFile(...args) {
54
+ if (!logEnabled)
55
+ return;
37
56
  try {
38
57
  const timestamp = new Date().toISOString();
39
58
  const msg = args.map((a) => (0, logging_1.prepareMessage)(a)).join(' ');
40
- (0, fs_1.appendFileSync)(exports.LOG_FILE_PATH, `[${timestamp}] ${msg}\n`);
59
+ (0, fs_1.appendFileSync)(logFilePath, `[${timestamp}] ${msg}\n`);
41
60
  }
42
61
  catch {
43
62
  // Silently ignore logging failures to avoid masking original errors
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/utils/debug.ts"],"names":[],"mappings":";;;;;;AAcA,kCASC;AAOD,8BAQC;AAED,sBAQC;AAED,0CAEC;AApDD,kDAA0B;AAC1B,2BAAoC;AACpC,uCAA2C;AAC3C,oDAA4B;AAE5B,IAAI,YAAY,GAAG,KAAK,CAAC;AAEZ,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD;;;;GAIG;AACH,SAAgB,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,MAAM,CAC5B,EAAE,CACH,yBAAyB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1E,IAAA,mBAAc,EAAC,qBAAa,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,SAAS,CAAC,GAAG,IAAe;IAC1C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,IAAA,mBAAc,EAAC,qBAAa,EAAE,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,GAAG,IAAe;IACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzD,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,eAAe;IAC7B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC","sourcesContent":["import chalk from 'chalk';\nimport { appendFileSync } from 'fs';\nimport { prepareMessage } from './logging';\nimport clack from './clack';\n\nlet debugEnabled = false;\n\nexport const LOG_FILE_PATH = '/tmp/posthog-wizard.log';\n\n/**\n * Initialize the log file with a run header.\n * Call this at the start of each wizard run.\n * Fails silently to avoid crashing the wizard.\n */\nexport function initLogFile() {\n try {\n const header = `\\n${'='.repeat(\n 60,\n )}\\nPostHog Wizard Run: ${new Date().toISOString()}\\n${'='.repeat(60)}\\n`;\n appendFileSync(LOG_FILE_PATH, header);\n } catch {\n // Silently ignore - logging is non-critical\n }\n}\n\n/**\n * Log a message to the file at /tmp/posthog-wizard.log.\n * Always writes regardless of debug flag.\n * Fails silently to avoid masking errors in catch blocks.\n */\nexport function logToFile(...args: unknown[]) {\n try {\n const timestamp = new Date().toISOString();\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n appendFileSync(LOG_FILE_PATH, `[${timestamp}] ${msg}\\n`);\n } catch {\n // Silently ignore logging failures to avoid masking original errors\n }\n}\n\nexport function debug(...args: unknown[]) {\n if (!debugEnabled) {\n return;\n }\n\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n\n clack.log.info(chalk.dim(msg));\n}\n\nexport function enableDebugLogs() {\n debugEnabled = true;\n}\n"]}
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/utils/debug.ts"],"names":[],"mappings":";;;;;AASA,wCAEC;AAMD,4CAMC;AAOD,kCAUC;AAOD,8BASC;AAED,sBAQC;AAED,0CAEC;AAtED,kDAA0B;AAC1B,2BAAoC;AACpC,uCAA2C;AAC3C,oDAA4B;AAE5B,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,IAAI,WAAW,GAAG,yBAAyB,CAAC;AAC5C,IAAI,UAAU,GAAG,IAAI,CAAC;AAEtB,SAAgB,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,IAGhC;IACC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;IACrD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW;IACzB,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,MAAM,CAC5B,EAAE,CACH,yBAAyB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1E,IAAA,mBAAc,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,SAAS,CAAC,GAAG,IAAe;IAC1C,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,IAAA,mBAAc,EAAC,WAAW,EAAE,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,GAAG,IAAe;IACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzD,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,eAAe;IAC7B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC","sourcesContent":["import chalk from 'chalk';\nimport { appendFileSync } from 'fs';\nimport { prepareMessage } from './logging';\nimport clack from './clack';\n\nlet debugEnabled = false;\nlet logFilePath = '/tmp/posthog-wizard.log';\nlet logEnabled = true;\n\nexport function getLogFilePath(): string {\n return logFilePath;\n}\n\n/**\n * Configure the log file path and enable/disable state.\n * Call before initLogFile() to override defaults.\n */\nexport function configureLogFile(opts: {\n path?: string;\n enabled?: boolean;\n}): void {\n if (opts.path !== undefined) logFilePath = opts.path;\n if (opts.enabled !== undefined) logEnabled = opts.enabled;\n}\n\n/**\n * Initialize the log file with a run header.\n * Call this at the start of each wizard run.\n * Fails silently to avoid crashing the wizard.\n */\nexport function initLogFile() {\n if (!logEnabled) return;\n try {\n const header = `\\n${'='.repeat(\n 60,\n )}\\nPostHog Wizard Run: ${new Date().toISOString()}\\n${'='.repeat(60)}\\n`;\n appendFileSync(logFilePath, header);\n } catch {\n // Silently ignore - logging is non-critical\n }\n}\n\n/**\n * Log a message to the log file.\n * Always writes regardless of debug flag (when logging is enabled).\n * Fails silently to avoid masking errors in catch blocks.\n */\nexport function logToFile(...args: unknown[]) {\n if (!logEnabled) return;\n try {\n const timestamp = new Date().toISOString();\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n appendFileSync(logFilePath, `[${timestamp}] ${msg}\\n`);\n } catch {\n // Silently ignore logging failures to avoid masking original errors\n }\n}\n\nexport function debug(...args: unknown[]) {\n if (!debugEnabled) {\n return;\n }\n\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n\n clack.log.info(chalk.dim(msg));\n}\n\nexport function enableDebugLogs() {\n debugEnabled = true;\n}\n"]}
@@ -185,6 +185,7 @@ async function exchangeCodeForToken(code, codeVerifier, config) {
185
185
  }, {
186
186
  headers: {
187
187
  'Content-Type': 'application/json',
188
+ 'User-Agent': constants_1.WIZARD_USER_AGENT,
188
189
  },
189
190
  });
190
191
  return OAuthTokenResponseSchema.parse(response.data);
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/utils/oauth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoMA,4CAyGC;AA7SD,oDAAsC;AACtC,gDAAkC;AAClC,kDAA0B;AAC1B,kDAA0B;AAC1B,8CAAsB;AACtB,6BAAwB;AACxB,oDAA4B;AAC5B,gDAA0D;AAC1D,+CAAsC;AACtC,2CAAwC;AAExC,iCAA2E;AAE3E,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB7B,CAAC;AAEF,MAAM,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;IACxB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;IACzB,YAAY,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,oBAAoB,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC,CAAC;AAUH,SAAS,oBAAoB;IAC3B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,OAAe,EACf,SAAiB;IAKjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,eAAuC,CAAC;QAC5C,IAAI,cAAsC,CAAC;QAE3C,MAAM,eAAe,GAAG,GAAG,EAAE,CAC3B,IAAI,OAAO,CAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/B,eAAe,GAAG,GAAG,CAAC;YACtB,cAAc,GAAG,GAAG,CAAC;QACvB,CAAC,CAAC,CAAC;QAEL,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,sBAAU,EAAE,CAAC,CAAC;YAE/D,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;gBAC3D,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC9C,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE5C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,cAAc,GAAG,KAAK,KAAK,eAAe,CAAC;gBACjD,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;oBACxC,cAAc,EAAE,0BAA0B;iBAC3C,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC;;;;sDAKA,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QACjC;gBACE,qBAAqB;;;mBAIrB,cAAc;oBACZ,CAAC,CAAC,0BAA0B;oBAC5B,CAAC,CAAC,uBACN;;;;;SAKL,CAAC,CAAC;gBACH,cAAc,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,IAAI,IAAI,EAAE,CAAC;gBACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC;;;;;gBAKA,qBAAqB;;;;;;;;SAQ5B,CAAC,CAAC;gBACH,eAAe,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC;;;;;gBAKA,qBAAqB;;;;;;;SAO5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,sBAAU,EAAE,GAAG,EAAE;YAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAY,EACZ,YAAoB,EACpB,MAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAA,4BAAqB,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,GAAG,QAAQ,cAAc,EACzB;QACE,UAAU,EAAE,oBAAoB;QAChC,IAAI;QACJ,YAAY,EAAE,oBAAoB,sBAAU,WAAW;QACvD,SAAS,EAAE,IAAA,iCAA0B,EAAC,MAAM,CAAC,WAAW,CAAC;QACzD,aAAa,EAAE,YAAY;KAC5B,EACD;QACE,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CACF,CAAC;IAEF,OAAO,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,MAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAA,4BAAqB,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC;IACvD,OAAO,CAAC,YAAY,CAAC,GAAG,CACtB,WAAW,EACX,IAAA,iCAA0B,EAAC,MAAM,CAAC,WAAW,CAAC,CAC/C,CAAC;IACF,OAAO,CAAC,YAAY,CAAC,GAAG,CACtB,cAAc,EACd,oBAAoB,sBAAU,WAAW,CAC1C,CAAC;IACF,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;IAC1D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAE7D,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,GAAG,QAAQ,gBAAgB,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CACpE,CAAC;IAEF,MAAM,cAAc,GAAG,oBAAoB,sBAAU,wBAAwB,CAAC;IAC9E,MAAM,aAAa,GAAG,oBAAoB,sBAAU,YAAY,CAAC;IAEjE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;IAEjE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,mBAAmB,CAC3D,OAAO,CAAC,QAAQ,EAAE,EAClB,SAAS,CAAC,QAAQ,EAAE,CACrB,CAAC;IAEF,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,GAAG,eAAK,CAAC,IAAI,CACX,8GAA8G,CAC/G,OAAO,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAC3B,MAAM,CAAC,MAAM;QACX,CAAC,CAAC,iEAAiE,eAAK,CAAC,IAAI,CACzE,aAAa,CACd,EAAE;QACL,CAAC,CAAC,EACN,EAAE,CACH,CAAC;IAEF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,IAAA,aAAG,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACzC,+CAA+C;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,eAAK,CAAC,OAAO,EAAE,CAAC;IACrC,YAAY,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC9B,eAAe,EAAE;YACjB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,MAAM,CAAC,CACvE;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAErE,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAE7C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAElE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,GAAG,eAAK,CAAC,MAAM,CACb,8BAA8B,CAC/B,iHAAiH,eAAK,CAAC,GAAG,CACzH,6CAA6C,CAC9C,EAAE,CACJ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,eAAK,CAAC,GAAG,CAAC,KAAK,CACb,GAAG,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,OACnC,KAAK,CAAC,OACR,OAAO,eAAK,CAAC,GAAG,CACd,8EAA8E,sBAAU,EAAE,CAC3F,EAAE,CACJ,CAAC;QACJ,CAAC;QAED,qBAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAChC,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,MAAM,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,MAAM,IAAA,mBAAK,GAAE,CAAC;QACd,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport opn from 'opn';\nimport { z } from 'zod';\nimport clack from './clack';\nimport { ISSUES_URL, OAUTH_PORT } from '../lib/constants';\nimport { abort } from './clack-utils';\nimport { analytics } from './analytics';\nimport type { CloudRegion } from './types';\nimport { getCloudUrlFromRegion, getOauthClientIdFromRegion } from './urls';\n\nconst OAUTH_CALLBACK_STYLES = `\n <style>\n * {\n font-family: monospace;\n background-color: #1b0a00;\n color: #F7A502;\n font-weight: medium;\n font-size: 24px;\n margin: .25rem;\n }\n\n .blink {\n animation: blink-animation 1s steps(2, start) infinite;\n }\n\n @keyframes blink-animation {\n to {\n opacity: 0;\n }\n }\n </style>\n`;\n\nconst OAuthTokenResponseSchema = z.object({\n access_token: z.string(),\n expires_in: z.number(),\n token_type: z.string(),\n scope: z.string(),\n refresh_token: z.string(),\n scoped_teams: z.array(z.number()).optional(),\n scoped_organizations: z.array(z.string()).optional(),\n});\n\nexport type OAuthTokenResponse = z.infer<typeof OAuthTokenResponseSchema>;\n\ninterface OAuthConfig {\n scopes: string[];\n cloudRegion: CloudRegion;\n signup?: boolean;\n}\n\nfunction generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString('base64url');\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return crypto.createHash('sha256').update(verifier).digest('base64url');\n}\n\nasync function startCallbackServer(\n authUrl: string,\n signupUrl: string,\n): Promise<{\n server: http.Server;\n waitForCallback: () => Promise<string>;\n}> {\n return new Promise((resolve, reject) => {\n let callbackResolve: (code: string) => void;\n let callbackReject: (error: Error) => void;\n\n const waitForCallback = () =>\n new Promise<string>((res, rej) => {\n callbackResolve = res;\n callbackReject = rej;\n });\n\n const server = http.createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400);\n res.end();\n return;\n }\n const url = new URL(req.url, `http://localhost:${OAUTH_PORT}`);\n\n if (url.pathname === '/authorize') {\n const isSignup = url.searchParams.get('signup') === 'true';\n const redirectUrl = isSignup ? signupUrl : authUrl;\n res.writeHead(302, { Location: redirectUrl });\n res.end();\n return;\n }\n\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n\n if (error) {\n const isAccessDenied = error === 'access_denied';\n res.writeHead(isAccessDenied ? 200 : 400, {\n 'Content-Type': 'text/html; charset=utf-8',\n });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Authorization ${\n isAccessDenied ? 'cancelled' : 'failed'\n }</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>${\n isAccessDenied\n ? 'Authorization cancelled.'\n : `Authorization failed.`\n }</p>\n <p>Return to your terminal. This window will close automatically.</p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackReject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard is ready</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>PostHog login complete!</p>\n <p>Return to your terminal: the wizard is hard at work on your project<span class=\"blink\">█</span></p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackResolve(code);\n } else {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Invalid request</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>Invalid request - no authorization code received.</p>\n <p>You can close this window.</p>\n </body>\n </html>\n `);\n }\n });\n\n server.listen(OAUTH_PORT, () => {\n resolve({ server, waitForCallback });\n });\n\n server.on('error', reject);\n });\n}\n\nasync function exchangeCodeForToken(\n code: string,\n codeVerifier: string,\n config: OAuthConfig,\n): Promise<OAuthTokenResponse> {\n const cloudUrl = getCloudUrlFromRegion(config.cloudRegion);\n\n const response = await axios.post(\n `${cloudUrl}/oauth/token`,\n {\n grant_type: 'authorization_code',\n code,\n redirect_uri: `http://localhost:${OAUTH_PORT}/callback`,\n client_id: getOauthClientIdFromRegion(config.cloudRegion),\n code_verifier: codeVerifier,\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n );\n\n return OAuthTokenResponseSchema.parse(response.data);\n}\n\nexport async function performOAuthFlow(\n config: OAuthConfig,\n): Promise<OAuthTokenResponse> {\n const cloudUrl = getCloudUrlFromRegion(config.cloudRegion);\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n const authUrl = new URL(`${cloudUrl}/oauth/authorize`);\n authUrl.searchParams.set(\n 'client_id',\n getOauthClientIdFromRegion(config.cloudRegion),\n );\n authUrl.searchParams.set(\n 'redirect_uri',\n `http://localhost:${OAUTH_PORT}/callback`,\n );\n authUrl.searchParams.set('response_type', 'code');\n authUrl.searchParams.set('code_challenge', codeChallenge);\n authUrl.searchParams.set('code_challenge_method', 'S256');\n authUrl.searchParams.set('scope', config.scopes.join(' '));\n authUrl.searchParams.set('required_access_level', 'project');\n\n const signupUrl = new URL(\n `${cloudUrl}/signup?next=${encodeURIComponent(authUrl.toString())}`,\n );\n\n const localSignupUrl = `http://localhost:${OAUTH_PORT}/authorize?signup=true`;\n const localLoginUrl = `http://localhost:${OAUTH_PORT}/authorize`;\n\n const urlToOpen = config.signup ? localSignupUrl : localLoginUrl;\n\n const { server, waitForCallback } = await startCallbackServer(\n authUrl.toString(),\n signupUrl.toString(),\n );\n\n clack.log.info(\n `${chalk.bold(\n \"If the browser window didn't open automatically, please open the following link to be redirected to PostHog:\",\n )}\\n\\n${chalk.cyan(urlToOpen)}${\n config.signup\n ? `\\n\\nIf you already have an account, you can use this link:\\n\\n${chalk.cyan(\n localLoginUrl,\n )}`\n : ``\n }`,\n );\n\n if (process.env.NODE_ENV !== 'test') {\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments without a browser\n });\n }\n\n const loginSpinner = clack.spinner();\n loginSpinner.start('Waiting for authorization...');\n\n try {\n const code = await Promise.race([\n waitForCallback(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Authorization timed out')), 60_000),\n ),\n ]);\n\n const token = await exchangeCodeForToken(code, codeVerifier, config);\n\n server.close();\n loginSpinner.stop('Authorization complete!');\n\n return token;\n } catch (e) {\n loginSpinner.stop('Authorization failed.');\n server.close();\n\n const error = e instanceof Error ? e : new Error('Unknown error');\n\n if (error.message.includes('timeout')) {\n clack.log.error('Authorization timed out. Please try again.');\n } else if (error.message.includes('access_denied')) {\n clack.log.info(\n `${chalk.yellow(\n 'Authorization was cancelled.',\n )}\\n\\nYou denied access to PostHog. To use the wizard, you need to authorize access to your PostHog account.\\n\\n${chalk.dim(\n 'You can try again by re-running the wizard.',\n )}`,\n );\n } else {\n clack.log.error(\n `${chalk.red('Authorization failed:')}\\n\\n${\n error.message\n }\\n\\n${chalk.dim(\n `If you think this is a bug in the PostHog wizard, please create an issue:\\n${ISSUES_URL}`,\n )}`,\n );\n }\n\n analytics.captureException(error, {\n step: 'oauth_flow',\n cloud_region: config.cloudRegion,\n });\n\n await abort();\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/utils/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport opn from 'opn';\nimport { z } from 'zod';\nimport clack from './clack';\nimport { ISSUES_URL, OAUTH_PORT, WIZARD_USER_AGENT } from '../lib/constants';\nimport { abort } from './clack-utils';\nimport { analytics } from './analytics';\nimport type { CloudRegion } from './types';\nimport { getCloudUrlFromRegion, getOauthClientIdFromRegion } from './urls';\n\nconst OAUTH_CALLBACK_STYLES = `\n <style>\n * {\n font-family: monospace;\n background-color: #1b0a00;\n color: #F7A502;\n font-weight: medium;\n font-size: 24px;\n margin: .25rem;\n }\n\n .blink {\n animation: blink-animation 1s steps(2, start) infinite;\n }\n\n @keyframes blink-animation {\n to {\n opacity: 0;\n }\n }\n </style>\n`;\n\nconst OAuthTokenResponseSchema = z.object({\n access_token: z.string(),\n expires_in: z.number(),\n token_type: z.string(),\n scope: z.string(),\n refresh_token: z.string(),\n scoped_teams: z.array(z.number()).optional(),\n scoped_organizations: z.array(z.string()).optional(),\n});\n\nexport type OAuthTokenResponse = z.infer<typeof OAuthTokenResponseSchema>;\n\ninterface OAuthConfig {\n scopes: string[];\n cloudRegion: CloudRegion;\n signup?: boolean;\n}\n\nfunction generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString('base64url');\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return crypto.createHash('sha256').update(verifier).digest('base64url');\n}\n\nasync function startCallbackServer(\n authUrl: string,\n signupUrl: string,\n): Promise<{\n server: http.Server;\n waitForCallback: () => Promise<string>;\n}> {\n return new Promise((resolve, reject) => {\n let callbackResolve: (code: string) => void;\n let callbackReject: (error: Error) => void;\n\n const waitForCallback = () =>\n new Promise<string>((res, rej) => {\n callbackResolve = res;\n callbackReject = rej;\n });\n\n const server = http.createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400);\n res.end();\n return;\n }\n const url = new URL(req.url, `http://localhost:${OAUTH_PORT}`);\n\n if (url.pathname === '/authorize') {\n const isSignup = url.searchParams.get('signup') === 'true';\n const redirectUrl = isSignup ? signupUrl : authUrl;\n res.writeHead(302, { Location: redirectUrl });\n res.end();\n return;\n }\n\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n\n if (error) {\n const isAccessDenied = error === 'access_denied';\n res.writeHead(isAccessDenied ? 200 : 400, {\n 'Content-Type': 'text/html; charset=utf-8',\n });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Authorization ${\n isAccessDenied ? 'cancelled' : 'failed'\n }</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>${\n isAccessDenied\n ? 'Authorization cancelled.'\n : `Authorization failed.`\n }</p>\n <p>Return to your terminal. This window will close automatically.</p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackReject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard is ready</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>PostHog login complete!</p>\n <p>Return to your terminal: the wizard is hard at work on your project<span class=\"blink\">█</span></p>\n <script>window.close();</script>\n </body>\n </html>\n `);\n callbackResolve(code);\n } else {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>PostHog wizard - Invalid request</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n <p>Invalid request - no authorization code received.</p>\n <p>You can close this window.</p>\n </body>\n </html>\n `);\n }\n });\n\n server.listen(OAUTH_PORT, () => {\n resolve({ server, waitForCallback });\n });\n\n server.on('error', reject);\n });\n}\n\nasync function exchangeCodeForToken(\n code: string,\n codeVerifier: string,\n config: OAuthConfig,\n): Promise<OAuthTokenResponse> {\n const cloudUrl = getCloudUrlFromRegion(config.cloudRegion);\n\n const response = await axios.post(\n `${cloudUrl}/oauth/token`,\n {\n grant_type: 'authorization_code',\n code,\n redirect_uri: `http://localhost:${OAUTH_PORT}/callback`,\n client_id: getOauthClientIdFromRegion(config.cloudRegion),\n code_verifier: codeVerifier,\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': WIZARD_USER_AGENT,\n },\n },\n );\n\n return OAuthTokenResponseSchema.parse(response.data);\n}\n\nexport async function performOAuthFlow(\n config: OAuthConfig,\n): Promise<OAuthTokenResponse> {\n const cloudUrl = getCloudUrlFromRegion(config.cloudRegion);\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n const authUrl = new URL(`${cloudUrl}/oauth/authorize`);\n authUrl.searchParams.set(\n 'client_id',\n getOauthClientIdFromRegion(config.cloudRegion),\n );\n authUrl.searchParams.set(\n 'redirect_uri',\n `http://localhost:${OAUTH_PORT}/callback`,\n );\n authUrl.searchParams.set('response_type', 'code');\n authUrl.searchParams.set('code_challenge', codeChallenge);\n authUrl.searchParams.set('code_challenge_method', 'S256');\n authUrl.searchParams.set('scope', config.scopes.join(' '));\n authUrl.searchParams.set('required_access_level', 'project');\n\n const signupUrl = new URL(\n `${cloudUrl}/signup?next=${encodeURIComponent(authUrl.toString())}`,\n );\n\n const localSignupUrl = `http://localhost:${OAUTH_PORT}/authorize?signup=true`;\n const localLoginUrl = `http://localhost:${OAUTH_PORT}/authorize`;\n\n const urlToOpen = config.signup ? localSignupUrl : localLoginUrl;\n\n const { server, waitForCallback } = await startCallbackServer(\n authUrl.toString(),\n signupUrl.toString(),\n );\n\n clack.log.info(\n `${chalk.bold(\n \"If the browser window didn't open automatically, please open the following link to be redirected to PostHog:\",\n )}\\n\\n${chalk.cyan(urlToOpen)}${\n config.signup\n ? `\\n\\nIf you already have an account, you can use this link:\\n\\n${chalk.cyan(\n localLoginUrl,\n )}`\n : ``\n }`,\n );\n\n if (process.env.NODE_ENV !== 'test') {\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments without a browser\n });\n }\n\n const loginSpinner = clack.spinner();\n loginSpinner.start('Waiting for authorization...');\n\n try {\n const code = await Promise.race([\n waitForCallback(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Authorization timed out')), 60_000),\n ),\n ]);\n\n const token = await exchangeCodeForToken(code, codeVerifier, config);\n\n server.close();\n loginSpinner.stop('Authorization complete!');\n\n return token;\n } catch (e) {\n loginSpinner.stop('Authorization failed.');\n server.close();\n\n const error = e instanceof Error ? e : new Error('Unknown error');\n\n if (error.message.includes('timeout')) {\n clack.log.error('Authorization timed out. Please try again.');\n } else if (error.message.includes('access_denied')) {\n clack.log.info(\n `${chalk.yellow(\n 'Authorization was cancelled.',\n )}\\n\\nYou denied access to PostHog. To use the wizard, you need to authorize access to your PostHog account.\\n\\n${chalk.dim(\n 'You can try again by re-running the wizard.',\n )}`,\n );\n } else {\n clack.log.error(\n `${chalk.red('Authorization failed:')}\\n\\n${\n error.message\n }\\n\\n${chalk.dim(\n `If you think this is a bug in the PostHog wizard, please create an issue:\\n${ISSUES_URL}`,\n )}`,\n );\n }\n\n analytics.captureException(error, {\n step: 'oauth_flow',\n cloud_region: config.cloudRegion,\n });\n\n await abort();\n throw error;\n }\n}\n"]}
@@ -45,10 +45,21 @@ export type WizardOptions = {
45
45
  * Personal API key (phx_xxx) - used for LLM gateway auth, skips OAuth
46
46
  */
47
47
  apiKey?: string;
48
+ /**
49
+ * PostHog project ID. When set (e.g. in CI with --project-id), the wizard uses this project
50
+ * instead of the default from the API key or OAuth.
51
+ */
52
+ projectId?: number;
48
53
  /**
49
54
  * Whether to show the menu for manual integration selection instead of auto-detecting.
50
55
  */
51
56
  menu: boolean;
57
+ /**
58
+ * Whether to run in benchmark mode with per-phase token tracking.
59
+ * When enabled, the wizard runs each workflow phase as a separate agent call
60
+ * and writes detailed usage data to /tmp/posthog-wizard-benchmark.json.
61
+ */
62
+ benchmark: boolean;
52
63
  };
53
64
  export interface Feature {
54
65
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PostHogProjectData = Record<string, unknown>;\n\nexport type PreselectedProject = {\n project: PostHogProjectData;\n authToken: string;\n};\n\nexport type WizardOptions = {\n /**\n * Whether to enable debug mode.\n */\n debug: boolean;\n\n /**\n * Whether to force install the SDK package to continue with the installation in case\n * any package manager checks are failing (e.g. peer dependency versions).\n *\n * Use with caution and only if you know what you're doing.\n *\n * Does not apply to all wizard flows (currently NPM only)\n */\n forceInstall: boolean;\n\n /**\n * The directory to run the wizard in.\n */\n installDir: string;\n\n /**\n * The cloud region to use.\n */\n cloudRegion?: CloudRegion;\n\n /**\n * Whether to select the default option for all questions automatically.\n */\n default: boolean;\n\n /**\n * Whether to create a new PostHog account during setup.\n */\n signup: boolean;\n\n /**\n * Whether to use the local MCP server at http://localhost:8787/mcp\n */\n localMcp: boolean;\n\n /**\n * CI mode - non-interactive execution\n */\n ci: boolean;\n\n /**\n * Personal API key (phx_xxx) - used for LLM gateway auth, skips OAuth\n */\n apiKey?: string;\n\n /**\n * Whether to show the menu for manual integration selection instead of auto-detecting.\n */\n menu: boolean;\n};\n\nexport interface Feature {\n id: string;\n prompt: string;\n enabledHint?: string;\n disabledHint?: string;\n}\n\nexport type FileChange = {\n filePath: string;\n oldContent?: string;\n newContent: string;\n};\n\nexport type CloudRegion = 'us' | 'eu';\n\nexport type AIModel =\n | 'gpt-5-mini'\n | 'o4-mini'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-pro';\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PostHogProjectData = Record<string, unknown>;\n\nexport type PreselectedProject = {\n project: PostHogProjectData;\n authToken: string;\n};\n\nexport type WizardOptions = {\n /**\n * Whether to enable debug mode.\n */\n debug: boolean;\n\n /**\n * Whether to force install the SDK package to continue with the installation in case\n * any package manager checks are failing (e.g. peer dependency versions).\n *\n * Use with caution and only if you know what you're doing.\n *\n * Does not apply to all wizard flows (currently NPM only)\n */\n forceInstall: boolean;\n\n /**\n * The directory to run the wizard in.\n */\n installDir: string;\n\n /**\n * The cloud region to use.\n */\n cloudRegion?: CloudRegion;\n\n /**\n * Whether to select the default option for all questions automatically.\n */\n default: boolean;\n\n /**\n * Whether to create a new PostHog account during setup.\n */\n signup: boolean;\n\n /**\n * Whether to use the local MCP server at http://localhost:8787/mcp\n */\n localMcp: boolean;\n\n /**\n * CI mode - non-interactive execution\n */\n ci: boolean;\n\n /**\n * Personal API key (phx_xxx) - used for LLM gateway auth, skips OAuth\n */\n apiKey?: string;\n\n /**\n * PostHog project ID. When set (e.g. in CI with --project-id), the wizard uses this project\n * instead of the default from the API key or OAuth.\n */\n projectId?: number;\n\n /**\n * Whether to show the menu for manual integration selection instead of auto-detecting.\n */\n menu: boolean;\n\n /**\n * Whether to run in benchmark mode with per-phase token tracking.\n * When enabled, the wizard runs each workflow phase as a separate agent call\n * and writes detailed usage data to /tmp/posthog-wizard-benchmark.json.\n */\n benchmark: boolean;\n};\n\nexport interface Feature {\n id: string;\n prompt: string;\n enabledHint?: string;\n disabledHint?: string;\n}\n\nexport type FileChange = {\n filePath: string;\n oldContent?: string;\n newContent: string;\n};\n\nexport type CloudRegion = 'us' | 'eu';\n\nexport type AIModel =\n | 'gpt-5-mini'\n | 'o4-mini'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-pro';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/wizard",
3
- "version": "1.33.0",
3
+ "version": "1.35.0",
4
4
  "homepage": "https://github.com/PostHog/wizard",
5
5
  "repository": "https://github.com/PostHog/wizard",
6
6
  "description": "The PostHog wizard helps you to configure your project",
@@ -32,7 +32,7 @@
32
32
  "definition": "dist/index.d.ts"
33
33
  },
34
34
  "dependencies": {
35
- "@anthropic-ai/claude-agent-sdk": "~0.1.65",
35
+ "@anthropic-ai/claude-agent-sdk": "0.2.50",
36
36
  "@clack/core": "^0.3.4",
37
37
  "@clack/prompts": "0.7.0",
38
38
  "@langchain/core": "^0.3.40",