@workflow/cli 5.0.0-beta.7 → 5.0.0-beta.8

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 (59) hide show
  1. package/dist/base.js +1 -1
  2. package/dist/commands/build.js +1 -1
  3. package/dist/commands/cancel.js +1 -1
  4. package/dist/commands/dev.js +1 -1
  5. package/dist/commands/health.js +1 -1
  6. package/dist/commands/init.js +1 -1
  7. package/dist/commands/inspect.js +1 -1
  8. package/dist/commands/start.js +1 -1
  9. package/dist/commands/transform.js +1 -1
  10. package/dist/commands/validate.js +1 -1
  11. package/dist/commands/web.js +1 -1
  12. package/dist/lib/config/log.js +1 -1
  13. package/dist/lib/config/types.js +1 -1
  14. package/dist/lib/config/workflow-config.js +1 -1
  15. package/dist/lib/inspect/auth.js +1 -1
  16. package/dist/lib/inspect/env.js +1 -1
  17. package/dist/lib/inspect/flags.js +1 -1
  18. package/dist/lib/inspect/hydration.js +1 -1
  19. package/dist/lib/inspect/output.js +1 -1
  20. package/dist/lib/inspect/output.test.js +1 -1
  21. package/dist/lib/inspect/pagination.js +1 -1
  22. package/dist/lib/inspect/run.js +1 -1
  23. package/dist/lib/inspect/setup.js +1 -1
  24. package/dist/lib/inspect/stream.js +1 -1
  25. package/dist/lib/inspect/terminal-utils.js +1 -1
  26. package/dist/lib/inspect/vercel-api.js +1 -1
  27. package/dist/lib/inspect/vercel-link.js +1 -1
  28. package/dist/lib/inspect/web.js +1 -1
  29. package/dist/lib/update-check.js +1 -1
  30. package/package.json +9 -9
  31. package/dist/base.js.map +0 -1
  32. package/dist/commands/build.js.map +0 -1
  33. package/dist/commands/cancel.js.map +0 -1
  34. package/dist/commands/dev.js.map +0 -1
  35. package/dist/commands/health.js.map +0 -1
  36. package/dist/commands/init.js.map +0 -1
  37. package/dist/commands/inspect.js.map +0 -1
  38. package/dist/commands/start.js.map +0 -1
  39. package/dist/commands/transform.js.map +0 -1
  40. package/dist/commands/validate.js.map +0 -1
  41. package/dist/commands/web.js.map +0 -1
  42. package/dist/lib/config/log.js.map +0 -1
  43. package/dist/lib/config/types.js.map +0 -1
  44. package/dist/lib/config/workflow-config.js.map +0 -1
  45. package/dist/lib/inspect/auth.js.map +0 -1
  46. package/dist/lib/inspect/env.js.map +0 -1
  47. package/dist/lib/inspect/flags.js.map +0 -1
  48. package/dist/lib/inspect/hydration.js.map +0 -1
  49. package/dist/lib/inspect/output.js.map +0 -1
  50. package/dist/lib/inspect/output.test.js.map +0 -1
  51. package/dist/lib/inspect/pagination.js.map +0 -1
  52. package/dist/lib/inspect/run.js.map +0 -1
  53. package/dist/lib/inspect/setup.js.map +0 -1
  54. package/dist/lib/inspect/stream.js.map +0 -1
  55. package/dist/lib/inspect/terminal-utils.js.map +0 -1
  56. package/dist/lib/inspect/vercel-api.js.map +0 -1
  57. package/dist/lib/inspect/vercel-link.js.map +0 -1
  58. package/dist/lib/inspect/web.js.map +0 -1
  59. package/dist/lib/update-check.js.map +0 -1
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,OAAO,GAAG,CAAC,YAAkC,EAAE,EAAe,EAAE,CACpE,CAAC;IACC,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,OAAO;IACrB,YAAY,EAAE,4CAA4C;IAC1D,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACjC,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACjC,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,CAAC;IACd,gBAAgB,EAAE,EAAE;IACpB,GAAG,SAAS;CACb,CAA2B,CAAC;AAE/B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","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":"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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":"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","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":"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","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"]}