@shipfox/client-workflows 16.0.0 → 17.0.0

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 (180) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-type.log +1 -0
  3. package/CHANGELOG.md +20 -0
  4. package/dist/components/identifier/identifier.js +2 -2
  5. package/dist/components/identifier/identifier.js.map +1 -1
  6. package/dist/components/job-detail/agent-config-failure-callout.d.ts.map +1 -1
  7. package/dist/components/job-detail/agent-config-failure-callout.js +1 -1
  8. package/dist/components/job-detail/agent-config-failure-callout.js.map +1 -1
  9. package/dist/components/job-detail/job-context-panel.d.ts +6 -0
  10. package/dist/components/job-detail/job-context-panel.d.ts.map +1 -0
  11. package/dist/components/job-detail/job-context-panel.js +224 -0
  12. package/dist/components/job-detail/job-context-panel.js.map +1 -0
  13. package/dist/components/job-detail/job-detail-header.d.ts +3 -1
  14. package/dist/components/job-detail/job-detail-header.d.ts.map +1 -1
  15. package/dist/components/job-detail/job-detail-header.js +54 -48
  16. package/dist/components/job-detail/job-detail-header.js.map +1 -1
  17. package/dist/components/job-detail/job-detail-view.d.ts +1 -1
  18. package/dist/components/job-detail/job-detail-view.d.ts.map +1 -1
  19. package/dist/components/job-detail/job-detail-view.js +80 -44
  20. package/dist/components/job-detail/job-detail-view.js.map +1 -1
  21. package/dist/components/job-detail/job-empty-states.d.ts.map +1 -1
  22. package/dist/components/job-detail/job-empty-states.js +19 -10
  23. package/dist/components/job-detail/job-empty-states.js.map +1 -1
  24. package/dist/components/job-detail/job-execution-switcher.js +4 -4
  25. package/dist/components/job-detail/job-execution-switcher.js.map +1 -1
  26. package/dist/components/job-detail/json-code.d.ts +14 -0
  27. package/dist/components/job-detail/json-code.d.ts.map +1 -0
  28. package/dist/components/job-detail/json-code.js +93 -0
  29. package/dist/components/job-detail/json-code.js.map +1 -0
  30. package/dist/components/job-detail/step-attempt-log-panel.d.ts.map +1 -1
  31. package/dist/components/job-detail/step-attempt-log-panel.js +9 -6
  32. package/dist/components/job-detail/step-attempt-log-panel.js.map +1 -1
  33. package/dist/components/job-detail/step-troubleshooting.d.ts +18 -0
  34. package/dist/components/job-detail/step-troubleshooting.d.ts.map +1 -0
  35. package/dist/components/job-detail/step-troubleshooting.js +493 -0
  36. package/dist/components/job-detail/step-troubleshooting.js.map +1 -0
  37. package/dist/components/job-graph/job-graph-content.d.ts.map +1 -1
  38. package/dist/components/job-graph/job-graph-content.js +5 -4
  39. package/dist/components/job-graph/job-graph-content.js.map +1 -1
  40. package/dist/components/job-graph/job-node.js +3 -3
  41. package/dist/components/job-graph/job-node.js.map +1 -1
  42. package/dist/components/step-list/index.d.ts +1 -0
  43. package/dist/components/step-list/index.d.ts.map +1 -1
  44. package/dist/components/step-list/index.js.map +1 -1
  45. package/dist/components/step-list/step-list-model.d.ts.map +1 -1
  46. package/dist/components/step-list/step-list-model.js +5 -0
  47. package/dist/components/step-list/step-list-model.js.map +1 -1
  48. package/dist/components/step-list/step-list.d.ts +5 -1
  49. package/dist/components/step-list/step-list.d.ts.map +1 -1
  50. package/dist/components/step-list/step-list.js +117 -82
  51. package/dist/components/step-list/step-list.js.map +1 -1
  52. package/dist/components/workflow-run-duration-label.js +1 -1
  53. package/dist/components/workflow-run-duration-label.js.map +1 -1
  54. package/dist/components/workflow-run-list/job-status-strip.js +6 -6
  55. package/dist/components/workflow-run-list/job-status-strip.js.map +1 -1
  56. package/dist/components/workflow-run-list/workflow-run-filter-menu.js +1 -1
  57. package/dist/components/workflow-run-list/workflow-run-filter-menu.js.map +1 -1
  58. package/dist/components/workflow-run-list/workflow-run-filters.js +4 -4
  59. package/dist/components/workflow-run-list/workflow-run-filters.js.map +1 -1
  60. package/dist/components/workflow-run-list/workflow-run-list-states.js +6 -6
  61. package/dist/components/workflow-run-list/workflow-run-list-states.js.map +1 -1
  62. package/dist/components/workflow-run-list/workflow-run-list-view.js +1 -1
  63. package/dist/components/workflow-run-list/workflow-run-list-view.js.map +1 -1
  64. package/dist/components/workflow-run-list/workflow-run-row.js +7 -7
  65. package/dist/components/workflow-run-list/workflow-run-row.js.map +1 -1
  66. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js +1 -1
  67. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js.map +1 -1
  68. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts +0 -1
  69. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts.map +1 -1
  70. package/dist/components/workflow-run-summary/workflow-run-summary.js +8 -13
  71. package/dist/components/workflow-run-summary/workflow-run-summary.js.map +1 -1
  72. package/dist/components/workflow-run-tabs/index.d.ts +1 -1
  73. package/dist/components/workflow-run-tabs/index.d.ts.map +1 -1
  74. package/dist/components/workflow-run-tabs/index.js.map +1 -1
  75. package/dist/components/workflow-run-tabs/run-annotation-count-chip.js +2 -2
  76. package/dist/components/workflow-run-tabs/run-annotation-count-chip.js.map +1 -1
  77. package/dist/components/workflow-run-tabs/run-annotation-list.d.ts +9 -2
  78. package/dist/components/workflow-run-tabs/run-annotation-list.d.ts.map +1 -1
  79. package/dist/components/workflow-run-tabs/run-annotation-list.js +28 -19
  80. package/dist/components/workflow-run-tabs/run-annotation-list.js.map +1 -1
  81. package/dist/components/workflow-run-tabs/run-annotation-summary-line.d.ts.map +1 -1
  82. package/dist/components/workflow-run-tabs/run-annotation-summary-line.js +5 -5
  83. package/dist/components/workflow-run-tabs/run-annotation-summary-line.js.map +1 -1
  84. package/dist/components/workflow-run-view/run-workspace-nav.js +7 -7
  85. package/dist/components/workflow-run-view/run-workspace-nav.js.map +1 -1
  86. package/dist/components/workflow-run-view/workflow-run-states.js +6 -6
  87. package/dist/components/workflow-run-view/workflow-run-states.js.map +1 -1
  88. package/dist/components/workflow-run-view/workflow-run-view.d.ts.map +1 -1
  89. package/dist/components/workflow-run-view/workflow-run-view.js +72 -12
  90. package/dist/components/workflow-run-view/workflow-run-view.js.map +1 -1
  91. package/dist/core/entities/job-execution.d.ts +7 -0
  92. package/dist/core/entities/job-execution.d.ts.map +1 -1
  93. package/dist/core/entities/job-execution.js.map +1 -1
  94. package/dist/core/entities/job.d.ts +9 -0
  95. package/dist/core/entities/job.d.ts.map +1 -1
  96. package/dist/core/entities/job.js.map +1 -1
  97. package/dist/core/entities/step-attempt.d.ts +29 -0
  98. package/dist/core/entities/step-attempt.d.ts.map +1 -1
  99. package/dist/core/entities/step-attempt.js.map +1 -1
  100. package/dist/core/entities/step.d.ts +3 -1
  101. package/dist/core/entities/step.d.ts.map +1 -1
  102. package/dist/core/entities/step.js.map +1 -1
  103. package/dist/core/run-annotation.d.ts +6 -0
  104. package/dist/core/run-annotation.d.ts.map +1 -1
  105. package/dist/core/run-annotation.js.map +1 -1
  106. package/dist/core/workflow-run.d.ts +1 -1
  107. package/dist/core/workflow-run.d.ts.map +1 -1
  108. package/dist/core/workflow-run.js.map +1 -1
  109. package/dist/hooks/api/annotations.d.ts +63 -0
  110. package/dist/hooks/api/annotations.d.ts.map +1 -0
  111. package/dist/hooks/api/annotations.js +145 -0
  112. package/dist/hooks/api/annotations.js.map +1 -0
  113. package/dist/hooks/api/step-attempt-detail.d.ts +14 -0
  114. package/dist/hooks/api/step-attempt-detail.d.ts.map +1 -0
  115. package/dist/hooks/api/step-attempt-detail.js +43 -0
  116. package/dist/hooks/api/step-attempt-detail.js.map +1 -0
  117. package/dist/hooks/api/workflow-run-mapper.d.ts +9 -2
  118. package/dist/hooks/api/workflow-run-mapper.d.ts.map +1 -1
  119. package/dist/hooks/api/workflow-run-mapper.js +47 -0
  120. package/dist/hooks/api/workflow-run-mapper.js.map +1 -1
  121. package/dist/pages/project-workflows-page.js +19 -19
  122. package/dist/pages/project-workflows-page.js.map +1 -1
  123. package/dist/pages/workflow-run-list-page.js +1 -1
  124. package/dist/pages/workflow-run-list-page.js.map +1 -1
  125. package/dist/tsconfig.test.tsbuildinfo +1 -1
  126. package/package.json +10 -10
  127. package/src/components/identifier/identifier.tsx +2 -2
  128. package/src/components/job-detail/agent-config-failure-callout.tsx +5 -1
  129. package/src/components/job-detail/job-context-panel.test.tsx +72 -0
  130. package/src/components/job-detail/job-context-panel.tsx +237 -0
  131. package/src/components/job-detail/job-detail-header.tsx +52 -46
  132. package/src/components/job-detail/job-detail-view.stories.tsx +555 -53
  133. package/src/components/job-detail/job-detail-view.tsx +87 -45
  134. package/src/components/job-detail/job-empty-states.tsx +23 -10
  135. package/src/components/job-detail/job-execution-switcher.tsx +5 -5
  136. package/src/components/job-detail/json-code.tsx +120 -0
  137. package/src/components/job-detail/step-attempt-log-panel.test.tsx +1 -0
  138. package/src/components/job-detail/step-attempt-log-panel.tsx +17 -6
  139. package/src/components/job-detail/step-troubleshooting.stories.tsx +120 -0
  140. package/src/components/job-detail/step-troubleshooting.test.tsx +337 -0
  141. package/src/components/job-detail/step-troubleshooting.tsx +537 -0
  142. package/src/components/job-graph/job-graph-content.tsx +4 -3
  143. package/src/components/job-graph/job-node.tsx +3 -3
  144. package/src/components/step-list/index.ts +1 -0
  145. package/src/components/step-list/step-list-model.ts +5 -0
  146. package/src/components/step-list/step-list.test.tsx +75 -2
  147. package/src/components/step-list/step-list.tsx +73 -20
  148. package/src/components/workflow-run-duration-label.tsx +1 -1
  149. package/src/components/workflow-run-list/job-status-strip.tsx +6 -6
  150. package/src/components/workflow-run-list/workflow-run-filter-menu.tsx +1 -1
  151. package/src/components/workflow-run-list/workflow-run-filters.tsx +4 -4
  152. package/src/components/workflow-run-list/workflow-run-list-states.tsx +6 -6
  153. package/src/components/workflow-run-list/workflow-run-list-view.tsx +1 -1
  154. package/src/components/workflow-run-list/workflow-run-row.tsx +7 -7
  155. package/src/components/workflow-run-summary/workflow-run-attempt-switcher.tsx +1 -1
  156. package/src/components/workflow-run-summary/workflow-run-summary.test.tsx +1 -1
  157. package/src/components/workflow-run-summary/workflow-run-summary.tsx +11 -11
  158. package/src/components/workflow-run-tabs/index.ts +5 -1
  159. package/src/components/workflow-run-tabs/run-annotation-count-chip.tsx +2 -2
  160. package/src/components/workflow-run-tabs/run-annotation-list.tsx +25 -10
  161. package/src/components/workflow-run-tabs/run-annotation-summary-line.tsx +5 -5
  162. package/src/components/workflow-run-view/run-workspace-nav.tsx +7 -7
  163. package/src/components/workflow-run-view/workflow-run-states.tsx +6 -6
  164. package/src/components/workflow-run-view/workflow-run-view.tsx +114 -14
  165. package/src/core/entities/job-execution.ts +7 -0
  166. package/src/core/entities/job.ts +9 -0
  167. package/src/core/entities/step-attempt.ts +33 -0
  168. package/src/core/entities/step.ts +3 -1
  169. package/src/core/run-annotation.ts +6 -0
  170. package/src/core/workflow-run.ts +4 -0
  171. package/src/hooks/api/annotations.test.ts +84 -0
  172. package/src/hooks/api/annotations.ts +240 -0
  173. package/src/hooks/api/step-attempt-detail.ts +67 -0
  174. package/src/hooks/api/workflow-run-mapper.ts +46 -0
  175. package/src/hooks/api/workflow-runs.test.tsx +61 -1
  176. package/src/pages/project-workflows-page.tsx +19 -19
  177. package/src/pages/workflow-job-detail-page.test.tsx +52 -1
  178. package/src/pages/workflow-run-list-page.tsx +1 -1
  179. package/test/fixtures/workflow-run.ts +7 -0
  180. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"job-execution.d.ts","sourceRoot":"","sources":["../../../src/core/entities/job-execution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job-execution.d.ts","sourceRoot":"","sources":["../../../src/core/entities/job-execution.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/entities/job-execution.ts"],"sourcesContent":["import {type Duration, intervalToDuration} from 'date-fns';\nimport type {Step} from './step.js';\n\nexport type JobExecutionStatus = 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled';\nexport type JobExecutionDisplayStatus = JobExecutionStatus;\nexport interface WorkflowExecutionEvent {\n source: string;\n event: string;\n deliveryId: string;\n receivedAt: string;\n project: {id: string} | null;\n repository: string | null;\n ref: string | null;\n commit: string | null;\n data: unknown;\n}\nexport type JobExecutionTime =\n | {state: 'fixed'; elapsed: Duration}\n | {state: 'live'; fromIso: string};\nexport type JobExecutionDisplayDuration =\n | ({kind: 'queue'} & JobExecutionTime)\n | ({kind: 'run'} & JobExecutionTime);\n\ninterface JobExecutionFields {\n id: string;\n jobId: string;\n sequence: number;\n name: string;\n status: JobExecutionStatus;\n statusReason: string | null;\n triggerEvents: WorkflowExecutionEvent[];\n queuedAt: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n timedOutAt: string | null;\n createdAt: string;\n updatedAt: string;\n steps: Step[];\n}\n\nexport class JobExecution {\n id!: string;\n jobId!: string;\n sequence!: number;\n name!: string;\n status!: JobExecutionStatus;\n statusReason!: string | null;\n triggerEvents!: WorkflowExecutionEvent[];\n queuedAt!: string | null;\n startedAt!: string | null;\n finishedAt!: string | null;\n timedOutAt!: string | null;\n createdAt!: string;\n updatedAt!: string;\n steps!: Step[];\n\n constructor(fields: JobExecutionFields) {\n Object.assign(this, fields);\n }\n\n get displayName(): string {\n return this.name;\n }\n\n get queueTime(): JobExecutionTime | null {\n return jobExecutionQueueTimeFromTimestamps(this);\n }\n\n get runTime(): JobExecutionTime | null {\n return jobExecutionRunTimeFromTimestamps(this);\n }\n\n get displayDuration(): JobExecutionDisplayDuration | null {\n return jobExecutionDisplayDurationFromTimestamps(this);\n }\n}\n\nexport function deriveJobExecutionDisplayStatus({\n status,\n steps,\n}: Pick<JobExecution, 'status' | 'steps'>): JobExecutionDisplayStatus {\n if (isTerminalJobExecutionStatus(status)) return status;\n if (steps.some((step) => step.status === 'running')) return 'running';\n return 'pending';\n}\n\nexport function isTerminalJobExecutionStatus(status: JobExecutionStatus): boolean {\n return status === 'succeeded' || status === 'failed' || status === 'cancelled';\n}\n\nexport function jobExecutionQueueTimeFromTimestamps({\n queuedAt,\n startedAt,\n finishedAt,\n}: {\n queuedAt: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n}): JobExecutionTime | null {\n if (queuedAt === null) return null;\n if (finishedAt !== null && startedAt === null) return null;\n if (startedAt === null) return {state: 'live', fromIso: queuedAt};\n\n const elapsed = durationBetween(queuedAt, startedAt);\n return elapsed === null ? null : {state: 'fixed', elapsed};\n}\n\nexport function jobExecutionRunTimeFromTimestamps({\n startedAt,\n finishedAt,\n}: {\n startedAt: string | null;\n finishedAt: string | null;\n}): JobExecutionTime | null {\n if (startedAt === null) return null;\n return elapsedTimeFromTimestamps({from: startedAt, to: finishedAt});\n}\n\n/**\n * The elapsed span between two marks, still accruing while the closing mark is missing. Every\n * duration this app shows is one of these, so queue time and run time measure the same way and\n * only differ in which marks they read.\n */\nexport function elapsedTimeFromTimestamps({\n from,\n to,\n}: {\n from: string;\n to: string | null;\n}): JobExecutionTime | null {\n if (to === null) return {state: 'live', fromIso: from};\n\n const elapsed = durationBetween(from, to);\n return elapsed === null ? null : {state: 'fixed', elapsed};\n}\n\nexport function jobExecutionDisplayDurationFromTimestamps(timestamps: {\n queuedAt: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n}): JobExecutionDisplayDuration | null {\n const runTime = jobExecutionRunTimeFromTimestamps(timestamps);\n if (runTime !== null) return {kind: 'run', ...runTime};\n\n const queueTime = jobExecutionQueueTimeFromTimestamps(timestamps);\n if (queueTime !== null) return {kind: 'queue', ...queueTime};\n\n return null;\n}\n\nfunction durationBetween(from: string, to: string): Duration | null {\n const start = new Date(from);\n const end = new Date(to);\n if (!Number.isFinite(start.getTime()) || !Number.isFinite(end.getTime())) return null;\n\n return intervalToDuration({\n start,\n end: end < start ? start : end,\n });\n}\n"],"names":["intervalToDuration","JobExecution","fields","Object","assign","displayName","name","queueTime","jobExecutionQueueTimeFromTimestamps","runTime","jobExecutionRunTimeFromTimestamps","displayDuration","jobExecutionDisplayDurationFromTimestamps","deriveJobExecutionDisplayStatus","status","steps","isTerminalJobExecutionStatus","some","step","queuedAt","startedAt","finishedAt","state","fromIso","elapsed","durationBetween","elapsedTimeFromTimestamps","from","to","timestamps","kind","start","Date","end","Number","isFinite","getTime"],"mappings":"AAAA,SAAuBA,kBAAkB,QAAO,WAAW;AAwC3D,OAAO,MAAMC;IAgBX,YAAYC,MAA0B,CAAE;QACtCC,OAAOC,MAAM,CAAC,IAAI,EAAEF;IACtB;IAEA,IAAIG,cAAsB;QACxB,OAAO,IAAI,CAACC,IAAI;IAClB;IAEA,IAAIC,YAAqC;QACvC,OAAOC,oCAAoC,IAAI;IACjD;IAEA,IAAIC,UAAmC;QACrC,OAAOC,kCAAkC,IAAI;IAC/C;IAEA,IAAIC,kBAAsD;QACxD,OAAOC,0CAA0C,IAAI;IACvD;AACF;AAEA,OAAO,SAASC,gCAAgC,EAC9CC,MAAM,EACNC,KAAK,EACkC;IACvC,IAAIC,6BAA6BF,SAAS,OAAOA;IACjD,IAAIC,MAAME,IAAI,CAAC,CAACC,OAASA,KAAKJ,MAAM,KAAK,YAAY,OAAO;IAC5D,OAAO;AACT;AAEA,OAAO,SAASE,6BAA6BF,MAA0B;IACrE,OAAOA,WAAW,eAAeA,WAAW,YAAYA,WAAW;AACrE;AAEA,OAAO,SAASN,oCAAoC,EAClDW,QAAQ,EACRC,SAAS,EACTC,UAAU,EAKX;IACC,IAAIF,aAAa,MAAM,OAAO;IAC9B,IAAIE,eAAe,QAAQD,cAAc,MAAM,OAAO;IACtD,IAAIA,cAAc,MAAM,OAAO;QAACE,OAAO;QAAQC,SAASJ;IAAQ;IAEhE,MAAMK,UAAUC,gBAAgBN,UAAUC;IAC1C,OAAOI,YAAY,OAAO,OAAO;QAACF,OAAO;QAASE;IAAO;AAC3D;AAEA,OAAO,SAASd,kCAAkC,EAChDU,SAAS,EACTC,UAAU,EAIX;IACC,IAAID,cAAc,MAAM,OAAO;IAC/B,OAAOM,0BAA0B;QAACC,MAAMP;QAAWQ,IAAIP;IAAU;AACnE;AAEA;;;;CAIC,GACD,OAAO,SAASK,0BAA0B,EACxCC,IAAI,EACJC,EAAE,EAIH;IACC,IAAIA,OAAO,MAAM,OAAO;QAACN,OAAO;QAAQC,SAASI;IAAI;IAErD,MAAMH,UAAUC,gBAAgBE,MAAMC;IACtC,OAAOJ,YAAY,OAAO,OAAO;QAACF,OAAO;QAASE;IAAO;AAC3D;AAEA,OAAO,SAASZ,0CAA0CiB,UAIzD;IACC,MAAMpB,UAAUC,kCAAkCmB;IAClD,IAAIpB,YAAY,MAAM,OAAO;QAACqB,MAAM;QAAO,GAAGrB,OAAO;IAAA;IAErD,MAAMF,YAAYC,oCAAoCqB;IACtD,IAAItB,cAAc,MAAM,OAAO;QAACuB,MAAM;QAAS,GAAGvB,SAAS;IAAA;IAE3D,OAAO;AACT;AAEA,SAASkB,gBAAgBE,IAAY,EAAEC,EAAU;IAC/C,MAAMG,QAAQ,IAAIC,KAAKL;IACvB,MAAMM,MAAM,IAAID,KAAKJ;IACrB,IAAI,CAACM,OAAOC,QAAQ,CAACJ,MAAMK,OAAO,OAAO,CAACF,OAAOC,QAAQ,CAACF,IAAIG,OAAO,KAAK,OAAO;IAEjF,OAAOpC,mBAAmB;QACxB+B;QACAE,KAAKA,MAAMF,QAAQA,QAAQE;IAC7B;AACF"}
