@tea-agent/loop-agent 0.40.0-next.1 → 0.40.0-next.3

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 (141) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +12 -3
  3. package/README.md +2 -2
  4. package/dist/application/task-lifecycle/advance.js +12 -0
  5. package/dist/build-stamp.json +3 -3
  6. package/dist/cli/update/runtime-activity.js +1 -29
  7. package/dist/commands/dag-rerun.js +1 -1
  8. package/dist/executors/shell-executor.js +1 -1
  9. package/dist/shared/dag-prompt-override.js +4 -5
  10. package/dist/shared/update/npm-client.js +33 -11
  11. package/dist/task/contract/apply.js +11 -1
  12. package/dist/task/contract/constants.js +2 -0
  13. package/dist/task/contract/hash.js +3 -0
  14. package/dist/task/contract/observe.js +25 -4
  15. package/dist/task/contract/paths.js +2 -1
  16. package/dist/task/contract/project.js +15 -1
  17. package/dist/task/contract/schema.js +2 -0
  18. package/dist/task/contract/transaction.js +12 -0
  19. package/dist/task/source-prepare/completeness.js +188 -0
  20. package/dist/task/source-prepare/fragment-inventory.js +474 -0
  21. package/dist/task/source-prepare/index.js +3 -0
  22. package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
  23. package/dist/task/source-prepare/ledger-review.js +214 -0
  24. package/dist/task/source-prepare/ledger.js +545 -0
  25. package/dist/task/source-prepare/prepare.js +262 -1
  26. package/dist/task/source-prepare/semantic-intake.js +19 -3
  27. package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
  28. package/dist/task/source-prepare/types.js +22 -0
  29. package/dist/worker/cli.js +12 -26
  30. package/dist/worker/console/console-handoff.js +82 -0
  31. package/dist/worker/console/console-update-and-init.js +115 -0
  32. package/dist/worker/console/console-update-runtime.js +84 -0
  33. package/dist/worker/console/draft-store.js +49 -0
  34. package/dist/worker/console/operation-store.js +1 -1
  35. package/dist/worker/console/operator-actions.js +129 -4
  36. package/dist/worker/console/operator-surface-health.js +1 -0
  37. package/dist/worker/console/prd-intake-bridge.js +13 -0
  38. package/dist/worker/console/routes.js +3 -0
  39. package/dist/worker/console/server.js +73 -5
  40. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Br92EGb7.js → abnfDiagram-N423BO3Z-CTx1TrNa.js} +1 -1
  41. package/dist/worker/console/static/assets/{arc-oulImtQq.js → arc-B4i9cVxX.js} +1 -1
  42. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-tyHc6aqO.js → architectureDiagram-T3A2C74G-BAXE8_Rl.js} +1 -1
  43. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-CY86BSpT.js → blockDiagram-VBNYF7ZC-C5Xh59at.js} +1 -1
  44. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BKKsDmNs.js → c4Diagram-5PPSVZJV-B_asOzAu.js} +1 -1
  45. package/dist/worker/console/static/assets/channel-Dj_4Moei.js +1 -0
  46. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-CXZdjl3B.js → chunk-2GRJ4B5K-wRO_iRNc.js} +1 -1
  47. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-B-aIFDQ5.js → chunk-2Q5K7J3B-ByOaSh_G.js} +1 -1
  48. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BDgAW_B2.js → chunk-5RXB4S5H-DjLzudan.js} +1 -1
  49. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-DABa4UPR.js → chunk-5VM5RSS4-JCNGkXYT.js} +1 -1
  50. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-aGbysVOx.js → chunk-6Q2QTUOP-BhrPXXMZ.js} +1 -1
  51. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-B8MSZDVs.js → chunk-GF5L2VYU-TJ5JuEBT.js} +1 -1
  52. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-CpelV73g.js → chunk-JWPE2WC7-VVthn_mD.js} +1 -1
  53. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-BE04ty3z.js → chunk-KBJHAD2P-D60-Mny4.js} +1 -1
  54. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-BUxTkaaR.js → chunk-RYQCIY6F-zXv7aVye.js} +1 -1
  55. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-CYYBVKfX.js → chunk-XXDRQBXY-By9VQoi1.js} +1 -1
  56. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C0YYAyCa.js +1 -0
  57. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C0YYAyCa.js +1 -0
  58. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CEQF_xmQ.js → cose-bilkent-JH36ORCC-C4zQLe-M.js} +1 -1
  59. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-CqpxN5IT.js → cynefin-VYW2F7L2-wh5N2ReN.js} +1 -1
  60. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-B3PzanVi.js → cynefinDiagram-MW4NZA55-Dlu5wIqs.js} +1 -1
  61. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BSUGCNx1.js → dagre-VZM6K2ZE-CrDgthc6.js} +1 -1
  62. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-CdLevU5T.js → diagram-7IWD3JNH-zN1clg27.js} +1 -1
  63. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-BjpF_Kok.js → diagram-B4RE2ZJO-BN-o7J7-.js} +1 -1
  64. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-C4I6NJny.js → diagram-LBJQPF4R-C8SuPt0d.js} +1 -1
  65. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-C8hecCr5.js → diagram-Q27KOJAE-BoizuHbZ.js} +1 -1
  66. package/dist/worker/console/static/assets/{diagram-UB23O5K3-Daod6tOS.js → diagram-UB23O5K3-BzUzXixG.js} +1 -1
  67. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BvvmazGv.js → ebnfDiagram-BXEA7PRR-Ev3lA4Cf.js} +1 -1
  68. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DeN_vfV4.js → erDiagram-JOGREHBK-GALUzRbs.js} +1 -1
  69. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-D6dq1t9z.js → flowDiagram-UKHOOZJN-CZJN65Sb.js} +1 -1
  70. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-DziIdNY4.js → ganttDiagram-PKOTCBZU-JLB9OESl.js} +1 -1
  71. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Dy4s5CXr.js → gitGraphDiagram-DS77QQ5N-CcvCr4GD.js} +1 -1
  72. package/dist/worker/console/static/assets/{index-Ci8ksvBm.js → index-CW88Fjbw.js} +81 -81
  73. package/dist/worker/console/static/assets/index-DP0ZJl39.css +1 -0
  74. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-Czv5eYx2.js → infoDiagram-6WML65LV-HG5z7aVg.js} +1 -1
  75. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-Bsk3nFRT.js → ishikawaDiagram-WSZJBQD7-BHEu9chR.js} +1 -1
  76. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DxGmNj5K.js → journeyDiagram-NVQOT4AX-Cp_Up8-a.js} +1 -1
  77. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CYCFqkO_.js → kanban-definition-27J2QSJJ-DvVeY-em.js} +1 -1
  78. package/dist/worker/console/static/assets/{linear-B0YzRwrd.js → linear-aGmcjgTn.js} +1 -1
  79. package/dist/worker/console/static/assets/{mermaid.core-t3EZtIGh.js → mermaid.core-Biyo-tqA.js} +5 -5
  80. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-BTXpTv0T.js → mindmap-definition-FAOFIHXS-DyxY2pIb.js} +1 -1
  81. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DU8UkKqA.js → pegDiagram-VL7TDLO6-CkdGuc50.js} +1 -1
  82. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DP4y8ohp.js → pieDiagram-7S7Q4E2Y-NNQI9xVR.js} +1 -1
  83. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-B07vNaYR.js → quadrantDiagram-CIZ2JOQS-PAJkuz_G.js} +1 -1
  84. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-xDWktb2i.js → railroadDiagram-AXF67PYL-ZwrQod0O.js} +1 -1
  85. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BLNMKqeS.js → requirementDiagram-LRYGKXZP-D3ZfrzM2.js} +1 -1
  86. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-n0adalxH.js → sankeyDiagram-W5VNT64P-DDGFmWk5.js} +1 -1
  87. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-BbnS-2DL.js → sequenceDiagram-SI44F4Z6-DO6mmXTA.js} +1 -1
  88. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-B4uPpCLu.js → sizeCapture-X5ZJPWSS-DMbCQiJt.js} +1 -1
  89. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA--MMbB0fX.js → stateDiagram-OKZ733FA-Di_YUEfC.js} +1 -1
  90. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DrdDvela.js +1 -0
  91. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-BXUgp2QY.js → swimlanes-SLNWSIFB-Bn2PphNJ.js} +2 -2
  92. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DPkEAULl.js +8 -0
  93. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CsaMxki7.js → timeline-definition-Z64GVDOM-DPh8pRsp.js} +1 -1
  94. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-C2IuG9iH.js → vennDiagram-T6HMQDX7-GMfl26pW.js} +1 -1
  95. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-CmEWOXCW.js → wardleyDiagram-T6FBY63Y-DTlmVrmF.js} +1 -1
  96. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-D_9LE0MG.js → xychartDiagram-ELKLHX3M-YGBjKAS5.js} +1 -1
  97. package/dist/worker/console/static/index.html +2 -2
  98. package/dist/worker/console/static-src/app/console-types.js +40 -1
  99. package/dist/worker/console/static-src/app/useOperatorActions.js +5 -0
  100. package/dist/worker/console/static-src/app/useTaskWizard.js +73 -1
  101. package/dist/worker/observability/init-runtime-activity.js +26 -0
  102. package/dist/worker/observe/node-input.js +88 -2
  103. package/dist/worker/observe/routes.js +188 -0
  104. package/dist/worker/observe/static/api.js +3 -3
  105. package/dist/worker/observe/static/dag-node-purpose.d.ts +6 -0
  106. package/dist/worker/observe/static/dag-node-purpose.js +203 -0
  107. package/dist/worker/observe/static/format.js +37 -0
  108. package/dist/worker/observe/static/index.html +5 -0
  109. package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
  110. package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
  111. package/dist/worker/observe/static/state.js +2 -2
  112. package/dist/worker/observe/static/styles.css +338 -35
  113. package/dist/worker/observe/static/views/dag-graph.js +4 -2
  114. package/dist/worker/observe/static/views/dag-inspector.js +531 -78
  115. package/dist/worker/observe/static/views/dag.d.ts +13 -0
  116. package/dist/worker/observe/static/views/dag.js +4 -3
  117. package/dist/worker/observe/static/views/task.js +55 -0
  118. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +29 -1
  119. package/dist/workflows/dag/backend-test-markdown-workflow.js +176 -1
  120. package/dist/workflows/dag/backend-test-pytest-collection.js +87 -4
  121. package/dist/workflows/dag/backend-test-writer-completeness.js +10 -5
  122. package/dist/workflows/dag/frontend-implementation-contract.js +88 -2
  123. package/dist/workflows/dag/frontend-plan-render.js +24 -0
  124. package/dist/workflows/dag/frontend-prewrite-gate.js +197 -0
  125. package/dist/workflows/dag/frontend-review-context.js +92 -10
  126. package/dist/workflows/dag/init-hybrid.js +125 -4
  127. package/dist/workflows/dag/node-execution.js +45 -0
  128. package/dist/workflows/dag/types.js +42 -11
  129. package/docs/README.md +1 -0
  130. package/docs/architecture/evolution.md +45 -0
  131. package/docs/init-surface.manifest.json +1 -0
  132. package/docs/templates/README.md +1 -1
  133. package/docs/templates/frontend-implementation-contract.schema.json +681 -24
  134. package/package.json +1 -1
  135. package/skills/loop-agent/references/hybrid-dag.md +7 -0
  136. package/dist/worker/console/static/assets/channel-TY36zt-i.js +0 -1
  137. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Dk7QCChM.js +0 -1
  138. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Dk7QCChM.js +0 -1
  139. package/dist/worker/console/static/assets/index-C3GgHg-g.css +0 -1
  140. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BqOigMQ4.js +0 -1
  141. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Caxz9UA2.js +0 -8
