tubeless 0.2.13 → 0.2.14

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 (125) hide show
  1. package/dist/cli/cli-pipeline-command.d.ts +7 -2
  2. package/dist/cli/cli-pipeline-command.js +24 -3
  3. package/dist/cli/cli-pipeline-command.js.map +1 -1
  4. package/dist/core/child-execution.js +5 -3
  5. package/dist/core/child-execution.js.map +1 -1
  6. package/dist/core/child-progress.js +2 -0
  7. package/dist/core/child-progress.js.map +1 -1
  8. package/dist/core/pipeline-cache.d.ts +68 -0
  9. package/dist/core/pipeline-cache.js +157 -0
  10. package/dist/core/pipeline-cache.js.map +1 -0
  11. package/dist/core/pipeline-compiler.js +4 -2
  12. package/dist/core/pipeline-compiler.js.map +1 -1
  13. package/dist/core/pipeline-definition-identity.d.ts +3 -1
  14. package/dist/core/pipeline-definition-identity.js +38 -5
  15. package/dist/core/pipeline-definition-identity.js.map +1 -1
  16. package/dist/core/pipeline-definition-validation.d.ts +7 -2
  17. package/dist/core/pipeline-definition-validation.js +22 -2
  18. package/dist/core/pipeline-definition-validation.js.map +1 -1
  19. package/dist/core/pipeline-definition.d.ts +6 -0
  20. package/dist/core/pipeline-definition.js.map +1 -1
  21. package/dist/core/pipeline-execute.js +5 -0
  22. package/dist/core/pipeline-execute.js.map +1 -1
  23. package/dist/core/pipeline-graph.d.ts +2 -1
  24. package/dist/core/pipeline-graph.js +10 -4
  25. package/dist/core/pipeline-graph.js.map +1 -1
  26. package/dist/core/pipeline-mermaid.js +7 -1
  27. package/dist/core/pipeline-mermaid.js.map +1 -1
  28. package/dist/core/pipeline-plan.js +4 -0
  29. package/dist/core/pipeline-plan.js.map +1 -1
  30. package/dist/core/pipeline-query.d.ts +11 -0
  31. package/dist/core/pipeline-query.js +10 -0
  32. package/dist/core/pipeline-query.js.map +1 -0
  33. package/dist/core/pipeline-run-state.d.ts +2 -2
  34. package/dist/core/pipeline-run-state.js.map +1 -1
  35. package/dist/core/pipeline-step-executor.d.ts +2 -0
  36. package/dist/core/pipeline-step-executor.js +24 -9
  37. package/dist/core/pipeline-step-executor.js.map +1 -1
  38. package/dist/core/pipeline-step-metadata.d.ts +1 -0
  39. package/dist/core/pipeline-step-metadata.js +1 -0
  40. package/dist/core/pipeline-step-metadata.js.map +1 -1
  41. package/dist/core/pipeline-steps.d.ts +17 -3
  42. package/dist/core/pipeline-steps.js +11 -3
  43. package/dist/core/pipeline-steps.js.map +1 -1
  44. package/dist/core/pipeline-types.d.ts +20 -7
  45. package/dist/core/pipeline-types.js.map +1 -1
  46. package/dist/core/pipeline.d.ts +4 -0
  47. package/dist/core/pipeline.js +7 -1
  48. package/dist/core/pipeline.js.map +1 -1
  49. package/dist/node/node.d.ts +1 -0
  50. package/dist/node/node.js +1 -0
  51. package/dist/node/node.js.map +1 -1
  52. package/dist/reporter/interactive-reporter.js +3 -4
  53. package/dist/reporter/interactive-reporter.js.map +1 -1
  54. package/dist/reporter/reporter.d.ts +1 -0
  55. package/dist/reporter/reporter.js +4 -2
  56. package/dist/reporter/reporter.js.map +1 -1
  57. package/dist/run-store/cache-artifact.d.ts +7 -0
  58. package/dist/run-store/cache-artifact.js +22 -0
  59. package/dist/run-store/cache-artifact.js.map +1 -0
  60. package/dist/run-store/definition-diff.js +20 -8
  61. package/dist/run-store/definition-diff.js.map +1 -1
  62. package/dist/run-store/run-projection.js +2 -2
  63. package/dist/run-store/run-projection.js.map +1 -1
  64. package/dist/run-store/run-store.d.ts +2 -2
  65. package/dist/run-store/run-store.js.map +1 -1
  66. package/dist/studio/run-store-ui-artifacts.d.ts +5 -0
  67. package/dist/studio/run-store-ui-artifacts.js +18 -0
  68. package/dist/studio/run-store-ui-artifacts.js.map +1 -0
  69. package/dist/studio/run-store-ui-client-browser.js +2 -2
  70. package/dist/studio/run-store-ui-client-transport.js +9 -3
  71. package/dist/studio/run-store-ui-client-transport.js.map +1 -1
  72. package/dist/studio/run-store-ui-client.d.ts +2 -2
  73. package/dist/studio/run-store-ui-client.js +13 -7
  74. package/dist/studio/run-store-ui-client.js.map +1 -1
  75. package/dist/studio/run-store-ui-definitions.js +2 -1
  76. package/dist/studio/run-store-ui-definitions.js.map +1 -1
  77. package/dist/studio/run-store-ui-metadata.d.ts +13 -0
  78. package/dist/studio/run-store-ui-metadata.js +32 -0
  79. package/dist/studio/run-store-ui-metadata.js.map +1 -0
  80. package/dist/studio/run-store-ui-page.js +8 -0
  81. package/dist/studio/run-store-ui-page.js.map +1 -1
  82. package/dist/tracing/artifact-metadata.d.ts +1 -0
  83. package/dist/tracing/artifact-metadata.js +2 -2
  84. package/dist/tracing/artifact-metadata.js.map +1 -1
  85. package/dist/tracing/graph-metadata.d.ts +12 -0
  86. package/dist/tracing/graph-metadata.js +55 -0
  87. package/dist/tracing/graph-metadata.js.map +1 -0
  88. package/dist/tracing/tracing-internal.js +2 -2
  89. package/dist/tracing/tracing-internal.js.map +1 -1
  90. package/dist/tracing/tracing-schema.d.ts +58 -31
  91. package/dist/tracing/tracing-schema.js +26 -8
  92. package/dist/tracing/tracing-schema.js.map +1 -1
  93. package/dist/utilities/cache-duration.d.ts +2 -0
  94. package/dist/utilities/cache-duration.js +39 -0
  95. package/dist/utilities/cache-duration.js.map +1 -0
  96. package/dist/utilities/cache-key.d.ts +2 -0
  97. package/dist/utilities/cache-key.js +63 -0
  98. package/dist/utilities/cache-key.js.map +1 -0
  99. package/dist/utilities/cache-storage.d.ts +6 -0
  100. package/dist/utilities/cache-storage.js +83 -0
  101. package/dist/utilities/cache-storage.js.map +1 -0
  102. package/dist/utilities/canonical-json.d.ts +2 -0
  103. package/dist/utilities/canonical-json.js +12 -0
  104. package/dist/utilities/canonical-json.js.map +1 -0
  105. package/dist/workbench/workbench-commands.js +43 -3
  106. package/dist/workbench/workbench-commands.js.map +1 -1
  107. package/dist/workbench/workbench-history.js +2 -1
  108. package/dist/workbench/workbench-history.js.map +1 -1
  109. package/docs/agent-guide.md +23 -0
  110. package/docs/api-reference.md +98 -85
  111. package/docs/api-report.json +19 -6
  112. package/docs/artifacts.md +6 -2
  113. package/docs/cli.md +14 -0
  114. package/docs/concepts.md +10 -0
  115. package/docs/declarative-pipelines.md +4 -0
  116. package/docs/graph-metadata.md +108 -0
  117. package/docs/llms.txt +2 -0
  118. package/docs/recipes.md +5 -0
  119. package/docs/step-output-cache.md +242 -0
  120. package/docs/studio.md +11 -2
  121. package/examples/graph-metadata.ts +32 -0
  122. package/examples/project/tubeless.project.ts +5 -0
  123. package/examples/step-output-cache.ts +30 -0
  124. package/package.json +1 -1
  125. package/skills/tubeless/SKILL.md +16 -0
