@tea-agent/loop-agent 0.41.1-beta.0 → 0.41.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 (206) hide show
  1. package/CHANGELOG.md +47 -267
  2. package/dist/application/dag/generate-task-dag.js +19 -75
  3. package/dist/application/task-lifecycle/advance.js +5 -24
  4. package/dist/application/task-lifecycle/observe.js +17 -171
  5. package/dist/application/task-lifecycle/plan-transitions.js +7 -42
  6. package/dist/application/task-lifecycle/recommendations.js +2 -13
  7. package/dist/build-stamp.json +3 -3
  8. package/dist/cli/command-definitions.js +0 -7
  9. package/dist/cli/program.js +0 -5
  10. package/dist/commands/client-recovery.js +0 -3
  11. package/dist/commands/init.js +1 -27
  12. package/dist/commands/task-advance.js +0 -19
  13. package/dist/executors/dag-pi-executor.js +231 -3784
  14. package/dist/executors/pi-executor.js +4 -15
  15. package/dist/executors/shell-executor.js +217 -945
  16. package/dist/executors/shell-write-guard.js +0 -7
  17. package/dist/shared/dag-failure-category.js +0 -12
  18. package/dist/shared/openspec-spec.js +4 -70
  19. package/dist/shared/operator/capabilities.js +0 -7
  20. package/dist/task/config-types.js +7 -34
  21. package/dist/task/contract/adopt.js +0 -4
  22. package/dist/task/contract/import-revision.js +0 -4
  23. package/dist/task/contract/project.js +0 -3
  24. package/dist/task/contract/schema.js +1 -2
  25. package/dist/task/frontend-project-capability.js +20 -203
  26. package/dist/task/runtime.js +2 -5
  27. package/dist/task/source-prepare/build-draft.js +3 -3
  28. package/dist/task/source-prepare/fragment-inventory.js +9 -15
  29. package/dist/task/source-prepare/prepare.js +1 -89
  30. package/dist/task/source-prepare/semantic-intake.js +2 -6
  31. package/dist/task/source-references.js +1 -22
  32. package/dist/worker/console/chat/chat-ui-policy.js +4 -2
  33. package/dist/worker/console/chat/pi-runtime.js +176 -9
  34. package/dist/worker/console/chat/repo-browser.js +10 -3
  35. package/dist/worker/console/chat/routes.js +42 -22
  36. package/dist/worker/console/chat/semantic-activity.js +12 -11
  37. package/dist/worker/console/chat/session-stats.js +96 -0
  38. package/dist/worker/console/chat/session-store.js +117 -70
  39. package/dist/worker/console/chat/shortcuts.js +1 -1
  40. package/dist/worker/console/chat/turn-process.js +139 -60
  41. package/dist/worker/console/index.js +0 -3
  42. package/dist/worker/console/operation-store.js +6 -226
  43. package/dist/worker/console/operator-actions.js +7 -169
  44. package/dist/worker/console/pi-plugins.js +3 -1
  45. package/dist/worker/console/server.js +0 -3
  46. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Bho4we4c.js → abnfDiagram-N423BO3Z-D7oU983t.js} +1 -1
  47. package/dist/worker/console/static/assets/{arc-TBDkTeK0.js → arc-BrKSRdFS.js} +1 -1
  48. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-BF_fZrn2.js → architectureDiagram-T3A2C74G-CiXV7L56.js} +1 -1
  49. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-CCnPgUe2.js → blockDiagram-VBNYF7ZC-D_Hs_gIG.js} +1 -1
  50. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BCYZJLAT.js → c4Diagram-5PPSVZJV-DbM-Lqqh.js} +1 -1
  51. package/dist/worker/console/static/assets/channel-D1xajGpe.js +1 -0
  52. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D8K6adhU.js → chunk-2GRJ4B5K-D1M8uqJw.js} +1 -1
  53. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DkT1Q78b.js → chunk-2Q5K7J3B-4D3RFHT6.js} +1 -1
  54. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DuhvpIr7.js → chunk-5RXB4S5H-CdwpY_n9.js} +1 -1
  55. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BnK6dC49.js → chunk-5VM5RSS4-BLeLZ9PG.js} +1 -1
  56. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DPz__z7r.js → chunk-6Q2QTUOP-CeRNEMvc.js} +1 -1
  57. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-0kkppM2j.js → chunk-GF5L2VYU-CjkHP8Vy.js} +1 -1
  58. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BB41iK5t.js → chunk-JWPE2WC7-B54ZUQY-.js} +1 -1
  59. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-CiVrxKHU.js → chunk-KBJHAD2P-4bKaMVmx.js} +1 -1
  60. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-C2h9Xje1.js → chunk-RYQCIY6F-Cyjfznu_.js} +1 -1
  61. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-3iOSHdbM.js → chunk-XXDRQBXY-CDN-zGFV.js} +1 -1
  62. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BmuGTfRr.js +1 -0
  63. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BmuGTfRr.js +1 -0
  64. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BN3A7tkk.js → cose-bilkent-JH36ORCC-HxJmz411.js} +1 -1
  65. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-CTuBy0Or.js → cynefin-VYW2F7L2-DtSt5K2w.js} +1 -1
  66. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-wb6tUlMN.js → cynefinDiagram-MW4NZA55-VtkSpRmG.js} +1 -1
  67. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-GP1Ivx8B.js → dagre-VZM6K2ZE-Bj4DT4du.js} +1 -1
  68. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-ejrcK6L0.js → diagram-7IWD3JNH-Bpuk6BmP.js} +1 -1
  69. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-YFkCCvUU.js → diagram-B4RE2ZJO-BHYGv_yO.js} +1 -1
  70. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-B4rrvIaL.js → diagram-LBJQPF4R-DEx3WwnT.js} +1 -1
  71. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-C-YIZcUf.js → diagram-Q27KOJAE-Cj0dS5e8.js} +1 -1
  72. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BPF5wcL1.js → diagram-UB23O5K3-B97h8l21.js} +1 -1
  73. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CU5SzXjO.js → ebnfDiagram-BXEA7PRR-DMSFAhBd.js} +1 -1
  74. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-CpL414DE.js → erDiagram-JOGREHBK-DhVOCbt6.js} +1 -1
  75. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-MrhLzNau.js → flowDiagram-UKHOOZJN-GlakITWL.js} +1 -1
  76. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Bg4qFuUo.js → ganttDiagram-PKOTCBZU-VxPpu9eQ.js} +1 -1
  77. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-ColxSXLR.js → gitGraphDiagram-DS77QQ5N-Bs_e5DRT.js} +1 -1
  78. package/dist/worker/console/static/assets/index-BLzcAykx.js +451 -0
  79. package/dist/worker/console/static/assets/index-Cs9JUSPs.css +1 -0
  80. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-Czvtm6gc.js → infoDiagram-6WML65LV-BXYuU4Uw.js} +1 -1
  81. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-B7Xp8HyJ.js → ishikawaDiagram-WSZJBQD7-C34erCbU.js} +1 -1
  82. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DWYZcvph.js → journeyDiagram-NVQOT4AX-DZCAiOU3.js} +1 -1
  83. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-KTLZRUjx.js → kanban-definition-27J2QSJJ-C9gaTdUm.js} +1 -1
  84. package/dist/worker/console/static/assets/{linear-_Exn7bfl.js → linear-CvI0Z17U.js} +1 -1
  85. package/dist/worker/console/static/assets/{mermaid.core-Cxg8kX8V.js → mermaid.core-DMMSIx7j.js} +5 -5
  86. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-oKrlo2Bt.js → mindmap-definition-FAOFIHXS-BKKP0EO6.js} +1 -1
  87. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-XAeteiNd.js → pegDiagram-VL7TDLO6-C3LiFbl5.js} +1 -1
  88. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-BTf1K-lp.js → pieDiagram-7S7Q4E2Y-Bb3Om2Dz.js} +1 -1
  89. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-C0IlY0Jf.js → quadrantDiagram-CIZ2JOQS-DNthMjzc.js} +1 -1
  90. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BVbKtZhW.js → railroadDiagram-AXF67PYL-miFsr4Tv.js} +1 -1
  91. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-C5e4JFcr.js → requirementDiagram-LRYGKXZP-yXUncmn6.js} +1 -1
  92. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Cz30hc29.js → sankeyDiagram-W5VNT64P-DLeWKLak.js} +1 -1
  93. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DS33n6d0.js → sequenceDiagram-SI44F4Z6-CI3he1R3.js} +1 -1
  94. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-46w7v-9T.js → sizeCapture-X5ZJPWSS-B7jfDkS5.js} +1 -1
  95. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-pbcD5SsZ.js → stateDiagram-OKZ733FA-BmrZod7J.js} +1 -1
  96. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-D9ykKEWP.js +1 -0
  97. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DuivYBSj.js → swimlanes-SLNWSIFB-CDOlHVSY.js} +2 -2
  98. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BvPOXALT.js +8 -0
  99. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Cb9VZVIl.js → timeline-definition-Z64GVDOM-Cz-XX1gy.js} +1 -1
  100. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-D2-mfOgR.js → vennDiagram-T6HMQDX7-caV4cI8C.js} +1 -1
  101. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DeS2aC76.js → wardleyDiagram-T6FBY63Y-dImPlnIO.js} +1 -1
  102. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-WGsrFjxH.js → xychartDiagram-ELKLHX3M-CtRYVJcn.js} +1 -1
  103. package/dist/worker/console/static/index.html +2 -2
  104. package/dist/worker/console/static-src/app/useRunProgress.js +9 -2
  105. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +19 -8
  106. package/dist/worker/console/static-src/operator-chat/dag-progress-link.js +22 -0
  107. package/dist/worker/console/static-src/operator-chat/open-preview-in-browser.js +15 -7
  108. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +2 -0
  109. package/dist/worker/console/static-src/operator-chat/useChatThread.js +6 -0
  110. package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +28 -3
  111. package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +106 -0
  112. package/dist/worker/console/workspace-context.js +1 -111
  113. package/dist/worker/observability/read-model.js +4 -0
  114. package/dist/worker/observe/static/dag-node-purpose.js +0 -5
  115. package/dist/worker/observe/static/views/dag-inspector.js +2 -7
  116. package/dist/worker/observe/static/views/session-timeline.js +46 -15
  117. package/dist/workflows/dag/backend-test-result-contract.js +1 -1
  118. package/dist/workflows/dag/contract-validator-registrations.js +2 -1
  119. package/dist/workflows/dag/frontend-implementation-contract.js +162 -932
  120. package/dist/workflows/dag/frontend-plan-render.js +1 -2
  121. package/dist/workflows/dag/frontend-prewrite-gate.js +349 -255
  122. package/dist/workflows/dag/frontend-recovery-plan.js +10 -17
  123. package/dist/workflows/dag/frontend-recovery-run.js +20 -33
  124. package/dist/workflows/dag/frontend-repair.js +432 -1
  125. package/dist/workflows/dag/frontend-review-context.js +15 -261
  126. package/dist/workflows/dag/frontend-verification-trace.js +24 -249
  127. package/dist/workflows/dag/frontend-worktree-diff.js +17 -250
  128. package/dist/workflows/dag/init-hybrid.js +494 -685
  129. package/dist/workflows/dag/interrupt-request.js +0 -7
  130. package/dist/workflows/dag/node-execution.js +4 -732
  131. package/dist/workflows/dag/prompt.js +1 -34
  132. package/dist/workflows/dag/report.js +1 -37
  133. package/dist/workflows/dag/rerun-feedback.js +1 -256
  134. package/dist/workflows/dag/rerun-plan.js +2 -10
  135. package/dist/workflows/dag/rerun-run.js +0 -23
  136. package/dist/workflows/dag/rerun-task.js +0 -29
  137. package/dist/workflows/dag/retry-policy.js +104 -214
  138. package/dist/workflows/dag/runner.js +122 -429
  139. package/dist/workflows/dag/scheduler.js +16 -114
  140. package/dist/workflows/dag/types.js +12 -239
  141. package/dist/workflows/dag/validate.js +12 -28
  142. package/docs/init-surface.manifest.json +12 -30
  143. package/docs/skills/vetted-skill-registry.md +2 -4
  144. package/docs/templates/README.md +0 -2
  145. package/docs/templates/agent-dag-report.schema.json +2 -8
  146. package/docs/templates/agent-dag.schema.json +1 -1
  147. package/docs/templates/frontend-implementation-contract.schema.json +1 -4
  148. package/harness.json +3 -3
  149. package/package.json +1 -1
  150. package/skills/frontend-bounded-implement/SKILL.md +14 -15
  151. package/skills/frontend-design-review/SKILL.md +41 -22
  152. package/skills/frontend-implementation/SKILL.md +52 -0
  153. package/skills/frontend-implementation/references/code-standards.md +33 -0
  154. package/skills/frontend-implementation/references/design-spec.md +56 -0
  155. package/skills/frontend-implementation/references/node-contracts.md +31 -0
  156. package/skills/frontend-review/SKILL.md +15 -20
  157. package/skills/frontend-review/references/review-findings.md +7 -6
  158. package/skills/frontend-verification/SKILL.md +1 -1
  159. package/skills/loop-agent/references/command-reference.md +0 -1
  160. package/skills/loop-agent/references/hybrid-dag.md +2 -2
  161. package/dist/commands/dag-follow-up.js +0 -138
  162. package/dist/executors/pi-read-budget-policy.js +0 -239
  163. package/dist/worker/console/frontend-human-decision-adapter.js +0 -19
  164. package/dist/worker/console/frontend-split-operation-adapter.js +0 -20
  165. package/dist/worker/console/static/assets/channel-bnXW0U3C.js +0 -1
  166. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-rZpq_twR.js +0 -1
  167. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-rZpq_twR.js +0 -1
  168. package/dist/worker/console/static/assets/index-D3CC4eUz.css +0 -1
  169. package/dist/worker/console/static/assets/index-DLt4ZFvD.js +0 -437
  170. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-zBMYiUyi.js +0 -1
  171. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-d_rms-5i.js +0 -8
  172. package/dist/worker/console/static-src/active-run-badge.js +0 -17
  173. package/dist/worker/materialize/frontend-split-task-materializer.js +0 -72
  174. package/dist/workflows/dag/dag-retry-schema.js +0 -138
  175. package/dist/workflows/dag/frontend-closeout.js +0 -221
  176. package/dist/workflows/dag/frontend-design-policy.js +0 -400
  177. package/dist/workflows/dag/frontend-human-decision.js +0 -182
  178. package/dist/workflows/dag/frontend-provider-capability-matrix.js +0 -159
  179. package/dist/workflows/dag/frontend-read-budgets.js +0 -12
  180. package/dist/workflows/dag/frontend-recovery-capsule.js +0 -455
  181. package/dist/workflows/dag/frontend-recovery-controller.js +0 -202
  182. package/dist/workflows/dag/frontend-recovery-lineage.js +0 -178
  183. package/dist/workflows/dag/frontend-review-findings.js +0 -270
  184. package/dist/workflows/dag/frontend-shadow-dual-write.js +0 -914
  185. package/dist/workflows/dag/frontend-shape-capsule-store.js +0 -191
  186. package/dist/workflows/dag/frontend-shape-facts.js +0 -409
  187. package/dist/workflows/dag/frontend-shape.js +0 -427
  188. package/dist/workflows/dag/frontend-source-fidelity-ledger.js +0 -108
  189. package/dist/workflows/dag/frontend-split-application-service.js +0 -203
  190. package/dist/workflows/dag/frontend-split-orchestrator.js +0 -899
  191. package/dist/workflows/dag/frontend-typed-event-store.js +0 -452
  192. package/dist/workflows/dag/frontend-typed-event-transaction.js +0 -180
  193. package/dist/workflows/dag/frontend-writer-admission.js +0 -285
  194. package/dist/workflows/dag/frontend-writer-status.js +0 -256
  195. package/dist/workflows/dag/recovery-lease.js +0 -80
  196. package/docs/templates/frontend-implementation-dag.json +0 -89
  197. package/docs/templates/spec-registry.schema.json +0 -45
  198. package/skills/frontend-bounded-implement/references/code-standards.md +0 -19
  199. package/skills/frontend-contract/SKILL.md +0 -23
  200. package/skills/frontend-contract/references/contract-protocol.md +0 -34
  201. package/skills/frontend-plan/SKILL.md +0 -26
  202. package/skills/frontend-plan/references/decision-contract.md +0 -37
  203. package/skills/frontend-plan/references/design-decisions.md +0 -17
  204. package/skills/frontend-scout/SKILL.md +0 -25
  205. package/skills/frontend-scout/references/design-evidence.md +0 -16
  206. package/skills/frontend-scout/references/scout-evidence.md +0 -23
