@workflow/cli 5.0.0-beta.4 → 5.0.0-beta.41

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 (108) hide show
  1. package/dist/base.js +1 -1
  2. package/dist/commands/build.js +1 -1
  3. package/dist/commands/cancel.d.ts +1 -0
  4. package/dist/commands/cancel.d.ts.map +1 -1
  5. package/dist/commands/cancel.js +36 -55
  6. package/dist/commands/dev.js +1 -1
  7. package/dist/commands/health.d.ts +1 -3
  8. package/dist/commands/health.d.ts.map +1 -1
  9. package/dist/commands/health.js +26 -50
  10. package/dist/commands/init.js +1 -1
  11. package/dist/commands/inspect.d.ts +4 -0
  12. package/dist/commands/inspect.d.ts.map +1 -1
  13. package/dist/commands/inspect.js +37 -7
  14. package/dist/commands/start.d.ts +1 -0
  15. package/dist/commands/start.d.ts.map +1 -1
  16. package/dist/commands/start.js +8 -3
  17. package/dist/commands/transform.js +1 -1
  18. package/dist/commands/validate.js +1 -1
  19. package/dist/commands/web.d.ts +2 -0
  20. package/dist/commands/web.d.ts.map +1 -1
  21. package/dist/commands/web.js +9 -3
  22. package/dist/lib/bulk-cancel.d.ts +74 -0
  23. package/dist/lib/bulk-cancel.d.ts.map +1 -0
  24. package/dist/lib/bulk-cancel.js +197 -0
  25. package/dist/lib/bulk-cancel.test.d.ts +2 -0
  26. package/dist/lib/bulk-cancel.test.d.ts.map +1 -0
  27. package/dist/lib/bulk-cancel.test.js +366 -0
  28. package/dist/lib/config/log.js +1 -1
  29. package/dist/lib/config/types.d.ts +6 -1
  30. package/dist/lib/config/types.d.ts.map +1 -1
  31. package/dist/lib/config/types.js +1 -1
  32. package/dist/lib/config/workflow-config.d.ts.map +1 -1
  33. package/dist/lib/config/workflow-config.js +2 -2
  34. package/dist/lib/inspect/auth.js +1 -1
  35. package/dist/lib/inspect/env.d.ts +1 -1
  36. package/dist/lib/inspect/env.js +2 -2
  37. package/dist/lib/inspect/errors.d.ts +3 -0
  38. package/dist/lib/inspect/errors.d.ts.map +1 -0
  39. package/dist/lib/inspect/errors.js +27 -0
  40. package/dist/lib/inspect/flags.d.ts +9 -0
  41. package/dist/lib/inspect/flags.d.ts.map +1 -1
  42. package/dist/lib/inspect/flags.js +23 -1
  43. package/dist/lib/inspect/hydration.d.ts +22 -0
  44. package/dist/lib/inspect/hydration.d.ts.map +1 -1
  45. package/dist/lib/inspect/hydration.js +107 -49
  46. package/dist/lib/inspect/hydration.test.d.ts +2 -0
  47. package/dist/lib/inspect/hydration.test.d.ts.map +1 -0
  48. package/dist/lib/inspect/hydration.test.js +23 -0
  49. package/dist/lib/inspect/output.d.ts +2 -2
  50. package/dist/lib/inspect/output.d.ts.map +1 -1
  51. package/dist/lib/inspect/output.js +327 -136
  52. package/dist/lib/inspect/output.test.js +663 -3
  53. package/dist/lib/inspect/pagination.d.ts +10 -1
  54. package/dist/lib/inspect/pagination.d.ts.map +1 -1
  55. package/dist/lib/inspect/pagination.js +20 -4
  56. package/dist/lib/inspect/run.d.ts.map +1 -1
  57. package/dist/lib/inspect/run.js +33 -10
  58. package/dist/lib/inspect/setup.d.ts.map +1 -1
  59. package/dist/lib/inspect/setup.js +42 -6
  60. package/dist/lib/inspect/stream.js +1 -1
  61. package/dist/lib/inspect/terminal-utils.js +1 -1
  62. package/dist/lib/inspect/time-window.d.ts +28 -0
  63. package/dist/lib/inspect/time-window.d.ts.map +1 -0
  64. package/dist/lib/inspect/time-window.js +61 -0
  65. package/dist/lib/inspect/time-window.test.d.ts +2 -0
  66. package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
  67. package/dist/lib/inspect/time-window.test.js +58 -0
  68. package/dist/lib/inspect/vercel-api.d.ts +5 -2
  69. package/dist/lib/inspect/vercel-api.d.ts.map +1 -1
  70. package/dist/lib/inspect/vercel-api.js +12 -37
  71. package/dist/lib/inspect/vercel-api.test.d.ts +2 -0
  72. package/dist/lib/inspect/vercel-api.test.d.ts.map +1 -0
  73. package/dist/lib/inspect/vercel-api.test.js +21 -0
  74. package/dist/lib/inspect/vercel-link.js +1 -1
  75. package/dist/lib/inspect/web.d.ts +24 -0
  76. package/dist/lib/inspect/web.d.ts.map +1 -1
  77. package/dist/lib/inspect/web.js +122 -3
  78. package/dist/lib/update-check.js +1 -1
  79. package/package.json +15 -14
  80. package/dist/base.js.map +0 -1
  81. package/dist/commands/build.js.map +0 -1
  82. package/dist/commands/cancel.js.map +0 -1
  83. package/dist/commands/dev.js.map +0 -1
  84. package/dist/commands/health.js.map +0 -1
  85. package/dist/commands/init.js.map +0 -1
  86. package/dist/commands/inspect.js.map +0 -1
  87. package/dist/commands/start.js.map +0 -1
  88. package/dist/commands/transform.js.map +0 -1
  89. package/dist/commands/validate.js.map +0 -1
  90. package/dist/commands/web.js.map +0 -1
  91. package/dist/lib/config/log.js.map +0 -1
  92. package/dist/lib/config/types.js.map +0 -1
  93. package/dist/lib/config/workflow-config.js.map +0 -1
  94. package/dist/lib/inspect/auth.js.map +0 -1
  95. package/dist/lib/inspect/env.js.map +0 -1
  96. package/dist/lib/inspect/flags.js.map +0 -1
  97. package/dist/lib/inspect/hydration.js.map +0 -1
  98. package/dist/lib/inspect/output.js.map +0 -1
  99. package/dist/lib/inspect/output.test.js.map +0 -1
  100. package/dist/lib/inspect/pagination.js.map +0 -1
  101. package/dist/lib/inspect/run.js.map +0 -1
  102. package/dist/lib/inspect/setup.js.map +0 -1
  103. package/dist/lib/inspect/stream.js.map +0 -1
  104. package/dist/lib/inspect/terminal-utils.js.map +0 -1
  105. package/dist/lib/inspect/vercel-api.js.map +0 -1
  106. package/dist/lib/inspect/vercel-link.js.map +0 -1
  107. package/dist/lib/inspect/web.js.map +0 -1
  108. package/dist/lib/update-check.js.map +0 -1
