dsh-client-auto-continue 0.10.2 → 0.11.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.
@@ -0,0 +1,530 @@
1
+ <svg viewBox="0 0 892 534" role="img" lang="zh-CN" aria-labelledby="archify-diagram-title archify-diagram-description" data-animation="trace" data-preset="signal-flow" data-quality-profile="showcase" style="" width="892" height="534" xmlns="http://www.w3.org/2000/svg"><style>@font-face { font-family: 'JetBrains Mono'; font-weight: 400; src: local('JetBrains Mono'), local('JetBrainsMono-Regular'); }
2
+ @font-face { font-family: 'JetBrains Mono'; font-weight: 500; src: local('JetBrains Mono'), local('JetBrainsMono-Regular'); }
3
+ @font-face { font-family: 'JetBrains Mono'; font-weight: 600; src: local('JetBrains Mono'), local('JetBrainsMono-Regular'); }
4
+ @font-face { font-family: 'JetBrains Mono'; font-weight: 700; src: local('JetBrains Mono'), local('JetBrainsMono-Regular'); }
5
+ svg { font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, 'DejaVu Sans Mono', 'Liberation Mono', 'Noto Sans Mono CJK SC', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', monospace; }
6
+ :root, [data-theme="dark"] { --bg: #020617; --grid: #1e293b; --text: #ffffff; --text-muted: #94a3b8; --text-dim: #475569; --text-faint: #7d8da1; --panel: rgba(15, 23, 42, 0.5); --panel-border: #1e293b; --lane-fill: rgba(15, 23, 42, 0.22); --lane-stroke: #334155; --arrow: #64748b; --arrow-emphasis: #34d399; --mask: #0f172a; --frontend-fill: rgba(8, 51, 68, 0.4); --frontend-stroke: #22d3ee; --backend-fill: rgba(6, 78, 59, 0.4); --backend-stroke: #34d399; --database-fill: rgba(76, 29, 149, 0.4); --database-stroke: #a78bfa; --cloud-fill: rgba(120, 53, 15, 0.3); --cloud-stroke: #fbbf24; --security-fill: rgba(136, 19, 55, 0.4); --security-stroke: #fb7185; --messagebus-fill: rgba(251, 146, 60, 0.3); --messagebus-stroke: #fb923c; --external-fill: rgba(30, 41, 59, 0.5); --external-stroke: #94a3b8; --toolbar-bg: rgba(15, 23, 42, 0.8); --toolbar-border: #334155; --toolbar-text: #e2e8f0; --toolbar-hover: rgba(15, 23, 42, 0.95); --toolbar-menu-bg: #0f172a; }
7
+ [data-theme="light"] { --bg: #f8fafc; --grid: #e2e8f0; --text: #0f172a; --text-muted: #64748b; --text-dim: #94a3b8; --text-faint: #64748b; --panel: #ffffff; --panel-border: #e2e8f0; --lane-fill: rgba(248, 250, 252, 0.65); --lane-stroke: #cbd5e1; --arrow: #94a3b8; --arrow-emphasis: #059669; --mask: #ffffff; --frontend-fill: rgba(34, 211, 238, 0.15); --frontend-stroke: #0891b2; --backend-fill: rgba(52, 211, 153, 0.18); --backend-stroke: #059669; --database-fill: rgba(167, 139, 250, 0.2); --database-stroke: #7c3aed; --cloud-fill: rgba(251, 191, 36, 0.18); --cloud-stroke: #d97706; --security-fill: rgba(251, 113, 133, 0.15); --security-stroke: #e11d48; --messagebus-fill: rgba(251, 146, 60, 0.15); --messagebus-stroke: #ea580c; --external-fill: rgba(148, 163, 184, 0.18); --external-stroke: #64748b; --toolbar-bg: rgba(255, 255, 255, 0.92); --toolbar-border: #cbd5e1; --toolbar-text: #334155; --toolbar-hover: #ffffff; --toolbar-menu-bg: #ffffff; }
8
+ [data-preset="signal-flow"][data-theme="dark"] { --bg: #030711; --grid: #15233a; --panel: rgba(6, 14, 28, 0.78); --panel-border: #1d3350; --lane-fill: rgba(9, 22, 40, 0.5); --lane-stroke: #2c4564; --text: #f5fbff; --text-muted: #9eb0c7; --text-dim: #52667f; --text-faint: #7890ad; --mask: #07101e; --frontend-fill: rgba(6, 182, 212, 0.14); --frontend-stroke: #67e8f9; --backend-fill: rgba(16, 185, 129, 0.14); --backend-stroke: #5eead4; --database-fill: rgba(139, 92, 246, 0.16); --database-stroke: #c4b5fd; --cloud-fill: rgba(245, 158, 11, 0.13); --cloud-stroke: #fcd34d; --security-fill: rgba(244, 63, 94, 0.13); --security-stroke: #fda4af; --messagebus-fill: rgba(249, 115, 22, 0.13); --messagebus-stroke: #fdba74; --external-fill: rgba(71, 85, 105, 0.24); --external-stroke: #a5b4c7; --arrow: #7890ad; --arrow-emphasis: #2dd4bf; --toolbar-bg: rgba(7, 16, 30, 0.86); --toolbar-border: #29415f; --toolbar-menu-bg: #07101e; }
9
+ [data-preset="signal-flow"][data-theme="light"] { --bg: #f4f9fc; --grid: #d4e5ee; --panel: rgba(255, 255, 255, 0.82); --panel-border: #bfd5e2; --lane-fill: rgba(232, 243, 248, 0.62); --lane-stroke: #a9c5d5; --text: #102638; --text-muted: #587287; --text-dim: #8aa2b4; --text-faint: #668397; --mask: #ffffff; --frontend-fill: rgba(6, 182, 212, 0.09); --frontend-stroke: #0789a1; --backend-fill: rgba(5, 150, 105, 0.09); --backend-stroke: #087f69; --database-fill: rgba(124, 58, 237, 0.09); --database-stroke: #7254c7; --cloud-fill: rgba(217, 119, 6, 0.08); --cloud-stroke: #b9670b; --security-fill: rgba(225, 29, 72, 0.08); --security-stroke: #c53a59; --messagebus-fill: rgba(234, 88, 12, 0.08); --messagebus-stroke: #c65f27; --external-fill: rgba(100, 116, 139, 0.1); --external-stroke: #607a8c; --arrow: #7b97aa; --arrow-emphasis: #0d9488; }
10
+ [data-preset="blueprint"][data-theme="dark"] { --bg: #06131f; --grid: #17425a; --panel: rgba(7, 27, 43, 0.9); --panel-border: #27627f; --lane-fill: rgba(10, 43, 66, 0.36); --lane-stroke: #34799a; --text: #e3f6ff; --text-muted: #91b8ca; --text-dim: #557e92; --text-faint: #739caf; --mask: #0a2031; --frontend-fill: rgba(26, 157, 193, 0.14); --frontend-stroke: #66d9ef; --backend-fill: rgba(31, 155, 124, 0.13); --backend-stroke: #69dfbd; --database-fill: rgba(120, 105, 196, 0.14); --database-stroke: #b4a8ff; --cloud-fill: rgba(197, 145, 43, 0.13); --cloud-stroke: #ffd166; --security-fill: rgba(199, 76, 104, 0.13); --security-stroke: #ff8da1; --messagebus-fill: rgba(207, 112, 49, 0.13); --messagebus-stroke: #ffad66; --external-fill: rgba(84, 119, 139, 0.18); --external-stroke: #a7cad9; --arrow: #78a3b7; --arrow-emphasis: #64dfc1; --toolbar-bg: rgba(7, 28, 45, 0.92); --toolbar-border: #34799a; --toolbar-text: #d8f3ff; --toolbar-hover: rgba(18, 58, 83, 0.95); --toolbar-menu-bg: #0a2031; }
11
+ [data-preset="blueprint"][data-theme="light"] { --bg: #edf7fa; --grid: #b5d5e1; --panel: rgba(249, 253, 255, 0.94); --panel-border: #78aabd; --lane-fill: rgba(210, 232, 240, 0.42); --lane-stroke: #83b2c4; --text: #123344; --text-muted: #4e7486; --text-dim: #86a6b4; --text-faint: #668c9d; --mask: #f9fdff; --frontend-fill: rgba(8, 145, 178, 0.08); --frontend-stroke: #087f9c; --backend-fill: rgba(5, 128, 101, 0.08); --backend-stroke: #08755f; --database-fill: rgba(100, 75, 180, 0.08); --database-stroke: #6757a8; --cloud-fill: rgba(181, 120, 15, 0.08); --cloud-stroke: #a86609; --security-fill: rgba(190, 48, 80, 0.07); --security-stroke: #b32f50; --messagebus-fill: rgba(196, 81, 22, 0.07); --messagebus-stroke: #b65120; --external-fill: rgba(79, 112, 128, 0.08); --external-stroke: #506f7e; --arrow: #6d93a5; --arrow-emphasis: #087f69; --toolbar-bg: rgba(247, 252, 254, 0.94); --toolbar-border: #8ab5c5; --toolbar-text: #294f61; --toolbar-hover: #ffffff; --toolbar-menu-bg: #f9fdff; }
12
+ [data-preset="editorial"][data-theme="dark"] { --bg: #181611; --grid: #39342a; --panel: rgba(35, 31, 24, 0.96); --panel-border: #625a4a; --lane-fill: rgba(52, 46, 35, 0.46); --lane-stroke: #726957; --text: #f4eddf; --text-muted: #b9ae9b; --text-dim: #776e60; --text-faint: #9d917e; --mask: #231f18; --frontend-fill: rgba(43, 133, 142, 0.16); --frontend-stroke: #7fc6c7; --backend-fill: rgba(63, 132, 92, 0.16); --backend-stroke: #8fc29e; --database-fill: rgba(117, 91, 141, 0.17); --database-stroke: #c0a4d0; --cloud-fill: rgba(170, 119, 49, 0.16); --cloud-stroke: #d8ad68; --security-fill: rgba(157, 69, 65, 0.17); --security-stroke: #df9085; --messagebus-fill: rgba(174, 79, 42, 0.16); --messagebus-stroke: #df946f; --external-fill: rgba(126, 115, 96, 0.18); --external-stroke: #b8ad99; --arrow: #948978; --arrow-emphasis: #dd6b3d; --toolbar-bg: rgba(35, 31, 24, 0.92); --toolbar-border: #625a4a; --toolbar-text: #eee5d5; --toolbar-hover: #302a20; --toolbar-menu-bg: #231f18; }
13
+ [data-preset="editorial"][data-theme="light"] { --bg: #f2eee5; --grid: #d8d0c2; --panel: rgba(251, 248, 241, 0.97); --panel-border: #c4b9a6; --lane-fill: rgba(229, 221, 207, 0.42); --lane-stroke: #b8aa94; --text: #242018; --text-muted: #6f6658; --text-dim: #a09788; --text-faint: #817767; --mask: #fbf8f1; --frontend-fill: rgba(31, 117, 126, 0.09); --frontend-stroke: #287e84; --backend-fill: rgba(42, 119, 75, 0.09); --backend-stroke: #397b53; --database-fill: rgba(105, 75, 130, 0.09); --database-stroke: #765d86; --cloud-fill: rgba(157, 103, 31, 0.1); --cloud-stroke: #9a671f; --security-fill: rgba(153, 58, 52, 0.09); --security-stroke: #9e463f; --messagebus-fill: rgba(182, 70, 27, 0.09); --messagebus-stroke: #ad4b25; --external-fill: rgba(101, 91, 75, 0.09); --external-stroke: #746b5e; --arrow: #8a806f; --arrow-emphasis: #bb4c23; --toolbar-bg: rgba(251, 248, 241, 0.94); --toolbar-border: #c4b9a6; --toolbar-text: #40392f; --toolbar-hover: #fffdf8; --toolbar-menu-bg: #fbf8f1; }
14
+ svg { width: 100%; min-width: min(900px, 100%); display: block; transform-origin: 0px 0px; transition: transform 0.18s; }
15
+ @keyframes archify-lens-in {
16
+ 0% { opacity: 0; transform: translateY(5px) scale(0.985); }
17
+ 100% { opacity: 1; transform: translateY(0px) scale(1); }
18
+ }
19
+ @keyframes archify-guide-in {
20
+ 0% { opacity: 0; transform: translateY(-5px) scale(0.985); }
21
+ 100% { opacity: 1; transform: translateY(0px) scale(1); }
22
+ }
23
+ svg[data-chapter-handoff] [data-node-id][data-chapter-role="stay"] { opacity: 1; }
24
+ svg[data-chapter-handoff] [data-node-id][data-chapter-role="enter"] { opacity: 0.78; }
25
+ svg[data-chapter-handoff] [data-node-id][data-chapter-role="leave"] { opacity: 0.26; }
26
+ @keyframes archify-chapter-anchor {
27
+ 0% { opacity: 0.35; stroke-dashoffset: 8; }
28
+ 45% { opacity: 1; }
29
+ 100% { opacity: 0.72; stroke-dashoffset: 0; }
30
+ }
31
+ @keyframes archify-story-caption-in {
32
+ 0% { opacity: 0; transform: translateY(3px); }
33
+ 100% { opacity: 1; transform: translateY(0px); }
34
+ }
35
+ [data-theme="light"] #theme-icon { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cg fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round'%3E%3Ccircle cx='10' cy='10' r='3.1'/%3E%3Cpath d='M10 2.2v1.4M10 16.4v1.4M2.2 10h1.4M16.4 10h1.4M4.5 4.5l1 1M14.5 14.5l1 1M15.5 4.5l-1 1M5.5 14.5l-1 1'/%3E%3C/g%3E%3C/svg%3E"); }
36
+ [data-theme="dark"] #theme-icon { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M15.2 12.7A6.3 6.3 0 017.3 4.8a6.3 6.3 0 107.9 7.9Z' fill='none' stroke='black' stroke-width='1.7' stroke-linejoin='round'/%3E%3C/svg%3E"); }
37
+ .c-grid { stroke: var(--grid); fill: none; }
38
+ .c-mask { fill: var(--mask); stroke: none; }
39
+ .c-frontend { fill: var(--frontend-fill); stroke: var(--frontend-stroke); }
40
+ .c-backend { fill: var(--backend-fill); stroke: var(--backend-stroke); }
41
+ .c-database { fill: var(--database-fill); stroke: var(--database-stroke); }
42
+ .c-cloud { fill: var(--cloud-fill); stroke: var(--cloud-stroke); }
43
+ .c-security { fill: var(--security-fill); stroke: var(--security-stroke); }
44
+ .c-messagebus { fill: var(--messagebus-fill); stroke: var(--messagebus-stroke); }
45
+ .c-external { fill: var(--external-fill); stroke: var(--external-stroke); }
46
+ .t-primary { fill: var(--text); }
47
+ .t-muted { fill: var(--text-muted); }
48
+ .t-dim { fill: var(--text-dim); }
49
+ .t-frontend { fill: var(--frontend-stroke); }
50
+ .t-backend { fill: var(--backend-stroke); }
51
+ .t-database { fill: var(--database-stroke); }
52
+ .t-cloud { fill: var(--cloud-stroke); }
53
+ .t-security { fill: var(--security-stroke); }
54
+ .t-messagebus { fill: var(--messagebus-stroke); }
55
+ .t-external { fill: var(--external-stroke); }
56
+ svg .semantic-sigil { fill: none; stroke: currentcolor; stroke-width: 1.35; stroke-linecap: round; stroke-linejoin: round; opacity: 0.76; pointer-events: none; }
57
+ svg .semantic-sigil &gt; * { vector-effect: non-scaling-stroke; }
58
+ svg .semantic-sigil .sigil-fill { fill: currentcolor; stroke: none; }
59
+ svg .s-frontend { color: var(--frontend-stroke); }
60
+ svg .s-backend { color: var(--backend-stroke); }
61
+ svg .s-database { color: var(--database-stroke); }
62
+ svg .s-cloud { color: var(--cloud-stroke); }
63
+ svg .s-security { color: var(--security-stroke); }
64
+ svg .s-messagebus { color: var(--messagebus-stroke); }
65
+ svg .s-external { color: var(--external-stroke); }
66
+ svg .brand-mark { pointer-events: none; }
67
+ svg .brand-mark-badge { fill: rgb(255, 255, 255); stroke: none; }
68
+ svg .brand-mark-frame { fill: none; stroke: rgb(203, 213, 225); stroke-width: 0.8; vector-effect: non-scaling-stroke; }
69
+ svg .brand-mark-fallback { fill: none; stroke: rgb(71, 85, 105); stroke-width: 1.15; stroke-linecap: round; stroke-linejoin: round; }
70
+ svg[data-preset="blueprint"] .brand-mark-badge, svg[data-preset="blueprint"] .brand-mark-frame { rx: 1px; }
71
+ svg [data-detail] { transition: opacity 160ms; }
72
+ svg [data-detail-anchor] { transform-box: fill-box; transform-origin: center center; transition: transform 160ms; }
73
+ svg[data-focus-active] [data-focus-match][data-detail], svg[data-focus-active] [data-focus-match] [data-detail], svg[data-reach-active] [data-reach-match][data-detail], svg[data-reach-active] [data-reach-match] [data-detail], svg[data-lens-active] [data-lens-match][data-detail], svg[data-lens-active] [data-lens-match] [data-detail], svg[data-legend-preview-active] [data-legend-preview-match][data-detail], svg[data-legend-preview-active] [data-legend-preview-match] [data-detail], svg[data-intent-trace-active] [data-intent-trace-match][data-detail], svg[data-intent-trace-active] [data-intent-trace-match] [data-detail], svg[data-route-active] [data-route-match][data-detail], svg[data-route-active] [data-route-match] [data-detail], svg[data-story-active] [data-story-step][data-detail], svg[data-story-active] [data-story-step] [data-detail], svg[data-relationship-preview-active] [data-relationship-preview][data-detail], svg[data-relationship-preview-active] [data-relationship-preview] [data-detail], svg [data-node-id]:hover [data-detail], svg [data-node-id]:focus-visible [data-detail] { opacity: 1; pointer-events: auto; }
74
+ svg[data-focus-active] [data-focus-match] [data-detail-anchor], svg[data-reach-active] [data-reach-match] [data-detail-anchor], svg[data-lens-active] [data-lens-match] [data-detail-anchor], svg[data-legend-preview-active] [data-legend-preview-match] [data-detail-anchor], svg[data-intent-trace-active] [data-intent-trace-match] [data-detail-anchor], svg[data-route-active] [data-route-match] [data-detail-anchor], svg[data-story-active] [data-story-step] [data-detail-anchor], svg [data-node-id]:hover [data-detail-anchor], svg [data-node-id]:focus-visible [data-detail-anchor] { transform: none; }
75
+ .a-default { stroke: var(--arrow); fill: none; }
76
+ .a-emphasis { stroke: var(--arrow-emphasis); fill: none; }
77
+ .a-security { stroke: var(--security-stroke); fill: none; stroke-dasharray: 5, 5; }
78
+ .a-dashed { stroke: var(--database-stroke); fill: none; stroke-dasharray: 4, 4; }
79
+ .m-default { fill: var(--arrow); }
80
+ .m-emphasis { fill: var(--arrow-emphasis); }
81
+ .m-security { fill: var(--security-stroke); }
82
+ .m-dashed { fill: var(--database-stroke); }
83
+ svg [data-node-id] { cursor: pointer; transition: opacity 0.18s, filter 0.18s; }
84
+ svg [data-edge-from] { transition: opacity 0.18s, filter 0.18s; }
85
+ svg [data-node-id]:hover, svg [data-node-id]:focus-visible { filter: drop-shadow(0 0 7px var(--frontend-stroke)); outline: none; }
86
+ svg [data-node-id]:hover .source-evidence-beacon, svg [data-node-id]:focus-visible .source-evidence-beacon, svg [data-node-id][data-focus-selected] .source-evidence-beacon { opacity: 1; filter: drop-shadow(0 0 4px color-mix(in srgb, var(--backend-stroke) 72%, transparent)); }
87
+ svg[data-preset="signal-flow"] .source-evidence-beacon { opacity: 0.9; }
88
+ svg[data-preset="blueprint"] .source-evidence-beacon rect { rx: 0.8px; filter: none; }
89
+ svg [data-legend-kind][role="button"] { cursor: pointer; }
90
+ svg [data-legend-kind]:focus { outline: none; }
91
+ svg [data-legend-hit] { fill: transparent; stroke: transparent; stroke-width: 1.4; pointer-events: all; vector-effect: non-scaling-stroke; transition: stroke 150ms, stroke-width 150ms, filter 150ms; }
92
+ svg [data-legend-count-badge] { pointer-events: none; }
93
+ svg [data-legend-count-badge] rect { fill: var(--mask); stroke: var(--panel-border); stroke-width: 1; vector-effect: non-scaling-stroke; }
94
+ svg [data-legend-count-badge] text { fill: var(--text-muted); font-size: 8px; font-weight: 700; text-anchor: middle; }
95
+ svg [data-legend-kind][role="button"]:hover [data-legend-hit] { stroke: color-mix(in srgb, var(--database-stroke) 58%, transparent); }
96
+ svg [data-legend-kind][role="button"]:focus-visible [data-legend-hit] { stroke: var(--frontend-stroke); stroke-width: 1.8; filter: drop-shadow(0 0 3px var(--frontend-stroke)); }
97
+ svg [data-legend-kind][data-legend-selected] [data-legend-hit] { stroke: var(--database-stroke); stroke-width: 2.2; stroke-dasharray: 3, 2; }
98
+ svg [data-legend-kind][data-legend-selected] [data-legend-count-badge] rect { stroke: var(--database-stroke); stroke-width: 1.8; }
99
+ svg [data-legend-kind][data-legend-zero] { opacity: 0.44; }
100
+ svg[data-preset="signal-flow"] [data-legend-kind][data-legend-selected] [data-legend-hit] { filter: drop-shadow(0 0 4px var(--database-stroke)); }
101
+ svg[data-preset="blueprint"] [data-legend-hit], svg[data-preset="blueprint"] [data-legend-count-badge] rect { rx: 0; filter: none; }
102
+ svg[data-legend-preview-active] [data-node-id], svg[data-legend-preview-active] [data-edge-from] { opacity: 0.11; }
103
+ svg[data-legend-preview-active] [data-legend-preview-match] { opacity: 1; }
104
+ svg[data-legend-preview-active] [data-legend-preview-peer] { opacity: 0.62; }
105
+ svg[data-legend-preview-active] [data-legend-preview-selected] { filter: drop-shadow(0 0 8px var(--database-stroke)); }
106
+ svg[data-lens-active] [data-node-id], svg[data-lens-active] [data-edge-from] { opacity: 0.11; }
107
+ svg[data-lens-active] [data-lens-match] { opacity: 1; }
108
+ svg[data-lens-active] [data-lens-peer] { opacity: 0.62; }
109
+ svg[data-lens-active] [data-lens-selected] { filter: drop-shadow(0 0 10px var(--database-stroke)); }
110
+ svg[data-preset="signal-flow"] .semantic-lens-flow { stroke-width: 3.7; opacity: 1; }
111
+ svg[data-preset="signal-flow"] .semantic-lens-flow[data-direction="out"], svg[data-preset="signal-flow"] .semantic-lens-flow[data-direction="forward"] { filter: drop-shadow(0 0 6px var(--frontend-stroke)); }
112
+ svg[data-preset="signal-flow"] .semantic-lens-flow[data-direction="in"], svg[data-preset="signal-flow"] .semantic-lens-flow[data-direction="reverse"] { filter: drop-shadow(0 0 6px var(--database-stroke)); }
113
+ svg[data-preset="signal-flow"] .semantic-lens-flow[data-direction="within"] { filter: drop-shadow(0 0 6px var(--messagebus-stroke)); }
114
+ svg[data-preset="blueprint"] .semantic-lens-flow { stroke-width: 2.45; stroke-linecap: square; filter: none; opacity: 0.78; }
115
+ svg[data-focus-active] [data-node-id], svg[data-focus-active] [data-edge-from] { opacity: 0.13; }
116
+ svg[data-focus-active] [data-focus-match] { opacity: 1; }
117
+ svg[data-focus-active] [data-focus-selected] { filter: drop-shadow(0 0 10px var(--frontend-stroke)); }
118
+ svg[data-reach-active] [data-node-id], svg[data-reach-active] [data-edge-from] { opacity: 0.09; }
119
+ svg[data-reach-active] [data-reach-match] { opacity: 1; }
120
+ svg[data-reach-active="upstream"] [data-reach-origin] { filter: drop-shadow(0 0 11px var(--database-stroke)); }
121
+ svg[data-reach-active="downstream"] [data-reach-origin] { filter: drop-shadow(0 0 11px var(--backend-stroke)); }
122
+ svg[data-reach-active="upstream"] [data-edge-from][data-reach-match] { filter: drop-shadow(0 0 4px color-mix(in srgb, var(--database-stroke) 72%, transparent)); }
123
+ svg[data-reach-active="downstream"] [data-edge-from][data-reach-match] { filter: drop-shadow(0 0 4px color-mix(in srgb, var(--backend-stroke) 72%, transparent)); }
124
+ svg[data-preset="blueprint"][data-reach-active] [data-reach-origin], svg[data-preset="blueprint"][data-reach-active] [data-edge-from][data-reach-match] { filter: none; }
125
+ svg[data-preset="blueprint"] .relationship-hit-target:focus-visible .relationship-focus-rail { stroke-linecap: square; filter: none; }
126
+ svg[data-relationship-direct-active] [data-node-id], svg[data-relationship-direct-active] [data-edge-from] { opacity: 0.16; }
127
+ svg[data-relationship-direct-active] [data-relationship-preview], svg[data-relationship-direct-active] [data-relationship-preview-node] { opacity: 1; }
128
+ svg[data-focus-active]:not([data-relationship-pin-active]) .relationship-hit-rail, svg[data-story-active] .relationship-hit-rail, svg[data-route-picking] .relationship-hit-rail, svg[data-route-active] .relationship-hit-rail, svg[data-lens-active] .relationship-hit-rail, svg[data-chapter-preview] .relationship-hit-rail { pointer-events: none; }
129
+ svg[data-relationship-preview-active] [data-focus-match] { opacity: 0.18; }
130
+ svg[data-relationship-preview-active] [data-relationship-preview], svg[data-relationship-preview-active] [data-relationship-preview-node] { opacity: 1; }
131
+ svg[data-relationship-preview-active] [data-relationship-preview] { filter: drop-shadow(0 0 5px var(--arrow-emphasis)); }
132
+ svg[data-relationship-preview-active] [data-relationship-preview] path, svg[data-relationship-preview-active] path[data-relationship-preview], svg[data-relationship-preview-active] [data-relationship-preview] line, svg[data-relationship-preview-active] line[data-relationship-preview], svg[data-relationship-preview-active] [data-relationship-preview] polyline, svg[data-relationship-preview-active] polyline[data-relationship-preview] { stroke-width: 2.75; }
133
+ svg[data-relationship-preview-active] [data-relationship-preview-source] { filter: drop-shadow(0 0 7px var(--frontend-stroke)); }
134
+ svg[data-relationship-preview-active] [data-relationship-preview-target] { filter: drop-shadow(0 0 7px var(--database-stroke)); }
135
+ svg[data-preset="signal-flow"] .relationship-flow-pulse { stroke: var(--frontend-stroke); stroke-width: 3.85; filter: drop-shadow(0 0 7px var(--frontend-stroke)); }
136
+ svg[data-preset="blueprint"] .relationship-flow-pulse { stroke-width: 2.5; stroke-linecap: square; filter: none; }
137
+ svg[data-preset="editorial"] .relationship-flow-pulse { stroke: var(--arrow-emphasis); stroke-width: 2.75; filter: none; }
138
+ svg[data-preset="signal-flow"] .semantic-flow-token { filter: drop-shadow(currentcolor 0px 0px 5px); }
139
+ svg[data-preset="blueprint"] .semantic-flow-token { filter: none; }
140
+ svg[data-preset="editorial"] .semantic-flow-token { filter: none; }
141
+ svg[data-intent-trace-active] [data-node-id], svg[data-intent-trace-active] [data-edge-from] { opacity: 0.2; }
142
+ svg[data-intent-trace-active] [data-intent-trace-match] { opacity: 1; }
143
+ svg[data-intent-trace-active] [data-intent-trace-selected] { filter: drop-shadow(0 0 10px var(--frontend-stroke)); }
144
+ svg[data-preset="blueprint"] [data-intent-trace-selected], svg[data-preset="blueprint"] .intent-trace-flow { filter: none; stroke-linecap: square; }
145
+ svg[data-preset="editorial"] [data-intent-trace-selected], svg[data-preset="editorial"] .intent-trace-flow { filter: none; }
146
+ svg[data-route-picking="target"] [data-node-id] { opacity: 0.24; }
147
+ svg[data-route-picking="target"] [data-route-candidate], svg[data-route-picking="target"] [data-route-start] { opacity: 1; }
148
+ svg[data-route-picking] [data-node-id] { cursor: crosshair; }
149
+ svg[data-route-picking] [data-route-start] { filter: drop-shadow(0 0 10px var(--frontend-stroke)); }
150
+ svg[data-route-active] [data-node-id], svg[data-route-active] [data-edge-from] { opacity: 0.11; }
151
+ svg[data-route-active] [data-route-match] { opacity: 1; }
152
+ svg[data-route-active] [data-route-start] { filter: drop-shadow(0 0 11px var(--frontend-stroke)); }
153
+ svg[data-route-active] [data-route-end] { filter: drop-shadow(0 0 11px var(--security-stroke)); }
154
+ svg[data-route-active] [data-route-step]:not([data-route-start]):not([data-route-end]) { filter: drop-shadow(0 0 7px var(--backend-stroke)); }
155
+ svg[data-route-journey] [data-route-match][data-route-journey-state="past"] { opacity: 0.62; }
156
+ svg[data-route-journey] [data-route-match][data-route-journey-state="future"] { opacity: 0.34; }
157
+ svg[data-route-journey] [data-route-match][data-route-journey-state="current"] { opacity: 1; }
158
+ svg[data-route-journey] [data-node-id][data-route-journey-current] { filter: drop-shadow(0 0 10px var(--backend-stroke)); }
159
+ svg[data-route-journey] [data-edge-from][data-route-journey-current] { opacity: 1; filter: drop-shadow(0 0 6px var(--backend-stroke)); }
160
+ svg[data-preset="blueprint"] [data-route-start], svg[data-preset="blueprint"] [data-route-end], svg[data-preset="blueprint"] [data-route-step], svg[data-preset="blueprint"] .route-probe-flow { filter: none; stroke-linecap: square; }
161
+ svg[data-preset="blueprint"] .route-journey-flow { filter: none; stroke-linecap: square; }
162
+ svg[data-preset="editorial"] [data-route-start], svg[data-preset="editorial"] [data-route-end], svg[data-preset="editorial"] [data-route-step], svg[data-preset="editorial"] .route-probe-flow, svg[data-preset="editorial"] .route-journey-flow { filter: none; }
163
+ svg[data-preset="editorial"] .c-grid { stroke-dasharray: 1, 4; opacity: 0.48; }
164
+ svg[data-preset="editorial"] .c-region { fill: color-mix(in srgb, var(--cloud-fill) 48%, transparent); stroke-dasharray: 9, 4; }
165
+ svg[data-preset="editorial"] [data-node-id]:hover, svg[data-preset="editorial"] [data-node-id]:focus-visible, svg[data-preset="editorial"][data-focus-active] [data-focus-selected] { filter: drop-shadow(0 2px 2px color-mix(in srgb, var(--text) 18%, transparent)); }
166
+ svg[data-preset="blueprint"] .c-grid { stroke-dasharray: 1, 3; opacity: 0.78; }
167
+ svg[data-preset="blueprint"] .c-region { fill: color-mix(in srgb, var(--cloud-fill) 58%, transparent); stroke-dasharray: 12, 4, 2, 4; }
168
+ svg[data-preset="blueprint"] .c-security-group, svg[data-preset="blueprint"] .c-lane { stroke-dasharray: 7, 3; }
169
+ svg[data-preset="blueprint"] [data-node-id]:hover, svg[data-preset="blueprint"] [data-node-id]:focus-visible { filter: drop-shadow(0 0 3px var(--frontend-stroke)); }
170
+ svg[data-preset="blueprint"][data-focus-active] [data-focus-selected] { filter: drop-shadow(0 0 3px var(--frontend-stroke)); }
171
+ svg[data-preset="blueprint"][data-focus-active][data-reach-active] [data-focus-selected][data-reach-origin] { filter: none; }
172
+ svg[data-preset="blueprint"][data-relationship-preview-active] [data-relationship-preview], svg[data-preset="blueprint"][data-relationship-preview-active] [data-relationship-preview-source], svg[data-preset="blueprint"][data-relationship-preview-active] [data-relationship-preview-target] { filter: drop-shadow(0 0 3px var(--frontend-stroke)); }
173
+ svg[data-story-beat] [data-story-step] { opacity: 0.22; filter: saturate(0.42); transition: opacity 180ms, filter 180ms; }
174
+ svg[data-story-beat] [data-story-step][data-story-beat-state="past"] { opacity: 0.72; filter: saturate(0.82); }
175
+ svg[data-story-beat] [data-story-step][data-story-beat-state="next"] { opacity: 0.5; filter: saturate(0.66); }
176
+ svg[data-story-beat] [data-story-step][data-story-beat-state="active"] { opacity: 1; filter: drop-shadow(0 0 7px var(--frontend-stroke)); animation: 360ms cubic-bezier(0.22, 1, 0.36, 1) 0s 1 normal both running archify-story-beat-node; }
177
+ svg[data-story-beat] [data-edge-from][data-story-beat-step] { opacity: 0.16; transition: opacity 160ms; }
178
+ svg[data-story-beat] [data-edge-from][data-story-beat-step][data-story-beat-state="past"] { opacity: 0.58; }
179
+ svg[data-story-beat] [data-edge-from][data-story-beat-step][data-story-beat-state="next"] { opacity: 0.34; }
180
+ svg[data-story-beat] [data-edge-from][data-story-beat-step][data-story-beat-state="active"] { opacity: 1; }
181
+ svg[data-story-beat] .story-trail-flow { opacity: 0; transition: opacity 160ms; }
182
+ svg[data-story-beat] .story-trail-flow[data-story-beat-state="past"] { opacity: 0.34; }
183
+ svg[data-story-beat] .story-trail-flow[data-story-beat-state="next"] { opacity: 0.2; }
184
+ svg[data-story-beat] .story-trail-flow[data-story-beat-state="active"] { opacity: 0.92; }
185
+ svg[data-story-beat] .story-trail-flow[data-story-pulse="true"] { stroke-dasharray: 2, 13; stroke-dashoffset: 30; opacity: 0.92; animation: 0.78s linear 0s 1 normal both running archify-story-flow; }
186
+ svg[data-preset="blueprint"] .story-trail-flow { stroke-linecap: square; filter: none; opacity: 0.5; }
187
+ svg[data-preset="blueprint"][data-story-beat] [data-story-step][data-story-beat-state="active"] { filter: none; animation: auto ease 0s 1 normal none running none; }
188
+ svg[data-preset="editorial"] .story-trail-flow { filter: none; }
189
+ svg[data-preset="editorial"][data-story-beat] [data-story-step][data-story-beat-state="active"] { filter: drop-shadow(0 2px 2px color-mix(in srgb, var(--text) 16%, transparent)); }
190
+ svg[data-chapter-preview] [data-node-id], svg[data-chapter-preview] [data-edge-from] { opacity: 0.1 !important; filter: none !important; transition: none !important; }
191
+ svg[data-chapter-preview] .story-trail-overlay { opacity: 0.08 !important; }
192
+ svg[data-chapter-preview] [data-node-id][data-chapter-preview-role="stay"] { opacity: 0.76 !important; filter: saturate(0.7) !important; }
193
+ svg[data-chapter-preview] [data-node-id][data-chapter-preview-role="enter"] { opacity: 1 !important; filter: saturate(1.2) !important; }
194
+ svg[data-chapter-preview] [data-node-id][data-chapter-preview-role="leave"] { opacity: 0.28 !important; filter: grayscale(0.72) !important; }
195
+ svg[data-preset="blueprint"][data-chapter-preview] [data-node-id] { filter: none !important; }
196
+ .c-security-group { fill: transparent; stroke: var(--security-stroke); stroke-dasharray: 4, 4; }
197
+ .c-region { fill: rgba(251, 191, 36, 0.05); stroke: var(--cloud-stroke); stroke-dasharray: 8, 4; }
198
+ .c-lane { fill: var(--lane-fill); stroke: var(--lane-stroke); stroke-dasharray: 6, 6; }
199
+ svg[data-preset="signal-flow"][data-animation="trace"] [data-animate="edge"] { stroke-linecap: round; filter: drop-shadow(0 0 3px var(--arrow-emphasis)); animation-duration: 1.75s; }
200
+ svg[data-preset="signal-flow"][data-animation="trace"] [data-animate="node"] { animation-duration: 3.1s; }
201
+ svg[data-preset="blueprint"][data-animation="trace"] [data-animate="edge"] { stroke-linecap: square; filter: none; animation-duration: 2.15s; }
202
+ svg[data-preset="blueprint"][data-animation="trace"] [data-animate="node"] { animation-name: archify-blueprint-node-pulse; animation-duration: 3.8s; }
203
+ svg[data-preset="editorial"][data-animation="trace"] [data-animate="edge"] { filter: none; animation-duration: 2.2s; }
204
+ svg[data-preset="editorial"][data-animation="trace"] [data-animate="node"] { animation-name: archify-editorial-node-pulse; animation-duration: 3.5s; }
205
+ @keyframes archify-edge-flow {
206
+ 0% { stroke-dasharray: 10, 8; stroke-dashoffset: 54; opacity: 0.42; }
207
+ 88% { stroke-dasharray: 10, 8; stroke-dashoffset: 0; opacity: 1; }
208
+ 99.9% { stroke-dasharray: 10, 8; stroke-dashoffset: 0; opacity: 1; }
209
+ 100% { stroke-dashoffset: 0; opacity: 1; }
210
+ }
211
+ @keyframes archify-node-pulse {
212
+ 0%, 72%, 100% { filter: none; stroke-width: 1.5; }
213
+ 18%, 36% { filter: drop-shadow(0 0 8px var(--arrow-emphasis)); stroke-width: 2.4; }
214
+ }
215
+ @keyframes archify-blueprint-node-pulse {
216
+ 0%, 72%, 100% { opacity: 1; filter: none; }
217
+ 18%, 36% { opacity: 0.72; filter: drop-shadow(0 0 2px var(--frontend-stroke)); }
218
+ }
219
+ @keyframes archify-editorial-node-pulse {
220
+ 0%, 72%, 100% { opacity: 1; filter: none; }
221
+ 18%, 36% { opacity: 0.78; filter: drop-shadow(0 2px 2px color-mix(in srgb, var(--text) 18%, transparent)); }
222
+ }
223
+ @keyframes archify-signal-scan {
224
+ 0%, 18% { opacity: 1; transform: translateX(-70%); }
225
+ 70% { opacity: 1; transform: translateX(70%); }
226
+ 100% { opacity: 0; transform: translateX(70%); }
227
+ }
228
+ @keyframes archify-radar-live {
229
+ 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--backend-stroke) 52%, transparent); }
230
+ 55%, 100% { box-shadow: transparent 0px 0px 0px 0.32rem; }
231
+ }
232
+ @keyframes archify-guided-progress {
233
+ 0% { transform: scaleX(var(--guided-progress-start, 0)); }
234
+ 100% { transform: scaleX(1); }
235
+ }
236
+ @keyframes archify-story-flow {
237
+ 100% { stroke-dashoffset: 0; }
238
+ }
239
+ @keyframes archify-intent-trace-flow {
240
+ 0% { opacity: 0.28; stroke-dashoffset: 0; }
241
+ 12%, 78% { opacity: 0.94; }
242
+ 100% { opacity: 0; stroke-dashoffset: -1; }
243
+ }
244
+ @keyframes archify-route-probe-flow {
245
+ 0% { stroke-dashoffset: 0; opacity: 0.96; }
246
+ 78% { stroke-dashoffset: -1; opacity: 0.96; }
247
+ 100% { stroke-dasharray: none; stroke-dashoffset: 0; opacity: 0.58; }
248
+ }
249
+ @keyframes archify-route-journey-flow {
250
+ 0% { opacity: 0.16; stroke-dashoffset: 0; }
251
+ 14%, 76% { opacity: 1; }
252
+ 100% { opacity: 0; stroke-dashoffset: -1; }
253
+ }
254
+ @keyframes archify-semantic-lens-flow {
255
+ 0% { opacity: 0.2; stroke-dashoffset: 0; }
256
+ 12%, 78% { opacity: 0.9; }
257
+ 100% { opacity: 0; stroke-dashoffset: -1; }
258
+ }
259
+ @keyframes archify-relationship-pulse {
260
+ 0% { opacity: 0.18; stroke-dashoffset: 0; }
261
+ 10%, 76% { opacity: 0.98; }
262
+ 100% { opacity: 0; stroke-dashoffset: -1; }
263
+ }
264
+ @keyframes archify-relationship-token-life {
265
+ 0%, 7% { opacity: 0; }
266
+ 13%, 82% { opacity: 1; }
267
+ 100% { opacity: 0; }
268
+ }
269
+ @keyframes archify-story-beat-node {
270
+ 0% { opacity: 0.48; filter: saturate(0.6); }
271
+ 58% { opacity: 1; filter: drop-shadow(0 0 10px var(--frontend-stroke)); }
272
+ 100% { opacity: 1; filter: drop-shadow(0 0 7px var(--frontend-stroke)); }
273
+ }
274
+ @keyframes archify-share-cue-enter {
275
+ 0% { opacity: 0; transform: translate(-50%, -0.45rem); }
276
+ 100% { opacity: 1; transform: translate(-50%, 0px); }
277
+ }
278
+ @keyframes archify-share-cue-pulse {
279
+ 0%, 100% { opacity: 1; transform: scale(1); }
280
+ 50% { opacity: 0.48; transform: scale(0.78); }
281
+ }
282
+ :root, svg { --bg: #030711; --grid: #15233a; --text: #f5fbff; --text-muted: #9eb0c7; --text-dim: #52667f; --text-faint: #7890ad; --panel: rgba(6, 14, 28, 0.78); --panel-border: #1d3350; --lane-fill: rgba(9, 22, 40, 0.5); --lane-stroke: #2c4564; --arrow: #7890ad; --arrow-emphasis: #2dd4bf; --mask: #07101e; --frontend-fill: rgba(6, 182, 212, 0.14); --frontend-stroke: #67e8f9; --backend-fill: rgba(16, 185, 129, 0.14); --backend-stroke: #5eead4; --database-fill: rgba(139, 92, 246, 0.16); --database-stroke: #c4b5fd; --cloud-fill: rgba(245, 158, 11, 0.13); --cloud-stroke: #fcd34d; --security-fill: rgba(244, 63, 94, 0.13); --security-stroke: #fda4af; --messagebus-fill: rgba(249, 115, 22, 0.13); --messagebus-stroke: #fdba74; --external-fill: rgba(71, 85, 105, 0.24); --external-stroke: #a5b4c7; --toolbar-bg: rgba(7, 16, 30, 0.86); --toolbar-border: #29415f; --toolbar-text: #e2e8f0; --toolbar-hover: rgba(15, 23, 42, 0.95); --toolbar-menu-bg: #07101e; }
283
+ @media (prefers-color-scheme: light) { :root, svg { --bg: #f4f9fc; --grid: #d4e5ee; --text: #102638; --text-muted: #587287; --text-dim: #8aa2b4; --text-faint: #668397; --panel: rgba(255, 255, 255, 0.82); --panel-border: #bfd5e2; --lane-fill: rgba(232, 243, 248, 0.62); --lane-stroke: #a9c5d5; --arrow: #7b97aa; --arrow-emphasis: #0d9488; --mask: #ffffff; --frontend-fill: rgba(6, 182, 212, 0.09); --frontend-stroke: #0789a1; --backend-fill: rgba(5, 150, 105, 0.09); --backend-stroke: #087f69; --database-fill: rgba(124, 58, 237, 0.09); --database-stroke: #7254c7; --cloud-fill: rgba(217, 119, 6, 0.08); --cloud-stroke: #b9670b; --security-fill: rgba(225, 29, 72, 0.08); --security-stroke: #c53a59; --messagebus-fill: rgba(234, 88, 12, 0.08); --messagebus-stroke: #c65f27; --external-fill: rgba(100, 116, 139, 0.1); --external-stroke: #607a8c; --toolbar-bg: rgba(255, 255, 255, 0.92); --toolbar-border: #cbd5e1; --toolbar-text: #334155; --toolbar-hover: #ffffff; --toolbar-menu-bg: #ffffff; } }
284
+ svg[data-theme="light"] { --bg: #f4f9fc; --grid: #d4e5ee; --text: #102638; --text-muted: #587287; --text-dim: #8aa2b4; --text-faint: #668397; --panel: rgba(255, 255, 255, 0.82); --panel-border: #bfd5e2; --lane-fill: rgba(232, 243, 248, 0.62); --lane-stroke: #a9c5d5; --arrow: #7b97aa; --arrow-emphasis: #0d9488; --mask: #ffffff; --frontend-fill: rgba(6, 182, 212, 0.09); --frontend-stroke: #0789a1; --backend-fill: rgba(5, 150, 105, 0.09); --backend-stroke: #087f69; --database-fill: rgba(124, 58, 237, 0.09); --database-stroke: #7254c7; --cloud-fill: rgba(217, 119, 6, 0.08); --cloud-stroke: #b9670b; --security-fill: rgba(225, 29, 72, 0.08); --security-stroke: #c53a59; --messagebus-fill: rgba(234, 88, 12, 0.08); --messagebus-stroke: #c65f27; --external-fill: rgba(100, 116, 139, 0.1); --external-stroke: #607a8c; --toolbar-bg: rgba(255, 255, 255, 0.92); --toolbar-border: #cbd5e1; --toolbar-text: #334155; --toolbar-hover: #ffffff; --toolbar-menu-bg: #ffffff; }
285
+ svg[data-theme="dark"] { --bg: #030711; --grid: #15233a; --text: #f5fbff; --text-muted: #9eb0c7; --text-dim: #52667f; --text-faint: #7890ad; --panel: rgba(6, 14, 28, 0.78); --panel-border: #1d3350; --lane-fill: rgba(9, 22, 40, 0.5); --lane-stroke: #2c4564; --arrow: #7890ad; --arrow-emphasis: #2dd4bf; --mask: #07101e; --frontend-fill: rgba(6, 182, 212, 0.14); --frontend-stroke: #67e8f9; --backend-fill: rgba(16, 185, 129, 0.14); --backend-stroke: #5eead4; --database-fill: rgba(139, 92, 246, 0.16); --database-stroke: #c4b5fd; --cloud-fill: rgba(245, 158, 11, 0.13); --cloud-stroke: #fcd34d; --security-fill: rgba(244, 63, 94, 0.13); --security-stroke: #fda4af; --messagebus-fill: rgba(249, 115, 22, 0.13); --messagebus-stroke: #fdba74; --external-fill: rgba(71, 85, 105, 0.24); --external-stroke: #a5b4c7; --toolbar-bg: rgba(7, 16, 30, 0.86); --toolbar-border: #29415f; --toolbar-text: #e2e8f0; --toolbar-hover: rgba(15, 23, 42, 0.95); --toolbar-menu-bg: #07101e; }
286
+ rect.c-bg-rect { fill: var(--bg); }
287
+ </style><rect width="100%" height="100%" class="c-bg-rect"/>
288
+ <title id="archify-diagram-title">dsh-auto-continue 插件流程</title>
289
+ <desc id="archify-diagram-description">由 Archify 生成的工作流图。</desc>
290
+ <!-- Definitions -->
291
+ <defs>
292
+ <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
293
+ <polygon points="0 0, 10 3.5, 0 7" class="m-default"/>
294
+ </marker>
295
+ <marker id="arrowhead-emphasis" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
296
+ <polygon points="0 0, 10 3.5, 0 7" class="m-emphasis"/>
297
+ </marker>
298
+ <marker id="arrowhead-security" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
299
+ <polygon points="0 0, 10 3.5, 0 7" class="m-security"/>
300
+ </marker>
301
+ <marker id="arrowhead-dashed" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
302
+ <polygon points="0 0, 10 3.5, 0 7" class="m-dashed"/>
303
+ </marker>
304
+ <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
305
+ <path d="M 40 0 L 0 0 0 40" class="c-grid" stroke-width="0.5"/>
306
+ </pattern>
307
+ </defs>
308
+
309
+ <!-- Background Grid -->
310
+ <rect width="100%" height="100%" fill="url(#grid)"/>
311
+
312
+ <!-- Swimlanes -->
313
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-0" x="40" y="52" width="836" height="106" rx="10" class="c-lane" stroke-width="1"/>
314
+ <text x="54" y="74" class="t-dim" font-size="10" font-weight="600">01 / DSH 会话与浏览器</text>
315
+
316
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-1" x="40" y="178" width="836" height="106" rx="10" class="c-lane" stroke-width="1"/>
317
+ <text x="54" y="200" class="t-dim" font-size="10" font-weight="600">02 / AutoContinueRunner</text>
318
+
319
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="lane" data-composition-frame-id="lane-2" x="40" y="304" width="836" height="106" rx="10" class="c-lane" stroke-width="1"/>
320
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="exception-lane" data-composition-frame-id="lane-2-exception" x="46" y="310" width="824" height="94" rx="8" class="c-security-group" stroke-width="1"/>
321
+ <text x="54" y="326" class="t-security" font-size="10" font-weight="600">EX / Agent 执行与中断</text>
322
+
323
+ <!-- Phase headers -->
324
+
325
+
326
+ <!-- Workflow groups -->
327
+ <rect data-graph-role="structural-frame" data-composition-frame-kind="group" data-composition-frame-id="group-0" x="164" y="216" width="583.5999999999999" height="64" rx="9" class="c-lane" stroke-width="1"/>
328
+ <text x="174" y="214" class="t-backend" font-size="7" font-weight="600">安全恢复链</text>
329
+
330
+ <!-- Edge paths -->
331
+ <path data-edge-from="agent_cancel" data-edge-to="safety_gate" data-edge-label="aborted + loopText" data-edge-key="0" data-edge-id="e_cancel_gate" data-composition-points="260,372;362.4,372;362.4,272" d="M 260 372 L 362.4 372 L 362.4 272" class="a-security" data-animate="edge" style="--step:7" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
332
+ <path data-edge-from="classify_failure" data-edge-to="safety_gate" data-edge-label="中断原因" data-edge-key="1" data-edge-id="e_classify_gate" data-composition-points="260,246;316.4,246" d="M 260 246 L 316.4 246" class="a-emphasis" data-animate="edge" style="--step:1" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
333
+ <path data-edge-from="turn_end" data-edge-to="classify_failure" data-edge-label="会话事实" data-edge-key="2" data-edge-id="e_event_classify" data-composition-points="48,120;32,120;32,300;214,300;214,272" d="M 48 120 L 32 120 L 32 300 L 214 300 L 214 272" class="a-default" data-animate="edge" style="--step:0" stroke-width="1.4" marker-end="url(#arrowhead)"/>
334
+ <path data-edge-from="agent_followup" data-edge-to="recovery_feedback" data-edge-label="turn/end + SSE" data-edge-key="3" data-edge-id="e_followup_result" data-composition-points="817.5999999999999,338;817.5999999999999,146" d="M 817.5999999999999 338 L 817.5999999999999 146" class="a-default" data-animate="edge" style="--step:5" stroke-width="1.4" marker-end="url(#arrowhead)"/>
335
+ <path data-edge-from="safety_gate" data-edge-to="grace_wait" data-edge-label="允许恢复" data-edge-key="4" data-edge-id="e_gate_grace" data-composition-points="408.4,246;464.79999999999995,246" d="M 408.4 246 L 464.79999999999995 246" class="a-emphasis" data-animate="edge" style="--step:2" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
336
+ <path data-edge-from="safety_gate" data-edge-to="manual_stop" data-edge-label="不可自动恢复" data-edge-key="5" data-edge-id="e_gate_manual" data-composition-points="362.4,220;362.4,120;464.79999999999995,120" d="M 362.4 220 L 362.4 120 L 464.79999999999995 120" class="a-default" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead)"/>
337
+ <path data-edge-from="grace_wait" data-edge-to="compose_prompt" data-edge-label="宽限期内无新回合" data-edge-key="6" data-edge-id="e_grace_prompt" data-composition-points="556.8,246;651.5999999999999,246" d="M 556.8 246 L 651.5999999999999 246" class="a-emphasis" data-animate="edge" style="--step:3" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
338
+ <path data-edge-from="turn_end" data-edge-to="agent_cancel" data-edge-label="运行中反复输出或工具调用" data-edge-key="7" data-edge-id="e_loop_cancel" data-composition-points="48,120;20,120;20,372;168,372" d="M 48 120 L 20 120 L 20 372 L 168 372" class="a-security" data-animate="edge" style="--step:12" stroke-width="1.4" marker-end="url(#arrowhead-security)"/>
339
+ <path data-edge-from="compose_prompt" data-edge-to="agent_followup" data-edge-label="排队续跑" data-edge-key="8" data-edge-id="e_prompt_followup" data-composition-points="697.5999999999999,272;697.5999999999999,372;771.5999999999999,372" d="M 697.5999999999999 272 L 697.5999999999999 372 L 771.5999999999999 372" class="a-emphasis" data-animate="edge" style="--step:4" stroke-width="1.8" marker-end="url(#arrowhead-emphasis)"/>
340
+
341
+ <!-- Nodes -->
342
+ <!-- Node glyphs: Lucide Icons; see auto-continue-workflow-icons.LICENSE.txt -->
343
+ <g id="node-turn_end" data-node-id="turn_end" data-node-label="收到会话信号" tabindex="0" role="button" aria-label="聚焦收到会话信号,turn/end 或启动扫描, DSH 会话与浏览器" aria-pressed="false" data-node-kind="messagebus" data-node-sublabel="turn/end 或启动扫描" data-node-context="DSH 会话与浏览器">
344
+ <title>收到会话信号 · turn/end 或启动扫描 · DSH 会话与浏览器</title>
345
+ <rect x="48" y="94" width="92" height="52" rx="6" class="c-mask"/>
346
+ <rect x="48" y="94" width="92" height="52" rx="6" class="c-messagebus" data-animate="node" style="--step:0" stroke-width="1.5"/>
347
+ <g aria-hidden="true" data-semantic-sigil="messagebus" class="semantic-sigil s-messagebus" transform="translate(88.5 99) scale(0.4583333333)" data-lucide-icon="radio" data-icon-layout="stacked">
348
+ <path d="M16.247 7.761a6 6 0 0 1 0 8.478"/>
349
+ <path d="M19.075 4.933a10 10 0 0 1 0 14.134"/>
350
+ <path d="M4.925 19.067a10 10 0 0 1 0-14.134"/>
351
+ <path d="M7.753 16.239a6 6 0 0 1 0-8.478"/>
352
+ <circle cx="12" cy="12" r="2"/>
353
+ </g>
354
+ <text data-node-label="" x="94" y="123" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">收到会话信号</text>
355
+ <text x="94" y="138" class="t-muted" font-size="7.3" text-anchor="middle">turn/end 或启动扫描</text>
356
+ </g>
357
+
358
+ <g id="node-manual_stop" data-node-id="manual_stop" data-node-label="等待人工介入" tabindex="0" role="button" aria-label="聚焦等待人工介入,停止、永久错误、达上限, DSH 会话与浏览器" aria-pressed="false" data-node-kind="external" data-node-sublabel="停止、永久错误、达上限" data-node-context="DSH 会话与浏览器">
359
+ <title>等待人工介入 · 停止、永久错误、达上限 · DSH 会话与浏览器</title>
360
+ <rect x="464.79999999999995" y="94" width="92" height="52" rx="6" class="c-mask"/>
361
+ <rect x="464.79999999999995" y="94" width="92" height="52" rx="6" class="c-external" data-animate="node" style="--step:8" stroke-width="1.5"/>
362
+ <g aria-hidden="true" data-semantic-sigil="external" class="semantic-sigil s-external" transform="translate(505.3 99) scale(0.4583333333)" data-lucide-icon="hand" data-icon-layout="stacked">
363
+ <path d="M18 11V6a2 2 0 0 0-2-2 2 2 0 0 0-2 2"/>
364
+ <path d="M14 10V4a2 2 0 0 0-2-2 2 2 0 0 0-2 2v2"/>
365
+ <path d="M10 10.5V6a2 2 0 0 0-2-2 2 2 0 0 0-2 2v8"/>
366
+ <path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"/>
367
+ </g>
368
+ <text data-node-label="" x="510.79999999999995" y="123" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">等待人工介入</text>
369
+ <text x="510.79999999999995" y="138" class="t-muted" font-size="6.3" text-anchor="middle">停止、永久错误、达上限</text>
370
+ </g>
371
+
372
+ <g id="node-recovery_feedback" data-node-id="recovery_feedback" data-node-label="恢复与反馈" tabindex="0" role="button" aria-label="聚焦恢复与反馈,清零、退避、SSE 状态, DSH 会话与浏览器" aria-pressed="false" data-node-kind="frontend" data-node-sublabel="清零、退避、SSE 状态" data-node-context="DSH 会话与浏览器">
373
+ <title>恢复与反馈 · 清零、退避、SSE 状态 · DSH 会话与浏览器</title>
374
+ <rect x="771.5999999999999" y="94" width="92" height="52" rx="6" class="c-mask"/>
375
+ <rect x="771.5999999999999" y="94" width="92" height="52" rx="6" class="c-frontend" data-animate="node" style="--step:6" stroke-width="1.5"/>
376
+ <g aria-hidden="true" data-semantic-sigil="frontend" class="semantic-sigil s-frontend" transform="translate(812.1 99) scale(0.4583333333)" data-lucide-icon="circle-check-big" data-icon-layout="stacked">
377
+ <path d="M21.801 10A10 10 0 1 1 17 3.335"/>
378
+ <path d="m9 11 3 3L22 4"/>
379
+ </g>
380
+ <text data-node-label="" x="817.5999999999999" y="123" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">恢复与反馈</text>
381
+ <text x="817.5999999999999" y="138" class="t-muted" font-size="7" text-anchor="middle">清零、退避、SSE 状态</text>
382
+ </g>
383
+
384
+ <g id="node-classify_failure" data-node-id="classify_failure" data-node-label="识别中断原因" tabindex="0" role="button" aria-label="聚焦识别中断原因,错误、令牌上限与扫描, AutoContinueRunner › 安全恢复链" aria-pressed="false" data-node-kind="backend" data-node-sublabel="错误、令牌上限与扫描" data-node-context="AutoContinueRunner › 安全恢复链">
385
+ <title>识别中断原因 · 错误、令牌上限与扫描 · AutoContinueRunner › 安全恢复链</title>
386
+ <rect x="168" y="220" width="92" height="52" rx="6" class="c-mask"/>
387
+ <rect x="168" y="220" width="92" height="52" rx="6" class="c-backend" data-animate="node" style="--step:1" stroke-width="1.5"/>
388
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(208.5 225) scale(0.4583333333)" data-lucide-icon="scan-search" data-icon-layout="stacked">
389
+ <path d="M3 7V5a2 2 0 0 1 2-2h2"/>
390
+ <path d="M17 3h2a2 2 0 0 1 2 2v2"/>
391
+ <path d="M21 17v2a2 2 0 0 1-2 2h-2"/>
392
+ <path d="M7 21H5a2 2 0 0 1-2-2v-2"/>
393
+ <circle cx="12" cy="12" r="3"/>
394
+ <path d="m16 16-1.9-1.9"/>
395
+ </g>
396
+ <text data-node-label="" x="214" y="249" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">识别中断原因</text>
397
+ <text x="214" y="264" class="t-muted" font-size="7" text-anchor="middle">错误、令牌上限与扫描</text>
398
+ </g>
399
+
400
+ <g id="node-safety_gate" data-node-id="safety_gate" data-node-label="检查恢复条件" tabindex="0" role="button" aria-label="聚焦检查恢复条件,分类、暂停、冷却、上限, AutoContinueRunner › 安全恢复链" aria-pressed="false" data-node-kind="security" data-node-sublabel="分类、暂停、冷却、上限" data-node-context="AutoContinueRunner › 安全恢复链">
401
+ <title>检查恢复条件 · 分类、暂停、冷却、上限 · AutoContinueRunner › 安全恢复链</title>
402
+ <rect x="316.4" y="220" width="92" height="52" rx="6" class="c-mask"/>
403
+ <rect x="316.4" y="220" width="92" height="52" rx="6" class="c-security" data-animate="node" style="--step:2" stroke-width="1.5"/>
404
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(356.9 225) scale(0.4583333333)" data-lucide-icon="shield-check" data-icon-layout="stacked">
405
+ <path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"/>
406
+ <path d="m9 12 2 2 4-4"/>
407
+ </g>
408
+ <text data-node-label="" x="362.4" y="249" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">检查恢复条件</text>
409
+ <text x="362.4" y="264" class="t-muted" font-size="6.3" text-anchor="middle">分类、暂停、冷却、上限</text>
410
+ </g>
411
+
412
+ <g id="node-grace_wait" data-node-id="grace_wait" data-node-label="等待宽限期" tabindex="0" role="button" aria-label="聚焦等待宽限期,新回合或用户消息会取消, AutoContinueRunner › 安全恢复链" aria-pressed="false" data-node-kind="backend" data-node-sublabel="新回合或用户消息会取消" data-node-context="AutoContinueRunner › 安全恢复链">
413
+ <title>等待宽限期 · 新回合或用户消息会取消 · AutoContinueRunner › 安全恢复链</title>
414
+ <rect x="464.79999999999995" y="220" width="92" height="52" rx="6" class="c-mask"/>
415
+ <rect x="464.79999999999995" y="220" width="92" height="52" rx="6" class="c-backend" data-animate="node" style="--step:3" stroke-width="1.5"/>
416
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(505.3 225) scale(0.4583333333)" data-lucide-icon="timer" data-icon-layout="stacked">
417
+ <line x1="10" x2="14" y1="2" y2="2"/>
418
+ <line x1="12" x2="15" y1="14" y2="11"/>
419
+ <circle cx="12" cy="14" r="8"/>
420
+ </g>
421
+ <text data-node-label="" x="510.79999999999995" y="249" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">等待宽限期</text>
422
+ <text x="510.79999999999995" y="264" class="t-muted" font-size="6.3" text-anchor="middle">新回合或用户消息会取消</text>
423
+ </g>
424
+
425
+ <g id="node-compose_prompt" data-node-id="compose_prompt" data-node-label="组装续跑消息" tabindex="0" role="button" aria-label="聚焦组装续跑消息,模板 + 工具幂等护栏, AutoContinueRunner › 安全恢复链" aria-pressed="false" data-node-kind="backend" data-node-sublabel="模板 + 工具幂等护栏" data-node-context="AutoContinueRunner › 安全恢复链">
426
+ <title>组装续跑消息 · 模板 + 工具幂等护栏 · AutoContinueRunner › 安全恢复链</title>
427
+ <rect x="651.5999999999999" y="220" width="92" height="52" rx="6" class="c-mask"/>
428
+ <rect x="651.5999999999999" y="220" width="92" height="52" rx="6" class="c-backend" data-animate="node" style="--step:4" stroke-width="1.5"/>
429
+ <g aria-hidden="true" data-semantic-sigil="backend" class="semantic-sigil s-backend" transform="translate(692.1 225) scale(0.4583333333)" data-lucide-icon="message-square-text" data-icon-layout="stacked">
430
+ <path d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"/>
431
+ <path d="M7 11h10"/>
432
+ <path d="M7 15h6"/>
433
+ <path d="M7 7h8"/>
434
+ </g>
435
+ <text data-node-label="" x="697.5999999999999" y="249" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">组装续跑消息</text>
436
+ <text x="697.5999999999999" y="264" class="t-muted" font-size="7.3" text-anchor="middle">模板 + 工具幂等护栏</text>
437
+ </g>
438
+
439
+ <g id="node-agent_cancel" data-node-id="agent_cancel" data-node-label="agent.cancel" tabindex="0" role="button" aria-label="聚焦agent.cancel,守卫命中,保留 inbox, Agent 执行与中断" aria-pressed="false" data-node-kind="security" data-node-sublabel="守卫命中,保留 inbox" data-node-context="Agent 执行与中断">
440
+ <title>agent.cancel · 守卫命中,保留 inbox · Agent 执行与中断</title>
441
+ <rect x="168" y="346" width="92" height="52" rx="6" class="c-mask"/>
442
+ <rect x="168" y="346" width="92" height="52" rx="6" class="c-security" data-animate="node" style="--step:12" stroke-width="1.5"/>
443
+ <g aria-hidden="true" data-semantic-sigil="security" class="semantic-sigil s-security" transform="translate(208.5 351) scale(0.4583333333)" data-lucide-icon="circle-stop" data-icon-layout="stacked">
444
+ <circle cx="12" cy="12" r="10"/>
445
+ <rect x="9" y="9" width="6" height="6" rx="1"/>
446
+ </g>
447
+ <text data-node-label="" x="214" y="375" class="t-primary" font-size="11" font-weight="600" text-anchor="middle">agent.cancel</text>
448
+ <text x="214" y="390" class="t-muted" font-size="7" text-anchor="middle">守卫命中,保留 inbox</text>
449
+ </g>
450
+
451
+ <g id="node-agent_followup" data-node-id="agent_followup" data-node-label="agent.followup" tabindex="0" role="button" aria-label="聚焦agent.followup,进入 Agent inbox, Agent 执行与中断" aria-pressed="false" data-node-kind="cloud" data-node-sublabel="进入 Agent inbox" data-node-tag="排队发送" data-node-context="Agent 执行与中断">
452
+ <title>agent.followup · 进入 Agent inbox · Agent 执行与中断 · 排队发送</title>
453
+ <rect x="771.5999999999999" y="338" width="92" height="68" rx="6" class="c-mask"/>
454
+ <rect x="771.5999999999999" y="338" width="92" height="68" rx="6" class="c-cloud" data-animate="node" style="--step:5" stroke-width="1.5"/>
455
+ <g aria-hidden="true" data-semantic-sigil="cloud" class="semantic-sigil s-cloud" transform="translate(812.1 343) scale(0.4583333333)" data-lucide-icon="send" data-icon-layout="stacked">
456
+ <path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"/>
457
+ <path d="m21.854 2.147-10.94 10.939"/>
458
+ </g>
459
+ <text data-node-label="" x="817.5999999999999" y="367" class="t-primary" font-size="10" font-weight="600" text-anchor="middle">agent.followup</text>
460
+ <text x="817.5999999999999" y="384" class="t-muted" font-size="8" text-anchor="middle">进入 Agent inbox</text>
461
+ <text x="817.5999999999999" y="399" class="t-cloud" font-size="7" text-anchor="middle">排队发送</text>
462
+ </g>
463
+
464
+ <!-- Edge labels -->
465
+ <g data-edge-from="agent_cancel" data-edge-to="safety_gate" data-edge-label="aborted + loopText" data-edge-key="0" data-edge-id="e_cancel_gate">
466
+ <rect x="263" y="352" width="96.39999999999999" height="14" rx="3" class="c-mask"/>
467
+ <text x="311.2" y="362" class="t-security" font-size="8" text-anchor="middle">aborted + loopText</text>
468
+ </g>
469
+ <g data-edge-from="classify_failure" data-edge-to="safety_gate" data-edge-label="中断原因" data-edge-key="1" data-edge-id="e_classify_gate">
470
+ <rect x="264" y="226" width="48.4" height="14" rx="3" class="c-mask"/>
471
+ <text x="288.2" y="236" class="t-backend" font-size="8" text-anchor="middle">中断原因</text>
472
+ </g>
473
+ <g data-edge-from="turn_end" data-edge-to="classify_failure" data-edge-label="会话事实" data-edge-key="2" data-edge-id="e_event_classify">
474
+ <rect x="98.8" y="280" width="48.4" height="14" rx="3" class="c-mask"/>
475
+ <text x="123" y="290" class="t-muted" font-size="8" text-anchor="middle">会话事实</text>
476
+ </g>
477
+ <g data-edge-from="agent_followup" data-edge-to="recovery_feedback" data-edge-label="turn/end + SSE" data-edge-key="3" data-edge-id="e_followup_result">
478
+ <rect x="778.9999999999999" y="318" width="77.2" height="14" rx="3" class="c-mask"/>
479
+ <text x="817.5999999999999" y="328" class="t-muted" font-size="8" text-anchor="middle">turn/end + SSE</text>
480
+ </g>
481
+ <g data-edge-from="safety_gate" data-edge-to="grace_wait" data-edge-label="允许恢复" data-edge-key="4" data-edge-id="e_gate_grace">
482
+ <rect x="412.4" y="226" width="48.4" height="14" rx="3" class="c-mask"/>
483
+ <text x="436.59999999999997" y="236" class="t-backend" font-size="8" text-anchor="middle">允许恢复</text>
484
+ </g>
485
+ <g data-edge-from="safety_gate" data-edge-to="manual_stop" data-edge-label="不可自动恢复" data-edge-key="5" data-edge-id="e_gate_manual">
486
+ <rect x="379.79999999999995" y="100" width="67.6" height="14" rx="3" class="c-mask"/>
487
+ <text x="413.59999999999997" y="110" class="t-muted" font-size="8" text-anchor="middle">不可自动恢复</text>
488
+ </g>
489
+ <g data-edge-from="grace_wait" data-edge-to="compose_prompt" data-edge-label="宽限期内无新回合" data-edge-key="6" data-edge-id="e_grace_prompt">
490
+ <rect x="560.8" y="226" width="86.8" height="14" rx="3" class="c-mask"/>
491
+ <text x="604.1999999999999" y="236" class="t-backend" font-size="8" text-anchor="middle">宽限期内无新回合</text>
492
+ </g>
493
+ <g data-edge-from="turn_end" data-edge-to="agent_cancel" data-edge-label="运行中反复输出或工具调用" data-edge-key="7" data-edge-id="e_loop_cancel">
494
+ <rect x="31.400000000000006" y="352" width="125.19999999999999" height="14" rx="3" class="c-mask"/>
495
+ <text x="94" y="362" class="t-security" font-size="8" text-anchor="middle">运行中反复输出或工具调用</text>
496
+ </g>
497
+ <g data-edge-from="compose_prompt" data-edge-to="agent_followup" data-edge-label="排队续跑" data-edge-key="8" data-edge-id="e_prompt_followup">
498
+ <rect x="710.3999999999999" y="352" width="48.4" height="14" rx="3" class="c-mask"/>
499
+ <text x="734.5999999999999" y="362" class="t-backend" font-size="8" text-anchor="middle">排队续跑</text>
500
+ </g>
501
+
502
+ <!-- Legend -->
503
+ <g data-legend="">
504
+ <text x="20" y="434" class="t-primary" font-size="12" font-weight="650">图例</text>
505
+ <g data-legend-semantic-kind="frontend" data-legend-x="20" data-legend-baseline="454" data-legend-width="87">
506
+ <rect x="20" y="446" width="14" height="9" rx="2" class="c-frontend" stroke-width="1"/>
507
+ <text x="42" y="454" class="t-muted" font-size="7.5" font-weight="500">浏览器反馈</text>
508
+ </g>
509
+ <g data-legend-semantic-kind="backend" data-legend-x="114" data-legend-baseline="454" data-legend-width="78">
510
+ <rect x="114" y="446" width="14" height="9" rx="2" class="c-backend" stroke-width="1"/>
511
+ <text x="136" y="454" class="t-muted" font-size="7.5" font-weight="500">宿主处理</text>
512
+ </g>
513
+ <g data-legend-semantic-kind="security" data-legend-x="199" data-legend-baseline="454" data-legend-width="78">
514
+ <rect x="199" y="446" width="14" height="9" rx="2" class="c-security" stroke-width="1"/>
515
+ <text x="221" y="454" class="t-muted" font-size="7.5" font-weight="500">安全判定</text>
516
+ </g>
517
+ <g data-legend-semantic-kind="messagebus" data-legend-x="284" data-legend-baseline="454" data-legend-width="78">
518
+ <rect x="284" y="446" width="14" height="9" rx="2" class="c-messagebus" stroke-width="1"/>
519
+ <text x="306" y="454" class="t-muted" font-size="7.5" font-weight="500">会话事件</text>
520
+ </g>
521
+ <g data-legend-semantic-kind="cloud" data-legend-x="369" data-legend-baseline="454" data-legend-width="87">
522
+ <rect x="369" y="446" width="14" height="9" rx="2" class="c-cloud" stroke-width="1"/>
523
+ <text x="391" y="454" class="t-muted" font-size="7.5" font-weight="500">Agent 队列</text>
524
+ </g>
525
+ <g data-legend-semantic-kind="external" data-legend-x="463" data-legend-baseline="454" data-legend-width="78">
526
+ <rect x="463" y="446" width="14" height="9" rx="2" class="c-external" stroke-width="1"/>
527
+ <text x="485" y="454" class="t-muted" font-size="7.5" font-weight="500">人工介入</text>
528
+ </g>
529
+ </g>
530
+ </svg>