@@ -30,7 +30,7 @@ verdict/findings, and required browser, visual, manual, or knowledge evidence.
30
30
  `frontend-lint-assessment-v1` proving only pre-writer diagnostics on unchanged
31
31
  files. Report debt count, changed files, and raw evidence. Typecheck/build/test do
32
32
  not support debt.
33
- - Use design and requirement evidence referenced and hash-bound by
33
+ - Use design and requirement evidence already bound inside
34
34
  `contracts/frontend-review-context.json`. Closeout must not query connectors,
35
35
  re-open task sources, OpenSpec, AI workspace, upstream model prose, or start new
36
36
  repository research.
@@ -348,7 +348,6 @@ loop-agent dag request-interrupt --run-id <run-id> --request-id <id> --target-op
348
348
  loop-agent dag rerun --run-id <run-id> --from-node <node-id> --plan [--json] # 从节点重跑资格预检(不执行)
349
349
  loop-agent dag rerun --run-id <run-id> --from-node <node-id> --plan-hash <sha256> --request-id <key> --reason "..." [--json] # 安全子图 continuation
350
350
  loop-agent dag rerun-task --run-id <run-id> --reason "..." --request-id <key> [--profile auto] [--task-id <id>] [--json] # standalone 完整任务重跑
351
- loop-agent dag follow-up <parent-run-id> [--task-id <id>] [--execute] [--profile auto|minimal|standard|reviewed|supervised] # 将 frontend review 的 request_review_changes findings 物化为下游 frontend task;默认只创建并返回 task advance 命令
352
351
  loop-agent dag request-interrupt --run-id <run-id> --request-id <key> --target-operation-id <op-id> --reason-code <code> --reason "..." --expected-runner-pid <pid> --expected-runner-hostname <host> --expected-runner-started-at <ts> --expected-controller-fingerprint <fingerprint> # 协作式中止:经 Human Gate 登记 interrupt.json,runner 等当前节点安全收敛后再停调度,不直接 SIGKILL
