@diff-review-system/drs 4.0.0-rc.4 → 4.1.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 (419) hide show
  1. package/.pi/agents/describe/pr-describer.md +14 -0
  2. package/.pi/agents/review/unified-reviewer.md +33 -7
  3. package/.pi/agents/task/agents-md-updater.md +3 -1
  4. package/.pi/agents/task/review-assistant.md +22 -0
  5. package/.pi/agents/task/review-issue-fixer.md +18 -1
  6. package/.pi/agents/visual/pr-explainer.md +205 -0
  7. package/.pi/workflows/github-pr-describe.yaml +10 -7
  8. package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +154 -0
  9. package/.pi/workflows/github-pr-post-comment.yaml +10 -10
  10. package/.pi/workflows/github-pr-review-post.yaml +18 -8
  11. package/.pi/workflows/github-pr-review.yaml +354 -7
  12. package/.pi/workflows/github-pr-show-changes.yaml +8 -8
  13. package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +103 -0
  14. package/.pi/workflows/github-pr-visual-explain.yaml +80 -0
  15. package/.pi/workflows/gitlab-mr-describe.yaml +8 -5
  16. package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +150 -0
  17. package/.pi/workflows/gitlab-mr-post-comment.yaml +8 -8
  18. package/.pi/workflows/gitlab-mr-review.yaml +354 -5
  19. package/.pi/workflows/gitlab-mr-show-changes.yaml +6 -6
  20. package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +100 -0
  21. package/.pi/workflows/gitlab-mr-visual-explain.yaml +78 -0
  22. package/.pi/workflows/local-fix-review-issues.yaml +89 -13
  23. package/.pi/workflows/local-review.yaml +15 -2
  24. package/.pi/workflows/local-update-agents-md.yaml +1 -1
  25. package/.pi/workflows/local-visual-explain.yaml +76 -0
  26. package/.pi/workflows/release-changelog-finalize.yaml +47 -0
  27. package/.pi/workflows/tag-changelog-update.yaml +4 -4
  28. package/.pi/workflows/temporal-control-smoke.yaml +63 -0
  29. package/README.md +130 -27
  30. package/dist/ci/runner.d.ts.map +1 -1
  31. package/dist/ci/runner.js +3 -1
  32. package/dist/ci/runner.js.map +1 -1
  33. package/dist/cli/index.js +258 -9
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/init.d.ts +6 -1
  36. package/dist/cli/init.d.ts.map +1 -1
  37. package/dist/cli/init.js +29 -10
  38. package/dist/cli/init.js.map +1 -1
  39. package/dist/cli/run-agent.d.ts +4 -7
  40. package/dist/cli/run-agent.d.ts.map +1 -1
  41. package/dist/cli/run-agent.js +4 -0
  42. package/dist/cli/run-agent.js.map +1 -1
  43. package/dist/cli/workflow-executor-selection.d.ts +3 -0
  44. package/dist/cli/workflow-executor-selection.d.ts.map +1 -0
  45. package/dist/cli/workflow-executor-selection.js +15 -0
  46. package/dist/cli/workflow-executor-selection.js.map +1 -0
  47. package/dist/cli/workflow.d.ts +76 -26
  48. package/dist/cli/workflow.d.ts.map +1 -1
  49. package/dist/cli/workflow.js +1624 -192
  50. package/dist/cli/workflow.js.map +1 -1
  51. package/dist/github/client.d.ts +12 -0
  52. package/dist/github/client.d.ts.map +1 -1
  53. package/dist/github/client.js +27 -0
  54. package/dist/github/client.js.map +1 -1
  55. package/dist/github/platform-adapter.d.ts +6 -1
  56. package/dist/github/platform-adapter.d.ts.map +1 -1
  57. package/dist/github/platform-adapter.js +84 -8
  58. package/dist/github/platform-adapter.js.map +1 -1
  59. package/dist/gitlab/client.d.ts +11 -0
  60. package/dist/gitlab/client.d.ts.map +1 -1
  61. package/dist/gitlab/client.js +11 -0
  62. package/dist/gitlab/client.js.map +1 -1
  63. package/dist/gitlab/platform-adapter.d.ts +3 -1
  64. package/dist/gitlab/platform-adapter.d.ts.map +1 -1
  65. package/dist/gitlab/platform-adapter.js +32 -1
  66. package/dist/gitlab/platform-adapter.js.map +1 -1
  67. package/dist/lib/agent-result.d.ts +8 -0
  68. package/dist/lib/agent-result.d.ts.map +1 -0
  69. package/dist/lib/agent-result.js +2 -0
  70. package/dist/lib/agent-result.js.map +1 -0
  71. package/dist/lib/comment-formatter.d.ts +8 -0
  72. package/dist/lib/comment-formatter.d.ts.map +1 -1
  73. package/dist/lib/comment-formatter.js +12 -4
  74. package/dist/lib/comment-formatter.js.map +1 -1
  75. package/dist/lib/comment-poster.d.ts.map +1 -1
  76. package/dist/lib/comment-poster.js +28 -1
  77. package/dist/lib/comment-poster.js.map +1 -1
  78. package/dist/lib/config.d.ts +71 -11
  79. package/dist/lib/config.d.ts.map +1 -1
  80. package/dist/lib/config.js +163 -28
  81. package/dist/lib/config.js.map +1 -1
  82. package/dist/lib/context-compression.d.ts +10 -0
  83. package/dist/lib/context-compression.d.ts.map +1 -1
  84. package/dist/lib/context-compression.js +101 -13
  85. package/dist/lib/context-compression.js.map +1 -1
  86. package/dist/lib/context-loader.d.ts +2 -1
  87. package/dist/lib/context-loader.d.ts.map +1 -1
  88. package/dist/lib/context-loader.js +70 -1
  89. package/dist/lib/context-loader.js.map +1 -1
  90. package/dist/lib/describe-core.d.ts.map +1 -1
  91. package/dist/lib/describe-core.js +3 -2
  92. package/dist/lib/describe-core.js.map +1 -1
  93. package/dist/lib/diff-lines.d.ts +9 -0
  94. package/dist/lib/diff-lines.d.ts.map +1 -1
  95. package/dist/lib/diff-lines.js +17 -9
  96. package/dist/lib/diff-lines.js.map +1 -1
  97. package/dist/lib/exit.js +4 -4
  98. package/dist/lib/exit.js.map +1 -1
  99. package/dist/lib/html-artifact.d.ts +14 -0
  100. package/dist/lib/html-artifact.d.ts.map +1 -0
  101. package/dist/lib/html-artifact.js +59 -0
  102. package/dist/lib/html-artifact.js.map +1 -0
  103. package/dist/lib/issue-parser.js +3 -3
  104. package/dist/lib/issue-parser.js.map +1 -1
  105. package/dist/lib/json-output-schema.d.ts +70 -0
  106. package/dist/lib/json-output-schema.d.ts.map +1 -1
  107. package/dist/lib/json-output-schema.js +40 -0
  108. package/dist/lib/json-output-schema.js.map +1 -1
  109. package/dist/lib/output-paths.d.ts +0 -1
  110. package/dist/lib/output-paths.d.ts.map +1 -1
  111. package/dist/lib/output-paths.js +0 -1
  112. package/dist/lib/output-paths.js.map +1 -1
  113. package/dist/lib/platform-client.d.ts +26 -0
  114. package/dist/lib/platform-client.d.ts.map +1 -1
  115. package/dist/lib/project-setup.d.ts +10 -0
  116. package/dist/lib/project-setup.d.ts.map +1 -0
  117. package/dist/lib/project-setup.js +25 -0
  118. package/dist/lib/project-setup.js.map +1 -0
  119. package/dist/lib/review-artifact-store.d.ts +16 -0
  120. package/dist/lib/review-artifact-store.d.ts.map +1 -0
  121. package/dist/lib/review-artifact-store.js +84 -0
  122. package/dist/lib/review-artifact-store.js.map +1 -0
  123. package/dist/lib/review-artifact.d.ts +69 -0
  124. package/dist/lib/review-artifact.d.ts.map +1 -0
  125. package/dist/lib/review-artifact.js +172 -0
  126. package/dist/lib/review-artifact.js.map +1 -0
  127. package/dist/lib/review-core.d.ts +7 -4
  128. package/dist/lib/review-core.d.ts.map +1 -1
  129. package/dist/lib/review-core.js +82 -165
  130. package/dist/lib/review-core.js.map +1 -1
  131. package/dist/lib/review-orchestrator.d.ts +23 -0
  132. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  133. package/dist/lib/review-orchestrator.js +20 -13
  134. package/dist/lib/review-orchestrator.js.map +1 -1
  135. package/dist/lib/review-parser.d.ts.map +1 -1
  136. package/dist/lib/review-parser.js +15 -12
  137. package/dist/lib/review-parser.js.map +1 -1
  138. package/dist/lib/review-usage.d.ts +4 -0
  139. package/dist/lib/review-usage.d.ts.map +1 -1
  140. package/dist/lib/review-usage.js +25 -0
  141. package/dist/lib/review-usage.js.map +1 -1
  142. package/dist/lib/skills.d.ts +16 -0
  143. package/dist/lib/skills.d.ts.map +1 -0
  144. package/dist/lib/skills.js +140 -0
  145. package/dist/lib/skills.js.map +1 -0
  146. package/dist/lib/trace-collector.d.ts +105 -0
  147. package/dist/lib/trace-collector.d.ts.map +1 -0
  148. package/dist/lib/trace-collector.js +255 -0
  149. package/dist/lib/trace-collector.js.map +1 -0
  150. package/dist/lib/trace-html.d.ts +3 -0
  151. package/dist/lib/trace-html.d.ts.map +1 -0
  152. package/dist/lib/trace-html.js +349 -0
  153. package/dist/lib/trace-html.js.map +1 -0
  154. package/dist/lib/workflow/artifact-store.d.ts +71 -0
  155. package/dist/lib/workflow/artifact-store.d.ts.map +1 -0
  156. package/dist/lib/workflow/artifact-store.js +121 -0
  157. package/dist/lib/workflow/artifact-store.js.map +1 -0
  158. package/dist/lib/workflow/compiled-plan.d.ts +87 -0
  159. package/dist/lib/workflow/compiled-plan.d.ts.map +1 -0
  160. package/dist/lib/workflow/compiled-plan.js +62 -0
  161. package/dist/lib/workflow/compiled-plan.js.map +1 -0
  162. package/dist/lib/workflow/executor.d.ts +18 -0
  163. package/dist/lib/workflow/executor.d.ts.map +1 -0
  164. package/dist/lib/workflow/executor.js +2 -0
  165. package/dist/lib/workflow/executor.js.map +1 -0
  166. package/dist/lib/workflow/graph.d.ts +30 -0
  167. package/dist/lib/workflow/graph.d.ts.map +1 -0
  168. package/dist/lib/workflow/graph.js +139 -0
  169. package/dist/lib/workflow/graph.js.map +1 -0
  170. package/dist/lib/workflow/input.d.ts +4 -0
  171. package/dist/lib/workflow/input.d.ts.map +1 -0
  172. package/dist/lib/workflow/input.js +4 -0
  173. package/dist/lib/workflow/input.js.map +1 -0
  174. package/dist/lib/workflow/node-executor.d.ts +19 -0
  175. package/dist/lib/workflow/node-executor.d.ts.map +1 -0
  176. package/dist/lib/workflow/node-executor.js +2 -0
  177. package/dist/lib/workflow/node-executor.js.map +1 -0
  178. package/dist/lib/workflow/planning.d.ts +51 -0
  179. package/dist/lib/workflow/planning.d.ts.map +1 -0
  180. package/dist/lib/workflow/planning.js +814 -0
  181. package/dist/lib/workflow/planning.js.map +1 -0
  182. package/dist/lib/workflow/types.d.ts +66 -0
  183. package/dist/lib/workflow/types.d.ts.map +1 -0
  184. package/dist/lib/workflow/types.js +2 -0
  185. package/dist/lib/workflow/types.js.map +1 -0
  186. package/dist/lib/workflow-artifacts.d.ts +54 -0
  187. package/dist/lib/workflow-artifacts.d.ts.map +1 -0
  188. package/dist/lib/workflow-artifacts.js +150 -0
  189. package/dist/lib/workflow-artifacts.js.map +1 -0
  190. package/dist/lib/write-json-output.d.ts.map +1 -1
  191. package/dist/lib/write-json-output.js +3 -8
  192. package/dist/lib/write-json-output.js.map +1 -1
  193. package/dist/pi/sdk.d.ts.map +1 -1
  194. package/dist/pi/sdk.js +576 -8
  195. package/dist/pi/sdk.js.map +1 -1
  196. package/dist/runtime/agent-loader.js +2 -2
  197. package/dist/runtime/built-in-paths.d.ts +1 -0
  198. package/dist/runtime/built-in-paths.d.ts.map +1 -1
  199. package/dist/runtime/built-in-paths.js +7 -0
  200. package/dist/runtime/built-in-paths.js.map +1 -1
  201. package/dist/runtime/client.d.ts +2 -0
  202. package/dist/runtime/client.d.ts.map +1 -1
  203. package/dist/runtime/client.js +11 -5
  204. package/dist/runtime/client.js.map +1 -1
  205. package/dist/temporal/activities.d.ts +26 -0
  206. package/dist/temporal/activities.d.ts.map +1 -0
  207. package/dist/temporal/activities.js +219 -0
  208. package/dist/temporal/activities.js.map +1 -0
  209. package/dist/temporal/config.d.ts +4 -0
  210. package/dist/temporal/config.d.ts.map +1 -0
  211. package/dist/temporal/config.js +36 -0
  212. package/dist/temporal/config.js.map +1 -0
  213. package/dist/temporal/executor.d.ts +7 -0
  214. package/dist/temporal/executor.d.ts.map +1 -0
  215. package/dist/temporal/executor.js +233 -0
  216. package/dist/temporal/executor.js.map +1 -0
  217. package/dist/temporal/retry-policy.d.ts +28 -0
  218. package/dist/temporal/retry-policy.d.ts.map +1 -0
  219. package/dist/temporal/retry-policy.js +56 -0
  220. package/dist/temporal/retry-policy.js.map +1 -0
  221. package/dist/temporal/types.d.ts +86 -0
  222. package/dist/temporal/types.d.ts.map +1 -0
  223. package/dist/temporal/types.js +2 -0
  224. package/dist/temporal/types.js.map +1 -0
  225. package/dist/temporal/worker.d.ts +3 -0
  226. package/dist/temporal/worker.d.ts.map +1 -0
  227. package/dist/temporal/worker.js +18 -0
  228. package/dist/temporal/worker.js.map +1 -0
  229. package/dist/temporal/workflow-id.d.ts +27 -0
  230. package/dist/temporal/workflow-id.d.ts.map +1 -0
  231. package/dist/temporal/workflow-id.js +53 -0
  232. package/dist/temporal/workflow-id.js.map +1 -0
  233. package/dist/temporal/workflows.d.ts +6 -0
  234. package/dist/temporal/workflows.d.ts.map +1 -0
  235. package/dist/temporal/workflows.js +342 -0
  236. package/dist/temporal/workflows.js.map +1 -0
  237. package/package.json +26 -15
  238. package/.pi/workflows/github-pr-describe-post.yaml +0 -24
  239. package/.pi/workflows/gitlab-mr-describe-post.yaml +0 -22
  240. package/.pi/workflows/gitlab-mr-review-code-quality.yaml +0 -31
  241. package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +0 -40
  242. package/.pi/workflows/gitlab-mr-review-post.yaml +0 -30
  243. package/.pi/workflows/local-staged-review.yaml +0 -17
  244. package/dist/cli/run-agent.test.d.ts +0 -2
  245. package/dist/cli/run-agent.test.d.ts.map +0 -1
  246. package/dist/cli/run-agent.test.js +0 -204
  247. package/dist/cli/run-agent.test.js.map +0 -1
  248. package/dist/cli/workflow.test.d.ts +0 -2
  249. package/dist/cli/workflow.test.d.ts.map +0 -1
  250. package/dist/cli/workflow.test.js +0 -1410
  251. package/dist/cli/workflow.test.js.map +0 -1
  252. package/dist/github/client.test.d.ts +0 -2
  253. package/dist/github/client.test.d.ts.map +0 -1
  254. package/dist/github/client.test.js +0 -206
  255. package/dist/github/client.test.js.map +0 -1
  256. package/dist/github/platform-adapter.test.d.ts +0 -2
  257. package/dist/github/platform-adapter.test.d.ts.map +0 -1
  258. package/dist/github/platform-adapter.test.js +0 -40
  259. package/dist/github/platform-adapter.test.js.map +0 -1
  260. package/dist/gitlab/diff-parser.test.d.ts +0 -2
  261. package/dist/gitlab/diff-parser.test.d.ts.map +0 -1
  262. package/dist/gitlab/diff-parser.test.js +0 -315
  263. package/dist/gitlab/diff-parser.test.js.map +0 -1
  264. package/dist/gitlab/platform-adapter.test.d.ts +0 -2
  265. package/dist/gitlab/platform-adapter.test.d.ts.map +0 -1
  266. package/dist/gitlab/platform-adapter.test.js +0 -21
  267. package/dist/gitlab/platform-adapter.test.js.map +0 -1
  268. package/dist/index.test.d.ts +0 -2
  269. package/dist/index.test.d.ts.map +0 -1
  270. package/dist/index.test.js +0 -7
  271. package/dist/index.test.js.map +0 -1
  272. package/dist/lib/code-quality-report.test.d.ts +0 -2
  273. package/dist/lib/code-quality-report.test.d.ts.map +0 -1
  274. package/dist/lib/code-quality-report.test.js +0 -327
  275. package/dist/lib/code-quality-report.test.js.map +0 -1
  276. package/dist/lib/comment-formatter.test.d.ts +0 -2
  277. package/dist/lib/comment-formatter.test.d.ts.map +0 -1
  278. package/dist/lib/comment-formatter.test.js +0 -727
  279. package/dist/lib/comment-formatter.test.js.map +0 -1
  280. package/dist/lib/comment-manager.test.d.ts +0 -2
  281. package/dist/lib/comment-manager.test.d.ts.map +0 -1
  282. package/dist/lib/comment-manager.test.js +0 -680
  283. package/dist/lib/comment-manager.test.js.map +0 -1
  284. package/dist/lib/comment-poster.test.d.ts +0 -5
  285. package/dist/lib/comment-poster.test.d.ts.map +0 -1
  286. package/dist/lib/comment-poster.test.js +0 -255
  287. package/dist/lib/comment-poster.test.js.map +0 -1
  288. package/dist/lib/config-model-overrides.test.d.ts +0 -2
  289. package/dist/lib/config-model-overrides.test.d.ts.map +0 -1
  290. package/dist/lib/config-model-overrides.test.js +0 -218
  291. package/dist/lib/config-model-overrides.test.js.map +0 -1
  292. package/dist/lib/config.test.d.ts +0 -2
  293. package/dist/lib/config.test.d.ts.map +0 -1
  294. package/dist/lib/config.test.js +0 -353
  295. package/dist/lib/config.test.js.map +0 -1
  296. package/dist/lib/context-compression.test.d.ts +0 -2
  297. package/dist/lib/context-compression.test.d.ts.map +0 -1
  298. package/dist/lib/context-compression.test.js +0 -337
  299. package/dist/lib/context-compression.test.js.map +0 -1
  300. package/dist/lib/context-loader.test.d.ts +0 -2
  301. package/dist/lib/context-loader.test.d.ts.map +0 -1
  302. package/dist/lib/context-loader.test.js +0 -212
  303. package/dist/lib/context-loader.test.js.map +0 -1
  304. package/dist/lib/cursor-fix-link.test.d.ts +0 -2
  305. package/dist/lib/cursor-fix-link.test.d.ts.map +0 -1
  306. package/dist/lib/cursor-fix-link.test.js +0 -70
  307. package/dist/lib/cursor-fix-link.test.js.map +0 -1
  308. package/dist/lib/describe-core.test.d.ts +0 -2
  309. package/dist/lib/describe-core.test.d.ts.map +0 -1
  310. package/dist/lib/describe-core.test.js +0 -208
  311. package/dist/lib/describe-core.test.js.map +0 -1
  312. package/dist/lib/describe-output-path.test.d.ts +0 -2
  313. package/dist/lib/describe-output-path.test.d.ts.map +0 -1
  314. package/dist/lib/describe-output-path.test.js +0 -51
  315. package/dist/lib/describe-output-path.test.js.map +0 -1
  316. package/dist/lib/describe-parser.test.d.ts +0 -2
  317. package/dist/lib/describe-parser.test.d.ts.map +0 -1
  318. package/dist/lib/describe-parser.test.js +0 -282
  319. package/dist/lib/describe-parser.test.js.map +0 -1
  320. package/dist/lib/description-executor.test.d.ts +0 -2
  321. package/dist/lib/description-executor.test.d.ts.map +0 -1
  322. package/dist/lib/description-executor.test.js +0 -135
  323. package/dist/lib/description-executor.test.js.map +0 -1
  324. package/dist/lib/description-formatter.test.d.ts +0 -2
  325. package/dist/lib/description-formatter.test.d.ts.map +0 -1
  326. package/dist/lib/description-formatter.test.js +0 -57
  327. package/dist/lib/description-formatter.test.js.map +0 -1
  328. package/dist/lib/diff-lines.test.d.ts +0 -2
  329. package/dist/lib/diff-lines.test.d.ts.map +0 -1
  330. package/dist/lib/diff-lines.test.js +0 -13
  331. package/dist/lib/diff-lines.test.js.map +0 -1
  332. package/dist/lib/diff-parser.test.d.ts +0 -2
  333. package/dist/lib/diff-parser.test.d.ts.map +0 -1
  334. package/dist/lib/diff-parser.test.js +0 -335
  335. package/dist/lib/diff-parser.test.js.map +0 -1
  336. package/dist/lib/error-comment-poster.test.d.ts +0 -2
  337. package/dist/lib/error-comment-poster.test.d.ts.map +0 -1
  338. package/dist/lib/error-comment-poster.test.js +0 -128
  339. package/dist/lib/error-comment-poster.test.js.map +0 -1
  340. package/dist/lib/exit.test.d.ts +0 -2
  341. package/dist/lib/exit.test.d.ts.map +0 -1
  342. package/dist/lib/exit.test.js +0 -120
  343. package/dist/lib/exit.test.js.map +0 -1
  344. package/dist/lib/issue-parser.test.d.ts +0 -2
  345. package/dist/lib/issue-parser.test.d.ts.map +0 -1
  346. package/dist/lib/issue-parser.test.js +0 -281
  347. package/dist/lib/issue-parser.test.js.map +0 -1
  348. package/dist/lib/json-output-schema.test.d.ts +0 -2
  349. package/dist/lib/json-output-schema.test.d.ts.map +0 -1
  350. package/dist/lib/json-output-schema.test.js +0 -92
  351. package/dist/lib/json-output-schema.test.js.map +0 -1
  352. package/dist/lib/json-output.test.d.ts +0 -2
  353. package/dist/lib/json-output.test.d.ts.map +0 -1
  354. package/dist/lib/json-output.test.js +0 -141
  355. package/dist/lib/json-output.test.js.map +0 -1
  356. package/dist/lib/logger.test.d.ts +0 -2
  357. package/dist/lib/logger.test.d.ts.map +0 -1
  358. package/dist/lib/logger.test.js +0 -324
  359. package/dist/lib/logger.test.js.map +0 -1
  360. package/dist/lib/position-validator.test.d.ts +0 -2
  361. package/dist/lib/position-validator.test.d.ts.map +0 -1
  362. package/dist/lib/position-validator.test.js +0 -128
  363. package/dist/lib/position-validator.test.js.map +0 -1
  364. package/dist/lib/prompt-budget.test.d.ts +0 -2
  365. package/dist/lib/prompt-budget.test.d.ts.map +0 -1
  366. package/dist/lib/prompt-budget.test.js +0 -55
  367. package/dist/lib/prompt-budget.test.js.map +0 -1
  368. package/dist/lib/repository-validator.test.d.ts +0 -5
  369. package/dist/lib/repository-validator.test.d.ts.map +0 -1
  370. package/dist/lib/repository-validator.test.js +0 -341
  371. package/dist/lib/repository-validator.test.js.map +0 -1
  372. package/dist/lib/review-core.test.d.ts +0 -2
  373. package/dist/lib/review-core.test.d.ts.map +0 -1
  374. package/dist/lib/review-core.test.js +0 -614
  375. package/dist/lib/review-core.test.js.map +0 -1
  376. package/dist/lib/review-orchestrator.test.d.ts +0 -2
  377. package/dist/lib/review-orchestrator.test.d.ts.map +0 -1
  378. package/dist/lib/review-orchestrator.test.js +0 -552
  379. package/dist/lib/review-orchestrator.test.js.map +0 -1
  380. package/dist/lib/review-output-path.test.d.ts +0 -2
  381. package/dist/lib/review-output-path.test.d.ts.map +0 -1
  382. package/dist/lib/review-output-path.test.js +0 -83
  383. package/dist/lib/review-output-path.test.js.map +0 -1
  384. package/dist/lib/review-parser.test.d.ts +0 -2
  385. package/dist/lib/review-parser.test.d.ts.map +0 -1
  386. package/dist/lib/review-parser.test.js +0 -130
  387. package/dist/lib/review-parser.test.js.map +0 -1
  388. package/dist/lib/review-usage.test.d.ts +0 -2
  389. package/dist/lib/review-usage.test.d.ts.map +0 -1
  390. package/dist/lib/review-usage.test.js +0 -83
  391. package/dist/lib/review-usage.test.js.map +0 -1
  392. package/dist/lib/unified-review-executor.d.ts +0 -58
  393. package/dist/lib/unified-review-executor.d.ts.map +0 -1
  394. package/dist/lib/unified-review-executor.js +0 -201
  395. package/dist/lib/unified-review-executor.js.map +0 -1
  396. package/dist/lib/unified-review-executor.test.d.ts +0 -5
  397. package/dist/lib/unified-review-executor.test.d.ts.map +0 -1
  398. package/dist/lib/unified-review-executor.test.js +0 -472
  399. package/dist/lib/unified-review-executor.test.js.map +0 -1
  400. package/dist/lib/write-json-output.test.d.ts +0 -2
  401. package/dist/lib/write-json-output.test.d.ts.map +0 -1
  402. package/dist/lib/write-json-output.test.js +0 -259
  403. package/dist/lib/write-json-output.test.js.map +0 -1
  404. package/dist/pi/sdk.test.d.ts +0 -2
  405. package/dist/pi/sdk.test.d.ts.map +0 -1
  406. package/dist/pi/sdk.test.js +0 -488
  407. package/dist/pi/sdk.test.js.map +0 -1
  408. package/dist/runtime/agent-loader.test.d.ts +0 -2
  409. package/dist/runtime/agent-loader.test.d.ts.map +0 -1
  410. package/dist/runtime/agent-loader.test.js +0 -277
  411. package/dist/runtime/agent-loader.test.js.map +0 -1
  412. package/dist/runtime/client.test.d.ts +0 -2
  413. package/dist/runtime/client.test.d.ts.map +0 -1
  414. package/dist/runtime/client.test.js +0 -772
  415. package/dist/runtime/client.test.js.map +0 -1
  416. package/dist/runtime/path-config.test.d.ts +0 -2
  417. package/dist/runtime/path-config.test.d.ts.map +0 -1
  418. package/dist/runtime/path-config.test.js +0 -112
  419. 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,71 @@