1
+ {"version":3,"sources":["../../../src/core/entities/job-execution.ts"],"sourcesContent":["import {type Duration, intervalToDuration} from 'date-fns';\nimport type {Step} from './step.js';\nimport type {EvaluationTraceEntry} from './step-attempt.js';\n\nexport type JobExecutionStatus = 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled';\nexport type JobExecutionDisplayStatus = JobExecutionStatus;\nexport interface WorkflowExecutionEvent {\n source: string;\n event: string;\n deliveryId: string;\n receivedAt: string;\n project: {id: string} | null;\n repository: string | null;\n ref: string | null;\n commit: string | null;\n data: unknown;\n}\nexport type JobExecutionTime =\n | {state: 'fixed'; elapsed: Duration}\n | {state: 'live'; fromIso: string};\nexport type JobExecutionDisplayDuration =\n | ({kind: 'queue'} & JobExecutionTime)\n | ({kind: 'run'} & JobExecutionTime);\n\ninterface JobExecutionFields {\n id: string;\n jobId: string;\n sequence: number;\n name: string;\n status: JobExecutionStatus;\n statusReason: string | null;\n runner: string[] | null;\n outputs: Record<string, unknown> | null;\n triggerEvents: WorkflowExecutionEvent[];\n queuedAt: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n timedOutAt: string | null;\n evaluationTrace: EvaluationTraceEntry[] | null;\n createdAt: string;\n updatedAt: string;\n steps: Step[];\n}\n\nexport class JobExecution {\n id!: string;\n jobId!: string;\n sequence!: number;\n name!: string;\n status!: JobExecutionStatus;\n statusReason!: string | null;\n runner!: string[] | null;\n outputs!: Record<string, unknown> | null;\n triggerEvents!: WorkflowExecutionEvent[];\n queuedAt!: string | null;\n startedAt!: string | null;\n finishedAt!: string | null;\n timedOutAt!: string | null;\n evaluationTrace!: EvaluationTraceEntry[] | null;\n createdAt!: string;\n updatedAt!: string;\n steps!: Step[];\n\n constructor(fields: JobExecutionFields) {\n Object.assign(this, fields);\n }\n\n get displayName(): string {\n return this.name;\n }\n\n get queueTime(): JobExecutionTime | null {\n return jobExecutionQueueTimeFromTimestamps(this);\n }\n\n get runTime(): JobExecutionTime | null {\n return jobExecutionRunTimeFromTimestamps(this);\n }\n\n get displayDuration(): JobExecutionDisplayDuration | null {\n return jobExecutionDisplayDurationFromTimestamps(this);\n }\n}\n\nexport function deriveJobExecutionDisplayStatus({\n status,\n steps,\n}: Pick<JobExecution, 'status' | 'steps'>): JobExecutionDisplayStatus {\n if (isTerminalJobExecutionStatus(status)) return status;\n if (steps.some((step) => step.status === 'running')) return 'running';\n return 'pending';\n}\n\nexport function isTerminalJobExecutionStatus(status: JobExecutionStatus): boolean {\n return status === 'succeeded' || status === 'failed' || status === 'cancelled';\n}\n\nexport function jobExecutionQueueTimeFromTimestamps({\n queuedAt,\n startedAt,\n finishedAt,\n}: {\n queuedAt: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n}): JobExecutionTime | null {\n if (queuedAt === null) return null;\n if (finishedAt !== null && startedAt === null) return null;\n if (startedAt === null) return {state: 'live', fromIso: queuedAt};\n\n const elapsed = durationBetween(queuedAt, startedAt);\n return elapsed === null ? null : {state: 'fixed', elapsed};\n}\n\nexport function jobExecutionRunTimeFromTimestamps({\n startedAt,\n finishedAt,\n}: {\n startedAt: string | null;\n finishedAt: string | null;\n}): JobExecutionTime | null {\n if (startedAt === null) return null;\n return elapsedTimeFromTimestamps({from: startedAt, to: finishedAt});\n}\n\n/**\n * The elapsed span between two marks, still accruing while the closing mark is missing. Every\n * duration this app shows is one of these, so queue time and run time measure the same way and\n * only differ in which marks they read.\n */\nexport function elapsedTimeFromTimestamps({\n from,\n to,\n}: {\n from: string;\n to: string | null;\n}): JobExecutionTime | null {\n if (to === null) return {state: 'live', fromIso: from};\n\n const elapsed = durationBetween(from, to);\n return elapsed === null ? null : {state: 'fixed', elapsed};\n}\n\nexport function jobExecutionDisplayDurationFromTimestamps(timestamps: {\n queuedAt: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n}): JobExecutionDisplayDuration | null {\n const runTime = jobExecutionRunTimeFromTimestamps(timestamps);\n if (runTime !== null) return {kind: 'run', ...runTime};\n\n const queueTime = jobExecutionQueueTimeFromTimestamps(timestamps);\n if (queueTime !== null) return {kind: 'queue', ...queueTime};\n\n return null;\n}\n\nfunction durationBetween(from: string, to: string): Duration | null {\n const start = new Date(from);\n const end = new Date(to);\n if (!Number.isFinite(start.getTime()) || !Number.isFinite(end.getTime())) return null;\n\n return intervalToDuration({\n start,\n end: end < start ? start : end,\n });\n}\n"],"names":["intervalToDuration","JobExecution","fields","Object","assign","displayName","name","queueTime","jobExecutionQueueTimeFromTimestamps","runTime","jobExecutionRunTimeFromTimestamps","displayDuration","jobExecutionDisplayDurationFromTimestamps","deriveJobExecutionDisplayStatus","status","steps","isTerminalJobExecutionStatus","some","step","queuedAt","startedAt","finishedAt","state","fromIso","elapsed","durationBetween","elapsedTimeFromTimestamps","from","to","timestamps","kind","start","Date","end","Number","isFinite","getTime"],"mappings":"AAAA,SAAuBA,kBAAkB,QAAO,WAAW;AA4C3D,OAAO,MAAMC;IAmBX,YAAYC,MAA0B,CAAE;QACtCC,OAAOC,MAAM,CAAC,IAAI,EAAEF;IACtB;IAEA,IAAIG,cAAsB;QACxB,OAAO,IAAI,CAACC,IAAI;IAClB;IAEA,IAAIC,YAAqC;QACvC,OAAOC,oCAAoC,IAAI;IACjD;IAEA,IAAIC,UAAmC;QACrC,OAAOC,kCAAkC,IAAI;IAC/C;IAEA,IAAIC,kBAAsD;QACxD,OAAOC,0CAA0C,IAAI;IACvD;AACF;AAEA,OAAO,SAASC,gCAAgC,EAC9CC,MAAM,EACNC,KAAK,EACkC;IACvC,IAAIC,6BAA6BF,SAAS,OAAOA;IACjD,IAAIC,MAAME,IAAI,CAAC,CAACC,OAASA,KAAKJ,MAAM,KAAK,YAAY,OAAO;IAC5D,OAAO;AACT;AAEA,OAAO,SAASE,6BAA6BF,MAA0B;IACrE,OAAOA,WAAW,eAAeA,WAAW,YAAYA,WAAW;AACrE;AAEA,OAAO,SAASN,oCAAoC,EAClDW,QAAQ,EACRC,SAAS,EACTC,UAAU,EAKX;IACC,IAAIF,aAAa,MAAM,OAAO;IAC9B,IAAIE,eAAe,QAAQD,cAAc,MAAM,OAAO;IACtD,IAAIA,cAAc,MAAM,OAAO;QAACE,OAAO;QAAQC,SAASJ;IAAQ;IAEhE,MAAMK,UAAUC,gBAAgBN,UAAUC;IAC1C,OAAOI,YAAY,OAAO,OAAO;QAACF,OAAO;QAASE;IAAO;AAC3D;AAEA,OAAO,SAASd,kCAAkC,EAChDU,SAAS,EACTC,UAAU,EAIX;IACC,IAAID,cAAc,MAAM,OAAO;IAC/B,OAAOM,0BAA0B;QAACC,MAAMP;QAAWQ,IAAIP;IAAU;AACnE;AAEA;;;;CAIC,GACD,OAAO,SAASK,0BAA0B,EACxCC,IAAI,EACJC,EAAE,EAIH;IACC,IAAIA,OAAO,MAAM,OAAO;QAACN,OAAO;QAAQC,SAASI;IAAI;IAErD,MAAMH,UAAUC,gBAAgBE,MAAMC;IACtC,OAAOJ,YAAY,OAAO,OAAO;QAACF,OAAO;QAASE;IAAO;AAC3D;AAEA,OAAO,SAASZ,0CAA0CiB,UAIzD;IACC,MAAMpB,UAAUC,kCAAkCmB;IAClD,IAAIpB,YAAY,MAAM,OAAO;QAACqB,MAAM;QAAO,GAAGrB,OAAO;IAAA;IAErD,MAAMF,YAAYC,oCAAoCqB;IACtD,IAAItB,cAAc,MAAM,OAAO;QAACuB,MAAM;QAAS,GAAGvB,SAAS;IAAA;IAE3D,OAAO;AACT;AAEA,SAASkB,gBAAgBE,IAAY,EAAEC,EAAU;IAC/C,MAAMG,QAAQ,IAAIC,KAAKL;IACvB,MAAMM,MAAM,IAAID,KAAKJ;IACrB,IAAI,CAACM,OAAOC,QAAQ,CAACJ,MAAMK,OAAO,OAAO,CAACF,OAAOC,QAAQ,CAACF,IAAIG,OAAO,KAAK,OAAO;IAEjF,OAAOpC,mBAAmB;QACxB+B;QACAE,KAAKA,MAAMF,QAAQA,QAAQE;IAC7B;AACF"}
@@ -1,4 +1,5 @@
1
1
  import { type JobExecution, type JobExecutionDisplayDuration } from './job-execution.js';