@@ -30,7 +30,9 @@ function isStoredStep(value) {
30
30
  if (!isRecord(value))
31
31
  return false;
32
32
  if (typeof value.id !== "string" ||
33
- (value.outputSource !== undefined && value.outputSource !== "override") ||
33
+ (value.outputSource !== undefined &&
34
+ value.outputSource !== "override" &&
35
+ value.outputSource !== "cache") ||
34
36
  !["cancelled", "completed", "failed", "planned", "running", "skipped"].includes(String(value.status)) ||
35
37
  !isOptionalString(value.description) ||
36
38
  !isOptionalString(value.name) ||
@@ -47,7 +49,9 @@ function isStoredStep(value) {
47
49
  !Array.isArray(value.attempt.retries) ||
48
50
  !value.attempt.retries.every(isFiniteNumber) ||
49
51
  !isFiniteNumber(value.attempt.startedAtMs) ||
50
- (value.attempt.outputSource !== undefined && value.attempt.outputSource !== "override") ||
52
+ (value.attempt.outputSource !== undefined &&
53
+ value.attempt.outputSource !== "override" &&
54
+ value.attempt.outputSource !== "cache") ||
51
55
  !["cancelled", "completed", "failed", "running", "skipped"].includes(String(value.attempt.status))) {
52
56
  return false;
53
57
  }
@@ -74,7 +78,9 @@ function isStoredStep(value) {
74
78
  typeof detail.id === "string" &&
75
79
  isOptionalString(detail.label) &&
76
80
  isOptionalString(detail.status) &&
77
- (detail.outputSource === undefined || detail.outputSource === "override")))) {
81
+ (detail.outputSource === undefined ||
82
+ detail.outputSource === "override" ||
83
+ detail.outputSource === "cache")))) {
78
84
  return false;
79
85
  }