@@ -0,0 +1,36 @@
1
+ export function buildPromptRestartCandidateOptions(
2
+ frozenPrompt,
3
+ failedCandidates,
4
+ ) {
5
+ const options = [
6
+ {
7
+ key: "frozen",
8
+ label: "冻结原始提示词",
9
+ prompt: String(frozenPrompt ?? ""),
10
+ truncated: false,
11
+ },
12
+ ];
13
+ const seen = new Set();
14
+ for (const candidate of [...(failedCandidates ?? [])].sort(
15
+ (a, b) => Number(a?.attempt ?? 0) - Number(b?.attempt ?? 0),
16
+ )) {
17
+ const attempt = Number(candidate?.attempt);
18
+ if (!Number.isSafeInteger(attempt) || attempt < 1 || seen.has(attempt)) {
19
+ continue;
20
+ }
21
+ if (typeof candidate?.prompt !== "string") continue;
22
+ seen.add(attempt);
23
+ const failureCategory =
24
+ typeof candidate.failureCategory === "string" &&
25
+ candidate.failureCategory.trim()
26
+ ? candidate.failureCategory.trim()
27
+ : "unknown";
28
+ options.push({
29
+ key: `attempt-${attempt}`,
30
+ label: `第 ${attempt} 次失败 · ${failureCategory}`,
31
+ prompt: candidate.prompt,
32
+ truncated: candidate.truncated === true,
33
+ });
34
+ }
35
+ return options;
36
+ }
@@ -82,8 +82,8 @@ export const uiState = {
82
82
  dagNodeExecutionOutputLoading: false,
83
83
  dagNodeExecutionOutputError: null,
84
84
  dagNodeExecutionOutputKey: null,
85
- /** When true,「执行过程」展开 message_start/end 原始协议事件。默认展开,用户可点选隐藏。 */
86
- sessionTimelineShowProtocol: true,
85
+ /** When true,「执行过程」展开 message_start/end 原始协议事件。默认隐藏,用户可点选展开。 */
86
+ sessionTimelineShowProtocol: false,
87
87
  /** Open <details> keys restored across timeline re-renders. */
88
88
  sessionTimelineOpenDetails: null,
89
89
  lastSnapshot: null,
@@ -1222,6 +1222,13 @@ body.is-resizing-dag-graph {
1222
1222
  font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
1223
1223
  overflow-wrap: anywhere;
1224
1224
  }
1225
+ .dag-inspector-purpose {
1226
+ margin: 0;
1227
+ color: var(--muted);
1228
+ font-size: 12px;
1229
+ line-height: 1.45;
1230
+ overflow-wrap: anywhere;
1231
+ }
1225
1232
  .dag-inspector-controls {
1226
1233
  display: inline-flex;
1227
1234
  align-items: center;
@@ -3570,71 +3577,367 @@ button.copy-command:focus-visible {
3570
3577
  }
3571
3578
 
3572
3579
  /* Experimental prompt-override rerun tab (only rendered with the mutation token). */
3580
+ #dag-inspector-panel-prompt-restart {
3581
+ display: flex;
3582
+ flex-direction: column;
3583
+ }
3584
+ .prompt-restart-panel,
3573
3585
  .prompt-restart-box {
3574
3586
  display: flex;
3575
3587
  flex-direction: column;
3576
- gap: 0.75rem;
3577
- padding: 0.5rem 0.25rem;
3588
+ gap: var(--space-3);
3589
+ min-width: 0;
3590
+ flex: 1;
3591
+ }
3592
+ .prompt-restart-toolbar {
3593
+ display: grid;
3594
+ grid-template-columns: minmax(0, 1fr) auto;
3595
+ gap: var(--space-3);
3596
+ align-items: start;
3597
+ }
3598
+ .prompt-restart-mode-field {
3599
+ min-width: 12.5rem;
3600
+ }
3601
+ .prompt-restart-banner {
3602
+ display: flex;
3603
+ flex-wrap: wrap;
3604
+ align-items: center;
3605
+ gap: 6px 10px;
3606
+ padding: 10px 12px;
3607
+ border: 1px solid var(--hairline);
3608
+ border-radius: var(--radius-lg);
3609
+ background: var(--canvas-soft);
3610
+ }
3611
+ .prompt-restart-banner.is-edit {
3612
+ border-color: color-mix(in srgb, var(--orange) 28%, var(--hairline));
3613
+ background: color-mix(in srgb, var(--orange-soft) 55%, var(--surface));
3614
+ }
3615
+ .prompt-restart-banner-kicker {
3616
+ width: fit-content;
3617
+ padding: 2px 8px;
3618
+ border-radius: var(--radius-pill);
3619
+ background: var(--surface-muted);
3620
+ color: var(--muted);
3621
+ font-size: 11px;
3622
+ font-weight: 700;
3623
+ letter-spacing: 0.02em;
3624
+ }
3625
+ .prompt-restart-banner.is-edit .prompt-restart-banner-kicker {
3626
+ background: var(--orange-soft);
3627
+ color: var(--orange-active);
3628
+ }
3629
+ .prompt-restart-banner-title,
3630
+ .prompt-restart-banner-body {
3631
+ margin: 0;
3632
+ }
3633
+ .prompt-restart-banner-title {
3634
+ color: var(--ink);
3635
+ font-size: 13px;
3636
+ font-weight: 700;
3637
+ line-height: 1.35;
3638
+ }
3639
+ .prompt-restart-banner-body {
3640
+ flex-basis: 100%;
3641
+ color: var(--body);
3642
+ font-size: 12px;
3643
+ line-height: 1.5;
3578
3644
  }
3579
3645
  .prompt-restart-field {
3580
3646
  display: flex;
3581
3647
  flex-direction: column;
3582
- gap: 0.35rem;
3648
+ gap: 6px;
3649
+ min-width: 0;
3650
+ }
3651
+ .prompt-restart-field.is-hidden,
3652
+ .prompt-restart-prompt-card.is-hidden {
3653
+ display: none;
3654
+ }
3655
+ .prompt-restart-label {
3656
+ color: var(--ink);
3657
+ font-size: 12px;
3658
+ font-weight: 700;
3659
+ letter-spacing: 0.01em;
3660
+ }
3661
+ .prompt-restart-hint {
3662
+ margin: 0;
3663
+ color: var(--muted);
3664
+ font-size: 12px;
3665
+ line-height: 1.45;
3666
+ }
3667
+ .prompt-restart-candidate-select {
3668
+ display: block;
3669
+ width: 100%;
3670
+ min-width: 0;
3671
+ }
3672
+ .prompt-restart-candidate-select .custom-select-trigger {
3673
+ width: 100%;
3674
+ }
3675
+ .prompt-restart-candidate-select .custom-select-menu {
3676
+ z-index: 6;
3677
+ }
3678
+ .prompt-restart-mode-switch {
3679
+ display: flex;
3680
+ width: fit-content;
3681
+ max-width: 100%;
3682
+ gap: 4px;
3683
+ padding: 4px;
3684
+ border: 1px solid var(--hairline);
3685
+ border-radius: var(--radius-pill);
3686
+ background: var(--surface);
3687
+ }
3688
+ #dag-inspector-panel-prompt-restart button.prompt-restart-mode-option,
3689
+ .prompt-restart-mode-option {
3690
+ appearance: none;
3691
+ display: inline-flex;
3692
+ align-items: center;
3693
+ justify-content: center;
3694
+ flex: 0 0 auto;
3695
+ width: auto;
3696
+ min-height: 30px;
3697
+ height: 30px;
3698
+ padding: 0 12px;
3699
+ border: 1px solid transparent;
3700
+ border-radius: var(--radius-pill);
3701
+ background: transparent;
3702
+ color: var(--muted);
3703
+ font-size: 12px;
3704
+ font-weight: 700;
3705
+ line-height: 1;
3706
+ letter-spacing: 0;
3707
+ white-space: nowrap;
3708
+ box-shadow: none;
3709
+ transform: none;
3710
+ cursor: pointer;
3711
+ }
3712
+ #dag-inspector-panel-prompt-restart button.prompt-restart-mode-option:hover,
3713
+ #dag-inspector-panel-prompt-restart button.prompt-restart-mode-option:focus-visible,
3714
+ .prompt-restart-mode-option:hover,
3715
+ .prompt-restart-mode-option:focus-visible {
3716
+ color: var(--ink);
3717
+ background: var(--surface-muted);
3718
+ border-color: transparent;
3719
+ outline: none;
3720
+ box-shadow: none;
3721
+ transform: none;
3722
+ }
3723
+ #dag-inspector-panel-prompt-restart button.prompt-restart-mode-option.is-selected,
3724
+ .prompt-restart-mode-option.is-selected {
3725
+ background: var(--ink);
3726
+ color: #fff;
3727
+ border-color: transparent;
3728
+ }
3729
+ .prompt-restart-prompt-card {
3730
+ display: flex;
3731
+ flex-direction: column;
3732
+ min-width: 0;
3733
+ overflow: hidden;
3734
+ border: 1px solid var(--hairline);
3735
+ border-radius: var(--radius-lg);
3736
+ background: var(--surface);
3737
+ }
3738
+ .prompt-restart-prompt-head {
3739
+ display: flex;
3740
+ align-items: flex-start;
3741
+ justify-content: space-between;
3742
+ gap: var(--space-3);
3743
+ padding: 10px 12px;
3744
+ border-bottom: 1px solid var(--hairline);
3745
+ background: var(--canvas-soft);
3746
+ }
3747
+ .prompt-restart-prompt-titles {
3748
+ display: flex;
3749
+ flex-wrap: wrap;
3750
+ align-items: center;
3751
+ gap: 6px 8px;
3752
+ min-width: 0;
3753
+ }
3754
+ .prompt-restart-prompt-title {
3755
+ color: var(--ink);
3756
+ font-size: 13px;
3757
+ font-weight: 700;
3758
+ line-height: 1.3;
3759
+ }
3760
+ .prompt-restart-prompt-badge {
3761
+ padding: 2px 8px;
3762
+ border-radius: var(--radius-pill);
3763
+ background: var(--surface-muted);
3764
+ color: var(--muted);
3765
+ font-size: 11px;
3766
+ font-weight: 700;
3767
+ }
3768
+ .prompt-restart-prompt-meta {
3769
+ flex-basis: 100%;
3770
+ color: var(--muted);
3771
+ font-size: 11px;
3772
+ line-height: 1.3;
3773
+ }
3774
+ .prompt-restart-copy-icon {
3775
+ flex: 0 0 auto;
3776
+ margin-top: 1px;
3777
+ }
3778
+ .prompt-restart-prompt-actions {
3779
+ display: flex;
3780
+ align-items: center;
3781
+ gap: 6px;
3782
+ flex: 0 0 auto;
3783
+ }
3784
+ #dag-inspector-panel-prompt-restart button.prompt-restart-prompt-fold,
3785
+ .prompt-restart-prompt-fold {
3786
+ appearance: none;
3787
+ display: inline-flex;
3788
+ align-items: center;
3789
+ justify-content: center;
3790
+ min-height: 30px;
3791
+ height: 30px;
3792
+ padding: 0 10px;
3793
+ border: 1px solid var(--hairline);
3794
+ border-radius: var(--radius-pill);
3795
+ background: var(--surface);
3796
+ color: var(--body);
3797
+ font-size: 12px;
3798
+ font-weight: 700;
3799
+ line-height: 1;
3800
+ box-shadow: none;
3801
+ transform: none;
3802
+ cursor: pointer;
3803
+ }
3804
+ #dag-inspector-panel-prompt-restart button.prompt-restart-prompt-fold:hover,
3805
+ .prompt-restart-prompt-fold:hover {
3806
+ border-color: var(--hairline-strong);
3807
+ background: var(--surface-muted);
3808
+ color: var(--ink);
3809
+ transform: none;
3810
+ }
3811
+ .prompt-restart-prompt-card.is-collapsed .prompt-restart-readonly {
3812
+ display: none;
3813
+ }
3814
+ .prompt-restart-readonly {
3815
+ margin: 0;
3816
+ padding: 14px 16px;
3817
+ max-height: min(36vh, 18rem);
3818
+ overflow: auto;
3819
+ background: var(--canvas-soft);
3820
+ color: var(--ink);
3821
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
3822
+ font-size: 12px;
3823
+ line-height: 1.65;
3824
+ white-space: pre-wrap;
3825
+ overflow-wrap: anywhere;
3826
+ tab-size: 2;
3583
3827
  }
3584
3828
  .prompt-restart-textarea {
3585
3829
  width: 100%;
3586
3830
  min-height: 8rem;
3587
3831
  resize: vertical;
3588
3832
  box-sizing: border-box;
3589
- font-family: var(--mono-font, ui-monospace, SFMono-Regular, Menlo, monospace);
3590
- font-size: 12.5px;
3591
- line-height: 1.5;
3592
- white-space: pre;
3593
- overflow-wrap: normal;
3833
+ padding: 12px 14px;
3834
+ border: 1px solid var(--hairline);
3835
+ border-radius: var(--radius-lg);
3836
+ background: var(--canvas-soft);
3837
+ color: var(--ink);
3838
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
3839
+ font-size: 12px;
3840
+ line-height: 1.65;
3841
+ white-space: pre-wrap;
3842
+ overflow-wrap: anywhere;
3594
3843
  overflow-x: auto;
3595
3844
  }
3596
- .prompt-restart-actions {
3845
+ .prompt-restart-textarea-work {
3846
+ min-height: 10rem;
3847
+ }
3848
+ .prompt-restart-textarea:hover {
3849
+ border-color: var(--hairline-strong);
3850
+ }
3851
+ .prompt-restart-textarea:focus-visible {
3852
+ outline: 2px solid color-mix(in srgb, var(--orange) 55%, transparent);
3853
+ outline-offset: 1px;
3854
+ border-color: color-mix(in srgb, var(--orange) 35%, var(--hairline));
3855
+ }
3856
+ .prompt-restart-textarea-compact {
3857
+ min-height: 4.5rem;
3858
+ }
3859
+ .prompt-restart-actions,
3860
+ .prompt-restart-footer {
3597
3861
  display: flex;
3598
- gap: 0.5rem;
3862
+ flex-wrap: wrap;
3863
+ gap: var(--space-2);
3599
3864
  align-items: center;
3865
+ justify-content: flex-end;
3600
3866
  }
3867
+ .prompt-restart-footer {
3868
+ position: sticky;
3869
+ bottom: calc(-1 * var(--space-4));
3870
+ z-index: 2;
3871
+ margin-top: auto;
3872
+ padding: 10px 0 2px;
3873
+ border-top: 1px solid var(--hairline);
3874
+ background: var(--surface);
3875
+ }
3876
+ .prompt-restart-footer .prompt-restart-status {
3877
+ flex: 1 1 12rem;
3878
+ min-width: 0;
3879
+ margin-right: auto;
3880
+ }
3881
+ #dag-inspector-panel-prompt-restart button.prompt-restart-submit,
3601
3882
  .prompt-restart-submit {
3602
- padding: 0.35rem 0.9rem;
3603
- font-size: 13.5px;
3883
+ appearance: none;
3884
+ display: inline-flex;
3885
+ align-items: center;
3886
+ justify-content: center;
3887
+ min-height: 34px;
3888
+ height: 34px;
3889
+ padding: 0 16px;
3890
+ border: 1px solid var(--orange);
3891
+ border-radius: var(--radius-pill);
3892
+ background: var(--orange);
3893
+ color: #fff;
3894
+ font-size: 13px;
3895
+ font-weight: 700;
3896
+ line-height: 1;
3897
+ letter-spacing: 0.01em;
3898
+ box-shadow: none;
3899
+ transform: none;
3604
3900
  cursor: pointer;
3605
3901
  }
3902
+ #dag-inspector-panel-prompt-restart button.prompt-restart-submit:hover,
3903
+ #dag-inspector-panel-prompt-restart button.prompt-restart-submit:focus-visible,
3904
+ .prompt-restart-submit:hover,
3905
+ .prompt-restart-submit:focus-visible {
3906
+ background: var(--orange-active);
3907
+ border-color: var(--orange-active);
3908
+ color: #fff;
3909
+ outline: none;
3910
+ box-shadow: none;
3911
+ transform: none;
3912
+ }
3913
+ #dag-inspector-panel-prompt-restart button.prompt-restart-submit.is-secondary,
3914
+ .prompt-restart-submit.is-secondary {
3915
+ border-color: var(--hairline);
3916
+ background: var(--surface);
3917
+ color: var(--ink);
3918
+ }
3919
+ #dag-inspector-panel-prompt-restart button.prompt-restart-submit.is-secondary:hover,
3920
+ #dag-inspector-panel-prompt-restart button.prompt-restart-submit.is-secondary:focus-visible,
3921
+ .prompt-restart-submit.is-secondary:hover,
3922
+ .prompt-restart-submit.is-secondary:focus-visible {
3923
+ border-color: var(--orange);
3924
+ background: var(--orange-soft);
3925
+ color: var(--orange-active);
3926
+ }
3927
+ #dag-inspector-panel-prompt-restart button.prompt-restart-submit:disabled,
3606
3928
  .prompt-restart-submit:disabled {
3607
3929
  opacity: 0.55;
3608
3930
  cursor: wait;
3931
+ transform: none;
3609
3932
  }
3610
3933
  .prompt-restart-status {
3611
3934
  margin: 0;
3612
- font-size: 13px;
3613
3935
  min-height: 1.2em;
3936
+ color: var(--body);
3937
+ font-size: 13px;
3614
3938
  white-space: pre-wrap;
3615
3939
  word-break: break-word;
3616
3940
  }
3617
3941
  .prompt-restart-status.prompt-restart-error {
3618
- color: var(--red, #c0392b);
3619
- }
3620
- .prompt-restart-readonly {
3621
- margin: 0;
3622
- padding: 0.5rem 0.6rem;
3623
- font-family: var(--mono-font, ui-monospace, SFMono-Regular, Menlo, monospace);
3624
- font-size: 12.5px;
3625
- line-height: 1.5;
3626
- white-space: pre;
3627
- overflow: auto;
3628
- border: 1px solid var(--border-color, rgba(125, 125, 125, 0.35));
3629
- border-radius: 6px;
3630
- max-height: 60vh;
3631
- }
3632
- .prompt-restart-mode {
3633
- display: flex;
3634
- align-items: center;
3635
- gap: 0.5rem;
3636
- }
3637
- .prompt-restart-mode-select {
3638
- max-width: 100%;
3639
- font-size: 13px;
3942
+ color: var(--red);
3640
3943
  }
@@ -22,6 +22,7 @@ import {
22
22
  setDagGraphViewMode,
23
23
  currentDagGraphViewMode,
24
24
  } from "../state.js";
25
+ import { describeDagNodePurpose } from "../dag-node-purpose.js";
25
26
  import { selectDagNode } from "./dag-inspector.js";
26
27
  import { renderTrajectoryStoryboard } from "./dag-trajectory.js";
27
28
 
@@ -335,12 +336,13 @@ export function renderDagGraph(dag, dagRunId, existingWrap = null) {
335
336
  const statusLine = `${statusSymbol(status)} ${statusLabel(node.status)} · ${formatMs(node.durationMs)}`;
336
337
  // 节点宽 216、左右 padding≈14:按显示列宽截断(CJK 双宽)。
337
338
  const maxDisplayWidth = Math.max(10, Math.floor((position.width - 28) / 7));
339
+ const purpose = describeDagNodePurpose(node.nodeId, node);
338
340
  const group = svgEl("g", {
339
341
  transform: `translate(${position.x} ${position.y})`,
340
342
  class: `dag-graph-node status-${status}${node.nodeId === uiState.selectedDagNodeId ? " selected" : ""}${uiState.selectedDagNodeId && !related.has(node.nodeId) ? " dag-dimmed" : ""}`,
341
343
  tabindex: 0,
342
344
  role: "button",
343
- "aria-label": `${node.nodeId},状态 ${status}${historyLabel ? `,执行历史 ${historyLabel}` : ""}`,
345
+ "aria-label": `${node.nodeId},${purpose ? `${purpose},` : ""}状态 ${status}${historyLabel ? `,执行历史 ${historyLabel}` : ""}`,
344
346
  });
345
347
  group.appendChild(
346
348
  svgEl("rect", { width: position.width, height: position.height, rx: 10 }),
@@ -352,7 +354,7 @@ export function renderDagGraph(dag, dagRunId, existingWrap = null) {
352
354
  : "";
353
355
  const attemptHint =
354
356
  node.attemptCount > 0 ? `\nattempts: ${node.attemptCount}` : "";
355
- title.textContent = `${node.nodeId}\n${node.executor ?? "未知执行器"}\n${status}${historyLabel ? `\n执行历史:${historyLabel}` : ""}${passHint}${attemptHint}`;
357
+ title.textContent = `${node.nodeId}${purpose ? `\n${purpose}` : ""}\n${node.executor ?? "未知执行器"}\n${status}${historyLabel ? `\n执行历史:${historyLabel}` : ""}${passHint}${attemptHint}`;
356
358
  group.appendChild(title);
357
359
  const label = svgEl("text", {
358
360
  x: 14,