353
352
  loop-agent dag reconcile-tasks --glob '<pattern>' # 仅报告的 task/run/artifact/verify drift audit
354
353
  loop-agent dag final-verification <task-id> # 生成 closeout DAG,closeout artifact 后再 final verify
@@ -16,7 +16,7 @@
16
16
 
17
17
  对于默认 `standard` 任务,生成器先读取 `source/需求.md` 中的结构化任务类型,再结合 `allowedPaths` 与 React/Next/Vue 强工程证据做确定性分类。确认是前端项目且任务不是明确后端、前后端混合、排除前端或仅文档/测试范围时,默认选择 `frontend-implementation` DAG,不依赖需求关键词。分类不会把普通后端实现路由到 `backend-test`;显式 profile、`workflowPolicy` 或 supervised quality gate 只记录治理强度,不把已识别的前端业务 workflow 换回通用模板。
18
18
 
19
- 前端专用链保留独立 contract/scout;plan 通过增量 typed `record_*` 工具提交决策账本并以唯一 `finalize_plan` 收口(无 fenced JSON 文本协议)。写授权由 `frontend-design-policy-shell`(确定性设计检查 + 物化唯一 authoritative `frontend-implementation-contract-v1`)与 `frontend-writer-admission-shell`(唯一写入授权:派生并冻结 writeSet、pre-writer baseline、admission digest,`admitted` 才放行 writer)承接;design review 与 final review 的权威终态是 committed typed tool(`approve_design|request_design_changes`、`approve_review|request_review_changes`)。实现后 `frontend-verify-shell` 合并 lint/Mock/static/behavior/trace;任何验证失败都是 terminal,物化 `frontend-verify-failure-v1` 供 recovery 路由,无同 run repair。`frontend-review-context-shell` 绑定真实 diff 与有效验证证据后再 review/closeout。拓扑按 shape 路由:Micro 7 / Small 10 / Standard-High 11 个顶层节点;Standard/High 完整主链为 `frontend-contract-pi` → `frontend-scout-pi` → `frontend-plan-pi` → `frontend-design-policy-shell` → `frontend-design-review-pi` → `frontend-writer-admission-shell` → `frontend-implement-pi` → `frontend-verify-shell` → `frontend-review-context-shell` → `frontend-review-pi` → `frontend-closeout-shell`,Small 去掉独立 `frontend-design-review-pi`,Micro 为 `frontend-contract-import-shell` → `frontend-writer-admission-shell` → `frontend-implement-pi` → `frontend-verify-shell` → `frontend-review-context-shell` → `frontend-review-pi` → `frontend-closeout-shell`。生成期 blocked Mock 只生成一个确定性阻塞节点且没有 writer。
19
+ 前端专用链保留独立 contract/scout;plan 同时选择 Mock/API 策略并输出结构化 implementation contract。design initial pass 直接使用原计划,只有 request-revision 才运行 revision/final review;small-risk 只执行一次 design review。`frontend-prewrite-gate-shell` 合并生效 verdict、REQ/BR/AC 覆盖、Mock policy 和 contract 物化,是唯一写入授权。实现后 `frontend-verify-assess-shell` 合并 Mock/static/behavior/trace/assessment;只有 `eligible=true` 才运行同 writeSet 的 repair 和 `frontend-reverify-shell`。`frontend-review-context-shell` 绑定真实 diff 与有效验证证据后再 review/closeout。standard/high-risk 为 15 个顶层节点,small-risk 为 13;绿色路径执行 11 个节点、7 次 Pi。生成期 blocked Mock 只生成一个确定性阻塞节点且没有 writer。
20
20
 