@@ -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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAO1C,MAAM,eAAe,GAAG,KAAK,EAAE,KAAY,EAAE,WAAmB,EAAE,EAAE;IAClE,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,OAAO,WAAW,YAAY,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,GAAG,CAAC,YAAY,CAAC;IAC1B,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,KAAY,EACZ,mBAA2B,EAC3B,IAAmB,EACnB,IAAc,EACd,EAAE;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,6BAA6B,GAAG,cAAc,KAAK,EAAE,CAAC,CAAC;YACnE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,GAA4B,CAAC;IACjC,sDAAsD;IACtD,IAAI,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,oEAAoE;QACpE,4BAA4B;QAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACpC,YAAY,EAAE,mBAAmB;YACjC,UAAU,EAAE;gBACV,SAAS,EAAE,MAAM;gBACjB,KAAK,EAAE,CAAC;aACT;SACF,CAAC,CAAC;QACH,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,QAAQ,mBAAmB,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IAErE,oEAAoE;IACpE,oEAAoE;IACpE,gEAAgE;IAChE,sDAAsD;IACtD,IAAI,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE;YAC9C,YAAY;YACZ,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YACzC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE;QACnD,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC","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":"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","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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,YAAY;AACZ,MAAM,YAAY,GAAG,eAAe,CAAC;AACrC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAClD,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAC5D,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,4BAA4B,GAAG,oBAAoB,CAAC;AAE1D,iDAAiD;AACjD,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;IACrC,OACE,WACD,CAAC,GAAG,CAAC,CAAC;AACT,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;AACrD,CAAC;AAcD;;;GAGG;AACH,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE;QACjC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CACxB,IAAwB,EACxB,IAAwB,EAChB,EAAE;QACV,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB;QACnD,IAAI,CAAC,IAAI,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,6BAA6B;QAC1D,IAAI,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,6BAA6B;QAC3D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QAEnE,+CAA+C;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAErB,mDAAmD;YACnD,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC,CAAC;YAChC,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC;YAE/B,iDAAiD;YACjD,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAEhD,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;gBACrB,yCAAyC;gBACzC,IAAI,IAAI,GAAG,IAAI;oBAAE,OAAO,CAAC,CAAC;gBAC1B,IAAI,IAAI,GAAG,IAAI;oBAAE,OAAO,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,mDAAmD;gBACnD,IAAI,EAAE,GAAG,EAAE;oBAAE,OAAO,CAAC,CAAC;gBACtB,IAAI,EAAE,GAAG,EAAE;oBAAE,OAAO,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC,CAAC,QAAQ;IACpB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAEjC,8BAA8B;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC1D,CAAC;IAED,4DAA4D;IAC5D,sDAAsD;IACtD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC9E,OAAO,SAAS,GAAG,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAE3E,MAAM,GAAG,GAAG,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;aAC3B;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CACV,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC1E,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,YAAY,cAAc,aAAa,aAAa,EAAE,CAAC,CAAC;QACrE,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,cAAsB;IAEtB,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAE/D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,cAAc;YACd,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,MAAM,eAAe,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,WAAW,GACf,CAAC,CAAC,eAAe,IAAI,kBAAkB,CAAC;QACxC,eAAe,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAEjD,OAAO;QACL,cAAc;QACd,aAAa;QACb,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,SAAiB;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,SAAiB,EACjB,IAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,SAAiB,EACjB,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,sCAAsC;QACtC,IAAI,MAAM,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,gCAAgC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,MAAM,OAAO,GAAG,GAAG,GAAG,iBAAiB,CAAC;QAExC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CACV,uBAAuB,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,WAAW,CAC9D,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,cAAsB;IAEtB,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACnE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,SAAS,GAAG,wBAAwB,EAAE,CAAC;IAE7C,0BAA0B;IAC1B,IAAI,MAAM,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,+DAA+D;YAC/D,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,kBAAkB,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9D,OAAO;gBACL,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,WAAW,EACT,CAAC,CAAC,eAAe,IAAI,kBAAkB,CAAC;oBACxC,eAAe,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,cAAc,CAAC;aAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;IAEpD,8CAA8C;IAC9C,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,MAAM,UAAU,CAAC,SAAS,EAAE;YAC1B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport XDGAppPaths from 'xdg-app-paths';\nimport { logger } from './config/log.js';\n\n// Constants\nconst PACKAGE_NAME = '@workflow/cli';\nconst NPM_REGISTRY = 'https://registry.npmjs.org';\nconst CACHE_DURATION_MS = 3 * 24 * 60 * 60 * 1000; // 3 days\nconst REQUEST_TIMEOUT_MS = 5000;\nconst VERSION_CHECK_CACHE_FILENAME = 'version-check.json';\n\n// Get XDG-compliant cache directory for workflow\nconst getXDGAppPaths = (app: string) => {\n return (\n XDGAppPaths as unknown as (app: string) => { dataDirs: () => string[] }\n )(app);\n};\n\n/**\n * Get the cache file path for version checks.\n */\nexport function getVersionCheckCacheFile(): string {\n const dirs = getXDGAppPaths('workflow').dataDirs();\n return join(dirs[0], VERSION_CHECK_CACHE_FILENAME);\n}\n\ninterface VersionCheckResult {\n currentVersion: string;\n latestVersion?: string;\n needsUpdate: boolean;\n}\n\ninterface CachedVersionData {\n currentVersion: string;\n latestVersion: string;\n timestamp: number;\n}\n\n/**\n * Compare two semver versions including pre-release tags\n * Returns true if version a is greater than version b\n */\nfunction compareVersions(a: string, b: string): boolean {\n const parseVersion = (v: string) => {\n const [base, prerelease] = v.split('-');\n const parts = base.split('.').map(Number);\n return { parts, prerelease };\n };\n\n const comparePrerelease = (\n pre1: string | undefined,\n pre2: string | undefined\n ): number => {\n if (!pre1 && !pre2) return 0; // both no prerelease\n if (!pre1 && pre2) return 1; // no prerelease > prerelease\n if (pre1 && !pre2) return -1; // prerelease < no prerelease\n if (typeof pre1 !== 'string' || typeof pre2 !== 'string') return 0;\n\n // Both have prerelease - compare them properly\n const parts1 = pre1.split('.');\n const parts2 = pre2.split('.');\n\n for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n const p1 = parts1[i];\n const p2 = parts2[i];\n\n // If one side is missing, it's less than the other\n if (p1 === undefined) return -1;\n if (p2 === undefined) return 1;\n\n // Try to parse as numbers for numeric comparison\n const num1 = Number(p1);\n const num2 = Number(p2);\n const isNum1 = !Number.isNaN(num1) && p1 !== '';\n const isNum2 = !Number.isNaN(num2) && p2 !== '';\n\n if (isNum1 && isNum2) {\n // Both are numbers - compare numerically\n if (num1 > num2) return 1;\n if (num1 < num2) return -1;\n } else {\n // At least one is non-numeric - compare as strings\n if (p1 > p2) return 1;\n if (p1 < p2) return -1;\n }\n }\n\n return 0; // equal\n };\n\n const versionA = parseVersion(a);\n const versionB = parseVersion(b);\n\n // Compare major, minor, patch\n for (let i = 0; i < 3; i++) {\n if (versionA.parts[i] > versionB.parts[i]) return true;\n if (versionA.parts[i] < versionB.parts[i]) return false;\n }\n\n // If versions are equal up to patch level, check prerelease\n // No prerelease is considered greater than prerelease\n const preResult = comparePrerelease(versionA.prerelease, versionB.prerelease);\n return preResult > 0;\n}\n\n/**\n * Fetch the latest version from npm registry\n */\nasync function fetchLatestVersion(\n currentVersion: string\n): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n const url = `${NPM_REGISTRY}/${PACKAGE_NAME}`;\n logger.debug(`Checking for updates at ${url}`);\n\n const response = await fetch(url, {\n headers: {\n Accept: 'application/json',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n logger.debug(\n `Failed to fetch package info: ${response.status} ${response.statusText}`\n );\n return null;\n }\n\n const data = (await response.json()) as {\n 'dist-tags': { [tag: string]: string };\n };\n\n const latestVersion = data['dist-tags']['latest'];\n if (!latestVersion) {\n logger.debug('No latest version found in registry');\n return null;\n }\n\n logger.debug(`Current: ${currentVersion}, Latest: ${latestVersion}`);\n return latestVersion;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n logger.debug('Version check timed out after 5 seconds');\n } else {\n logger.debug(`Error fetching version: ${error}`);\n }\n return null;\n }\n}\n\n/**\n * Check if there's a new version available\n * Returns the current and latest version if an update is available\n */\nexport async function checkForUpdate(\n currentVersion: string\n): Promise<VersionCheckResult> {\n const latestVersion = await fetchLatestVersion(currentVersion);\n\n if (!latestVersion) {\n return {\n currentVersion,\n needsUpdate: false,\n };\n }\n\n // Don't suggest prerelease updates to users on stable versions\n const currentIsStable = !currentVersion.includes('-');\n const latestIsPrerelease = latestVersion.includes('-');\n const needsUpdate =\n !(currentIsStable && latestIsPrerelease) &&\n compareVersions(latestVersion, currentVersion);\n\n return {\n currentVersion,\n latestVersion,\n needsUpdate,\n };\n}\n\n/**\n * Read cached version data from file\n */\nasync function readCache(cacheFile: string): Promise<CachedVersionData | null> {\n try {\n const content = await readFile(cacheFile, 'utf-8');\n const data = JSON.parse(content) as CachedVersionData;\n return data;\n } catch {\n return null;\n }\n}\n\n/**\n * Write version data to cache file\n */\nasync function writeCache(\n cacheFile: string,\n data: CachedVersionData\n): Promise<void> {\n try {\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(data, null, 2));\n } catch (error) {\n logger.debug(`Failed to write version cache: ${error}`);\n }\n}\n\n/**\n * Check if cache is still valid\n */\nasync function isCacheValid(\n cacheFile: string,\n currentVersion: string\n): Promise<boolean> {\n try {\n const cached = await readCache(cacheFile);\n if (!cached) return false;\n\n // Cache is invalid if version changed\n if (cached.currentVersion !== currentVersion) {\n logger.debug('Version changed, cache invalidated');\n return false;\n }\n\n // Check if cache is still fresh\n const now = Date.now();\n const age = now - cached.timestamp;\n const isValid = age < CACHE_DURATION_MS;\n\n if (!isValid) {\n logger.debug(\n `Cache expired (age: ${Math.floor(age / 1000 / 60)} minutes)`\n );\n }\n\n return isValid;\n } catch {\n return false;\n }\n}\n\n/**\n * Check for updates with filesystem caching\n * Cache is valid unless the local version changes\n *\n * Set WORKFLOW_NO_UPDATE_CHECK=1 to skip the update check entirely.\n */\nexport async function checkForUpdateCached(\n currentVersion: string\n): Promise<VersionCheckResult> {\n if (process.env.WORKFLOW_NO_UPDATE_CHECK === '1') {\n logger.debug('Skipping update check (WORKFLOW_NO_UPDATE_CHECK=1)');\n return { currentVersion, needsUpdate: false };\n }\n\n const cacheFile = getVersionCheckCacheFile();\n\n // Check if cache is valid\n if (await isCacheValid(cacheFile, currentVersion)) {\n logger.debug('Using cached version check result');\n const cached = await readCache(cacheFile);\n if (cached) {\n // Don't suggest prerelease updates to users on stable versions\n const currentIsStable = !cached.currentVersion.includes('-');\n const latestIsPrerelease = cached.latestVersion.includes('-');\n return {\n currentVersion: cached.currentVersion,\n latestVersion: cached.latestVersion,\n needsUpdate:\n !(currentIsStable && latestIsPrerelease) &&\n compareVersions(cached.latestVersion, cached.currentVersion),\n };\n }\n }\n\n // Perform fresh check\n logger.debug('Performing fresh version check');\n const result = await checkForUpdate(currentVersion);\n\n // Cache the result if we got a latest version\n if (result.latestVersion) {\n await writeCache(cacheFile, {\n currentVersion: result.currentVersion,\n latestVersion: result.latestVersion,\n timestamp: Date.now(),\n });\n }\n\n return result;\n}\n"]}