@diff-review-system/drs 4.0.0-rc.4 → 4.0.1

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 (315) hide show
  1. package/.pi/agents/describe/pr-describer.md +14 -0
  2. package/.pi/agents/review/unified-reviewer.md +31 -1
  3. package/.pi/agents/task/agents-md-updater.md +3 -1
  4. package/.pi/agents/task/review-issue-fixer.md +18 -1
  5. package/.pi/agents/visual/pr-explainer.md +205 -0
  6. package/.pi/workflows/github-pr-describe.yaml +10 -7
  7. package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +148 -0
  8. package/.pi/workflows/github-pr-post-comment.yaml +10 -10
  9. package/.pi/workflows/github-pr-review-post.yaml +19 -8
  10. package/.pi/workflows/github-pr-review.yaml +348 -7
  11. package/.pi/workflows/github-pr-show-changes.yaml +8 -8
  12. package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +103 -0
  13. package/.pi/workflows/github-pr-visual-explain.yaml +35 -0
  14. package/.pi/workflows/gitlab-mr-describe.yaml +8 -5
  15. package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +144 -0
  16. package/.pi/workflows/gitlab-mr-post-comment.yaml +8 -8
  17. package/.pi/workflows/gitlab-mr-review.yaml +348 -5
  18. package/.pi/workflows/gitlab-mr-show-changes.yaml +6 -6
  19. package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +100 -0
  20. package/.pi/workflows/gitlab-mr-visual-explain.yaml +33 -0
  21. package/.pi/workflows/local-fix-review-issues.yaml +82 -13
  22. package/.pi/workflows/local-review.yaml +9 -2
  23. package/.pi/workflows/local-update-agents-md.yaml +1 -1
  24. package/.pi/workflows/local-visual-explain.yaml +31 -0
  25. package/.pi/workflows/release-changelog-finalize.yaml +47 -0
  26. package/.pi/workflows/tag-changelog-update.yaml +4 -4
  27. package/README.md +91 -27
  28. package/dist/ci/runner.d.ts.map +1 -1
  29. package/dist/ci/runner.js +3 -1
  30. package/dist/ci/runner.js.map +1 -1
  31. package/dist/cli/index.js +48 -6
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/run-agent.d.ts +2 -0
  34. package/dist/cli/run-agent.d.ts.map +1 -1
  35. package/dist/cli/run-agent.js +4 -0
  36. package/dist/cli/run-agent.js.map +1 -1
  37. package/dist/cli/workflow.d.ts +56 -2
  38. package/dist/cli/workflow.d.ts.map +1 -1
  39. package/dist/cli/workflow.js +2165 -85
  40. package/dist/cli/workflow.js.map +1 -1
  41. package/dist/github/client.d.ts +12 -0
  42. package/dist/github/client.d.ts.map +1 -1
  43. package/dist/github/client.js +27 -0
  44. package/dist/github/client.js.map +1 -1
  45. package/dist/github/platform-adapter.d.ts +6 -1
  46. package/dist/github/platform-adapter.d.ts.map +1 -1
  47. package/dist/github/platform-adapter.js +84 -8
  48. package/dist/github/platform-adapter.js.map +1 -1
  49. package/dist/gitlab/client.d.ts +11 -0
  50. package/dist/gitlab/client.d.ts.map +1 -1
  51. package/dist/gitlab/client.js +11 -0
  52. package/dist/gitlab/client.js.map +1 -1
  53. package/dist/gitlab/platform-adapter.d.ts +3 -1
  54. package/dist/gitlab/platform-adapter.d.ts.map +1 -1
  55. package/dist/gitlab/platform-adapter.js +32 -1
  56. package/dist/gitlab/platform-adapter.js.map +1 -1
  57. package/dist/lib/comment-formatter.d.ts +8 -0
  58. package/dist/lib/comment-formatter.d.ts.map +1 -1
  59. package/dist/lib/comment-formatter.js +12 -4
  60. package/dist/lib/comment-formatter.js.map +1 -1
  61. package/dist/lib/comment-poster.d.ts.map +1 -1
  62. package/dist/lib/comment-poster.js +28 -1
  63. package/dist/lib/comment-poster.js.map +1 -1
  64. package/dist/lib/config.d.ts +50 -11
  65. package/dist/lib/config.d.ts.map +1 -1
  66. package/dist/lib/config.js +163 -28
  67. package/dist/lib/config.js.map +1 -1
  68. package/dist/lib/context-compression.d.ts +10 -0
  69. package/dist/lib/context-compression.d.ts.map +1 -1
  70. package/dist/lib/context-compression.js +101 -13
  71. package/dist/lib/context-compression.js.map +1 -1
  72. package/dist/lib/context-loader.d.ts +2 -1
  73. package/dist/lib/context-loader.d.ts.map +1 -1
  74. package/dist/lib/context-loader.js +70 -1
  75. package/dist/lib/context-loader.js.map +1 -1
  76. package/dist/lib/describe-core.d.ts.map +1 -1
  77. package/dist/lib/describe-core.js +3 -2
  78. package/dist/lib/describe-core.js.map +1 -1
  79. package/dist/lib/diff-lines.d.ts +9 -0
  80. package/dist/lib/diff-lines.d.ts.map +1 -1
  81. package/dist/lib/diff-lines.js +17 -9
  82. package/dist/lib/diff-lines.js.map +1 -1
  83. package/dist/lib/exit.js +4 -4
  84. package/dist/lib/exit.js.map +1 -1
  85. package/dist/lib/html-artifact.d.ts +14 -0
  86. package/dist/lib/html-artifact.d.ts.map +1 -0
  87. package/dist/lib/html-artifact.js +59 -0
  88. package/dist/lib/html-artifact.js.map +1 -0
  89. package/dist/lib/issue-parser.js +3 -3
  90. package/dist/lib/issue-parser.js.map +1 -1
  91. package/dist/lib/json-output-schema.d.ts +70 -0
  92. package/dist/lib/json-output-schema.d.ts.map +1 -1
  93. package/dist/lib/json-output-schema.js +40 -0
  94. package/dist/lib/json-output-schema.js.map +1 -1
  95. package/dist/lib/platform-client.d.ts +26 -0
  96. package/dist/lib/platform-client.d.ts.map +1 -1
  97. package/dist/lib/review-artifact.d.ts +69 -0
  98. package/dist/lib/review-artifact.d.ts.map +1 -0
  99. package/dist/lib/review-artifact.js +171 -0
  100. package/dist/lib/review-artifact.js.map +1 -0
  101. package/dist/lib/review-core.d.ts +6 -4
  102. package/dist/lib/review-core.d.ts.map +1 -1
  103. package/dist/lib/review-core.js +71 -151
  104. package/dist/lib/review-core.js.map +1 -1
  105. package/dist/lib/review-orchestrator.d.ts +23 -0
  106. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  107. package/dist/lib/review-orchestrator.js +20 -13
  108. package/dist/lib/review-orchestrator.js.map +1 -1
  109. package/dist/lib/review-usage.d.ts +4 -0
  110. package/dist/lib/review-usage.d.ts.map +1 -1
  111. package/dist/lib/review-usage.js +25 -0
  112. package/dist/lib/review-usage.js.map +1 -1
  113. package/dist/lib/trace-collector.d.ts +105 -0
  114. package/dist/lib/trace-collector.d.ts.map +1 -0
  115. package/dist/lib/trace-collector.js +255 -0
  116. package/dist/lib/trace-collector.js.map +1 -0
  117. package/dist/lib/trace-html.d.ts +3 -0
  118. package/dist/lib/trace-html.d.ts.map +1 -0
  119. package/dist/lib/trace-html.js +349 -0
  120. package/dist/lib/trace-html.js.map +1 -0
  121. package/dist/lib/workflow-artifacts.d.ts +54 -0
  122. package/dist/lib/workflow-artifacts.d.ts.map +1 -0
  123. package/dist/lib/workflow-artifacts.js +150 -0
  124. package/dist/lib/workflow-artifacts.js.map +1 -0
  125. package/dist/pi/sdk.d.ts.map +1 -1
  126. package/dist/pi/sdk.js +570 -6
  127. package/dist/pi/sdk.js.map +1 -1
  128. package/dist/runtime/agent-loader.js +2 -2
  129. package/dist/runtime/client.d.ts +2 -0
  130. package/dist/runtime/client.d.ts.map +1 -1
  131. package/dist/runtime/client.js +11 -5
  132. package/dist/runtime/client.js.map +1 -1
  133. package/package.json +21 -15
  134. package/.pi/workflows/github-pr-describe-post.yaml +0 -24
  135. package/.pi/workflows/gitlab-mr-describe-post.yaml +0 -22
  136. package/.pi/workflows/gitlab-mr-review-code-quality.yaml +0 -31
  137. package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +0 -40
  138. package/.pi/workflows/gitlab-mr-review-post.yaml +0 -30
  139. package/.pi/workflows/local-staged-review.yaml +0 -17
  140. package/dist/cli/run-agent.test.d.ts +0 -2
  141. package/dist/cli/run-agent.test.d.ts.map +0 -1
  142. package/dist/cli/run-agent.test.js +0 -204
  143. package/dist/cli/run-agent.test.js.map +0 -1
  144. package/dist/cli/workflow.test.d.ts +0 -2
  145. package/dist/cli/workflow.test.d.ts.map +0 -1
  146. package/dist/cli/workflow.test.js +0 -1410
  147. package/dist/cli/workflow.test.js.map +0 -1
  148. package/dist/github/client.test.d.ts +0 -2
  149. package/dist/github/client.test.d.ts.map +0 -1
  150. package/dist/github/client.test.js +0 -206
  151. package/dist/github/client.test.js.map +0 -1
  152. package/dist/github/platform-adapter.test.d.ts +0 -2
  153. package/dist/github/platform-adapter.test.d.ts.map +0 -1
  154. package/dist/github/platform-adapter.test.js +0 -40
  155. package/dist/github/platform-adapter.test.js.map +0 -1
  156. package/dist/gitlab/diff-parser.test.d.ts +0 -2
  157. package/dist/gitlab/diff-parser.test.d.ts.map +0 -1
  158. package/dist/gitlab/diff-parser.test.js +0 -315
  159. package/dist/gitlab/diff-parser.test.js.map +0 -1
  160. package/dist/gitlab/platform-adapter.test.d.ts +0 -2
  161. package/dist/gitlab/platform-adapter.test.d.ts.map +0 -1
  162. package/dist/gitlab/platform-adapter.test.js +0 -21
  163. package/dist/gitlab/platform-adapter.test.js.map +0 -1
  164. package/dist/index.test.d.ts +0 -2
  165. package/dist/index.test.d.ts.map +0 -1
  166. package/dist/index.test.js +0 -7
  167. package/dist/index.test.js.map +0 -1
  168. package/dist/lib/code-quality-report.test.d.ts +0 -2
  169. package/dist/lib/code-quality-report.test.d.ts.map +0 -1
  170. package/dist/lib/code-quality-report.test.js +0 -327
  171. package/dist/lib/code-quality-report.test.js.map +0 -1
  172. package/dist/lib/comment-formatter.test.d.ts +0 -2
  173. package/dist/lib/comment-formatter.test.d.ts.map +0 -1
  174. package/dist/lib/comment-formatter.test.js +0 -727
  175. package/dist/lib/comment-formatter.test.js.map +0 -1
  176. package/dist/lib/comment-manager.test.d.ts +0 -2
  177. package/dist/lib/comment-manager.test.d.ts.map +0 -1
  178. package/dist/lib/comment-manager.test.js +0 -680
  179. package/dist/lib/comment-manager.test.js.map +0 -1
  180. package/dist/lib/comment-poster.test.d.ts +0 -5
  181. package/dist/lib/comment-poster.test.d.ts.map +0 -1
  182. package/dist/lib/comment-poster.test.js +0 -255
  183. package/dist/lib/comment-poster.test.js.map +0 -1
  184. package/dist/lib/config-model-overrides.test.d.ts +0 -2
  185. package/dist/lib/config-model-overrides.test.d.ts.map +0 -1
  186. package/dist/lib/config-model-overrides.test.js +0 -218
  187. package/dist/lib/config-model-overrides.test.js.map +0 -1
  188. package/dist/lib/config.test.d.ts +0 -2
  189. package/dist/lib/config.test.d.ts.map +0 -1
  190. package/dist/lib/config.test.js +0 -353
  191. package/dist/lib/config.test.js.map +0 -1
  192. package/dist/lib/context-compression.test.d.ts +0 -2
  193. package/dist/lib/context-compression.test.d.ts.map +0 -1
  194. package/dist/lib/context-compression.test.js +0 -337
  195. package/dist/lib/context-compression.test.js.map +0 -1
  196. package/dist/lib/context-loader.test.d.ts +0 -2
  197. package/dist/lib/context-loader.test.d.ts.map +0 -1
  198. package/dist/lib/context-loader.test.js +0 -212
  199. package/dist/lib/context-loader.test.js.map +0 -1
  200. package/dist/lib/cursor-fix-link.test.d.ts +0 -2
  201. package/dist/lib/cursor-fix-link.test.d.ts.map +0 -1
  202. package/dist/lib/cursor-fix-link.test.js +0 -70
  203. package/dist/lib/cursor-fix-link.test.js.map +0 -1
  204. package/dist/lib/describe-core.test.d.ts +0 -2
  205. package/dist/lib/describe-core.test.d.ts.map +0 -1
  206. package/dist/lib/describe-core.test.js +0 -208
  207. package/dist/lib/describe-core.test.js.map +0 -1
  208. package/dist/lib/describe-output-path.test.d.ts +0 -2
  209. package/dist/lib/describe-output-path.test.d.ts.map +0 -1
  210. package/dist/lib/describe-output-path.test.js +0 -51
  211. package/dist/lib/describe-output-path.test.js.map +0 -1
  212. package/dist/lib/describe-parser.test.d.ts +0 -2
  213. package/dist/lib/describe-parser.test.d.ts.map +0 -1
  214. package/dist/lib/describe-parser.test.js +0 -282
  215. package/dist/lib/describe-parser.test.js.map +0 -1
  216. package/dist/lib/description-executor.test.d.ts +0 -2
  217. package/dist/lib/description-executor.test.d.ts.map +0 -1
  218. package/dist/lib/description-executor.test.js +0 -135
  219. package/dist/lib/description-executor.test.js.map +0 -1
  220. package/dist/lib/description-formatter.test.d.ts +0 -2
  221. package/dist/lib/description-formatter.test.d.ts.map +0 -1
  222. package/dist/lib/description-formatter.test.js +0 -57
  223. package/dist/lib/description-formatter.test.js.map +0 -1
  224. package/dist/lib/diff-lines.test.d.ts +0 -2
  225. package/dist/lib/diff-lines.test.d.ts.map +0 -1
  226. package/dist/lib/diff-lines.test.js +0 -13
  227. package/dist/lib/diff-lines.test.js.map +0 -1
  228. package/dist/lib/diff-parser.test.d.ts +0 -2
  229. package/dist/lib/diff-parser.test.d.ts.map +0 -1
  230. package/dist/lib/diff-parser.test.js +0 -335
  231. package/dist/lib/diff-parser.test.js.map +0 -1
  232. package/dist/lib/error-comment-poster.test.d.ts +0 -2
  233. package/dist/lib/error-comment-poster.test.d.ts.map +0 -1
  234. package/dist/lib/error-comment-poster.test.js +0 -128
  235. package/dist/lib/error-comment-poster.test.js.map +0 -1
  236. package/dist/lib/exit.test.d.ts +0 -2
  237. package/dist/lib/exit.test.d.ts.map +0 -1
  238. package/dist/lib/exit.test.js +0 -120
  239. package/dist/lib/exit.test.js.map +0 -1
  240. package/dist/lib/issue-parser.test.d.ts +0 -2
  241. package/dist/lib/issue-parser.test.d.ts.map +0 -1
  242. package/dist/lib/issue-parser.test.js +0 -281
  243. package/dist/lib/issue-parser.test.js.map +0 -1
  244. package/dist/lib/json-output-schema.test.d.ts +0 -2
  245. package/dist/lib/json-output-schema.test.d.ts.map +0 -1
  246. package/dist/lib/json-output-schema.test.js +0 -92
  247. package/dist/lib/json-output-schema.test.js.map +0 -1
  248. package/dist/lib/json-output.test.d.ts +0 -2
  249. package/dist/lib/json-output.test.d.ts.map +0 -1
  250. package/dist/lib/json-output.test.js +0 -141
  251. package/dist/lib/json-output.test.js.map +0 -1
  252. package/dist/lib/logger.test.d.ts +0 -2
  253. package/dist/lib/logger.test.d.ts.map +0 -1
  254. package/dist/lib/logger.test.js +0 -324
  255. package/dist/lib/logger.test.js.map +0 -1
  256. package/dist/lib/position-validator.test.d.ts +0 -2
  257. package/dist/lib/position-validator.test.d.ts.map +0 -1
  258. package/dist/lib/position-validator.test.js +0 -128
  259. package/dist/lib/position-validator.test.js.map +0 -1
  260. package/dist/lib/prompt-budget.test.d.ts +0 -2
  261. package/dist/lib/prompt-budget.test.d.ts.map +0 -1
  262. package/dist/lib/prompt-budget.test.js +0 -55
  263. package/dist/lib/prompt-budget.test.js.map +0 -1
  264. package/dist/lib/repository-validator.test.d.ts +0 -5
  265. package/dist/lib/repository-validator.test.d.ts.map +0 -1
  266. package/dist/lib/repository-validator.test.js +0 -341
  267. package/dist/lib/repository-validator.test.js.map +0 -1
  268. package/dist/lib/review-core.test.d.ts +0 -2
  269. package/dist/lib/review-core.test.d.ts.map +0 -1
  270. package/dist/lib/review-core.test.js +0 -614
  271. package/dist/lib/review-core.test.js.map +0 -1
  272. package/dist/lib/review-orchestrator.test.d.ts +0 -2
  273. package/dist/lib/review-orchestrator.test.d.ts.map +0 -1
  274. package/dist/lib/review-orchestrator.test.js +0 -552
  275. package/dist/lib/review-orchestrator.test.js.map +0 -1
  276. package/dist/lib/review-output-path.test.d.ts +0 -2
  277. package/dist/lib/review-output-path.test.d.ts.map +0 -1
  278. package/dist/lib/review-output-path.test.js +0 -83
  279. package/dist/lib/review-output-path.test.js.map +0 -1
  280. package/dist/lib/review-parser.test.d.ts +0 -2
  281. package/dist/lib/review-parser.test.d.ts.map +0 -1
  282. package/dist/lib/review-parser.test.js +0 -130
  283. package/dist/lib/review-parser.test.js.map +0 -1
  284. package/dist/lib/review-usage.test.d.ts +0 -2
  285. package/dist/lib/review-usage.test.d.ts.map +0 -1
  286. package/dist/lib/review-usage.test.js +0 -83
  287. package/dist/lib/review-usage.test.js.map +0 -1
  288. package/dist/lib/unified-review-executor.d.ts +0 -58
  289. package/dist/lib/unified-review-executor.d.ts.map +0 -1
  290. package/dist/lib/unified-review-executor.js +0 -201
  291. package/dist/lib/unified-review-executor.js.map +0 -1
  292. package/dist/lib/unified-review-executor.test.d.ts +0 -5
  293. package/dist/lib/unified-review-executor.test.d.ts.map +0 -1
  294. package/dist/lib/unified-review-executor.test.js +0 -472
  295. package/dist/lib/unified-review-executor.test.js.map +0 -1
  296. package/dist/lib/write-json-output.test.d.ts +0 -2
  297. package/dist/lib/write-json-output.test.d.ts.map +0 -1
  298. package/dist/lib/write-json-output.test.js +0 -259
  299. package/dist/lib/write-json-output.test.js.map +0 -1
  300. package/dist/pi/sdk.test.d.ts +0 -2
  301. package/dist/pi/sdk.test.d.ts.map +0 -1
  302. package/dist/pi/sdk.test.js +0 -488
  303. package/dist/pi/sdk.test.js.map +0 -1
  304. package/dist/runtime/agent-loader.test.d.ts +0 -2
  305. package/dist/runtime/agent-loader.test.d.ts.map +0 -1
  306. package/dist/runtime/agent-loader.test.js +0 -277
  307. package/dist/runtime/agent-loader.test.js.map +0 -1
  308. package/dist/runtime/client.test.d.ts +0 -2
  309. package/dist/runtime/client.test.d.ts.map +0 -1
  310. package/dist/runtime/client.test.js +0 -772
  311. package/dist/runtime/client.test.js.map +0 -1
  312. package/dist/runtime/path-config.test.d.ts +0 -2
  313. package/dist/runtime/path-config.test.d.ts.map +0 -1
  314. package/dist/runtime/path-config.test.js +0 -112
  315. package/dist/runtime/path-config.test.js.map +0 -1