21
21
  > Backend-test Markdown-first:先由确定性环境 Shell 检查 clean env 中 Python/pytest、常见配置、conftest/fixture、test root、server entry 和 HTML renderer,失败时不消耗模型调用。随后 Pi 生成中文 README 索引与模块用例卡片并独立 Review `testcase/md/**`。第 4 节点只把前置条件、操作步骤、预期结果作为必选章节,并检查 Case ID、业务 AC、步骤/预期和占位措辞;不校验需求来源引用有效性或 Markdown sensitive-shaped 内容。pytest writer 为每次真实接口调用记录脱敏、有界的请求 method/URL/参数摘要和响应 status/body 摘要。第 6 节点只扫描每条 Case 明确映射的 pytest 脚本,同时支持模块级函数和 pytest class 方法,并把缺少请求/响应日志、递归脱敏或有界截断证据记录为 advisory。第 4/6 节点均写 PASS/FAIL findings 而不阻断后续;pytest 仍只运行一次,生成 JUnit,并把 Markdown 名称/场景/脚本映射与同一 JUnit 合成为按测试概览、质量校验、失败概览、用例执行明细和技术证据组织的中文 self-contained HTML 与 Markdown facts。最终 Pi 按固定简洁结构汇总 advisory 状态、执行事实和 L-5 结论。active 流程不要求模型生成 backend-test 业务 JSON。