80
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-store-ui-client-transport.js","sourceRoot":"","sources":["../../src/studio/run-store-ui-client-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { isArtifactRecord } from \"../run-store/run-store-codec.js\";\nimport type { PipelinePlan, PipelineRunControls } from \"../core/pipeline.js\";\nimport type {\n PipelineRunStoreSnapshot,\n StoredPipelineLog,\n StoredPipelineRun,\n StoredPipelineStep,\n} from \"../run-store/run-store.js\";\nimport {\n isDefinitionIdentity,\n isDefinitionSnapshot,\n isPipelineTraceError,\n} from \"../run-store/run-store-codec.js\";\nimport {\n isPipelineRunStudioParameter,\n type PipelineRunStudioCommand,\n type PipelineRunStudioLaunchRequest,\n} from \"./run-store-ui-protocol.js\";\n\nexport interface StudioSnapshot extends PipelineRunStoreSnapshot {\n liveRunIds?: readonly string[];\n}\n\nexport interface StudioRunDetail {\n run: StoredPipelineRun;\n}\n\ninterface StudioCapabilities {\n canCancel: boolean;\n canClearHistory: boolean;\n}\n\ninterface StudioClearResult {\n eventCount: number;\n}\n\nexport interface StudioApi {\n cancelRun(runId: string): Promise<void>;\n clearHistory(): Promise<StudioClearResult>;\n loadCapabilities(): Promise<StudioCapabilities>;\n loadCommands(): Promise<PipelineRunStudioCommand[]>;\n loadRunDetail(runId: string): Promise<StudioRunDetail | null>;\n loadSnapshot(): Promise<StudioSnapshot>;\n launch(commandId: string, values: PipelineRunStudioLaunchRequest[\"values\"]): Promise<string>;\n previewPlan(commandId: string, input: PipelineRunControls): Promise<PipelinePlan>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isOptionalString(value: unknown): value is string | undefined {\n return value === undefined || typeof value === \"string\";\n}\n\nfunction isOptionalFiniteNumber(value: unknown): value is number | undefined {\n return value === undefined || isFiniteNumber(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isStoredLog(value: unknown): value is StoredPipelineLog {\n if (!isRecord(value)) return false;\n return (\n isFiniteNumber(value.id) &&\n (value.level === \"error\" || value.level === \"log\" || value.level === \"warn\") &&\n typeof value.message === \"string\" &&\n isFiniteNumber(value.timestampMs) &&\n isOptionalString(value.attemptId) &&\n isOptionalString(value.stepId)\n );\n}\n\nfunction isStoredStep(value: unknown): value is StoredPipelineStep {\n if (!isRecord(value)) return false;\n if (\n typeof value.id !== \"string\" ||\n (value.outputSource !== undefined && value.outputSource !== \"override\") ||\n ![\"cancelled\", \"completed\", \"failed\", \"planned\", \"running\", \"skipped\"].includes(\n String(value.status)\n ) ||\n !isOptionalString(value.description) ||\n !isOptionalString(value.name) ||\n !isOptionalFiniteNumber(value.durationMs) ||\n !isOptionalFiniteNumber(value.finishedAtMs) ||\n !isOptionalFiniteNumber(value.startedAtMs)\n ) {\n return false;\n }\n if (value.attempt !== undefined) {\n if (\n !isRecord(value.attempt) ||\n typeof value.attempt.attemptId !== \"string\" ||\n !isOptionalFiniteNumber(value.attempt.durationMs) ||\n !isOptionalFiniteNumber(value.attempt.finishedAtMs) ||\n !Array.isArray(value.attempt.retries) ||\n !value.attempt.retries.every(isFiniteNumber) ||\n !isFiniteNumber(value.attempt.startedAtMs) ||\n (value.attempt.outputSource !== undefined && value.attempt.outputSource !== \"override\") ||\n ![\"cancelled\", \"completed\", \"failed\", \"running\", \"skipped\"].includes(\n String(value.attempt.status)\n )\n ) {\n return false;\n }\n }\n if (\n value.artifacts !== undefined &&\n (!Array.isArray(value.artifacts) ||\n !value.artifacts.every(\n (entry) =>\n isRecord(entry) &&\n typeof entry.attemptId === \"string\" &&\n isFiniteNumber(entry.timestampMs) &&\n typeof entry.preview === \"boolean\" &&\n isArtifactRecord(entry)\n ))\n )\n return false;\n if (value.progress !== undefined) {\n if (!isRecord(value.progress) || !isFiniteNumber(value.progress.completed)) return false;\n if (\n !isOptionalFiniteNumber(value.progress.detailCount) ||\n !isOptionalString(value.progress.message) ||\n !isOptionalFiniteNumber(value.progress.total)\n ) {\n return false;\n }\n if (\n value.progress.details !== undefined &&\n (!Array.isArray(value.progress.details) ||\n !value.progress.details.every(\n (detail) =>\n isRecord(detail) &&\n typeof detail.id === \"string\" &&\n isOptionalString(detail.label) &&\n isOptionalString(detail.status) &&\n (detail.outputSource === undefined || detail.outputSource === \"override\")\n ))\n ) {\n return false;\n }\n }\n if (value.nestedPipeline !== undefined) {\n if (\n !isRecord(value.nestedPipeline) ||\n ![\"single\", \"for-each\", \"iterate\"].includes(String(value.nestedPipeline.mode)) ||\n (value.nestedPipeline.mode === \"iterate\" &&\n (!Number.isSafeInteger(value.nestedPipeline.maxIterations) ||\n Number(value.nestedPipeline.maxIterations) < 1)) ||\n typeof value.nestedPipeline.pipelineId !== \"string\" ||\n !isFiniteNumber(value.nestedPipeline.stepCount) ||\n !isStringArray(value.nestedPipeline.stepIds)\n ) {\n return false;\n }\n }\n if (value.remote !== undefined) {\n if (\n !isRecord(value.remote) ||\n typeof value.remote.engine !== \"string\" ||\n !isOptionalString(value.remote.target)\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction isStoredStudioRun(value: unknown): value is StoredPipelineRun {\n if (!isRecord(value)) return false;\n return (\n (value.definitionIdentity === undefined || isDefinitionIdentity(value.definitionIdentity)) &&\n typeof value.dryRun === \"boolean\" &&\n isFiniteNumber(value.eventCount) &&\n isFiniteNumber(value.logCount) &&\n Array.isArray(value.logs) &&\n value.logs.every(isStoredLog) &&\n typeof value.pipelineId === \"string\" &&\n typeof value.runId === \"string\" &&\n isFiniteNumber(value.startedAtMs) &&\n isOptionalFiniteNumber(value.durationMs) &&\n isOptionalFiniteNumber(value.finishedAtMs) &&\n [\"cancelled\", \"completed\", \"failed\", \"running\"].includes(String(value.status)) &&\n Array.isArray(value.steps) &&\n value.steps.every(isStoredStep) &&\n isFiniteNumber(value.version) &&\n isOptionalString(value.correlationId) &&\n isOptionalString(value.parentRunId) &&\n (value.iteration === undefined ||\n (isRecord(value.iteration) &&\n typeof value.iteration.runId === \"string\" &&\n typeof value.iteration.stepId === \"string\" &&\n typeof value.iteration.attemptId === \"string\" &&\n Number.isSafeInteger(value.iteration.index) &&\n Number(value.iteration.index) > 0)) &&\n (value.error === undefined || isPipelineTraceError(value.error))\n );\n}\n\nfunction isStudioSnapshot(value: unknown): value is StudioSnapshot {\n if (!isRecord(value)) return false;\n if (\n !isFiniteNumber(value.activeRunCount) ||\n !isFiniteNumber(value.completedRunCount) ||\n !Array.isArray(value.definitions) ||\n !value.definitions.every(\n (definition) =>\n isRecord(definition) &&\n typeof definition.pipelineId === \"string\" &&\n isFiniteNumber(definition.runCount) &&\n (definition.identity === undefined || isDefinitionIdentity(definition.identity)) &&\n (definition.snapshot === undefined || isDefinitionSnapshot(definition.snapshot))\n ) ||\n !isFiniteNumber(value.failedRunCount) ||\n !isFiniteNumber(value.generatedAtMs) ||\n !isFiniteNumber(value.lastEventId) ||\n !Array.isArray(value.runs) ||\n !value.runs.every(isStoredStudioRun) ||\n (value.liveRunIds !== undefined && !isStringArray(value.liveRunIds))\n ) {\n return false;\n }\n return true;\n}\n\nexport function parseStudioSnapshot(value: unknown): StudioSnapshot | undefined {\n return isStudioSnapshot(value) ? value : undefined;\n}\n\nfunction isStudioCommand(value: unknown): value is PipelineRunStudioCommand {\n return (\n isRecord(value) &&\n typeof value.canPlan === \"boolean\" &&\n typeof value.id === \"string\" &&\n typeof value.name === \"string\" &&\n isOptionalString(value.description) &&\n Array.isArray(value.parameters) &&\n value.parameters.every(isPipelineRunStudioParameter)\n );\n}\n\nexport function parseStudioCommands(value: unknown): PipelineRunStudioCommand[] | undefined {\n if (\n !isRecord(value) ||\n !Array.isArray(value.commands) ||\n !value.commands.every(isStudioCommand)\n ) {\n return undefined;\n }\n return value.commands;\n}\n\nfunction isStudioPlanPayload(value: unknown): value is { plan: PipelinePlan } {\n if (!isRecord(value) || !isRecord(value.plan)) return false;\n const plan = value.plan;\n if (\n typeof plan.dryRun !== \"boolean\" ||\n !Array.isArray(plan.errors) ||\n !plan.errors.every((error) => isRecord(error) && typeof error.message === \"string\") ||\n typeof plan.ok !== \"boolean\" ||\n typeof plan.pipelineId !== \"string\" ||\n !Array.isArray(plan.steps)\n ) {\n return false;\n }\n for (const step of plan.steps) {\n if (\n !isRecord(step) ||\n typeof step.id !== \"string\" ||\n !isStringArray(step.dependencies) ||\n typeof step.selected !== \"boolean\" ||\n !isOptionalString(step.description) ||\n !isOptionalString(step.name)\n ) {\n return false;\n }\n if (\n step.nestedPipeline !== undefined &&\n (!isRecord(step.nestedPipeline) ||\n ![\"single\", \"for-each\", \"iterate\"].includes(String(step.nestedPipeline.mode)) ||\n (step.nestedPipeline.mode === \"iterate\" &&\n (!Number.isSafeInteger(step.nestedPipeline.maxIterations) ||\n Number(step.nestedPipeline.maxIterations) < 1)) ||\n typeof step.nestedPipeline.pipelineId !== \"string\" ||\n !isStringArray(step.nestedPipeline.stepIds))\n ) {\n return false;\n }\n if (\n step.remote !== undefined &&\n (!isRecord(step.remote) ||\n typeof step.remote.engine !== \"string\" ||\n !isOptionalString(step.remote.target))\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction parseStudioPlan(value: unknown): PipelinePlan | undefined {\n return isStudioPlanPayload(value) ? value.plan : undefined;\n}\n\nfunction responseError(value: unknown, fallback: string): Error {\n if (!isRecord(value)) return new Error(fallback);\n if (Array.isArray(value.errors) && value.errors.every((item) => typeof item === \"string\")) {\n return new Error(value.errors.join(\"\\n\"));\n }\n return new Error(typeof value.message === \"string\" ? value.message : fallback);\n}\n\nasync function readJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n throw new Error(\"Studio API returned invalid JSON.\");\n }\n}\n\nfunction invalidResponse(endpoint: string): Error {\n return new Error(`Studio API returned an invalid response for ${endpoint}.`);\n}\n\n/** Same-origin Studio transport. Every successful payload is validated before use. */\nexport function createStudioApi(fetcher: typeof fetch = fetch): StudioApi {\n return {\n async loadSnapshot() {\n const response = await fetcher(\"/api/snapshot\", { cache: \"no-store\" });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Snapshot request failed.\");\n const snapshot = parseStudioSnapshot(payload);\n if (!snapshot) throw invalidResponse(\"snapshot\");\n return snapshot;\n },\n async loadRunDetail(runId) {\n const response = await fetcher(\"/api/runs/\" + encodeURIComponent(runId), {\n cache: \"no-store\",\n });\n const payload = await readJson(response);\n if (response.status === 404) return null;\n if (!response.ok) throw responseError(payload, \"Run detail request failed.\");\n if (!isRecord(payload) || !isStoredStudioRun(payload.run)) {\n throw invalidResponse(\"run detail\");\n }\n return { run: payload.run };\n },\n async loadCommands() {\n const response = await fetcher(\"/api/commands\", { cache: \"no-store\" });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Commands request failed.\");\n const commands = parseStudioCommands(payload);\n if (!commands) throw invalidResponse(\"commands\");\n return commands;\n },\n async loadCapabilities() {\n const response = await fetcher(\"/api/capabilities\", { cache: \"no-store\" });\n const payload = await readJson(response);\n if (\n !response.ok ||\n !isRecord(payload) ||\n typeof payload.canCancel !== \"boolean\" ||\n typeof payload.canClearHistory !== \"boolean\"\n ) {\n if (!response.ok) throw responseError(payload, \"Capabilities request failed.\");\n throw invalidResponse(\"capabilities\");\n }\n return {\n canCancel: payload.canCancel,\n canClearHistory: payload.canClearHistory,\n };\n },\n async clearHistory() {\n const response = await fetcher(\"/api/history\", {\n method: \"DELETE\",\n headers: { \"x-tubeless-studio-clear-history\": \"1\" },\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"History could not be cleared.\");\n if (!isRecord(payload) || payload.cleared !== true || !isFiniteNumber(payload.eventCount)) {\n throw invalidResponse(\"clear history\");\n }\n return { eventCount: payload.eventCount };\n },\n async previewPlan(commandId, input) {\n const response = await fetcher(\"/api/commands/\" + encodeURIComponent(commandId) + \"/plan\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-tubeless-studio-plan\": \"1\" },\n body: JSON.stringify(input),\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Plan request failed.\");\n const plan = parseStudioPlan(payload);\n if (!plan) throw invalidResponse(\"plan\");\n return plan;\n },\n async cancelRun(runId) {\n const response = await fetcher(\"/api/runs/\" + encodeURIComponent(runId) + \"/cancel\", {\n method: \"POST\",\n headers: { \"x-tubeless-studio-cancel\": \"1\" },\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Run could not be cancelled.\");\n if (!isRecord(payload) || payload.cancelled !== true || payload.runId !== runId) {\n throw invalidResponse(\"cancel run\");\n }\n },\n async launch(commandId, values) {\n const response = await fetcher(\"/api/commands/\" + encodeURIComponent(commandId) + \"/runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-tubeless-studio-launch\": \"1\" },\n body: JSON.stringify({ values }),\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Launch failed.\");\n if (\n !isRecord(payload) ||\n payload.accepted !== true ||\n typeof payload.runId !== \"string\" ||\n payload.runId.length === 0\n ) {\n throw invalidResponse(\"launch\");\n }\n return payload.runId;\n },\n };\n}\n"]}
1
+ {"version":3,"file":"run-store-ui-client-transport.js","sourceRoot":"","sources":["../../src/studio/run-store-ui-client-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { isArtifactRecord } from \"../run-store/run-store-codec.js\";\nimport type { PipelinePlan, PipelineRunControls } from \"../core/pipeline.js\";\nimport type {\n PipelineRunStoreSnapshot,\n StoredPipelineLog,\n StoredPipelineRun,\n StoredPipelineStep,\n} from \"../run-store/run-store.js\";\nimport {\n isDefinitionIdentity,\n isDefinitionSnapshot,\n isPipelineTraceError,\n} from \"../run-store/run-store-codec.js\";\nimport {\n isPipelineRunStudioParameter,\n type PipelineRunStudioCommand,\n type PipelineRunStudioLaunchRequest,\n} from \"./run-store-ui-protocol.js\";\n\nexport interface StudioSnapshot extends PipelineRunStoreSnapshot {\n liveRunIds?: readonly string[];\n}\n\nexport interface StudioRunDetail {\n run: StoredPipelineRun;\n}\n\ninterface StudioCapabilities {\n canCancel: boolean;\n canClearHistory: boolean;\n}\n\ninterface StudioClearResult {\n eventCount: number;\n}\n\nexport interface StudioApi {\n cancelRun(runId: string): Promise<void>;\n clearHistory(): Promise<StudioClearResult>;\n loadCapabilities(): Promise<StudioCapabilities>;\n loadCommands(): Promise<PipelineRunStudioCommand[]>;\n loadRunDetail(runId: string): Promise<StudioRunDetail | null>;\n loadSnapshot(): Promise<StudioSnapshot>;\n launch(commandId: string, values: PipelineRunStudioLaunchRequest[\"values\"]): Promise<string>;\n previewPlan(commandId: string, input: PipelineRunControls): Promise<PipelinePlan>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction isOptionalString(value: unknown): value is string | undefined {\n return value === undefined || typeof value === \"string\";\n}\n\nfunction isOptionalFiniteNumber(value: unknown): value is number | undefined {\n return value === undefined || isFiniteNumber(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isStoredLog(value: unknown): value is StoredPipelineLog {\n if (!isRecord(value)) return false;\n return (\n isFiniteNumber(value.id) &&\n (value.level === \"error\" || value.level === \"log\" || value.level === \"warn\") &&\n typeof value.message === \"string\" &&\n isFiniteNumber(value.timestampMs) &&\n isOptionalString(value.attemptId) &&\n isOptionalString(value.stepId)\n );\n}\n\nfunction isStoredStep(value: unknown): value is StoredPipelineStep {\n if (!isRecord(value)) return false;\n if (\n typeof value.id !== \"string\" ||\n (value.outputSource !== undefined &&\n value.outputSource !== \"override\" &&\n value.outputSource !== \"cache\") ||\n ![\"cancelled\", \"completed\", \"failed\", \"planned\", \"running\", \"skipped\"].includes(\n String(value.status)\n ) ||\n !isOptionalString(value.description) ||\n !isOptionalString(value.name) ||\n !isOptionalFiniteNumber(value.durationMs) ||\n !isOptionalFiniteNumber(value.finishedAtMs) ||\n !isOptionalFiniteNumber(value.startedAtMs)\n ) {\n return false;\n }\n if (value.attempt !== undefined) {\n if (\n !isRecord(value.attempt) ||\n typeof value.attempt.attemptId !== \"string\" ||\n !isOptionalFiniteNumber(value.attempt.durationMs) ||\n !isOptionalFiniteNumber(value.attempt.finishedAtMs) ||\n !Array.isArray(value.attempt.retries) ||\n !value.attempt.retries.every(isFiniteNumber) ||\n !isFiniteNumber(value.attempt.startedAtMs) ||\n (value.attempt.outputSource !== undefined &&\n value.attempt.outputSource !== \"override\" &&\n value.attempt.outputSource !== \"cache\") ||\n ![\"cancelled\", \"completed\", \"failed\", \"running\", \"skipped\"].includes(\n String(value.attempt.status)\n )\n ) {\n return false;\n }\n }\n if (\n value.artifacts !== undefined &&\n (!Array.isArray(value.artifacts) ||\n !value.artifacts.every(\n (entry) =>\n isRecord(entry) &&\n typeof entry.attemptId === \"string\" &&\n isFiniteNumber(entry.timestampMs) &&\n typeof entry.preview === \"boolean\" &&\n isArtifactRecord(entry)\n ))\n )\n return false;\n if (value.progress !== undefined) {\n if (!isRecord(value.progress) || !isFiniteNumber(value.progress.completed)) return false;\n if (\n !isOptionalFiniteNumber(value.progress.detailCount) ||\n !isOptionalString(value.progress.message) ||\n !isOptionalFiniteNumber(value.progress.total)\n ) {\n return false;\n }\n if (\n value.progress.details !== undefined &&\n (!Array.isArray(value.progress.details) ||\n !value.progress.details.every(\n (detail) =>\n isRecord(detail) &&\n typeof detail.id === \"string\" &&\n isOptionalString(detail.label) &&\n isOptionalString(detail.status) &&\n (detail.outputSource === undefined ||\n detail.outputSource === \"override\" ||\n detail.outputSource === \"cache\")\n ))\n ) {\n return false;\n }\n }\n if (value.nestedPipeline !== undefined) {\n if (\n !isRecord(value.nestedPipeline) ||\n ![\"single\", \"for-each\", \"iterate\"].includes(String(value.nestedPipeline.mode)) ||\n (value.nestedPipeline.mode === \"iterate\" &&\n (!Number.isSafeInteger(value.nestedPipeline.maxIterations) ||\n Number(value.nestedPipeline.maxIterations) < 1)) ||\n typeof value.nestedPipeline.pipelineId !== \"string\" ||\n !isFiniteNumber(value.nestedPipeline.stepCount) ||\n !isStringArray(value.nestedPipeline.stepIds)\n ) {\n return false;\n }\n }\n if (value.remote !== undefined) {\n if (\n !isRecord(value.remote) ||\n typeof value.remote.engine !== \"string\" ||\n !isOptionalString(value.remote.target)\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction isStoredStudioRun(value: unknown): value is StoredPipelineRun {\n if (!isRecord(value)) return false;\n return (\n (value.definitionIdentity === undefined || isDefinitionIdentity(value.definitionIdentity)) &&\n typeof value.dryRun === \"boolean\" &&\n isFiniteNumber(value.eventCount) &&\n isFiniteNumber(value.logCount) &&\n Array.isArray(value.logs) &&\n value.logs.every(isStoredLog) &&\n typeof value.pipelineId === \"string\" &&\n typeof value.runId === \"string\" &&\n isFiniteNumber(value.startedAtMs) &&\n isOptionalFiniteNumber(value.durationMs) &&\n isOptionalFiniteNumber(value.finishedAtMs) &&\n [\"cancelled\", \"completed\", \"failed\", \"running\"].includes(String(value.status)) &&\n Array.isArray(value.steps) &&\n value.steps.every(isStoredStep) &&\n isFiniteNumber(value.version) &&\n isOptionalString(value.correlationId) &&\n isOptionalString(value.parentRunId) &&\n (value.iteration === undefined ||\n (isRecord(value.iteration) &&\n typeof value.iteration.runId === \"string\" &&\n typeof value.iteration.stepId === \"string\" &&\n typeof value.iteration.attemptId === \"string\" &&\n Number.isSafeInteger(value.iteration.index) &&\n Number(value.iteration.index) > 0)) &&\n (value.error === undefined || isPipelineTraceError(value.error))\n );\n}\n\nfunction isStudioSnapshot(value: unknown): value is StudioSnapshot {\n if (!isRecord(value)) return false;\n if (\n !isFiniteNumber(value.activeRunCount) ||\n !isFiniteNumber(value.completedRunCount) ||\n !Array.isArray(value.definitions) ||\n !value.definitions.every(\n (definition) =>\n isRecord(definition) &&\n typeof definition.pipelineId === \"string\" &&\n isFiniteNumber(definition.runCount) &&\n (definition.identity === undefined || isDefinitionIdentity(definition.identity)) &&\n (definition.snapshot === undefined || isDefinitionSnapshot(definition.snapshot))\n ) ||\n !isFiniteNumber(value.failedRunCount) ||\n !isFiniteNumber(value.generatedAtMs) ||\n !isFiniteNumber(value.lastEventId) ||\n !Array.isArray(value.runs) ||\n !value.runs.every(isStoredStudioRun) ||\n (value.liveRunIds !== undefined && !isStringArray(value.liveRunIds))\n ) {\n return false;\n }\n return true;\n}\n\nexport function parseStudioSnapshot(value: unknown): StudioSnapshot | undefined {\n return isStudioSnapshot(value) ? value : undefined;\n}\n\nfunction isStudioCommand(value: unknown): value is PipelineRunStudioCommand {\n return (\n isRecord(value) &&\n typeof value.canPlan === \"boolean\" &&\n typeof value.id === \"string\" &&\n typeof value.name === \"string\" &&\n isOptionalString(value.description) &&\n Array.isArray(value.parameters) &&\n value.parameters.every(isPipelineRunStudioParameter)\n );\n}\n\nexport function parseStudioCommands(value: unknown): PipelineRunStudioCommand[] | undefined {\n if (\n !isRecord(value) ||\n !Array.isArray(value.commands) ||\n !value.commands.every(isStudioCommand)\n ) {\n return undefined;\n }\n return value.commands;\n}\n\nfunction isStudioPlanPayload(value: unknown): value is { plan: PipelinePlan } {\n if (!isRecord(value) || !isRecord(value.plan)) return false;\n const plan = value.plan;\n if (\n typeof plan.dryRun !== \"boolean\" ||\n !Array.isArray(plan.errors) ||\n !plan.errors.every((error) => isRecord(error) && typeof error.message === \"string\") ||\n typeof plan.ok !== \"boolean\" ||\n typeof plan.pipelineId !== \"string\" ||\n !Array.isArray(plan.steps)\n ) {\n return false;\n }\n for (const step of plan.steps) {\n if (\n !isRecord(step) ||\n typeof step.id !== \"string\" ||\n !isStringArray(step.dependencies) ||\n typeof step.selected !== \"boolean\" ||\n !isOptionalString(step.description) ||\n !isOptionalString(step.name)\n ) {\n return false;\n }\n if (\n step.nestedPipeline !== undefined &&\n (!isRecord(step.nestedPipeline) ||\n ![\"single\", \"for-each\", \"iterate\"].includes(String(step.nestedPipeline.mode)) ||\n (step.nestedPipeline.mode === \"iterate\" &&\n (!Number.isSafeInteger(step.nestedPipeline.maxIterations) ||\n Number(step.nestedPipeline.maxIterations) < 1)) ||\n typeof step.nestedPipeline.pipelineId !== \"string\" ||\n !isStringArray(step.nestedPipeline.stepIds))\n ) {\n return false;\n }\n if (\n step.remote !== undefined &&\n (!isRecord(step.remote) ||\n typeof step.remote.engine !== \"string\" ||\n !isOptionalString(step.remote.target))\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction parseStudioPlan(value: unknown): PipelinePlan | undefined {\n return isStudioPlanPayload(value) ? value.plan : undefined;\n}\n\nfunction responseError(value: unknown, fallback: string): Error {\n if (!isRecord(value)) return new Error(fallback);\n if (Array.isArray(value.errors) && value.errors.every((item) => typeof item === \"string\")) {\n return new Error(value.errors.join(\"\\n\"));\n }\n return new Error(typeof value.message === \"string\" ? value.message : fallback);\n}\n\nasync function readJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n throw new Error(\"Studio API returned invalid JSON.\");\n }\n}\n\nfunction invalidResponse(endpoint: string): Error {\n return new Error(`Studio API returned an invalid response for ${endpoint}.`);\n}\n\n/** Same-origin Studio transport. Every successful payload is validated before use. */\nexport function createStudioApi(fetcher: typeof fetch = fetch): StudioApi {\n return {\n async loadSnapshot() {\n const response = await fetcher(\"/api/snapshot\", { cache: \"no-store\" });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Snapshot request failed.\");\n const snapshot = parseStudioSnapshot(payload);\n if (!snapshot) throw invalidResponse(\"snapshot\");\n return snapshot;\n },\n async loadRunDetail(runId) {\n const response = await fetcher(\"/api/runs/\" + encodeURIComponent(runId), {\n cache: \"no-store\",\n });\n const payload = await readJson(response);\n if (response.status === 404) return null;\n if (!response.ok) throw responseError(payload, \"Run detail request failed.\");\n if (!isRecord(payload) || !isStoredStudioRun(payload.run)) {\n throw invalidResponse(\"run detail\");\n }\n return { run: payload.run };\n },\n async loadCommands() {\n const response = await fetcher(\"/api/commands\", { cache: \"no-store\" });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Commands request failed.\");\n const commands = parseStudioCommands(payload);\n if (!commands) throw invalidResponse(\"commands\");\n return commands;\n },\n async loadCapabilities() {\n const response = await fetcher(\"/api/capabilities\", { cache: \"no-store\" });\n const payload = await readJson(response);\n if (\n !response.ok ||\n !isRecord(payload) ||\n typeof payload.canCancel !== \"boolean\" ||\n typeof payload.canClearHistory !== \"boolean\"\n ) {\n if (!response.ok) throw responseError(payload, \"Capabilities request failed.\");\n throw invalidResponse(\"capabilities\");\n }\n return {\n canCancel: payload.canCancel,\n canClearHistory: payload.canClearHistory,\n };\n },\n async clearHistory() {\n const response = await fetcher(\"/api/history\", {\n method: \"DELETE\",\n headers: { \"x-tubeless-studio-clear-history\": \"1\" },\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"History could not be cleared.\");\n if (!isRecord(payload) || payload.cleared !== true || !isFiniteNumber(payload.eventCount)) {\n throw invalidResponse(\"clear history\");\n }\n return { eventCount: payload.eventCount };\n },\n async previewPlan(commandId, input) {\n const response = await fetcher(\"/api/commands/\" + encodeURIComponent(commandId) + \"/plan\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-tubeless-studio-plan\": \"1\" },\n body: JSON.stringify(input),\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Plan request failed.\");\n const plan = parseStudioPlan(payload);\n if (!plan) throw invalidResponse(\"plan\");\n return plan;\n },\n async cancelRun(runId) {\n const response = await fetcher(\"/api/runs/\" + encodeURIComponent(runId) + \"/cancel\", {\n method: \"POST\",\n headers: { \"x-tubeless-studio-cancel\": \"1\" },\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Run could not be cancelled.\");\n if (!isRecord(payload) || payload.cancelled !== true || payload.runId !== runId) {\n throw invalidResponse(\"cancel run\");\n }\n },\n async launch(commandId, values) {\n const response = await fetcher(\"/api/commands/\" + encodeURIComponent(commandId) + \"/runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-tubeless-studio-launch\": \"1\" },\n body: JSON.stringify({ values }),\n });\n const payload = await readJson(response);\n if (!response.ok) throw responseError(payload, \"Launch failed.\");\n if (\n !isRecord(payload) ||\n payload.accepted !== true ||\n typeof payload.runId !== \"string\" ||\n payload.runId.length === 0\n ) {\n throw invalidResponse(\"launch\");\n }\n return payload.runId;\n },\n };\n}\n"]}
@@ -23,9 +23,9 @@ export declare function serializeLaunchValues(command: PipelineRunStudioCommand,
23
23
  /** Select only execution controls for plan requests. */
24
24
  export declare function serializePlanInput(command: PipelineRunStudioCommand, readValues: ReadStudioParameterValues): PipelineRunControls;
25
25
  export declare function isoTime(ms: number): string;
26
- export declare function Status({ value, outputSource }: {
26
+ export declare function Status({ value, outputSource, }: {
27
27
  value: string;
28
- outputSource?: "override";
28
+ outputSource?: "override" | "cache";
29
29
  }): import("preact").JSX.Element;
30
30
  interface CommandFieldsProps {
31
31
  command: PipelineRunStudioCommand;
@@ -1,4 +1,6 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { MetadataDetails, MetadataExplorer } from "./run-store-ui-metadata.js";
3
+ import { StepArtifacts } from "./run-store-ui-artifacts.js";
2
4
  import { DefinitionHistory } from "./run-store-ui-definitions.js";
3
5
  import { render } from "preact";
4
6
  import { useEffect, useMemo, useRef, useState } from "preact/hooks";
@@ -297,8 +299,8 @@ function statusMark(value) {
297
299
  ? "…"
298
300
  : "";
299
301
  }
300
- export function Status({ value, outputSource }) {
301
- return (_jsxs("span", { class: `status ${value}`, children: [_jsx("i", { class: "status-mark", "aria-hidden": "true", children: statusMark(value) }), value, outputSource === "override" && " (overridden)"] }));
302
+ export function Status({ value, outputSource, }) {
303
+ return (_jsxs("span", { class: `status ${value}`, children: [_jsx("i", { class: "status-mark", "aria-hidden": "true", children: statusMark(value) }), value, outputSource === "override" && " (overridden)", outputSource === "cache" && " (cached)"] }));
302
304
  }
303
305
  function EmptyView({ copy, title }) {
304
306
  return (_jsx("div", { class: "empty", children: _jsxs("div", { children: [_jsx("div", { class: "empty-icon", children: _jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", strokeWidth: "1.4", children: _jsx("path", { d: "M4 5.5h12M4 10h12M4 14.5h8" }) }) }), _jsx("strong", { children: title }), _jsx("p", { children: copy })] }) }));
@@ -377,7 +379,7 @@ export function PipelinesView({ commands, onConfigure, }) {
377
379
  }
378
380
  export function PlanView({ plan }) {
379
381
  const selected = plan.steps.filter((step) => step.selected && !step.skipReason).length;
380
- return (_jsxs(_Fragment, { children: [plan.errors.length > 0 && (_jsx("div", { class: "launch-error", children: plan.errors.map((error) => (_jsx("div", { children: error.message }, error.message))) })), _jsxs("div", { class: "plan-summary", children: [_jsx("strong", { children: plan.pipelineId }), _jsxs("span", { children: [selected, " of ", plan.steps.length, " steps will run", plan.dryRun ? " · dry run" : ""] })] }), _jsx("div", { class: "plan-steps", children: plan.steps.map((step) => {
382
+ return (_jsxs(_Fragment, { children: [plan.errors.length > 0 && (_jsx("div", { class: "launch-error", children: plan.errors.map((error) => (_jsx("div", { children: error.message }, error.message))) })), _jsxs("div", { class: "plan-summary", children: [_jsx("strong", { children: plan.pipelineId }), _jsxs("span", { children: [selected, " of ", plan.steps.length, " steps will run", plan.dryRun ? " · dry run" : ""] })] }), _jsx(MetadataDetails, { metadata: plan.definition?.metadata }), _jsx(MetadataExplorer, { steps: plan.steps }), _jsx("div", { class: "plan-steps", children: plan.steps.map((step) => {
381
383
  const disposition = !step.selected
382
384
  ? "Not selected"
383
385
  : step.skipReason === "dry-run"
@@ -400,7 +402,7 @@ export function PlanView({ plan }) {
400
402
  ? "Pipeline fan-out"
401
403
  : "Nested pipeline"
402
404
  : "Step";
403
- return (_jsxs("div", { class: "plan-step", children: [_jsxs("div", { class: "plan-step-title", children: [_jsx("strong", { children: step.name || step.id }), _jsx("span", { class: `plan-kind${nested ? " pipeline" : ""}`, children: kind })] }), _jsx("small", { children: detail }), _jsx("span", { class: `plan-disposition${disposition === "Will run" ? "" : " skipped"}`, children: disposition }), nested && (_jsx(NestedDetail, { label: nested.pipelineId, secondary: `${nested.stepIds.length} declared steps${nested.mode === "iterate"
405
+ return (_jsxs("div", { class: "plan-step", children: [_jsxs("div", { class: "plan-step-title", children: [_jsx("strong", { children: step.name || step.id }), _jsx("span", { class: `plan-kind${nested ? " pipeline" : ""}`, children: kind })] }), _jsx("small", { children: detail }), _jsx(MetadataDetails, { metadata: step.metadata }), _jsx("span", { class: `plan-disposition${disposition === "Will run" ? "" : " skipped"}`, children: disposition }), nested && (_jsx(NestedDetail, { label: nested.pipelineId, secondary: `${nested.stepIds.length} declared steps${nested.mode === "iterate"
404
406
  ? ` per iteration, at most ${nested.maxIterations} iterations`
405
407
  : nested.mode === "for-each"
406
408
  ? " per runtime item"
@@ -458,9 +460,13 @@ function StepRow({ step }) {
458
460
  ? nested.stepIds.length + " of " + nestedCount + " declared steps"
459
461
  : nestedCount + " declared steps";
460
462
  const detailCount = step.progress?.detailCount;
461
- return (_jsxs("article", { class: `step ${step.status}`, children: [_jsx(StepStatusIcon, { value: step.status }), _jsxs("div", { class: "step-head", children: [_jsx("strong", { children: step.name || step.id }), step.outputSource === "override" && (_jsx(Status, { value: step.status, outputSource: step.outputSource })), step.name && _jsx("code", { children: step.id }), _jsx("span", { class: "step-duration", children: duration(step.durationMs) })] }), step.description && _jsx("div", { class: "step-description", children: step.description }), nested && (_jsx(NestedDetail, { label: nested.pipelineId, secondary: `${nestedCountLabel}${nested.mode === "iterate" ? ` per iteration, at most ${nested.maxIterations} iterations` : nested.mode === "for-each" ? " per runtime item" : ""}`, stepIds: nested.stepIds })), step.remote && _jsx(NestedDetail, { label: step.remote.engine, secondary: step.remote.target }), step.attempt && (_jsx("div", { class: "execution", children: _jsxs("span", { class: "execution-summary", title: step.attempt.attemptId, children: [_jsx("b", { children: step.attempt.outputSource === "override" ? "Override validation" : "Execution" }), " ", "\u00B7 ", shortId(step.attempt.attemptId), step.attempt.retries.length > 0 &&
462
- ` · ${step.attempt.retries.length} retr${step.attempt.retries.length === 1 ? "y" : "ies"}`] }) })), step.artifacts?.map((entry, index) => (_jsxs("details", { class: "execution", children: [_jsxs("summary", { children: [entry.preview ? "Preview " : "Artifact ", entry.operation, ": ", entry.artifact.id || entry.artifact.uri] }), _jsx("pre", { children: JSON.stringify(entry.artifact, null, 2) })] }, index))), step.progress && (_jsxs(_Fragment, { children: [_jsx("div", { class: "progress", children: _jsx("i", { class: `w${Math.round(progressWidth)}` }) }), _jsx("div", { class: "progress-copy", children: step.progress.message ||
463
- step.progress.completed + (progressTotal ? " / " + progressTotal : "") + " complete" }), step.progress.details && step.progress.details.length > 0 && (_jsxs("div", { class: "progress-details", children: [step.progress.details.map((detail) => (_jsxs("div", { class: `progress-detail ${detail.status || "running"}`, children: [_jsx("b", { children: detail.id }), detail.label && _jsx("span", { children: detail.label }), detail.outputSource === "override" && _jsx("span", { children: "(overridden)" })] }, detail.id))), detailCount && step.progress.details.length < detailCount ? (_jsxs("div", { class: "progress-detail-truncated", children: ["Showing ", step.progress.details.length, " of ", detailCount, " items"] })) : null] }))] }))] }));
463
+ return (_jsxs("article", { class: `step ${step.status}`, children: [_jsx(StepStatusIcon, { value: step.status }), _jsxs("div", { class: "step-head", children: [_jsx("strong", { children: step.name || step.id }), step.outputSource && _jsx(Status, { value: step.status, outputSource: step.outputSource }), step.name && _jsx("code", { children: step.id }), _jsx("span", { class: "step-duration", children: duration(step.durationMs) })] }), step.description && _jsx("div", { class: "step-description", children: step.description }), nested && (_jsx(NestedDetail, { label: nested.pipelineId, secondary: `${nestedCountLabel}${nested.mode === "iterate" ? ` per iteration, at most ${nested.maxIterations} iterations` : nested.mode === "for-each" ? " per runtime item" : ""}`, stepIds: nested.stepIds })), step.remote && _jsx(NestedDetail, { label: step.remote.engine, secondary: step.remote.target }), step.attempt && (_jsx("div", { class: "execution", children: _jsxs("span", { class: "execution-summary", title: step.attempt.attemptId, children: [_jsx("b", { children: step.attempt.outputSource === "override"
464
+ ? "Override validation"
465
+ : step.attempt.outputSource === "cache"
466
+ ? "Cache validation"
467
+ : "Execution" }), " ", "\u00B7 ", shortId(step.attempt.attemptId), step.attempt.retries.length > 0 &&
468
+ ` · ${step.attempt.retries.length} retr${step.attempt.retries.length === 1 ? "y" : "ies"}`] }) })), step.artifacts && _jsx(StepArtifacts, { artifacts: step.artifacts, stepId: step.id }), step.progress && (_jsxs(_Fragment, { children: [_jsx("div", { class: "progress", children: _jsx("i", { class: `w${Math.round(progressWidth)}` }) }), _jsx("div", { class: "progress-copy", children: step.progress.message ||
469
+ step.progress.completed + (progressTotal ? " / " + progressTotal : "") + " complete" }), step.progress.details && step.progress.details.length > 0 && (_jsxs("div", { class: "progress-details", children: [step.progress.details.map((detail) => (_jsxs("div", { class: `progress-detail ${detail.status || "running"}`, children: [_jsx("b", { children: detail.id }), detail.label && _jsx("span", { children: detail.label }), detail.outputSource === "override" && _jsx("span", { children: "(overridden)" }), detail.outputSource === "cache" && _jsx("span", { children: "(cached)" })] }, detail.id))), detailCount && step.progress.details.length < detailCount ? (_jsxs("div", { class: "progress-detail-truncated", children: ["Showing ", step.progress.details.length, " of ", detailCount, " items"] })) : null] }))] }))] }));
464
470
  }
465
471
  function stepSummary(run) {
466
472
  const order = ["running", "failed", "cancelled", "skipped", "completed", "planned"];