1
+ /**
2
+ * Reference to a workflow artifact stored outside Temporal history.
3
+ *
4
+ * Large node outputs (diffs, review payloads, model responses) are persisted
5
+ * to an artifact store and replaced with this ref in the Temporal event
6
+ * history so history stays small and replayable.
7
+ */
8
+ export interface TemporalArtifactRef {
9
+ kind: 'artifact-ref';
10
+ key: string;
11
+ uri: string;
12
+ contentType?: string;
13
+ sizeBytes?: number;
14
+ sha256?: string;
15
+ }
16
+ /**
17
+ * Metadata recorded alongside a stored artifact value.
18
+ */
19
+ export interface ArtifactMetadata {
20
+ contentType?: string;
21
+ }
22
+ /**
23
+ * Policy controlling which node output values stay inline in workflow/results
24
+ * and which are offloaded to the artifact store as refs.
25
+ *
26
+ * - `inline-only`: every value stays inline (local executor default).
27
+ * - `ref-large-values`: values larger than `inlineMaxBytes` become refs
28
+ * (Temporal executor default).
29
+ * - `ref-all-values`: every value becomes a ref (useful for debugging or
30
+ * strict-history-size scenarios).
31
+ */
32
+ export type ArtifactInliningMode = 'inline-only' | 'ref-large-values' | 'ref-all-values';
33
+ export interface ArtifactInliningPolicy {
34
+ mode: ArtifactInliningMode;
35
+ inlineMaxBytes: number;
36
+ }
37
+ export declare const DEFAULT_ARTIFACT_POLICY: ArtifactInliningPolicy;
38
+ /**
39
+ * Backend for persisting and hydrating workflow artifact values.
40
+ *
41
+ * The local filesystem store is used for development and the Temporal MVP.
42
+ * S3-compatible and other object stores can implement the same interface for
43
+ * CI/production without changing workflow code.
44
+ */
45
+ export interface WorkflowArtifactStore {
46
+ put(key: string, value: unknown, metadata?: ArtifactMetadata): Promise<TemporalArtifactRef>;
47
+ get(ref: TemporalArtifactRef): Promise<unknown>;
48
+ exists(ref: TemporalArtifactRef): Promise<boolean>;
49
+ }
50
+ export declare function isArtifactRef(value: unknown): value is TemporalArtifactRef;
51
+ /**
52
+ * Decide whether a value should stay inline or be offloaded to the store.
53
+ */
54
+ export declare function shouldInline(serializedSize: number, policy: ArtifactInliningPolicy): boolean;
55
+ /**
56
+ * Local filesystem artifact store.
57
+ *
58
+ * Persists artifacts under `.drs/artifacts/temporal/<namespace>/<key>` within
59
+ * the specified working directory. The `uri` in returned refs is a relative
60
+ * path so the store works consistently across machines when the working
61
+ * directory matches.
62
+ */
63
+ export declare class LocalWorkflowArtifactStore implements WorkflowArtifactStore {
64
+ private readonly workingDir;
65
+ private readonly baseDir;
66
+ constructor(workingDir: string, namespace?: string);
67
+ put(key: string, value: unknown, metadata?: ArtifactMetadata): Promise<TemporalArtifactRef>;
68
+ get(ref: TemporalArtifactRef): Promise<unknown>;
69
+ exists(ref: TemporalArtifactRef): Promise<boolean>;
70
+ }
71
+ //# sourceMappingURL=artifact-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-store.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow/artifact-store.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,EAAE,sBAGrC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5F,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAQ1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAI5F;AAiDD;;;;;;;GAOG;AACH,qBAAa,0BAA2B,YAAW,qBAAqB;IAIpE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAH7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGd,UAAU,EAAE,MAAM,EACnC,SAAS,SAAY;IAMjB,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IAqBzB,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/C,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;CAUzD"}
@@ -0,0 +1,121 @@
1
+ import { createHash } from 'crypto';
2
+ import { mkdir, readFile, writeFile } from 'fs/promises';
3
+ import { dirname, join } from 'path';
4
+ import { resolveWithinWorkingDir } from '../path-utils.js';
5
+ export const DEFAULT_ARTIFACT_POLICY = {
6
+ mode: 'ref-large-values',
7
+ inlineMaxBytes: 64 * 1024,
8
+ };
9
+ export function isArtifactRef(value) {
10
+ return (typeof value === 'object' &&
11
+ value !== null &&
12
+ value.kind === 'artifact-ref' &&
13
+ typeof value.key === 'string' &&
14
+ typeof value.uri === 'string');
15
+ }
16
+ /**
17
+ * Decide whether a value should stay inline or be offloaded to the store.
18
+ */
19
+ export function shouldInline(serializedSize, policy) {
20
+ if (policy.mode === 'inline-only')
21
+ return true;
22
+ if (policy.mode === 'ref-all-values')
23
+ return false;
24
+ return serializedSize <= policy.inlineMaxBytes;
25
+ }
26
+ function serialize(value) {
27
+ if (typeof value === 'string') {
28
+ return { bytes: Buffer.from(value, 'utf-8'), contentType: 'text/plain' };
29
+ }
30
+ return {
31
+ bytes: Buffer.from(JSON.stringify(value, null, 2), 'utf-8'),
32
+ contentType: 'application/json',
33
+ };
34
+ }
35
+ function deserialize(buf, contentType) {
36
+ const text = buf.toString('utf-8');
37
+ if (contentType === 'application/json') {
38
+ return JSON.parse(text);
39
+ }
40
+ if (contentType === 'text/plain') {
41
+ return text;
42
+ }
43
+ // Fallback: try JSON, then treat as string.
44
+ try {
45
+ return JSON.parse(text);
46
+ }
47
+ catch {
48
+ return text;
49
+ }
50
+ }
51
+ function sha256(buf) {
52
+ return createHash('sha256').update(buf).digest('hex');
53
+ }
54
+ function slugSegment(value, fallback) {
55
+ const raw = value === undefined || value === '' ? fallback : String(value);
56
+ const slug = raw
57
+ .trim()
58
+ .replace(/[^A-Za-z0-9._-]+/g, '-')
59
+ .replace(/^-+|-+$/g, '');
60
+ return slug || fallback;
61
+ }
62
+ function sanitizeKey(key) {
63
+ const segments = key.split('/').map((seg) => slugSegment(seg, 'segment'));
64
+ if (segments.some((seg) => seg === '..' || seg === '.')) {
65
+ throw new Error(`Refusing to put artifact with unsafe key: ${key}`);
66
+ }
67
+ return segments.join('/');
68
+ }
69
+ /**
70
+ * Local filesystem artifact store.
71
+ *
72
+ * Persists artifacts under `.drs/artifacts/temporal/<namespace>/<key>` within
73
+ * the specified working directory. The `uri` in returned refs is a relative
74
+ * path so the store works consistently across machines when the working
75
+ * directory matches.
76
+ */
77
+ export class LocalWorkflowArtifactStore {
78
+ workingDir;
79
+ baseDir;
80
+ constructor(workingDir, namespace = 'default') {
81
+ this.workingDir = workingDir;
82
+ const slug = slugSegment(namespace, 'default');
83
+ this.baseDir = `.drs/artifacts/temporal/${slug}`;
84
+ }
85
+ async put(key, value, metadata) {
86
+ const { bytes, contentType } = serialize(value);
87
+ const resolvedContentType = metadata?.contentType ?? contentType;
88
+ const hash = sha256(bytes);
89
+ const safeKey = sanitizeKey(key);
90
+ const relativePath = join(this.baseDir, `${safeKey}.json`);
91
+ const fullPath = resolveWithinWorkingDir(this.workingDir, relativePath, 'write');
92
+ await mkdir(dirname(fullPath), { recursive: true });
93
+ await writeFile(fullPath, bytes, 'utf-8');
94
+ return {
95
+ kind: 'artifact-ref',
96
+ key,
97
+ uri: relativePath,
98
+ contentType: resolvedContentType,
99
+ sizeBytes: bytes.length,
100
+ sha256: hash,
101
+ };
102
+ }
103
+ async get(ref) {
104
+ const fullPath = resolveWithinWorkingDir(this.workingDir, ref.uri, 'read');
105
+ const bytes = await readFile(fullPath);
106
+ return deserialize(bytes, ref.contentType);
107
+ }
108
+ async exists(ref) {
109
+ try {
110
+ const fullPath = resolveWithinWorkingDir(this.workingDir, ref.uri, 'read');
111
+ await readFile(fullPath);
112
+ return true;
113
+ }
114
+ catch (error) {
115
+ if (error.code === 'ENOENT')
116
+ return false;
117
+ throw error;
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=artifact-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../../src/lib/workflow/artifact-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import type { DRSConfig, WorkflowNodeConfig } from '../config.js';
2
+ /**
3
+ * Workflow node as it appears in a compiled plan.
4
+ *
5
+ * This is currently an API-facing alias for WorkflowNodeConfig so future plan
6
+ * schema changes can evolve independently from raw workflow config types.
7
+ */
8
+ export type CompiledWorkflowNode = WorkflowNodeConfig;
9
+ /**
10
+ * A DRS workflow control-flow segment expressed as JSON-serializable data.
11
+ *
12
+ * - DAG segments list their node ids plus, when a control node routes into
13
+ * them, the set of active node ids that should actually execute (inactive
14
+ * node ids are skipped by the runner). Active ids are absent for plain DAG
15
+ * segments with no gating control node.
16
+ * - Control segments record the controlling node id.
17
+ */
18
+ export type CompiledWorkflowSegment = {
19
+ type: 'dag';
20
+ nodeIds: string[];
21
+ activeNodeIds?: string[];
22
+ } | {
23
+ type: 'control';
24
+ nodeId: string;
25
+ };
26
+ /**
27
+ * Metadata for a single workflow input, normalized to a plain object so the
28
+ * compiled plan is JSON-serializable even when the original input is declared
29
+ * as a bare string.
30
+ */
31
+ export interface CompiledWorkflowInput {
32
+ type: 'string' | 'boolean' | 'number' | 'enum';
33
+ value?: string;
34
+ file?: string;
35
+ default?: string | number | boolean;
36
+ required?: boolean;
37
+ values?: Array<string | number | boolean>;
38
+ description?: string;
39
+ }
40
+ /**
41
+ * A fully resolved, JSON-serializable description of a workflow ready to be
42
+ * handed to an executor (local or Temporal). It carries everything needed to
43
+ * schedule nodes without reloading repo config: normalized nodes, execution
44
+ * order, waves, control-flow segments, input metadata, and the output key.
45
+ *
46
+ * Resolved input *values* are intentionally not part of the plan; they are
47
+ * supplied separately at run time so the same plan can dispatch multiple runs
48
+ * with different inputs.
49
+ */
50
+ export interface CompiledWorkflowPlan {
51
+ /** Schema version so executors can evolve the shape safely. */
52
+ schemaVersion: 1;
53
+ /** Workflow name as resolved from config.workflows. */
54
+ workflowName: string;
55
+ /** Optional human-readable description. */
56
+ description?: string;
57
+ /** Origin of the workflow definition: packaged or project. */
58
+ source: 'packaged' | 'project';
59
+ /** Project workflows overriding a packaged workflow of the same name. */
60
+ overridesPackaged: boolean;
61
+ /** Workflow-level output artifact key. May be undefined (last node output). */
62
+ output?: string;
63
+ /** Workflow input metadata keyed by input name. */
64
+ inputs: Record<string, CompiledWorkflowInput>;
65
+ /** Normalized nodes keyed by id, identical in shape to WorkflowNodeConfig. */
66
+ nodes: Record<string, CompiledWorkflowNode>;
67
+ /** Dependency-ordered node ids (topological). */
68
+ executionOrder: string[];
69
+ /** Wave grouping for parallel DAG execution. */
70
+ waves: string[][];
71
+ /** Control-flow segments for control-bearing workflows; empty for DAG-only. */
72
+ segments: CompiledWorkflowSegment[];
73
+ /** True when the workflow uses any control (loop/switch/end/passThrough) node. */
74
+ hasControlNodes: boolean;
75
+ /** Id of the last node in execution order, used when output is undefined. */
76
+ lastNodeId: string;
77
+ }
78
+ /**
79
+ * Subset of {@link WorkflowRunOptions} relevant to plan compilation. The
80
+ * workingDir is used only to resolve workflow source info (packaged vs.
81
+ * project) and does not become part of the serialized plan.
82
+ */
83
+ export interface CompileWorkflowPlanOptions {
84
+ workingDir?: string;
85
+ }
86
+ export declare function compileWorkflowPlan(config: DRSConfig, workflowName: string, options?: CompileWorkflowPlanOptions): CompiledWorkflowPlan;
87
+ //# sourceMappingURL=compiled-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiled-plan.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow/compiled-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAWtB;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,aAAa,EAAE,CAAC,CAAC;IACjB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,yEAAyE;IACzE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC9C,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5C,iDAAiD;IACjD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;IAClB,+EAA+E;IAC/E,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,kFAAkF;IAClF,eAAe,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiBD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CAmDtB"}