tubeless 0.2.13 → 0.2.15

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 (148) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/cli-pipeline-command.d.ts +7 -2
  3. package/dist/cli/cli-pipeline-command.js +24 -3
  4. package/dist/cli/cli-pipeline-command.js.map +1 -1
  5. package/dist/core/child-execution.js +5 -3
  6. package/dist/core/child-execution.js.map +1 -1
  7. package/dist/core/child-progress.js +2 -0
  8. package/dist/core/child-progress.js.map +1 -1
  9. package/dist/core/pipeline-cache.d.ts +68 -0
  10. package/dist/core/pipeline-cache.js +157 -0
  11. package/dist/core/pipeline-cache.js.map +1 -0
  12. package/dist/core/pipeline-compiler.js +4 -2
  13. package/dist/core/pipeline-compiler.js.map +1 -1
  14. package/dist/core/pipeline-definition-identity.d.ts +3 -1
  15. package/dist/core/pipeline-definition-identity.js +38 -5
  16. package/dist/core/pipeline-definition-identity.js.map +1 -1
  17. package/dist/core/pipeline-definition-validation.d.ts +7 -2
  18. package/dist/core/pipeline-definition-validation.js +22 -2
  19. package/dist/core/pipeline-definition-validation.js.map +1 -1
  20. package/dist/core/pipeline-definition.d.ts +6 -0
  21. package/dist/core/pipeline-definition.js.map +1 -1
  22. package/dist/core/pipeline-execute.js +5 -0
  23. package/dist/core/pipeline-execute.js.map +1 -1
  24. package/dist/core/pipeline-graph.d.ts +2 -1
  25. package/dist/core/pipeline-graph.js +10 -4
  26. package/dist/core/pipeline-graph.js.map +1 -1
  27. package/dist/core/pipeline-mermaid.js +7 -1
  28. package/dist/core/pipeline-mermaid.js.map +1 -1
  29. package/dist/core/pipeline-plan.js +4 -0
  30. package/dist/core/pipeline-plan.js.map +1 -1
  31. package/dist/core/pipeline-query.d.ts +11 -0
  32. package/dist/core/pipeline-query.js +10 -0
  33. package/dist/core/pipeline-query.js.map +1 -0
  34. package/dist/core/pipeline-run-state.d.ts +2 -2
  35. package/dist/core/pipeline-run-state.js.map +1 -1
  36. package/dist/core/pipeline-step-executor.d.ts +2 -0
  37. package/dist/core/pipeline-step-executor.js +24 -9
  38. package/dist/core/pipeline-step-executor.js.map +1 -1
  39. package/dist/core/pipeline-step-metadata.d.ts +1 -0
  40. package/dist/core/pipeline-step-metadata.js +1 -0
  41. package/dist/core/pipeline-step-metadata.js.map +1 -1
  42. package/dist/core/pipeline-steps.d.ts +17 -3
  43. package/dist/core/pipeline-steps.js +11 -3
  44. package/dist/core/pipeline-steps.js.map +1 -1
  45. package/dist/core/pipeline-types.d.ts +20 -7
  46. package/dist/core/pipeline-types.js.map +1 -1
  47. package/dist/core/pipeline-validation.js +1 -1
  48. package/dist/core/pipeline-validation.js.map +1 -1
  49. package/dist/core/pipeline.d.ts +4 -0
  50. package/dist/core/pipeline.js +7 -1
  51. package/dist/core/pipeline.js.map +1 -1
  52. package/dist/node/node.d.ts +1 -0
  53. package/dist/node/node.js +1 -0
  54. package/dist/node/node.js.map +1 -1
  55. package/dist/reporter/interactive-reporter.js +3 -4
  56. package/dist/reporter/interactive-reporter.js.map +1 -1
  57. package/dist/reporter/reporter.d.ts +1 -0
  58. package/dist/reporter/reporter.js +4 -2
  59. package/dist/reporter/reporter.js.map +1 -1
  60. package/dist/run-store/cache-artifact.d.ts +7 -0
  61. package/dist/run-store/cache-artifact.js +22 -0
  62. package/dist/run-store/cache-artifact.js.map +1 -0
  63. package/dist/run-store/definition-diff.js +20 -8
  64. package/dist/run-store/definition-diff.js.map +1 -1
  65. package/dist/run-store/run-projection.js +2 -2
  66. package/dist/run-store/run-projection.js.map +1 -1
  67. package/dist/run-store/run-store.d.ts +2 -2
  68. package/dist/run-store/run-store.js.map +1 -1
  69. package/dist/studio/run-store-ui-artifacts.d.ts +5 -0
  70. package/dist/studio/run-store-ui-artifacts.js +18 -0
  71. package/dist/studio/run-store-ui-artifacts.js.map +1 -0
  72. package/dist/studio/run-store-ui-client-browser.js +2 -2
  73. package/dist/studio/run-store-ui-client-transport.d.ts +3 -1
  74. package/dist/studio/run-store-ui-client-transport.js +74 -32
  75. package/dist/studio/run-store-ui-client-transport.js.map +1 -1
  76. package/dist/studio/run-store-ui-client.d.ts +12 -5
  77. package/dist/studio/run-store-ui-client.js +176 -57
  78. package/dist/studio/run-store-ui-client.js.map +1 -1
  79. package/dist/studio/run-store-ui-data-controller.d.ts +2 -1
  80. package/dist/studio/run-store-ui-data-controller.js +31 -9
  81. package/dist/studio/run-store-ui-data-controller.js.map +1 -1
  82. package/dist/studio/run-store-ui-debugging.d.ts +13 -0
  83. package/dist/studio/run-store-ui-debugging.js +48 -0
  84. package/dist/studio/run-store-ui-debugging.js.map +1 -0
  85. package/dist/studio/run-store-ui-definitions.js +2 -1
  86. package/dist/studio/run-store-ui-definitions.js.map +1 -1
  87. package/dist/studio/run-store-ui-hosting.d.ts +18 -0
  88. package/dist/studio/run-store-ui-hosting.js +88 -0
  89. package/dist/studio/run-store-ui-hosting.js.map +1 -0
  90. package/dist/studio/run-store-ui-http.d.ts +1 -1
  91. package/dist/studio/run-store-ui-http.js +2 -2
  92. package/dist/studio/run-store-ui-http.js.map +1 -1
  93. package/dist/studio/run-store-ui-metadata.d.ts +13 -0
  94. package/dist/studio/run-store-ui-metadata.js +32 -0
  95. package/dist/studio/run-store-ui-metadata.js.map +1 -0
  96. package/dist/studio/run-store-ui-page.d.ts +2 -0
  97. package/dist/studio/run-store-ui-page.js +52 -3
  98. package/dist/studio/run-store-ui-page.js.map +1 -1
  99. package/dist/studio/run-store-ui.d.ts +2 -0
  100. package/dist/studio/run-store-ui.js +45 -9
  101. package/dist/studio/run-store-ui.js.map +1 -1
  102. package/dist/tracing/artifact-metadata.d.ts +1 -0
  103. package/dist/tracing/artifact-metadata.js +2 -2
  104. package/dist/tracing/artifact-metadata.js.map +1 -1
  105. package/dist/tracing/graph-metadata.d.ts +12 -0
  106. package/dist/tracing/graph-metadata.js +55 -0
  107. package/dist/tracing/graph-metadata.js.map +1 -0
  108. package/dist/tracing/tracing-internal.js +2 -2
  109. package/dist/tracing/tracing-internal.js.map +1 -1
  110. package/dist/tracing/tracing-schema.d.ts +58 -31
  111. package/dist/tracing/tracing-schema.js +26 -8
  112. package/dist/tracing/tracing-schema.js.map +1 -1
  113. package/dist/utilities/cache-duration.d.ts +2 -0
  114. package/dist/utilities/cache-duration.js +39 -0
  115. package/dist/utilities/cache-duration.js.map +1 -0
  116. package/dist/utilities/cache-key.d.ts +2 -0
  117. package/dist/utilities/cache-key.js +63 -0
  118. package/dist/utilities/cache-key.js.map +1 -0
  119. package/dist/utilities/cache-storage.d.ts +6 -0
  120. package/dist/utilities/cache-storage.js +83 -0
  121. package/dist/utilities/cache-storage.js.map +1 -0
  122. package/dist/utilities/canonical-json.d.ts +2 -0
  123. package/dist/utilities/canonical-json.js +12 -0
  124. package/dist/utilities/canonical-json.js.map +1 -0
  125. package/dist/workbench/workbench-commands.js +43 -3
  126. package/dist/workbench/workbench-commands.js.map +1 -1
  127. package/dist/workbench/workbench-history.js +2 -1
  128. package/dist/workbench/workbench-history.js.map +1 -1
  129. package/dist/workbench/workbench-ui.js +18 -7
  130. package/dist/workbench/workbench-ui.js.map +1 -1
  131. package/docs/README.md +1 -1
  132. package/docs/agent-guide.md +31 -2
  133. package/docs/api-reference.md +98 -85
  134. package/docs/api-report.json +19 -6
  135. package/docs/artifacts.md +6 -2
  136. package/docs/cli.md +25 -0
  137. package/docs/concepts.md +10 -0
  138. package/docs/declarative-pipelines.md +4 -0
  139. package/docs/graph-metadata.md +108 -0
  140. package/docs/llms.txt +4 -0
  141. package/docs/recipes.md +15 -0
  142. package/docs/step-output-cache.md +242 -0
  143. package/docs/studio.md +171 -19
  144. package/examples/graph-metadata.ts +32 -0
  145. package/examples/project/tubeless.project.ts +5 -0
  146. package/examples/step-output-cache.ts +30 -0
  147. package/package.json +2 -2
  148. package/skills/tubeless/SKILL.md +16 -0