22
22
 
@@ -91,7 +91,7 @@ loop-agent dag execute --dag <temp-dir>/hybrid-dag.json --init-only --canvas-pat
91
91
  - **Source binding / recovery**:新生成 DAG 在顶层冻结 `sourceBinding`(任务源相对路径、SHA-256、显式 `REQ/BR/AC`)。前端计划在存在显式编号时经过 `frontend-requirement-coverage-shell`;修订计划为 primary,只在条件分支未产生输出时 fallback 到原计划。主来源存在但缺号时仍在 writer 前 fail closed。中断后重新生成完整 DAG,不要从二手摘要拼接 impl-only DAG;v3 孤立 exclusive writer 若无 `sourceBinding` 且没有只读 planner 上游,会被 strict governance 拒绝。
92
92
  - **勿宣称 live smoke 已通过**,除非真实 `dag execute` execution 中 Pi read-only、Pi writer、显式 Cursor 或 shell node 均按 DAG 完成。
93
93
 
94
- 可复用 template:`docs/templates/agent-dag.base.json`(model 生成 DAG 的首选 base template)、`docs/templates/agent-dag.schema.json`(JSON Schema)、`docs/templates/agent-dag.supervised-implementation.json`(supervised implementation:writeSet audit、soft/hard verify、process supervisor、repair、review verdict gate)、`docs/templates/frontend-implementation-dag.json`(自包含的前端实现完整默认链:contract、scout、plan、design policy/review、writer admission、implement、verify、review context/review、closeout;不依赖 runtime builder 或其他模板,执行前替换全部 `REPLACE/WITH/...` 值)、`docs/templates/backend-test-dag.json`(后端测试专用模板)、`docs/templates/frontend-test-dag.json`(FE-test RAG:Markdown case manifest、串行 Playwright CLI case 子节点与逐 case 证据)、`docs/templates/agent-dag-process-supervisor.prompt.md`、`docs/templates/agent-dag-review-verdict.prompt.md`、`docs/templates/agent-dag-authority-surface-audit.prompt.md`(可选 authority surface verifier;authority signal 或显式 enablement 匹配时由 `dag init-hybrid` 插入)、`examples/hybrid-loop-agent-dag.json`、`docs/templates/hybrid-dag.json`。
94
+ 可复用 template:`docs/templates/agent-dag.base.json`(model 生成 DAG 的首选 base template)、`docs/templates/agent-dag.schema.json`(JSON Schema)、`docs/templates/agent-dag.supervised-implementation.json`(supervised implementation:writeSet audit、soft/hard verify、process supervisor、repair、review verdict gate)、`docs/templates/backend-test-dag.json`(后端测试专用模板)、`docs/templates/frontend-test-dag.json`(FE-test RAG:Markdown case manifest、串行 Playwright CLI case 子节点与逐 case 证据)、`docs/templates/agent-dag-process-supervisor.prompt.md`、`docs/templates/agent-dag-review-verdict.prompt.md`、`docs/templates/agent-dag-authority-surface-audit.prompt.md`(可选 authority surface verifier;authority signal 或显式 enablement 匹配时由 `dag init-hybrid` 插入)、`examples/hybrid-loop-agent-dag.json`、`docs/templates/hybrid-dag.json`。
95
95
 
96
96
  ### Supervised implementation flow(减少 operator 中途介入)
97
97
 