@@ -0,0 +1,349 @@
1
+ export function renderTraceHtml(trace) {
2
+ const traces = trace.agentTraces;
3
+ const totalCost = traces.reduce((sum, t) => sum + (t.totalUsage?.cost?.total ?? 0), 0);
4
+ const totalInputTokens = traces.reduce((sum, t) => sum + (t.totalUsage?.input ?? 0), 0);
5
+ const totalOutputTokens = traces.reduce((sum, t) => sum + (t.totalUsage?.output ?? 0), 0);
6
+ const totalCacheRead = traces.reduce((sum, t) => sum + (t.totalUsage?.cacheRead ?? 0), 0);
7
+ const totalToolCalls = traces.reduce((sum, t) => sum + t.toolCallCount, 0);
8
+ const totalDurationMs = traces.reduce((sum, t) => sum + (t.durationMs ?? 0), 0);
9
+ const totalTurns = traces.reduce((sum, t) => sum + t.turns.length, 0);
10
+ const invocationNodes = traces.map((t, i) => renderInvocationNode(t, i)).join('');
11
+ const traceDataJson = JSON.stringify(trace).replace(/</g, '\\u003c').replace(/>/g, '\\u003e');
12
+ return `<!DOCTYPE html>
13
+ <html lang="en">
14
+ <head>
15
+ <meta charset="UTF-8">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
17
+ <title>DRS Trace — ${escapeHtml(trace.workflowName)}</title>
18
+ <style>
19
+ ${TRACE_CSS}
20
+ </style>
21
+ </head>
22
+ <body>
23
+ <div id="app">
24
+ <header id="topbar">
25
+ <div class="header-left">
26
+ <h1>DRS Trace Explorer</h1>
27
+ <span class="workflow-name">${escapeHtml(trace.workflowName)}</span>
28
+ </div>
29
+ <div class="header-stats">
30
+ <span class="stat">Agents: <b>${traces.length}</b></span>
31
+ <span class="stat">Turns: <b>${totalTurns}</b></span>
32
+ <span class="stat">Tool Calls: <b>${totalToolCalls}</b></span>
33
+ <span class="stat">Input: <b>${formatTokens(totalInputTokens)}</b></span>
34
+ <span class="stat">Output: <b>${formatTokens(totalOutputTokens)}</b></span>
35
+ <span class="stat">Cache Read: <b>${formatTokens(totalCacheRead)}</b></span>
36
+ <span class="stat">Cost: <b>$${totalCost.toFixed(4)}</b></span>
37
+ <span class="stat">Duration: <b>${formatDuration(totalDurationMs)}</b></span>
38
+ </div>
39
+ </header>
40
+ <main>
41
+ <nav id="tree">
42
+ <div class="search-bar">
43
+ <input type="text" id="search" placeholder="Search..." oninput="filterTree(this.value)" />
44
+ </div>
45
+ <div id="tree-content">${invocationNodes}</div>
46
+ </nav>
47
+ <section id="detail">
48
+ <div class="detail-empty">Select a node to inspect</div>
49
+ </section>
50
+ </main>
51
+ </div>
52
+ <script>
53
+ ${buildTraceJs(traceDataJson)}
54
+ </script>
55
+ </body>
56
+ </html>`;
57
+ }
58
+ function renderInvocationNode(trace, _index) {
59
+ const statusClass = trace.errorMessage ? 'error' : 'ok';
60
+ const label = trace.workflowIteration
61
+ ? `${trace.nodeId} (iter ${trace.workflowIteration})`
62
+ : trace.nodeId;
63
+ const cost = trace.totalUsage?.cost?.total ?? 0;
64
+ const inputTokens = trace.totalUsage?.input ?? 0;
65
+ const outputTokens = trace.totalUsage?.output ?? 0;
66
+ const turnNodes = trace.turns.map((turn) => renderTurnNode(trace.id, turn)).join('');
67
+ return `<div class="tree-node invocation" data-trace-id="${trace.id}" data-node-id="${escapeHtml(trace.nodeId)}" data-agent="${escapeHtml(trace.agentId)}" onclick="selectNode(event, 'invocation', '${trace.id}')">
68
+ <div class="node-header ${statusClass}">
69
+ <span class="node-icon">Agent</span>
70
+ <span class="node-label">${escapeHtml(label)}</span>
71
+ <span class="node-meta">${escapeHtml(trace.agentId)} · ${formatDuration(trace.durationMs ?? 0)} · ${formatTokens(inputTokens)}→${formatTokens(outputTokens)} · $${cost.toFixed(4)}</span>
72
+ </div>
73
+ <div class="tree-children">
74
+ ${turnNodes}
75
+ </div>
76
+ </div>`;
77
+ }
78
+ function renderTurnNode(traceId, turn) {
79
+ const nodeId = `${traceId}-turn-${turn.turnIndex}`;
80
+ const toolNodes = turn.toolCalls
81
+ .map((tc) => renderToolNode(traceId, turn.turnIndex, tc))
82
+ .join('');
83
+ const usage = turn.usage;
84
+ const usageBadge = usage
85
+ ? `${formatTokens(usage.input)}→${formatTokens(usage.output)} · $${(usage.cost?.total ?? 0).toFixed(4)}`
86
+ : '';
87
+ return `<div class="tree-node turn" data-node-id="${nodeId}" onclick="selectNode(event, 'turn', '${nodeId}')">
88
+ <div class="node-header">
89
+ <span class="node-icon">Turn ${turn.turnIndex}</span>
90
+ <span class="node-meta">${formatDuration(turn.durationMs ?? 0)}${usageBadge ? ' · ' + usageBadge : ''}${turn.stopReason ? ' · ' + escapeHtml(turn.stopReason) : ''}${turn.model ? ' · ' + escapeHtml(turn.model) : ''}</span>
91
+ </div>
92
+ <div class="tree-children">
93
+ ${toolNodes}
94
+ </div>
95
+ </div>`;
96
+ }
97
+ function renderToolNode(traceId, turnIndex, tc) {
98
+ const nodeId = `${traceId}-turn-${turnIndex}-tool-${tc.toolCallId}`;
99
+ const statusClass = tc.isError ? 'error' : 'ok';
100
+ return `<div class="tree-node tool" data-node-id="${nodeId}" onclick="selectNode(event, 'tool', '${nodeId}')">
101
+ <div class="node-header ${statusClass}">
102
+ <span class="node-icon">${escapeHtml(tc.toolName)}</span>
103
+ <span class="node-meta">${formatDuration(tc.durationMs)}</span>
104
+ </div>
105
+ </div>`;
106
+ }
107
+ const TRACE_CSS = `
108
+ * { margin: 0; padding: 0; box-sizing: border-box; }
109
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 13px; background: #0f1117; color: #e0e0e0; }
110
+ #app { display: flex; flex-direction: column; height: 100vh; }
111
+ #topbar { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; background: #161821; border-bottom: 1px solid #2a2d3a; flex-shrink: 0; }
112
+ .header-left { display: flex; align-items: center; gap: 12px; }
113
+ .header-left h1 { font-size: 15px; font-weight: 600; color: #7c8aff; }
114
+ .workflow-name { color: #888; font-size: 12px; }
115
+ .header-stats { display: flex; gap: 12px; flex-wrap: wrap; }
116
+ .stat { font-size: 11px; color: #888; }
117
+ .stat b { color: #e0e0e0; }
118
+ main { display: flex; flex: 1; overflow: hidden; }
119
+ #tree { width: 400px; min-width: 300px; max-width: 600px; border-right: 1px solid #2a2d3a; overflow-y: auto; background: #12131a; flex-shrink: 0; }
120
+ #tree-content { padding: 4px; }
121
+ .search-bar { padding: 8px; position: sticky; top: 0; background: #12131a; z-index: 1; }
122
+ .search-bar input { width: 100%; padding: 6px 10px; background: #1a1c28; border: 1px solid #2a2d3a; border-radius: 6px; color: #e0e0e0; font-size: 12px; }
123
+ .search-bar input:focus { outline: none; border-color: #7c8aff; }
124
+ .tree-node { margin: 2px 0; }
125
+ .node-header { display: flex; align-items: center; gap: 6px; padding: 4px 8px; border-radius: 4px; cursor: pointer; flex-wrap: wrap; }
126
+ .node-header:hover { background: #1e2030; }
127
+ .node-header.ok { border-left: 3px solid #22c55e; }
128
+ .node-header.error { border-left: 3px solid #ef4444; }
129
+ .node-icon { font-weight: 600; font-size: 11px; color: #7c8aff; min-width: 60px; }
130
+ .node-label { font-weight: 500; color: #e0e0e0; }
131
+ .node-meta { color: #666; font-size: 10px; margin-left: auto; }
132
+ .tree-children { margin-left: 16px; border-left: 1px solid #2a2d3a; padding-left: 4px; }
133
+ .tree-node.tool .node-icon { color: #c9a227; min-width: auto; }
134
+ .tree-node.turn .node-icon { color: #22c55e; }
135
+ .tree-node.invocation .node-icon { color: #7c8aff; }
136
+ .tree-node.hidden { display: none; }
137
+ #detail { flex: 1; overflow-y: auto; padding: 16px; background: #0f1117; }
138
+ .detail-empty { color: #555; text-align: center; padding: 40px; }
139
+ .detail-section { margin-bottom: 16px; }
140
+ .detail-section h3 { font-size: 12px; color: #7c8aff; margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px; }
141
+ .detail-badges { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 12px; }
142
+ .badge { padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 500; }
143
+ .badge-duration { background: #1a2a3a; color: #66ccff; }
144
+ .badge-tokens { background: #1a3a2a; color: #66ff99; }
145
+ .badge-cost { background: #3a2a1a; color: #ffcc66; }
146
+ .badge-model { background: #2a1a3a; color: #cc99ff; }
147
+ .badge-error { background: #3a1a1a; color: #ff6666; }
148
+ .badge-stop { background: #1a1a2a; color: #8888cc; }
149
+ .detail-json { background: #161821; border: 1px solid #2a2d3a; border-radius: 6px; padding: 12px; font-family: 'SF Mono', 'Monaco', 'Consolas', monospace; font-size: 11px; white-space: pre-wrap; word-break: break-all; overflow-x: auto; max-height: 400px; overflow-y: auto; }
150
+ .detail-text { background: #161821; border: 1px solid #2a2d3a; border-radius: 6px; padding: 12px; white-space: pre-wrap; word-break: break-word; max-height: 400px; overflow-y: auto; font-size: 12px; line-height: 1.5; }
151
+ .detail-prompt { background: #161821; border: 1px solid #2a2d3a; border-radius: 6px; padding: 12px; white-space: pre-wrap; word-break: break-word; max-height: 300px; overflow-y: auto; font-size: 11px; line-height: 1.4; color: #aaa; }
152
+ .tool-result-ok { color: #66ff99; }
153
+ .tool-result-error { color: #ff6666; }
154
+ `;
155
+ function buildTraceJs(traceDataJson) {
156
+ return `
157
+ const TRACE_DATA = ${traceDataJson};
158
+
159
+ function selectNode(event, type, nodeId) {
160
+ event.stopPropagation();
161
+ document.querySelectorAll('.node-header').forEach(el => el.classList.remove('selected'));
162
+ event.currentTarget.classList.add('selected');
163
+ renderDetail(type, nodeId);
164
+ }
165
+
166
+ function renderDetail(type, nodeId) {
167
+ const detail = document.getElementById('detail');
168
+ const data = findNodeData(type, nodeId);
169
+ if (!data) {
170
+ detail.innerHTML = '<div class="detail-empty">No data found for ' + escapeHtml(nodeId) + '</div>';
171
+ return;
172
+ }
173
+ detail.innerHTML = renderDetailHtml(type, data);
174
+ }
175
+
176
+ function findNodeData(type, nodeId) {
177
+ for (const trace of TRACE_DATA.agentTraces) {
178
+ if (type === 'invocation' && trace.id === nodeId) return { type, trace };
179
+ for (const turn of trace.turns) {
180
+ const turnId = trace.id + '-turn-' + turn.turnIndex;
181
+ if (type === 'turn' && turnId === nodeId) return { type, turn, trace };
182
+ for (const tc of turn.toolCalls) {
183
+ const tcId = trace.id + '-turn-' + turn.turnIndex + '-tool-' + tc.toolCallId;
184
+ if (type === 'tool' && tcId === nodeId) return { type, toolCall: tc, turn, trace };
185
+ }
186
+ }
187
+ }
188
+ return null;
189
+ }
190
+
191
+ function renderDetailHtml(type, data) {
192
+ if (type === 'invocation') return renderInvocationDetail(data.trace);
193
+ if (type === 'turn') return renderTurnDetail(data.turn, data.trace);
194
+ if (type === 'tool') return renderToolDetail(data.toolCall, data.turn);
195
+ return '<div class="detail-empty">Unknown type</div>';
196
+ }
197
+
198
+ function renderInvocationDetail(trace) {
199
+ const usage = trace.totalUsage || {};
200
+ const cost = (usage.cost && usage.cost.total) || 0;
201
+ let html = '<div class="detail-section"><h3>Agent Invocation</h3>';
202
+ html += '<div class="detail-badges">';
203
+ html += badge('duration', formatDuration(trace.durationMs || 0));
204
+ html += badge('tokens', formatTokens(usage.input || 0) + ' in / ' + formatTokens(usage.output || 0) + ' out');
205
+ html += badge('cost', '$' + cost.toFixed(4));
206
+ if (trace.model) html += badge('model', trace.model);
207
+ if (trace.provider) html += badge('model', trace.provider);
208
+ html += '</div></div>';
209
+ html += '<div class="detail-section"><h3>Node</h3><div class="detail-text">' + escapeHtml(trace.nodeId) + '</div></div>';
210
+ html += '<div class="detail-section"><h3>Agent</h3><div class="detail-text">' + escapeHtml(trace.agentId) + '</div></div>';
211
+ if (trace.workflowIteration) {
212
+ html += '<div class="detail-section"><h3>Workflow Iteration</h3><div class="detail-text">' + trace.workflowIteration + '</div></div>';
213
+ }
214
+ if (trace.skillsLoaded && trace.skillsLoaded.length > 0) {
215
+ html += '<div class="detail-section"><h3>Skills Loaded</h3><div class="detail-text">' + trace.skillsLoaded.map(escapeHtml).join(', ') + '</div></div>';
216
+ }
217
+ if (trace.errorMessage) {
218
+ html += '<div class="detail-section"><h3>Error</h3><div class="detail-text" style="color:#ff6666">' + escapeHtml(trace.errorMessage) + '</div></div>';
219
+ }
220
+ html += '<div class="detail-section"><h3>Prompt (' + trace.prompt.length + ' chars)</h3><div class="detail-prompt">' + escapeHtml(trace.prompt) + '</div></div>';
221
+ if (trace.systemPrompt) {
222
+ html += '<div class="detail-section"><h3>System Prompt (' + trace.systemPrompt.length + ' chars)</h3><div class="detail-prompt">' + escapeHtml(trace.systemPrompt) + '</div></div>';
223
+ }
224
+ html += '<div class="detail-section"><h3>Turns (' + trace.turns.length + ')</h3>';
225
+ html += '<div class="detail-text">' + trace.turns.map(function(t) {
226
+ return 'Turn ' + t.turnIndex + ': ' + (t.toolCalls.length) + ' tool calls, ' + formatDuration(t.durationMs || 0) + ', ' + formatTokens((t.usage && t.usage.input) || 0) + ' in';
227
+ }).join('\\n') + '</div></div>';
228
+ return html;
229
+ }
230
+
231
+ function renderTurnDetail(turn, trace) {
232
+ const usage = turn.usage || {};
233
+ const cost = (usage.cost && usage.cost.total) || 0;
234
+ let html = '<div class="detail-section"><h3>Turn ' + turn.turnIndex + '</h3>';
235
+ html += '<div class="detail-badges">';
236
+ html += badge('duration', formatDuration(turn.durationMs || 0));
237
+ html += badge('tokens', formatTokens(usage.input || 0) + ' in / ' + formatTokens(usage.output || 0) + ' out');
238
+ if (usage.cacheRead) html += badge('tokens', 'cache: ' + formatTokens(usage.cacheRead));
239
+ html += badge('cost', '$' + cost.toFixed(4));
240
+ if (turn.model) html += badge('model', turn.model);
241
+ if (turn.responseModel && turn.responseModel !== turn.model) html += badge('model', 'resp: ' + turn.responseModel);
242
+ if (turn.stopReason) html += badge('stop', turn.stopReason);
243
+ html += '</div></div>';
244
+ if (turn.thinkingContent) {
245
+ html += '<div class="detail-section"><h3>Thinking</h3><div class="detail-text">' + escapeHtml(turn.thinkingContent) + '</div></div>';
246
+ }
247
+ if (turn.assistantContent) {
248
+ html += '<div class="detail-section"><h3>Response</h3><div class="detail-text">' + escapeHtml(turn.assistantContent) + '</div></div>';
249
+ }
250
+ if (turn.toolCalls && turn.toolCalls.length > 0) {
251
+ html += '<div class="detail-section"><h3>Tool Calls (' + turn.toolCalls.length + ')</h3>';
252
+ for (const tc of turn.toolCalls) {
253
+ html += '<div class="detail-section"><h4 style="color:#c9a227">' + escapeHtml(tc.toolName) + ' · ' + formatDuration(tc.durationMs) + (tc.isError ? ' · ERROR' : '') + '</h4>';
254
+ html += '<div class="detail-json">' + escapeHtml(JSON.stringify(tc.args, null, 2)) + '</div>';
255
+ html += '<div class="detail-section"><h3 style="color:#555">Result</h3>';
256
+ const resultStr = typeof tc.result === 'string' ? tc.result : JSON.stringify(tc.result, null, 2);
257
+ html += '<div class="detail-json ' + (tc.isError ? 'tool-result-error' : 'tool-result-ok') + '">' + escapeHtml(truncate(resultStr, 8000)) + '</div>';
258
+ html += '</div></div>';
259
+ }
260
+ }
261
+ return html;
262
+ }
263
+
264
+ function renderToolDetail(tc, turn) {
265
+ let html = '<div class="detail-section"><h3>' + escapeHtml(tc.toolName) + '</h3>';
266
+ html += '<div class="detail-badges">';
267
+ html += badge('duration', formatDuration(tc.durationMs));
268
+ if (tc.isError) html += badge('error', 'ERROR');
269
+ html += '</div></div>';
270
+ html += '<div class="detail-section"><h3>Input</h3><div class="detail-json">' + escapeHtml(JSON.stringify(tc.args, null, 2)) + '</div></div>';
271
+ html += '<div class="detail-section"><h3>Result</h3>';
272
+ const resultStr = typeof tc.result === 'string' ? tc.result : JSON.stringify(tc.result, null, 2);
273
+ html += '<div class="detail-json ' + (tc.isError ? 'tool-result-error' : 'tool-result-ok') + '">' + escapeHtml(truncate(resultStr, 8000)) + '</div></div>';
274
+ return html;
275
+ }
276
+
277
+ function badge(cls, text) {
278
+ return '<span class="badge badge-' + cls + '">' + escapeHtml(text) + '</span>';
279
+ }
280
+
281
+ function formatTokens(n) {
282
+ if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';
283
+ if (n >= 1000) return (n / 1000).toFixed(1) + 'K';
284
+ return String(n);
285
+ }
286
+
287
+ function formatDuration(ms) {
288
+ if (ms >= 60000) return (ms / 60000).toFixed(1) + 'm';
289
+ if (ms >= 1000) return (ms / 1000).toFixed(1) + 's';
290
+ return ms + 'ms';
291
+ }
292
+
293
+ function truncate(str, max) {
294
+ if (str.length <= max) return str;
295
+ return str.substring(0, max) + '\\n... (' + str.length + ' chars total)';
296
+ }
297
+
298
+ function escapeHtml(str) {
299
+ if (str === null || str === undefined) return '';
300
+ return String(str)
301
+ .replace(/&/g, '&amp;')
302
+ .replace(/</g, '&lt;')
303
+ .replace(/>/g, '&gt;')
304
+ .replace(/"/g, '&quot;')
305
+ .replace(/'/g, '&#39;');
306
+ }
307
+
308
+ function filterTree(query) {
309
+ query = query.toLowerCase();
310
+ document.querySelectorAll('.tree-node').forEach(function(node) {
311
+ if (!query) {
312
+ node.classList.remove('hidden');
313
+ return;
314
+ }
315
+ const text = node.textContent.toLowerCase();
316
+ if (text.indexOf(query) !== -1) {
317
+ node.classList.remove('hidden');
318
+ } else {
319
+ node.classList.add('hidden');
320
+ }
321
+ });
322
+ }
323
+ `;
324
+ }
325
+ function escapeHtml(str) {
326
+ if (str === null || str === undefined)
327
+ return '';
328
+ return String(str)
329
+ .replace(/&/g, '&amp;')
330
+ .replace(/</g, '&lt;')
331
+ .replace(/>/g, '&gt;')
332
+ .replace(/"/g, '&quot;')
333
+ .replace(/'/g, '&#39;');
334
+ }
335
+ function formatTokens(n) {
336
+ if (n >= 1000000)
337
+ return (n / 1000000).toFixed(1) + 'M';
338
+ if (n >= 1000)
339
+ return (n / 1000).toFixed(1) + 'K';
340
+ return String(n);
341
+ }
342
+ function formatDuration(ms) {
343
+ if (ms >= 60000)
344
+ return (ms / 60000).toFixed(1) + 'm';
345
+ if (ms >= 1000)
346
+ return (ms / 1000).toFixed(1) + 's';
347
+ return ms + 'ms';
348
+ }
349
+ //# sourceMappingURL=trace-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-html.js","sourceRoot":"","sources":["../../src/lib/trace-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export interface WorkflowArtifactScope {
2
+ platform: string;
3
+ projectId?: string;
4
+ subject?: string;
5
+ changeKind?: string;
6
+ changeNumber?: number | string;
7
+ branch?: string;
8
+ }
9
+ export interface WorkflowArtifactEnvelope<T = unknown> {
10
+ schemaVersion: 1;
11
+ kind: string;
12
+ id: string;
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ scope: WorkflowArtifactScope;
16
+ payload: T;
17
+ }
18
+ export interface SaveWorkflowArtifactOptions<T = unknown> {
19
+ kind: string;
20
+ scope: WorkflowArtifactScope;
21
+ payload: T;
22
+ id?: string;
23
+ }
24
+ export interface SavedWorkflowArtifact<T = unknown> {
25
+ artifact: WorkflowArtifactEnvelope<T>;
26
+ path: string;
27
+ latestPath: string;
28
+ }
29
+ export interface UpdateWorkflowArtifactOptions<T = unknown> {
30
+ artifact: WorkflowArtifactEnvelope<T>;
31
+ payload: T;
32
+ }
33
+ export declare function createWorkflowArtifactId(date?: Date): string;
34
+ /**
35
+ * Assert that an artifact id matches the canonical auto-generated shape.
36
+ *
37
+ * Accepts `unknown` so callers at workflow boundaries can pass raw
38
+ * template-rendered values without an upfront cast. Throws when the value
39
+ * is not a string, or the string does not match the canonical pattern.
40
+ * Exposed so callers (including workflow action runners) can validate ids
41
+ * before joining them onto a directory path.
42
+ */
43
+ export declare function assertSafeArtifactId(id: unknown, action?: 'read' | 'write'): void;
44
+ export declare function getWorkflowArtifactSubject(scope: WorkflowArtifactScope): string;
45
+ export declare function getWorkflowArtifactDirectory(workingDir: string, kind: string, scope: WorkflowArtifactScope): string;
46
+ export declare function createWorkflowArtifact<T>(options: SaveWorkflowArtifactOptions<T>, date?: Date): WorkflowArtifactEnvelope<T>;
47
+ export declare function saveWorkflowArtifact<T>(workingDir: string, options: SaveWorkflowArtifactOptions<T>): Promise<SavedWorkflowArtifact<T>>;
48
+ export declare function updateWorkflowArtifact<T>(workingDir: string, options: UpdateWorkflowArtifactOptions<T>): Promise<SavedWorkflowArtifact<T>>;
49
+ export declare function loadWorkflowArtifact<T = unknown>(workingDir: string, kind: string, scope: WorkflowArtifactScope, id?: string): Promise<{
50
+ artifact: WorkflowArtifactEnvelope<T>;
51
+ path: string;
52
+ }>;
53
+ export declare function workflowArtifactExists(workingDir: string, kind: string, scope: WorkflowArtifactScope, id?: string): Promise<boolean>;
54
+ //# sourceMappingURL=workflow-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/workflow-artifacts.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB,CAAC,CAAC,GAAG,OAAO;IACnD,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,MAAM,WAAW,2BAA2B,CAAC,CAAC,GAAG,OAAO;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,OAAO;IAChD,QAAQ,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B,CAAC,CAAC,GAAG,OAAO;IACxD,QAAQ,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC;CACZ;AAWD,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAIxE;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,GAAE,MAAM,GAAG,OAAgB,GAAG,IAAI,CAIzF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAW/E;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,qBAAqB,GAC3B,MAAM,CAUR;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,EACvC,IAAI,GAAE,IAAiB,GACtB,wBAAwB,CAAC,CAAC,CAAC,CAW7B;AAED,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAenC;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAiBnC;AAqBD,wBAAsB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EACpD,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,qBAAqB,EAC5B,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAYlE;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,qBAAqB,EAC5B,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CAalB"}
@@ -0,0 +1,150 @@
1
+ import { mkdir, readFile, writeFile } from 'fs/promises';
2
+ import { dirname, join } from 'path';
3
+ import { resolveWithinWorkingDir } from './path-utils.js';
4
+ function slugSegment(value, fallback) {
5
+ const raw = value === undefined || value === '' ? fallback : String(value);
6
+ const slug = raw
7
+ .trim()
8
+ .replace(/[^A-Za-z0-9._-]+/g, '-')
9
+ .replace(/^-+|-+$/g, '');
10
+ return slug || fallback;
11
+ }
12
+ export function createWorkflowArtifactId(date = new Date()) {
13
+ const timestamp = date.toISOString().replace(/[-:.TZ]/g, '');
14
+ const random = Math.random().toString(36).slice(2, 8);
15
+ return `art_${timestamp}_${random}`;
16
+ }
17
+ /**
18
+ * Canonical workflow artifact id pattern.
19
+ *
20
+ * Matches IDs produced by the two artifact generators:
21
+ * - `createWorkflowArtifactId` -> `art_<ISO-date-digits>_<6-char-base36>`
22
+ * - `createReviewId` -> `rev_<ISO-date-digits>_<6-char-base36>`
23
+ *
24
+ * Both generators always emit lowercase, so the regex is intentionally
25
+ * case-sensitive — early versions with `/i` over-matched rejected inputs
26
+ * like `ART_…_A1B2C3` which are also non-canonical.
27
+ *
28
+ * Any id that does not match this shape is rejected because workflows allow
29
+ * the `id` option on `load`/`artifact-exists` to be templated from
30
+ * `--input` values, which means a malicious caller can otherwise inject
31
+ * `../` segments and escape the `.drs/artifacts/<scope>/` namespace.
32
+ */
33
+ const ARTIFACT_ID_PATTERN = /^(art|rev)_[0-9]+_[a-z0-9]+$/;
34
+ /**
35
+ * Assert that an artifact id matches the canonical auto-generated shape.
36
+ *
37
+ * Accepts `unknown` so callers at workflow boundaries can pass raw
38
+ * template-rendered values without an upfront cast. Throws when the value
39
+ * is not a string, or the string does not match the canonical pattern.
40
+ * Exposed so callers (including workflow action runners) can validate ids
41
+ * before joining them onto a directory path.
42
+ */
43
+ export function assertSafeArtifactId(id, action = 'read') {
44
+ if (typeof id !== 'string' || !ARTIFACT_ID_PATTERN.test(id)) {
45
+ throw new Error(`Refusing to ${action} workflow artifact with invalid id: ${String(id)}`);
46
+ }
47
+ }
48
+ export function getWorkflowArtifactSubject(scope) {
49
+ if (scope.subject) {
50
+ return slugSegment(scope.subject, 'subject');
51
+ }
52
+ if (scope.changeKind && scope.changeNumber !== undefined) {
53
+ return `${slugSegment(scope.changeKind, 'change')}-${slugSegment(scope.changeNumber, '0')}`;
54
+ }
55
+ if (scope.branch) {
56
+ return `branch-${slugSegment(scope.branch, 'unknown')}`;
57
+ }
58
+ return 'default';
59
+ }
60
+ export function getWorkflowArtifactDirectory(workingDir, kind, scope) {
61
+ const relativePath = join('.drs', 'artifacts', slugSegment(scope.platform, 'local'), slugSegment(scope.projectId, 'project'), getWorkflowArtifactSubject(scope), slugSegment(kind, 'artifact'));
62
+ return resolveWithinWorkingDir(workingDir, relativePath, 'write');
63
+ }
64
+ export function createWorkflowArtifact(options, date = new Date()) {
65
+ const now = date.toISOString();
66
+ return {
67
+ schemaVersion: 1,
68
+ kind: options.kind,
69
+ id: options.id ?? createWorkflowArtifactId(date),
70
+ createdAt: now,
71
+ updatedAt: now,
72
+ scope: options.scope,
73
+ payload: options.payload,
74
+ };
75
+ }
76
+ export async function saveWorkflowArtifact(workingDir, options) {
77
+ if (options.id !== undefined) {
78
+ assertSafeArtifactId(options.id, 'write');
79
+ }
80
+ const artifact = createWorkflowArtifact(options);
81
+ const directory = getWorkflowArtifactDirectory(workingDir, options.kind, options.scope);
82
+ const path = join(directory, `${artifact.id}.json`);
83
+ const latestPath = join(directory, 'latest.json');
84
+ const content = `${JSON.stringify(artifact, null, 2)}\n`;
85
+ await mkdir(dirname(path), { recursive: true });
86
+ await writeFile(path, content, 'utf-8');
87
+ await writeFile(latestPath, content, 'utf-8');
88
+ return { artifact, path, latestPath };
89
+ }
90
+ export async function updateWorkflowArtifact(workingDir, options) {
91
+ assertSafeArtifactId(options.artifact.id, 'write');
92
+ const artifact = {
93
+ ...options.artifact,
94
+ updatedAt: new Date().toISOString(),
95
+ payload: options.payload,
96
+ };
97
+ const directory = getWorkflowArtifactDirectory(workingDir, artifact.kind, artifact.scope);
98
+ const path = join(directory, `${artifact.id}.json`);
99
+ const latestPath = join(directory, 'latest.json');
100
+ const content = `${JSON.stringify(artifact, null, 2)}\n`;
101
+ await mkdir(dirname(path), { recursive: true });
102
+ await writeFile(path, content, 'utf-8');
103
+ await writeFile(latestPath, content, 'utf-8');
104
+ return { artifact, path, latestPath };
105
+ }
106
+ function assertWorkflowArtifactEnvelope(value) {
107
+ if (!value || typeof value !== 'object') {
108
+ throw new Error('Workflow artifact is not an object.');
109
+ }
110
+ const candidate = value;
111
+ if (candidate.schemaVersion !== 1 ||
112
+ typeof candidate.kind !== 'string' ||
113
+ typeof candidate.id !== 'string' ||
114
+ typeof candidate.createdAt !== 'string' ||
115
+ typeof candidate.updatedAt !== 'string' ||
116
+ !candidate.scope ||
117
+ typeof candidate.scope !== 'object' ||
118
+ !Object.prototype.hasOwnProperty.call(candidate, 'payload')) {
119
+ throw new Error('Workflow artifact envelope is invalid.');
120
+ }
121
+ }
122
+ export async function loadWorkflowArtifact(workingDir, kind, scope, id) {
123
+ if (id !== undefined) {
124
+ assertSafeArtifactId(id, 'read');
125
+ }
126
+ const directory = getWorkflowArtifactDirectory(workingDir, kind, scope);
127
+ const path = join(directory, id ? `${id}.json` : 'latest.json');
128
+ const parsed = JSON.parse(await readFile(path, 'utf-8'));
129
+ assertWorkflowArtifactEnvelope(parsed);
130
+ if (parsed.kind !== kind) {
131
+ throw new Error(`Expected workflow artifact kind "${kind}" but found "${parsed.kind}".`);
132
+ }
133
+ return { artifact: parsed, path };
134
+ }
135
+ export async function workflowArtifactExists(workingDir, kind, scope, id) {
136
+ try {
137
+ await loadWorkflowArtifact(workingDir, kind, scope, id);
138
+ return true;
139
+ }
140
+ catch (error) {
141
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
142
+ return false;
143
+ }
144
+ if (error.code === 'ENOENT') {
145
+ return false;
146
+ }
147
+ throw error;
148
+ }
149
+ }
150
+ //# sourceMappingURL=workflow-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-artifacts.js","sourceRoot":"","sources":["../../src/lib/workflow-artifacts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/pi/sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/pi/sdk.ts"],"names":[],"mappings":"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"}