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
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-plan.js","sourceRoot":"","sources":["../../src/core/pipeline-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAA0B,MAAM,qBAAqB,CAAC;AAE/F,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAahF,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,QAAiB,EACjB,UAAmC,EACnC,gBAAyD,EACzD,KAAK,GAAgC,aAAa,CAAC,IAAI,CAAC;IAExD,MAAM,OAAO,GAAG,gBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAqB;QACjC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;QACtF,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,oBAAoB,EAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,mBAAmB,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS;QAC5C,QAAQ;QACR,gBAAgB,EAAE,OAAO;QACzB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QACjE,UAAU;KACX,CAAC;IACF,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,cAAc,GAAG;YACxB,GAAG,IAAI,CAAC,oBAAoB,CAAC;YAC7B,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;SACjD,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CACzB,eAA2D,EAC3D,MAAc,EACd,MAAmC;IAEnC,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAAqC,EACrC,SAAkD;IAElD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEzE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,kBAAkB,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC9C,MAAM,oBAAoB,GAAG,CAAC,IAAuB,EAAQ,EAAE;YAC7D,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;YACrD,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACzC,kBAAkB,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,EAAE;oBACjD,WAAW,EAAE,IAAI,CAAC,EAAE;oBACpB,IAAI,EAAE,qBAAqB;oBAC3B,QAAQ,EAAE,MAAM,CAAC,EAAE;iBACpB,CAAC,CAAC;gBACH,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YACD,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAClD,kBAAkB,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,EAAE;oBACjD,WAAW,EAAE,IAAI,CAAC,EAAE;oBACpB,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,MAAM,CAAC,EAAE;iBACpB,CAAC,CAAC;gBACH,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YACD,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBACjD,kBAAkB,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,EAAE;oBACjD,WAAW,EAAE,IAAI,CAAC,EAAE;oBACpB,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,MAAM,CAAC,EAAE;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QACF,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,MAAmC;IACtD,OAAO,CAAC,CAAC,cAAc,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAM/B,QAAoE,EACpE,QAAmE;IAEnE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;IACpC,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;IAChD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;IAChD,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,kCAAkC,EAClC,UAAU,EACV,YAAY,EACZ,kDAAkD,CACnD,CACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,sCAAsC,EACtC,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,uEAAuE,CAC/F,CACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,wCAAwC,EACxC,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,gGAAgG,CACxH,CACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,0CAA0C,EAC1C,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,uGAAuG,CAC/H,CACF,CAAC;IACJ,CAAC;IACD,MAAM,yBAAyB,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACpE,IAAI,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,4CAA4C,EAC5C,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,kCAAkC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChG,CACF,CAAC;IACJ,CAAC;IACD,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/F,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,gCAAgC,EAChC,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,gCAAgC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5F,CACF,CAAC;IACJ,CAAC;IACD,MAAM,gBAAgB,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,8CAA8C,EAC9C,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,iCAAiC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CACF,CAAC;IACJ,CAAC;IACD,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACtF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,kCAAkC,EAClC,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,+BAA+B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CACF,CAAC;IACJ,CAAC;IACD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAC/C,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CACvE,CAAC;IACF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CACT,kBAAkB,CAChB,qCAAqC,EACrC,UAAU,EACV,WAAW,EACX,YAAY,QAAQ,CAAC,EAAE,kCAAkC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,MAAM;YACN,MAAM;YACN,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,IAAI,wBAAoE,CAAC;IACzE,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9C,wBAAwB,GAAG,IAAI,GAAG,CAChC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,EAAE;YACP,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAA0C;gBAC/D,CAAC,CAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAA0C;SACzE,CAAC,CACH,CAAC;IACJ,CAAC;SAAM,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,CAAC;QACjF,wBAAwB,GAAG,sBAAsB,CAAC,eAAe,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3C,wBAAwB,CAAC,GAAG,CAC1B,IAAI,CAAC,EAAE,EACP,QAAQ;gBACN,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAClB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,wBAAwB,GAAG,IAAI,GAAG,CAChC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAyC,CAAC,CAAC,CAC1F,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAA8B,CAAC;IACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACnF,MAAM,WAAW,GAAG,qBAAqB,CAAC;YACxC,MAAM;YACN,KAAK;YACL,OAAO;YACP,eAAe,EAAE,sBAAsB;YACvC,IAAI;SACL,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACrF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,MAAM,GAA8B;gBACxC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,YAAY,EAAE,CAAC;gBACf,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,MAAM,EAAE,SAAS;aAClB,CAAC;YACF,IAAI,WAAW,CAAC,YAAY;gBAAE,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YAC7E,IAAI,WAAW,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YAC9D,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;gBAClC,SAAS,EAAE,EAAE;gBACb,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,MAAM;QACN,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import { duplicateValues } from \"../utilities/collections.js\";\nimport type { CompiledPipeline } from \"./pipeline-compiler.js\";\nimport type { StepIds, TargetIds } from \"./pipeline-definition.js\";\nimport { decideStepDisposition } from \"./pipeline-disposition.js\";\nimport { pipelineDiagnostic } from \"./pipeline-errors.js\";\nimport { compiledStepGraph, liveStepGraph, type CompiledStepGraph } from \"./pipeline-graph.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { STEP_NESTED_PIPELINE, STEP_REMOTE } from \"./pipeline-step-metadata.js\";\nimport type {\n PipelineError,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRunControls,\n PipelineStepReport,\n PipelineStepSelectionReason,\n PipelineStepSkipReason,\n PipelineStepSkippedReport,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\n\nexport function stepToPlanStep<TOptions extends object>(\n step: AnyStep<TOptions>,\n selected: boolean,\n skipReason?: PipelineStepSkipReason,\n selectionReasons?: readonly PipelineStepSelectionReason[],\n graph: CompiledStepGraph<TOptions> = liveStepGraph(step)\n): PipelinePlanStep {\n const reasons = selectionReasons ?? [{ kind: \"all\" }];\n const planStep: PipelinePlanStep = {\n dependencies: graph.dependsOn.map((dep) => dep.id),\n description: step.description,\n dryRun: step.dryRun === \"skip\" ? \"skip\" : step.dryRun !== undefined ? \"custom\" : \"run\",\n id: step.id,\n name: step.name,\n optionalDependencies: graph.optionalDependsOn.map((dep) => dep.id),\n runtimeSkipPossible: step.skip !== undefined,\n selected,\n selectionReasons: reasons,\n skipAfterFailureOf: graph.skipAfterFailureOf.map((dep) => dep.id),\n skipReason,\n };\n if (step[STEP_NESTED_PIPELINE]) {\n planStep.nestedPipeline = {\n ...step[STEP_NESTED_PIPELINE],\n stepIds: [...step[STEP_NESTED_PIPELINE].stepIds],\n };\n }\n if (step[STEP_REMOTE]) {\n planStep.remote = { ...step[STEP_REMOTE] };\n }\n return planStep;\n}\n\nfunction addSelectionReason(\n reasonsByStepId: Map<string, PipelineStepSelectionReason[]>,\n stepId: string,\n reason: PipelineStepSelectionReason\n): void {\n const reasons = reasonsByStepId.get(stepId) ?? [];\n const reasonKey = JSON.stringify(reason);\n if (!reasons.some((candidate) => JSON.stringify(candidate) === reasonKey)) {\n reasons.push(reason);\n reasonsByStepId.set(stepId, reasons);\n }\n}\n\nfunction targetSelectionReasons<TOptions extends object>(\n targets: readonly AnyStep<TOptions>[],\n stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>\n): Map<string, PipelineStepSelectionReason[]> {\n const reasonsByStepId = new Map<string, PipelineStepSelectionReason[]>();\n\n for (const target of targets) {\n addSelectionReason(reasonsByStepId, target.id, { kind: \"target\", targetId: target.id });\n const expanded = new Set<AnyStep<TOptions>>();\n const includePrerequisites = (step: AnyStep<TOptions>): void => {\n if (expanded.has(step)) return;\n expanded.add(step);\n\n const graph = compiledStepGraph({ stepGraph }, step);\n for (const dependency of graph.dependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"required-dependency\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.skipAfterFailureOf) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"failure-gate\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.optionalDependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"optional-only\",\n targetId: target.id,\n });\n }\n };\n includePrerequisites(target);\n }\n\n return reasonsByStepId;\n}\n\nfunction selectsStep(reason: PipelineStepSelectionReason): boolean {\n return ![\"not-selected\", \"optional-only\", \"outside-target-closure\"].includes(reason.kind);\n}\n\nexport function buildPipelinePlan<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>,\n controls: PipelineRunControls<StepIds<TSteps>, TargetIds<TTargets>>\n): PipelinePlan {\n const dryRun = controls.dryRun === true;\n const steps = compiled.orderedSteps;\n const errors: PipelineError[] = [];\n\n const knownStepIds = new Set(compiled.stepIds);\n const declaredTargetIds = new Set(compiled.declaredTargets.map((target) => target.id));\n const requestedStepIds = controls.stepIds ?? [];\n const requestedTargets = controls.targets ?? [];\n const maxConcurrency = controls.maxConcurrency ?? 1;\n if (!Number.isInteger(maxConcurrency) || maxConcurrency < 1) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_RUN_CONCURRENCY_INVALID\",\n \"planning\",\n \"validation\",\n \"maxConcurrency must be a positive finite integer\"\n )\n );\n }\n if (controls.stepIds !== undefined && controls.targets !== undefined) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_SELECTION_CONFLICT\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} cannot combine exact stepIds filtering with dependency-aware targets`\n )\n );\n }\n if (controls.stepIds !== undefined && controls.stepIds.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty stepIds array; omit stepIds to run every step, or pass at least one step id`\n )\n );\n }\n if (controls.targets !== undefined && controls.targets.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty targets array; omit targets to run every step, or pass at least one target step id`\n )\n );\n }\n const duplicateRequestedStepIds = duplicateValues(requestedStepIds);\n if (duplicateRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate step ids: ${duplicateRequestedStepIds.join(\", \")}`\n )\n );\n }\n const unknownRequestedStepIds = requestedStepIds.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown step ids: ${unknownRequestedStepIds.join(\", \")}`\n )\n );\n }\n const duplicateTargets = duplicateValues(requestedTargets);\n if (duplicateTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate targets: ${duplicateTargets.join(\", \")}`\n )\n );\n }\n const unknownTargets = requestedTargets.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown targets: ${unknownTargets.join(\", \")}`\n )\n );\n }\n const undeclaredTargets = requestedTargets.filter(\n (stepId) => knownStepIds.has(stepId) && !declaredTargetIds.has(stepId)\n );\n if (undeclaredTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNDECLARED\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested undeclared targets: ${undeclaredTargets.join(\", \")}`\n )\n );\n }\n\n if (errors.length > 0) {\n return {\n dryRun,\n errors,\n ok: false,\n pipelineId: compiled.id,\n definition: compiled.definition,\n steps: [],\n };\n }\n\n let selectionReasonsByStepId: Map<string, PipelineStepSelectionReason[]>;\n if (controls.stepIds !== undefined) {\n const selectedIds = new Set(controls.stepIds);\n selectionReasonsByStepId = new Map(\n steps.map((step) => [\n step.id,\n selectedIds.has(step.id)\n ? ([{ kind: \"exact\" }] satisfies PipelineStepSelectionReason[])\n : ([{ kind: \"not-selected\" }] satisfies PipelineStepSelectionReason[]),\n ])\n );\n } else if (controls.targets !== undefined) {\n const stepsById = new Map(steps.map((step) => [step.id, step]));\n const selectedTargets = controls.targets.map((target) => stepsById.get(target)!);\n selectionReasonsByStepId = targetSelectionReasons(selectedTargets, compiled.stepGraph);\n for (const step of steps) {\n const reasons = selectionReasonsByStepId.get(step.id) ?? [];\n const selected = reasons.some(selectsStep);\n selectionReasonsByStepId.set(\n step.id,\n selected\n ? reasons.filter(selectsStep)\n : reasons.length > 0\n ? reasons\n : [{ kind: \"outside-target-closure\" }]\n );\n }\n } else {\n selectionReasonsByStepId = new Map(\n steps.map((step) => [step.id, [{ kind: \"all\" }] satisfies PipelineStepSelectionReason[]])\n );\n }\n const planSteps: PipelinePlanStep[] = [];\n // Accumulated planned skip/complete reports so later steps see the same\n // unmet-dependency chain as today's skipReason walk (not one empty map).\n const plannedReportsByStepId = new Map<string, PipelineStepReport>();\n for (const step of steps) {\n const selectionReasons = selectionReasonsByStepId.get(step.id)!;\n const selected = selectionReasons.some(selectsStep);\n const graph = compiledStepGraph(compiled, step);\n const planned = stepToPlanStep(step, selected, undefined, selectionReasons, graph);\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned,\n reportsByStepId: plannedReportsByStepId,\n step,\n });\n const skipReason = disposition.kind === \"skip\" ? disposition.reason : undefined;\n const planStep = stepToPlanStep(step, selected, skipReason, selectionReasons, graph);\n planSteps.push(planStep);\n if (disposition.kind === \"skip\") {\n const report: PipelineStepSkippedReport = {\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n reason: disposition.reason,\n status: \"skipped\",\n };\n if (disposition.dependencyId) report.dependencyId = disposition.dependencyId;\n if (disposition.message) report.message = disposition.message;\n plannedReportsByStepId.set(step.id, report);\n } else {\n // Synthetic complete so isRequiredDependencyMet treats will-run deps as met.\n plannedReportsByStepId.set(step.id, {\n attemptId: \"\",\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n startedAtMs: 0,\n status: \"completed\",\n });\n }\n }\n\n return {\n dryRun,\n errors,\n ok: errors.length === 0,\n pipelineId: compiled.id,\n definition: compiled.definition,\n steps: planSteps,\n };\n}\n\nexport function planStepById(plan: PipelinePlan): Map<string, PipelinePlanStep> {\n return new Map(plan.steps.map((step) => [step.id, step]));\n}\n"]}
1
+ {"version":3,"file":"pipeline-plan.js","sourceRoot":"","sources":["../../src/core/pipeline-plan.ts"],"names":[],"mappings":"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","sourcesContent":["import { duplicateValues } from \"../utilities/collections.js\";\nimport type { CompiledPipeline } from \"./pipeline-compiler.js\";\nimport type { StepIds, TargetIds } from \"./pipeline-definition.js\";\nimport { decideStepDisposition } from \"./pipeline-disposition.js\";\nimport { pipelineDiagnostic } from \"./pipeline-errors.js\";\nimport { compiledStepGraph, liveStepGraph, type CompiledStepGraph } from \"./pipeline-graph.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport { STEP_NESTED_PIPELINE, STEP_REMOTE } from \"./pipeline-step-metadata.js\";\nimport type {\n PipelineError,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRunControls,\n PipelineStepReport,\n PipelineStepSelectionReason,\n PipelineStepSkipReason,\n PipelineStepSkippedReport,\n StandardSchemaV1,\n} from \"./pipeline-types.js\";\n\nexport function stepToPlanStep<TOptions extends object>(\n step: AnyStep<TOptions>,\n selected: boolean,\n skipReason?: PipelineStepSkipReason,\n selectionReasons?: readonly PipelineStepSelectionReason[],\n graph: CompiledStepGraph<TOptions> = liveStepGraph(step)\n): PipelinePlanStep {\n const reasons = selectionReasons ?? [{ kind: \"all\" }];\n const planStep: PipelinePlanStep = {\n dependencies: graph.dependsOn.map((dep) => dep.id),\n description: step.description,\n ...(step.metadata === undefined ? {} : { metadata: step.metadata }),\n dryRun: step.dryRun === \"skip\" ? \"skip\" : step.dryRun !== undefined ? \"custom\" : \"run\",\n id: step.id,\n name: step.name,\n optionalDependencies: graph.optionalDependsOn.map((dep) => dep.id),\n runtimeSkipPossible: step.skip !== undefined,\n selected,\n selectionReasons: reasons,\n skipAfterFailureOf: graph.skipAfterFailureOf.map((dep) => dep.id),\n skipReason,\n };\n if (step[STEP_NESTED_PIPELINE]) {\n planStep.nestedPipeline = {\n ...step[STEP_NESTED_PIPELINE],\n stepIds: [...step[STEP_NESTED_PIPELINE].stepIds],\n };\n }\n if (step[STEP_REMOTE]) {\n planStep.remote = { ...step[STEP_REMOTE] };\n }\n return planStep;\n}\n\nfunction addSelectionReason(\n reasonsByStepId: Map<string, PipelineStepSelectionReason[]>,\n stepId: string,\n reason: PipelineStepSelectionReason\n): void {\n const reasons = reasonsByStepId.get(stepId) ?? [];\n const reasonKey = JSON.stringify(reason);\n if (!reasons.some((candidate) => JSON.stringify(candidate) === reasonKey)) {\n reasons.push(reason);\n reasonsByStepId.set(stepId, reasons);\n }\n}\n\nfunction targetSelectionReasons<TOptions extends object>(\n targets: readonly AnyStep<TOptions>[],\n stepGraph: ReadonlyMap<AnyStep, CompiledStepGraph>\n): Map<string, PipelineStepSelectionReason[]> {\n const reasonsByStepId = new Map<string, PipelineStepSelectionReason[]>();\n\n for (const target of targets) {\n addSelectionReason(reasonsByStepId, target.id, { kind: \"target\", targetId: target.id });\n const expanded = new Set<AnyStep<TOptions>>();\n const includePrerequisites = (step: AnyStep<TOptions>): void => {\n if (expanded.has(step)) return;\n expanded.add(step);\n\n const graph = compiledStepGraph({ stepGraph }, step);\n for (const dependency of graph.dependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"required-dependency\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.skipAfterFailureOf) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"failure-gate\",\n targetId: target.id,\n });\n includePrerequisites(dependency);\n }\n for (const dependency of graph.optionalDependsOn) {\n addSelectionReason(reasonsByStepId, dependency.id, {\n dependentId: step.id,\n kind: \"optional-only\",\n targetId: target.id,\n });\n }\n };\n includePrerequisites(target);\n }\n\n return reasonsByStepId;\n}\n\nfunction selectsStep(reason: PipelineStepSelectionReason): boolean {\n return ![\"not-selected\", \"optional-only\", \"outside-target-closure\"].includes(reason.kind);\n}\n\nexport function buildPipelinePlan<\n TSteps extends readonly AnyStep[],\n TResult,\n TTargets extends readonly TSteps[number][],\n TResultSchema extends StandardSchemaV1 | undefined,\n>(\n compiled: CompiledPipeline<TSteps, TResult, TTargets, TResultSchema>,\n controls: PipelineRunControls<StepIds<TSteps>, TargetIds<TTargets>>\n): PipelinePlan {\n const dryRun = controls.dryRun === true;\n const steps = compiled.orderedSteps;\n const errors: PipelineError[] = [];\n\n const knownStepIds = new Set(compiled.stepIds);\n const declaredTargetIds = new Set(compiled.declaredTargets.map((target) => target.id));\n const requestedStepIds = controls.stepIds ?? [];\n const requestedTargets = controls.targets ?? [];\n if (controls.cache !== undefined && ![\"use\", \"recompute\", \"bypass\"].includes(controls.cache)) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_RUN_CACHE_INVALID\",\n \"planning\",\n \"validation\",\n \"cache must be use, recompute, or bypass\"\n )\n );\n }\n const maxConcurrency = controls.maxConcurrency ?? 1;\n if (!Number.isInteger(maxConcurrency) || maxConcurrency < 1) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_RUN_CONCURRENCY_INVALID\",\n \"planning\",\n \"validation\",\n \"maxConcurrency must be a positive finite integer\"\n )\n );\n }\n if (controls.stepIds !== undefined && controls.targets !== undefined) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_SELECTION_CONFLICT\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} cannot combine exact stepIds filtering with dependency-aware targets`\n )\n );\n }\n if (controls.stepIds !== undefined && controls.stepIds.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty stepIds array; omit stepIds to run every step, or pass at least one step id`\n )\n );\n }\n if (controls.targets !== undefined && controls.targets.length === 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_EMPTY\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} received an empty targets array; omit targets to run every step, or pass at least one target step id`\n )\n );\n }\n const duplicateRequestedStepIds = duplicateValues(requestedStepIds);\n if (duplicateRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate step ids: ${duplicateRequestedStepIds.join(\", \")}`\n )\n );\n }\n const unknownRequestedStepIds = requestedStepIds.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownRequestedStepIds.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_STEP_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown step ids: ${unknownRequestedStepIds.join(\", \")}`\n )\n );\n }\n const duplicateTargets = duplicateValues(requestedTargets);\n if (duplicateTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_SELECTION_DUPLICATE\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested duplicate targets: ${duplicateTargets.join(\", \")}`\n )\n );\n }\n const unknownTargets = requestedTargets.filter((stepId) => !knownStepIds.has(stepId));\n if (unknownTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNKNOWN\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested unknown targets: ${unknownTargets.join(\", \")}`\n )\n );\n }\n const undeclaredTargets = requestedTargets.filter(\n (stepId) => knownStepIds.has(stepId) && !declaredTargetIds.has(stepId)\n );\n if (undeclaredTargets.length > 0) {\n errors.push(\n pipelineDiagnostic(\n \"TUBELESS_PLANNING_TARGET_UNDECLARED\",\n \"planning\",\n \"selection\",\n `Pipeline ${compiled.id} requested undeclared targets: ${undeclaredTargets.join(\", \")}`\n )\n );\n }\n\n if (errors.length > 0) {\n return {\n dryRun,\n errors,\n ok: false,\n pipelineId: compiled.id,\n definition: compiled.definition,\n steps: [],\n };\n }\n\n let selectionReasonsByStepId: Map<string, PipelineStepSelectionReason[]>;\n if (controls.stepIds !== undefined) {\n const selectedIds = new Set(controls.stepIds);\n selectionReasonsByStepId = new Map(\n steps.map((step) => [\n step.id,\n selectedIds.has(step.id)\n ? ([{ kind: \"exact\" }] satisfies PipelineStepSelectionReason[])\n : ([{ kind: \"not-selected\" }] satisfies PipelineStepSelectionReason[]),\n ])\n );\n } else if (controls.targets !== undefined) {\n const stepsById = new Map(steps.map((step) => [step.id, step]));\n const selectedTargets = controls.targets.map((target) => stepsById.get(target)!);\n selectionReasonsByStepId = targetSelectionReasons(selectedTargets, compiled.stepGraph);\n for (const step of steps) {\n const reasons = selectionReasonsByStepId.get(step.id) ?? [];\n const selected = reasons.some(selectsStep);\n selectionReasonsByStepId.set(\n step.id,\n selected\n ? reasons.filter(selectsStep)\n : reasons.length > 0\n ? reasons\n : [{ kind: \"outside-target-closure\" }]\n );\n }\n } else {\n selectionReasonsByStepId = new Map(\n steps.map((step) => [step.id, [{ kind: \"all\" }] satisfies PipelineStepSelectionReason[]])\n );\n }\n const planSteps: PipelinePlanStep[] = [];\n // Accumulated planned skip/complete reports so later steps see the same\n // unmet-dependency chain as today's skipReason walk (not one empty map).\n const plannedReportsByStepId = new Map<string, PipelineStepReport>();\n for (const step of steps) {\n const selectionReasons = selectionReasonsByStepId.get(step.id)!;\n const selected = selectionReasons.some(selectsStep);\n const graph = compiledStepGraph(compiled, step);\n const planned = stepToPlanStep(step, selected, undefined, selectionReasons, graph);\n const disposition = decideStepDisposition({\n dryRun,\n graph,\n planned,\n reportsByStepId: plannedReportsByStepId,\n step,\n });\n const skipReason = disposition.kind === \"skip\" ? disposition.reason : undefined;\n const planStep = stepToPlanStep(step, selected, skipReason, selectionReasons, graph);\n planSteps.push(planStep);\n if (disposition.kind === \"skip\") {\n const report: PipelineStepSkippedReport = {\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n reason: disposition.reason,\n status: \"skipped\",\n };\n if (disposition.dependencyId) report.dependencyId = disposition.dependencyId;\n if (disposition.message) report.message = disposition.message;\n plannedReportsByStepId.set(step.id, report);\n } else {\n // Synthetic complete so isRequiredDependencyMet treats will-run deps as met.\n plannedReportsByStepId.set(step.id, {\n attemptId: \"\",\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: 0,\n startedAtMs: 0,\n status: \"completed\",\n });\n }\n }\n\n return {\n dryRun,\n errors,\n ok: errors.length === 0,\n pipelineId: compiled.id,\n definition: compiled.definition,\n steps: planSteps,\n };\n}\n\nexport function planStepById(plan: PipelinePlan): Map<string, PipelinePlanStep> {\n return new Map(plan.steps.map((step) => [step.id, step]));\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { PipelineMetadata } from "../tracing/graph-metadata.js";
2
+ import type { PipelinePlan, PipelinePlanStep } from "./pipeline-types.js";
3
+ /** Discovery filters combine with AND; tags require every exact, case-sensitive tag. */
4
+ export interface PipelineStepQuery {
5
+ readonly tags?: readonly string[];
6
+ readonly owner?: string;
7
+ readonly domain?: string;
8
+ }
9
+ export declare function matchesStepQuery(metadata: PipelineMetadata | undefined, query: PipelineStepQuery): boolean;
10
+ /** Return matching plan steps in execution order without changing selection or including prerequisites. */
11
+ export declare function querySteps(plan: PipelinePlan, query?: PipelineStepQuery): PipelinePlanStep[];
@@ -0,0 +1,10 @@
1
+ export function matchesStepQuery(metadata, query) {
2
+ return ((query.owner === undefined || metadata?.owner === query.owner) &&
3
+ (query.domain === undefined || metadata?.domain === query.domain) &&
4
+ (query.tags === undefined || query.tags.every((tag) => metadata?.tags?.includes(tag))));
5
+ }
6
+ /** Return matching plan steps in execution order without changing selection or including prerequisites. */
7
+ export function querySteps(plan, query = {}) {
8
+ return plan.steps.filter((step) => matchesStepQuery(step.metadata, query));
9
+ }
10
+ //# sourceMappingURL=pipeline-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-query.js","sourceRoot":"","sources":["../../src/core/pipeline-query.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,gBAAgB,CAC9B,QAAsC,EACtC,KAAwB;IAExB,OAAO,CACL,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;QAC9D,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC;QACjE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CACvF,CAAC;AACJ,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,UAAU,CAAC,IAAkB,EAAE,KAAK,GAAsB,EAAE;IAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC","sourcesContent":["import type { PipelineMetadata } from \"../tracing/graph-metadata.js\";\nimport type { PipelinePlan, PipelinePlanStep } from \"./pipeline-types.js\";\n\n/** Discovery filters combine with AND; tags require every exact, case-sensitive tag. */\nexport interface PipelineStepQuery {\n readonly tags?: readonly string[];\n readonly owner?: string;\n readonly domain?: string;\n}\n\nexport function matchesStepQuery(\n metadata: PipelineMetadata | undefined,\n query: PipelineStepQuery\n): boolean {\n return (\n (query.owner === undefined || metadata?.owner === query.owner) &&\n (query.domain === undefined || metadata?.domain === query.domain) &&\n (query.tags === undefined || query.tags.every((tag) => metadata?.tags?.includes(tag)))\n );\n}\n\n/** Return matching plan steps in execution order without changing selection or including prerequisites. */\nexport function querySteps(plan: PipelinePlan, query: PipelineStepQuery = {}): PipelinePlanStep[] {\n return plan.steps.filter((step) => matchesStepQuery(step.metadata, query));\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { PipelineLifecycleObserver } from "./lifecycle.js";
2
2
  import type { PipelineError, PipelinePlan, PipelinePlanStep, PipelineRun, PipelineStepProgress, PipelineStepReport, PipelineStepSkipReason } from "./pipeline-types.js";
3
3
  export interface PipelineStepAttempt {
4
- outputSource?: "override";
4
+ outputSource?: "override" | "cache";
5
5
  attemptId: string;
6
6
  startedAtMs: number;
7
7
  }
@@ -27,7 +27,7 @@ export declare class PipelineRunState<TResult> {
27
27
  get reportsByStepId(): ReadonlyMap<string, PipelineStepReport>;
28
28
  start(plan: PipelinePlan, targetIds: readonly string[]): void;
29
29
  planStep(step: PipelinePlanStep): void;
30
- beginAttempt(step: PipelinePlanStep, startedAtMs?: number, outputSource?: "override"): PipelineStepAttempt;
30
+ beginAttempt(step: PipelinePlanStep, startedAtMs?: number, outputSource?: "override" | "cache"): PipelineStepAttempt;
31
31
  reportProgress(step: PipelinePlanStep, attempt: PipelineStepAttempt, progress: PipelineStepProgress): void;
32
32
  completeStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, value: unknown): void;
33
33
  skipStep(step: PipelinePlanStep, input: {
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-run-state.js","sourceRoot":"","sources":["../../src/core/pipeline-run-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { isCancellationOnly } from \"./pipeline-execution-error.js\";\nimport type { PipelineLifecycleObserver } from \"./lifecycle.js\";\nimport { RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport type {\n PipelineError,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunStatus,\n PipelineStepCancelledReport,\n PipelineStepCompleteReport,\n PipelineStepFailedReport,\n PipelineStepProgress,\n PipelineStepReport,\n PipelineStepSkipReason,\n PipelineStepSkippedReport,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\n\nexport interface PipelineStepAttempt {\n outputSource?: \"override\";\n attemptId: string;\n startedAtMs: number;\n}\n\ntype RunPhase = \"created\" | \"finalizing\" | \"finished\" | \"running\";\n\ntype StepTransitionEffects = {\n error?: { record: boolean; value: PipelineError };\n output?: { value: unknown };\n};\n\ntype PipelineFinalization<TResult> =\n | { finalized: false; value: undefined }\n | { finalized: true; value: TResult };\n\nfunction terminalRunStatus(errors: readonly PipelineError[]): PipelineRunStatus {\n if (errors.length === 0) return \"completed\";\n return isCancellationOnly(errors) ? \"cancelled\" : \"failed\";\n}\n\nfunction stepReportFromStatus(\n event: Exclude<PipelineStepStatus, { status: \"planned\" | \"running\" }>\n): PipelineStepReport {\n const base = {\n id: event.id,\n name: event.name,\n description: event.description,\n finishedAtMs: event.finishedAtMs,\n ...(event.outputSource ? { outputSource: event.outputSource } : {}),\n };\n switch (event.status) {\n case \"completed\":\n return {\n ...base,\n attemptId: event.attemptId,\n startedAtMs: event.startedAtMs,\n status: \"completed\",\n };\n case \"failed\":\n return {\n ...base,\n attemptId: event.attemptId,\n error: event.error,\n startedAtMs: event.startedAtMs,\n status: \"failed\",\n };\n case \"cancelled\": {\n const report: PipelineStepCancelledReport = {\n ...base,\n error: event.error,\n status: \"cancelled\",\n };\n if (event.attemptId) report.attemptId = event.attemptId;\n if (event.startedAtMs !== undefined) report.startedAtMs = event.startedAtMs;\n return report;\n }\n case \"skipped\": {\n const report: PipelineStepSkippedReport = {\n ...base,\n reason: event.reason,\n status: \"skipped\",\n };\n if (event.attemptId) report.attemptId = event.attemptId;\n if (event.startedAtMs !== undefined) report.startedAtMs = event.startedAtMs;\n if (event.dependencyId) report.dependencyId = event.dependencyId;\n if (event.message) report.message = event.message;\n return report;\n }\n }\n}\n\nexport class PipelineRunState<TResult> {\n readonly #currentStepStatuses = new Map<string, PipelineStepStatus[\"status\"]>();\n readonly #errors: PipelineError[] = [];\n readonly #runErrors = new Set<PipelineError>();\n readonly #outputs = new Map<string, unknown>();\n readonly #stepOrder = new Map<string, number>();\n readonly #reportsByStepId = new Map<string, PipelineStepReport>();\n #definitionIdentity: PipelineRun[\"definitionIdentity\"];\n #finalizationAttempted = false;\n #finalization: PipelineFinalization<TResult> = { finalized: false, value: undefined };\n #nextAttemptSequence = 0;\n #phase: RunPhase = \"created\";\n\n constructor(\n readonly pipelineId: string,\n readonly dryRun: boolean,\n readonly startedAtMs: number,\n readonly identity: { correlationId?: string; parentRunId?: string; runId: string },\n readonly now: () => number,\n readonly lifecycle: Pick<\n PipelineLifecycleObserver,\n | \"pipelineStart\"\n | \"stepStatus\"\n | \"finalizeStart\"\n | \"finalizeComplete\"\n | \"finalizeError\"\n | \"pipelineComplete\"\n | \"flush\"\n >\n ) {}\n\n get errors(): readonly PipelineError[] {\n return this.#errors;\n }\n\n get outputs(): ReadonlyMap<string, unknown> {\n return this.#outputs;\n }\n\n get reportsByStepId(): ReadonlyMap<string, PipelineStepReport> {\n return this.#reportsByStepId;\n }\n\n start(plan: PipelinePlan, targetIds: readonly string[]): void {\n this.#expectPhase(\"created\");\n this.#phase = \"running\";\n this.#definitionIdentity = plan.definition?.identity;\n plan.steps.forEach((step, index) => this.#stepOrder.set(step.id, index));\n this.lifecycle.pipelineStart(plan, targetIds);\n }\n\n planStep(step: PipelinePlanStep): void {\n this.#applyStepStatus({ pipelineId: this.pipelineId, status: \"planned\", step });\n }\n\n beginAttempt(\n step: PipelinePlanStep,\n startedAtMs = this.now(),\n outputSource?: \"override\"\n ): PipelineStepAttempt {\n const attempt = {\n attemptId: `${this.identity.runId}:attempt:${(this.#nextAttemptSequence += 1).toString(36)}`,\n startedAtMs,\n ...(outputSource ? { outputSource } : {}),\n };\n this.#applyStepStatus({\n attemptId: attempt.attemptId,\n ...(attempt.outputSource ? { outputSource: attempt.outputSource } : {}),\n pipelineId: this.pipelineId,\n status: \"running\",\n step,\n });\n return attempt;\n }\n\n reportProgress(\n step: PipelinePlanStep,\n attempt: PipelineStepAttempt,\n progress: PipelineStepProgress\n ): void {\n this.#applyStepStatus({\n attemptId: attempt.attemptId,\n ...(attempt.outputSource ? { outputSource: attempt.outputSource } : {}),\n pipelineId: this.pipelineId,\n progress,\n status: \"running\",\n step,\n });\n }\n\n completeStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, value: unknown): void {\n const report: PipelineStepCompleteReport = {\n ...attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: this.now(),\n status: \"completed\",\n };\n this.#applyStepStatus({ ...report, pipelineId: this.pipelineId, step }, { output: { value } });\n }\n\n skipStep(\n step: PipelinePlanStep,\n input: {\n attempt?: PipelineStepAttempt;\n dependencyId?: string;\n message?: string;\n output?: { value: unknown };\n reason: PipelineStepSkipReason;\n }\n ): void {\n const report: PipelineStepSkippedReport = {\n ...input.attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: this.now(),\n reason: input.reason,\n status: \"skipped\",\n };\n if (input.dependencyId) report.dependencyId = input.dependencyId;\n if (input.message) report.message = input.message;\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n input.output ? { output: input.output } : undefined\n );\n }\n\n failStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, error: PipelineError): void {\n if (error.kind === \"cancellation\") {\n this.cancelStep(step, error, true, attempt);\n return;\n }\n const report: PipelineStepFailedReport = {\n ...attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n error,\n finishedAtMs: this.now(),\n status: \"failed\",\n };\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n { error: { record: true, value: error } }\n );\n }\n\n cancelStep(\n step: PipelinePlanStep,\n error: PipelineError,\n recordError: boolean,\n attempt?: PipelineStepAttempt\n ): void {\n const report: PipelineStepCancelledReport = {\n ...attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n error,\n finishedAtMs: this.now(),\n status: \"cancelled\",\n };\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n { error: { record: recordError, value: error } }\n );\n }\n\n recordRunErrors(errors: readonly PipelineError[]): void {\n this.#expectPhase(\"running\");\n for (const error of errors) this.#runErrors.add(error);\n this.#errors.push(...errors);\n }\n\n beginFinalization(): void {\n this.#expectPhase(\"running\");\n this.#expectAllStepsTerminal();\n if (this.#finalizationAttempted) throw new Error(\"Pipeline finalization already attempted\");\n this.#finalizationAttempted = true;\n this.#phase = \"finalizing\";\n this.lifecycle.finalizeStart();\n }\n\n completeFinalization(value: TResult, durationMs: number): void {\n this.#expectPhase(\"finalizing\");\n this.#finalization = { finalized: true, value };\n this.#phase = \"running\";\n this.lifecycle.finalizeComplete(durationMs, value);\n }\n\n failFinalization(error: PipelineError, durationMs: number): void {\n this.#expectPhase(\"finalizing\");\n this.#errors.push(error);\n this.#phase = \"running\";\n this.lifecycle.finalizeError(error, durationMs);\n }\n\n async finish(): Promise<PipelineRun<TResult>> {\n this.#expectPhase(\"running\");\n this.#expectAllStepsTerminal();\n this.#phase = \"finished\";\n const errorOrder = (error: PipelineError): number => {\n // A run-level diagnostic may identify a step without becoming a step failure.\n if (this.#runErrors.has(error)) return -1;\n if (error.phase === \"finalization\") return this.#stepOrder.size;\n return error.stepId === undefined ? -1 : (this.#stepOrder.get(error.stepId) ?? -1);\n };\n // Live observations retain event order; only the finished record is ordered by plan.\n const errors = [...this.#errors].sort((left, right) => errorOrder(left) - errorOrder(right));\n const steps = [...this.#reportsByStepId.values()].sort(\n (left, right) => this.#stepOrder.get(left.id)! - this.#stepOrder.get(right.id)!\n );\n const result: PipelineRun<TResult> = {\n pipelineId: this.pipelineId,\n dryRun: this.dryRun,\n errors,\n finishedAtMs: this.now(),\n runId: this.identity.runId,\n startedAtMs: this.startedAtMs,\n status: terminalRunStatus(this.#errors),\n steps,\n version: RUN_MODEL_VERSION,\n ...this.#finalization,\n };\n if (this.#definitionIdentity) result.definitionIdentity = this.#definitionIdentity;\n if (this.identity.correlationId !== undefined) {\n result.correlationId = this.identity.correlationId;\n }\n if (this.identity.parentRunId) result.parentRunId = this.identity.parentRunId;\n this.lifecycle.pipelineComplete(result);\n await this.lifecycle.flush();\n return result;\n }\n\n #applyStepStatus(event: PipelineStepStatus, effects: StepTransitionEffects = {}): void {\n this.#expectPhase(\"running\");\n const previous = this.#currentStepStatuses.get(event.step.id);\n const valid =\n (previous === undefined && event.status === \"planned\") ||\n (previous === \"planned\" &&\n (event.status === \"running\" ||\n event.status === \"skipped\" ||\n event.status === \"cancelled\")) ||\n (previous === \"running\" &&\n (event.status === \"running\" ||\n event.status === \"completed\" ||\n event.status === \"skipped\" ||\n event.status === \"cancelled\" ||\n event.status === \"failed\"));\n if (!valid) {\n throw new Error(\n `Invalid step status transition for ${event.step.id}: ${previous ?? \"unobserved\"} -> ${event.status}`\n );\n }\n\n this.#currentStepStatuses.set(event.step.id, event.status);\n if (event.status !== \"planned\" && event.status !== \"running\") {\n const report = stepReportFromStatus(event);\n this.#reportsByStepId.set(event.step.id, report);\n }\n if (effects.output) this.#outputs.set(event.step.id, effects.output.value);\n if (effects.error?.record) this.#errors.push(effects.error.value);\n this.lifecycle.stepStatus(event);\n }\n\n #expectPhase(expected: RunPhase): void {\n if (this.#phase !== expected) {\n throw new Error(\n `Invalid pipeline run transition: expected ${expected}, found ${this.#phase}`\n );\n }\n }\n\n #expectAllStepsTerminal(): void {\n for (const [stepId, status] of this.#currentStepStatuses) {\n if (status === \"planned\" || status === \"running\") {\n throw new Error(`Cannot finish pipeline run while step ${stepId} is ${status}`);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"pipeline-run-state.js","sourceRoot":"","sources":["../../src/core/pipeline-run-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { isCancellationOnly } from \"./pipeline-execution-error.js\";\nimport type { PipelineLifecycleObserver } from \"./lifecycle.js\";\nimport { RUN_MODEL_VERSION } from \"./pipeline-ids.js\";\nimport type {\n PipelineError,\n PipelinePlan,\n PipelinePlanStep,\n PipelineRun,\n PipelineRunStatus,\n PipelineStepCancelledReport,\n PipelineStepCompleteReport,\n PipelineStepFailedReport,\n PipelineStepProgress,\n PipelineStepReport,\n PipelineStepSkipReason,\n PipelineStepSkippedReport,\n PipelineStepStatus,\n} from \"./pipeline-types.js\";\n\nexport interface PipelineStepAttempt {\n outputSource?: \"override\" | \"cache\";\n attemptId: string;\n startedAtMs: number;\n}\n\ntype RunPhase = \"created\" | \"finalizing\" | \"finished\" | \"running\";\n\ntype StepTransitionEffects = {\n error?: { record: boolean; value: PipelineError };\n output?: { value: unknown };\n};\n\ntype PipelineFinalization<TResult> =\n | { finalized: false; value: undefined }\n | { finalized: true; value: TResult };\n\nfunction terminalRunStatus(errors: readonly PipelineError[]): PipelineRunStatus {\n if (errors.length === 0) return \"completed\";\n return isCancellationOnly(errors) ? \"cancelled\" : \"failed\";\n}\n\nfunction stepReportFromStatus(\n event: Exclude<PipelineStepStatus, { status: \"planned\" | \"running\" }>\n): PipelineStepReport {\n const base = {\n id: event.id,\n name: event.name,\n description: event.description,\n finishedAtMs: event.finishedAtMs,\n ...(event.outputSource ? { outputSource: event.outputSource } : {}),\n };\n switch (event.status) {\n case \"completed\":\n return {\n ...base,\n attemptId: event.attemptId,\n startedAtMs: event.startedAtMs,\n status: \"completed\",\n };\n case \"failed\":\n return {\n ...base,\n attemptId: event.attemptId,\n error: event.error,\n startedAtMs: event.startedAtMs,\n status: \"failed\",\n };\n case \"cancelled\": {\n const report: PipelineStepCancelledReport = {\n ...base,\n error: event.error,\n status: \"cancelled\",\n };\n if (event.attemptId) report.attemptId = event.attemptId;\n if (event.startedAtMs !== undefined) report.startedAtMs = event.startedAtMs;\n return report;\n }\n case \"skipped\": {\n const report: PipelineStepSkippedReport = {\n ...base,\n reason: event.reason,\n status: \"skipped\",\n };\n if (event.attemptId) report.attemptId = event.attemptId;\n if (event.startedAtMs !== undefined) report.startedAtMs = event.startedAtMs;\n if (event.dependencyId) report.dependencyId = event.dependencyId;\n if (event.message) report.message = event.message;\n return report;\n }\n }\n}\n\nexport class PipelineRunState<TResult> {\n readonly #currentStepStatuses = new Map<string, PipelineStepStatus[\"status\"]>();\n readonly #errors: PipelineError[] = [];\n readonly #runErrors = new Set<PipelineError>();\n readonly #outputs = new Map<string, unknown>();\n readonly #stepOrder = new Map<string, number>();\n readonly #reportsByStepId = new Map<string, PipelineStepReport>();\n #definitionIdentity: PipelineRun[\"definitionIdentity\"];\n #finalizationAttempted = false;\n #finalization: PipelineFinalization<TResult> = { finalized: false, value: undefined };\n #nextAttemptSequence = 0;\n #phase: RunPhase = \"created\";\n\n constructor(\n readonly pipelineId: string,\n readonly dryRun: boolean,\n readonly startedAtMs: number,\n readonly identity: { correlationId?: string; parentRunId?: string; runId: string },\n readonly now: () => number,\n readonly lifecycle: Pick<\n PipelineLifecycleObserver,\n | \"pipelineStart\"\n | \"stepStatus\"\n | \"finalizeStart\"\n | \"finalizeComplete\"\n | \"finalizeError\"\n | \"pipelineComplete\"\n | \"flush\"\n >\n ) {}\n\n get errors(): readonly PipelineError[] {\n return this.#errors;\n }\n\n get outputs(): ReadonlyMap<string, unknown> {\n return this.#outputs;\n }\n\n get reportsByStepId(): ReadonlyMap<string, PipelineStepReport> {\n return this.#reportsByStepId;\n }\n\n start(plan: PipelinePlan, targetIds: readonly string[]): void {\n this.#expectPhase(\"created\");\n this.#phase = \"running\";\n this.#definitionIdentity = plan.definition?.identity;\n plan.steps.forEach((step, index) => this.#stepOrder.set(step.id, index));\n this.lifecycle.pipelineStart(plan, targetIds);\n }\n\n planStep(step: PipelinePlanStep): void {\n this.#applyStepStatus({ pipelineId: this.pipelineId, status: \"planned\", step });\n }\n\n beginAttempt(\n step: PipelinePlanStep,\n startedAtMs = this.now(),\n outputSource?: \"override\" | \"cache\"\n ): PipelineStepAttempt {\n const attempt = {\n attemptId: `${this.identity.runId}:attempt:${(this.#nextAttemptSequence += 1).toString(36)}`,\n startedAtMs,\n ...(outputSource ? { outputSource } : {}),\n };\n this.#applyStepStatus({\n attemptId: attempt.attemptId,\n ...(attempt.outputSource ? { outputSource: attempt.outputSource } : {}),\n pipelineId: this.pipelineId,\n status: \"running\",\n step,\n });\n return attempt;\n }\n\n reportProgress(\n step: PipelinePlanStep,\n attempt: PipelineStepAttempt,\n progress: PipelineStepProgress\n ): void {\n this.#applyStepStatus({\n attemptId: attempt.attemptId,\n ...(attempt.outputSource ? { outputSource: attempt.outputSource } : {}),\n pipelineId: this.pipelineId,\n progress,\n status: \"running\",\n step,\n });\n }\n\n completeStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, value: unknown): void {\n const report: PipelineStepCompleteReport = {\n ...attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: this.now(),\n status: \"completed\",\n };\n this.#applyStepStatus({ ...report, pipelineId: this.pipelineId, step }, { output: { value } });\n }\n\n skipStep(\n step: PipelinePlanStep,\n input: {\n attempt?: PipelineStepAttempt;\n dependencyId?: string;\n message?: string;\n output?: { value: unknown };\n reason: PipelineStepSkipReason;\n }\n ): void {\n const report: PipelineStepSkippedReport = {\n ...input.attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n finishedAtMs: this.now(),\n reason: input.reason,\n status: \"skipped\",\n };\n if (input.dependencyId) report.dependencyId = input.dependencyId;\n if (input.message) report.message = input.message;\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n input.output ? { output: input.output } : undefined\n );\n }\n\n failStep(step: PipelinePlanStep, attempt: PipelineStepAttempt, error: PipelineError): void {\n if (error.kind === \"cancellation\") {\n this.cancelStep(step, error, true, attempt);\n return;\n }\n const report: PipelineStepFailedReport = {\n ...attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n error,\n finishedAtMs: this.now(),\n status: \"failed\",\n };\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n { error: { record: true, value: error } }\n );\n }\n\n cancelStep(\n step: PipelinePlanStep,\n error: PipelineError,\n recordError: boolean,\n attempt?: PipelineStepAttempt\n ): void {\n const report: PipelineStepCancelledReport = {\n ...attempt,\n id: step.id,\n name: step.name,\n description: step.description,\n error,\n finishedAtMs: this.now(),\n status: \"cancelled\",\n };\n this.#applyStepStatus(\n { ...report, pipelineId: this.pipelineId, step },\n { error: { record: recordError, value: error } }\n );\n }\n\n recordRunErrors(errors: readonly PipelineError[]): void {\n this.#expectPhase(\"running\");\n for (const error of errors) this.#runErrors.add(error);\n this.#errors.push(...errors);\n }\n\n beginFinalization(): void {\n this.#expectPhase(\"running\");\n this.#expectAllStepsTerminal();\n if (this.#finalizationAttempted) throw new Error(\"Pipeline finalization already attempted\");\n this.#finalizationAttempted = true;\n this.#phase = \"finalizing\";\n this.lifecycle.finalizeStart();\n }\n\n completeFinalization(value: TResult, durationMs: number): void {\n this.#expectPhase(\"finalizing\");\n this.#finalization = { finalized: true, value };\n this.#phase = \"running\";\n this.lifecycle.finalizeComplete(durationMs, value);\n }\n\n failFinalization(error: PipelineError, durationMs: number): void {\n this.#expectPhase(\"finalizing\");\n this.#errors.push(error);\n this.#phase = \"running\";\n this.lifecycle.finalizeError(error, durationMs);\n }\n\n async finish(): Promise<PipelineRun<TResult>> {\n this.#expectPhase(\"running\");\n this.#expectAllStepsTerminal();\n this.#phase = \"finished\";\n const errorOrder = (error: PipelineError): number => {\n // A run-level diagnostic may identify a step without becoming a step failure.\n if (this.#runErrors.has(error)) return -1;\n if (error.phase === \"finalization\") return this.#stepOrder.size;\n return error.stepId === undefined ? -1 : (this.#stepOrder.get(error.stepId) ?? -1);\n };\n // Live observations retain event order; only the finished record is ordered by plan.\n const errors = [...this.#errors].sort((left, right) => errorOrder(left) - errorOrder(right));\n const steps = [...this.#reportsByStepId.values()].sort(\n (left, right) => this.#stepOrder.get(left.id)! - this.#stepOrder.get(right.id)!\n );\n const result: PipelineRun<TResult> = {\n pipelineId: this.pipelineId,\n dryRun: this.dryRun,\n errors,\n finishedAtMs: this.now(),\n runId: this.identity.runId,\n startedAtMs: this.startedAtMs,\n status: terminalRunStatus(this.#errors),\n steps,\n version: RUN_MODEL_VERSION,\n ...this.#finalization,\n };\n if (this.#definitionIdentity) result.definitionIdentity = this.#definitionIdentity;\n if (this.identity.correlationId !== undefined) {\n result.correlationId = this.identity.correlationId;\n }\n if (this.identity.parentRunId) result.parentRunId = this.identity.parentRunId;\n this.lifecycle.pipelineComplete(result);\n await this.lifecycle.flush();\n return result;\n }\n\n #applyStepStatus(event: PipelineStepStatus, effects: StepTransitionEffects = {}): void {\n this.#expectPhase(\"running\");\n const previous = this.#currentStepStatuses.get(event.step.id);\n const valid =\n (previous === undefined && event.status === \"planned\") ||\n (previous === \"planned\" &&\n (event.status === \"running\" ||\n event.status === \"skipped\" ||\n event.status === \"cancelled\")) ||\n (previous === \"running\" &&\n (event.status === \"running\" ||\n event.status === \"completed\" ||\n event.status === \"skipped\" ||\n event.status === \"cancelled\" ||\n event.status === \"failed\"));\n if (!valid) {\n throw new Error(\n `Invalid step status transition for ${event.step.id}: ${previous ?? \"unobserved\"} -> ${event.status}`\n );\n }\n\n this.#currentStepStatuses.set(event.step.id, event.status);\n if (event.status !== \"planned\" && event.status !== \"running\") {\n const report = stepReportFromStatus(event);\n this.#reportsByStepId.set(event.step.id, report);\n }\n if (effects.output) this.#outputs.set(event.step.id, effects.output.value);\n if (effects.error?.record) this.#errors.push(effects.error.value);\n this.lifecycle.stepStatus(event);\n }\n\n #expectPhase(expected: RunPhase): void {\n if (this.#phase !== expected) {\n throw new Error(\n `Invalid pipeline run transition: expected ${expected}, found ${this.#phase}`\n );\n }\n }\n\n #expectAllStepsTerminal(): void {\n for (const [stepId, status] of this.#currentStepStatuses) {\n if (status === \"planned\" || status === \"running\") {\n throw new Error(`Cannot finish pipeline run while step ${stepId} is ${status}`);\n }\n }\n }\n}\n"]}
@@ -10,6 +10,8 @@ export declare function evaluateStepSkip<TOptions extends object>(step: AnyStep<
10
10
  export declare function validateStepOutput<TOptions extends object>(step: AnyStep<TOptions>, value: unknown, boundary: string): Promise<unknown>;
11
11
  export declare function executeStepAttempt<TOptions extends object>(input: {
12
12
  attemptId: string;
13
+ pipelineId: string;
14
+ onCacheHit?(): void;
13
15
  context: PipelineExecutionContext<TOptions>;
14
16
  dryRun: boolean;
15
17
  inputs: Record<string, unknown>;
@@ -1,3 +1,5 @@
1
+ import { STEP_CACHE } from "./pipeline-step-metadata.js";
2
+ import { executeWithStepCache } from "./pipeline-cache.js";
1
3
  import { artifactRecordSchema } from "../tracing/artifact-metadata.js";
2
4
  import { validateStandardSchema } from "./pipeline-validation.js";
3
5
  function normalizeStepSkipDecision(decision) {
@@ -45,16 +47,29 @@ export async function executeStepAttempt(input) {
45
47
  input.onProgress(progress);
46
48
  },
47
49
  };
48
- let output;
49
- try {
50
- output =
51
- input.dryRun && typeof step.dryRun === "function"
50
+ const run = async () => {
51
+ try {
52
+ return input.dryRun && typeof step.dryRun === "function"
52
53
  ? await step.dryRun(input.inputs, stepContext)
53
54
  : await step.run(input.inputs, stepContext);
54
- }
55
- finally {
56
- acceptsReports = false;
57
- }
58
- return validateStepOutput(step, output, input.outputBoundary);
55
+ }
56
+ finally {
57
+ acceptsReports = false;
58
+ }
59
+ };
60
+ return executeWithStepCache({
61
+ cache: step[STEP_CACHE],
62
+ pipelineId: input.pipelineId,
63
+ stepId: step.id,
64
+ inputs: input.inputs,
65
+ context: input.context,
66
+ run,
67
+ onArtifact: (record) => input.onArtifact?.(record, false),
68
+ validate: (value) => validateStepOutput(step, value, input.outputBoundary),
69
+ onHit: () => {
70
+ acceptsReports = false;
71
+ input.onCacheHit?.();
72
+ },
73
+ });
59
74
  }
60
75
  //# sourceMappingURL=pipeline-step-executor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-step-executor.js","sourceRoot":"","sources":["../../src/core/pipeline-step-executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { artifactRecordSchema, type ArtifactRecord } from \"../tracing/artifact-metadata.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport type {\n PipelineExecutionContext,\n PipelineLogger,\n PipelineStepProgress,\n StepSkipDecision,\n} from \"./pipeline-types.js\";\nimport type { PipelineTraceAttributes } from \"../tracing/tracing-contracts.js\";\nimport { validateStandardSchema } from \"./pipeline-validation.js\";\n\nexport interface NormalizedStepSkipDecision {\n reason: string;\n value?: unknown;\n}\n\nfunction normalizeStepSkipDecision(decision: StepSkipDecision): NormalizedStepSkipDecision | null {\n if (decision == null || decision === false) return null;\n if (typeof decision === \"string\") {\n const reason = decision.trim();\n return reason.length > 0 ? { reason } : null;\n }\n if (typeof decision === \"object\" && typeof decision.reason === \"string\") {\n const reason = decision.reason.trim();\n if (reason.length === 0) return null;\n return { reason, value: decision.value };\n }\n return null;\n}\n\nexport async function evaluateStepSkip<TOptions extends object>(\n step: AnyStep<TOptions>,\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<TOptions>\n): Promise<NormalizedStepSkipDecision | null> {\n if (typeof step.skip !== \"function\") return null;\n return normalizeStepSkipDecision(await step.skip(inputs, context));\n}\n\nexport async function validateStepOutput<TOptions extends object>(\n step: AnyStep<TOptions>,\n value: unknown,\n boundary: string\n): Promise<unknown> {\n return step.outputSchema\n ? validateStandardSchema(step.outputSchema, value, boundary)\n : Promise.resolve(value);\n}\n\nexport async function executeStepAttempt<TOptions extends object>(input: {\n attemptId: string;\n context: PipelineExecutionContext<TOptions>;\n dryRun: boolean;\n inputs: Record<string, unknown>;\n log: PipelineLogger;\n onArtifact?(record: ArtifactRecord, preview: boolean): void;\n onProgress(progress: PipelineStepProgress): void;\n onReportAttempt(attempt: number, attributes?: PipelineTraceAttributes): void;\n outputBoundary: string;\n step: AnyStep<TOptions>;\n}): Promise<unknown> {\n const { step } = input;\n let acceptsReports = true;\n const stepContext = {\n ...input.context,\n recordArtifact: (record: ArtifactRecord) => {\n if (!acceptsReports) return;\n const snapshot = artifactRecordSchema.decode(record, \"artifact record\");\n const preview =\n input.dryRun && (typeof step.dryRun === \"function\" || snapshot.operation === \"write\");\n input.onArtifact?.(snapshot, preview);\n },\n attemptId: input.attemptId,\n log: input.log,\n reportAttempt: input.onReportAttempt,\n reportProgress: (progress: PipelineStepProgress) => {\n if (acceptsReports) input.onProgress(progress);\n },\n };\n let output: unknown;\n try {\n output =\n input.dryRun && typeof step.dryRun === \"function\"\n ? await step.dryRun(input.inputs, stepContext)\n : await step.run(input.inputs, stepContext);\n } finally {\n acceptsReports = false;\n }\n return validateStepOutput(step, output, input.outputBoundary);\n}\n"]}
1
+ {"version":3,"file":"pipeline-step-executor.js","sourceRoot":"","sources":["../../src/core/pipeline-step-executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { STEP_CACHE } from \"./pipeline-step-metadata.js\";\nimport { executeWithStepCache } from \"./pipeline-cache.js\";\nimport { artifactRecordSchema, type ArtifactRecord } from \"../tracing/artifact-metadata.js\";\nimport type { AnyStep } from \"./pipeline-steps.js\";\nimport type {\n PipelineExecutionContext,\n PipelineLogger,\n PipelineStepProgress,\n StepSkipDecision,\n} from \"./pipeline-types.js\";\nimport type { PipelineTraceAttributes } from \"../tracing/tracing-contracts.js\";\nimport { validateStandardSchema } from \"./pipeline-validation.js\";\n\nexport interface NormalizedStepSkipDecision {\n reason: string;\n value?: unknown;\n}\n\nfunction normalizeStepSkipDecision(decision: StepSkipDecision): NormalizedStepSkipDecision | null {\n if (decision == null || decision === false) return null;\n if (typeof decision === \"string\") {\n const reason = decision.trim();\n return reason.length > 0 ? { reason } : null;\n }\n if (typeof decision === \"object\" && typeof decision.reason === \"string\") {\n const reason = decision.reason.trim();\n if (reason.length === 0) return null;\n return { reason, value: decision.value };\n }\n return null;\n}\n\nexport async function evaluateStepSkip<TOptions extends object>(\n step: AnyStep<TOptions>,\n inputs: Record<string, unknown>,\n context: PipelineExecutionContext<TOptions>\n): Promise<NormalizedStepSkipDecision | null> {\n if (typeof step.skip !== \"function\") return null;\n return normalizeStepSkipDecision(await step.skip(inputs, context));\n}\n\nexport async function validateStepOutput<TOptions extends object>(\n step: AnyStep<TOptions>,\n value: unknown,\n boundary: string\n): Promise<unknown> {\n return step.outputSchema\n ? validateStandardSchema(step.outputSchema, value, boundary)\n : Promise.resolve(value);\n}\n\nexport async function executeStepAttempt<TOptions extends object>(input: {\n attemptId: string;\n pipelineId: string;\n onCacheHit?(): void;\n context: PipelineExecutionContext<TOptions>;\n dryRun: boolean;\n inputs: Record<string, unknown>;\n log: PipelineLogger;\n onArtifact?(record: ArtifactRecord, preview: boolean): void;\n onProgress(progress: PipelineStepProgress): void;\n onReportAttempt(attempt: number, attributes?: PipelineTraceAttributes): void;\n outputBoundary: string;\n step: AnyStep<TOptions>;\n}): Promise<unknown> {\n const { step } = input;\n let acceptsReports = true;\n const stepContext = {\n ...input.context,\n recordArtifact: (record: ArtifactRecord) => {\n if (!acceptsReports) return;\n const snapshot = artifactRecordSchema.decode(record, \"artifact record\");\n const preview =\n input.dryRun && (typeof step.dryRun === \"function\" || snapshot.operation === \"write\");\n input.onArtifact?.(snapshot, preview);\n },\n attemptId: input.attemptId,\n log: input.log,\n reportAttempt: input.onReportAttempt,\n reportProgress: (progress: PipelineStepProgress) => {\n if (acceptsReports) input.onProgress(progress);\n },\n };\n const run = async () => {\n try {\n return input.dryRun && typeof step.dryRun === \"function\"\n ? await step.dryRun(input.inputs, stepContext)\n : await step.run(input.inputs, stepContext);\n } finally {\n acceptsReports = false;\n }\n };\n return executeWithStepCache({\n cache: step[STEP_CACHE],\n pipelineId: input.pipelineId,\n stepId: step.id,\n inputs: input.inputs,\n context: input.context,\n run,\n onArtifact: (record) => input.onArtifact?.(record, false),\n validate: (value) => validateStepOutput(step, value, input.outputBoundary),\n onHit: () => {\n acceptsReports = false;\n input.onCacheHit?.();\n },\n });\n}\n"]}
@@ -2,3 +2,4 @@ export declare const PIPELINE_FINALIZE_STEP_ID = "__finalize__";
2
2
  export declare const STEP_OPTIONS_SCHEMA: unique symbol;
3
3
  export declare const STEP_NESTED_PIPELINE: unique symbol;
4
4
  export declare const STEP_REMOTE: unique symbol;
5
+ export declare const STEP_CACHE: unique symbol;
@@ -2,4 +2,5 @@ export const PIPELINE_FINALIZE_STEP_ID = "__finalize__";
2
2
  export const STEP_OPTIONS_SCHEMA = Symbol("tubeless.stepOptionsSchema");
3
3
  export const STEP_NESTED_PIPELINE = Symbol("tubeless.stepNestedPipeline");
4
4
  export const STEP_REMOTE = Symbol("tubeless.stepRemote");
5
+ export const STEP_CACHE = Symbol("tubeless.stepCache");
5
6
  //# sourceMappingURL=pipeline-step-metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-step-metadata.js","sourceRoot":"","sources":["../../src/core/pipeline-step-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAkB,MAAM,CAAC,6BAA6B,CAAC,CAAC;AACzF,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,qBAAqB,CAAC,CAAC","sourcesContent":["export const PIPELINE_FINALIZE_STEP_ID = \"__finalize__\";\n\nexport const STEP_OPTIONS_SCHEMA: unique symbol = Symbol(\"tubeless.stepOptionsSchema\");\nexport const STEP_NESTED_PIPELINE: unique symbol = Symbol(\"tubeless.stepNestedPipeline\");\nexport const STEP_REMOTE: unique symbol = Symbol(\"tubeless.stepRemote\");\n"]}
1
+ {"version":3,"file":"pipeline-step-metadata.js","sourceRoot":"","sources":["../../src/core/pipeline-step-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAkB,MAAM,CAAC,6BAA6B,CAAC,CAAC;AACzF,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,UAAU,GAAkB,MAAM,CAAC,oBAAoB,CAAC,CAAC","sourcesContent":["export const PIPELINE_FINALIZE_STEP_ID = \"__finalize__\";\n\nexport const STEP_OPTIONS_SCHEMA: unique symbol = Symbol(\"tubeless.stepOptionsSchema\");\nexport const STEP_NESTED_PIPELINE: unique symbol = Symbol(\"tubeless.stepNestedPipeline\");\nexport const STEP_REMOTE: unique symbol = Symbol(\"tubeless.stepRemote\");\n\nexport const STEP_CACHE: unique symbol = Symbol(\"tubeless.stepCache\");\n"]}
@@ -1,7 +1,9 @@
1
+ import type { PipelineMetadata } from "../tracing/graph-metadata.js";
2
+ import type { CompiledStepCache, StepCache } from "./pipeline-cache.js";
1
3
  import { type ArtifactLoader, type ArtifactSaver, type ArtifactResult } from "./pipeline-artifacts.js";
2
4
  import { type IterationDecision, type IterationState } from "./iteration.js";
3
5
  import type { ToMappedChildStepProgressOptions } from "./mapped-child-progress.js";
4
- import { STEP_NESTED_PIPELINE, STEP_OPTIONS_SCHEMA, STEP_REMOTE } from "./pipeline-step-metadata.js";
6
+ import { STEP_CACHE, STEP_NESTED_PIPELINE, STEP_OPTIONS_SCHEMA, STEP_REMOTE } from "./pipeline-step-metadata.js";
5
7
  import type { InferSchemaInput, InferSchemaOutput, Pipeline, PipelineExecutionContext, PipelinePlanStep, PipelineRun, PipelineRunControls, PipelineStepContext, RemoteStepAdapter, StandardSchemaV1, StepSkipDecision } from "./pipeline-types.js";
6
8
  /**
7
9
  * A step's dependencies are references to the dependency's own step object, not string ids
@@ -28,6 +30,7 @@ export interface AnyStep<TOptions extends object = object> {
28
30
  /** Optional human-facing display name. Stable machine identity remains `id`. */
29
31
  readonly name?: string;
30
32
  readonly description?: string;
33
+ readonly metadata?: PipelineMetadata;
31
34
  /**
32
35
  * Dry-run policy. Omitted runs the normal handler, `"skip"` structurally
33
36
  * skips it, and a handler substitutes for `run` while preserving its output.
@@ -35,6 +38,9 @@ export interface AnyStep<TOptions extends object = object> {
35
38
  readonly dryRun?: "skip" | AnyStepDryRunHandler<TOptions>;
36
39
  /** Optional Standard Schema for values published by this step. */
37
40
  readonly outputSchema?: StandardSchemaV1;
41
+ /** Explicit output caching for ordinary deterministic steps only. */
42
+ readonly cache?: boolean | StepCache<Record<string, unknown>, TOptions>;
43
+ readonly [STEP_CACHE]?: CompiledStepCache<TOptions>;
38
44
  /**
39
45
  * Optional runtime skip. Return a non-empty reason (or `{ reason, value }`) to
40
46
  * skip without calling `run`. Policy skips unlock dependents; structural skips
@@ -79,6 +85,7 @@ type ChildPipelineStepDefinitionBase<TParentOptions extends object, TDeps extend
79
85
  skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];
80
86
  name?: string;
81
87
  description?: string;
88
+ metadata?: PipelineMetadata;
82
89
  dryRun?: "skip";
83
90
  controls?: PipelineRunControlsOf<TChildPipeline> | ((inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, context: PipelineExecutionContext<TParentOptions>) => PipelineRunControlsOf<TChildPipeline>);
84
91
  } & ([TParentOptions] extends [PipelineOptionsOf<NoInfer<TChildPipeline>>] ? {
@@ -101,6 +108,7 @@ type MappedChildPipelineStepDefinition<TParentOptions extends object, TDeps exte
101
108
  skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];
102
109
  name?: string;
103
110
  description?: string;
111
+ metadata?: PipelineMetadata;
104
112
  dryRun?: "skip";
105
113
  items(inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, context: PipelineExecutionContext<TParentOptions>): readonly TItem[] | Promise<readonly TItem[]>;
106
114
  key(item: TItem, index: number): string;
@@ -127,8 +135,10 @@ type PlainStepFields<TOptions extends object, TDeps extends readonly AnyStep<TOp
127
135
  skipAfterFailureOf?: readonly AnyStep<TOptions>[];
128
136
  name?: string;
129
137
  description?: string;
138
+ metadata?: PipelineMetadata;
130
139
  dryRun?: StepDryRunPolicy<TOptions, TDeps, TOptionalDeps, TOut>;
131
140
  outputSchema?: never;
141
+ cache?: boolean | StepCache<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TOptions>;
132
142
  run(inputs: RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, context: PipelineStepContext<TOptions>): TOut | Promise<TOut>;
133
143
  };
134
144
  type SchemaStepFields<TOptions extends object, TDeps extends readonly AnyStep<TOptions>[], TOptionalDeps extends readonly AnyStep<TOptions>[], TSchema extends StandardSchemaV1> = Omit<PlainStepFields<TOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>>, "outputSchema"> & {
@@ -143,6 +153,7 @@ type RemoteStepDefinitionBase<TParentOptions extends object, TDeps extends reado
143
153
  skipAfterFailureOf?: readonly AnyStep<TParentOptions>[];
144
154
  name?: string;
145
155
  description?: string;
156
+ metadata?: PipelineMetadata;
146
157
  dryRun?: StepDryRunPolicy<TParentOptions, TDeps, TOptionalDeps, InferSchemaInput<TSchema>>;
147
158
  };
148
159
  /** Step constructors scoped to one pipeline's domain option types. */
@@ -170,10 +181,12 @@ declare function createStepFactory<TOptions extends object, TInputOptions extend
170
181
  skip?: never;
171
182
  }): TOptionsSchema extends StandardSchemaV1<unknown, unknown> ? Step<TId, TOut, TOptions, TInputOptions, TOut, TOptionsSchema> : Step<TId, TOut, TOptions, TInputOptions, TOut, StandardSchemaV1<unknown, unknown> | undefined>;
172
183
  };
173
- loadArtifact: <TId extends string, const TDeps extends readonly AnyStep<TOptions>[] = [], const TOptionalDeps extends readonly AnyStep<TOptions>[] = [], TValue = unknown>(id: TId, definition: Omit<PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>, "run"> & {
184
+ loadArtifact: <TId extends string, const TDeps extends readonly AnyStep<TOptions>[] = [], const TOptionalDeps extends readonly AnyStep<TOptions>[] = [], TValue = unknown>(id: TId, definition: Omit<PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>, "run" | "cache"> & {
185
+ cache?: never;
174
186
  load: ArtifactLoader<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TValue, TOptions>;
175
187
  }) => TOptionsSchema extends StandardSchemaV1<unknown, unknown> ? Step<TId, TValue, TOptions, TInputOptions, TValue, TOptionsSchema> : Step<TId, TValue, TOptions, TInputOptions, TValue, StandardSchemaV1<unknown, unknown> | undefined>;
176
- saveArtifact: <TId extends string, const TDeps extends readonly AnyStep<TOptions>[] = [], const TOptionalDeps extends readonly AnyStep<TOptions>[] = [], TValue = unknown>(id: TId, definition: Omit<PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>, "run"> & {
188
+ saveArtifact: <TId extends string, const TDeps extends readonly AnyStep<TOptions>[] = [], const TOptionalDeps extends readonly AnyStep<TOptions>[] = [], TValue = unknown>(id: TId, definition: Omit<PlainStepFields<TOptions, TDeps, TOptionalDeps, ArtifactResult<TValue>>, "run" | "cache"> & {
189
+ cache?: never;
177
190
  save: ArtifactSaver<RequiredInputs<TDeps> & OptionalInputs<TOptionalDeps>, TValue, TOptions>;
178
191
  }) => TOptionsSchema extends StandardSchemaV1<unknown, unknown> ? Step<TId, TValue, TOptions, TInputOptions, TValue, TOptionsSchema> : Step<TId, TValue, TOptions, TInputOptions, TValue, StandardSchemaV1<unknown, unknown> | undefined>;
179
192
  fromPipeline: {
@@ -224,6 +237,7 @@ declare function createStepFactory<TOptions extends object, TInputOptions extend
224
237
  pipeline: TChild;
225
238
  name?: string;
226
239
  description?: string;
240
+ metadata?: PipelineMetadata;
227
241
  dependsOn?: TDeps;
228
242
  maxIterations: number;
229
243
  dryRun?: "skip";
@@ -1,7 +1,7 @@
1
1
  import {} from "./pipeline-artifacts.js";
2
2
  import { createMappedChildRunner, createSingleChildRunner } from "./child-execution.js";
3
3
  import { createIterationRunner } from "./iteration.js";
4
- import { STEP_NESTED_PIPELINE, STEP_OPTIONS_SCHEMA, STEP_REMOTE, } from "./pipeline-step-metadata.js";
4
+ import { STEP_CACHE, STEP_NESTED_PIPELINE, STEP_OPTIONS_SCHEMA, STEP_REMOTE, } from "./pipeline-step-metadata.js";
5
5
  export function createSteps(optionsSchema) {
6
6
  return createStepFactory(optionsSchema);
7
7
  }
@@ -18,7 +18,9 @@ function createStepFactory(optionsSchema) {
18
18
  }
19
19
  /** Read an artifact as an ordinary step, publishing only its typed value. */
20
20
  function loadArtifact(id, definition) {
21
- const { load, dryRun, ...fields } = definition;
21
+ const { cache, load, dryRun, ...fields } = definition;
22
+ if (cache !== undefined)
23
+ throw new Error("Artifact helpers cannot configure caching");
22
24
  const wrap = (handler) => async (inputs, context) => {
23
25
  const loaded = await handler(inputs, context);
24
26
  context.recordArtifact({ operation: "read", artifact: loaded.artifact });
@@ -32,7 +34,9 @@ function createStepFactory(optionsSchema) {
32
34
  }
33
35
  /** Write an artifact as an ordinary step. Dry runs skip unless a preview is supplied. */
34
36
  function saveArtifact(id, definition) {
35
- const { save, dryRun, ...fields } = definition;
37
+ const { cache, save, dryRun, ...fields } = definition;
38
+ if (cache !== undefined)
39
+ throw new Error("Artifact helpers cannot configure caching");
36
40
  const wrap = (handler) => async (inputs, context) => {
37
41
  const saved = await handler(inputs, context);
38
42
  context.recordArtifact({ operation: "write", artifact: saved.artifact });
@@ -57,6 +61,7 @@ function createStepFactory(optionsSchema) {
57
61
  skipAfterFailureOf: config.skipAfterFailureOf,
58
62
  name: config.name,
59
63
  description: config.description,
64
+ metadata: config.metadata,
60
65
  dryRun: config.dryRun,
61
66
  run: createSingleChildRunner(config),
62
67
  };
@@ -80,6 +85,7 @@ function createStepFactory(optionsSchema) {
80
85
  skipAfterFailureOf: config.skipAfterFailureOf,
81
86
  name: config.name,
82
87
  description: config.description,
88
+ metadata: config.metadata,
83
89
  dryRun: config.dryRun,
84
90
  outputSchema: config.outputSchema,
85
91
  run: (inputs, context) => config.adapter.invoke(config.mapInput(inputs, context), context),
@@ -107,6 +113,7 @@ function createStepFactory(optionsSchema) {
107
113
  skipAfterFailureOf: config.skipAfterFailureOf,
108
114
  name: config.name,
109
115
  description: config.description,
116
+ metadata: config.metadata,
110
117
  dryRun: config.dryRun,
111
118
  run: createMappedChildRunner(config),
112
119
  };
@@ -143,6 +150,7 @@ function createStepFactory(optionsSchema) {
143
150
  },
144
151
  name: config.name,
145
152
  description: config.description,
153
+ metadata: config.metadata,
146
154
  dependsOn: config.dependsOn,
147
155
  dryRun: config.dryRun,
148
156
  run: createIterationRunner(config),