@@ -1 +1 @@
1
- {"version":3,"file":"run-store.js","sourceRoot":"","sources":["../../src/run-store/run-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RUN_MODEL_VERSION,\n PipelineRunStatus,\n PipelineDefinitionIdentity,\n PipelineDefinitionSnapshot,\n PipelineStepLifecycleStatus,\n PipelineStepProgressDetail,\n} from \"../core/pipeline.js\";\nimport type {\n PipelineTraceError,\n PipelineTraceEvent,\n PipelineTraceExporter,\n} from \"../tracing/tracing-contracts.js\";\nimport { RunProjection } from \"./run-projection.js\";\nimport { DefinitionProjection } from \"./definition-projection.js\";\nexport { projectPipelineRun } from \"./run-projection.js\";\n\n/** One trace event after it has been appended to a durable local store. */\nexport type StoredPipelineEvent = PipelineTraceEvent & {\n /** Store-local, monotonically increasing sequence. `0` is a valid first id. */\n id: number;\n};\n\nexport interface PipelineRunEventQuery {\n /** Return events strictly after this store-local sequence. */\n afterId?: number;\n /** Restrict results to one pipeline definition. */\n pipelineId?: string;\n /** Restrict results to one run. */\n runId?: string;\n /** Maximum rows to return. Defaults to the store implementation's safe limit. */\n limit?: number;\n}\n\n/** Read-only event source consumed by run history and the local studio. */\nexport interface PipelineRunEventReader {\n close(): void | Promise<void>;\n listEvents(query?: PipelineRunEventQuery): Promise<readonly StoredPipelineEvent[]>;\n}\n\n/**\n * Append-only persistence boundary used by the local studio.\n * SQLite `export()` may return before the row is durable; call `flush()` or\n * `close()` before another connection can observe the tail.\n */\nexport interface PipelineRunEventStore extends PipelineRunEventReader, PipelineTraceExporter {}\n\nexport type StoredPipelineRunStatus = PipelineRunStatus | \"running\";\n\nexport interface StoredNestedPipeline {\n mode: \"for-each\" | \"single\" | \"iterate\";\n maxIterations?: number;\n pipelineId: string;\n stepCount: number;\n stepIds: string[];\n}\n\nexport interface StoredRemote {\n engine: string;\n target?: string;\n}\n\nexport interface StoredPipelineLog {\n attemptId?: string;\n id: number;\n level: \"error\" | \"log\" | \"warn\";\n message: string;\n stepId?: string;\n timestampMs: number;\n}\n\nexport interface StoredPipelineAttempt {\n outputSource?: \"override\";\n attemptId: string;\n durationMs?: number;\n finishedAtMs?: number;\n retries: number[];\n startedAtMs: number;\n status: Exclude<PipelineStepLifecycleStatus, \"planned\">;\n}\n\nexport type StoredPipelineArtifact = Extract<\n PipelineTraceEvent,\n { name: \"step.artifact\" }\n>[\"payload\"] & {\n attemptId: string;\n timestampMs: number;\n};\n\nexport interface StoredPipelineStep {\n artifacts?: StoredPipelineArtifact[];\n outputSource?: \"override\";\n /** One execution attempt; `retries` carries `reportAttempt` telemetry. */\n attempt?: StoredPipelineAttempt;\n description?: string;\n durationMs?: number;\n finishedAtMs?: number;\n id: string;\n name?: string;\n nestedPipeline?: StoredNestedPipeline;\n remote?: StoredRemote;\n progress?: {\n completed: number;\n detailCount?: number;\n details?: PipelineStepProgressDetail[];\n message?: string;\n total?: number;\n };\n startedAtMs?: number;\n status: PipelineStepLifecycleStatus;\n}\n\nexport interface StoredPipelineRun {\n iteration?: PipelineTraceEvent[\"iteration\"];\n definitionIdentity?: PipelineDefinitionIdentity;\n correlationId?: string;\n dryRun: boolean;\n durationMs?: number;\n error?: PipelineTraceError;\n eventCount: number;\n finishedAtMs?: number;\n logCount: number;\n logs: StoredPipelineLog[];\n parentRunId?: string;\n pipelineId: string;\n runId: string;\n startedAtMs: number;\n status: StoredPipelineRunStatus;\n steps: StoredPipelineStep[];\n /** Run-record schema version. Projector output is always `RUN_MODEL_VERSION`. */\n version: typeof RUN_MODEL_VERSION;\n}\n\nexport interface StoredPipelineDefinitionStep {\n dependencies: string[];\n description?: string;\n dryRun: string;\n id: string;\n name?: string;\n nestedPipeline?: StoredNestedPipeline;\n remote?: StoredRemote;\n optionalDependencies: string[];\n runtimeSkipPossible: boolean;\n skipAfterFailureOf: string[];\n}\n\nexport interface StoredPipelineDefinition {\n identity?: PipelineDefinitionIdentity;\n snapshot?: PipelineDefinitionSnapshot;\n activeRuns: number;\n firstSeenAtMs: number;\n lastSeenAtMs: number;\n pipelineId: string;\n runCount: number;\n steps: StoredPipelineDefinitionStep[];\n targetIds: string[];\n}\n\nexport interface PipelineRunStoreSnapshot {\n activeRunCount: number;\n completedRunCount: number;\n definitions: StoredPipelineDefinition[];\n failedRunCount: number;\n generatedAtMs: number;\n lastEventId: number;\n runs: StoredPipelineRun[];\n}\n\nfunction definitionKey(pipelineId: string, definitionId: string | undefined): string {\n return JSON.stringify([pipelineId, definitionId ?? null]);\n}\n\nexport interface PipelineRunProjector {\n append(events: readonly StoredPipelineEvent[]): void;\n clear(): void;\n snapshot(now?: number): PipelineRunStoreSnapshot;\n}\n\n/**\n * Incrementally fold accepted store events into the current run-history snapshot.\n * `{ retainLogs: false }` keeps `logCount` without retaining or cloning log bodies.\n * `{ retainArtifacts: false }` omits artifact metadata for workspace summaries.\n */\nexport function createPipelineRunProjector(\n options: { readonly retainLogs?: boolean; readonly retainArtifacts?: boolean } = {}\n): PipelineRunProjector {\n const pipelines = new Map<string, DefinitionProjection>();\n const runs = new Map<string, RunProjection>();\n let cached: PipelineRunStoreSnapshot | undefined;\n let lastAcceptedId: number | undefined;\n\n function applyEvent(event: StoredPipelineEvent): void {\n const run = runs.get(event.runId);\n if (run) run.append(event);\n else runs.set(event.runId, new RunProjection(event, options));\n\n const key = definitionKey(event.pipelineId, runs.get(event.runId)!.definitionId);\n const pipeline = pipelines.get(key);\n if (pipeline) pipeline.append(event);\n else pipelines.set(key, new DefinitionProjection(event));\n }\n\n function materialize(generatedAtMs: number): PipelineRunStoreSnapshot {\n const projectedRuns = [...runs.values()]\n .map((run) => run.snapshot())\n .sort((left, right) => right.startedAtMs - left.startedAtMs);\n const runsByPipeline = new Map<string, StoredPipelineRun[]>();\n for (const run of projectedRuns) {\n const key = definitionKey(run.pipelineId, run.definitionIdentity?.definitionId);\n const pipelineRuns = runsByPipeline.get(key) ?? [];\n pipelineRuns.push(run);\n runsByPipeline.set(key, pipelineRuns);\n }\n const definitions = [...runsByPipeline.entries()]\n .map(([key, pipelineRuns]): StoredPipelineDefinition => {\n return pipelines.get(key)!.snapshot(pipelineRuns);\n })\n .sort((left, right) => right.lastSeenAtMs - left.lastSeenAtMs);\n\n return {\n activeRunCount: projectedRuns.filter(({ status }) => status === \"running\").length,\n completedRunCount: projectedRuns.filter(({ status }) => status === \"completed\").length,\n definitions,\n failedRunCount: projectedRuns.filter(({ status }) => status === \"failed\").length,\n generatedAtMs,\n lastEventId: lastAcceptedId ?? 0,\n runs: projectedRuns,\n };\n }\n\n return {\n append(events) {\n const incoming = [...events]\n .filter((event) => lastAcceptedId === undefined || event.id > lastAcceptedId)\n .sort((left, right) => left.id - right.id);\n if (incoming.length === 0) return;\n for (const event of incoming) {\n if (lastAcceptedId !== undefined && event.id <= lastAcceptedId) continue;\n applyEvent(event);\n lastAcceptedId = event.id;\n cached = undefined;\n }\n },\n clear() {\n cached = undefined;\n lastAcceptedId = undefined;\n pipelines.clear();\n runs.clear();\n },\n snapshot(now) {\n if (!cached) {\n cached = materialize(now ?? Date.now());\n return cached;\n }\n if (now === undefined || now === cached.generatedAtMs) return cached;\n cached = { ...cached, generatedAtMs: now };\n return cached;\n },\n };\n}\n\n/** Fold an event stream into run history and observed pipeline definitions. */\nexport function projectPipelineRunStore(\n events: readonly StoredPipelineEvent[],\n generatedAtMs = Date.now()\n): PipelineRunStoreSnapshot {\n const projector = createPipelineRunProjector();\n projector.append(events);\n return projector.snapshot(generatedAtMs);\n}\n"]}
1
+ {"version":3,"file":"run-store.js","sourceRoot":"","sources":["../../src/run-store/run-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n RUN_MODEL_VERSION,\n PipelineRunStatus,\n PipelineDefinitionIdentity,\n PipelineDefinitionSnapshot,\n PipelineStepLifecycleStatus,\n PipelineStepProgressDetail,\n} from \"../core/pipeline.js\";\nimport type {\n PipelineTraceError,\n PipelineTraceEvent,\n PipelineTraceExporter,\n} from \"../tracing/tracing-contracts.js\";\nimport { RunProjection } from \"./run-projection.js\";\nimport { DefinitionProjection } from \"./definition-projection.js\";\nexport { projectPipelineRun } from \"./run-projection.js\";\n\n/** One trace event after it has been appended to a durable local store. */\nexport type StoredPipelineEvent = PipelineTraceEvent & {\n /** Store-local, monotonically increasing sequence. `0` is a valid first id. */\n id: number;\n};\n\nexport interface PipelineRunEventQuery {\n /** Return events strictly after this store-local sequence. */\n afterId?: number;\n /** Restrict results to one pipeline definition. */\n pipelineId?: string;\n /** Restrict results to one run. */\n runId?: string;\n /** Maximum rows to return. Defaults to the store implementation's safe limit. */\n limit?: number;\n}\n\n/** Read-only event source consumed by run history and the local studio. */\nexport interface PipelineRunEventReader {\n close(): void | Promise<void>;\n listEvents(query?: PipelineRunEventQuery): Promise<readonly StoredPipelineEvent[]>;\n}\n\n/**\n * Append-only persistence boundary used by the local studio.\n * SQLite `export()` may return before the row is durable; call `flush()` or\n * `close()` before another connection can observe the tail.\n */\nexport interface PipelineRunEventStore extends PipelineRunEventReader, PipelineTraceExporter {}\n\nexport type StoredPipelineRunStatus = PipelineRunStatus | \"running\";\n\nexport interface StoredNestedPipeline {\n mode: \"for-each\" | \"single\" | \"iterate\";\n maxIterations?: number;\n pipelineId: string;\n stepCount: number;\n stepIds: string[];\n}\n\nexport interface StoredRemote {\n engine: string;\n target?: string;\n}\n\nexport interface StoredPipelineLog {\n attemptId?: string;\n id: number;\n level: \"error\" | \"log\" | \"warn\";\n message: string;\n stepId?: string;\n timestampMs: number;\n}\n\nexport interface StoredPipelineAttempt {\n outputSource?: \"override\" | \"cache\";\n attemptId: string;\n durationMs?: number;\n finishedAtMs?: number;\n retries: number[];\n startedAtMs: number;\n status: Exclude<PipelineStepLifecycleStatus, \"planned\">;\n}\n\nexport type StoredPipelineArtifact = Extract<\n PipelineTraceEvent,\n { name: \"step.artifact\" }\n>[\"payload\"] & {\n attemptId: string;\n timestampMs: number;\n};\n\nexport interface StoredPipelineStep {\n artifacts?: StoredPipelineArtifact[];\n outputSource?: \"override\" | \"cache\";\n /** One execution attempt; `retries` carries `reportAttempt` telemetry. */\n attempt?: StoredPipelineAttempt;\n description?: string;\n durationMs?: number;\n finishedAtMs?: number;\n id: string;\n name?: string;\n nestedPipeline?: StoredNestedPipeline;\n remote?: StoredRemote;\n progress?: {\n completed: number;\n detailCount?: number;\n details?: PipelineStepProgressDetail[];\n message?: string;\n total?: number;\n };\n startedAtMs?: number;\n status: PipelineStepLifecycleStatus;\n}\n\nexport interface StoredPipelineRun {\n iteration?: PipelineTraceEvent[\"iteration\"];\n definitionIdentity?: PipelineDefinitionIdentity;\n correlationId?: string;\n dryRun: boolean;\n durationMs?: number;\n error?: PipelineTraceError;\n eventCount: number;\n finishedAtMs?: number;\n logCount: number;\n logs: StoredPipelineLog[];\n parentRunId?: string;\n pipelineId: string;\n runId: string;\n startedAtMs: number;\n status: StoredPipelineRunStatus;\n steps: StoredPipelineStep[];\n /** Run-record schema version. Projector output is always `RUN_MODEL_VERSION`. */\n version: typeof RUN_MODEL_VERSION;\n}\n\nexport interface StoredPipelineDefinitionStep {\n dependencies: string[];\n description?: string;\n dryRun: string;\n id: string;\n name?: string;\n nestedPipeline?: StoredNestedPipeline;\n remote?: StoredRemote;\n optionalDependencies: string[];\n runtimeSkipPossible: boolean;\n skipAfterFailureOf: string[];\n}\n\nexport interface StoredPipelineDefinition {\n identity?: PipelineDefinitionIdentity;\n snapshot?: PipelineDefinitionSnapshot;\n activeRuns: number;\n firstSeenAtMs: number;\n lastSeenAtMs: number;\n pipelineId: string;\n runCount: number;\n steps: StoredPipelineDefinitionStep[];\n targetIds: string[];\n}\n\nexport interface PipelineRunStoreSnapshot {\n activeRunCount: number;\n completedRunCount: number;\n definitions: StoredPipelineDefinition[];\n failedRunCount: number;\n generatedAtMs: number;\n lastEventId: number;\n runs: StoredPipelineRun[];\n}\n\nfunction definitionKey(pipelineId: string, definitionId: string | undefined): string {\n return JSON.stringify([pipelineId, definitionId ?? null]);\n}\n\nexport interface PipelineRunProjector {\n append(events: readonly StoredPipelineEvent[]): void;\n clear(): void;\n snapshot(now?: number): PipelineRunStoreSnapshot;\n}\n\n/**\n * Incrementally fold accepted store events into the current run-history snapshot.\n * `{ retainLogs: false }` keeps `logCount` without retaining or cloning log bodies.\n * `{ retainArtifacts: false }` omits artifact metadata for workspace summaries.\n */\nexport function createPipelineRunProjector(\n options: { readonly retainLogs?: boolean; readonly retainArtifacts?: boolean } = {}\n): PipelineRunProjector {\n const pipelines = new Map<string, DefinitionProjection>();\n const runs = new Map<string, RunProjection>();\n let cached: PipelineRunStoreSnapshot | undefined;\n let lastAcceptedId: number | undefined;\n\n function applyEvent(event: StoredPipelineEvent): void {\n const run = runs.get(event.runId);\n if (run) run.append(event);\n else runs.set(event.runId, new RunProjection(event, options));\n\n const key = definitionKey(event.pipelineId, runs.get(event.runId)!.definitionId);\n const pipeline = pipelines.get(key);\n if (pipeline) pipeline.append(event);\n else pipelines.set(key, new DefinitionProjection(event));\n }\n\n function materialize(generatedAtMs: number): PipelineRunStoreSnapshot {\n const projectedRuns = [...runs.values()]\n .map((run) => run.snapshot())\n .sort((left, right) => right.startedAtMs - left.startedAtMs);\n const runsByPipeline = new Map<string, StoredPipelineRun[]>();\n for (const run of projectedRuns) {\n const key = definitionKey(run.pipelineId, run.definitionIdentity?.definitionId);\n const pipelineRuns = runsByPipeline.get(key) ?? [];\n pipelineRuns.push(run);\n runsByPipeline.set(key, pipelineRuns);\n }\n const definitions = [...runsByPipeline.entries()]\n .map(([key, pipelineRuns]): StoredPipelineDefinition => {\n return pipelines.get(key)!.snapshot(pipelineRuns);\n })\n .sort((left, right) => right.lastSeenAtMs - left.lastSeenAtMs);\n\n return {\n activeRunCount: projectedRuns.filter(({ status }) => status === \"running\").length,\n completedRunCount: projectedRuns.filter(({ status }) => status === \"completed\").length,\n definitions,\n failedRunCount: projectedRuns.filter(({ status }) => status === \"failed\").length,\n generatedAtMs,\n lastEventId: lastAcceptedId ?? 0,\n runs: projectedRuns,\n };\n }\n\n return {\n append(events) {\n const incoming = [...events]\n .filter((event) => lastAcceptedId === undefined || event.id > lastAcceptedId)\n .sort((left, right) => left.id - right.id);\n if (incoming.length === 0) return;\n for (const event of incoming) {\n if (lastAcceptedId !== undefined && event.id <= lastAcceptedId) continue;\n applyEvent(event);\n lastAcceptedId = event.id;\n cached = undefined;\n }\n },\n clear() {\n cached = undefined;\n lastAcceptedId = undefined;\n pipelines.clear();\n runs.clear();\n },\n snapshot(now) {\n if (!cached) {\n cached = materialize(now ?? Date.now());\n return cached;\n }\n if (now === undefined || now === cached.generatedAtMs) return cached;\n cached = { ...cached, generatedAtMs: now };\n return cached;\n },\n };\n}\n\n/** Fold an event stream into run history and observed pipeline definitions. */\nexport function projectPipelineRunStore(\n events: readonly StoredPipelineEvent[],\n generatedAtMs = Date.now()\n): PipelineRunStoreSnapshot {\n const projector = createPipelineRunProjector();\n projector.append(events);\n return projector.snapshot(generatedAtMs);\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { StoredPipelineArtifact } from "../run-store/run-store.js";
2
+ export declare function StepArtifacts({ artifacts, stepId, }: {
3
+ artifacts: readonly StoredPipelineArtifact[];
4
+ stepId: string;
5
+ }): import("preact").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useState } from "preact/hooks";
3
+ import { cacheArtifactMetadata } from "../run-store/cache-artifact.js";
4
+ export function StepArtifacts({ artifacts, stepId, }) {
5
+ const [filter, setFilter] = useState("all");
6
+ const cached = artifacts.filter((entry) => cacheArtifactMetadata(entry.artifact));
7
+ const mixed = cached.length > 0 && cached.length < artifacts.length;
8
+ return (_jsxs(_Fragment, { children: [mixed && (_jsxs("label", { class: "artifact-filter", children: ["Artifacts for ", stepId, " ", _jsxs("select", { value: filter, onChange: (event) => setFilter(event.currentTarget.value), children: [_jsx("option", { value: "all", children: "All artifacts" }), _jsx("option", { value: "cache", children: "Cached outputs" }), _jsx("option", { value: "application", children: "Application artifacts" })] })] })), artifacts.map((entry, index) => {
9
+ const cache = cacheArtifactMetadata(entry.artifact);
10
+ if (mixed && ((filter === "cache" && !cache) || (filter === "application" && cache)))
11
+ return null;
12
+ const created = cache ? new Date(cache.createdAtMs) : undefined;
13
+ return (_jsxs("details", { class: "artifact-detail", children: [_jsxs("summary", { children: [cache ? "Cached output " : entry.preview ? "Preview " : "Artifact ", entry.operation, !cache && `: ${entry.artifact.id || entry.artifact.uri}`] }), cache && (_jsxs("div", { class: "artifact-info", children: [_jsxs("div", { children: ["Created:", " ", created && Number.isFinite(created.getTime())
14
+ ? created.toISOString()
15
+ : String(cache.createdAtMs)] }), _jsxs("div", { children: ["Age at ", entry.operation, ": ", cache.ageMs, " ms"] }), entry.artifact.uri && _jsxs("div", { children: ["Location: ", entry.artifact.uri] }), entry.artifact.byteSize !== undefined && (_jsxs("div", { children: ["Size: ", entry.artifact.byteSize, " bytes"] })), _jsx("p", { class: "artifact-note", children: "Recorded operation; current cache availability is not checked." })] })), cache ? (_jsxs("details", { class: "artifact-receipt", children: [_jsx("summary", { children: "Receipt metadata" }), _jsx("pre", { children: JSON.stringify(entry.artifact, null, 2) })] })) : (_jsx("pre", { children: JSON.stringify(entry.artifact, null, 2) }))] }, index));
16
+ })] }));
17
+ }
18
+ //# sourceMappingURL=run-store-ui-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-ui-artifacts.js","sourceRoot":"","sources":["../../src/studio/run-store-ui-artifacts.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"preact/hooks\";\nimport { cacheArtifactMetadata } from \"../run-store/cache-artifact.js\";\nimport type { StoredPipelineArtifact } from \"../run-store/run-store.js\";\n\nexport function StepArtifacts({\n artifacts,\n stepId,\n}: {\n artifacts: readonly StoredPipelineArtifact[];\n stepId: string;\n}) {\n const [filter, setFilter] = useState(\"all\");\n const cached = artifacts.filter((entry) => cacheArtifactMetadata(entry.artifact));\n const mixed = cached.length > 0 && cached.length < artifacts.length;\n return (\n <>\n {mixed && (\n <label class=\"artifact-filter\">\n Artifacts for {stepId}{\" \"}\n <select value={filter} onChange={(event) => setFilter(event.currentTarget.value)}>\n <option value=\"all\">All artifacts</option>\n <option value=\"cache\">Cached outputs</option>\n <option value=\"application\">Application artifacts</option>\n </select>\n </label>\n )}\n {artifacts.map((entry, index) => {\n const cache = cacheArtifactMetadata(entry.artifact);\n if (mixed && ((filter === \"cache\" && !cache) || (filter === \"application\" && cache)))\n return null;\n const created = cache ? new Date(cache.createdAtMs) : undefined;\n return (\n <details class=\"artifact-detail\" key={index}>\n <summary>\n {cache ? \"Cached output \" : entry.preview ? \"Preview \" : \"Artifact \"}\n {entry.operation}\n {!cache && `: ${entry.artifact.id || entry.artifact.uri}`}\n </summary>\n {cache && (\n <div class=\"artifact-info\">\n <div>\n Created:{\" \"}\n {created && Number.isFinite(created.getTime())\n ? created.toISOString()\n : String(cache.createdAtMs)}\n </div>\n <div>\n Age at {entry.operation}: {cache.ageMs} ms\n </div>\n {entry.artifact.uri && <div>Location: {entry.artifact.uri}</div>}\n {entry.artifact.byteSize !== undefined && (\n <div>Size: {entry.artifact.byteSize} bytes</div>\n )}\n <p class=\"artifact-note\">\n Recorded operation; current cache availability is not checked.\n </p>\n </div>\n )}\n {cache ? (\n <details class=\"artifact-receipt\">\n <summary>Receipt metadata</summary>\n <pre>{JSON.stringify(entry.artifact, null, 2)}</pre>\n </details>\n ) : (\n <pre>{JSON.stringify(entry.artifact, null, 2)}</pre>\n )}\n </details>\n );\n })}\n </>\n );\n}\n"]}