@@ -1,138 +0,0 @@
1
- import { mkdir } from "node:fs/promises";
2
- import path from "node:path";
3
- import { FRONTEND_REVIEW_FINDINGS_PRD_REL, readFrontendReviewFindingsPrd, } from "../workflows/dag/frontend-review-findings.js";
4
- import { locateDagRun } from "../workflows/dag/lifecycle.js";
5
- import { createTask, getTaskPaths } from "../task/runtime.js";
6
- import { importPrdDocument } from "../task/source-references.js";
7
- function parseFlagValue(rawArgs, flag) {
8
- const index = rawArgs.indexOf(flag);
9
- if (index < 0 || index + 1 >= rawArgs.length)
10
- return undefined;
11
- return rawArgs[index + 1];
12
- }
13
- export function parseDagFollowUpArgs(rawArgs) {
14
- const positional = rawArgs.filter((arg) => !arg.startsWith("-"));
15
- const parentRunId = positional[0];
16
- if (!parentRunId) {
17
- throw new Error("usage: dag follow-up <parent-run-id> [--task-id <id>] [--execute] [--profile <profile>]");
18
- }
19
- return {
20
- parentRunId,
21
- taskId: parseFlagValue(rawArgs, "--task-id"),
22
- execute: rawArgs.includes("--execute"),
23
- profile: parseFlagValue(rawArgs, "--profile"),
24
- };
25
- }
26
- export function deriveFollowUpTaskId(parentRunId) {
27
- // Deterministic, valid task id derived from the parent run id.
28
- return `${parentRunId}-followup`;
29
- }
30
- /** CLI entry: parse raw args and run the follow-up flow. */
31
- export async function runDagFollowUp(repoRoot, rawArgs) {
32
- const parsed = parseDagFollowUpArgs(rawArgs);
33
- const result = await runDagFollowUpInternal(repoRoot, parsed.parentRunId, {
34
- taskId: parsed.taskId,
35
- execute: parsed.execute,
36
- profile: parsed.profile,
37
- });
38
- console.log(JSON.stringify(result, null, 2));
39
- if (!result.ok) {
40
- process.exitCode = result.mode === "blocked" ? 2 : 1;
41
- }
42
- }
43
- export async function runDagFollowUpInternal(repoRoot, parentRunId, options = {}) {
44
- const located = await locateDagRun(repoRoot, parentRunId);
45
- if (!located) {
46
- return {
47
- ok: false,
48
- mode: "invalid",
49
- reason: `dag run not found: ${parentRunId}`,
50
- };
51
- }
52
- const prd = await readFrontendReviewFindingsPrd(located.runDir);
53
- if (!prd) {
54
- return {
55
- ok: false,
56
- mode: "invalid",
57
- reason: `no frontend review findings PRD found in run ${parentRunId} (${FRONTEND_REVIEW_FINDINGS_PRD_REL}); the review must have committed request_review_changes`,
58
- };
59
- }
60
- const taskId = options.taskId ?? deriveFollowUpTaskId(parentRunId);
61
- try {
62
- await createTask(repoRoot, taskId, `修复 review 发现(parent ${parentRunId})`);
63
- }
64
- catch (error) {
65
- return {
66
- ok: false,
67
- mode: "blocked",
68
- reason: `failed to create task ${taskId}: ${error instanceof Error ? error.message : String(error)}`,
69
- };
70
- }
71
- // Materialize the PRD draft into the task's source directory so the task
72
- // lifecycle can import it as its requirement.
73
- const prdMaterialized = path.join(getTaskPaths(repoRoot, taskId).sourceDir, "review-findings-prd.md");
74
- try {
75
- await mkdir(path.dirname(prdMaterialized), { recursive: true });
76
- await importPrdDocument({
77
- repoRoot,
78
- taskId,
79
- filePath: path.join(located.runDir, FRONTEND_REVIEW_FINDINGS_PRD_REL),
80
- name: "review-findings-prd",
81
- });
82
- }
83
- catch (error) {
84
- return {
85
- ok: false,
86
- mode: "blocked",
87
- reason: `failed to import PRD into task ${taskId}: ${error instanceof Error ? error.message : String(error)}`,
88
- };
89
- }
90
- if (!options.execute) {
91
- return {
92
- ok: true,
93
- mode: "created",
94
- taskId,
95
- prdPath: prdMaterialized,
96
- next: {
97
- kind: "advance",
98
- command: `loop-agent task advance ${taskId} --task-kind frontend-implementation --json`,
99
- },
100
- };
101
- }
102
- // Execute: advance through the frontend DAG.
103
- const { advanceTaskLifecycle } = await import("../application/task-lifecycle/advance.js");
104
- const profile = options.profile === "auto" ||
105
- options.profile === "minimal" ||
106
- options.profile === "standard" ||
107
- options.profile === "reviewed" ||
108
- options.profile === "supervised"
109
- ? options.profile
110
- : undefined;
111
- const result = await advanceTaskLifecycle({
112
- repoRoot,
113
- taskId,
114
- taskKind: "frontend-implementation",
115
- taskKindExplicit: true,
116
- ...(profile ? { profile, profileExplicit: true } : {}),
117
- observer: undefined,
118
- });
119
- const ok = result.lifecycleState === "run-succeeded" ||
120
- result.lifecycleState === "awaiting-write-set-approval";
121
- return {
122
- ok,
123
- mode: ok ? "created" : "blocked",
124
- taskId,
125
- prdPath: prdMaterialized,
126
- reason: ok
127
- ? undefined
128
- : `advance lifecycleState: ${result.lifecycleState}${result.blockers.length > 0
129
- ? `; blockers: ${result.blockers.map((b) => b.code).join(", ")}`
130
- : ""}`,
131
- next: ok
132
- ? undefined
133
- : {
134
- kind: "advance",
135
- command: `loop-agent task advance ${taskId} --task-kind frontend-implementation --json`,
136
- },
137
- };
138
- }
@@ -1,239 +0,0 @@
1
- import { access, open, readFile, stat, } from "node:fs/promises";
2
- import path from "node:path";
3
- class PiReadBudgetSoftLimitError extends Error {
4
- }
5
- class PiReadAccessDeniedError extends Error {
6
- }
7
- class PiReadBudgetGuard {
8
- budget;
9
- files = new Set();
10
- violations = [];
11
- bytes = 0;
12
- operations = 0;
13
- startedAt = Date.now();
14
- allowedReadPaths;
15
- allowedReadRoots;
16
- constructor(budget, readAccess) {
17
- this.budget = budget;
18
- this.allowedReadPaths = readAccess?.allowedReadPaths
19
- ? new Set(readAccess.allowedReadPaths.map((candidate) => path.resolve(candidate)))
20
- : undefined;
21
- this.allowedReadRoots = (readAccess?.allowedReadRoots ?? []).map((candidate) => path.resolve(candidate));
22
- }
23
- issues() {
24
- return [...this.violations];
25
- }
26
- report(message) {
27
- if (!this.violations.includes(message))
28
- this.violations.push(message);
29
- }
30
- exhaust(message) {
31
- if (this.budget.onExhaustion === "return-guidance") {
32
- throw new PiReadBudgetSoftLimitError(message);
33
- }
34
- this.report(message);
35
- throw new Error(message);
36
- }
37
- assertElapsed() {
38
- if (this.budget.maxMs === undefined)
39
- return;
40
- const elapsedMs = Date.now() - this.startedAt;
41
- if (elapsedMs > this.budget.maxMs) {
42
- const message = `read budget exhausted: ${elapsedMs}ms (budget ${this.budget.maxMs}ms)`;
43
- this.exhaust(message);
44
- }
45
- }
46
- beforeToolOperation() {
47
- this.assertElapsed();
48
- if (this.budget.maxOperations === undefined)
49
- return true;
50
- if (this.operations >= this.budget.maxOperations) {
51
- const message = `read budget exhausted: operation ${this.operations + 1} would exceed ${this.budget.maxOperations} read-only tool calls`;
52
- if (this.budget.onExhaustion === "return-guidance")
53
- return false;
54
- this.exhaust(message);
55
- }
56
- this.operations += 1;
57
- return true;
58
- }
59
- operationLimitGuidance() {
60
- return {
61
- content: [
62
- {
63
- type: "text",
64
- text: "[read limit reached: no repository data was read. Do not call discovery tools again; use injected facts, commit remaining record_* facts, then call finalize_plan exactly once.]",
65
- },
66
- ],
67
- };
68
- }
69
- readAccessGuidance() {
70
- return {
71
- content: [
72
- {
73
- type: "text",
74
- text: "[read denied: this node may read only named upstream artifacts or Scout-confirmed paths. Do not explore a new repository path; use committed facts or record an evidence gap, then finish the required terminal protocol.]",
75
- },
76
- ],
77
- };
78
- }
79
- assertReadablePath(absolutePath) {
80
- if (!this.allowedReadPaths)
81
- return;
82
- const resolved = path.resolve(absolutePath);
83
- if (this.allowedReadPaths.has(resolved))
84
- return;
85
- if (this.allowedReadRoots.some((root) => resolved === root || resolved.startsWith(`${root}${path.sep}`)))
86
- return;
87
- throw new PiReadAccessDeniedError(`read access denied: ${resolved}`);
88
- }
89
- reserveFile(absolutePath) {
90
- this.assertElapsed();
91
- if (this.files.has(absolutePath))
92
- return;
93
- if (this.files.size >= this.budget.maxFiles) {
94
- const message = `read budget exhausted: file ${absolutePath} would exceed ${this.budget.maxFiles} files`;
95
- this.exhaust(message);
96
- }
97
- this.files.add(absolutePath);
98
- }
99
- reserveBytes(bytes) {
100
- this.assertElapsed();
101
- const remaining = Math.max(0, this.budget.maxBytes - this.bytes);
102
- if (remaining === 0) {
103
- const message = `read budget exhausted: ${this.bytes} bytes (budget ${this.budget.maxBytes})`;
104
- this.exhaust(message);
105
- }
106
- const granted = Math.min(bytes, remaining);
107
- if (granted < bytes && this.budget.onExhaustion === "return-guidance") {
108
- this.exhaust(`read budget exhausted: ${bytes} requested bytes would exceed ${this.budget.maxBytes} bytes`);
109
- }
110
- this.bytes += granted;
111
- if (granted < bytes) {
112
- this.report(`read budget truncated: ${bytes} requested bytes at ${this.bytes}/${this.budget.maxBytes} bytes`);
113
- }
114
- return granted;
115
- }
116
- async readFile(absolutePath) {
117
- this.assertReadablePath(absolutePath);
118
- this.reserveFile(absolutePath);
119
- const metadata = await stat(absolutePath);
120
- const granted = this.reserveBytes(metadata.size);
121
- if (granted === metadata.size)
122
- return await readFile(absolutePath);
123
- const handle = await open(absolutePath, "r");
124
- try {
125
- const buffer = Buffer.allocUnsafe(granted);
126
- const { bytesRead } = await handle.read(buffer, 0, granted, 0);
127
- return buffer.subarray(0, bytesRead);
128
- }
129
- finally {
130
- await handle.close();
131
- }
132
- }
133
- async access(absolutePath) {
134
- this.assertReadablePath(absolutePath);
135
- this.reserveFile(absolutePath);
136
- await access(absolutePath);
137
- }
138
- limitToolResult(result) {
139
- if (!result || typeof result !== "object" || !Array.isArray(result.content)) {
140
- return result;
141
- }
142
- const content = result.content.map((item) => {
143
- if (!item || item.type !== "text" || typeof item.text !== "string") {
144
- this.report("read budget truncated: non-text tool result omitted");
145
- return {
146
- type: "text",
147
- text: "[read budget reached: non-text result omitted]",
148
- };
149
- }
150
- const granted = this.reserveBytes(Buffer.byteLength(item.text));
151
- return {
152
- ...item,
153
- text: truncateUtf8(item.text, granted),
154
- };
155
- });
156
- return { ...result, content };
157
- }
158
- }
159
- function truncateUtf8(text, maxBytes) {
160
- if (Buffer.byteLength(text) <= maxBytes)
161
- return text;
162
- const marker = "\n[read result truncated by node budget]";
163
- const markerBytes = Buffer.byteLength(marker);
164
- if (maxBytes <= markerBytes)
165
- return truncateUtf8Prefix(marker, maxBytes);
166
- const contentBudget = maxBytes - markerBytes;
167
- return `${truncateUtf8Prefix(text, contentBudget)}${marker}`;
168
- }
169
- function truncateUtf8Prefix(text, maxBytes) {
170
- let result = "";
171
- let bytes = 0;
172
- for (const codePoint of text) {
173
- const size = Buffer.byteLength(codePoint);
174
- if (bytes + size > maxBytes)
175
- break;
176
- result += codePoint;
177
- bytes += size;
178
- }
179
- return result;
180
- }
181
- function wrapTool(definition, guard, consumeResult) {
182
- return {
183
- ...definition,
184
- async execute(...args) {
185
- try {
186
- if (!guard.beforeToolOperation())
187
- return guard.operationLimitGuidance();
188
- const result = await definition.execute(...args);
189
- return consumeResult ? guard.limitToolResult(result) : result;
190
- }
191
- catch (error) {
192
- if (error instanceof PiReadBudgetSoftLimitError) {
193
- return guard.operationLimitGuidance();
194
- }
195
- if (error instanceof PiReadAccessDeniedError) {
196
- return guard.readAccessGuidance();
197
- }
198
- throw error;
199
- }
200
- },
201
- };
202
- }
203
- /**
204
- * Override Pi's built-in read-only tools with SDK definitions that meter the
205
- * content before it reaches the model. The read tool caps filesystem bytes at
206
- * the operation boundary; grep/find/ls have their returned payload clipped
207
- * before the agent receives it. This is SDK-only by design: the CLI backend
208
- * cannot inject same-name built-in overrides safely.
209
- */
210
- export async function createPiReadBudgetCustomTools(input) {
211
- const sdk = (await import("@earendil-works/pi-coding-agent"));
212
- const createReadToolDefinition = sdk.createReadToolDefinition;
213
- const createGrepToolDefinition = sdk.createGrepToolDefinition;
214
- const createFindToolDefinition = sdk.createFindToolDefinition;
215
- const createLsToolDefinition = sdk.createLsToolDefinition;
216
- if (typeof createReadToolDefinition !== "function" ||
217
- typeof createGrepToolDefinition !== "function" ||
218
- typeof createFindToolDefinition !== "function" ||
219
- typeof createLsToolDefinition !== "function") {
220
- throw new Error("pi read budget policy unavailable: SDK read/grep/find/ls tool factories missing");
221
- }
222
- const guard = new PiReadBudgetGuard(input.budget, input.readAccess);
223
- const read = wrapTool(createReadToolDefinition(input.repoRoot, {
224
- operations: {
225
- readFile: (absolutePath) => guard.readFile(absolutePath),
226
- access: (absolutePath) => guard.access(absolutePath),
227
- },
228
- }), guard, false);
229
- const grep = wrapTool(createGrepToolDefinition(input.repoRoot), guard, true);
230
- const find = wrapTool(createFindToolDefinition(input.repoRoot), guard, true);
231
- const ls = wrapTool(createLsToolDefinition(input.repoRoot), guard, true);
232
- if (read.name !== "read" ||
233
- grep.name !== "grep" ||
234
- find.name !== "find" ||
235
- ls.name !== "ls") {
236
- throw new Error("pi read budget policy unavailable: SDK tool name mismatch");
237
- }
238
- return { customTools: [read, grep, find, ls], issues: () => guard.issues() };
239
- }
@@ -1,19 +0,0 @@
1
- import { parseFrontendHumanDecisionProjection } from "../../workflows/dag/frontend-human-decision.js";
2
- /** Worker/Console persistence seam. Canonical validation and freshness remain in the workflow service. */
3
- export function createFrontendHumanDecisionAdapter(store) {
4
- return {
5
- async load(operationId) {
6
- const record = await store.get(operationId);
7
- if (!record || record.revision === undefined || !record.frontendHumanDecision)
8
- return undefined;
9
- return { revision: record.revision, projection: parseFrontendHumanDecisionProjection(record.frontendHumanDecision) };
10
- },
11
- materialize(input) {
12
- return store.materializeFrontendHumanDecision(input);
13
- },
14
- consume(input) {
15
- return store.consumeFrontendHumanDecision(input);
16
- },
17
- initializeSplit: store.initializeFrontendHumanApprovedSplit.bind(store),
18
- };
19
- }
@@ -1,20 +0,0 @@
1
- import { FrontendSplitOrchestrator, frontendSplitProjectionSchema, } from "../../workflows/dag/frontend-split-application-service.js";
2
- /** Worker/Console boundary adapter. All orchestration policy remains canonical. */
3
- export function createFrontendSplitOperationAdapter(dependencies) {
4
- const ports = {
5
- load: async (operationId) => {
6
- const record = await dependencies.store.get(operationId);
7
- return record?.frontendSplit === undefined ? undefined : frontendSplitProjectionSchema.parse(record.frontendSplit);
8
- },
9
- compareAndSwap: (input) => dependencies.store.compareAndSwapFrontendSplit(input),
10
- materialize: async (request) => {
11
- const result = await dependencies.materializer.materialize(request);
12
- return { taskId: result.taskId, operationId: result.operationId };
13
- },
14
- schedule: dependencies.schedule,
15
- auditStale: dependencies.auditStale,
16
- loadChildCloseoutFacts: (input) => dependencies.store.loadChildCloseoutFacts(input),
17
- settleAggregate: (input) => dependencies.store.settleFrontendSplitAggregate({ ...input, prepareAggregate: dependencies.prepareAggregate }),
18
- };
19
- return new FrontendSplitOrchestrator(ports);
20
- }
@@ -1 +0,0 @@
1
- import{ag as o,ah as n}from"./mermaid.core-Cxg8kX8V.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-0kkppM2j.js";import{_ as i}from"./mermaid.core-Cxg8kX8V.js";import"./chunk-5VM5RSS4-BnK6dC49.js";import"./chunk-XXDRQBXY-3iOSHdbM.js";import"./chunk-KBJHAD2P-CiVrxKHU.js";import"./chunk-2GRJ4B5K-D8K6adhU.js";import"./index-DLt4ZFvD.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-0kkppM2j.js";import{_ as i}from"./mermaid.core-Cxg8kX8V.js";import"./chunk-5VM5RSS4-BnK6dC49.js";import"./chunk-XXDRQBXY-3iOSHdbM.js";import"./chunk-KBJHAD2P-CiVrxKHU.js";import"./chunk-2GRJ4B5K-D8K6adhU.js";import"./index-DLt4ZFvD.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};