2
+ import type { EvaluationTraceEntry } from './step-attempt.js';
2
3
  export type JobStatus = 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'skipped';
3
4
  export type JobDisplayStatus = JobStatus | 'listening';
4
5
  export type JobMode = 'one_shot' | 'listening';
@@ -41,6 +42,10 @@ interface JobFields {
41
42
  status: JobStatus;
42
43
  statusReason: JobStatusReason | null;
43
44
  carriedOver: boolean;
45
+ outputs: Record<string, unknown> | null;
46
+ success: string | null;
47
+ runner: string[] | null;
48
+ evaluationTrace: EvaluationTraceEntry[] | null;
44
49
  listening: JobListening | null;
45
50
  listenerStatus: ListenerStatus;
46
51
  resolutionReason: ResolutionReason | null;
@@ -59,6 +64,10 @@ export declare class Job {
59
64
  status: JobStatus;
60
65
  statusReason: JobStatusReason | null;
61
66
  carriedOver: boolean;
67
+ outputs: Record<string, unknown> | null;
68
+ success: string | null;
69
+ runner: string[] | null;
70
+ evaluationTrace: EvaluationTraceEntry[] | null;
62
71
  listening: JobListening | null;
63
72
  listenerStatus: ListenerStatus;
64
73
  resolutionReason: ResolutionReason | null;
@@ -1 +1 @@
1
- {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/core/entities/job.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/core/entities/job.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/entities/job.ts"],"sourcesContent":["import {\n deriveJobExecutionDisplayStatus,\n type JobExecution,\n type JobExecutionDisplayDuration,\n} from './job-execution.js';\n\nexport type JobStatus = 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'skipped';\nexport type JobDisplayStatus = JobStatus | 'listening';\nexport type JobMode = 'one_shot' | 'listening';\nexport type ListenerStatus = 'inactive' | 'listening' | 'resolved';\nexport type ResolutionReason = 'until' | 'timeout' | 'max_executions' | 'cancelled';\nexport type JobStatusReason =\n | 'dependency_not_completed'\n | 'condition_false'\n | 'default_gate_rejected'\n | 'condition_rejected'\n | 'condition_errored'\n | 'user_cancelled'\n | 'run_cancelled'\n | 'timed_out'\n | 'runner_lost'\n | 'step_failed'\n | 'unknown';\nexport interface JobListening {\n on: Array<{\n source: string;\n event: string;\n inputs?: Record<string, unknown> | undefined;\n filter?: string | undefined;\n }>;\n until: Array<{\n source: string;\n event: string;\n inputs?: Record<string, unknown> | undefined;\n filter?: string | undefined;\n }> | null;\n timeoutMs: number | null;\n maxExecutions: number | null;\n batch: {\n debounceMs?: number | undefined;\n maxSize?: number | undefined;\n maxWaitMs?: number | undefined;\n } | null;\n onResolve: 'finish' | 'cancel';\n executionTimeoutMs: number | null;\n name: string | null;\n}\n\nexport type JobDisplayDuration = JobExecutionDisplayDuration;\n\nexport const WORKFLOW_JOB_STATUSES = [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n 'skipped',\n] as const satisfies readonly JobStatus[];\n\nexport const TERMINAL_WORKFLOW_JOB_STATUSES = [\n 'succeeded',\n 'failed',\n 'cancelled',\n 'skipped',\n] as const satisfies readonly JobStatus[];\n\nconst TERMINAL_JOB_STATUS_SET = new Set<JobStatus>(TERMINAL_WORKFLOW_JOB_STATUSES);\n\ninterface JobFields {\n id: string;\n runAttemptId: string;\n key: string;\n name: string | null;\n mode: JobMode;\n status: JobStatus;\n statusReason: JobStatusReason | null;\n carriedOver: boolean;\n listening: JobListening | null;\n listenerStatus: ListenerStatus;\n resolutionReason: ResolutionReason | null;\n dependencies: string[];\n position: number;\n createdAt: string;\n updatedAt: string;\n jobExecutions: JobExecution[];\n}\n\nexport class Job {\n id!: string;\n runAttemptId!: string;\n key!: string;\n name!: string | null;\n mode!: JobMode;\n status!: JobStatus;\n statusReason!: JobStatusReason | null;\n carriedOver!: boolean;\n listening!: JobListening | null;\n listenerStatus!: ListenerStatus;\n resolutionReason!: ResolutionReason | null;\n dependencies!: string[];\n position!: number;\n createdAt!: string;\n updatedAt!: string;\n jobExecutions!: JobExecution[];\n\n constructor(fields: JobFields) {\n Object.assign(this, fields);\n }\n\n get displayName(): string {\n return this.name ?? this.key;\n }\n\n get displayDuration(): JobDisplayDuration | null {\n if (this.mode === 'listening') return null;\n if (this.jobExecutions.length !== 1) return null;\n return this.jobExecutions[0]?.displayDuration ?? null;\n }\n\n get executionCountVisible(): boolean {\n return (\n this.jobExecutions.length > 0 && (this.mode === 'listening' || this.jobExecutions.length > 1)\n );\n }\n}\n\nexport function isTerminalJobStatus(status: JobStatus): boolean {\n return TERMINAL_JOB_STATUS_SET.has(status);\n}\n\nexport function deriveJobDisplayStatus(\n job: Pick<Job, 'mode' | 'status' | 'listenerStatus' | 'jobExecutions'>,\n): JobDisplayStatus {\n if (isTerminalJobStatus(job.status)) return job.status;\n if (job.mode === 'listening' && job.listenerStatus === 'listening') return 'listening';\n\n const execution = defaultJobExecution(job);\n return execution ? deriveJobExecutionDisplayStatus(execution) : 'pending';\n}\n\nexport function resolveJobExecution(\n job: Job,\n jobExecutionId: string | undefined,\n): JobExecution | undefined {\n const selectedExecution = jobExecutionId\n ? job.jobExecutions.find((jobExecution) => jobExecution.id === jobExecutionId)\n : undefined;\n if (selectedExecution) return selectedExecution;\n\n return defaultJobExecution(job);\n}\n\nexport function defaultJobExecution(job: Pick<Job, 'jobExecutions'>): JobExecution | undefined {\n const runningExecution = job.jobExecutions.find(\n (jobExecution) => jobExecution.status === 'running',\n );\n if (runningExecution) return runningExecution;\n\n return job.jobExecutions.reduce<JobExecution | undefined>((latest, jobExecution) => {\n if (!latest) return jobExecution;\n return jobExecution.sequence > latest.sequence ? jobExecution : latest;\n }, undefined);\n}\n"],"names":["deriveJobExecutionDisplayStatus","WORKFLOW_JOB_STATUSES","TERMINAL_WORKFLOW_JOB_STATUSES","TERMINAL_JOB_STATUS_SET","Set","Job","fields","Object","assign","displayName","name","key","displayDuration","mode","jobExecutions","length","executionCountVisible","isTerminalJobStatus","status","has","deriveJobDisplayStatus","job","listenerStatus","execution","defaultJobExecution","resolveJobExecution","jobExecutionId","selectedExecution","find","jobExecution","id","undefined","runningExecution","reduce","latest","sequence"],"mappings":"AAAA,SACEA,+BAA+B,QAG1B,qBAAqB;AA8C5B,OAAO,MAAMC,wBAAwB;IACnC;IACA;IACA;IACA;IACA;IACA;CACD,CAAyC;AAE1C,OAAO,MAAMC,iCAAiC;IAC5C;IACA;IACA;IACA;CACD,CAAyC;AAE1C,MAAMC,0BAA0B,IAAIC,IAAeF;AAqBnD,OAAO,MAAMG;IAkBX,YAAYC,MAAiB,CAAE;QAC7BC,OAAOC,MAAM,CAAC,IAAI,EAAEF;IACtB;IAEA,IAAIG,cAAsB;QACxB,OAAO,IAAI,CAACC,IAAI,IAAI,IAAI,CAACC,GAAG;IAC9B;IAEA,IAAIC,kBAA6C;QAC/C,IAAI,IAAI,CAACC,IAAI,KAAK,aAAa,OAAO;QACtC,IAAI,IAAI,CAACC,aAAa,CAACC,MAAM,KAAK,GAAG,OAAO;QAC5C,OAAO,IAAI,CAACD,aAAa,CAAC,EAAE,EAAEF,mBAAmB;IACnD;IAEA,IAAII,wBAAiC;QACnC,OACE,IAAI,CAACF,aAAa,CAACC,MAAM,GAAG,KAAM,CAAA,IAAI,CAACF,IAAI,KAAK,eAAe,IAAI,CAACC,aAAa,CAACC,MAAM,GAAG,CAAA;IAE/F;AACF;AAEA,OAAO,SAASE,oBAAoBC,MAAiB;IACnD,OAAOf,wBAAwBgB,GAAG,CAACD;AACrC;AAEA,OAAO,SAASE,uBACdC,GAAsE;IAEtE,IAAIJ,oBAAoBI,IAAIH,MAAM,GAAG,OAAOG,IAAIH,MAAM;IACtD,IAAIG,IAAIR,IAAI,KAAK,eAAeQ,IAAIC,cAAc,KAAK,aAAa,OAAO;IAE3E,MAAMC,YAAYC,oBAAoBH;IACtC,OAAOE,YAAYvB,gCAAgCuB,aAAa;AAClE;AAEA,OAAO,SAASE,oBACdJ,GAAQ,EACRK,cAAkC;IAElC,MAAMC,oBAAoBD,iBACtBL,IAAIP,aAAa,CAACc,IAAI,CAAC,CAACC,eAAiBA,aAAaC,EAAE,KAAKJ,kBAC7DK;IACJ,IAAIJ,mBAAmB,OAAOA;IAE9B,OAAOH,oBAAoBH;AAC7B;AAEA,OAAO,SAASG,oBAAoBH,GAA+B;IACjE,MAAMW,mBAAmBX,IAAIP,aAAa,CAACc,IAAI,CAC7C,CAACC,eAAiBA,aAAaX,MAAM,KAAK;IAE5C,IAAIc,kBAAkB,OAAOA;IAE7B,OAAOX,IAAIP,aAAa,CAACmB,MAAM,CAA2B,CAACC,QAAQL;QACjE,IAAI,CAACK,QAAQ,OAAOL;QACpB,OAAOA,aAAaM,QAAQ,GAAGD,OAAOC,QAAQ,GAAGN,eAAeK;IAClE,GAAGH;AACL"}
1
+ {"version":3,"sources":["../../../src/core/entities/job.ts"],"sourcesContent":["import {\n deriveJobExecutionDisplayStatus,\n type JobExecution,\n type JobExecutionDisplayDuration,\n} from './job-execution.js';\nimport type {EvaluationTraceEntry} from './step-attempt.js';\n\nexport type JobStatus = 'pending' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'skipped';\nexport type JobDisplayStatus = JobStatus | 'listening';\nexport type JobMode = 'one_shot' | 'listening';\nexport type ListenerStatus = 'inactive' | 'listening' | 'resolved';\nexport type ResolutionReason = 'until' | 'timeout' | 'max_executions' | 'cancelled';\nexport type JobStatusReason =\n | 'dependency_not_completed'\n | 'condition_false'\n | 'default_gate_rejected'\n | 'condition_rejected'\n | 'condition_errored'\n | 'user_cancelled'\n | 'run_cancelled'\n | 'timed_out'\n | 'runner_lost'\n | 'step_failed'\n | 'unknown';\nexport interface JobListening {\n on: Array<{\n source: string;\n event: string;\n inputs?: Record<string, unknown> | undefined;\n filter?: string | undefined;\n }>;\n until: Array<{\n source: string;\n event: string;\n inputs?: Record<string, unknown> | undefined;\n filter?: string | undefined;\n }> | null;\n timeoutMs: number | null;\n maxExecutions: number | null;\n batch: {\n debounceMs?: number | undefined;\n maxSize?: number | undefined;\n maxWaitMs?: number | undefined;\n } | null;\n onResolve: 'finish' | 'cancel';\n executionTimeoutMs: number | null;\n name: string | null;\n}\n\nexport type JobDisplayDuration = JobExecutionDisplayDuration;\n\nexport const WORKFLOW_JOB_STATUSES = [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n 'skipped',\n] as const satisfies readonly JobStatus[];\n\nexport const TERMINAL_WORKFLOW_JOB_STATUSES = [\n 'succeeded',\n 'failed',\n 'cancelled',\n 'skipped',\n] as const satisfies readonly JobStatus[];\n\nconst TERMINAL_JOB_STATUS_SET = new Set<JobStatus>(TERMINAL_WORKFLOW_JOB_STATUSES);\n\ninterface JobFields {\n id: string;\n runAttemptId: string;\n key: string;\n name: string | null;\n mode: JobMode;\n status: JobStatus;\n statusReason: JobStatusReason | null;\n carriedOver: boolean;\n outputs: Record<string, unknown> | null;\n success: string | null;\n runner: string[] | null;\n evaluationTrace: EvaluationTraceEntry[] | null;\n listening: JobListening | null;\n listenerStatus: ListenerStatus;\n resolutionReason: ResolutionReason | null;\n dependencies: string[];\n position: number;\n createdAt: string;\n updatedAt: string;\n jobExecutions: JobExecution[];\n}\n\nexport class Job {\n id!: string;\n runAttemptId!: string;\n key!: string;\n name!: string | null;\n mode!: JobMode;\n status!: JobStatus;\n statusReason!: JobStatusReason | null;\n carriedOver!: boolean;\n outputs!: Record<string, unknown> | null;\n success!: string | null;\n runner!: string[] | null;\n evaluationTrace!: EvaluationTraceEntry[] | null;\n listening!: JobListening | null;\n listenerStatus!: ListenerStatus;\n resolutionReason!: ResolutionReason | null;\n dependencies!: string[];\n position!: number;\n createdAt!: string;\n updatedAt!: string;\n jobExecutions!: JobExecution[];\n\n constructor(fields: JobFields) {\n Object.assign(this, fields);\n }\n\n get displayName(): string {\n return this.name ?? this.key;\n }\n\n get displayDuration(): JobDisplayDuration | null {\n if (this.mode === 'listening') return null;\n if (this.jobExecutions.length !== 1) return null;\n return this.jobExecutions[0]?.displayDuration ?? null;\n }\n\n get executionCountVisible(): boolean {\n return (\n this.jobExecutions.length > 0 && (this.mode === 'listening' || this.jobExecutions.length > 1)\n );\n }\n}\n\nexport function isTerminalJobStatus(status: JobStatus): boolean {\n return TERMINAL_JOB_STATUS_SET.has(status);\n}\n\nexport function deriveJobDisplayStatus(\n job: Pick<Job, 'mode' | 'status' | 'listenerStatus' | 'jobExecutions'>,\n): JobDisplayStatus {\n if (isTerminalJobStatus(job.status)) return job.status;\n if (job.mode === 'listening' && job.listenerStatus === 'listening') return 'listening';\n\n const execution = defaultJobExecution(job);\n return execution ? deriveJobExecutionDisplayStatus(execution) : 'pending';\n}\n\nexport function resolveJobExecution(\n job: Job,\n jobExecutionId: string | undefined,\n): JobExecution | undefined {\n const selectedExecution = jobExecutionId\n ? job.jobExecutions.find((jobExecution) => jobExecution.id === jobExecutionId)\n : undefined;\n if (selectedExecution) return selectedExecution;\n\n return defaultJobExecution(job);\n}\n\nexport function defaultJobExecution(job: Pick<Job, 'jobExecutions'>): JobExecution | undefined {\n const runningExecution = job.jobExecutions.find(\n (jobExecution) => jobExecution.status === 'running',\n );\n if (runningExecution) return runningExecution;\n\n return job.jobExecutions.reduce<JobExecution | undefined>((latest, jobExecution) => {\n if (!latest) return jobExecution;\n return jobExecution.sequence > latest.sequence ? jobExecution : latest;\n }, undefined);\n}\n"],"names":["deriveJobExecutionDisplayStatus","WORKFLOW_JOB_STATUSES","TERMINAL_WORKFLOW_JOB_STATUSES","TERMINAL_JOB_STATUS_SET","Set","Job","fields","Object","assign","displayName","name","key","displayDuration","mode","jobExecutions","length","executionCountVisible","isTerminalJobStatus","status","has","deriveJobDisplayStatus","job","listenerStatus","execution","defaultJobExecution","resolveJobExecution","jobExecutionId","selectedExecution","find","jobExecution","id","undefined","runningExecution","reduce","latest","sequence"],"mappings":"AAAA,SACEA,+BAA+B,QAG1B,qBAAqB;AA+C5B,OAAO,MAAMC,wBAAwB;IACnC;IACA;IACA;IACA;IACA;IACA;CACD,CAAyC;AAE1C,OAAO,MAAMC,iCAAiC;IAC5C;IACA;IACA;IACA;CACD,CAAyC;AAE1C,MAAMC,0BAA0B,IAAIC,IAAeF;AAyBnD,OAAO,MAAMG;IAsBX,YAAYC,MAAiB,CAAE;QAC7BC,OAAOC,MAAM,CAAC,IAAI,EAAEF;IACtB;IAEA,IAAIG,cAAsB;QACxB,OAAO,IAAI,CAACC,IAAI,IAAI,IAAI,CAACC,GAAG;IAC9B;IAEA,IAAIC,kBAA6C;QAC/C,IAAI,IAAI,CAACC,IAAI,KAAK,aAAa,OAAO;QACtC,IAAI,IAAI,CAACC,aAAa,CAACC,MAAM,KAAK,GAAG,OAAO;QAC5C,OAAO,IAAI,CAACD,aAAa,CAAC,EAAE,EAAEF,mBAAmB;IACnD;IAEA,IAAII,wBAAiC;QACnC,OACE,IAAI,CAACF,aAAa,CAACC,MAAM,GAAG,KAAM,CAAA,IAAI,CAACF,IAAI,KAAK,eAAe,IAAI,CAACC,aAAa,CAACC,MAAM,GAAG,CAAA;IAE/F;AACF;AAEA,OAAO,SAASE,oBAAoBC,MAAiB;IACnD,OAAOf,wBAAwBgB,GAAG,CAACD;AACrC;AAEA,OAAO,SAASE,uBACdC,GAAsE;IAEtE,IAAIJ,oBAAoBI,IAAIH,MAAM,GAAG,OAAOG,IAAIH,MAAM;IACtD,IAAIG,IAAIR,IAAI,KAAK,eAAeQ,IAAIC,cAAc,KAAK,aAAa,OAAO;IAE3E,MAAMC,YAAYC,oBAAoBH;IACtC,OAAOE,YAAYvB,gCAAgCuB,aAAa;AAClE;AAEA,OAAO,SAASE,oBACdJ,GAAQ,EACRK,cAAkC;IAElC,MAAMC,oBAAoBD,iBACtBL,IAAIP,aAAa,CAACc,IAAI,CAAC,CAACC,eAAiBA,aAAaC,EAAE,KAAKJ,kBAC7DK;IACJ,IAAIJ,mBAAmB,OAAOA;IAE9B,OAAOH,oBAAoBH;AAC7B;AAEA,OAAO,SAASG,oBAAoBH,GAA+B;IACjE,MAAMW,mBAAmBX,IAAIP,aAAa,CAACc,IAAI,CAC7C,CAACC,eAAiBA,aAAaX,MAAM,KAAK;IAE5C,IAAIc,kBAAkB,OAAOA;IAE7B,OAAOX,IAAIP,aAAa,CAACmB,MAAM,CAA2B,CAACC,QAAQL;QACjE,IAAI,CAACK,QAAQ,OAAOL;QACpB,OAAOA,aAAaM,QAAQ,GAAGD,OAAOC,QAAQ,GAAGN,eAAeK;IAClE,GAAGH;AACL"}
@@ -34,6 +34,24 @@ export type StepAttemptDisplayDuration = {
34
34
  state: 'live';
35
35
  fromIso: string;
36
36
  };
37
+ export interface EvaluationTraceValueEntry {
38
+ expression: string;
39
+ roots: string[];
40
+ fillTarget: string;
41
+ evaluatedAt: string;
42
+ field: string;
43
+ value?: string;
44
+ truncated?: boolean;
45
+ exprTruncated?: boolean;
46
+ reference?: boolean;
47
+ degraded?: boolean;
48
+ envKey?: string;
49
+ }
50
+ export interface EvaluationTraceLimitEntry {
51
+ truncated: true;
52
+ dropped: number;
53
+ }
54
+ export type EvaluationTraceEntry = EvaluationTraceValueEntry | EvaluationTraceLimitEntry;
37
55
  interface StepAttemptFields {
38
56
  id: string;
39
57
  stepId: string;
@@ -43,6 +61,8 @@ interface StepAttemptFields {
43
61
  status: string;
44
62
  exitCode: number | null;
45
63
  output: Record<string, unknown> | null;
64
+ outputs: Record<string, unknown> | null;
65
+ response: string | null;
46
66
  error: Record<string, unknown> | null;
47
67
  gateResult: StepGateResult;
48
68
  restartFeedback: string | null;
@@ -58,6 +78,8 @@ export declare class StepAttempt {
58
78
  status: string;
59
79
  exitCode: number | null;
60
80
  output: Record<string, unknown> | null;
81
+ outputs: Record<string, unknown> | null;
82
+ response: string | null;
61
83
  error: Record<string, unknown> | null;
62
84
  gateResult: StepGateResult;
63
85
  restartFeedback: string | null;
@@ -66,6 +88,13 @@ export declare class StepAttempt {
66
88
  constructor(fields: StepAttemptFields);
67
89
  get displayDuration(): StepAttemptDisplayDuration | null;
68
90
  }
91
+ export interface StepAttemptDetail {
92
+ stepId: string;
93
+ attempt: number;
94
+ authoredConfig: Record<string, unknown> | null;
95
+ config: Record<string, unknown> | null;
96
+ evaluationTrace: EvaluationTraceEntry[] | null;
97
+ }
69
98
  export declare function stepAttemptDisplayDurationFromTimestamps({ startedAt, finishedAt, }: {
70
99
  startedAt: string;
71
100
  finishedAt: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"step-attempt.d.ts","sourceRoot":"","sources":["../../../src/core/entities/step-attempt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"step-attempt.d.ts","sourceRoot":"","sources":["../../../src/core/entities/step-attempt.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/entities/step-attempt.ts"],"sourcesContent":["import {type Duration, intervalToDuration} from 'date-fns';\n\nexport type StepGateResult =\n | {kind: 'none'}\n | {kind: 'not_evaluated'}\n | {kind: 'passed'; passed: true; source: string; exitCode: number | null}\n | {kind: 'failed'; passed: false; source: string; exitCode: number | null}\n | {kind: 'uncheckable'; passed: false; uncheckable: true; reason: string; exitCode: number | null}\n | {kind: 'evaluation_error'; reason: string; exitCode: number | null}\n | {kind: 'unknown'; data: Record<string, unknown>}\n | null;\nexport type StepAttemptDisplayDuration =\n | {state: 'fixed'; elapsed: Duration}\n | {state: 'live'; fromIso: string};\n\ninterface StepAttemptFields {\n id: string;\n stepId: string;\n jobExecutionId: string;\n attempt: number;\n executionOrder: number;\n status: string;\n exitCode: number | null;\n output: Record<string, unknown> | null;\n error: Record<string, unknown> | null;\n gateResult: StepGateResult;\n restartFeedback: string | null;\n startedAt: string;\n finishedAt: string | null;\n}\n\nexport class StepAttempt {\n id!: string;\n stepId!: string;\n jobExecutionId!: string;\n attempt!: number;\n executionOrder!: number;\n status!: string;\n exitCode!: number | null;\n output!: Record<string, unknown> | null;\n error!: Record<string, unknown> | null;\n gateResult!: StepGateResult;\n restartFeedback!: string | null;\n startedAt!: string;\n finishedAt!: string | null;\n\n constructor(fields: StepAttemptFields) {\n Object.assign(this, fields);\n }\n\n get displayDuration(): StepAttemptDisplayDuration | null {\n return stepAttemptDisplayDurationFromTimestamps(this);\n }\n}\n\nexport function stepAttemptDisplayDurationFromTimestamps({\n startedAt,\n finishedAt,\n}: {\n startedAt: string;\n finishedAt: string | null;\n}): StepAttemptDisplayDuration | null {\n if (finishedAt === null) return {state: 'live', fromIso: startedAt};\n\n const elapsed = durationBetween(startedAt, finishedAt);\n return elapsed === null ? null : {state: 'fixed', elapsed};\n}\n\nfunction durationBetween(from: string, to: string): Duration | null {\n const start = new Date(from);\n const end = new Date(to);\n if (!Number.isFinite(start.getTime()) || !Number.isFinite(end.getTime())) return null;\n\n return intervalToDuration({\n start,\n end: end < start ? start : end,\n });\n}\n"],"names":["intervalToDuration","StepAttempt","fields","Object","assign","displayDuration","stepAttemptDisplayDurationFromTimestamps","startedAt","finishedAt","state","fromIso","elapsed","durationBetween","from","to","start","Date","end","Number","isFinite","getTime"],"mappings":"AAAA,SAAuBA,kBAAkB,QAAO,WAAW;AA+B3D,OAAO,MAAMC;IAeX,YAAYC,MAAyB,CAAE;QACrCC,OAAOC,MAAM,CAAC,IAAI,EAAEF;IACtB;IAEA,IAAIG,kBAAqD;QACvD,OAAOC,yCAAyC,IAAI;IACtD;AACF;AAEA,OAAO,SAASA,yCAAyC,EACvDC,SAAS,EACTC,UAAU,EAIX;IACC,IAAIA,eAAe,MAAM,OAAO;QAACC,OAAO;QAAQC,SAASH;IAAS;IAElE,MAAMI,UAAUC,gBAAgBL,WAAWC;IAC3C,OAAOG,YAAY,OAAO,OAAO;QAACF,OAAO;QAASE;IAAO;AAC3D;AAEA,SAASC,gBAAgBC,IAAY,EAAEC,EAAU;IAC/C,MAAMC,QAAQ,IAAIC,KAAKH;IACvB,MAAMI,MAAM,IAAID,KAAKF;IACrB,IAAI,CAACI,OAAOC,QAAQ,CAACJ,MAAMK,OAAO,OAAO,CAACF,OAAOC,QAAQ,CAACF,IAAIG,OAAO,KAAK,OAAO;IAEjF,OAAOpB,mBAAmB;QACxBe;QACAE,KAAKA,MAAMF,QAAQA,QAAQE;IAC7B;AACF"}
1
+ {"version":3,"sources":["../../../src/core/entities/step-attempt.ts"],"sourcesContent":["import {type Duration, intervalToDuration} from 'date-fns';\n\nexport type StepGateResult =\n | {kind: 'none'}\n | {kind: 'not_evaluated'}\n | {kind: 'passed'; passed: true; source: string; exitCode: number | null}\n | {kind: 'failed'; passed: false; source: string; exitCode: number | null}\n | {kind: 'uncheckable'; passed: false; uncheckable: true; reason: string; exitCode: number | null}\n | {kind: 'evaluation_error'; reason: string; exitCode: number | null}\n | {kind: 'unknown'; data: Record<string, unknown>}\n | null;\nexport type StepAttemptDisplayDuration =\n | {state: 'fixed'; elapsed: Duration}\n | {state: 'live'; fromIso: string};\n\nexport interface EvaluationTraceValueEntry {\n expression: string;\n roots: string[];\n fillTarget: string;\n evaluatedAt: string;\n field: string;\n value?: string;\n truncated?: boolean;\n exprTruncated?: boolean;\n reference?: boolean;\n degraded?: boolean;\n envKey?: string;\n}\n\nexport interface EvaluationTraceLimitEntry {\n truncated: true;\n dropped: number;\n}\n\nexport type EvaluationTraceEntry = EvaluationTraceValueEntry | EvaluationTraceLimitEntry;\n\ninterface StepAttemptFields {\n id: string;\n stepId: string;\n jobExecutionId: string;\n attempt: number;\n executionOrder: number;\n status: string;\n exitCode: number | null;\n output: Record<string, unknown> | null;\n outputs: Record<string, unknown> | null;\n response: string | null;\n error: Record<string, unknown> | null;\n gateResult: StepGateResult;\n restartFeedback: string | null;\n startedAt: string;\n finishedAt: string | null;\n}\n\nexport class StepAttempt {\n id!: string;\n stepId!: string;\n jobExecutionId!: string;\n attempt!: number;\n executionOrder!: number;\n status!: string;\n exitCode!: number | null;\n output!: Record<string, unknown> | null;\n outputs!: Record<string, unknown> | null;\n response!: string | null;\n error!: Record<string, unknown> | null;\n gateResult!: StepGateResult;\n restartFeedback!: string | null;\n startedAt!: string;\n finishedAt!: string | null;\n\n constructor(fields: StepAttemptFields) {\n Object.assign(this, fields);\n }\n\n get displayDuration(): StepAttemptDisplayDuration | null {\n return stepAttemptDisplayDurationFromTimestamps(this);\n }\n}\n\nexport interface StepAttemptDetail {\n stepId: string;\n attempt: number;\n authoredConfig: Record<string, unknown> | null;\n config: Record<string, unknown> | null;\n evaluationTrace: EvaluationTraceEntry[] | null;\n}\n\nexport function stepAttemptDisplayDurationFromTimestamps({\n startedAt,\n finishedAt,\n}: {\n startedAt: string;\n finishedAt: string | null;\n}): StepAttemptDisplayDuration | null {\n if (finishedAt === null) return {state: 'live', fromIso: startedAt};\n\n const elapsed = durationBetween(startedAt, finishedAt);\n return elapsed === null ? null : {state: 'fixed', elapsed};\n}\n\nfunction durationBetween(from: string, to: string): Duration | null {\n const start = new Date(from);\n const end = new Date(to);\n if (!Number.isFinite(start.getTime()) || !Number.isFinite(end.getTime())) return null;\n\n return intervalToDuration({\n start,\n end: end < start ? start : end,\n });\n}\n"],"names":["intervalToDuration","StepAttempt","fields","Object","assign","displayDuration","stepAttemptDisplayDurationFromTimestamps","startedAt","finishedAt","state","fromIso","elapsed","durationBetween","from","to","start","Date","end","Number","isFinite","getTime"],"mappings":"AAAA,SAAuBA,kBAAkB,QAAO,WAAW;AAsD3D,OAAO,MAAMC;IAiBX,YAAYC,MAAyB,CAAE;QACrCC,OAAOC,MAAM,CAAC,IAAI,EAAEF;IACtB;IAEA,IAAIG,kBAAqD;QACvD,OAAOC,yCAAyC,IAAI;IACtD;AACF;AAUA,OAAO,SAASA,yCAAyC,EACvDC,SAAS,EACTC,UAAU,EAIX;IACC,IAAIA,eAAe,MAAM,OAAO;QAACC,OAAO;QAAQC,SAASH;IAAS;IAElE,MAAMI,UAAUC,gBAAgBL,WAAWC;IAC3C,OAAOG,YAAY,OAAO,OAAO;QAACF,OAAO;QAASE;IAAO;AAC3D;AAEA,SAASC,gBAAgBC,IAAY,EAAEC,EAAU;IAC/C,MAAMC,QAAQ,IAAIC,KAAKH;IACvB,MAAMI,MAAM,IAAID,KAAKF;IACrB,IAAI,CAACI,OAAOC,QAAQ,CAACJ,MAAMK,OAAO,OAAO,CAACF,OAAOC,QAAQ,CAACF,IAAIG,OAAO,KAAK,OAAO;IAEjF,OAAOpB,mBAAmB;QACxBe;QACAE,KAAKA,MAAMF,QAAQA,QAAQE;IAC7B;AACF"}
@@ -1,4 +1,4 @@
1
- import type { StepAttempt } from './step-attempt.js';
1
+ import type { EvaluationTraceEntry, StepAttempt } from './step-attempt.js';
2
2
  export type StepErrorReason = 'checkout_failed' | 'checkout_auth_failed' | 'checkout_unavailable' | 'checkout_path_invalid' | 'checkout_destination_occupied' | 'git_unavailable' | 'workspace_prep_failed' | 'setup_aborted' | 'config_unresolvable' | 'output_invalid' | 'agent_config_invalid' | 'agent_invocation_failed' | 'agent_harness_unavailable';
3
3
  export type AgentConfigIssue = 'step_config_invalid' | 'provider_not_configured' | 'provider_unsupported' | 'model_unavailable' | 'credentials_invalid';
4
4
  export type StepErrorCategory = 'setup' | 'user';
@@ -28,8 +28,10 @@ export interface Step {
28
28
  name: string;
29
29
  sourceLocation: StepSourceLocation | null;
30
30
  status: string;
31
+ statusReason: string | null;
31
32
  type: string;
32
33
  config: Record<string, unknown>;
34
+ evaluationTrace: EvaluationTraceEntry[] | null;
33
35
  agentConfig: AgentStepConfig | null;
34
36
  error: StepError | null;
35
37
  position: number;
@@ -1 +1 @@
1
- {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../../src/core/entities/step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,sBAAsB,GACtB,sBAAsB,GACtB,uBAAuB,GACvB,+BAA+B,GAC/B,iBAAiB,GACjB,uBAAuB,GACvB,eAAe,GACf,qBAAqB,GACrB,gBAAgB,GAChB,sBAAsB,GACtB,yBAAyB,GACzB,2BAA2B,CAAC;AAChC,MAAM,MAAM,gBAAgB,GACxB,qBAAqB,GACrB,yBAAyB,GACzB,sBAAsB,GACtB,mBAAmB,GACnB,qBAAqB,CAAC;AAC1B,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AACjD,eAAO,MAAM,kBAAkB,sBAc7B,CAAC;AACH,eAAO,MAAM,mBAAmB,uBAM9B,CAAC;AAEH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC/C,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,WAAW,GAAG,SAAS,CAazB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAMjF"}
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../../src/core/entities/step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAE,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAEzE,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,sBAAsB,GACtB,sBAAsB,GACtB,uBAAuB,GACvB,+BAA+B,GAC/B,iBAAiB,GACjB,uBAAuB,GACvB,eAAe,GACf,qBAAqB,GACrB,gBAAgB,GAChB,sBAAsB,GACtB,yBAAyB,GACzB,2BAA2B,CAAC;AAChC,MAAM,MAAM,gBAAgB,GACxB,qBAAqB,GACrB,yBAAyB,GACzB,sBAAsB,GACtB,mBAAmB,GACnB,qBAAqB,CAAC;AAC1B,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AACjD,eAAO,MAAM,kBAAkB,sBAc7B,CAAC;AACH,eAAO,MAAM,mBAAmB,uBAM9B,CAAC;AAEH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IACpC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC/C,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,eAAe,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC;IAC/C,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,WAAW,GAAG,SAAS,CAazB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAMjF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/entities/step.ts"],"sourcesContent":["import type {StepAttempt} from './step-attempt.js';\n\nexport type StepErrorReason =\n | 'checkout_failed'\n | 'checkout_auth_failed'\n | 'checkout_unavailable'\n | 'checkout_path_invalid'\n | 'checkout_destination_occupied'\n | 'git_unavailable'\n | 'workspace_prep_failed'\n | 'setup_aborted'\n | 'config_unresolvable'\n | 'output_invalid'\n | 'agent_config_invalid'\n | 'agent_invocation_failed'\n | 'agent_harness_unavailable';\nexport type AgentConfigIssue =\n | 'step_config_invalid'\n | 'provider_not_configured'\n | 'provider_unsupported'\n | 'model_unavailable'\n | 'credentials_invalid';\nexport type StepErrorCategory = 'setup' | 'user';\nexport const STEP_ERROR_REASONS = new Set<StepErrorReason>([\n 'checkout_failed',\n 'checkout_auth_failed',\n 'checkout_unavailable',\n 'checkout_path_invalid',\n 'checkout_destination_occupied',\n 'git_unavailable',\n 'workspace_prep_failed',\n 'setup_aborted',\n 'config_unresolvable',\n 'output_invalid',\n 'agent_config_invalid',\n 'agent_invocation_failed',\n 'agent_harness_unavailable',\n]);\nexport const AGENT_CONFIG_ISSUES = new Set<AgentConfigIssue>([\n 'step_config_invalid',\n 'provider_not_configured',\n 'provider_unsupported',\n 'model_unavailable',\n 'credentials_invalid',\n]);\n\nexport interface StepSourceLocation {\n startLine: number;\n endLine: number;\n}\n\nexport interface StepError {\n message: string;\n exitCode: number | null;\n signal: string | undefined;\n reason: StepErrorReason | undefined;\n agentConfigIssue: AgentConfigIssue | undefined;\n category: StepErrorCategory | undefined;\n}\n\nexport interface AgentStepConfig {\n provider: string | null;\n model: string | null;\n thinking: string | null;\n}\n\nexport interface Step {\n id: string;\n jobExecutionId: string;\n key: string | null;\n name: string;\n sourceLocation: StepSourceLocation | null;\n status: string;\n type: string;\n config: Record<string, unknown>;\n agentConfig: AgentStepConfig | null;\n error: StepError | null;\n position: number;\n currentAttempt: number;\n createdAt: string;\n updatedAt: string;\n attempts: StepAttempt[];\n}\n\nexport function resolveStepAttempt(\n step: Step,\n attemptId: string | undefined,\n): StepAttempt | undefined {\n const attemptById = attemptId\n ? step.attempts.find((attempt) => attempt.id === attemptId)\n : undefined;\n if (attemptById) return attemptById;\n\n const currentAttempt = step.attempts.find((attempt) => attempt.attempt === step.currentAttempt);\n if (currentAttempt) return currentAttempt;\n\n return step.attempts.reduce<StepAttempt | undefined>((latest, attempt) => {\n if (!latest) return attempt;\n return compareStepAttempts(attempt, latest) > 0 ? attempt : latest;\n }, undefined);\n}\n\nexport function compareStepAttempts(left: StepAttempt, right: StepAttempt): number {\n return (\n left.attempt - right.attempt ||\n left.executionOrder - right.executionOrder ||\n left.id.localeCompare(right.id)\n );\n}\n"],"names":["STEP_ERROR_REASONS","Set","AGENT_CONFIG_ISSUES","resolveStepAttempt","step","attemptId","attemptById","attempts","find","attempt","id","undefined","currentAttempt","reduce","latest","compareStepAttempts","left","right","executionOrder","localeCompare"],"mappings":"AAuBA,OAAO,MAAMA,qBAAqB,IAAIC,IAAqB;IACzD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,EAAE;AACH,OAAO,MAAMC,sBAAsB,IAAID,IAAsB;IAC3D;IACA;IACA;IACA;IACA;CACD,EAAE;AAwCH,OAAO,SAASE,mBACdC,IAAU,EACVC,SAA6B;IAE7B,MAAMC,cAAcD,YAChBD,KAAKG,QAAQ,CAACC,IAAI,CAAC,CAACC,UAAYA,QAAQC,EAAE,KAAKL,aAC/CM;IACJ,IAAIL,aAAa,OAAOA;IAExB,MAAMM,iBAAiBR,KAAKG,QAAQ,CAACC,IAAI,CAAC,CAACC,UAAYA,QAAQA,OAAO,KAAKL,KAAKQ,cAAc;IAC9F,IAAIA,gBAAgB,OAAOA;IAE3B,OAAOR,KAAKG,QAAQ,CAACM,MAAM,CAA0B,CAACC,QAAQL;QAC5D,IAAI,CAACK,QAAQ,OAAOL;QACpB,OAAOM,oBAAoBN,SAASK,UAAU,IAAIL,UAAUK;IAC9D,GAAGH;AACL;AAEA,OAAO,SAASI,oBAAoBC,IAAiB,EAAEC,KAAkB;IACvE,OACED,KAAKP,OAAO,GAAGQ,MAAMR,OAAO,IAC5BO,KAAKE,cAAc,GAAGD,MAAMC,cAAc,IAC1CF,KAAKN,EAAE,CAACS,aAAa,CAACF,MAAMP,EAAE;AAElC"}
1
+ {"version":3,"sources":["../../../src/core/entities/step.ts"],"sourcesContent":["import type {EvaluationTraceEntry, StepAttempt} from './step-attempt.js';\n\nexport type StepErrorReason =\n | 'checkout_failed'\n | 'checkout_auth_failed'\n | 'checkout_unavailable'\n | 'checkout_path_invalid'\n | 'checkout_destination_occupied'\n | 'git_unavailable'\n | 'workspace_prep_failed'\n | 'setup_aborted'\n | 'config_unresolvable'\n | 'output_invalid'\n | 'agent_config_invalid'\n | 'agent_invocation_failed'\n | 'agent_harness_unavailable';\nexport type AgentConfigIssue =\n | 'step_config_invalid'\n | 'provider_not_configured'\n | 'provider_unsupported'\n | 'model_unavailable'\n | 'credentials_invalid';\nexport type StepErrorCategory = 'setup' | 'user';\nexport const STEP_ERROR_REASONS = new Set<StepErrorReason>([\n 'checkout_failed',\n 'checkout_auth_failed',\n 'checkout_unavailable',\n 'checkout_path_invalid',\n 'checkout_destination_occupied',\n 'git_unavailable',\n 'workspace_prep_failed',\n 'setup_aborted',\n 'config_unresolvable',\n 'output_invalid',\n 'agent_config_invalid',\n 'agent_invocation_failed',\n 'agent_harness_unavailable',\n]);\nexport const AGENT_CONFIG_ISSUES = new Set<AgentConfigIssue>([\n 'step_config_invalid',\n 'provider_not_configured',\n 'provider_unsupported',\n 'model_unavailable',\n 'credentials_invalid',\n]);\n\nexport interface StepSourceLocation {\n startLine: number;\n endLine: number;\n}\n\nexport interface StepError {\n message: string;\n exitCode: number | null;\n signal: string | undefined;\n reason: StepErrorReason | undefined;\n agentConfigIssue: AgentConfigIssue | undefined;\n category: StepErrorCategory | undefined;\n}\n\nexport interface AgentStepConfig {\n provider: string | null;\n model: string | null;\n thinking: string | null;\n}\n\nexport interface Step {\n id: string;\n jobExecutionId: string;\n key: string | null;\n name: string;\n sourceLocation: StepSourceLocation | null;\n status: string;\n statusReason: string | null;\n type: string;\n config: Record<string, unknown>;\n evaluationTrace: EvaluationTraceEntry[] | null;\n agentConfig: AgentStepConfig | null;\n error: StepError | null;\n position: number;\n currentAttempt: number;\n createdAt: string;\n updatedAt: string;\n attempts: StepAttempt[];\n}\n\nexport function resolveStepAttempt(\n step: Step,\n attemptId: string | undefined,\n): StepAttempt | undefined {\n const attemptById = attemptId\n ? step.attempts.find((attempt) => attempt.id === attemptId)\n : undefined;\n if (attemptById) return attemptById;\n\n const currentAttempt = step.attempts.find((attempt) => attempt.attempt === step.currentAttempt);\n if (currentAttempt) return currentAttempt;\n\n return step.attempts.reduce<StepAttempt | undefined>((latest, attempt) => {\n if (!latest) return attempt;\n return compareStepAttempts(attempt, latest) > 0 ? attempt : latest;\n }, undefined);\n}\n\nexport function compareStepAttempts(left: StepAttempt, right: StepAttempt): number {\n return (\n left.attempt - right.attempt ||\n left.executionOrder - right.executionOrder ||\n left.id.localeCompare(right.id)\n );\n}\n"],"names":["STEP_ERROR_REASONS","Set","AGENT_CONFIG_ISSUES","resolveStepAttempt","step","attemptId","attemptById","attempts","find","attempt","id","undefined","currentAttempt","reduce","latest","compareStepAttempts","left","right","executionOrder","localeCompare"],"mappings":"AAuBA,OAAO,MAAMA,qBAAqB,IAAIC,IAAqB;IACzD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,EAAE;AACH,OAAO,MAAMC,sBAAsB,IAAID,IAAsB;IAC3D;IACA;IACA;IACA;IACA;CACD,EAAE;AA0CH,OAAO,SAASE,mBACdC,IAAU,EACVC,SAA6B;IAE7B,MAAMC,cAAcD,YAChBD,KAAKG,QAAQ,CAACC,IAAI,CAAC,CAACC,UAAYA,QAAQC,EAAE,KAAKL,aAC/CM;IACJ,IAAIL,aAAa,OAAOA;IAExB,MAAMM,iBAAiBR,KAAKG,QAAQ,CAACC,IAAI,CAAC,CAACC,UAAYA,QAAQA,OAAO,KAAKL,KAAKQ,cAAc;IAC9F,IAAIA,gBAAgB,OAAOA;IAE3B,OAAOR,KAAKG,QAAQ,CAACM,MAAM,CAA0B,CAACC,QAAQL;QAC5D,IAAI,CAACK,QAAQ,OAAOL;QACpB,OAAOM,oBAAoBN,SAASK,UAAU,IAAIL,UAAUK;IAC9D,GAAGH;AACL;AAEA,OAAO,SAASI,oBAAoBC,IAAiB,EAAEC,KAAkB;IACvE,OACED,KAAKP,OAAO,GAAGQ,MAAMR,OAAO,IAC5BO,KAAKE,cAAc,GAAGD,MAAMC,cAAc,IAC1CF,KAAKN,EAAE,CAACS,aAAa,CAACF,MAAMP,EAAE;AAElC"}
@@ -28,6 +28,12 @@ export interface RunAnnotationSummary {
28
28
  success: number;
29
29
  /** True when the read hit its page budget, so every count is a lower bound. */
30
30
  truncated: boolean;
31
+ /** Optional per-step counts used by the step inspector without loading annotation bodies. */
32
+ stepCounts?: readonly {
33
+ stepId: string;
34
+ attempt: number;
35
+ total: number;
36
+ }[];
31
37
  }
32
38
  /** Everything the annotations list needs to route back to the step that emitted an annotation. */
33
39
  export interface RunAnnotationOrigin {
@@ -1 +1 @@
1
- {"version":3,"file":"run-annotation.d.ts","sourceRoot":"","sources":["../../src/core/run-annotation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,mBAAmB,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,YAAI,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAE1F,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAY/E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kEAAkE;AAClE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,kGAAkG;AAClG,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,mBAAmB,CAAC;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,6FAA6F;IAC7F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAE1F;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,SAAS,aAAa,EAAE,EACrC,EAAC,SAAiB,EAAC,GAAE;IAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAM,GAC1D,oBAAoB,CAgBtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC5C,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,KAAK,GACN,EAAE,2BAA2B,GAAG,kBAAkB,EAAE,CAYpD;AAED,sFAAsF;AACtF,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,SAAS,aAAa,EAAE,EACrC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAM,GAC9C,oBAAoB,CAKtB;AAED,8DAA8D;AAC9D,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,oBAAoB,GAC5B,qBAAqB,GAAG,IAAI,CAE9B"}
1
+ {"version":3,"file":"run-annotation.d.ts","sourceRoot":"","sources":["../../src/core/run-annotation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/run-annotation.ts"],"sourcesContent":["import type {Job} from './workflow-run.js';\n\nexport type RunAnnotationStyle = 'default' | 'info' | 'success' | 'warning' | 'error';\n\n/**\n * The severities the run surfaces rank and filter by. The `default` style carries no severity:\n * it counts toward the total and sorts last, but no severity filter selects it.\n */\nexport const RUN_ANNOTATION_SEVERITIES = ['error', 'warning', 'info', 'success'] as const;\n\nexport type RunAnnotationSeverity = (typeof RUN_ANNOTATION_SEVERITIES)[number];\n\nconst SEVERITY_RANK: Record<RunAnnotationStyle, number> = {\n error: 0,\n warning: 1,\n info: 2,\n success: 3,\n default: 4,\n};\n\nconst SEVERITY_SET = new Set<string>(RUN_ANNOTATION_SEVERITIES);\n\nexport interface RunAnnotation {\n id: string;\n jobId: string;\n jobExecutionId: string;\n originStepId: string;\n originStepAttempt: number;\n context: string;\n style: RunAnnotationStyle;\n sequence: number;\n}\n\nexport interface RunAnnotationRecord extends RunAnnotation {\n body: string;\n}\n\n/** Counts shown by the run rail and the severity summary line. */\nexport interface RunAnnotationSummary {\n total: number;\n error: number;\n warning: number;\n info: number;\n success: number;\n /** True when the read hit its page budget, so every count is a lower bound. */\n truncated: boolean;\n}\n\n/** Everything the annotations list needs to route back to the step that emitted an annotation. */\nexport interface RunAnnotationOrigin {\n jobId: string;\n jobExecutionId: string;\n stepId: string;\n stepAttemptId: string;\n}\n\nexport interface RunAnnotationEntry {\n annotation: RunAnnotationRecord;\n jobName: string | null;\n /** Only set when the job ran more than once, so a single-execution job stays uncluttered. */\n executionLabel: string | null;\n stepLabel: string | null;\n attemptLabel: string;\n /** `null` when the run attempt no longer contains the emitting step, so no link is offered. */\n origin: RunAnnotationOrigin | null;\n}\n\nexport function annotationSeverity(style: RunAnnotationStyle): RunAnnotationSeverity | null {\n return SEVERITY_SET.has(style) ? (style as RunAnnotationSeverity) : null;\n}\n\nexport function summarizeRunAnnotations(\n annotations: readonly RunAnnotation[],\n {truncated = false}: {truncated?: boolean | undefined} = {},\n): RunAnnotationSummary {\n const summary: RunAnnotationSummary = {\n total: annotations.length,\n error: 0,\n warning: 0,\n info: 0,\n success: 0,\n truncated,\n };\n\n for (const annotation of annotations) {\n const severity = annotationSeverity(annotation.style);\n if (severity) summary[severity] += 1;\n }\n\n return summary;\n}\n\nexport interface BuildRunAnnotationListInput {\n annotations: readonly RunAnnotationRecord[];\n jobs: readonly Job[];\n severity?: RunAnnotationSeverity | undefined;\n jobId?: string | undefined;\n}\n\n/**\n * Ranks annotations for display.\n *\n * Severity leads: emission order is a log affordance, not a summary affordance. `sequence` is\n * only stable within one job execution, so the tie-break walks down job position and execution\n * sequence before using it, and ends on the id so the order never depends on input order.\n */\nexport function buildRunAnnotationList({\n annotations,\n jobs,\n severity,\n jobId,\n}: BuildRunAnnotationListInput): RunAnnotationEntry[] {\n const index = indexJobs(jobs);\n const entries: RunAnnotationEntry[] = [];\n\n for (const annotation of annotations) {\n if (jobId && annotation.jobId !== jobId) continue;\n const annotationSeverityValue = annotationSeverity(annotation.style);\n if (severity && annotationSeverityValue !== severity) continue;\n entries.push(toEntry(annotation, index));\n }\n\n return entries.sort((left, right) => compareEntries(left, right, index));\n}\n\n/** Counts annotations owned by one job, for the job page's bounded reference chip. */\nexport function summarizeJobAnnotations(\n annotations: readonly RunAnnotation[],\n jobId: string,\n options: {truncated?: boolean | undefined} = {},\n): RunAnnotationSummary {\n return summarizeRunAnnotations(\n annotations.filter((annotation) => annotation.jobId === jobId),\n options,\n );\n}\n\n/** The loudest severity present, which tints a count chip. */\nexport function highestRunAnnotationSeverity(\n summary: RunAnnotationSummary,\n): RunAnnotationSeverity | null {\n return RUN_ANNOTATION_SEVERITIES.find((severity) => summary[severity] > 0) ?? null;\n}\n\ninterface JobIndexEntry {\n position: number;\n name: string;\n executionCount: number;\n executions: Map<string, JobExecutionIndexEntry>;\n}\n\ninterface JobExecutionIndexEntry {\n sequence: number;\n steps: Map<string, {label: string; attemptIds: Map<number, string>}>;\n}\n\nfunction indexJobs(jobs: readonly Job[]): Map<string, JobIndexEntry> {\n const index = new Map<string, JobIndexEntry>();\n\n for (const job of jobs) {\n const executions = new Map<string, JobExecutionIndexEntry>();\n for (const execution of job.jobExecutions) {\n const steps = new Map<string, {label: string; attemptIds: Map<number, string>}>();\n for (const step of execution.steps) {\n const attemptIds = new Map<number, string>();\n for (const attempt of step.attempts) attemptIds.set(attempt.attempt, attempt.id);\n steps.set(step.id, {label: step.name || step.key || step.id, attemptIds});\n }\n executions.set(execution.id, {sequence: execution.sequence, steps});\n }\n\n index.set(job.id, {\n position: job.position,\n name: job.displayName,\n executionCount: job.jobExecutions.length,\n executions,\n });\n }\n\n return index;\n}\n\nfunction toEntry(\n annotation: RunAnnotationRecord,\n index: Map<string, JobIndexEntry>,\n): RunAnnotationEntry {\n const job = index.get(annotation.jobId);\n const execution = job?.executions.get(annotation.jobExecutionId);\n const step = execution?.steps.get(annotation.originStepId);\n const stepAttemptId = step?.attemptIds.get(annotation.originStepAttempt);\n\n return {\n annotation,\n jobName: job?.name ?? null,\n executionLabel:\n execution && job && job.executionCount > 1 ? `execution #${execution.sequence}` : null,\n stepLabel: step?.label ?? null,\n attemptLabel: `attempt ${annotation.originStepAttempt}`,\n origin: stepAttemptId\n ? {\n jobId: annotation.jobId,\n jobExecutionId: annotation.jobExecutionId,\n stepId: annotation.originStepId,\n stepAttemptId,\n }\n : null,\n };\n}\n\nfunction compareEntries(\n left: RunAnnotationEntry,\n right: RunAnnotationEntry,\n index: Map<string, JobIndexEntry>,\n): number {\n const bySeverity = SEVERITY_RANK[left.annotation.style] - SEVERITY_RANK[right.annotation.style];\n if (bySeverity !== 0) return bySeverity;\n\n const byJob = jobPosition(left, index) - jobPosition(right, index);\n if (byJob !== 0) return byJob;\n\n const byExecution = executionSequence(left, index) - executionSequence(right, index);\n if (byExecution !== 0) return byExecution;\n\n const bySequence = left.annotation.sequence - right.annotation.sequence;\n if (bySequence !== 0) return bySequence;\n\n return left.annotation.id.localeCompare(right.annotation.id);\n}\n\n/** An unmatched job sorts last rather than first, so known provenance leads the list. */\nfunction jobPosition(entry: RunAnnotationEntry, index: Map<string, JobIndexEntry>): number {\n return index.get(entry.annotation.jobId)?.position ?? Number.MAX_SAFE_INTEGER;\n}\n\nfunction executionSequence(entry: RunAnnotationEntry, index: Map<string, JobIndexEntry>): number {\n const job = index.get(entry.annotation.jobId);\n return job?.executions.get(entry.annotation.jobExecutionId)?.sequence ?? Number.MAX_SAFE_INTEGER;\n}\n"],"names":["RUN_ANNOTATION_SEVERITIES","SEVERITY_RANK","error","warning","info","success","default","SEVERITY_SET","Set","annotationSeverity","style","has","summarizeRunAnnotations","annotations","truncated","summary","total","length","annotation","severity","buildRunAnnotationList","jobs","jobId","index","indexJobs","entries","annotationSeverityValue","push","toEntry","sort","left","right","compareEntries","summarizeJobAnnotations","options","filter","highestRunAnnotationSeverity","find","Map","job","executions","execution","jobExecutions","steps","step","attemptIds","attempt","attempts","set","id","label","name","key","sequence","position","displayName","executionCount","get","jobExecutionId","originStepId","stepAttemptId","originStepAttempt","jobName","executionLabel","stepLabel","attemptLabel","origin","stepId","bySeverity","byJob","jobPosition","byExecution","executionSequence","bySequence","localeCompare","entry","Number","MAX_SAFE_INTEGER"],"mappings":"AAIA;;;CAGC,GACD,OAAO,MAAMA,4BAA4B;IAAC;IAAS;IAAW;IAAQ;CAAU,CAAU;AAI1F,MAAMC,gBAAoD;IACxDC,OAAO;IACPC,SAAS;IACTC,MAAM;IACNC,SAAS;IACTC,SAAS;AACX;AAEA,MAAMC,eAAe,IAAIC,IAAYR;AA+CrC,OAAO,SAASS,mBAAmBC,KAAyB;IAC1D,OAAOH,aAAaI,GAAG,CAACD,SAAUA,QAAkC;AACtE;AAEA,OAAO,SAASE,wBACdC,WAAqC,EACrC,EAACC,YAAY,KAAK,EAAoC,GAAG,CAAC,CAAC;IAE3D,MAAMC,UAAgC;QACpCC,OAAOH,YAAYI,MAAM;QACzBf,OAAO;QACPC,SAAS;QACTC,MAAM;QACNC,SAAS;QACTS;IACF;IAEA,KAAK,MAAMI,cAAcL,YAAa;QACpC,MAAMM,WAAWV,mBAAmBS,WAAWR,KAAK;QACpD,IAAIS,UAAUJ,OAAO,CAACI,SAAS,IAAI;IACrC;IAEA,OAAOJ;AACT;AASA;;;;;;CAMC,GACD,OAAO,SAASK,uBAAuB,EACrCP,WAAW,EACXQ,IAAI,EACJF,QAAQ,EACRG,KAAK,EACuB;IAC5B,MAAMC,QAAQC,UAAUH;IACxB,MAAMI,UAAgC,EAAE;IAExC,KAAK,MAAMP,cAAcL,YAAa;QACpC,IAAIS,SAASJ,WAAWI,KAAK,KAAKA,OAAO;QACzC,MAAMI,0BAA0BjB,mBAAmBS,WAAWR,KAAK;QACnE,IAAIS,YAAYO,4BAA4BP,UAAU;QACtDM,QAAQE,IAAI,CAACC,QAAQV,YAAYK;IACnC;IAEA,OAAOE,QAAQI,IAAI,CAAC,CAACC,MAAMC,QAAUC,eAAeF,MAAMC,OAAOR;AACnE;AAEA,oFAAoF,GACpF,OAAO,SAASU,wBACdpB,WAAqC,EACrCS,KAAa,EACbY,UAA6C,CAAC,CAAC;IAE/C,OAAOtB,wBACLC,YAAYsB,MAAM,CAAC,CAACjB,aAAeA,WAAWI,KAAK,KAAKA,QACxDY;AAEJ;AAEA,4DAA4D,GAC5D,OAAO,SAASE,6BACdrB,OAA6B;IAE7B,OAAOf,0BAA0BqC,IAAI,CAAC,CAAClB,WAAaJ,OAAO,CAACI,SAAS,GAAG,MAAM;AAChF;AAcA,SAASK,UAAUH,IAAoB;IACrC,MAAME,QAAQ,IAAIe;IAElB,KAAK,MAAMC,OAAOlB,KAAM;QACtB,MAAMmB,aAAa,IAAIF;QACvB,KAAK,MAAMG,aAAaF,IAAIG,aAAa,CAAE;YACzC,MAAMC,QAAQ,IAAIL;YAClB,KAAK,MAAMM,QAAQH,UAAUE,KAAK,CAAE;gBAClC,MAAME,aAAa,IAAIP;gBACvB,KAAK,MAAMQ,WAAWF,KAAKG,QAAQ,CAAEF,WAAWG,GAAG,CAACF,QAAQA,OAAO,EAAEA,QAAQG,EAAE;gBAC/EN,MAAMK,GAAG,CAACJ,KAAKK,EAAE,EAAE;oBAACC,OAAON,KAAKO,IAAI,IAAIP,KAAKQ,GAAG,IAAIR,KAAKK,EAAE;oBAAEJ;gBAAU;YACzE;YACAL,WAAWQ,GAAG,CAACP,UAAUQ,EAAE,EAAE;gBAACI,UAAUZ,UAAUY,QAAQ;gBAAEV;YAAK;QACnE;QAEApB,MAAMyB,GAAG,CAACT,IAAIU,EAAE,EAAE;YAChBK,UAAUf,IAAIe,QAAQ;YACtBH,MAAMZ,IAAIgB,WAAW;YACrBC,gBAAgBjB,IAAIG,aAAa,CAACzB,MAAM;YACxCuB;QACF;IACF;IAEA,OAAOjB;AACT;AAEA,SAASK,QACPV,UAA+B,EAC/BK,KAAiC;IAEjC,MAAMgB,MAAMhB,MAAMkC,GAAG,CAACvC,WAAWI,KAAK;IACtC,MAAMmB,YAAYF,KAAKC,WAAWiB,IAAIvC,WAAWwC,cAAc;IAC/D,MAAMd,OAAOH,WAAWE,MAAMc,IAAIvC,WAAWyC,YAAY;IACzD,MAAMC,gBAAgBhB,MAAMC,WAAWY,IAAIvC,WAAW2C,iBAAiB;IAEvE,OAAO;QACL3C;QACA4C,SAASvB,KAAKY,QAAQ;QACtBY,gBACEtB,aAAaF,OAAOA,IAAIiB,cAAc,GAAG,IAAI,CAAC,WAAW,EAAEf,UAAUY,QAAQ,EAAE,GAAG;QACpFW,WAAWpB,MAAMM,SAAS;QAC1Be,cAAc,CAAC,QAAQ,EAAE/C,WAAW2C,iBAAiB,EAAE;QACvDK,QAAQN,gBACJ;YACEtC,OAAOJ,WAAWI,KAAK;YACvBoC,gBAAgBxC,WAAWwC,cAAc;YACzCS,QAAQjD,WAAWyC,YAAY;YAC/BC;QACF,IACA;IACN;AACF;AAEA,SAAS5B,eACPF,IAAwB,EACxBC,KAAyB,EACzBR,KAAiC;IAEjC,MAAM6C,aAAanE,aAAa,CAAC6B,KAAKZ,UAAU,CAACR,KAAK,CAAC,GAAGT,aAAa,CAAC8B,MAAMb,UAAU,CAACR,KAAK,CAAC;IAC/F,IAAI0D,eAAe,GAAG,OAAOA;IAE7B,MAAMC,QAAQC,YAAYxC,MAAMP,SAAS+C,YAAYvC,OAAOR;IAC5D,IAAI8C,UAAU,GAAG,OAAOA;IAExB,MAAME,cAAcC,kBAAkB1C,MAAMP,SAASiD,kBAAkBzC,OAAOR;IAC9E,IAAIgD,gBAAgB,GAAG,OAAOA;IAE9B,MAAME,aAAa3C,KAAKZ,UAAU,CAACmC,QAAQ,GAAGtB,MAAMb,UAAU,CAACmC,QAAQ;IACvE,IAAIoB,eAAe,GAAG,OAAOA;IAE7B,OAAO3C,KAAKZ,UAAU,CAAC+B,EAAE,CAACyB,aAAa,CAAC3C,MAAMb,UAAU,CAAC+B,EAAE;AAC7D;AAEA,uFAAuF,GACvF,SAASqB,YAAYK,KAAyB,EAAEpD,KAAiC;IAC/E,OAAOA,MAAMkC,GAAG,CAACkB,MAAMzD,UAAU,CAACI,KAAK,GAAGgC,YAAYsB,OAAOC,gBAAgB;AAC/E;AAEA,SAASL,kBAAkBG,KAAyB,EAAEpD,KAAiC;IACrF,MAAMgB,MAAMhB,MAAMkC,GAAG,CAACkB,MAAMzD,UAAU,CAACI,KAAK;IAC5C,OAAOiB,KAAKC,WAAWiB,IAAIkB,MAAMzD,UAAU,CAACwC,cAAc,GAAGL,YAAYuB,OAAOC,gBAAgB;AAClG"}
1
+ {"version":3,"sources":["../../src/core/run-annotation.ts"],"sourcesContent":["import type {Job} from './workflow-run.js';\n\nexport type RunAnnotationStyle = 'default' | 'info' | 'success' | 'warning' | 'error';\n\n/**\n * The severities the run surfaces rank and filter by. The `default` style carries no severity:\n * it counts toward the total and sorts last, but no severity filter selects it.\n */\nexport const RUN_ANNOTATION_SEVERITIES = ['error', 'warning', 'info', 'success'] as const;\n\nexport type RunAnnotationSeverity = (typeof RUN_ANNOTATION_SEVERITIES)[number];\n\nconst SEVERITY_RANK: Record<RunAnnotationStyle, number> = {\n error: 0,\n warning: 1,\n info: 2,\n success: 3,\n default: 4,\n};\n\nconst SEVERITY_SET = new Set<string>(RUN_ANNOTATION_SEVERITIES);\n\nexport interface RunAnnotation {\n id: string;\n jobId: string;\n jobExecutionId: string;\n originStepId: string;\n originStepAttempt: number;\n context: string;\n style: RunAnnotationStyle;\n sequence: number;\n}\n\nexport interface RunAnnotationRecord extends RunAnnotation {\n body: string;\n}\n\n/** Counts shown by the run rail and the severity summary line. */\nexport interface RunAnnotationSummary {\n total: number;\n error: number;\n warning: number;\n info: number;\n success: number;\n /** True when the read hit its page budget, so every count is a lower bound. */\n truncated: boolean;\n /** Optional per-step counts used by the step inspector without loading annotation bodies. */\n stepCounts?: readonly {\n stepId: string;\n attempt: number;\n total: number;\n }[];\n}\n\n/** Everything the annotations list needs to route back to the step that emitted an annotation. */\nexport interface RunAnnotationOrigin {\n jobId: string;\n jobExecutionId: string;\n stepId: string;\n stepAttemptId: string;\n}\n\nexport interface RunAnnotationEntry {\n annotation: RunAnnotationRecord;\n jobName: string | null;\n /** Only set when the job ran more than once, so a single-execution job stays uncluttered. */\n executionLabel: string | null;\n stepLabel: string | null;\n attemptLabel: string;\n /** `null` when the run attempt no longer contains the emitting step, so no link is offered. */\n origin: RunAnnotationOrigin | null;\n}\n\nexport function annotationSeverity(style: RunAnnotationStyle): RunAnnotationSeverity | null {\n return SEVERITY_SET.has(style) ? (style as RunAnnotationSeverity) : null;\n}\n\nexport function summarizeRunAnnotations(\n annotations: readonly RunAnnotation[],\n {truncated = false}: {truncated?: boolean | undefined} = {},\n): RunAnnotationSummary {\n const summary: RunAnnotationSummary = {\n total: annotations.length,\n error: 0,\n warning: 0,\n info: 0,\n success: 0,\n truncated,\n };\n\n for (const annotation of annotations) {\n const severity = annotationSeverity(annotation.style);\n if (severity) summary[severity] += 1;\n }\n\n return summary;\n}\n\nexport interface BuildRunAnnotationListInput {\n annotations: readonly RunAnnotationRecord[];\n jobs: readonly Job[];\n severity?: RunAnnotationSeverity | undefined;\n jobId?: string | undefined;\n}\n\n/**\n * Ranks annotations for display.\n *\n * Severity leads: emission order is a log affordance, not a summary affordance. `sequence` is\n * only stable within one job execution, so the tie-break walks down job position and execution\n * sequence before using it, and ends on the id so the order never depends on input order.\n */\nexport function buildRunAnnotationList({\n annotations,\n jobs,\n severity,\n jobId,\n}: BuildRunAnnotationListInput): RunAnnotationEntry[] {\n const index = indexJobs(jobs);\n const entries: RunAnnotationEntry[] = [];\n\n for (const annotation of annotations) {\n if (jobId && annotation.jobId !== jobId) continue;\n const annotationSeverityValue = annotationSeverity(annotation.style);\n if (severity && annotationSeverityValue !== severity) continue;\n entries.push(toEntry(annotation, index));\n }\n\n return entries.sort((left, right) => compareEntries(left, right, index));\n}\n\n/** Counts annotations owned by one job, for the job page's bounded reference chip. */\nexport function summarizeJobAnnotations(\n annotations: readonly RunAnnotation[],\n jobId: string,\n options: {truncated?: boolean | undefined} = {},\n): RunAnnotationSummary {\n return summarizeRunAnnotations(\n annotations.filter((annotation) => annotation.jobId === jobId),\n options,\n );\n}\n\n/** The loudest severity present, which tints a count chip. */\nexport function highestRunAnnotationSeverity(\n summary: RunAnnotationSummary,\n): RunAnnotationSeverity | null {\n return RUN_ANNOTATION_SEVERITIES.find((severity) => summary[severity] > 0) ?? null;\n}\n\ninterface JobIndexEntry {\n position: number;\n name: string;\n executionCount: number;\n executions: Map<string, JobExecutionIndexEntry>;\n}\n\ninterface JobExecutionIndexEntry {\n sequence: number;\n steps: Map<string, {label: string; attemptIds: Map<number, string>}>;\n}\n\nfunction indexJobs(jobs: readonly Job[]): Map<string, JobIndexEntry> {\n const index = new Map<string, JobIndexEntry>();\n\n for (const job of jobs) {\n const executions = new Map<string, JobExecutionIndexEntry>();\n for (const execution of job.jobExecutions) {\n const steps = new Map<string, {label: string; attemptIds: Map<number, string>}>();\n for (const step of execution.steps) {\n const attemptIds = new Map<number, string>();\n for (const attempt of step.attempts) attemptIds.set(attempt.attempt, attempt.id);\n steps.set(step.id, {label: step.name || step.key || step.id, attemptIds});\n }\n executions.set(execution.id, {sequence: execution.sequence, steps});\n }\n\n index.set(job.id, {\n position: job.position,\n name: job.displayName,\n executionCount: job.jobExecutions.length,\n executions,\n });\n }\n\n return index;\n}\n\nfunction toEntry(\n annotation: RunAnnotationRecord,\n index: Map<string, JobIndexEntry>,\n): RunAnnotationEntry {\n const job = index.get(annotation.jobId);\n const execution = job?.executions.get(annotation.jobExecutionId);\n const step = execution?.steps.get(annotation.originStepId);\n const stepAttemptId = step?.attemptIds.get(annotation.originStepAttempt);\n\n return {\n annotation,\n jobName: job?.name ?? null,\n executionLabel:\n execution && job && job.executionCount > 1 ? `execution #${execution.sequence}` : null,\n stepLabel: step?.label ?? null,\n attemptLabel: `attempt ${annotation.originStepAttempt}`,\n origin: stepAttemptId\n ? {\n jobId: annotation.jobId,\n jobExecutionId: annotation.jobExecutionId,\n stepId: annotation.originStepId,\n stepAttemptId,\n }\n : null,\n };\n}\n\nfunction compareEntries(\n left: RunAnnotationEntry,\n right: RunAnnotationEntry,\n index: Map<string, JobIndexEntry>,\n): number {\n const bySeverity = SEVERITY_RANK[left.annotation.style] - SEVERITY_RANK[right.annotation.style];\n if (bySeverity !== 0) return bySeverity;\n\n const byJob = jobPosition(left, index) - jobPosition(right, index);\n if (byJob !== 0) return byJob;\n\n const byExecution = executionSequence(left, index) - executionSequence(right, index);\n if (byExecution !== 0) return byExecution;\n\n const bySequence = left.annotation.sequence - right.annotation.sequence;\n if (bySequence !== 0) return bySequence;\n\n return left.annotation.id.localeCompare(right.annotation.id);\n}\n\n/** An unmatched job sorts last rather than first, so known provenance leads the list. */\nfunction jobPosition(entry: RunAnnotationEntry, index: Map<string, JobIndexEntry>): number {\n return index.get(entry.annotation.jobId)?.position ?? Number.MAX_SAFE_INTEGER;\n}\n\nfunction executionSequence(entry: RunAnnotationEntry, index: Map<string, JobIndexEntry>): number {\n const job = index.get(entry.annotation.jobId);\n return job?.executions.get(entry.annotation.jobExecutionId)?.sequence ?? Number.MAX_SAFE_INTEGER;\n}\n"],"names":["RUN_ANNOTATION_SEVERITIES","SEVERITY_RANK","error","warning","info","success","default","SEVERITY_SET","Set","annotationSeverity","style","has","summarizeRunAnnotations","annotations","truncated","summary","total","length","annotation","severity","buildRunAnnotationList","jobs","jobId","index","indexJobs","entries","annotationSeverityValue","push","toEntry","sort","left","right","compareEntries","summarizeJobAnnotations","options","filter","highestRunAnnotationSeverity","find","Map","job","executions","execution","jobExecutions","steps","step","attemptIds","attempt","attempts","set","id","label","name","key","sequence","position","displayName","executionCount","get","jobExecutionId","originStepId","stepAttemptId","originStepAttempt","jobName","executionLabel","stepLabel","attemptLabel","origin","stepId","bySeverity","byJob","jobPosition","byExecution","executionSequence","bySequence","localeCompare","entry","Number","MAX_SAFE_INTEGER"],"mappings":"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"}
@@ -4,7 +4,7 @@ export type { JobExecutionDisplayDuration, JobExecutionDisplayStatus, JobExecuti
4
4
  export { deriveJobExecutionDisplayStatus, elapsedTimeFromTimestamps, isTerminalJobExecutionStatus, JobExecution, } from './entities/job-execution.js';
5
5
  export type { AgentConfigIssue, AgentStepConfig, Step, StepError, StepErrorCategory, StepErrorReason, StepSourceLocation, } from './entities/step.js';
6
6
  export { AGENT_CONFIG_ISSUES, compareStepAttempts, resolveStepAttempt, STEP_ERROR_REASONS, } from './entities/step.js';
7
- export type { StepAttemptDisplayDuration, StepGateResult, } from './entities/step-attempt.js';
7
+ export type { EvaluationTraceEntry, EvaluationTraceLimitEntry, EvaluationTraceValueEntry, StepAttemptDetail, StepAttemptDisplayDuration, StepGateResult, } from './entities/step-attempt.js';
8
8
  export { StepAttempt } from './entities/step-attempt.js';
9
9
  export type { ManualWorkflowLaunch, WorkflowDisplayStatus, WorkflowRun, WorkflowRunDetail, WorkflowRunDisplay, WorkflowRunDisplayDuration, WorkflowRunJobStatusCount, WorkflowRunJobSummary, WorkflowRunJobs, WorkflowRunListItem, WorkflowRunListPage, WorkflowRunProgress, WorkflowRunRecord, WorkflowRunRerunMode, WorkflowRunStatus, WorkflowRunTriggerReference, WorkflowSourceSnapshot, WorkflowStatus, } from './entities/workflow-run.js';
10
10
  export { deriveWorkflowRunDisplay, isWorkflowRunTerminal, isWorkflowStatus, TERMINAL_WORKFLOW_RUN_STATUSES, WORKFLOW_DISPLAY_STATUSES, WORKFLOW_RUN_STATUSES, workflowRunActor, workflowRunBlockingJob, workflowRunBranchLabel, workflowRunCommitLabel, workflowRunDetailDisplay, workflowRunFirstStartedAt, workflowRunListItemDisplay, workflowRunTriggerDisplayLabel, workflowRunTriggerLabel, } from './entities/workflow-run.js';
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-run.d.ts","sourceRoot":"","sources":["../../src/core/workflow-run.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,GAAG,EACH,mBAAmB,EACnB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,4BAA4B,EAC5B,YAAY,GACb,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,IAAI,EACJ,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,0BAA0B,EAC1B,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AACvD,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,8BAA8B,EAC9B,yBAAyB,EACzB,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,8BAA8B,EAC9B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAC,iCAAiC,EAAC,MAAM,oCAAoC,CAAC;AAC1F,OAAO,EAAC,kBAAkB,EAAE,yBAAyB,EAAC,MAAM,oCAAoC,CAAC"}
1
+ {"version":3,"file":"workflow-run.d.ts","sourceRoot":"","sources":["../../src/core/workflow-run.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,GAAG,EACH,mBAAmB,EACnB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,4BAA4B,EAC5B,YAAY,GACb,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,IAAI,EACJ,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AACvD,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,8BAA8B,EAC9B,yBAAyB,EACzB,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,8BAA8B,EAC9B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAC,iCAAiC,EAAC,MAAM,oCAAoC,CAAC;AAC1F,OAAO,EAAC,kBAAkB,EAAE,yBAAyB,EAAC,MAAM,oCAAoC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/workflow-run.ts"],"sourcesContent":["export type {\n JobDisplayDuration,\n JobDisplayStatus,\n JobListening,\n JobMode,\n JobStatus,\n JobStatusReason,\n ListenerStatus,\n ResolutionReason,\n} from './entities/job.js';\nexport {\n defaultJobExecution,\n deriveJobDisplayStatus,\n isTerminalJobStatus,\n Job,\n resolveJobExecution,\n TERMINAL_WORKFLOW_JOB_STATUSES,\n WORKFLOW_JOB_STATUSES,\n} from './entities/job.js';\nexport type {\n JobExecutionDisplayDuration,\n JobExecutionDisplayStatus,\n JobExecutionStatus,\n JobExecutionTime,\n WorkflowExecutionEvent,\n} from './entities/job-execution.js';\nexport {\n deriveJobExecutionDisplayStatus,\n elapsedTimeFromTimestamps,\n isTerminalJobExecutionStatus,\n JobExecution,\n} from './entities/job-execution.js';\nexport type {\n AgentConfigIssue,\n AgentStepConfig,\n Step,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepSourceLocation,\n} from './entities/step.js';\nexport {\n AGENT_CONFIG_ISSUES,\n compareStepAttempts,\n resolveStepAttempt,\n STEP_ERROR_REASONS,\n} from './entities/step.js';\nexport type {\n StepAttemptDisplayDuration,\n StepGateResult,\n} from './entities/step-attempt.js';\nexport {StepAttempt} from './entities/step-attempt.js';\nexport type {\n ManualWorkflowLaunch,\n WorkflowDisplayStatus,\n WorkflowRun,\n WorkflowRunDetail,\n WorkflowRunDisplay,\n WorkflowRunDisplayDuration,\n WorkflowRunJobStatusCount,\n WorkflowRunJobSummary,\n WorkflowRunJobs,\n WorkflowRunListItem,\n WorkflowRunListPage,\n WorkflowRunProgress,\n WorkflowRunRecord,\n WorkflowRunRerunMode,\n WorkflowRunStatus,\n WorkflowRunTriggerReference,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from './entities/workflow-run.js';\nexport {\n deriveWorkflowRunDisplay,\n isWorkflowRunTerminal,\n isWorkflowStatus,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_DISPLAY_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunActor,\n workflowRunBlockingJob,\n workflowRunBranchLabel,\n workflowRunCommitLabel,\n workflowRunDetailDisplay,\n workflowRunFirstStartedAt,\n workflowRunListItemDisplay,\n workflowRunTriggerDisplayLabel,\n workflowRunTriggerLabel,\n} from './entities/workflow-run.js';\nexport type {WorkflowRunAttemptDisplayDuration} from './entities/workflow-run-attempt.js';\nexport {WorkflowRunAttempt, WorkflowRunAttemptSummary} from './entities/workflow-run-attempt.js';\n"],"names":["defaultJobExecution","deriveJobDisplayStatus","isTerminalJobStatus","Job","resolveJobExecution","TERMINAL_WORKFLOW_JOB_STATUSES","WORKFLOW_JOB_STATUSES","deriveJobExecutionDisplayStatus","elapsedTimeFromTimestamps","isTerminalJobExecutionStatus","JobExecution","AGENT_CONFIG_ISSUES","compareStepAttempts","resolveStepAttempt","STEP_ERROR_REASONS","StepAttempt","deriveWorkflowRunDisplay","isWorkflowRunTerminal","isWorkflowStatus","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_DISPLAY_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunActor","workflowRunBlockingJob","workflowRunBranchLabel","workflowRunCommitLabel","workflowRunDetailDisplay","workflowRunFirstStartedAt","workflowRunListItemDisplay","workflowRunTriggerDisplayLabel","workflowRunTriggerLabel","WorkflowRunAttempt","WorkflowRunAttemptSummary"],"mappings":"AAUA,SACEA,mBAAmB,EACnBC,sBAAsB,EACtBC,mBAAmB,EACnBC,GAAG,EACHC,mBAAmB,EACnBC,8BAA8B,EAC9BC,qBAAqB,QAChB,oBAAoB;AAQ3B,SACEC,+BAA+B,EAC/BC,yBAAyB,EACzBC,4BAA4B,EAC5BC,YAAY,QACP,8BAA8B;AAUrC,SACEC,mBAAmB,EACnBC,mBAAmB,EACnBC,kBAAkB,EAClBC,kBAAkB,QACb,qBAAqB;AAK5B,SAAQC,WAAW,QAAO,6BAA6B;AAqBvD,SACEC,wBAAwB,EACxBC,qBAAqB,EACrBC,gBAAgB,EAChBC,8BAA8B,EAC9BC,yBAAyB,EACzBC,qBAAqB,EACrBC,gBAAgB,EAChBC,sBAAsB,EACtBC,sBAAsB,EACtBC,sBAAsB,EACtBC,wBAAwB,EACxBC,yBAAyB,EACzBC,0BAA0B,EAC1BC,8BAA8B,EAC9BC,uBAAuB,QAClB,6BAA6B;AAEpC,SAAQC,kBAAkB,EAAEC,yBAAyB,QAAO,qCAAqC"}
1
+ {"version":3,"sources":["../../src/core/workflow-run.ts"],"sourcesContent":["export type {\n JobDisplayDuration,\n JobDisplayStatus,\n JobListening,\n JobMode,\n JobStatus,\n JobStatusReason,\n ListenerStatus,\n ResolutionReason,\n} from './entities/job.js';\nexport {\n defaultJobExecution,\n deriveJobDisplayStatus,\n isTerminalJobStatus,\n Job,\n resolveJobExecution,\n TERMINAL_WORKFLOW_JOB_STATUSES,\n WORKFLOW_JOB_STATUSES,\n} from './entities/job.js';\nexport type {\n JobExecutionDisplayDuration,\n JobExecutionDisplayStatus,\n JobExecutionStatus,\n JobExecutionTime,\n WorkflowExecutionEvent,\n} from './entities/job-execution.js';\nexport {\n deriveJobExecutionDisplayStatus,\n elapsedTimeFromTimestamps,\n isTerminalJobExecutionStatus,\n JobExecution,\n} from './entities/job-execution.js';\nexport type {\n AgentConfigIssue,\n AgentStepConfig,\n Step,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepSourceLocation,\n} from './entities/step.js';\nexport {\n AGENT_CONFIG_ISSUES,\n compareStepAttempts,\n resolveStepAttempt,\n STEP_ERROR_REASONS,\n} from './entities/step.js';\nexport type {\n EvaluationTraceEntry,\n EvaluationTraceLimitEntry,\n EvaluationTraceValueEntry,\n StepAttemptDetail,\n StepAttemptDisplayDuration,\n StepGateResult,\n} from './entities/step-attempt.js';\nexport {StepAttempt} from './entities/step-attempt.js';\nexport type {\n ManualWorkflowLaunch,\n WorkflowDisplayStatus,\n WorkflowRun,\n WorkflowRunDetail,\n WorkflowRunDisplay,\n WorkflowRunDisplayDuration,\n WorkflowRunJobStatusCount,\n WorkflowRunJobSummary,\n WorkflowRunJobs,\n WorkflowRunListItem,\n WorkflowRunListPage,\n WorkflowRunProgress,\n WorkflowRunRecord,\n WorkflowRunRerunMode,\n WorkflowRunStatus,\n WorkflowRunTriggerReference,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from './entities/workflow-run.js';\nexport {\n deriveWorkflowRunDisplay,\n isWorkflowRunTerminal,\n isWorkflowStatus,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_DISPLAY_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunActor,\n workflowRunBlockingJob,\n workflowRunBranchLabel,\n workflowRunCommitLabel,\n workflowRunDetailDisplay,\n workflowRunFirstStartedAt,\n workflowRunListItemDisplay,\n workflowRunTriggerDisplayLabel,\n workflowRunTriggerLabel,\n} from './entities/workflow-run.js';\nexport type {WorkflowRunAttemptDisplayDuration} from './entities/workflow-run-attempt.js';\nexport {WorkflowRunAttempt, WorkflowRunAttemptSummary} from './entities/workflow-run-attempt.js';\n"],"names":["defaultJobExecution","deriveJobDisplayStatus","isTerminalJobStatus","Job","resolveJobExecution","TERMINAL_WORKFLOW_JOB_STATUSES","WORKFLOW_JOB_STATUSES","deriveJobExecutionDisplayStatus","elapsedTimeFromTimestamps","isTerminalJobExecutionStatus","JobExecution","AGENT_CONFIG_ISSUES","compareStepAttempts","resolveStepAttempt","STEP_ERROR_REASONS","StepAttempt","deriveWorkflowRunDisplay","isWorkflowRunTerminal","isWorkflowStatus","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_DISPLAY_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunActor","workflowRunBlockingJob","workflowRunBranchLabel","workflowRunCommitLabel","workflowRunDetailDisplay","workflowRunFirstStartedAt","workflowRunListItemDisplay","workflowRunTriggerDisplayLabel","workflowRunTriggerLabel","WorkflowRunAttempt","WorkflowRunAttemptSummary"],"mappings":"AAUA,SACEA,mBAAmB,EACnBC,sBAAsB,EACtBC,mBAAmB,EACnBC,GAAG,EACHC,mBAAmB,EACnBC,8BAA8B,EAC9BC,qBAAqB,QAChB,oBAAoB;AAQ3B,SACEC,+BAA+B,EAC/BC,yBAAyB,EACzBC,4BAA4B,EAC5BC,YAAY,QACP,8BAA8B;AAUrC,SACEC,mBAAmB,EACnBC,mBAAmB,EACnBC,kBAAkB,EAClBC,kBAAkB,QACb,qBAAqB;AAS5B,SAAQC,WAAW,QAAO,6BAA6B;AAqBvD,SACEC,wBAAwB,EACxBC,qBAAqB,EACrBC,gBAAgB,EAChBC,8BAA8B,EAC9BC,yBAAyB,EACzBC,qBAAqB,EACrBC,gBAAgB,EAChBC,sBAAsB,EACtBC,sBAAsB,EACtBC,sBAAsB,EACtBC,wBAAwB,EACxBC,yBAAyB,EACzBC,0BAA0B,EAC1BC,8BAA8B,EAC9BC,uBAAuB,QAClB,6BAA6B;AAEpC,SAAQC,kBAAkB,EAAEC,yBAAyB,QAAO,qCAAqC"}
@@ -0,0 +1,63 @@
1
+ import { type AnnotationStyleDto } from '@shipfox/annotations-dto';
2
+ import type { RunAnnotationSummary } from '#core/run-annotation.js';
3
+ export interface WorkflowRunAnnotation {
4
+ id: string;
5
+ jobId: string;
6
+ jobExecutionId: string;
7
+ originStepId: string;
8
+ originStepAttempt: number;
9
+ context: string;
10
+ style: AnnotationStyleDto;
11
+ sequence: number;
12
+ body: string;
13
+ }
14
+ export interface WorkflowRunAnnotationsPage {
15
+ annotations: WorkflowRunAnnotation[];
16
+ hasMore: boolean;
17
+ nextCursor: string | null;
18
+ }
19
+ export declare const workflowRunAnnotationsQueryKeys: {
20
+ all: readonly ['workflow-run-annotations'];
21
+ list: (workflowRunId: string, attempt: number, jobExecutionId?: string) => readonly ["workflow-run-annotations", "list", string, number, string | null];
22
+ summary: (workflowRunId: string, attempt: number, jobExecutionId?: string) => readonly ["workflow-run-annotations", "summary", string, number, string | null];
23
+ };
24
+ export declare function workflowRunAnnotationsQueryOptions(workflowRunId: string | undefined, attempt: number | undefined, jobExecutionId?: string | undefined, options?: {
25
+ enabled?: boolean | undefined;
26
+ polling?: boolean | undefined;
27
+ }): import("@tanstack/react-query").OmitKeyof<import("@tanstack/react-query").UseInfiniteQueryOptions<WorkflowRunAnnotationsPage, Error, import("@tanstack/react-query").InfiniteData<WorkflowRunAnnotationsPage, unknown>, readonly ["workflow-run-annotations", "list"] | readonly ["workflow-run-annotations", "list", string, number, string | null], string | null>, "queryFn"> & {
28
+ queryFn?: import("@tanstack/react-query").QueryFunction<WorkflowRunAnnotationsPage, readonly ["workflow-run-annotations", "list"] | readonly ["workflow-run-annotations", "list", string, number, string | null], string | null>;
29
+ } & {
30
+ queryKey: (readonly ["workflow-run-annotations", "list"] & {
31
+ [dataTagSymbol]: import("@tanstack/react-query").InfiniteData<WorkflowRunAnnotationsPage, unknown>;
32
+ [dataTagErrorSymbol]: Error;
33
+ }) | (readonly ["workflow-run-annotations", "list", string, number, string | null] & {
34
+ [dataTagSymbol]: import("@tanstack/react-query").InfiniteData<WorkflowRunAnnotationsPage, unknown>;
35
+ [dataTagErrorSymbol]: Error;
36
+ });
37
+ };
38
+ export declare function useWorkflowRunAnnotationsQuery(workflowRunId: string | undefined, attempt: number | undefined, jobExecutionId?: string | undefined, options?: {
39
+ enabled?: boolean | undefined;
40
+ polling?: boolean | undefined;
41
+ }): import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/react-query").InfiniteData<WorkflowRunAnnotationsPage, unknown>, Error>;
42
+ export declare function workflowRunAnnotationSummaryQueryOptions(workflowRunId: string | undefined, attempt: number | undefined, jobExecutionId?: string | undefined, options?: {
43
+ enabled?: boolean | undefined;
44
+ polling?: boolean | undefined;
45
+ }): import("@tanstack/react-query").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<RunAnnotationSummary, Error, RunAnnotationSummary, readonly ["workflow-run-annotations", "summary"] | readonly ["workflow-run-annotations", "summary", string, number, string | null]>, "queryFn"> & {
46
+ queryFn?: import("@tanstack/react-query").QueryFunction<RunAnnotationSummary, readonly ["workflow-run-annotations", "summary"] | readonly ["workflow-run-annotations", "summary", string, number, string | null], never>;
47
+ } & {
48
+ queryKey: (readonly ["workflow-run-annotations", "summary"] & {
49
+ [dataTagSymbol]: RunAnnotationSummary;
50
+ [dataTagErrorSymbol]: Error;
51
+ }) | (readonly ["workflow-run-annotations", "summary", string, number, string | null] & {
52
+ [dataTagSymbol]: RunAnnotationSummary;
53
+ [dataTagErrorSymbol]: Error;
54
+ });
55
+ };
56
+ export declare function useWorkflowRunAnnotationSummaryQuery(workflowRunId: string | undefined, attempt: number | undefined, jobExecutionId?: string | undefined, options?: {
57
+ enabled?: boolean | undefined;
58
+ polling?: boolean | undefined;
59
+ }): import("@tanstack/react-query").UseQueryResult<NoInfer<RunAnnotationSummary>, Error>;
60
+ export declare function flattenWorkflowRunAnnotations(data: {
61
+ pages: readonly WorkflowRunAnnotationsPage[];
62
+ } | undefined): WorkflowRunAnnotation[];
63
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,0BAA0B,CAAC;AAQlC,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,yBAAyB,CAAC;AAKlE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,qBAAqB,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,+BAA+B;IAC1C,GAAG,YAAG,0BAA0B;IAChC,IAAI,kBAAkB,MAAM,WAAW,MAAM,mBAAmB,MAAM;IAQtE,OAAO,kBAAkB,MAAM,WAAW,MAAM,mBAAmB,MAAM;CAQ1E,CAAC;AAiFF,wBAAgB,kCAAkC,CAChD,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,CAAC,EAAE;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAC;;;;;;;;;;EA6BzE;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,CAAC,EAAE;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAC,oJAKzE;AAED,wBAAgB,wCAAwC,CACtD,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,CAAC,EAAE;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAC;;;;;;;;;;EAoBzE;AAED,wBAAgB,oCAAoC,CAClD,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,CAAC,EAAE;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAC,wFAKzE;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE;IAAC,KAAK,EAAE,SAAS,0BAA0B,EAAE,CAAA;CAAC,GAAG,SAAS,GAC/D,qBAAqB,EAAE,CAEzB"}