@workflow/cli 5.0.0-beta.3 → 5.0.0-beta.31

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 (98) hide show
  1. package/dist/base.d.ts.map +1 -1
  2. package/dist/base.js +8 -2
  3. package/dist/commands/build.js +1 -1
  4. package/dist/commands/cancel.d.ts.map +1 -1
  5. package/dist/commands/cancel.js +56 -10
  6. package/dist/commands/dev.js +1 -1
  7. package/dist/commands/health.js +1 -1
  8. package/dist/commands/init.js +1 -1
  9. package/dist/commands/inspect.d.ts +3 -0
  10. package/dist/commands/inspect.d.ts.map +1 -1
  11. package/dist/commands/inspect.js +37 -7
  12. package/dist/commands/start.d.ts.map +1 -1
  13. package/dist/commands/start.js +8 -3
  14. package/dist/commands/transform.js +1 -1
  15. package/dist/commands/validate.js +1 -1
  16. package/dist/commands/web.d.ts +1 -0
  17. package/dist/commands/web.d.ts.map +1 -1
  18. package/dist/commands/web.js +9 -3
  19. package/dist/lib/config/log.js +1 -1
  20. package/dist/lib/config/types.d.ts +6 -1
  21. package/dist/lib/config/types.d.ts.map +1 -1
  22. package/dist/lib/config/types.js +1 -1
  23. package/dist/lib/config/workflow-config.js +1 -1
  24. package/dist/lib/inspect/auth.js +1 -1
  25. package/dist/lib/inspect/env.d.ts +1 -1
  26. package/dist/lib/inspect/env.js +2 -2
  27. package/dist/lib/inspect/errors.d.ts +3 -0
  28. package/dist/lib/inspect/errors.d.ts.map +1 -0
  29. package/dist/lib/inspect/errors.js +27 -0
  30. package/dist/lib/inspect/flags.d.ts +8 -0
  31. package/dist/lib/inspect/flags.d.ts.map +1 -1
  32. package/dist/lib/inspect/flags.js +15 -1
  33. package/dist/lib/inspect/hydration.d.ts +22 -0
  34. package/dist/lib/inspect/hydration.d.ts.map +1 -1
  35. package/dist/lib/inspect/hydration.js +102 -47
  36. package/dist/lib/inspect/hydration.test.d.ts +2 -0
  37. package/dist/lib/inspect/hydration.test.d.ts.map +1 -0
  38. package/dist/lib/inspect/hydration.test.js +23 -0
  39. package/dist/lib/inspect/output.d.ts +2 -2
  40. package/dist/lib/inspect/output.d.ts.map +1 -1
  41. package/dist/lib/inspect/output.js +255 -131
  42. package/dist/lib/inspect/output.test.js +403 -3
  43. package/dist/lib/inspect/pagination.d.ts +10 -1
  44. package/dist/lib/inspect/pagination.d.ts.map +1 -1
  45. package/dist/lib/inspect/pagination.js +20 -4
  46. package/dist/lib/inspect/run.d.ts.map +1 -1
  47. package/dist/lib/inspect/run.js +32 -9
  48. package/dist/lib/inspect/setup.d.ts.map +1 -1
  49. package/dist/lib/inspect/setup.js +42 -6
  50. package/dist/lib/inspect/stream.js +1 -1
  51. package/dist/lib/inspect/terminal-utils.js +1 -1
  52. package/dist/lib/inspect/time-window.d.ts +28 -0
  53. package/dist/lib/inspect/time-window.d.ts.map +1 -0
  54. package/dist/lib/inspect/time-window.js +61 -0
  55. package/dist/lib/inspect/time-window.test.d.ts +2 -0
  56. package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
  57. package/dist/lib/inspect/time-window.test.js +58 -0
  58. package/dist/lib/inspect/vercel-api.d.ts +5 -2
  59. package/dist/lib/inspect/vercel-api.d.ts.map +1 -1
  60. package/dist/lib/inspect/vercel-api.js +12 -37
  61. package/dist/lib/inspect/vercel-api.test.d.ts +2 -0
  62. package/dist/lib/inspect/vercel-api.test.d.ts.map +1 -0
  63. package/dist/lib/inspect/vercel-api.test.js +21 -0
  64. package/dist/lib/inspect/vercel-link.js +1 -1
  65. package/dist/lib/inspect/web.d.ts +24 -0
  66. package/dist/lib/inspect/web.d.ts.map +1 -1
  67. package/dist/lib/inspect/web.js +47 -3
  68. package/dist/lib/update-check.js +1 -1
  69. package/package.json +14 -14
  70. package/dist/base.js.map +0 -1
  71. package/dist/commands/build.js.map +0 -1
  72. package/dist/commands/cancel.js.map +0 -1
  73. package/dist/commands/dev.js.map +0 -1
  74. package/dist/commands/health.js.map +0 -1
  75. package/dist/commands/init.js.map +0 -1
  76. package/dist/commands/inspect.js.map +0 -1
  77. package/dist/commands/start.js.map +0 -1
  78. package/dist/commands/transform.js.map +0 -1
  79. package/dist/commands/validate.js.map +0 -1
  80. package/dist/commands/web.js.map +0 -1
  81. package/dist/lib/config/log.js.map +0 -1
  82. package/dist/lib/config/types.js.map +0 -1
  83. package/dist/lib/config/workflow-config.js.map +0 -1
  84. package/dist/lib/inspect/auth.js.map +0 -1
  85. package/dist/lib/inspect/env.js.map +0 -1
  86. package/dist/lib/inspect/flags.js.map +0 -1
  87. package/dist/lib/inspect/hydration.js.map +0 -1
  88. package/dist/lib/inspect/output.js.map +0 -1
  89. package/dist/lib/inspect/output.test.js.map +0 -1
  90. package/dist/lib/inspect/pagination.js.map +0 -1
  91. package/dist/lib/inspect/run.js.map +0 -1
  92. package/dist/lib/inspect/setup.js.map +0 -1
  93. package/dist/lib/inspect/stream.js.map +0 -1
  94. package/dist/lib/inspect/terminal-utils.js.map +0 -1
  95. package/dist/lib/inspect/vercel-api.js.map +0 -1
  96. package/dist/lib/inspect/vercel-link.js.map +0 -1
  97. package/dist/lib/inspect/web.js.map +0 -1
  98. package/dist/lib/update-check.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAC1C,MAAM,CAAC,WAAW,GAAG,0CAA0C,CAAC;IAEhE,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAEvB,MAAM,CAAC,QAAQ,GAAG;QAChB,gBAAgB;QAChB,+CAA+C;QAC/C,iCAAiC;KAClC,CAAC;IAEF,KAAK,CAAC,KAAK,CAAC,KAAU;QACpB,uDAAuD;QACvD,IAAI,KAAK,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,wBAAwB,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,UAAU,YAAY,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;YACd,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,KAAK;SAChB,CAAC;KACM,CAAC;IAEX,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,QAAQ;KACH,CAAC;IAEJ,KAAK,CAAC,GAAG;QACd,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YAEnB,mDAAmD;YACnD,wEAAwE;YACxE,4DAA4D;YAC5D,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAEtD,mDAAmD;YACnD,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yDAAyD;YACzD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC","sourcesContent":["import { Args } from '@oclif/core';\nimport { VERCEL_403_ERROR_MESSAGE } from '@workflow/errors';\nimport { BaseCommand } from '../base.js';\nimport { LOGGING_CONFIG, logger } from '../lib/config/log.js';\nimport { cliFlags } from '../lib/inspect/flags.js';\nimport { setupCliWorld } from '../lib/inspect/setup.js';\nimport { launchWebUI } from '../lib/inspect/web.js';\n\nexport default class Web extends BaseCommand {\n static description = 'Open the web UI to inspect workflow runs';\n\n static aliases = ['w'];\n\n static examples = [\n '$ workflow web',\n '$ workflow web run_01K5WAJZ8W367CV2RFKDSDNWB8',\n '$ workflow web --backend=vercel',\n ];\n\n async catch(error: any) {\n // Check if this is a 403 error from the Vercel backend\n if (error?.status === 403) {\n const message = VERCEL_403_ERROR_MESSAGE;\n logger.error(message);\n } else if (LOGGING_CONFIG.VERBOSE_MODE) {\n logger.error(error);\n } else {\n const errorMessage = error?.message || String(error) || 'Unknown error';\n logger.error(`Error: ${errorMessage}`);\n }\n process.exit(1);\n }\n\n static args = {\n id: Args.string({\n description: 'Optional run ID to open directly',\n required: false,\n }),\n } as const;\n\n static flags = {\n ...cliFlags,\n } as const;\n\n public async run(): Promise<void> {\n try {\n const { args, flags } = await this.parse(Web);\n const id = args.id;\n\n // Setup the CLI world to write env vars from flags\n // This ensures backend, authToken, team, project, etc. are properly set\n // Don't throw on config errors - let the web UI handle them\n await setupCliWorld(flags, this.config.version, true);\n\n // Launch web UI with 'run' as the default resource\n await launchWebUI('run', id, flags, this.config.version);\n process.exit(0);\n } catch (error) {\n // Let the catch handler deal with it, but ensure we exit\n throw error;\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/lib/config/log.ts"],"names":[],"mappings":"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","sourcesContent":["import boxen from 'boxen';\nimport chalk from 'chalk';\n\nexport const LOGGING_CONFIG = {\n JSON_MODE: false,\n VERBOSE_MODE: false,\n};\n\nexport const setJsonMode = (value: boolean) => {\n LOGGING_CONFIG.JSON_MODE = Boolean(value);\n process.env.WORKFLOW_JSON_MODE = value ? '1' : '';\n};\n\nexport const setVerboseMode = (value: boolean) => {\n LOGGING_CONFIG.VERBOSE_MODE = Boolean(value);\n};\n\n/**\n * This Logger should be unified with `core/src/logger.ts`. The main difference\n * is that the CLI logger has internal handling on JSON/VERBOSE modes, but\n * does not implement per-module logging and debug levels.\n *\n * There are four modes of operation:\n * - Regular (both JSON and VERBOSE modes are off)\n * - JSON mode (JSON mode is on, VERBOSE mode is off)\n * - verbose mode (JSON mode is off, VERBOSE mode is on)\n * - verbose JSON mode (JSON and VERBOSE modes are on)\n *\n * Generally, we want to hide debug logs unless verbose mode is on,\n * and during JSON mode, we want to ensure no logs end up in stdout,\n * because we assume the user might be piping the output to a JSON parser.\n * However, during verbose JSON mode, we want to keep debug information\n * without breaking the JSON output, so we redirect all logs to stderr.\n */\nclass Logger {\n constructor() {}\n\n shouldLogToStderr = () => {\n return LOGGING_CONFIG.JSON_MODE;\n };\n\n shouldSkipDebugLogs = () => {\n return !LOGGING_CONFIG.VERBOSE_MODE;\n };\n\n private logPlain = (...args: any[]) => {\n if (this.shouldLogToStderr()) {\n console.error(...args);\n return;\n }\n console.log(...args);\n };\n\n private logDebug = (...args: any[]) => {\n if (this.shouldLogToStderr()) {\n console.error(...args);\n return;\n }\n if (this.shouldSkipDebugLogs()) {\n return;\n }\n console.debug(...args);\n };\n\n private logWarn = (...args: any[]) => {\n if (this.shouldLogToStderr()) {\n console.error(...args);\n return;\n }\n console.warn(...args);\n };\n\n private logError = (...args: any[]) => {\n console.error(...args);\n };\n\n log = (...args: any[]) => {\n this.logPlain(...args);\n };\n\n info = (...args: any[]) => {\n this.logPlain(chalk.white(`[Info]`, ...args));\n };\n\n success = (...args: any[]) => {\n this.logPlain(chalk.green(`[Success]`, ...args));\n };\n\n debug = (...args: any[]) => {\n this.logDebug(chalk.gray(`[Debug]`, ...args));\n };\n\n warn = (...args: any[]) => {\n this.logWarn(chalk.yellow(`[Warn]`, ...args));\n };\n\n error = (...args: any[]) => {\n this.logError(chalk.red(`[Error]`, ...args));\n };\n\n showBox = (\n color: 'yellow' | 'green' | 'white',\n ...lines: (string | undefined)[]\n ) => {\n const borderColor =\n color === 'yellow' ? 'yellow' : color === 'green' ? 'green' : 'white';\n const content = lines.filter((line) => line !== undefined).join('\\n');\n const box = boxen(content, {\n padding: 1,\n borderColor: borderColor as any,\n textAlignment: 'center',\n });\n this.logPlain(box);\n };\n}\n\nexport const logger = new Logger();\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/config/types.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC","sourcesContent":["// Re-export builder types for backwards compatibility\nexport type {\n BuildTarget,\n WorkflowConfig,\n} from '@workflow/builders';\nexport {\n isValidBuildTarget,\n validBuildTargets,\n} from '@workflow/builders';\n\nexport type InspectCLIOptions = {\n json?: boolean;\n watch?: boolean;\n runId?: string;\n stepId?: string;\n hookId?: string;\n cursor?: string;\n sort?: 'asc' | 'desc';\n limit?: number;\n workflowName?: string;\n status?: string;\n withData?: boolean;\n backend?: string;\n disableRelativeDates?: boolean;\n interactive?: boolean;\n /** When true, decrypt encrypted values (triggers audit-logged key retrieval) */\n decrypt?: boolean;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow-config.js","sourceRoot":"","sources":["../../../src/lib/config/workflow-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,SAAS,uBAAuB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACnD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,sEAAsE;IACtE,oCAAoC;IACpC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,EACE,WAAW,EACX,gBAAgB,MAId;IACF,WAAW,EAAE,YAAY;CAC1B,EACD,EAAE;IACF,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,CAAC,aAAa,CAAC;QACrB,UAAU,EAAE,uBAAuB,EAAE;QACrC,WAAW,EAAE,WAA0B;QACvC,eAAe,EAAE,oCAAoC;QACrD,mBAAmB,EAAE,oCAAoC;QACzD,iBAAiB,EAAE,uCAAuC;QAC1D,oBAAoB,EAAE,gBAAgB;QAEtC,mEAAmE;QACnE,oDAAoD;KACrD,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import type { BuildTarget, WorkflowConfig } from './types.js';\nimport { resolve } from 'node:path';\n\nfunction resolveObservabilityCwd(): string {\n const raw = process.env.WORKFLOW_OBSERVABILITY_CWD;\n if (!raw) {\n return process.cwd();\n }\n // Allow relative paths; resolve relative to the current process.cwd()\n // (i.e. where the CLI was invoked).\n return resolve(process.cwd(), raw);\n}\n\nexport const getWorkflowConfig = (\n {\n buildTarget,\n workflowManifest,\n }: {\n buildTarget?: BuildTarget;\n workflowManifest?: string;\n } = {\n buildTarget: 'standalone',\n }\n) => {\n const config: WorkflowConfig = {\n dirs: ['./workflows'],\n workingDir: resolveObservabilityCwd(),\n buildTarget: buildTarget as BuildTarget,\n stepsBundlePath: './.well-known/workflow/v1/step.mjs',\n workflowsBundlePath: './.well-known/workflow/v1/flow.mjs',\n webhookBundlePath: './.well-known/workflow/v1/webhook.mjs',\n workflowManifestPath: workflowManifest,\n\n // WIP: generate a client library to easily execute workflows/steps\n // clientBundlePath: './lib/generated/workflows.js',\n };\n return config;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/inspect/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACpD,MAAM,oBAAoB,GAAG,qCAAqC,CAAC;AACnE,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,WAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2DAA2D;IAC3D,qCAAqC;IACrC,IAAI,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,WAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACnD,IAAI,WAAW,CAAC,SAAS,IAAI,YAAY,EAAE,CAAC;QAC1C,uBAAuB;QACvB,OAAO,WAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC;YAC7B,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,KAAK,CAAC;YAClB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,oBAAoB;YAC9B,SAAS;SACV,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAErE,MAAM,kBAAkB,GAAG;YACzB,GAAG,WAAW;YACd,KAAK,EAAE,QAAQ,CAAC,YAAY;YAC5B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,UAAU;YAC9D,GAAG,CAAC,QAAQ,CAAC,aAAa;gBACxB,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,aAAa,EAAE;gBAC1C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAElD,OAAO,QAAQ,CAAC,YAAY,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import {\n type Credentials,\n CredentialsStore,\n} from '@vercel/cli-auth/credentials-store.js';\nimport { OAuth } from '@vercel/cli-auth/oauth.js';\nimport { getUserAgent } from '@vercel/cli-auth/user-agent.js';\nimport { logger } from '../config/log.js';\n\nconst VERCEL_ISSUER = new URL('https://vercel.com');\nconst VERCEL_CLI_CLIENT_ID = 'cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp';\nconst CREDENTIALS_DIR = 'com.vercel.cli';\n\nconst store = CredentialsStore(CREDENTIALS_DIR);\n\n/**\n * Reads the auth token, refreshing it via OAuth if expired.\n *\n * Uses `@vercel/cli-auth` to:\n * 1. Read credentials from disk (`auth.json`)\n * 2. Check if the access token is expired\n * 3. If expired, use the refresh token to obtain a new access token\n * 4. Persist the updated credentials back to disk\n *\n * Returns the valid access token, or `null` if credentials are\n * missing or the refresh fails.\n */\nexport async function getAuthToken(): Promise<string | null> {\n let credentials: Credentials;\n try {\n credentials = store.get();\n } catch {\n return null;\n }\n if (!credentials?.token) {\n return null;\n }\n\n // If there's no expiration info, assume the token is valid\n // (e.g. legacy tokens without OAuth)\n if (typeof credentials.expiresAt !== 'number') {\n return credentials.token;\n }\n\n const nowInSeconds = Math.floor(Date.now() / 1000);\n if (credentials.expiresAt >= nowInSeconds) {\n // Token is still valid\n return credentials.token;\n }\n\n // Token is expired — attempt refresh\n if (!credentials.refreshToken) {\n logger.debug('Auth token expired and no refresh token available');\n return null;\n }\n\n logger.debug('Auth token expired, refreshing via OAuth...');\n try {\n const userAgent = getUserAgent({\n name: '@workflow/cli',\n version: '0.0.0',\n });\n\n const oauth = OAuth({\n issuer: VERCEL_ISSUER,\n clientId: VERCEL_CLI_CLIENT_ID,\n userAgent,\n });\n const client = await oauth.init();\n const tokenSet = await client.refreshToken(credentials.refreshToken);\n\n const updatedCredentials = {\n ...credentials,\n token: tokenSet.access_token,\n expiresAt: Math.floor(Date.now() / 1000) + tokenSet.expires_in,\n ...(tokenSet.refresh_token\n ? { refreshToken: tokenSet.refresh_token }\n : {}),\n };\n\n store.update(updatedCredentials);\n logger.debug('Auth token refreshed successfully');\n\n return tokenSet.access_token;\n } catch (error) {\n logger.debug('Failed to refresh auth token:', error);\n return null;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/inspect/env.ts"],"names":[],"mappings":"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","sourcesContent":["import { access } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { findWorkflowDataDir } from '@workflow/utils/check-data-dir';\nimport { logger } from '../config/log.js';\nimport { getWorkflowConfig } from '../config/workflow-config.js';\nimport { getAuthToken } from './auth.js';\nimport { fetchTeamInfo } from './vercel-api.js';\nimport {\n findRepoRoot,\n getProjectLink,\n isOneOfErrNoExceptions,\n type ProjectLink,\n} from './vercel-link.js';\n\n/**\n * Overwrite values on process.env with the given values (if not undefined)\n *\n * Used by the CLI to configure environment variables that are read by\n * various subsystems (e.g., WORKFLOW_TARGET_WORLD, WORKFLOW_LOCAL_DATA_DIR).\n * Note: WORKFLOW_VERCEL_* env vars are read back via getEnvVars() and passed\n * to createVercelWorld() explicitly — they are NOT read by createWorld().\n */\nexport const writeEnvVars = (envVars: Record<string, string>) => {\n Object.entries(envVars).forEach(([key, value]) => {\n if (\n value === undefined ||\n value === null ||\n value === '' ||\n value === 'undefined'\n ) {\n return;\n }\n process.env[key] = value;\n });\n};\n\nexport const getEnvVars = (): Record<string, string> => {\n const env = process.env;\n return {\n WORKFLOW_TARGET_WORLD: env.WORKFLOW_TARGET_WORLD || '',\n WORKFLOW_VERCEL_ENV: env.WORKFLOW_VERCEL_ENV || '',\n WORKFLOW_VERCEL_AUTH_TOKEN: env.WORKFLOW_VERCEL_AUTH_TOKEN || '',\n WORKFLOW_VERCEL_PROJECT: env.WORKFLOW_VERCEL_PROJECT || '',\n WORKFLOW_VERCEL_PROJECT_NAME: env.WORKFLOW_VERCEL_PROJECT_NAME || '',\n WORKFLOW_VERCEL_TEAM: env.WORKFLOW_VERCEL_TEAM || '',\n WORKFLOW_LOCAL_BASE_URL: env.WORKFLOW_LOCAL_BASE_URL || '',\n WORKFLOW_LOCAL_UI: env.WORKFLOW_LOCAL_UI || '',\n PORT: env.PORT || '',\n WORKFLOW_LOCAL_DATA_DIR: env.WORKFLOW_LOCAL_DATA_DIR || '',\n WORKFLOW_MANIFEST_PATH: env.WORKFLOW_MANIFEST_PATH || '',\n };\n};\n\nconst possibleManifestPaths = [\n 'app/.well-known/workflow/v1/manifest.json',\n 'src/app/.well-known/workflow/v1/manifest.json',\n '.well-known/workflow/v1/manifest.json',\n];\n\nasync function findManifestPath(cwd: string) {\n for (const path of possibleManifestPaths) {\n const fullPath = join(cwd, path);\n if (\n await access(fullPath)\n .then(() => true)\n .catch(() => false)\n ) {\n const absolutePath = resolve(fullPath);\n logger.debug('Found workflow manifest:', absolutePath);\n return absolutePath;\n }\n }\n}\n\n/**\n * Overwrites process.env variables related to local world configuration,\n * if relevant environment variables aren't set already.\n *\n * Throws if the workflow data directory can not be found.\n */\nexport const inferLocalWorldEnvVars = async () => {\n const envVars = getEnvVars();\n const cwd = getWorkflowConfig().workingDir;\n let repoRoot: string | undefined;\n\n // Always expose the effective working directory to the web UI/server-side helpers.\n // This is especially useful when developing the web UI from the workflow repo\n // while targeting another project directory.\n if (!process.env.WORKFLOW_OBSERVABILITY_CWD) {\n writeEnvVars({ WORKFLOW_OBSERVABILITY_CWD: cwd });\n }\n\n // Set default base URL for local queue if not already configured\n // We use WORKFLOW_LOCAL_BASE_URL instead of PORT to avoid conflicts\n // with other tools (like Next.js) that also use the PORT env var\n if (!envVars.WORKFLOW_LOCAL_BASE_URL && !envVars.PORT) {\n logger.debug(\n 'Using default queue target http://localhost:3000, set WORKFLOW_LOCAL_BASE_URL or PORT to override.'\n );\n envVars.WORKFLOW_LOCAL_BASE_URL = 'http://localhost:3000';\n writeEnvVars(envVars);\n }\n\n // Infer workflow data directory\n if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {\n const localResult = await findWorkflowDataDir(cwd);\n if (localResult.dataDir) {\n logger.debug('Found workflow data directory:', localResult.dataDir);\n envVars.WORKFLOW_LOCAL_DATA_DIR = localResult.dataDir;\n writeEnvVars(envVars);\n } else {\n // As a fallback, find the repo root, and try to infer the data dir from there\n repoRoot = await findRepoRoot(cwd, cwd);\n if (repoRoot) {\n const repoResult = await findWorkflowDataDir(repoRoot);\n if (repoResult.dataDir) {\n logger.debug('Found workflow data directory:', repoResult.dataDir);\n envVars.WORKFLOW_LOCAL_DATA_DIR = repoResult.dataDir;\n writeEnvVars(envVars);\n }\n }\n if (!envVars.WORKFLOW_LOCAL_DATA_DIR) {\n const message = `No workflow data directory found in \"${cwd}\". Have you run any workflows yet?`;\n throw new Error(message);\n }\n }\n }\n\n // Infer workflow manifest path (for Graph tab in web UI)\n if (!envVars.WORKFLOW_MANIFEST_PATH) {\n const localManifest = await findManifestPath(cwd);\n if (localManifest) {\n envVars.WORKFLOW_MANIFEST_PATH = localManifest;\n writeEnvVars(envVars);\n logger.debug(`Found workflow manifest at: ${localManifest}`);\n } else {\n // As a fallback, find the repo root, and try to infer the manifest from there\n if (!repoRoot) {\n repoRoot = await findRepoRoot(cwd, cwd);\n }\n if (repoRoot) {\n const repoManifest = await findManifestPath(repoRoot);\n if (repoManifest) {\n envVars.WORKFLOW_MANIFEST_PATH = repoManifest;\n writeEnvVars(envVars);\n logger.debug(`Found workflow manifest at: ${repoManifest}`);\n }\n }\n\n // It's okay if manifest is not found - the web UI will just show empty workflows\n if (!envVars.WORKFLOW_MANIFEST_PATH) {\n logger.debug(\n 'No workflow manifest found. Workflows tab will be empty.'\n );\n }\n }\n }\n};\n\nexport const inferVercelProjectAndTeam = async () => {\n const cwd = getWorkflowConfig().workingDir;\n let project: ProjectLink | null = null;\n try {\n logger.debug(`Inferring project and team from CWD: ${cwd}`);\n project = await getProjectLink(cwd);\n } catch (error) {\n if (!isOneOfErrNoExceptions(error, ['ENOENT'])) {\n throw error;\n }\n }\n if (!project) {\n logger.debug('Could not find project link folder');\n return;\n }\n logger.debug(`Found project ${project.projectId} and team ${project.orgId}`);\n return {\n projectId: project.projectId,\n projectName: project.projectName,\n teamId: project.orgId,\n };\n};\n\nexport interface VercelEnvVars {\n token?: string;\n environment?: string;\n projectId?: string;\n projectName?: string;\n teamId?: string;\n}\n\n/**\n * Infers Vercel World configuration from the local environment (`.vercel`\n * folder, CLI auth file, Vercel API) and returns a resolved config object.\n *\n * Also writes the resolved values to `process.env` so the embedded web UI\n * (which reads `process.env` as a fallback) can pick them up.\n */\nexport const inferVercelEnvVars = async (): Promise<VercelEnvVars> => {\n const envVars = getEnvVars();\n\n // Infer project/team from .vercel folder when:\n // - WORKFLOW_VERCEL_PROJECT or WORKFLOW_VERCEL_TEAM is missing, OR\n // - WORKFLOW_VERCEL_PROJECT is set but doesn't look like a real project ID\n // (e.g., user passed a slug via --project flag), OR\n // - WORKFLOW_VERCEL_PROJECT_NAME is missing (need to populate the slug)\n const needsInference =\n !envVars.WORKFLOW_VERCEL_PROJECT ||\n !envVars.WORKFLOW_VERCEL_TEAM ||\n !envVars.WORKFLOW_VERCEL_PROJECT_NAME ||\n !envVars.WORKFLOW_VERCEL_PROJECT.startsWith('prj_');\n\n if (needsInference) {\n logger.debug('Inferring vercel project and team from .vercel folder');\n const inferredProject = await inferVercelProjectAndTeam();\n if (inferredProject) {\n const { projectId, projectName, teamId } = inferredProject;\n // WORKFLOW_VERCEL_PROJECT is the real project ID (e.g., prj_xxx)\n envVars.WORKFLOW_VERCEL_PROJECT = projectId;\n // WORKFLOW_VERCEL_PROJECT_NAME is the project slug (e.g., my-app)\n envVars.WORKFLOW_VERCEL_PROJECT_NAME = projectName || projectId;\n envVars.WORKFLOW_VERCEL_TEAM = envVars.WORKFLOW_VERCEL_TEAM || teamId;\n } else {\n logger.warn(\n 'Could not infer vercel project and team from .vercel folder, server authentication might fail.'\n );\n }\n }\n\n if (!envVars.WORKFLOW_VERCEL_AUTH_TOKEN) {\n logger.debug('Inferring vercel auth token from CLI auth file');\n const token = await getAuthToken();\n if (!token) {\n throw new Error('Could not find credentials. Run `vc login` to log in.');\n }\n envVars.WORKFLOW_VERCEL_AUTH_TOKEN = token;\n }\n\n // Fetch team information from Vercel API to get the team slug\n // TODO: Sadly, in order to redirect to Vercel dashboard correctly, we need to\n // resolve the team name, which is a whole API request. The alternative would be to\n // change front to allow passing in the team slug directly, or add some generic redirect.\n if (envVars.WORKFLOW_VERCEL_TEAM && envVars.WORKFLOW_VERCEL_AUTH_TOKEN) {\n logger.info('Vercel project detected. Loading project data...');\n logger.debug('Fetching team information from Vercel API');\n const teamInfo = await fetchTeamInfo(\n envVars.WORKFLOW_VERCEL_TEAM,\n envVars.WORKFLOW_VERCEL_AUTH_TOKEN\n );\n if (teamInfo) {\n envVars.WORKFLOW_VERCEL_TEAM = teamInfo.teamSlug;\n logger.debug(`Found team slug: ${teamInfo.teamSlug}`);\n }\n }\n\n // Write resolved values to process.env for the embedded web UI, which\n // reads them as fallbacks in its server actions.\n writeEnvVars(envVars);\n\n return {\n token: envVars.WORKFLOW_VERCEL_AUTH_TOKEN || undefined,\n environment: envVars.WORKFLOW_VERCEL_ENV || undefined,\n projectId: envVars.WORKFLOW_VERCEL_PROJECT || undefined,\n projectName: envVars.WORKFLOW_VERCEL_PROJECT_NAME || undefined,\n teamId: envVars.WORKFLOW_VERCEL_TEAM || undefined,\n };\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../../src/lib/inspect/flags.ts"],"names":[],"mappings":"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","sourcesContent":["import { Flags } from '@oclif/core';\n\nexport const cliFlags = {\n verbose: Flags.boolean({\n description: 'Verbose output',\n required: false,\n char: 'v',\n helpGroup: 'Output',\n helpLabel: '-v, --verbose',\n env: 'DEBUG',\n default: false,\n }),\n json: Flags.boolean({\n description: 'output JSON instead of human-readable tables/streams',\n required: false,\n char: 'j',\n default: false,\n helpGroup: 'Output',\n helpLabel: '-j, --json',\n }),\n cursor: Flags.string({\n description: 'pagination cursor for list commands',\n required: false,\n default: '',\n helpGroup: 'Filtering',\n helpLabel: '--cursor',\n helpValue: 'CURSOR',\n }),\n backend: Flags.string({\n description: 'backend to inspect',\n required: false,\n char: 'b',\n default: 'local',\n env: 'WORKFLOW_TARGET_WORLD',\n helpGroup: 'Target',\n helpLabel: '-b, --backend',\n helpValue: ['local', 'vercel', '<your-package-name>'],\n defaultHelp: 'local',\n }),\n authToken: Flags.string({\n description:\n 'Authentication token to be passed to the backend. If not provided and the backend is vercel, will fall back to the token generated by `vc login`.',\n required: false,\n char: 'a',\n dependsOn: ['backend'],\n default: '',\n env: 'WORKFLOW_VERCEL_AUTH_TOKEN',\n helpGroup: 'Target',\n helpLabel: '-a, --authToken',\n helpValue: 'TOKEN',\n }),\n project: Flags.string({\n description:\n 'If backend is vercel, the vercel project to authenticate against',\n required: false,\n default: '',\n dependsOn: ['backend'],\n env: 'WORKFLOW_VERCEL_PROJECT',\n helpGroup: 'Target',\n helpLabel: '--project',\n helpValue: 'PROJECT',\n }),\n team: Flags.string({\n description:\n 'If backend is vercel, the vercel team to authenticate against',\n required: false,\n dependsOn: ['backend'],\n default: '',\n env: 'WORKFLOW_VERCEL_TEAM',\n helpGroup: 'Target',\n helpLabel: '--team',\n helpValue: 'TEAM',\n }),\n env: Flags.string({\n description: 'If backend is vercel, the vercel environment to use',\n required: false,\n options: ['production', 'preview'],\n default: 'production',\n char: 'e',\n dependsOn: ['backend'],\n env: 'WORKFLOW_VERCEL_ENV',\n helpGroup: 'Target',\n helpLabel: '-e, --env',\n helpValue: ['production', 'preview'],\n defaultHelp: 'production',\n }),\n web: Flags.boolean({\n description: 'Open the web UI instead of displaying in terminal',\n required: false,\n char: 'w',\n default: false,\n helpGroup: 'Output',\n helpLabel: '-w, --web',\n }),\n webPort: Flags.integer({\n description: 'Port to use when launching the web UI (default: 3456)',\n required: false,\n default: 3456,\n helpGroup: 'Output',\n helpLabel: '--webPort',\n helpValue: 'WEB_PORT',\n env: 'WORKFLOW_WEB_PORT',\n }),\n noBrowser: Flags.boolean({\n description: 'Disable automatic browser opening when launching web UI',\n required: false,\n default: false,\n env: 'WORKFLOW_DISABLE_BROWSER_OPEN',\n helpGroup: 'Output',\n helpLabel: '--noBrowser',\n }),\n localUi: Flags.boolean({\n description:\n 'Use local web UI instead of Vercel dashboard (when backend is vercel)',\n required: false,\n default: false,\n env: 'WORKFLOW_LOCAL_UI',\n helpGroup: 'Output',\n helpLabel: '--localUi',\n }),\n sort: Flags.string({\n description: 'sort order for list commands',\n required: false,\n options: ['asc', 'desc'],\n default: 'desc',\n helpGroup: 'Filtering',\n helpLabel: '--sort',\n helpValue: ['asc', 'desc'],\n defaultHelp: 'desc',\n }),\n limit: Flags.integer({\n description: 'number of items to return per page',\n required: false,\n default: 20,\n helpGroup: 'Filtering',\n helpLabel: '--limit',\n helpValue: 'NUMBER',\n }),\n interactive: Flags.boolean({\n description: 'Enable interactive pagination with keyboard controls',\n required: false,\n char: 'i',\n default: false,\n helpGroup: 'Output',\n helpLabel: '-i, --interactive',\n }),\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../../src/lib/inspect/hydration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,IAAI,wBAAwB,EAC7C,eAAe,EACf,aAAa,EACb,QAAQ,EACR,qBAAqB,EAErB,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,oDAAoD;AACpD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,WAAW,EAEX,eAAe,EAEf,UAAU,GACX,MAAM,qCAAqC,CAAC;AAE7C,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,mBAAoB,SAAQ,gBAAgB;IAChD,CAAC,OAAO,CAAC,MAAM,CAAC,CACd,MAAc,EACd,OAAmD;QAEnD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,MAAM,EAAE,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC;QAChE,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,eAAe,CAAC;QACrE,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO;YACpC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,EAAE,EAAE,WAAW,CAAC;YAC9C,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,cAAc,IAAI,OAAO,EAAE,CAAC;IACzD,CAAC;CACF;AAED,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,gBAAgB;IACpB,CAAC,OAAO,CAAC,MAAM,CAAC;QACd,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjD,CAAC;IAED,MAAM;QACJ,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,QAAQ;QACN,OAAO,qBAAqB,CAAC;IAC/B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,aAAa,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAE7C,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,gBAAgB,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,cAAc;IAClB,CAAC,OAAO,CAAC,MAAM,CAAC;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IAED,MAAM;QACJ,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,QAAQ;QACN,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;AAED,yDAAyD;AACzD,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAC;AAEzC,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,cAAc,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,MAAM,UAAU,cAAc;IAC5B,SAAS,iBAAiB,CAAC,KAAa;QACtC,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;QAC/C,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO;QACL,WAAW,EAAE,iBAAiB;QAC9B,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QACxC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAC/B,IAAI,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC7C,cAAc,EAAE,CAAC,KAAa,EAAE,EAAE,CAChC,IAAI,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;QAChC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3E,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QACtC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,oFAAoF;YACpF,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,cAAa,CAAC,EAAE,CAAC,OAAQ,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;gBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBACnC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,CAAC,KAAK,CAAC,gBAAgB;oBACxB,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,oFAAoF;YACpF,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,cAAa,CAAC,EAAE,CAAC,QAAS,CAAC;YACpD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;gBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBACnC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrE,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACvE,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACvE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;QAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;QACxD,sEAAsE;QACtE,gEAAgE;QAChE,GAAG,qBAAqB;QACxB,iEAAiE;QACjE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAC9D,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,+DAA+D;YAC/D,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,IAAI,mBAAmB,CAC5B,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAC/B,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,IAAI,CACX,CAAC;QACJ,CAAC;QACD,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;QAC9B,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;QAC9B,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3E,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACvE,iBAAiB,EAAE,CAAC,KAAa,EAAE,EAAE,CACnC,IAAI,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjD,WAAW,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzE,WAAW,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,IAAI,cAAc,GAAoB,IAAI,CAAC;AAE3C,SAAS,WAAW;IAClB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,cAAc,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,KAAK,UAAU,kBAAkB,CAQ/B,QAAW,EAAE,QAA+B;IAC5C,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE/B,MAAM,KAAK,GAAI,QAAgB,CAAC,KAA2B,CAAC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAE5B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvD,wDAAwD;QACxD,MAAM,CAAC,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,MAAc,CAAC,KAAK,GAAG,MAAM,YAAY,CAAE,MAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAErE,gCAAgC;QAChC,MAAM,CAAC,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEzD,mCAAmC;QACnC,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI;gBAClB,QAAQ;gBACR,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,SAAS;aACV,EAAE,CAAC;gBACF,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjE,qEAAqE;QACrE,qEAAqE;QACrE,sDAAsD;QACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sEAAsE;QACtE,iEAAiE;QACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,kCAAkC,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,oFAAoF;AACpF,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IACjD,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,iCAAiC,CAAI,QAAW;IACvD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/D,MAAM,CAAC,GAAG,QAAmC,CAAC;IAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAExB,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,EAAE,GAAG,EAAE,GAAI,MAAM,CAAC,SAAqC,EAAE,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;YACvE,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAW,EACX,WAAmC;IAEnC,wEAAwE;IACxE,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,QAAe,EACf,WAAW,IAAI,IAAI,CACpB,CAAC;IACF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,YAAY,EAAE,WAAW,EAAE,CAAM,CAAC;IAC5E,oFAAoF;IACpF,OAAO,iCAAiC,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC","sourcesContent":["/**\n * CLI-specific hydration for o11y display.\n *\n * Node.js revivers that use `Buffer.from()` for base64 decoding and add\n * `util.inspect.custom` to ClassInstanceRef for pretty CLI output.\n */\n\nimport { inspect } from 'node:util';\nimport { maybeDecrypt } from '@workflow/core/serialization';\nimport {\n ClassInstanceRef,\n extractClassName,\n hydrateResourceIO as hydrateResourceIOGeneric,\n isEncryptedData,\n isExpiredStub,\n isRunRef,\n observabilityRevivers,\n type Revivers,\n serializedInstanceToRef,\n} from '@workflow/core/serialization-format';\nimport { parseClassName } from '@workflow/utils/parse-name';\nimport chalk from 'chalk';\n\n/**\n * A function that resolves an encryption key for a run, or null to skip\n * decryption. Accepts a runId — the resolver is responsible for looking\n * up the WorkflowRun internally (with caching) if the World needs it.\n */\nexport type EncryptionKeyResolver =\n | ((runId: string) => Promise<Uint8Array | undefined>)\n | null;\n\n// Re-export types and utilities that consumers need\nexport {\n CLASS_INSTANCE_REF_TYPE,\n ClassInstanceRef,\n ENCRYPTED_PLACEHOLDER,\n extractStreamIds,\n isClassInstanceRef,\n isEncryptedData,\n isStreamId,\n isStreamRef,\n type Revivers,\n STREAM_REF_TYPE,\n type StreamRef,\n truncateId,\n} from '@workflow/core/serialization-format';\n\n// ---------------------------------------------------------------------------\n// CLI ClassInstanceRef with inspect.custom\n// ---------------------------------------------------------------------------\n\n/**\n * Extended ClassInstanceRef with Node.js `util.inspect.custom` for\n * pretty CLI output: `ClassName@filename { ...data }`\n */\nclass CLIClassInstanceRef extends ClassInstanceRef {\n [inspect.custom](\n _depth: number,\n options: import('node:util').InspectOptionsStylized\n ): string {\n const dataStr = inspect(this.data, { ...options, depth: options.depth });\n const parsed = parseClassName(this.classId);\n const moduleSpecifier = parsed?.moduleSpecifier ?? this.classId;\n const fileName = moduleSpecifier.split('/').pop() ?? moduleSpecifier;\n const styledFileName = options.stylize\n ? options.stylize(`@${fileName}`, 'undefined')\n : `@${fileName}`;\n return `${this.className}${styledFileName} ${dataStr}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI encrypted data placeholder with custom inspect\n// ---------------------------------------------------------------------------\n\n/**\n * Placeholder object for encrypted data fields in CLI output.\n *\n * Uses `util.inspect.custom` to render as a styled, unquoted string\n * (e.g., dim yellow \"🔒 Encrypted\") instead of a plain quoted string.\n * Also provides `toJSON()` for `--json` output.\n */\nclass EncryptedDataRef {\n [inspect.custom](): string {\n return chalk.dim.yellow('\\u{1F512} Encrypted');\n }\n\n toJSON(): string {\n return '\\u{1F512} Encrypted';\n }\n\n toString(): string {\n return '\\u{1F512} Encrypted';\n }\n}\n\n/** Singleton encrypted data placeholder for CLI display */\nconst ENCRYPTED_REF = new EncryptedDataRef();\n\n/** Check if a value is an EncryptedDataRef (for custom table formatting in CLI) */\nexport function isEncryptedRef(value: unknown): value is EncryptedDataRef {\n return value instanceof EncryptedDataRef;\n}\n\n// ---------------------------------------------------------------------------\n// CLI expired data placeholder with custom inspect\n// ---------------------------------------------------------------------------\n\n/**\n * Placeholder object for expired data fields in CLI output.\n *\n * Uses `util.inspect.custom` to render as a styled, unquoted string\n * (e.g., dim gray \"<data expired>\") instead of a raw stub object.\n * Also provides `toJSON()` for `--json` output.\n */\nclass ExpiredDataRef {\n [inspect.custom](): string {\n return chalk.gray('<data expired>');\n }\n\n toJSON(): string {\n return '<data expired>';\n }\n\n toString(): string {\n return '<data expired>';\n }\n}\n\n/** Singleton expired data placeholder for CLI display */\nconst EXPIRED_REF = new ExpiredDataRef();\n\n/** Check if a value is an ExpiredDataRef (for custom table formatting in CLI) */\nexport function isExpiredRef(value: unknown): value is ExpiredDataRef {\n return value instanceof ExpiredDataRef;\n}\n\n// ---------------------------------------------------------------------------\n// CLI revivers (Node.js, uses Buffer)\n// ---------------------------------------------------------------------------\n\nexport function getCLIRevivers(): Revivers {\n function reviveArrayBuffer(value: string): ArrayBuffer {\n const base64 = value === '.' ? '' : value;\n const buffer = Buffer.from(base64, 'base64');\n const arrayBuffer = new ArrayBuffer(buffer.length);\n const uint8Array = new Uint8Array(arrayBuffer);\n uint8Array.set(buffer);\n return arrayBuffer;\n }\n\n return {\n ArrayBuffer: reviveArrayBuffer,\n BigInt: (value: string) => BigInt(value),\n BigInt64Array: (value: string) =>\n new BigInt64Array(reviveArrayBuffer(value)),\n BigUint64Array: (value: string) =>\n new BigUint64Array(reviveArrayBuffer(value)),\n Date: (value) => new Date(value),\n Error: (value) => {\n const error = new Error(value.message);\n error.name = value.name;\n error.stack = value.stack;\n return error;\n },\n Float32Array: (value: string) => new Float32Array(reviveArrayBuffer(value)),\n Float64Array: (value: string) => new Float64Array(reviveArrayBuffer(value)),\n Headers: (value) => new Headers(value),\n Request: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Request: function () {} }.Request!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n method: value.method,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n duplex: value.duplex,\n ...(value.responseWritable\n ? { responseWritable: value.responseWritable }\n : {}),\n });\n return obj;\n },\n Response: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Response: function () {} }.Response!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n status: value.status,\n statusText: value.statusText,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n redirected: value.redirected,\n type: value.type,\n });\n return obj;\n },\n Int8Array: (value: string) => new Int8Array(reviveArrayBuffer(value)),\n Int16Array: (value: string) => new Int16Array(reviveArrayBuffer(value)),\n Int32Array: (value: string) => new Int32Array(reviveArrayBuffer(value)),\n Map: (value) => new Map(value),\n RegExp: (value) => new RegExp(value.source, value.flags),\n // O11y-specific revivers (streams, step functions → display objects).\n // Spread FIRST so CLI-specific overrides below take precedence.\n ...observabilityRevivers,\n // CLI-specific overrides for class instances with inspect.custom\n Class: (value) => `<class:${extractClassName(value.classId)}>`,\n Instance: (value) => {\n // Run instances are rendered as RunRef for clickable rendering\n const runRef = serializedInstanceToRef(value);\n if (isRunRef(runRef)) {\n return runRef;\n }\n return new CLIClassInstanceRef(\n extractClassName(value.classId),\n value.classId,\n value.data\n );\n },\n Set: (value) => new Set(value),\n URL: (value) => new URL(value),\n URLSearchParams: (value) => new URLSearchParams(value === '.' ? '' : value),\n Uint8Array: (value: string) => new Uint8Array(reviveArrayBuffer(value)),\n Uint8ClampedArray: (value: string) =>\n new Uint8ClampedArray(reviveArrayBuffer(value)),\n Uint16Array: (value: string) => new Uint16Array(reviveArrayBuffer(value)),\n Uint32Array: (value: string) => new Uint32Array(reviveArrayBuffer(value)),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pre-built CLI revivers (cached)\n// ---------------------------------------------------------------------------\n\nlet cachedRevivers: Revivers | null = null;\n\nfunction getRevivers(): Revivers {\n if (!cachedRevivers) {\n cachedRevivers = getCLIRevivers();\n }\n return cachedRevivers;\n}\n\n// ---------------------------------------------------------------------------\n// Decryption helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Pre-process a resource's data fields: if the resolver is provided and\n * the field is encrypted, decrypt it before generic hydration.\n *\n * Uses core's `maybeDecrypt()` which handles the 'encr' prefix stripping\n * and AES-GCM decryption transparently.\n *\n * When the resolver is null (no --decrypt flag), encrypted fields pass\n * through as Uint8Array and are replaced with EncryptedDataRef in post-processing.\n */\nasync function maybeDecryptFields<\n T extends {\n runId?: string;\n input?: any;\n output?: any;\n metadata?: any;\n eventData?: any;\n },\n>(resource: T, resolver: EncryptionKeyResolver): Promise<T> {\n if (!resolver) return resource;\n\n const runId = (resource as any).runId as string | undefined;\n if (!runId) return resource;\n\n const result = { ...resource };\n\n try {\n const rawKey = await resolver(runId);\n const { importKey } = await import('@workflow/core/encryption');\n const k = rawKey ? await importKey(rawKey) : undefined;\n\n // Decrypt input/output/error fields (WorkflowRun, Step)\n result.input = await maybeDecrypt(result.input, k);\n result.output = await maybeDecrypt(result.output, k);\n (result as any).error = await maybeDecrypt((result as any).error, k);\n\n // Decrypt metadata field (Hook)\n result.metadata = await maybeDecrypt(result.metadata, k);\n\n // Decrypt eventData fields (Event)\n if (result.eventData && typeof result.eventData === 'object') {\n const eventData = { ...result.eventData };\n for (const field of [\n 'result',\n 'input',\n 'output',\n 'metadata',\n 'payload',\n ]) {\n eventData[field] = await maybeDecrypt(eventData[field], k);\n }\n result.eventData = eventData;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n // If the key fetch failed due to an HTTP error (e.g. 429 rate limit,\n // 500 server error), re-throw so the caller surfaces a clear failure\n // instead of silently showing encrypted placeholders.\n if (message.includes('HTTP ')) {\n throw err;\n }\n\n // Decryption failed (bad key, corrupted ciphertext, etc.) — fall back\n // to showing encrypted placeholders instead of crashing the CLI.\n const { logger } = await import('../config/log.js');\n logger.warn(`Decryption failed for resource ${runId}: ${message}`);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Replace a single field value with a display ref if it's encrypted or expired. */\nfunction toDisplayRef(value: unknown): unknown {\n if (isEncryptedData(value)) return ENCRYPTED_REF;\n if (isExpiredStub(value)) return EXPIRED_REF;\n return value;\n}\n\n/**\n * Replace encrypted Uint8Array values and expired stubs with styled\n * ref objects in known data fields for custom inspect rendering.\n */\nfunction replaceEncryptedAndExpiredWithRef<T>(resource: T): T {\n if (!resource || typeof resource !== 'object') return resource;\n const r = resource as Record<string, unknown>;\n const result = { ...r };\n\n for (const key of ['input', 'output', 'metadata', 'error']) {\n result[key] = toDisplayRef(result[key]);\n }\n\n if (result.eventData && typeof result.eventData === 'object') {\n const ed = { ...(result.eventData as Record<string, unknown>) };\n for (const key of ['result', 'input', 'output', 'metadata', 'payload']) {\n ed[key] = toDisplayRef(ed[key]);\n }\n result.eventData = ed;\n }\n\n return result as T;\n}\n\n/**\n * Hydrate the serialized data fields of a resource for CLI display.\n *\n * When `encryptorResolver` is null (default / no --decrypt flag), encrypted\n * fields are shown as styled \"🔒 Encrypted\" placeholders via EncryptedDataRef.\n *\n * When `encryptorResolver` is provided (--decrypt flag), encrypted fields\n * are decrypted before hydration so the actual user data is displayed.\n */\nexport async function hydrateResourceIO<T>(\n resource: T,\n keyResolver?: EncryptionKeyResolver\n): Promise<T> {\n // Pre-process: decrypt any encrypted fields when a resolver is provided\n const preprocessed = await maybeDecryptFields(\n resource as any,\n keyResolver ?? null\n );\n const hydrated = hydrateResourceIOGeneric(preprocessed, getRevivers()) as T;\n // Post-process: swap encrypted Uint8Arrays and expired stubs for CLI-styled objects\n return replaceEncryptedAndExpiredWithRef(hydrated);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/lib/inspect/output.ts"],"names":[],"mappings":"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","sourcesContent":["import { importKey } from '@workflow/core/encryption';\nimport {\n type EncryptionKeyParam,\n getDeserializeStream,\n getExternalRevivers,\n} from '@workflow/core/serialization';\nimport { VERCEL_403_ERROR_MESSAGE } from '@workflow/errors';\nimport { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';\nimport type {\n Event,\n Hook,\n ListEventsParams,\n PaginationOptions,\n Step,\n StepWithoutData,\n WorkflowRun,\n WorkflowRunWithoutData,\n World,\n} from '@workflow/world';\nimport chalk from 'chalk';\n\nimport { formatDistance } from 'date-fns';\nimport Table from 'easy-table';\nimport { logger } from '../config/log.js';\nimport type { InspectCLIOptions } from '../config/types.js';\nimport {\n type EncryptionKeyResolver,\n hydrateResourceIO,\n isEncryptedRef,\n isExpiredRef,\n} from './hydration.js';\n\n/**\n * Create an EncryptionKeyResolver from a World instance.\n * Returns null if decrypt is false — encrypted data will show as a placeholder.\n *\n * The resolver fetches the full WorkflowRun (cached per runId) so that the\n * World can inspect deployment-specific fields for key resolution.\n */\nfunction createResolver(world: World, decrypt: boolean): EncryptionKeyResolver {\n if (!decrypt) return null;\n if (!world.getEncryptionKeyForRun) return null;\n const cache = new Map<string, Promise<Uint8Array | undefined>>();\n return (runId: string) => {\n let cached = cache.get(runId);\n if (!cached) {\n cached = world.runs\n .get(runId)\n .then((run) => world.getEncryptionKeyForRun!(run));\n cache.set(runId, cached);\n }\n return cached;\n };\n}\n\nimport { setupListPagination } from './pagination.js';\nimport { streamToConsole } from './stream.js';\nimport {\n formatISODate,\n formatStatus as formatStatusAbbrev,\n getDisplaySettings,\n getTerminalWidth,\n isCI,\n} from './terminal-utils.js';\n\nconst DEFAULT_PAGE_SIZE = 20;\nlet TABLE_TRUNCATE_IO_LENGTH = 15; // Will be adjusted based on terminal width\n\nconst WORKFLOW_RUN_IO_PROPS: (keyof WorkflowRun)[] = ['input', 'output'];\n\nconst STEP_IO_PROPS: (keyof Step)[] = ['input', 'output'];\n\nconst WORKFLOW_RUN_LISTED_PROPS: (keyof WorkflowRun)[] = [\n 'runId',\n 'workflowName',\n 'status',\n 'startedAt',\n 'completedAt',\n ...WORKFLOW_RUN_IO_PROPS,\n];\n\nconst STEP_LISTED_PROPS: (keyof Step)[] = [\n 'runId',\n 'stepId',\n 'stepName',\n 'status',\n 'startedAt',\n 'completedAt',\n ...STEP_IO_PROPS,\n];\n\nconst EVENT_IO_PROPS: (keyof Event | 'eventData')[] = ['eventData'];\n\nconst EVENT_LISTED_PROPS: (keyof Event | 'eventData')[] = [\n 'eventId',\n 'eventType',\n 'correlationId',\n 'createdAt',\n ...EVENT_IO_PROPS,\n];\n\n// const HOOK_DATA_PROPS: (keyof Hook | 'hasResponse')[] = ['hasResponse'];\n\nconst HOOK_LISTED_PROPS: (keyof Hook | 'hasResponse')[] = [\n 'runId',\n 'hookId',\n 'ownerId',\n 'createdAt',\n // ...HOOK_DATA_PROPS,\n];\n\ninterface Sleep {\n correlationId: string;\n runId: string;\n eventId: string;\n createdAt: Date;\n resumeAt: Date | undefined;\n completedAt: Date | undefined;\n}\n\nconst WAIT_LISTED_PROPS: (keyof Sleep)[] = [\n 'correlationId',\n 'eventId',\n 'createdAt',\n 'resumeAt',\n 'completedAt',\n];\n\nconst STATUS_COLORS: Record<\n WorkflowRun['status'] | Step['status'],\n (value: string) => string\n> = {\n running: chalk.blue,\n completed: chalk.green,\n failed: chalk.red,\n cancelled: chalk.strikethrough.yellow,\n pending: chalk.blue,\n};\n\nconst isStreamId = (value: string) => {\n return typeof value === 'string' && value.startsWith('strm_');\n};\n\nconst showStatusLegend = () => {\n logger.log('\\nStatus Legend:');\n const statuses: Array<WorkflowRun['status'] | Step['status']> = [\n 'running',\n 'completed',\n 'failed',\n 'cancelled',\n 'pending',\n ];\n\n const legendItems = statuses.map((status) => {\n const colorFunc = STATUS_COLORS[status];\n const abbrev = formatStatusAbbrev(status, true);\n return `${colorFunc(abbrev)} = ${status}`;\n });\n\n logger.log(` ${legendItems.join(' ')}`);\n logger.log('');\n};\n\nconst isSleepStep = (stepName: string) => {\n return stepName.includes('-sleep');\n};\n\nconst checkAndHandleVercelAccessError = (\n error: unknown,\n backend?: string\n): boolean => {\n if (backend === 'vercel' && error && typeof error === 'object') {\n const err = error as Record<string, unknown>;\n if (err.status === 403) {\n logger.error(VERCEL_403_ERROR_MESSAGE);\n return true;\n }\n }\n return false;\n};\n\nconst extractErrorMessage = (\n err: Record<string, unknown>\n): string | undefined => {\n if (err.message && typeof err.message === 'string') {\n return err.message;\n }\n\n if (err.body && typeof err.body === 'object') {\n const body = err.body as Record<string, unknown>;\n if (body.message && typeof body.message === 'string') {\n return body.message;\n }\n if (body.error && typeof body.error === 'string') {\n return body.error;\n }\n }\n\n return undefined;\n};\n\nconst handleApiError = (error: unknown, backend?: string): boolean => {\n // First check for Vercel access errors\n if (checkAndHandleVercelAccessError(error, backend)) {\n return true;\n }\n\n // Handle other HTTP errors\n if (error && typeof error === 'object') {\n const err = error as Record<string, unknown>;\n\n // Handle 400 Bad Request\n if (err.status === 400) {\n logger.error('Bad Request: The request was invalid.');\n const message = extractErrorMessage(err);\n if (message) {\n logger.error(`Details: ${message}`);\n }\n return true;\n }\n\n // Handle other HTTP errors (404, 500, etc.)\n if (typeof err.status === 'number' && err.status >= 400) {\n logger.error(`HTTP Error ${err.status}: ${getStatusText(err.status)}`);\n const message = extractErrorMessage(err);\n if (message) {\n logger.error(`Details: ${message}`);\n }\n return true;\n }\n }\n\n return false;\n};\n\nconst getStatusText = (status: number): string => {\n const statusTexts: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || 'Unknown Error';\n};\n\nconst truncateNameIfNeeded = (name: string, maxLength: number): string => {\n return maxLength < name.length ? `${name.substring(0, maxLength)}...` : name;\n};\n\nconst formatNameField = (\n nameNonUnique: string,\n truncateLength: number,\n isSleep: boolean\n): string => {\n const truncatedName = truncateNameIfNeeded(nameNonUnique, truncateLength);\n if (isSleep) {\n return chalk.yellowBright(truncatedName);\n }\n return chalk.blue.blueBright(truncatedName);\n};\n\nconst formatIdField = (\n prop: string,\n value: unknown,\n shouldTruncateIds: boolean\n): string | undefined => {\n const valueStr = String(value);\n const idStr = shouldTruncateIds ? truncateIdToLastChars(valueStr) : valueStr;\n if (prop === 'streamId') {\n return chalk.green(idStr);\n }\n return idStr;\n};\n\nexport const formatTableValue = (\n prop: string,\n value: unknown,\n opts: InspectCLIOptions = {},\n displaySettings?: ReturnType<typeof getDisplaySettings>,\n item?: Record<string, unknown>\n) => {\n const namesTruncate = displaySettings?.namesTruncateLength ?? 40;\n const shouldTruncateIds = displaySettings?.truncateIdsToLastChars ?? false;\n\n // Handle IDs with potential truncation\n if (\n [\n 'streamId',\n 'runId',\n 'stepId',\n 'hookId',\n 'eventId',\n 'correlationId',\n 'ownerId',\n ].includes(prop)\n ) {\n return formatIdField(prop, value, shouldTruncateIds);\n }\n\n // Handle names with truncation\n if (prop === 'stepName') {\n const nameNonUnique = parseStepName(String(value))?.shortName || '?';\n return formatNameField(\n nameNonUnique,\n namesTruncate,\n isSleepStep(String(value))\n );\n }\n\n if (prop === 'workflowName') {\n const nameNonUnique = parseWorkflowName(String(value))?.shortName || '?';\n const truncatedName = truncateNameIfNeeded(nameNonUnique, namesTruncate);\n return chalk.blue.blueBright(truncatedName);\n }\n\n if (prop === 'output' || prop === 'input' || prop === 'error') {\n if (\n item &&\n 'expiredAt' in item &&\n item.expiredAt != null &&\n new Date(item.expiredAt as string | number | Date) < new Date()\n ) {\n return EXPIRED_DATA_MESSAGE;\n }\n return inlineFormatIO(value);\n }\n\n if (prop === 'status') {\n const status = value as WorkflowRun['status'] | Step['status'];\n const colorFunc = STATUS_COLORS[status];\n const formattedStatus = displaySettings?.abbreviateStatus\n ? formatStatusAbbrev(status, true)\n : status;\n return colorFunc(formattedStatus);\n }\n\n if (prop === 'eventData') {\n return truncateString(JSON.stringify(value));\n }\n\n if (prop === 'hasResponse') {\n return value ? chalk.green('true') : chalk.gray('false');\n }\n\n if (value instanceof Date) {\n return formatTableTimestamp(value, opts, displaySettings);\n }\n\n return value;\n};\n\nconst getVisibleProps = (\n props: string[],\n displaySettings: ReturnType<typeof getDisplaySettings>\n): string[] => {\n if (displaySettings.hideCompletedAt) {\n return props.filter((prop) => prop !== 'completedAt');\n }\n return props;\n};\n\nconst showTable = (\n data: Record<string, unknown>[],\n props: string[],\n opts: InspectCLIOptions = {}\n) => {\n // Get display settings based on terminal width\n const terminalWidth = getTerminalWidth();\n const displaySettings = getDisplaySettings(\n terminalWidth,\n opts.withData || false,\n props.includes('runName')\n );\n\n // Filter out completedAt column if needed\n const visibleProps = getVisibleProps(props, displaySettings);\n\n // Update truncate length for IO fields\n const originalTruncateLength = TABLE_TRUNCATE_IO_LENGTH;\n TABLE_TRUNCATE_IO_LENGTH = displaySettings.dataFieldWidth;\n\n // Show status legend if using abbreviated status\n if (\n data.length > 0 &&\n displaySettings.abbreviateStatus &&\n visibleProps.includes('status')\n ) {\n showStatusLegend();\n }\n\n // Create header mapping for abbreviated status\n const headerMap: Record<string, string> = {};\n if (displaySettings.abbreviateStatus && visibleProps.includes('status')) {\n headerMap['status'] = 'S';\n }\n\n // Add a blank line before any table\n const table = new Table();\n if (data && data.length === 0) {\n logger.warn('No data found for this query and resource.\\n');\n for (const prop of visibleProps) {\n const header = headerMap[prop] || prop;\n table.cell(header, 'N/A');\n }\n table.newRow();\n // Restore original truncate length\n TABLE_TRUNCATE_IO_LENGTH = originalTruncateLength;\n return table.toString();\n } else if (!data) {\n logger.warn('Expecting an array of data, but got null.\\n');\n }\n logger.log('');\n for (const item of data) {\n for (const prop of visibleProps) {\n const header = headerMap[prop] || prop;\n const value = item[prop];\n table.cell(\n header,\n formatTableValue(prop, value, opts, displaySettings, item)\n );\n }\n table.newRow();\n }\n\n // Restore original truncate length\n TABLE_TRUNCATE_IO_LENGTH = originalTruncateLength;\n return table.toString();\n};\n\nconst showJson = (data: unknown) => {\n const json = JSON.stringify(data, null, 2);\n process.stdout.write(`${json}\\n`);\n};\n\n/**\n * In tables, we want to show a shorter timestamp, YYYY-MM-DD HH:MM:SS\n */\nconst formatTableTimestamp = (\n value: Date,\n opts: InspectCLIOptions = {},\n displaySettings?: ReturnType<typeof getDisplaySettings>\n) => {\n // Format ISO time without T and Z\n const isoTime = formatISODate(value);\n\n // Show relative time only if:\n // - Not in CI mode\n // - Display settings allow it (based on terminal width)\n // - withData is disabled (more space available)\n // - Not in JSON mode\n // - disableRelativeDates is not set\n const shouldShowRelative =\n !isCI() &&\n displaySettings?.showRelativeDates !== false &&\n !opts.withData &&\n !opts.json &&\n !opts.disableRelativeDates;\n\n if (shouldShowRelative) {\n const relative = formatDistance(value, new Date(), { addSuffix: true });\n return `${isoTime} (${relative})`;\n }\n\n return isoTime;\n};\n\nconst truncateString = (\n str: string,\n maxLength: number = TABLE_TRUNCATE_IO_LENGTH\n) => {\n return str && str.length > maxLength\n ? `${str.substring(0, maxLength)}...`\n : str;\n};\n\nconst truncateIdToLastChars = (id: string, chars: number = 4): string => {\n if (!id || id.length <= chars) return id;\n return `...${id.substring(id.length - chars)}`;\n};\n\nconst showInspectInfoBox = (resource: string) => {\n logger.info(\n `To view details for a ${resource}, use \\`workflow inspect ${resource}\\` <id>`\n );\n logger.info(\n `To view the content of any stream, use \\`workflow inspect stream <stream-id>\\``\n );\n};\n\nconst EXPIRED_DATA_MESSAGE = chalk.gray('<data expired>');\n\n/**\n * Checks if a run has expired data storage (run-level expiredAt field).\n * Only returns true when `expiredAt` is in the past.\n */\nexport const hasExpiredData = (run: WorkflowRun): boolean => {\n return (\n 'expiredAt' in run &&\n run.expiredAt != null &&\n new Date(run.expiredAt) < new Date()\n );\n};\n\n/**\n * Checks if any data field in a hydrated resource has been replaced with an\n * expired placeholder. Works for runs, steps, hooks, and events — unlike\n * `hasExpiredData` which only checks the run-level `expiredAt` field.\n */\nconst hasExpiredFields = (resource: Record<string, unknown>): boolean => {\n return ['input', 'output', 'error', 'metadata'].some((key) =>\n isExpiredRef(resource[key])\n );\n};\n\n/**\n * Takes hydrated step/workflow input/output and serializes it for inline display.\n */\nconst inlineFormatIO = <T>(io: T, topLevel: boolean = true): string => {\n const type = typeof io;\n let value = '';\n if (io === undefined) {\n value = '<empty>';\n } else if (io === null) {\n value = '<null>';\n } else if (isEncryptedRef(io)) {\n value = chalk.dim.yellow('\\u{1F512} Encrypted');\n } else if (isExpiredRef(io)) {\n value = chalk.gray('<data expired>');\n } else if (io && Array.isArray(io)) {\n if (io.length === 0) {\n value = '<empty>';\n } else {\n const stringified = io\n .map((item) => inlineFormatIO(item, false))\n .join(',');\n if (stringified.length > TABLE_TRUNCATE_IO_LENGTH && topLevel) {\n value = chalk.yellow(`${io.length} args`);\n } else {\n value = stringified;\n }\n }\n } else if (type === 'object') {\n if (io instanceof Date) {\n value = io.toISOString();\n } else {\n value = truncateString(JSON.stringify(io));\n }\n } else if (['string', 'number', 'boolean'].includes(type)) {\n if (isStreamId(io as string)) {\n value = io.toString();\n } else if (type === 'string' && (io as string).includes('strm_')) {\n value = io as string;\n } else {\n value = truncateString(String(io));\n }\n } else {\n value = `<${type}>`;\n }\n return value;\n};\n\nexport const listRuns = async (world: World, opts: InspectCLIOptions = {}) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n\n if (opts.stepId || opts.runId) {\n logger.warn(\n 'Filtering by step-id or run-id is not supported in list calls, ignoring filter.'\n );\n }\n\n const resolveData = opts.withData ? 'all' : 'none';\n\n // Determine which props to show based on withData flag\n const props = opts.withData\n ? WORKFLOW_RUN_LISTED_PROPS\n : WORKFLOW_RUN_LISTED_PROPS.filter(\n (prop) => !WORKFLOW_RUN_IO_PROPS.includes(prop)\n );\n\n // For JSON output, just fetch once and return\n if (opts.json) {\n try {\n const runs = await world.runs.list({\n workflowName: opts.workflowName,\n status: opts.status as any,\n pagination: {\n sortOrder: opts.sort || 'desc',\n cursor: opts.cursor,\n limit: opts.limit || DEFAULT_PAGE_SIZE,\n },\n resolveData,\n });\n const runsWithHydratedIO = await Promise.all(\n runs.data.map((r) => hydrateResourceIO(r, resolveKey))\n );\n showJson({ ...runs, data: runsWithHydratedIO });\n return;\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n }\n\n await setupListPagination<WorkflowRun | WorkflowRunWithoutData>({\n initialCursor: opts.cursor,\n interactive: opts.interactive,\n fetchPage: async (cursor) => {\n try {\n const runs = await world.runs.list({\n workflowName: opts.workflowName,\n status: opts.status as any,\n pagination: {\n sortOrder: opts.sort || 'desc',\n cursor,\n limit: opts.limit || DEFAULT_PAGE_SIZE,\n },\n resolveData,\n });\n return {\n data: runs.data,\n cursor: runs.cursor,\n hasMore: runs.hasMore,\n };\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n },\n displayPage: async (runs) => {\n const runsWithHydratedIO = await Promise.all(\n runs.map((r) => hydrateResourceIO(r, resolveKey))\n );\n logger.log(showTable(runsWithHydratedIO, props, opts));\n },\n });\n};\n\nexport const getRecentRun = async (\n world: World,\n opts: InspectCLIOptions = {}\n) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n\n logger.warn(`No runId provided, fetching data for latest run instead.`);\n try {\n const runs = await world.runs.list({\n pagination: { limit: 1, sortOrder: opts.sort || 'desc' },\n resolveData: 'none', // Don't need data for just getting the ID\n });\n runs.data = await Promise.all(\n runs.data.map((r) => hydrateResourceIO(r, resolveKey))\n );\n return runs.data[0];\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const showRun = async (\n world: World,\n runId: string,\n opts: InspectCLIOptions = {}\n) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n\n if (opts.withData) {\n logger.warn('`withData` flag is ignored when showing individual resources');\n }\n try {\n const run = await world.runs.get(runId, { resolveData: 'all' });\n const runWithHydratedIO = await hydrateResourceIO(run, resolveKey);\n if (opts.json) {\n showJson(runWithHydratedIO);\n return;\n } else {\n if (hasExpiredData(run)) {\n logger.warn(\n \"This run's data (input/output/error) has expired and is no longer available.\"\n );\n }\n logger.log(runWithHydratedIO);\n }\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const listSteps = async (\n world: World,\n opts: InspectCLIOptions = {\n runId: undefined,\n }\n) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n\n if (opts.stepId) {\n logger.warn(\n 'Filtering by step-id is not supported in list calls, ignoring filter.'\n );\n }\n if (opts.workflowName) {\n logger.warn(\n 'Filtering by workflow-name is not supported for steps, ignoring filter.'\n );\n }\n\n const runId = opts.runId\n ? opts.runId\n : (await getRecentRun(world, opts))?.runId;\n if (!runId) {\n logger.error('No run found.');\n return;\n }\n\n const resolveData = opts.withData ? 'all' : 'none';\n\n // Determine which props to show based on withData flag\n const props = opts.withData\n ? STEP_LISTED_PROPS\n : STEP_LISTED_PROPS.filter((prop) => !STEP_IO_PROPS.includes(prop));\n\n // For JSON output, just fetch once and return\n if (opts.json) {\n logger.debug(`Fetching steps for run ${runId}`);\n try {\n const stepChunks = await world.steps.list({\n runId,\n pagination: {\n sortOrder: opts.sort || 'desc',\n cursor: opts.cursor,\n limit: opts.limit || DEFAULT_PAGE_SIZE,\n },\n resolveData,\n });\n const stepsWithHydratedIO = await Promise.all(\n stepChunks.data.map((s) => hydrateResourceIO(s, resolveKey))\n );\n showJson(stepsWithHydratedIO);\n return;\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n }\n\n await setupListPagination<Step | StepWithoutData>({\n initialCursor: opts.cursor,\n interactive: opts.interactive,\n fetchPage: async (cursor) => {\n logger.debug(`Fetching steps for run ${runId}`);\n try {\n const stepChunks = await world.steps.list({\n runId,\n pagination: {\n sortOrder: opts.sort || 'desc',\n cursor,\n limit: opts.limit || DEFAULT_PAGE_SIZE,\n },\n resolveData,\n });\n return {\n data: stepChunks.data,\n cursor: stepChunks.cursor,\n hasMore: stepChunks.hasMore,\n };\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n },\n displayPage: async (steps) => {\n const stepsWithHydratedIO = await Promise.all(\n steps.map((s) => hydrateResourceIO(s, resolveKey))\n );\n logger.log(showTable(stepsWithHydratedIO, props, opts));\n showInspectInfoBox('step');\n },\n });\n};\n\nexport const showStep = async (\n world: World,\n stepId: string,\n opts: InspectCLIOptions = {}\n) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n\n if (opts.withData) {\n logger.warn('`withData` flag is ignored when showing individual resources');\n }\n if (opts.stepId) {\n logger.warn(\n 'Filtering by step-id is not supported in get calls, ignoring filter.'\n );\n }\n\n const runId = opts.runId ?? (await getRecentRun(world, opts))?.runId;\n if (!runId) {\n logger.error(\n 'run-id is required for showing a step. Usage: `workflow inspect step <STEP_ID> --runId=<RUN_ID>`'\n );\n return;\n }\n\n try {\n const step = await world.steps.get(runId, stepId, {\n resolveData: 'all',\n });\n const stepWithHydratedIO = await hydrateResourceIO(step, resolveKey);\n if (opts.json) {\n showJson(stepWithHydratedIO);\n return;\n } else {\n if (\n hasExpiredFields(\n stepWithHydratedIO as unknown as Record<string, unknown>\n )\n ) {\n logger.warn(\n \"This step's data (input/output/error) has expired and is no longer available.\"\n );\n }\n logger.log(stepWithHydratedIO);\n }\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const showStream = async (\n world: World,\n streamId: string,\n opts: InspectCLIOptions = {}\n) => {\n if (opts.stepId) {\n logger.warn(\n 'Filtering by step-id is not supported when showing a stream, ignoring filter.'\n );\n }\n if (!opts.runId) {\n throw new Error('--run is required when showing a stream');\n }\n const rawStream = await world.streams.get(opts.runId, streamId);\n\n // Only resolve the encryption key when --decrypt is passed and --run is provided.\n // We fetch the full WorkflowRun object so that getEncryptionKeyForRun has\n // access to the deploymentId (needed for API-based key resolution).\n let encryptionKey: EncryptionKeyParam;\n if (opts.decrypt && opts.runId) {\n encryptionKey = (async () => {\n const run = await world.runs.get(opts.runId!);\n const rawKey = await world.getEncryptionKeyForRun?.(run);\n return rawKey ? await importKey(rawKey) : undefined;\n })();\n } else if (opts.decrypt && !opts.runId) {\n logger.warn(\n 'Cannot decrypt stream content without a run ID. Use --run=<run-id> with --decrypt.'\n );\n }\n\n // Deserialize the stream to get JavaScript objects\n const revivers = getExternalRevivers(\n globalThis,\n [],\n opts.runId ?? '',\n encryptionKey\n );\n const transform = getDeserializeStream(revivers, encryptionKey);\n const stream = rawStream.pipeThrough(transform);\n\n logger.info('Streaming to stdout, press CTRL+C to abort.');\n logger.info(\n 'Use --json to output the stream as newline-delimited JSON without info logs.\\n'\n );\n await streamToConsole(stream, streamId, opts);\n};\n\n/**\n * Listing streams only lists available stream IDs based on run/step passed,\n * and doesn't read any data from the streams.\n */\nexport const listStreamsByRunId = async (\n world: World,\n opts: InspectCLIOptions = {}\n) => {\n if (opts.withData) {\n logger.warn('`withData` flag is ignored when listing streams');\n }\n if (opts.workflowName) {\n logger.warn(\n 'Filtering by workflow-name is not supported for streams, ignoring filter.'\n );\n }\n if (opts.stepId) {\n logger.warn(\n 'Filtering by step-id is not supported for streams, ignoring filter.'\n );\n }\n\n let runId = opts.runId;\n if (!runId) {\n logger.warn(\n 'No run-id provided. Listing streams for latest run instead.',\n 'Use --run=<run-id> to filter streams by run.'\n );\n const run = await getRecentRun(world, opts);\n if (!run) {\n logger.warn('No runs found.');\n return;\n }\n runId = run.runId;\n }\n\n try {\n const streamIds = await world.streams.list(runId);\n const matchingStreams = streamIds.map((streamId) => ({\n runId,\n streamId,\n }));\n\n if (opts.json) {\n showJson(matchingStreams);\n return;\n }\n logger.log(showTable(matchingStreams, ['runId', 'streamId']));\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const listEvents = async (\n world: World,\n opts: InspectCLIOptions = {}\n) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n if (opts.workflowName) {\n logger.warn(\n 'Filtering by workflow-name is not supported for events, ignoring filter.'\n );\n }\n\n const runId = opts.runId ?? (await getRecentRun(world, opts))?.runId;\n if (!runId) {\n logger.error('No run found.');\n return;\n }\n\n const correlationIdFilter = opts.hookId || opts.stepId;\n const params: ListEventsParams = {\n runId,\n pagination: {\n sortOrder: opts.sort || 'desc',\n cursor: opts.cursor,\n limit: opts.limit || DEFAULT_PAGE_SIZE,\n },\n resolveData: opts.withData ? 'all' : 'none',\n };\n const listCall = async (pagination: PaginationOptions) => {\n const result = await world.events.list({\n ...params,\n pagination: { ...params.pagination, ...pagination },\n });\n if (correlationIdFilter) {\n return {\n ...result,\n data: result.data.filter(\n (e) => e.correlationId === correlationIdFilter\n ),\n };\n }\n return result;\n };\n\n // Determine which props to show based on withData flag\n const props = opts.withData\n ? EVENT_LISTED_PROPS\n : EVENT_LISTED_PROPS.filter((prop) => !EVENT_IO_PROPS.includes(prop));\n\n // For JSON output, just fetch once and return\n if (opts.json) {\n logger.debug(`Fetching events for run ${runId}`);\n try {\n const events = await listCall({});\n const hydratedEvents = await Promise.all(\n events.data.map((e) => hydrateResourceIO(e, resolveKey))\n );\n showJson(hydratedEvents);\n return;\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n }\n\n await setupListPagination<Event>({\n initialCursor: opts.cursor,\n interactive: opts.interactive,\n fetchPage: async (cursor) => {\n logger.debug(`Fetching events for run ${runId}`);\n try {\n const events = await listCall({ cursor });\n return {\n data: events.data,\n cursor: events.cursor,\n hasMore: events.hasMore,\n };\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n },\n displayPage: async (events) => {\n const hydratedEvents = await Promise.all(\n events.map((e) => hydrateResourceIO(e, resolveKey))\n );\n logger.log(showTable(hydratedEvents, props, opts));\n showInspectInfoBox('event');\n },\n });\n};\n\nexport const listHooks = async (world: World, opts: InspectCLIOptions = {}) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n\n if (opts.workflowName) {\n logger.warn(\n 'Filtering by workflow-name is not supported for hooks, ignoring filter.'\n );\n }\n if (opts.stepId) {\n logger.warn(\n 'Filtering by step-id is not supported for hooks, ignoring filter.'\n );\n }\n\n const runId = opts.runId;\n const resolveData = opts.withData ? 'all' : 'none';\n\n // For JSON output, just fetch once and return\n if (opts.json) {\n if (!runId) {\n logger.debug('Fetching all hooks');\n } else {\n logger.debug(`Fetching hooks for run ${runId}`);\n }\n try {\n const hooks = await world.hooks.list({\n runId,\n pagination: {\n sortOrder: opts.sort || 'desc',\n cursor: opts.cursor,\n limit: opts.limit || DEFAULT_PAGE_SIZE,\n },\n resolveData,\n });\n const hydratedHooks = await Promise.all(\n hooks.data.map((h) => hydrateResourceIO(h, resolveKey))\n );\n showJson({ ...hooks, data: hydratedHooks });\n return;\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n }\n\n // Setup pagination with new mechanism\n await setupListPagination<Hook>({\n initialCursor: opts.cursor,\n interactive: opts.interactive,\n fetchPage: async (cursor) => {\n if (!runId) {\n logger.debug('Fetching all hooks');\n } else {\n logger.debug(`Fetching hooks for run ${runId}`);\n }\n try {\n const hooks = await world.hooks.list({\n runId,\n pagination: {\n sortOrder: opts.sort || 'desc',\n cursor,\n limit: opts.limit || DEFAULT_PAGE_SIZE,\n },\n resolveData,\n });\n return {\n data: hooks.data,\n cursor: hooks.cursor,\n hasMore: hooks.hasMore,\n };\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n },\n displayPage: async (hooks) => {\n const hydratedHooks = await Promise.all(\n hooks.map((h) => hydrateResourceIO(h, resolveKey))\n );\n logger.log(showTable(hydratedHooks, HOOK_LISTED_PROPS, opts));\n showInspectInfoBox('hook');\n },\n });\n};\n\nexport const showHook = async (\n world: World,\n hookId: string,\n opts: InspectCLIOptions = {}\n) => {\n const resolveKey = createResolver(world, opts?.decrypt ?? false);\n\n if (opts.withData) {\n logger.warn('`withData` flag is ignored when showing individual resources');\n }\n try {\n const hook = await world.hooks.get(hookId, {\n resolveData: 'all',\n });\n const hydratedHook = await hydrateResourceIO(hook, resolveKey);\n if (opts.json) {\n showJson(hydratedHook);\n return;\n } else {\n if (\n hasExpiredFields(hydratedHook as unknown as Record<string, unknown>)\n ) {\n logger.warn(\n \"This hook's data (metadata) has expired and is no longer available.\"\n );\n }\n logger.log(hydratedHook);\n }\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const listSleeps = async (\n world: World,\n opts: InspectCLIOptions = {}\n) => {\n if (!opts.runId) {\n logger.error(\n 'run-id is required for listing sleeps. Usage: `workflow inspect sleeps --runId=<id>`'\n );\n process.exit(1);\n }\n\n if (opts.stepId) {\n logger.warn(\n 'Filtering by step-id is not supported for sleeps, ignoring filter.'\n );\n }\n if (opts.workflowName) {\n logger.warn(\n 'Filtering by workflow-name is not supported for sleeps, ignoring filter.'\n );\n }\n if (opts.withData) {\n logger.warn('`withData` flag is ignored when listing sleeps');\n }\n\n try {\n // Fetch all events for the run with resolveData='all' to get wait eventData\n const events = await world.events.list({\n runId: opts.runId,\n pagination: {\n sortOrder: opts.sort || 'desc',\n limit: 1000,\n },\n resolveData: 'all',\n });\n\n // Show info message if there might be more sleeps\n if (events.hasMore) {\n logger.info(\n 'Warning: This run has more than 1000 events. Some sleeps might not be shown. Please use the web UI to ensure getting a complete list.'\n );\n }\n\n // Group wait events by correlationId\n const waitEventsByCorrelation = new Map<string, Event[]>();\n for (const event of events.data) {\n if (event.correlationId?.startsWith('wait_')) {\n const existing = waitEventsByCorrelation.get(event.correlationId) ?? [];\n existing.push(event);\n waitEventsByCorrelation.set(event.correlationId, existing);\n }\n }\n\n if (waitEventsByCorrelation.size === 0) {\n logger.warn('No sleeps found for this run.');\n if (opts.json) {\n showJson([]);\n } else {\n logger.log(\n showTable([] as Record<string, unknown>[], WAIT_LISTED_PROPS, {\n ...opts,\n disableRelativeDates: true,\n })\n );\n }\n return;\n }\n\n // Build sleeps from grouped wait events\n const sleeps: Sleep[] = [];\n for (const [correlationId, correlationEvents] of waitEventsByCorrelation) {\n // Stitch up wait_created and wait_completed events\n const waitCreated = correlationEvents.find(\n (e: Event) => e.eventType === 'wait_created'\n );\n const waitCompleted = correlationEvents.find(\n (e: Event) => e.eventType === 'wait_completed'\n );\n\n if (waitCreated) {\n const sleep: Sleep = {\n correlationId,\n runId: waitCreated.runId,\n eventId: waitCreated.eventId,\n createdAt: waitCreated.createdAt,\n resumeAt:\n waitCreated.eventType === 'wait_created'\n ? waitCreated.eventData.resumeAt\n : undefined,\n completedAt: waitCompleted?.createdAt,\n };\n sleeps.push(sleep);\n }\n }\n\n // Sort sleeps by createdAt\n sleeps.sort((a, b) => {\n const timeA = a.createdAt.getTime();\n const timeB = b.createdAt.getTime();\n return opts.sort === 'asc' ? timeA - timeB : timeB - timeA;\n });\n\n if (opts.json) {\n showJson(sleeps);\n return;\n }\n\n logger.log(\n showTable(\n sleeps as unknown as Record<string, unknown>[],\n WAIT_LISTED_PROPS,\n { ...opts, disableRelativeDates: true }\n )\n );\n } catch (error) {\n if (handleApiError(error, opts.backend)) {\n process.exit(1);\n }\n throw error;\n }\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.test.js","sourceRoot":"","sources":["../../../src/lib/inspect/output.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport type { WorkflowRun } from '@workflow/world';\nimport { formatTableValue, hasExpiredData } from './output.js';\n\nconst makeRun = (overrides: Partial<WorkflowRun> = {}): WorkflowRun =>\n ({\n runId: 'run-1',\n status: 'running',\n deploymentId: 'dep-1',\n workflowName: 'workflow//./src/workflows/test//myWorkflow',\n input: undefined,\n output: undefined,\n error: undefined,\n createdAt: new Date('2025-01-01'),\n updatedAt: new Date('2025-01-01'),\n completedAt: undefined,\n startedAt: undefined,\n expiredAt: undefined,\n specVersion: 2,\n executionContext: {},\n ...overrides,\n }) as unknown as WorkflowRun;\n\ndescribe('hasExpiredData', () => {\n it('returns false when expiredAt is undefined', () => {\n expect(hasExpiredData(makeRun({ expiredAt: undefined }))).toBe(false);\n });\n\n it('returns false when expiredAt is in the future', () => {\n const future = new Date(Date.now() + 24 * 60 * 60 * 1000);\n expect(hasExpiredData(makeRun({ expiredAt: future }))).toBe(false);\n });\n\n it('returns true when expiredAt is in the past', () => {\n const past = new Date(Date.now() - 24 * 60 * 60 * 1000);\n expect(hasExpiredData(makeRun({ expiredAt: past }))).toBe(true);\n });\n});\n\ndescribe('formatTableValue expired data handling', () => {\n it('returns input value when expiredAt is in the future', () => {\n const future = new Date(Date.now() + 24 * 60 * 60 * 1000);\n const item = { expiredAt: future.toISOString(), input: 'hello' };\n const result = formatTableValue('input', 'hello', {}, undefined, item);\n expect(result).not.toContain('expired');\n });\n\n it('returns expired message when expiredAt is in the past', () => {\n const past = new Date(Date.now() - 24 * 60 * 60 * 1000);\n const item = { expiredAt: past.toISOString(), output: 'hello' };\n const result = formatTableValue('output', 'hello', {}, undefined, item);\n expect(String(result)).toContain('data expired');\n });\n\n it('returns input value when expiredAt is not present', () => {\n const item = { input: 'hello' };\n const result = formatTableValue('input', 'hello', {}, undefined, item);\n expect(String(result)).not.toContain('expired');\n });\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/lib/inspect/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Interactive pagination for CLI tables\n */\nimport readline from 'node:readline';\nimport { logger } from '../config/log.js';\nimport { isInteractive } from './terminal-utils.js';\n\nexport interface PaginationState {\n cursor: string | null | undefined;\n hasMore: boolean;\n hasPrevious: boolean;\n currentPage: number;\n totalPages: number;\n hasMorePagesAvailable: boolean;\n}\n\nexport interface PaginationCallbacks {\n onNext: () => Promise<void>;\n onPrevious: () => Promise<void>;\n onExit: () => void;\n}\n\n/**\n * Setup interactive pagination listener\n */\nexport const setupPaginationListener = (\n state: PaginationState,\n callbacks: PaginationCallbacks\n): (() => void) => {\n if (!isInteractive()) {\n return () => {}; // No-op cleanup function\n }\n\n // Enable raw mode for immediate key capture\n if (process.stdin.isTTY) {\n readline.emitKeypressEvents(process.stdin);\n process.stdin.setRawMode(true);\n }\n\n const keypressHandler = async (_chunk: string, key: any) => {\n if (!key) return;\n\n // Handle exit\n if (key.name === 'q' || (key.ctrl && key.name === 'c')) {\n callbacks.onExit();\n return;\n }\n\n // Handle next page\n if (\n (key.name === 'n' && !key.ctrl) ||\n key.name === 'right' ||\n key.name === 'down'\n ) {\n if (state.hasMore) {\n await callbacks.onNext();\n } else {\n logger.warn('No more pages available');\n }\n return;\n }\n\n // Handle previous page\n if (\n (key.name === 'p' && !key.ctrl) ||\n key.name === 'left' ||\n key.name === 'up'\n ) {\n // Always allow going \"previous\" - on first page it reloads\n await callbacks.onPrevious();\n return;\n }\n };\n\n process.stdin.on('keypress', keypressHandler);\n\n // Return cleanup function\n return () => {\n process.stdin.off('keypress', keypressHandler);\n if (process.stdin.isTTY && process.stdin.isRaw) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n };\n};\n\n/**\n * Show pagination state info\n */\nexport const showPaginationState = (state: PaginationState) => {\n const parts: string[] = [];\n\n // Show page indicator\n // Use hasMorePagesAvailable to determine if there are unknown pages beyond what we've loaded\n const pageIndicator = state.hasMorePagesAvailable\n ? `Page ${state.currentPage} of ${state.totalPages}+`\n : `Page ${state.currentPage} of ${state.totalPages}`;\n parts.push(pageIndicator);\n\n if (state.hasPrevious) {\n parts.push('[p] Previous');\n } else {\n parts.push('[p] Reload');\n }\n\n if (state.hasMore) {\n parts.push('[n] Next');\n }\n\n parts.push('[q] Quit (or Ctrl+C)');\n logger.log(`\\n${parts.join(' | ')}`);\n};\n\n/**\n * Page data structure for caching paginated results\n */\nexport interface PageData<T> {\n data: T[];\n cursor: string | null | undefined;\n hasMore: boolean;\n}\n\n/**\n * Generic pagination handler for list operations\n */\nexport interface ListPaginationOptions<TData> {\n /**\n * Initial cursor from CLI options\n */\n initialCursor?: string;\n\n /**\n * Fetch function that returns paginated data\n */\n fetchPage: (cursor: string | undefined) => Promise<PageData<TData>>;\n\n /**\n * Display function that renders the current page\n */\n displayPage: (data: TData[], pageIndex: number) => void | Promise<void>;\n\n /**\n * Optional callback for when fetching starts\n */\n onFetchStart?: (pageIndex: number) => void;\n\n /**\n * Enable interactive pagination with keyboard controls\n */\n interactive?: boolean;\n}\n\n/**\n * Setup pagination for list operations with page caching\n */\nexport async function setupListPagination<TData>(\n options: ListPaginationOptions<TData>\n): Promise<void> {\n const { initialCursor, fetchPage, displayPage, onFetchStart, interactive } =\n options;\n\n // Interactive mode requires both TTY support and explicit --interactive flag\n const enableInteractive = interactive && isInteractive();\n\n // Pages stack - stores all fetched pages\n const pages: PageData<TData>[] = [];\n\n // Current page index (0-based)\n let pageIndex = 0;\n\n /**\n * Fetch and display a specific page\n */\n const showPage = async (index: number, cursor?: string) => {\n if (onFetchStart) {\n onFetchStart(index);\n }\n\n const page = await fetchPage(cursor);\n pages[index] = page;\n pageIndex = index;\n\n // Clear screen for subsequent pages in interactive mode\n if (enableInteractive) {\n console.clear();\n }\n\n await displayPage(page.data, index);\n return page;\n };\n\n // Fetch and display first page\n const firstPage = await showPage(0, initialCursor);\n\n // In non-interactive mode, show info if there are more pages\n if (!enableInteractive) {\n if (firstPage.hasMore) {\n logger.info(\n '\\nMore results available. Use --interactive (-i) to paginate through results.'\n );\n }\n return;\n }\n\n // Setup pagination state\n const paginationState: PaginationState = {\n cursor: firstPage.cursor,\n hasMore: firstPage.hasMore,\n hasPrevious: false,\n currentPage: 1,\n totalPages: 1,\n hasMorePagesAvailable: firstPage.hasMore,\n };\n\n showPaginationState(paginationState);\n\n const cleanup = setupPaginationListener(paginationState, {\n onNext: async () => {\n const newPageIndex = pageIndex + 1;\n\n // Check if we already have this page cached\n if (pages[newPageIndex]) {\n pageIndex = newPageIndex;\n const cachedPage = pages[newPageIndex];\n\n if (enableInteractive) {\n console.clear();\n }\n\n await displayPage(cachedPage.data, pageIndex);\n\n paginationState.cursor = cachedPage.cursor;\n paginationState.hasMore = cachedPage.hasMore;\n paginationState.hasPrevious = pageIndex > 0;\n paginationState.currentPage = pageIndex + 1;\n paginationState.totalPages = pages.length;\n // Check if the last page in cache has more data\n paginationState.hasMorePagesAvailable = pages[pages.length - 1].hasMore;\n } else {\n // Fetch new page using cursor from current page\n const currentPage = pages[pageIndex];\n const nextPage = await showPage(\n newPageIndex,\n currentPage.cursor || undefined\n );\n\n paginationState.cursor = nextPage.cursor;\n paginationState.hasMore = nextPage.hasMore;\n paginationState.hasPrevious = pageIndex > 0;\n paginationState.currentPage = pageIndex + 1;\n paginationState.totalPages = pages.length;\n // Check if the last page in cache has more data\n paginationState.hasMorePagesAvailable = pages[pages.length - 1].hasMore;\n }\n\n showPaginationState(paginationState);\n },\n onPrevious: async () => {\n // Special case: on first page, reload\n if (pageIndex === 0) {\n pages.length = 0; // Clear cache\n const reloadedPage = await showPage(0, initialCursor);\n\n paginationState.cursor = reloadedPage.cursor;\n paginationState.hasMore = reloadedPage.hasMore;\n paginationState.hasPrevious = false;\n paginationState.currentPage = 1;\n paginationState.totalPages = 1;\n paginationState.hasMorePagesAvailable = reloadedPage.hasMore;\n } else {\n // Go to previous cached page\n pageIndex--;\n const prevPage = pages[pageIndex];\n\n if (enableInteractive) {\n console.clear();\n }\n\n await displayPage(prevPage.data, pageIndex);\n\n paginationState.cursor = prevPage.cursor;\n paginationState.hasMore = prevPage.hasMore;\n paginationState.hasPrevious = pageIndex > 0;\n paginationState.currentPage = pageIndex + 1;\n paginationState.totalPages = pages.length;\n // Check if the last page in cache has more data\n paginationState.hasMorePagesAvailable = pages[pages.length - 1].hasMore;\n }\n\n showPaginationState(paginationState);\n },\n onExit: () => {\n cleanup();\n process.exit(0);\n },\n });\n\n // Keep process alive\n return new Promise(() => {});\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/lib/inspect/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { start } from '@workflow/core/runtime';\nimport { healthCheck } from '@workflow/core/runtime/helpers';\nimport type { WorkflowRun, World } from '@workflow/world';\nimport { logger } from '../config/log.js';\n\ninterface CLICreateOpts {\n json?: boolean;\n verbose?: boolean;\n}\n\nconst getWorkflowName = async (world: World, runNameOrId: string) => {\n if (runNameOrId.startsWith('wrun_')) {\n const run = await world.runs.get(runNameOrId);\n if (!run) {\n throw new Error(`Run ${runNameOrId} not found`);\n }\n return run.workflowName;\n }\n return runNameOrId;\n};\n\nexport const startRun = async (\n world: World,\n workflowNameOrRunId: string,\n opts: CLICreateOpts,\n args: string[]\n) => {\n const jsonArgs = args.map((arg) => {\n try {\n return JSON.parse(arg);\n } catch (error) {\n logger.warn(`Failed to parse argument \"${arg}\" as JSON: ${error}`);\n throw error;\n }\n });\n\n let run: WorkflowRun | undefined;\n // If the workflowNameOrRunId is a run ID, get the run\n if (workflowNameOrRunId.startsWith('wrun_')) {\n run = await world.runs.get(workflowNameOrRunId);\n } else {\n // Get the first run for that name, hopefully the newest deployment,\n // but can't guarantee that.\n const runList = await world.runs.list({\n workflowName: workflowNameOrRunId,\n pagination: {\n sortOrder: 'desc',\n limit: 1,\n },\n });\n run = runList.data[0];\n }\n\n if (!run) {\n throw new Error(`Run \"${workflowNameOrRunId}\" not found`);\n }\n\n const deploymentId = run.deploymentId;\n const workflowId = await getWorkflowName(world, workflowNameOrRunId);\n\n // Probe the deployment's specVersion via health check so we use the\n // correct queue transport (JSON for old deployments, CBOR for new).\n // Falls back to the run's specVersion if the health check fails\n // (e.g. old deployment without health check support).\n let specVersion = run.specVersion;\n try {\n const hc = await healthCheck(world, 'workflow', {\n deploymentId,\n timeout: 10_000,\n });\n if (hc.healthy && hc.specVersion != null) {\n specVersion = hc.specVersion;\n }\n } catch {\n // Health check failed — use run's specVersion as fallback\n }\n\n const newRun = await start({ workflowId }, jsonArgs, {\n deploymentId,\n specVersion,\n });\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(newRun, null, 2));\n } else {\n logger.log(newRun);\n }\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/lib/inspect/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAElB,YAAY,GACb,MAAM,UAAU,CAAC;AAElB;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,KAQC,EACD,OAAe,EACf,2BAA2B,GAAG,KAAK,EACnC,EAAE;IACF,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEvC,oBAAoB;IACpB,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAExD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,aAAa;QAC3B,CAAC,CAAC,YAAY,CAAC,2BAA2B,EAAE,2BAA2B,CAAC;QACxE,CAAC,CAAC,2BAA2B,CAAC;IAEhC,wBAAwB;IACxB,MAAM,QAAQ,GAAG;QACf,iBAAiB,OAAO,EAAE;QAC1B,WAAW,OAAO,EAAE;QACpB,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC;KACvC,CAAC;IAEF,kCAAkC;IAClC,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;QACzD,QAAQ,CAAC,IAAI,CACX,EAAE,EACF,KAAK,CAAC,IAAI,CACR,qBAAqB,WAAW,CAAC,cAAc,MAAM,WAAW,CAAC,aAAa,EAAE,CACjF;QACD,0FAA0F;QAC1F,sFAAsF;QACtF,uDAAuD;QACvD,KAAK,CAAC,IAAI,CACR,oCAAoC,WAAW,CAAC,aAAa,IAAI,CAClE,EACD,KAAK,CAAC,IAAI,CACR,YAAY,CACV,gBAAgB,EAChB,6CAA6C,CAC9C,CACF,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;IAErC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5D,YAAY,CAAC;QACX,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC/B,qBAAqB,EAAE,KAAK,CAAC,OAAO;KACrC,CAAC,CAAC;IAEH,IAAI,aAAwC,CAAC;IAC7C,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,sEAAsE;QACtE,kEAAkE;QAClE,YAAY,CAAC;YACX,mBAAmB,EAAE,KAAK,CAAC,GAAG;YAC9B,0BAA0B,EAAE,KAAK,CAAC,SAAS;YAC3C,uBAAuB,EAAE,KAAK,CAAC,OAAO;YACtC,oBAAoB,EAAE,KAAK,CAAC,IAAI;SACjC,CAAC,CAAC;QACH,aAAa,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC7C,CAAC;SAAM,IACL,KAAK,CAAC,OAAO,KAAK,OAAO;QACzB,KAAK,CAAC,OAAO,KAAK,uBAAuB,EACzC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,sBAAsB,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,2BAA2B,EAAE,CAAC;gBAChC,MAAM,WAAW,GACf,KAAK,YAAY,KAAK;oBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,6BAA6B,CAAC;gBACpC,MAAM,CAAC,IAAI,CACT,iDAAiD,EACjD,WAAW,CACZ,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAEnC,IAAI,KAAY,CAAC;IACjB,IAAI,aAAa,EAAE,CAAC;QAClB,wEAAwE;QACxE,gDAAgD;QAChD,KAAK,GAAG,iBAAiB,CAAC;YACxB,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,aAAa,EAAE;gBACb,WAAW,EAAE,aAAa,CAAC,WAAW;gBACtC,SAAS,EAAE,aAAa,CAAC,SAAS;gBAClC,WAAW,EAAE,aAAa,CAAC,WAAW;gBACtC,MAAM,EAAE,aAAa,CAAC,MAAM;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAC9B,CAAC;IAED,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC","sourcesContent":["import { createWorld, setWorld } from '@workflow/core/runtime';\nimport { isVercelWorldTarget } from '@workflow/utils';\nimport type { World } from '@workflow/world';\nimport { createVercelWorld } from '@workflow/world-vercel';\nimport chalk from 'chalk';\nimport terminalLink from 'terminal-link';\nimport { logger, setJsonMode, setVerboseMode } from '../config/log.js';\nimport { checkForUpdateCached } from '../update-check.js';\nimport {\n inferLocalWorldEnvVars,\n inferVercelEnvVars,\n type VercelEnvVars,\n writeEnvVars,\n} from './env.js';\n\n/**\n * Setup CLI world configuration.\n * If throwOnConfigError is false, will return null world with the error message\n * instead of throwing, allowing the web UI to open for configuration.\n */\nexport const setupCliWorld = async (\n flags: {\n json: boolean;\n verbose: boolean;\n backend: string;\n env: string;\n authToken: string;\n project: string;\n team: string;\n },\n version: string,\n ignoreLocalWorldConfigError = false\n) => {\n setJsonMode(Boolean(flags.json));\n setVerboseMode(Boolean(flags.verbose));\n\n // Check for updates\n const updateCheck = await checkForUpdateCached(version);\n\n const withAnsiLinks = flags.json ? false : true;\n const docsUrl = withAnsiLinks\n ? terminalLink('https://workflow-sdk.dev/', 'https://workflow-sdk.dev/')\n : 'https://workflow-sdk.dev/';\n\n // Prepare showBox lines\n const boxLines = [\n `Workflow CLI v${version}`,\n `Docs at ${docsUrl}`,\n chalk.yellow('This is a beta release'),\n ];\n\n // Add update message if available\n if (updateCheck.needsUpdate && updateCheck.latestVersion) {\n boxLines.push(\n '',\n chalk.cyan(\n `Update available: ${updateCheck.currentVersion} → ${updateCheck.latestVersion}`\n ),\n // Note that we're suggesting install \"latest\" instead of the release tag that the user is\n // on, because we currently tag beta releases as \"latest\". After GA, we need to adjust\n // this to install the release tag that the user is on.\n chalk.gray(\n `Run: \\`[npm|bun|pnpm] i workflow@${updateCheck.latestVersion}\\``\n ),\n chalk.gray(\n terminalLink(\n 'View changelog',\n 'https://github.com/vercel/workflow/releases'\n )\n )\n );\n }\n\n logger.showBox('green', ...boxLines);\n\n logger.debug('Inferring env vars, backend:', flags.backend);\n writeEnvVars({\n DEBUG: flags.verbose ? '1' : '',\n WORKFLOW_TARGET_WORLD: flags.backend,\n });\n\n let vercelEnvVars: VercelEnvVars | undefined;\n if (isVercelWorldTarget(flags.backend)) {\n // Seed the initial flags into process.env so inferVercelEnvVars() can\n // read them via getEnvVars() as starting values before inference.\n writeEnvVars({\n WORKFLOW_VERCEL_ENV: flags.env,\n WORKFLOW_VERCEL_AUTH_TOKEN: flags.authToken,\n WORKFLOW_VERCEL_PROJECT: flags.project,\n WORKFLOW_VERCEL_TEAM: flags.team,\n });\n vercelEnvVars = await inferVercelEnvVars();\n } else if (\n flags.backend === 'local' ||\n flags.backend === '@workflow/world-local'\n ) {\n try {\n await inferLocalWorldEnvVars();\n } catch (error) {\n if (ignoreLocalWorldConfigError) {\n const configError =\n error instanceof Error\n ? error.message\n : 'Unknown configuration error';\n logger.warn(\n 'Failed to find valid local world configuration:',\n configError\n );\n return null;\n }\n throw error;\n }\n }\n\n logger.debug('Initializing world');\n\n let world: World;\n if (vercelEnvVars) {\n // Build the Vercel world directly from the inferred config, rather than\n // relying on createWorld() reading process.env.\n world = createVercelWorld({\n token: vercelEnvVars.token,\n projectConfig: {\n environment: vercelEnvVars.environment,\n projectId: vercelEnvVars.projectId,\n projectName: vercelEnvVars.projectName,\n teamId: vercelEnvVars.teamId,\n },\n });\n } else {\n world = await createWorld();\n }\n\n // Store in the global cache so BaseCommand.finally() can find and close it.\n setWorld(world);\n return world;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/lib/inspect/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,MAA+B,EAC/B,EAAU,EACV,IAAuB,EACvB,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,mEAAmE;IACnE,yEAAyE;IACzE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM;YACR,CAAC;YAED,oBAAoB;YACpB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,+BAA+B;gBAC/B,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACrE,MAAM,CAAC,GAAG,CAAC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC,CAAC;gBACtC,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iFAAiF;QACjF,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,KAAK,CACV,kFAAkF,CACnF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC1B,KAAK,EAAE,iCAAiC,EAAE,EAAE;gBAC5C,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;aACrB,CAAC,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { logger } from '../config/log.js';\nimport type { InspectCLIOptions } from '../config/types.js';\n\n/**\n * This function will read from a deserialized stream and write the output to the console.\n * If the stream is not closed, this function will block until the stream is closed.\n */\nexport const streamToConsole = async (\n stream: ReadableStream<unknown>,\n id: string,\n opts: InspectCLIOptions\n) => {\n const reader = stream.getReader();\n // Keep the Node.js event loop alive while we await stream closure.\n // Pending Promises alone do not keep the process alive when using oclif.\n const keepAlive = setInterval(() => {}, 60_000);\n let chunkIndex = 0;\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n\n // Skip empty chunks\n if (value === undefined || value === null) {\n continue;\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n } else {\n // Format the value for display\n const text =\n typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n logger.log(`[${chunkIndex}] ${text}`);\n chunkIndex++;\n }\n }\n } catch (err) {\n // Provide a clear message when the stream is encrypted and --decrypt wasn't used\n if (err instanceof Error && err.message.includes('no encryption key')) {\n logger.error(\n 'This stream contains encrypted data. Use --decrypt --run=<run-id> to decrypt it.'\n );\n } else {\n console.error(`Failed to read stream with ID ${id}:`, err);\n }\n if (opts.json) {\n const json = JSON.stringify({\n error: `Failed to read stream with ID ${id}`,\n details: String(err),\n });\n process.stderr.write(`${json}\\n`);\n }\n } finally {\n clearInterval(keepAlive);\n try {\n await reader.cancel();\n } catch {\n // Ignore cancellation errors during cleanup\n }\n }\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-utils.js","sourceRoot":"","sources":["../../../src/lib/inspect/terminal-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Utilities for terminal display and environment detection\n */\n\n/**\n * Check if running in CI environment\n */\nexport const isCI = (): boolean => {\n return !!(\n process.env.CI ||\n process.env.CONTINUOUS_INTEGRATION ||\n process.env.BUILD_NUMBER ||\n process.env.GITHUB_ACTIONS ||\n process.env.GITLAB_CI ||\n process.env.CIRCLECI ||\n process.env.TRAVIS ||\n process.env.JENKINS_URL ||\n process.env.BUILDKITE ||\n process.env.TF_BUILD\n );\n};\n\n/**\n * Check if running in an interactive terminal\n */\nexport const isInteractive = (): boolean => {\n return !isCI() && !!process.stdout.isTTY;\n};\n\n/**\n * Get the current terminal width\n */\nexport const getTerminalWidth = (): number => {\n return process.stdout.columns || 80; // Default to 80 if not available\n};\n\n/**\n * Calculate display settings based on terminal width\n */\nexport interface DisplaySettings {\n showRelativeDates: boolean;\n dataFieldWidth: number;\n abbreviateStatus: boolean;\n namesTruncateLength: number;\n truncateIdsToLastChars: boolean;\n hideCompletedAt: boolean;\n}\n\nexport const getDisplaySettings = (\n terminalWidth: number,\n withData: boolean,\n isRunTable: boolean = true\n): DisplaySettings => {\n // Base widths from actual measurements (without data fields)\n const baseWidth = (isRunTable ? 140 : 170) + (withData ? 32 : 0);\n\n // Initialize with defaults\n const settings: DisplaySettings = {\n showRelativeDates: !withData, // Disabled by default when withData is true\n dataFieldWidth: 15,\n abbreviateStatus: false,\n namesTruncateLength: 40,\n truncateIdsToLastChars: false,\n hideCompletedAt: false,\n };\n\n // If terminal width is sufficient, return defaults\n if (terminalWidth >= baseWidth) {\n return settings;\n }\n\n // Progressive degradation avenues\n let availableWidth = baseWidth;\n\n // Disable relative dates (save 34 characters)\n if (settings.showRelativeDates && terminalWidth < availableWidth) {\n settings.showRelativeDates = false;\n availableWidth -= 34;\n }\n\n // Reduce data field width if withData is set (save 20 characters from 2*10)\n if (\n withData &&\n settings.dataFieldWidth === 15 &&\n terminalWidth < availableWidth\n ) {\n settings.dataFieldWidth = 5;\n availableWidth -= 20;\n }\n\n // Abbreviate status and set header to \"S\" (save 8 characters)\n if (terminalWidth < availableWidth) {\n settings.abbreviateStatus = true;\n availableWidth -= 8;\n }\n\n // Trim names from 40 to 20 characters (save 20 characters)\n if (settings.namesTruncateLength === 40 && terminalWidth < availableWidth) {\n settings.namesTruncateLength = 20;\n availableWidth -= 20;\n }\n\n // Hide completedAt column (save 23 characters)\n if (terminalWidth < availableWidth) {\n settings.hideCompletedAt = true;\n availableWidth -= 23;\n }\n\n // Trim IDs to last 4 characters\n if (terminalWidth < availableWidth) {\n settings.truncateIdsToLastChars = true;\n availableWidth -= isRunTable ? 24 : 48;\n }\n\n return settings;\n};\n\n/**\n * Format status with optional abbreviation\n */\nexport const formatStatus = (status: string, abbreviated: boolean): string => {\n if (!abbreviated) {\n return status;\n }\n\n // Abbreviate to first letter\n const abbrevMap: Record<string, string> = {\n running: 'R',\n completed: 'C',\n failed: 'F',\n cancelled: 'X',\n pending: 'P',\n };\n\n return abbrevMap[status.toLowerCase()] || status.charAt(0).toUpperCase();\n};\n\n/**\n * Format ISO date without T and Z characters\n */\nexport const formatISODate = (date: Date): string => {\n const isoString = date.toISOString();\n // Replace T with space and remove Z\n return isoString.replace('T', ' ').replace('Z', '');\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vercel-api.js","sourceRoot":"","sources":["../../../src/lib/inspect/vercel-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAO1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,SAAiB;IAEjB,IAAI,CAAC;QACH,oDAAoD;QACpD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mCAAmC,MAAM,EAAE,EAAE;YACxE,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,SAAS,EAAE;aACrC;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,0DAA0D;QAC1D,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvD,MAAM,CAAC,KAAK,CACV,KAAK,CAAC,GAAG,CACP,0BAA0B,QAAQ,CAAC,MAAM,sCAAsC,CAChF,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,MAAM,CACV,gEAAgE,CACjE,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CACV,8BAA8B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACvE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;QACnD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+DAA+D;QAC/D,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,CAAC,KAAK,CACV,wEAAwE,CACzE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM;AACN,+DAA+D;AAC/D,MAAM;AACN,uDAAuD;AACvD,sBAAsB;AACtB,yBAAyB;AACzB,sBAAsB;AACtB,wBAAwB;AACxB,UAAU;AACV,yFAAyF;AACzF,+EAA+E;AAE/E,mDAAmD;AACnD,wBAAwB;AACxB,4BAA4B;AAC5B,mBAAmB;AACnB,gDAAgD;AAChD,WAAW;AACX,UAAU;AAEV,yCAAyC;AACzC,2EAA2E;AAC3E,oBAAoB;AACpB,sGAAsG;AACtG,SAAS;AAET,0BAA0B;AAC1B,sBAAsB;AACtB,uEAAuE;AACvE,oBAAoB;AACpB,MAAM;AACN,IAAI;AAEJ;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,WAAmB,EACnB,QAAgB,EAChB,EAAW;IAEX,IAAI,GAAG,GAAG,sBAAsB,QAAQ,IAAI,WAAW,0BAA0B,CAAC;IAElF,sCAAsC;IACtC,IAAI,QAAQ,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC;QAC7B,GAAG,IAAI,SAAS,EAAE,yBAAyB,CAAC;IAC9C,CAAC;SAAM,IAAI,EAAE,EAAE,CAAC;QACd,GAAG,IAAI,IAAI,QAAQ,MAAM,EAAE,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import chalk from 'chalk';\nimport { logger } from '../config/log.js';\n\ninterface VercelTeam {\n id: string;\n slug: string;\n}\n\n/**\n * Fetch team information from Vercel API\n * Timeout: 5 seconds - falls back to local UI if the request fails or times out\n */\nexport async function fetchTeamInfo(\n teamId: string,\n authToken: string\n): Promise<{ teamSlug: string } | null> {\n try {\n // Create an AbortController with a 5 second timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`https://api.vercel.com/v2/teams/${teamId}`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n },\n signal: controller.signal,\n });\n\n // Clear the timeout if the request completes successfully\n clearTimeout(timeoutId);\n\n if (response.status === 401 || response.status === 403) {\n logger.error(\n chalk.red(\n `Authentication failed (${response.status}): Unable to access team information`\n )\n );\n logger.warn(\n chalk.yellow(\n '\\nPlease ensure you are logged in and have access to the team:'\n )\n );\n logger.warn(chalk.yellow(' Run `vercel login` to authenticate'));\n return null;\n }\n\n if (!response.ok) {\n logger.debug(\n `Failed to fetch team info: ${response.status} ${response.statusText}`\n );\n return null;\n }\n\n const team = (await response.json()) as VercelTeam;\n return {\n teamSlug: team.slug,\n };\n } catch (error) {\n // Handle both timeout and other errors - fall back to local UI\n if (error instanceof Error && error.name === 'AbortError') {\n logger.debug(\n 'Vercel API request timed out after 5 seconds, falling back to local UI'\n );\n } else {\n logger.debug(`Error fetching team info: ${error}`);\n }\n return null;\n }\n}\n\n// /**\n// * Check if the Vercel dashboard workflows page is available\n// */\n// export async function checkVercelDashboardAvailable(\n// teamSlug: string,\n// projectName: string,\n// authToken: string\n// ): Promise<boolean> {\n// try {\n// const dashboardUrl = `https://vercel.com/${teamSlug}/${projectName}/ai/workflows`;\n// logger.debug(`Checking Vercel dashboard availability: ${dashboardUrl}`);\n\n// const response = await fetch(dashboardUrl, {\n// method: 'HEAD',\n// redirect: 'follow',\n// headers: {\n// Authorization: `Bearer ${authToken}`,\n// },\n// });\n\n// // Consider 2xx and 3xx as success\n// const isAvailable = response.status >= 200 && response.status < 400;\n// logger.debug(\n// `Dashboard check result: ${response.status} - ${isAvailable ? 'available' : 'not available'}`\n// );\n\n// return isAvailable;\n// } catch (error) {\n// logger.debug(`Error checking dashboard availability: ${error}`);\n// return false;\n// }\n// }\n\n/**\n * Get the Vercel dashboard URL for workflows\n */\nexport function getVercelDashboardUrl(\n teamSlug: string,\n projectName: string,\n resource: string,\n id?: string\n): string {\n let url = `https://vercel.com/${teamSlug}/${projectName}/observability/workflows`;\n\n // Add resource-specific path segments\n if (resource === 'run' && id) {\n url += `/runs/${id}?environment=production`;\n } else if (id) {\n url += `?${resource}Id=${id}`;\n }\n\n return url;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vercel-link.js","sourceRoot":"","sources":["../../../src/lib/inspect/vercel-link.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * This file was copied from @vercel/vercel/packages/cli/src/util/projects/link.ts\n * and adapted to work without importing most of the vercel CLI code.\n *\n * It strips:\n * - Network requests for validating whether the org/user/team/project exists\n * - Some vercel-specific environment variable checks and inference\n * that we're not supporting for Workflow CLI for now\n */\n\nimport { execSync } from 'node:child_process';\nimport fs, { statSync } from 'node:fs';\nimport { lstat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join, normalize, posix, relative } from 'node:path';\nimport util from 'node:util';\nimport { promisify } from 'util';\nimport { logger } from '../config/log.js';\n\nconst home = homedir();\n\ninterface RepoProjectConfig {\n id: string;\n name: string;\n directory: string;\n /** Per-project orgId — added in vercel/vercel#14967. Prefer this over root-level orgId. */\n orgId?: string;\n}\n\ninterface RepoProjectsConfig {\n /** Legacy root-level orgId — older Vercel CLI versions put orgId here. */\n orgId?: string;\n remoteName: string;\n projects: RepoProjectConfig[];\n}\n\ninterface RepoLink {\n rootPath: string;\n repoConfigPath: string;\n repoConfig?: RepoProjectsConfig;\n}\n\nexport interface ProjectLink {\n /**\n * ID of the Vercel Project.\n */\n projectId: string;\n /**\n * User or Team ID of the owner of the Vercel Project.\n */\n orgId: string;\n /**\n * When linked as a repository, contains the absolute path\n * to the root directory of the repository.\n */\n repoRoot?: string;\n /**\n * When linked as a repository, contains the relative path\n * to the selected project root directory.\n */\n projectRootDirectory?: string;\n /**\n * Name of the Vercel Project.\n */\n projectName?: string;\n}\n\nconst readFile = promisify(fs.readFile);\n\nexport const VERCEL_DIR = '.vercel';\nexport const VERCEL_DIR_FALLBACK = '.now';\nexport const VERCEL_DIR_PROJECT = 'project.json';\nexport const VERCEL_DIR_REPO = 'repo.json';\n\nconst isDirectory = (dir: string) => {\n try {\n return statSync(dir).isDirectory();\n } catch (err) {\n logger.debug(`${dir} is not a directory: ${err}`);\n return false;\n }\n};\n\n/**\n * A type guard for `try...catch` errors.\n * @deprecated use `require('node:util').types.isNativeError(error)` instead\n */\nexport const isError = (error: unknown): error is Error => {\n return util.types.isNativeError(error);\n};\n\nexport const isErrnoException = (\n error: unknown\n): error is NodeJS.ErrnoException => {\n return isError(error) && 'code' in error;\n};\n\nexport const isOneOfErrNoExceptions = (error: unknown, codes: string[]) => {\n return (\n isErrnoException(error) &&\n 'code' in error &&\n error.code &&\n codes.includes(error.code)\n );\n};\n\n/**\n * Returns the `<cwd>/.vercel` directory for the current project\n * with a fallback to <cwd>/.now` if it exists.\n *\n * Throws an error if *both* `.vercel` and `.now` directories exist.\n */\nexport function getVercelDirectory(cwd: string): string {\n logger.debug(`Getting vercel directory for ${cwd}`);\n const possibleDirs = [join(cwd, VERCEL_DIR), join(cwd, VERCEL_DIR_FALLBACK)];\n logger.debug(`Possible vercel directories: ${possibleDirs.join(', ')}`);\n const existingDirs = possibleDirs.filter((d) => isDirectory(d));\n if (existingDirs.length > 1) {\n throw new Error(\n 'CONFLICTING_CONFIG_DIRECTORIES: Both `.vercel` and `.now` directories exist. Please remove the `.now` directory.'\n );\n }\n return existingDirs[0] || possibleDirs[0];\n}\n\nexport async function getProjectLink(\n path: string\n): Promise<ProjectLink | null> {\n return (\n (await getProjectLinkFromRepoLink(path)) ||\n (await getLinkFromDir(getVercelDirectory(path)))\n );\n}\n\n/**\n * Convert Windows separators to Unix separators.\n */\nexport function normalizeOsPath(p: string): string {\n const isWin = process.platform === 'win32';\n return isWin ? p.replace(/\\\\/g, '/') : p;\n}\n\nfunction sortByDirectory(\n a: { directory: string },\n b: { directory: string }\n): number {\n const aParts = a.directory.split('/');\n const bParts = b.directory.split('/');\n return bParts.length - aParts.length;\n}\n\n/**\n * Finds the matching Projects from an array of Project links\n * where the provided relative path is within the Project's\n * root directory.\n */\nexport function findProjectsFromPath(\n projects: RepoProjectConfig[],\n path: string\n): RepoProjectConfig[] {\n logger.debug(\n `Finding projects ${JSON.stringify(projects)} from path ${path}`\n );\n const normalizedPath = normalizeOsPath(path);\n const matches = projects\n .slice()\n .sort(sortByDirectory)\n .filter((project) => {\n if (project.directory === '.') {\n // Project has no \"Root Directory\" setting, so any path is valid\n return true;\n }\n return (\n normalizedPath === project.directory ||\n normalizedPath.startsWith(`${project.directory}/`)\n );\n });\n // If there are multiple matches, we only want the most relevant\n // selections (with the deepest directory depth), so pick the first\n // one and filter on those matches.\n const firstMatch = matches[0];\n return matches.filter((match) => match.directory === firstMatch.directory);\n}\n\nasync function getProjectLinkFromRepoLink(\n path: string\n): Promise<ProjectLink | null> {\n const repoLink = await getRepoLink(path);\n if (!repoLink?.repoConfig) {\n logger.debug('No repo link found');\n return null;\n }\n logger.debug('Repo link', JSON.stringify(repoLink));\n const projects = findProjectsFromPath(\n repoLink.repoConfig.projects,\n relative(repoLink.rootPath, path)\n );\n logger.debug(`Found matching repo projects: ${JSON.stringify(projects)}`);\n if (projects.length === 1) {\n const project = projects[0];\n // Prefer per-project orgId (vercel/vercel#14967), fall back to\n // root-level orgId for older Vercel CLI versions.\n const orgId = project.orgId ?? repoLink.repoConfig?.orgId;\n if (!orgId) {\n logger.debug('No orgId found in repo link project or root config');\n return null;\n }\n return {\n repoRoot: repoLink.rootPath,\n orgId,\n projectId: project.id,\n projectName: project.name,\n projectRootDirectory: project.directory,\n };\n } else if (projects.length > 1) {\n throw new Error('Multiple projects found');\n }\n return null;\n}\n\nexport async function getLinkFromDir(\n vercelDir: string\n): Promise<ProjectLink | null> {\n logger.debug(`Getting link from dir ${vercelDir}`);\n try {\n const json = await readFile(join(vercelDir, VERCEL_DIR_PROJECT), 'utf8');\n const link: ProjectLink = JSON.parse(json);\n\n if (!link || !link.projectId || !link.orgId) {\n throw new Error(\n `Project Settings are invalid. To link your project again, remove the ${vercelDir} directory.`\n );\n }\n\n return link;\n } catch (err: unknown) {\n // link file does not exists, project is not linked\n if (isOneOfErrNoExceptions(err, ['ENOENT', 'ENOTDIR'])) {\n return null;\n }\n\n // link file can't be read\n if (isError(err) && err.name === 'SyntaxError') {\n throw new Error(\n `Project Settings could not be retrieved. To link your project again, remove the ${vercelDir} directory.`\n );\n }\n\n throw err;\n }\n}\n\nexport function* traverseUpDirectories({\n start,\n base,\n maxDepth = 10,\n}: {\n start: string;\n base?: string;\n maxDepth?: number;\n}) {\n let current: string | undefined = normalize(start);\n const normalizedRoot = base ? normalize(base) : undefined;\n let depth = 0;\n while (current) {\n yield current;\n if (current === normalizedRoot) break;\n // Go up one directory\n const next = join(current, '..');\n current = next === current ? undefined : next;\n depth++;\n if (depth > maxDepth) {\n logger.debug(`Max traversal depth of ${maxDepth} reached`);\n break;\n }\n }\n}\n\n/**\n * Given a `start` directory, traverses up the directory hierarchy until\n * the nearest `.git/config` file is found. Returns the directory where\n * the Git config was found, or `undefined` when no Git repo was found.\n */\nexport async function findRepoRoot(\n cwd: string,\n start: string\n): Promise<string | undefined> {\n const REPO_JSON_PATH = join(VERCEL_DIR, VERCEL_DIR_REPO);\n /**\n * If the current repo is a git submodule or git worktree '.git' is a file\n * with a pointer to the \"parent\" git repository instead of a directory.\n */\n const GIT_PATH = isGitWorktreeOrSubmodule(cwd)\n ? posix.normalize('.git')\n : posix.normalize('.git/config');\n\n for (const current of traverseUpDirectories({ start })) {\n if (current === home) {\n // Sometimes the $HOME directory is set up as a Git repo\n // (for dotfiles, etc.). In this case it's safe to say that\n // this isn't the repo we're looking for. Bail.\n logger.debug('Arrived at home directory');\n break;\n }\n\n // if `.vercel/repo.json` exists (already linked),\n // then consider this the repo root\n const repoConfigPath = join(current, REPO_JSON_PATH);\n let stat = await lstat(repoConfigPath).catch((err) => {\n if (err.code !== 'ENOENT') throw err;\n });\n if (stat) {\n logger.debug(\n `Found repo config \"${REPO_JSON_PATH}\" - detected \"${current}\" as repo root`\n );\n return current;\n }\n\n // if `.git/config` exists (unlinked),\n // then consider this the repo root\n const gitConfigPath = join(current, GIT_PATH);\n stat = await lstat(gitConfigPath).catch((err) => {\n if (err.code !== 'ENOENT') throw err;\n });\n if (stat) {\n logger.debug(\n `Found git config \"${GIT_PATH}\" - detected \"${current}\" as repo root`\n );\n return current;\n }\n }\n\n logger.debug('Aborting search for repo root');\n}\n\nfunction getGitDirectory(cwd: string): string | null {\n try {\n const gitConfigPath = execSync('git rev-parse --git-dir', {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n\n return gitConfigPath;\n } catch (err: unknown) {\n if (err instanceof Error) {\n logger.debug(`Failed to get git directory: ${err.message}`);\n }\n return null;\n }\n}\n\nexport function isGitWorktreeOrSubmodule(cwd: string): boolean {\n const gitDir = getGitDirectory(cwd);\n\n if (gitDir === null) {\n return false;\n }\n\n const isGitWorktree = gitDir.includes('.git/worktrees/');\n const isGitSubmodule = gitDir.includes('.git/modules/');\n\n return isGitWorktree || isGitSubmodule;\n}\n\n/**\n * Given a directory path `cwd`, finds the root of the Git repository\n * and returns the parsed `.vercel/repo.json` file if the repository\n * has already been linked.\n */\nexport async function getRepoLink(cwd: string): Promise<RepoLink | undefined> {\n // Determine where the root of the repo is\n logger.debug(`Getting repo link for ${cwd}`);\n const rootPath = await findRepoRoot(cwd, './');\n if (!rootPath) {\n logger.debug('getRepoLink: No repo root found');\n return undefined;\n }\n\n // Read the `repo.json`, if this repo has already been linked\n const repoConfigPath = join(rootPath, VERCEL_DIR, VERCEL_DIR_REPO);\n logger.debug(`getRepoLink: Reading repo config path \"${repoConfigPath}\"`);\n try {\n const file = await readFile(repoConfigPath, 'utf8');\n const repoConfig: RepoProjectsConfig = JSON.parse(file);\n return { rootPath, repoConfig, repoConfigPath };\n } catch (err) {\n logger.debug(`Failed to parse ${repoConfigPath}: ${err}`);\n return undefined;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/lib/inspect/web.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Server } from 'node:http';\nimport chalk from 'chalk';\nimport open from 'open';\nimport { logger } from '../config/log.js';\nimport { getEnvVars } from './env.js';\nimport { getVercelDashboardUrl } from './vercel-api.js';\n\nexport const getHostUrl = (webPort: number) => `http://localhost:${webPort}`;\n\nlet httpServer: Server | null = null;\n\n/**\n * Check if a server is already listening on the given URL.\n */\nasync function isServerRunning(hostUrl: string): Promise<boolean> {\n try {\n const response = await fetch(hostUrl, { method: 'HEAD' });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Start the @workflow/web server in the current process.\n */\nasync function startWebServer(webPort: number): Promise<boolean> {\n if (await isServerRunning(getHostUrl(webPort))) {\n logger.debug('Server is already running');\n return true;\n }\n\n try {\n logger.info('Starting web UI server...');\n const { startServer } = await import('@workflow/web/server');\n httpServer = await startServer(webPort);\n logger.success(chalk.green(`Web UI server started on port ${webPort}`));\n return true;\n } catch (error) {\n logger.error(`Failed to start server: ${error}`);\n return false;\n }\n}\n\n/**\n * Build a URL for opening the local web UI.\n *\n * The web UI reads world configuration from server-side environment variables.\n * Query params are only used for deep-linking to specific resources (resource/id, runId, etc.)\n */\nfunction buildWebUIUrl(\n hostUrl: string,\n resource: string,\n id: string | undefined,\n flags: Record<string, any>\n): string {\n const params = new URLSearchParams();\n\n // Deep-linking params\n params.set('resource', resource);\n if (id) {\n params.set('id', id);\n }\n\n // Optional deep-linking to specific run/step/hook\n for (const flagName of ['runId', 'stepId', 'hookId'] as const) {\n const value = flags[flagName];\n if (value !== undefined && value !== '' && value !== false) {\n params.set(flagName, String(value));\n }\n }\n\n const queryString = params.toString();\n return queryString ? `${hostUrl}?${queryString}` : hostUrl;\n}\n\n/**\n * Launch the web UI with the specified configuration.\n * This starts the server (if not running), opens the browser, then keeps the server running.\n *\n * World configuration is passed to the web server via environment variables.\n * The web UI reads these from process.env on the server side, not from query params.\n */\nexport async function launchWebUI(\n resource: string,\n id: string | undefined,\n flags: Record<string, any>,\n _cliVersion: string\n): Promise<void> {\n const envVars = getEnvVars();\n\n // Check if browser opening is disabled via flag or environment variable\n const disableBrowserOpen = flags.noBrowser;\n\n // Check if we should try to use the Vercel dashboard\n const vercelBackendNames = ['vercel', '@workflow/world-vercel'];\n const isVercelBackend = vercelBackendNames.includes(\n envVars.WORKFLOW_TARGET_WORLD\n );\n const teamSlug = envVars.WORKFLOW_VERCEL_TEAM;\n const projectName =\n envVars.WORKFLOW_VERCEL_PROJECT_NAME || envVars.WORKFLOW_VERCEL_PROJECT;\n\n // Check if user wants local UI via flag or environment variable\n const useLocalUi = flags.localUi;\n\n if (!useLocalUi && isVercelBackend) {\n logger.info(\n 'If you do not want to use the Vercel dashboard, use the --localUi flag or set WORKFLOW_LOCAL_UI=1 in your environment variables.'\n );\n }\n if (isVercelBackend && teamSlug && projectName && !useLocalUi) {\n logger.debug(\n `Checking Vercel dashboard availability for team: ${teamSlug}, project: ${projectName}`\n );\n\n const dashboardUrl = getVercelDashboardUrl(\n teamSlug,\n projectName,\n resource,\n id\n );\n\n if (disableBrowserOpen) {\n logger.info(chalk.cyan(`Vercel dashboard URL: ${dashboardUrl}`));\n logger.info(chalk.cyan('(Browser auto-open disabled)'));\n return;\n }\n\n logger.info(\n chalk.green(`Opening Vercel dashboard for workflows at: ${dashboardUrl}`)\n );\n try {\n await open(dashboardUrl);\n return; // Exit early since we opened the dashboard\n } catch (error) {\n logger.error(`Failed to open browser: ${error}`);\n logger.info(`Please open the link manually.`);\n return;\n }\n }\n\n // Fall back to local web UI\n const webPort = flags.webPort ?? 3456;\n const hostUrl = getHostUrl(webPort);\n const url = buildWebUIUrl(hostUrl, resource, id, flags);\n\n // Check if server is already running\n const alreadyRunning = await isServerRunning(hostUrl);\n\n if (alreadyRunning) {\n logger.info(\n chalk.cyan(`Web UI server is already running on port ${webPort}.`)\n );\n } else {\n // Start the server\n const started = await startWebServer(webPort);\n if (!started) {\n logger.error('Failed to start web UI server');\n return;\n }\n }\n\n // Open browser\n if (disableBrowserOpen) {\n logger.info(chalk.cyan(`Web UI available at: ${url}`));\n logger.info(chalk.cyan('(Browser auto-open disabled)'));\n } else {\n logger.info(chalk.cyan(`Opening browser to: ${url}`));\n try {\n await open(url);\n } catch (error) {\n logger.error(`Failed to open browser: ${error}`);\n logger.info(`Please open the link manually.`);\n }\n }\n\n // If we started the server, keep the process running\n if (!alreadyRunning && httpServer) {\n logger.info(chalk.cyan('Press Ctrl+C to stop the web UI server and exit'));\n\n // Keep the CLI process alive while the server is running\n await new Promise<void>((resolve) => {\n if (httpServer) {\n httpServer.on('close', () => resolve());\n } else {\n resolve();\n }\n });\n }\n}\n"]}