@mstar-harness/dsh 3.8.0 → 3.8.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.
- package/README.i18n.yaml +2 -2
- package/README.md +126 -188
- package/README.zh.md +13 -11
- package/bundle/README.md +83 -171
- package/dist/client/index.d.ts +17 -8
- package/dist/client/panel/MstarPanelTitle.d.ts +13 -0
- package/dist/client/panel/PanelView.d.ts +56 -52
- package/dist/client/panel/TabNav.d.ts +17 -14
- package/dist/client/panel/definition.d.ts +23 -0
- package/dist/client/panel/graph/project-graph.d.ts +9 -51
- package/dist/client/panel/graph/schema.d.ts +1 -2
- package/dist/client/panel/locale.d.ts +1 -1
- package/dist/client/panel/mstar-glyph.d.ts +22 -0
- package/dist/client/panel/pages/AgentListPage.d.ts +71 -0
- package/dist/client/panel/pages/EventLogPage.d.ts +7 -4
- package/dist/client/panel/pages/IterationInfoSection.d.ts +16 -13
- package/dist/client/panel/pages/IterationTaskPage.d.ts +13 -14
- package/dist/client/panel/panel-store.d.ts +28 -0
- package/dist/client/panel/sidebar.d.ts +10 -5
- package/dist/client/panel/use-mstar-engine-status.d.ts +11 -10
- package/dist/client/panel/zones/Legend.d.ts +5 -3
- package/dist/client/panel/zones/TaskBoard.d.ts +13 -9
- package/dist/client.js +697 -1199
- package/dist/gates/catalog.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/types.d.ts +14 -7
- package/harness-skills/mstar-host/references/dsh.md +91 -225
- package/package.json +65 -63
- package/dist/client/panel/pages/AgentCanvasPage.d.ts +0 -345
|
@@ -1,345 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgentCanvasPage (spec panel-tabs §4/§6.2
|
|
3
|
-
* — the 代理执行 tab: a DRAGGABLE agent canvas. Replaces the muted
|
|
4
|
-
* placeholder page and the stage-column AgentFlowZone
|
|
5
|
-
* (deleted by this plan — the free canvas supersedes it).
|
|
6
|
-
*
|
|
7
|
-
* Canvas contract (spec §6.2 — zero third-party deps):
|
|
8
|
-
* - pan ONLY (translate, no zoom / pinch / rotate) via native pointer events
|
|
9
|
-
* (pointerdown / pointermove / pointerup + setPointerCapture) on the
|
|
10
|
-
* viewport; `touch-action: none` + `preventDefault` on pointerdown stop
|
|
11
|
-
* native scroll / text selection; during capture the entity cards never
|
|
12
|
-
* receive the pointer (no click-through); no pan bounds (free pan).
|
|
13
|
-
* - forced capture loss (window blur / alt-tab / element removal mid-gesture)
|
|
14
|
-
* fires `lostpointercapture` without pointerup — it binds the same end
|
|
15
|
-
* handler so `dragRef` never goes stale (review S-002).
|
|
16
|
-
* - the content layer carries `data-canvas-pan` and exposes the pan state as
|
|
17
|
-
* `transform: translate(xpx, ypx)`; the grid background moves WITH the
|
|
18
|
-
* content. Pan is instant (no animation), so `prefers-reduced-motion`
|
|
19
|
-
* needs no pan-specific handling; the next-edge dash flow and the running
|
|
20
|
-
* card pulse are CSS animations killed by the panel root's reduced-motion
|
|
21
|
-
* rule (`* { animation: none !important }`).
|
|
22
|
-
* - pan state `{ x, y }` is LOCAL useState; the drag math is extracted into
|
|
23
|
-
* the exported pure helpers (`panDragStart` / `panDragMove` / `panTransform`)
|
|
24
|
-
* so the pointer-event sequence is unit-testable without a DOM.
|
|
25
|
-
*
|
|
26
|
-
* Entities (spec §4/§6.2): every KNOWN_AGENTS roster member renders a card —
|
|
27
|
-
* title = the AGENT NAME (role id, or displayName for idle cards via
|
|
28
|
-
* `entity.name`); the session id / task tag are AUXILIARY record fields on
|
|
29
|
-
* `data-agent-record` (never the title). Idle (no dispatch evidence) cards
|
|
30
|
-
* are muted (`data-agent-idle`); lit cards follow the projection's status
|
|
31
|
-
* priority (running/settled/error/denied/advisory). Settled cards get a
|
|
32
|
-
* standalone GREEN DONE FRAME + green ✓ (
|
|
33
|
-
* `data-agent-done="true"`, the frame is a full-strength success ring on the
|
|
34
|
-
* rounded card body) ONLY when `emphasis !== 'off'` — an off-tier role
|
|
35
|
-
* (already-passed / stage-less on-demand + general) never shows the
|
|
36
|
-
* completion marker (the v3 leak: the ✓ survived the off-tier low
|
|
37
|
-
* transparency).
|
|
38
|
-
*
|
|
39
|
-
* Shared iteration section : the page renders the
|
|
40
|
-
* SAME `IterationInfoSection` the tasks tab uses, from the SAME
|
|
41
|
-
* `view.iteration` data — 两个 tab 显示同一迭代信息块.
|
|
42
|
-
*
|
|
43
|
-
* Edges (spec §4 — the
|
|
44
|
-
* finalized 2026-08-12 line semantics, design doc §2): ONLY the actual
|
|
45
|
-
* handoffs (business entity→entity — role-keyed, general endpoints
|
|
46
|
-
* filtered, one edge per pair) and the supervise line (plan
|
|
47
|
-
* Task 2 — the static bidirectional
|
|
48
|
-
* implementor ↔ sdd-reviewer sub-bucket line inside the `sdd-implement`
|
|
49
|
-
* column, dim dashed by default, lit business when the projected
|
|
50
|
-
* `evidenced` flag is true — never a fabricated activation) — all drawn as
|
|
51
|
-
* SVG bezier `C` paths (design doc §2.6) over the layout computed by the
|
|
52
|
-
* exported pure `layoutAgents`. The `expected` stage skeleton and the
|
|
53
|
-
* animated `next` edge are REMOVED ( — the column order
|
|
54
|
-
* implies the flow, the running card glow + status point carry the
|
|
55
|
-
* position). Every line anchors to a CARD PORT (4 fixed edge-midpoint
|
|
56
|
-
* ports, design doc §2.5 — hover-visible dots, static-invisible) or the
|
|
57
|
-
* supervise side-gap anchors (card right edge + 18px); the arrow tip sits
|
|
58
|
-
* at the STANDOFF point 10px off the target port (arrow along the endpoint
|
|
59
|
-
* tangent — H1) and no line crosses text (H2: standoff + side-gap routing
|
|
60
|
-
* for caption-crossing same-column flows + column-gap crossings). Col-skip
|
|
61
|
-
* cross-column edges reroute via a multi-`L` side-gap DETOUR below the
|
|
62
|
-
* intermediate card band instead of a direct bezier through the card bodies
|
|
63
|
-
* (H1).
|
|
64
|
-
*
|
|
65
|
-
* Layout : deterministic columns per EXPECTED_ROLE_FLOW stage
|
|
66
|
-
* (review-edit-chain → sdd-implement → qc-tri → qa-gate) — FOUR columns
|
|
67
|
-
* total (: the standalone rightmost UNKNOWN
|
|
68
|
-
* column is REMOVED; `zone: 'general'` entities render in an "unknown /
|
|
69
|
-
* 未匹配角色" SUB-PARTITION at the bottom of the LAST column,
|
|
70
|
-
* `data-sub-bucket="unknown"`), laid out in TWO SIDE-BY-SIDE PHASE GROUPS
|
|
71
|
-
* — the
|
|
72
|
-
* Phase 1 group LEFTMOST (review-edit-chain — the sequential Review & Edit
|
|
73
|
-
* chain: product-manager → architect → writing-specialist) and the Phase 2
|
|
74
|
-
* group to its RIGHT (sdd-implement → qc-tri → qa-gate — the iterative plan
|
|
75
|
-
* loop, annotated with the current `activePlanId` from the projected
|
|
76
|
-
* `state.plans[]` InProgress rows), top-aligned on ONE label row, each with
|
|
77
|
-
* its group label (`data-canvas-group`). The
|
|
78
|
-
* `sdd-implement` column is split into sub-buckets by the PROJECTED
|
|
79
|
-
* `entity.bucket` (never a render guess): the implementor partition above —
|
|
80
|
-
* flow roles in the stage's original order, then the on-demand roles
|
|
81
|
-
* (ops-engineer / prompt-engineer, carrying the on-demand badge) — and the
|
|
82
|
-
* reviewer partition (code-reviewer, idle included) below, with the
|
|
83
|
-
* implementor / sdd-reviewer caption labels. `zone: 'on-demand'` entities
|
|
84
|
-
* have NO standalone column anymore — they live in the implementor
|
|
85
|
-
* partition. The former "general sinks to the bottom of
|
|
86
|
-
* the sdd-implement column" placement is superseded, as is the
|
|
87
|
-
* rightmost unknown column; the former
|
|
88
|
-
* sdd-implement → general SDD loop back-edge stays REMOVED (the render
|
|
89
|
-
* draws no loop branch).
|
|
90
|
-
*
|
|
91
|
-
* Degradation (spec §8 — never throws / never orange): the projection always
|
|
92
|
-
* yields the full idle roster, so the canvas renders it with the muted
|
|
93
|
-
* `data-canvas-note` (degraded = ledger missing; empty = no events;
|
|
94
|
-
* settle-only = events but no dispatch rows — review T2-Imp-2 restored the
|
|
95
|
-
* old zone's distinct settle-only anchor; the empty/settle-only note
|
|
96
|
-
* is PROJECTED metadata, never inferred from the entity list). The Legend
|
|
97
|
-
* (idle / collaboration swatches) sits BELOW the viewport.
|
|
98
|
-
* `initialPan` is a deterministic SSR/test seed — the live page starts at the
|
|
99
|
-
* origin.
|
|
100
|
-
*/
|
|
101
|
-
import * as React from 'react';
|
|
102
|
-
import type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots';
|
|
103
|
-
import type { AgentEdge, ZoneView } from '../graph/project-graph.ts';
|
|
104
|
-
import { type PhaseId } from '../graph/schema.ts';
|
|
105
|
-
export interface AgentCanvasPageProps {
|
|
106
|
-
/** The projected agents zone (spec §6.2 — `ZoneView['agents']`). */
|
|
107
|
-
view: ZoneView['agents'];
|
|
108
|
-
/** The projected iteration zone (spec §3) — the SHARED iteration info
|
|
109
|
-
* block : BOTH the tasks tab and this page render the SAME
|
|
110
|
-
* `IterationInfoSection` from the SAME `view.iteration` data. */
|
|
111
|
-
iteration: ZoneView['iteration'];
|
|
112
|
-
t: TranslateNS<'mstar-panel'>;
|
|
113
|
-
/** Deterministic initial pan seed (SSR/tests); the live page starts at the origin. */
|
|
114
|
-
initialPan?: PanState;
|
|
115
|
-
}
|
|
116
|
-
/** Pan state: the content-layer translate (spec §6.2 — free pan, no bounds). */
|
|
117
|
-
export interface PanState {
|
|
118
|
-
x: number;
|
|
119
|
-
y: number;
|
|
120
|
-
}
|
|
121
|
-
/** A live drag gesture: the pan at pointerdown + the pointer start position. */
|
|
122
|
-
export interface PanDrag {
|
|
123
|
-
originX: number;
|
|
124
|
-
originY: number;
|
|
125
|
-
startX: number;
|
|
126
|
-
startY: number;
|
|
127
|
-
}
|
|
128
|
-
export declare const PAN_ORIGIN: PanState;
|
|
129
|
-
/** Open a drag gesture: remember the pan at pointerdown and the pointer seat. */
|
|
130
|
-
export declare function panDragStart(pan: PanState, x: number, y: number): PanDrag;
|
|
131
|
-
/** Follow the pointer: pan = origin + (current − start) — free pan (spec §6.2). */
|
|
132
|
-
export declare function panDragMove(drag: PanDrag, x: number, y: number): PanState;
|
|
133
|
-
/** The `data-canvas-pan` transform string (spec §6.2 — translate only). */
|
|
134
|
-
export declare function panTransform(pan: PanState): string;
|
|
135
|
-
/** One positioned box in the canvas coordinate space. */
|
|
136
|
-
export interface CanvasBox {
|
|
137
|
-
x: number;
|
|
138
|
-
y: number;
|
|
139
|
-
w: number;
|
|
140
|
-
h: number;
|
|
141
|
-
}
|
|
142
|
-
/** One stage column track (expected/next edge anchors + the column label). */
|
|
143
|
-
export interface CanvasColumn extends CanvasBox {
|
|
144
|
-
id: string;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* One PHASE group of the canvas : the stage columns split into two SIDE-BY-SIDE groups by iteration
|
|
148
|
-
* phase — **Phase 1** (review-edit-chain, the sequential Review & Edit
|
|
149
|
-
* chain: product-manager → architect → writing-specialist) LEFTMOST,
|
|
150
|
-
* **Phase 2** (sdd-implement → qc-tri → qa-gate, the iterative plan loop) to
|
|
151
|
-
* its RIGHT — every group label row TOP-ALIGNED at PAD_Y; the Phase-2 row
|
|
152
|
-
* additionally annotates the CURRENT PLAN (the projected `activePlanId` —
|
|
153
|
-
* the first InProgress `state.plans[]` row, design doc §1.2). Group order =
|
|
154
|
-
* first occurrence in the projected stage order (PHASE_IDS-aligned) —
|
|
155
|
-
* derived, never literal, so a phase/stage rename can never orphan the
|
|
156
|
-
* groups.
|
|
157
|
-
*/
|
|
158
|
-
export interface CanvasGroup {
|
|
159
|
-
/** The group's iteration phase id. */
|
|
160
|
-
phase: PhaseId;
|
|
161
|
-
/** 1-based group ordinal in stage order (Phase 1 = 1, Phase 2 = 2). */
|
|
162
|
-
index: number;
|
|
163
|
-
/** The group label row seat (canvas coordinates; width = the group's
|
|
164
|
-
* content width — the Phase-2 current-plan chip rides the same row). */
|
|
165
|
-
label: {
|
|
166
|
-
x: number;
|
|
167
|
-
y: number;
|
|
168
|
-
w: number;
|
|
169
|
-
h: number;
|
|
170
|
-
};
|
|
171
|
-
/** The stage column ids of this group, stage order. */
|
|
172
|
-
columnIds: readonly string[];
|
|
173
|
-
/** Current-plan annotation host (design doc §1.2 —):
|
|
174
|
-
* true for the `autonomous-execute` phase group (the iterative plan loop)
|
|
175
|
-
* only. */
|
|
176
|
-
planNote: boolean;
|
|
177
|
-
}
|
|
178
|
-
/** The deterministic canvas geometry: stage columns + per-entity card boxes. */
|
|
179
|
-
export interface CanvasLayout {
|
|
180
|
-
width: number;
|
|
181
|
-
height: number;
|
|
182
|
-
columns: readonly CanvasColumn[];
|
|
183
|
-
cards: ReadonlyMap<string, CanvasBox>;
|
|
184
|
-
/** Sub-bucket geometry per column id (the supervise line anchors to the band edges (the
|
|
185
|
-
* inter-partition gap; QC W-001).
|
|
186
|
-
* Columns without sub-buckets are absent from the map. */
|
|
187
|
-
subBuckets: ReadonlyMap<string, SubBucketGeometry>;
|
|
188
|
-
/** The unknown sub-partition at the bottom of the LAST column (plan
|
|
189
|
-
* Task 5 —:
|
|
190
|
-
* `zone: 'general'` entities sink into a qa-gate-column-bottom sub-partition
|
|
191
|
-
* instead of a standalone fifth column). The caption seat + card band;
|
|
192
|
-
* null when the layout has no columns (total function — never a throw). */
|
|
193
|
-
unknown: UnknownSubPartition | null;
|
|
194
|
-
/** The Phase groups (user
|
|
195
|
-
* 2026-08-12 feedback #2; plan
|
|
196
|
-
* Phase 1 leftmost /
|
|
197
|
-
* Phase 2 right, top-aligned, each with its label seat; empty when the
|
|
198
|
-
* layout has no columns. */
|
|
199
|
-
groups: readonly CanvasGroup[];
|
|
200
|
-
}
|
|
201
|
-
/** The unknown sub-partition id : `zone: 'general'` entities render in a bottom
|
|
202
|
-
* sub-partition of the LAST column titled「unknown / 未匹配角色」and marked
|
|
203
|
-
* `data-sub-bucket="unknown"`. The former standalone rightmost UNKNOWN column
|
|
204
|
-
* is REMOVED — the constant
|
|
205
|
-
* value survives as the sub-partition bucket id. */
|
|
206
|
-
export declare const UNKNOWN_COLUMN = "unknown";
|
|
207
|
-
/** One sub-bucket partition inside the `sdd-implement` column (plan
|
|
208
|
-
* the caption seat + the cards'
|
|
209
|
-
* band — the supervise line anchors to the band's edge (implementor:
|
|
210
|
-
* bottom edge; reviewer: top edge — the inter-partition gap; QC W-001). */
|
|
211
|
-
export interface SubBucketPartition {
|
|
212
|
-
/** The caption row's top-left seat (canvas coordinates; width = the card
|
|
213
|
-
* row width so the dashed rule fills the row). */
|
|
214
|
-
label: {
|
|
215
|
-
x: number;
|
|
216
|
-
y: number;
|
|
217
|
-
w: number;
|
|
218
|
-
};
|
|
219
|
-
/** The bucket's card bounding band (canvas coordinates); null when the
|
|
220
|
-
* partition has no cards (total function — the caption and the supervise
|
|
221
|
-
* line skip). */
|
|
222
|
-
band: CanvasBox | null;
|
|
223
|
-
}
|
|
224
|
-
/** The sub-bucket geometry of one column : implementor +
|
|
225
|
-
* reviewer partitions. Present ONLY for the `sdd-implement` column — the
|
|
226
|
-
* supervise anchors read the bands. */
|
|
227
|
-
export interface SubBucketGeometry {
|
|
228
|
-
implementor: SubBucketPartition;
|
|
229
|
-
reviewer: SubBucketPartition;
|
|
230
|
-
}
|
|
231
|
-
/** The unknown sub-partition of the LAST column : the caption seat + the general cards' band. The
|
|
232
|
-
* caption row (SUB_LABEL_H) sits ROW_GAP below the last flow card; the
|
|
233
|
-
* general cards follow SUB_GAP below it. */
|
|
234
|
-
export interface UnknownSubPartition {
|
|
235
|
-
/** The caption row's top-left seat (canvas coordinates; width = the card
|
|
236
|
-
* row width so the dashed rule fills the row). */
|
|
237
|
-
label: {
|
|
238
|
-
x: number;
|
|
239
|
-
y: number;
|
|
240
|
-
w: number;
|
|
241
|
-
};
|
|
242
|
-
/** The unknown partition's card bounding band; null when the partition has
|
|
243
|
-
* no general card (total function — the caption renders only with cards). */
|
|
244
|
-
band: CanvasBox | null;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Deterministic canvas layout (spec §4
|
|
248
|
-
* + Task 8 + plan
|
|
249
|
-
* Task 2 — the F5 rework + the
|
|
250
|
-
* left-right rework): one column per EXPECTED_ROLE_FLOW stage (view order:
|
|
251
|
-
* review-edit-chain → sdd-implement → qc-tri → qa-gate) — FOUR columns
|
|
252
|
-
* total, laid out in TWO SIDE-BY-SIDE PHASE GROUPS (the **Phase 1 group
|
|
253
|
-
* LEFTMOST** (review-edit-chain — the sequential Review & Edit chain:
|
|
254
|
-
* product-manager → architect → writing-specialist) and the **Phase 2 group
|
|
255
|
-
* to its RIGHT** (sdd-implement → qc-tri → qa-gate — the iterative plan
|
|
256
|
-
* loop, annotated with the current `activePlanId`), every group label row
|
|
257
|
-
* TOP-ALIGNED at PAD_Y (design doc §1.2; the standalone rightmost unknown
|
|
258
|
-
* column is REMOVED ). The `sdd-implement` column
|
|
259
|
-
* is split into sub-buckets by the
|
|
260
|
-
* PROJECTED `entity.bucket` (never a render-side guess): the implementor
|
|
261
|
-
* partition above — flow roles in the stage's original EXPECTED_ROLE_FLOW
|
|
262
|
-
* order, then the on-demand roles (ops-engineer / prompt-engineer — the
|
|
263
|
-
* standalone on-demand column is REMOVED) — and the reviewer partition
|
|
264
|
-
* (code-reviewer) below, with the implementor / sdd-reviewer caption seats +
|
|
265
|
-
* card bands recorded in `subBuckets` (the supervise-line anchors).
|
|
266
|
-
* `zone: 'general'` entities (the general bucket — unmatched / anonymous
|
|
267
|
-
* dispatches) render in the "unknown / 未匹配角色" SUB-PARTITION at the
|
|
268
|
-
* bottom of the LAST column (`layout.unknown` — design doc §1.2: caption row
|
|
269
|
-
* ROW_GAP below the last flow card, general cards SUB_GAP below it). The
|
|
270
|
-
* column bucket comes from the PROJECTED `entity.zone`: 'flow' → the
|
|
271
|
-
* entity's stage column, 'on-demand' → the sdd-implement column's implementor
|
|
272
|
-
* partition, 'general' → the last column's unknown partition. Total function —
|
|
273
|
-
* every entity gets a box; absent sdd-implement stage → on-demand falls back
|
|
274
|
-
* to the LAST column; unknown column ids fall back to the same sink; no
|
|
275
|
-
* stages → empty groups/columns; never a throw.
|
|
276
|
-
*/
|
|
277
|
-
export declare function layoutAgents(view: ZoneView['agents']): CanvasLayout;
|
|
278
|
-
/** The fixed port points of a card box (design doc §2.5 — 4 edge-midpoint
|
|
279
|
-
* ports, no new tokens). */
|
|
280
|
-
export type PortId = 'north' | 'south' | 'west' | 'east';
|
|
281
|
-
/** One edge's bezier geometry (design doc §2.6): the `d` path + the
|
|
282
|
-
* endpoint coordinates (start = the source port, end = the target STANDOFF
|
|
283
|
-
* point — the arrow tip lands there, 10px off the card border H1). Null
|
|
284
|
-
* when an anchor is missing (total function). */
|
|
285
|
-
export interface EdgeGeometry {
|
|
286
|
-
/** The SVG path `d` — a single `C` cubic-bezier command for the standard
|
|
287
|
-
* curves, or the multi-command `M … L … L … L … L … L …` side-gap detour
|
|
288
|
-
* polyline for col-skip cross-column edges . The render
|
|
289
|
-
* passes `d` through verbatim; `marker-end orient="auto"` follows the
|
|
290
|
-
* FINAL segment, so the arrow always rides the endpoint tangent (H1). */
|
|
291
|
-
d: string;
|
|
292
|
-
x1: number;
|
|
293
|
-
y1: number;
|
|
294
|
-
x2: number;
|
|
295
|
-
y2: number;
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* One edge's SVG bezier geometry ; null when an anchor is missing (total
|
|
299
|
-
* function).
|
|
300
|
-
*
|
|
301
|
-
* Port selection (design doc §2.5 — lines connect ports only, never through
|
|
302
|
-
* a card): forward (source column < target column) → source EAST → target
|
|
303
|
-
* WEST; reverse (source column > target column) → source WEST → target
|
|
304
|
-
* EAST; same column → the vertical flow (direction-aware. The
|
|
305
|
-
* path END stands off STANDOFF px from the target port along the endpoint
|
|
306
|
-
* tangent (arrow tip off the card, H1); the source starts AT its port (no
|
|
307
|
-
* arrow there).
|
|
308
|
-
*
|
|
309
|
-
* Direction-aware vertical endpoints : a same-column
|
|
310
|
-
* (or side-gap) flow whose SOURCE sits BELOW the target — the implement →
|
|
311
|
-
* review → rework cycle collapses to `code-reviewer → fullstack-dev` (the
|
|
312
|
-
* projection pair-dedupe keeps the LATEST direction) — must approach the
|
|
313
|
-
* target's SOUTH port, not its north: the arrow tip lands `standoff` below
|
|
314
|
-
* the target's bottom edge pointing UP into it. The old code put the tip
|
|
315
|
-
* above the target (pointing AWAY) and the center-x line ran through both
|
|
316
|
-
* card bodies (H1/H2 violations). Forward (source above) keeps source SOUTH
|
|
317
|
-
* → target NORTH. The reverse side-gap detour below is direction-aware by
|
|
318
|
-
* construction (it enters the target from its RIGHT side gap and lands 10px
|
|
319
|
-
* off the EAST edge, tip pointing LEFT into the card).
|
|
320
|
-
*
|
|
321
|
-
* Same-column flows whose center-x vertical line would cross a sub-bucket
|
|
322
|
-
* CAPTION row (the implementor↔reviewer flow crosses the "sdd-reviewer"
|
|
323
|
-
* caption, the qa-gate↔unknown flow crosses the「unknown / 未匹配角色」
|
|
324
|
-
* caption) OR another CARD body (a handoff between non-adjacent cards, e.g.
|
|
325
|
-
* fullstack-dev → frontend-dev skips the idle fullstack-dev-2 — the
|
|
326
|
-
* 2026-08-13 "线穿过卡片" report) route in the column's LEFT side gap instead
|
|
327
|
-
* (design doc §2.0 绕行策略 ② — 同列关系线移到卡片列外侧的间隙带): the vertical
|
|
328
|
-
* bezier hangs at `card left edge − SIDE_GAP`, clear of every text (H2) and
|
|
329
|
-
* every card body (H1).
|
|
330
|
-
*
|
|
331
|
-
* Inter-phase flows : a Phase 1 → Phase 2 handoff (e.g. writing-specialist →
|
|
332
|
-
* fullstack-dev — a real same-plan Review&Edit→implement transfer) is a
|
|
333
|
-
* normal FORWARD horizontal bezier (source east → target west) — the groups
|
|
334
|
-
* sit side-by-side at one top-aligned y band, so no label row lies between
|
|
335
|
-
* the cards. The CARD-AWARE guard : a
|
|
336
|
-
* cross-column edge whose columns SKIP an intermediate column (e.g.
|
|
337
|
-
* writing-specialist → qc-specialist — a real docs-only / inline / QA-gate
|
|
338
|
-
* ledger chain) would run its direct horizontal bezier THROUGH the
|
|
339
|
-
* intermediate column's card bodies; when the direct bbox intersects ANY
|
|
340
|
-
* card box other than the source/target cards, the edge reroutes via the
|
|
341
|
-
* side-gap DETOUR (see `sideGapDetour`) — a polyline below the intermediate
|
|
342
|
-
* band, clear of every card (H1) and text seat (H2).
|
|
343
|
-
*/
|
|
344
|
-
export declare function edgePath(edge: AgentEdge, layout: CanvasLayout): EdgeGeometry | null;
|
|
345
|
-
export declare function AgentCanvasPage({ view, iteration, t, initialPan }: AgentCanvasPageProps): React.JSX.Element;
|