@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.
@@ -60,7 +60,7 @@ export declare function buildCatalogPayload(ctx: Context, harnessDir: string | n
60
60
  * Advisory `agent/pre-step` waterfall listener (agent
61
61
  * catalog): delegates through `next()` (never `reject` — that would block the
62
62
  * step — and never replaces the delegated messages) and appends the ONE
63
- * unified `mstar-engine-status` catalog message to the composed step
63
+ * unified `mstar-engine` catalog message to the composed step
64
64
  * messages, so the durable session log carries it (model-visible ⟺ logged,
65
65
  * MessageSource form): the `<mstar_engine_status>` block renders the
66
66
  * watermark fields (version, harness dir, enforcement), plus the iteration
package/dist/index.js CHANGED
@@ -5896,7 +5896,7 @@ function pluginVersion() {
5896
5896
  return "0.0.0";
5897
5897
  }
5898
5898
  function engineStatusSource() {
5899
- return { kind: "plugin", plugin: "mstar-engine-status", form: "catalog" };
5899
+ return { kind: "plugin", plugin: "mstar-engine", form: "catalog" };
5900
5900
  }
5901
5901
  function engineStatusPayload(harnessDir) {
5902
5902
  const iteration = harnessDir !== null ? iterationGateSource(harnessDir) : undefined;
@@ -6393,7 +6393,7 @@ function persistEngineStatusSnapshot(ctx, harnessDir, cwd, turn, catalogPayload,
6393
6393
  // src/engine-status-endpoint.ts
6394
6394
  import { isAbsolute as isAbsolute3 } from "node:path";
6395
6395
 
6396
- // ../../node_modules/.bun/@deepseek-ai+dsh-typert-protocol@0.1.5-rc.1+1e4e7adc57ac8890/node_modules/@deepseek-ai/dsh-typert-protocol/lib/index.js
6396
+ // ../../node_modules/.bun/@deepseek-ai+dsh-typert-protocol@0.1.5-rc.2+1e4e7adc57ac8890/node_modules/@deepseek-ai/dsh-typert-protocol/lib/index.js
6397
6397
  import { Service as Service2 } from "@deepseek-ai/cordis";
6398
6398
  var TYPERT_REMOTE_SEGMENT_PATTERN = /^[A-Za-z0-9_$.-]+$/;
6399
6399
  function isTypertRemoteSegment(value) {
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `mstar-engine-status` catalog source + payload: the durable `catalog`-form
2
+ * `mstar-engine` catalog source + payload: the durable `catalog`-form
3
3
  * MessageSource the plugin appends to every composed step at
4
4
  * `agent/pre-step`, so the model-visible engine-status row is
5
5
  * reconstructable from the session log without re-parsing its prose
@@ -25,15 +25,22 @@ import type { EnforcementFlag } from '@mstar-harness/engine';
25
25
  * `plugin` arm with a CLOSED member set — exactly these three keys, never a
26
26
  * fourth.
27
27
  *
28
- * `plugin` carries the plugin's identity literal and `form: 'catalog'` the
29
- * row's first-party presentation; both are opaque, already-admitted
30
- * vocabulary at every released session-format edge. Everything the row
31
- * publishes about the workspace lives in
32
- * {@link MstarEngineStatusPayload}, which never rides `source`.
28
+ * `plugin` carries the plugin's identity and `form: 'catalog'` the row's
29
+ * first-party presentation; both are opaque, already-admitted vocabulary at
30
+ * every released session-format edge. Everything the row publishes about the
31
+ * workspace lives in {@link MstarEngineStatusPayload}, which never rides
32
+ * `source`.
33
+ *
34
+ * The `plugin` union is the PERSISTED-LOG vocabulary, not a write-time
35
+ * choice: the plugin emits `mstar-engine`, while rows emitted by shipped
36
+ * builds before 2026-09-11 persist `mstar-engine-status` in already-written
37
+ * session logs. Both are valid persisted rows; the panel's anchor reader
38
+ * accepts both (data compat for persisted session logs, not a code-compat
39
+ * layer).
33
40
  */
34
41
  export interface MstarEngineStatusSource {
35
42
  readonly kind: 'plugin';
36
- readonly plugin: 'mstar-engine-status';
43
+ readonly plugin: 'mstar-engine' | 'mstar-engine-status';
37
44
  readonly form: 'catalog';
38
45
  }
39
46
  /**
@@ -34,226 +34,94 @@ or a custom profile).
34
34
  - Web client plugin (workflow panel): the same `mstar` bundle row carries a
35
35
  browser client half (`dsh.client` + `exports["./client"]`) discovered
36
36
  automatically by `ClientModuleHostService` — no separate profile layer or
37
- install step. It registers a **`conversation.view`** view-ring tab
38
- (`id: 'mstar-workflow'`, `order: 20`) labeled **"MStar 工作流" / "MStar
39
- Workflow"** rendering the latest `mstar-engine-status` catalog **anchor** row
37
+ install step. It registers a **right-Sidebar page tab type** (`id:
38
+ '@mstar-harness/dsh'`, `kind: 'mstar-workflow'`, one guide-page capsule at
39
+ `order: 20`) labeled **"启明星工作流" / "Morning
40
+ Star Workflow"** rendering the latest `mstar-engine` catalog **anchor** row
40
41
  — the persisted source is the bare first-party `plugin` arm
41
- (`{ kind: 'plugin', plugin: 'mstar-engine-status', form: 'catalog' }`, no
42
- payload members), and the payload is fetched from the host's
42
+ (`{ kind: 'plugin', plugin: 'mstar-engine', form: 'catalog' }`, no
43
+ payload members; the anchor reader also accepts the legacy
44
+ `mstar-engine-status` identity from persisted logs), and the payload is fetched from the host's
43
45
  `/api/mstar/engineStatus` endpoint (the gateway owns the route; the browser
44
46
  half calls `connection.rpc.call('/api', 'mstar/engineStatus', { args: { sessionId, cwd } })`
45
- and renders the session's stored snapshot, or an explicit unavailable reason) —
46
- as the
47
- **MStar Workflow layout** — a right sidebar (plans ≤5 in time-desc order +
48
- `+N more`, open residual findings ≤10 with severity chips + overflow hint,
49
- policy with **enforcement first** then push / worktree / control worktree,
50
- leases, knowledge, direction) over a bottom **fixed meta dock** (version +
51
- harness dir; small muted, hairline-separated, does NOT scroll with the
52
- sidebar digest — the former header row was removed), and an **HTML/CSS zone
53
- dashboard** (the react-flow cyclic graph was removed in plan
54
- `20260810-panel-canvas-zones`): the canvas fills the Tab (the page never
55
- scrolls; the zone container is the only scroll body) with an **iteration
56
- zone** (Step 1–5 stepper + `Step N/5` badge + active-highlight / inactive
57
- dimmed state; the steps carry a FOUR-STATE machine — `current` / `next` /
58
- `done` / `idle` (plan `20260812-panel-f5-iteration-zone-fix` Task 1): every
59
- step BEFORE the current one projects `done`「已完成」(completed — a finished
60
- Step 1 must not read as idle while Step 2 is current), `next` is the single
61
- forward target, `idle` is schema-only + the branch panel — iteration base /
62
- target / spec integration, rendered only while active; the expanded head is
63
- a LEFT-RIGHT SPLIT — branches (small left half, WIDTH-CAPPED — `flex: 0 1
64
- 260px` + `max-width: 280px`, never stretches with the container; the <860px
65
- column stack resets to content height) + steps (large right half, `flex: 1 1
66
- 0` absorbing the remaining width) via `data-iteration-head-split`, stacking
67
- on narrow widths, and NO branch panel
68
- when there is no active iteration; the current step follows the steering
69
- compass: `compassStatus: 'active'` (Phase 1 in flight) → Step 1
70
- (iteration-start) is CURRENT with verdict `unknown` — no PASS/FAIL badge,
71
- plan `20260811-panel-f4-iteration-zone`; **the iteration info section is
72
- SHARED by the tasks AND agents tabs** (plan
73
- `20260812-panel-f5-design-system` Task 8, user round-4 decision #4 — one
74
- `IterationInfoSection` component, both tabs render the same `view.iteration`
75
- block: summary + steps + branches), a **tasks zone** (5-column
76
- kanban: Todo / InProgress / InReview / Done / `blocked-unknown` — the
77
- Blocked state and the former `unknown` catch-all fold into ONE merged
78
- column titled「受阻/未知」/「Blocked / Unknown」, plan
79
- `20260813-panel-quick-fixes` Task 1 — with count badges; every column
80
- caps its rendered rows at `PLAN_CAP` and shows a clickable 「更多」/「收起」
81
- expand button (`data-kanban-more` anchor) unfolding the full column — the
82
- projection keeps ALL plan rows, the cap is a render concern never a
83
- discard), an **agent-execution zone** (the FOUR EXPECTED_ROLE_FLOW stage/phase
84
- columns — review-edit-chain → sdd-implement → qc-tri → qa-gate, the
85
- terminal stage; the former `sdd-task-review` stage is removed and its SDD
86
- L2 reviewer is now the PIPELINE role `code-reviewer` (v2.1.1, the former
87
- `generalPurpose` seat) — a strict FOUR-column layout with NO standalone
88
- unknown column (plan `20260812-panel-f5-design-system` Task 5, user
89
- 2026-08-12 round-2 decision — the former rightmost UNKNOWN column of plan
90
- `20260812-panel-f5-agent-layout` is superseded): the `general` bucket
91
- sinks into an **unknown SUB-PARTITION at the bottom of the `qa-gate`
92
- column** (a `data-sub-bucket="unknown"` caption row 「unknown / 未匹配角色」
93
- after the last qa-gate card, then the general cards; the standalone
94
- on-demand column was already removed in the agent-layout plan); `explore`
95
- is removed — no card, no column. The columns are laid out in **TWO
96
- side-by-side Phase groups** (plan `20260812-panel-f5-design-system` Task 8,
97
- user round-4 decision #2; side-by-side layout per plan
98
- `20260813-panel-agent-canvas-legend-layout` Task 2): the **Phase 1 group
99
- on the LEFT** (review-edit-chain — the sequential Review & Edit chain:
100
- product-manager → architect → writing-specialist) and the **Phase 2 group
101
- on the RIGHT** (sdd-implement → qc-tri → qa-gate — the iterative plan
102
- loop), top-aligned (all group label rows share the same `y = PAD_Y`), each
103
- with its group label row; the **Phase-2 label annotates the CURRENT PLAN**
104
- (projected `agents.activePlanId` = the first InProgress `state.plans[]`
105
- row, `data-canvas-group-plan`; `+N more` when several plans run in
106
- parallel, muted「无进行中 plan」when none). The `sdd-implement` column is split into SUB-BUCKETS by
107
- the PROJECTED `entity.bucket` (never a render guess): the **implementor**
108
- partition ABOVE — the flow roles in the stage's original order
109
- (fullstack-dev / fullstack-dev-2 / frontend-dev), then the on-demand
110
- roles (ops-engineer / prompt-engineer, carrying the **on-demand badge** —
111
- the standalone on-demand column is gone) — and the **sdd-reviewer**
112
- partition BELOW (code-reviewer, idle included), with the implementor /
113
- sdd-reviewer caption labels; `zone: 'on-demand'` entities live in the
114
- implementor partition, `zone: 'general'` entities render in the qa-gate
115
- column's bottom unknown sub-partition. The subagent ENTITY cards aggregate **by role** from actual
116
- dispatch evidence: the same role across sessions folds into one card ×N,
117
- and every off-roster dispatch (the former `generalPurpose` SDD reviewer,
118
- `scout`, anonymous `role === ''`) folds into the single `general` bucket
119
- entity — the card is ROLE-TITLED (the role id, e.g. `fullstack-dev`); the
120
- agent session id / task tag (`planId#taskId`) ride the RECORD line, never
121
- the title. Cards show the role chip / status point / ×N count; running
122
- entities carry the business glow-pulse
123
- highlight, un-evidenced stages render the dashed "待执行" pending
124
- placeholder with their expected role chips, un-evidenced KNOWN_AGENTS
125
- members render dashed idle cards (the full 14-role roster is never
126
- hidden), and the header shows the `N executing · M pending` summary.
127
- Cards carry the projected **emphasis tier** (plan
128
- `20260812-panel-f5-design-system` Task 4, design doc §3): `emphasis:
129
- 'current' | 'next' | 'off' | null` — the iteration's current-phase roles
130
- render at **100%** chrome intensity, later-phase expected roles at **75%**,
131
- already-passed / stage-less (on-demand, general) roles at **45%**, and
132
- `null` (no iteration / unresolved transition) applies NO override — always
133
- a chrome **alpha mix** (`--mstar-canvas-emphasis-*` tokens; never a
134
- whole-card `opacity`, so the status point + running glow stay opaque).
135
- Settled entities get a **standalone GREEN done frame + green ✓** (plan
136
- `20260812-panel-f5-design-system` Task 8, user round-4 decisions #1/#3:
137
- `data-agent-done="true"` — a full-strength success border + 1px ring on
138
- the rounded card body + the ✓ in the status point) **ONLY when
139
- `emphasis ≠ 'off'`** — an off-tier role (already-passed / stage-less
140
- on-demand + general) renders the muted dot instead and NEVER shows the
141
- completion marker (the completed state never appears on a stage-less
142
- role). The canvas filters to the CURRENT iteration only (plan
143
- `20260813-panel-quick-fixes` Task 2): dispatch evidence projects for the
144
- current iteration's plans — the steering compass `iterationId` when
145
- active, else the nearest iteration derived from the catalog
146
- `plans[].iterationRefs` (the most-recent plan's refs by 8-digit id date
147
- prefix + doneAt); provably cross-iteration events produce no entity/edge
148
- (the roster keeps its idle cards); plan-less / unknown-plan / standalone
149
- dispatches are never hidden. Status honesty (Task 2): `advisory` is NO
150
- LONGER terminal — a soft-enforcement dispatch falls through to its paired
151
- settle (green ✓ when a settle exists, `running` when none) while `denied`
152
- stays terminal; the advisory verdict still renders in the event log. The
153
- canvas legend sits BELOW the viewport (Task 3 — moved from above, user
154
- 2026-08-13 feedback).
155
- Edges (plan `20260812-panel-f5-design-system` Task 5, design doc §2):
156
- the `expected` stage skeleton arrows AND the ANIMATED **next** edge (the
157
- former `@keyframes agent-dash-flow` dash-flow arrow of plan
158
- `20260810-panel-agent-flow-zone`) are **REMOVED** — flow order is implied
159
- by the fixed column order + column labels, the current position by the
160
- running card glow + status point — leaving TWO semantic kinds: the
161
- evidence-driven **`actual` handoff** edges (same-plan ts-adjacent dispatch
162
- entity-key pairs, `general` endpoints filtered, ≤1 per entity pair) drawn
163
- as **bezier `C` curves** anchored to card **PORTS** — 4 fixed
164
- edge-midpoint ports (north / south / east / west; static-invisible,
165
- hover-revealed as small dots) with the arrow tip pulled back to a **10px
166
- standoff** off the port — the arrow follows the line's local tangent at
167
- the anchor (**H1**), and no line's stroke or arrow crosses any text
168
- (**H2**: standoff + side-gap routing, design doc §2.0/§2.5/§2.6;
169
- tightened in plan `20260813-panel-quick-fixes` Task 3 — same-column
170
- vertical flows whose center-x line would cross an in-between card body
171
- (e.g. fullstack-dev → frontend-dev skipping an idle fullstack-dev-2)
172
- reroute into the column's LEFT side gap, forward AND reverse, and reverse
173
- horizontal beziers keep direction-aware control points BETWEEN the
174
- endpoints so they never bulge into the adjacent column) — plus
175
- the **bidirectional supervise line** (plan `20260812-panel-f5-agent-layout`
176
- Task 1/2) — ONE static design-knowledge sub-bucket edge inside the
177
- `sdd-implement` column (implementor ↔ sdd-reviewer — the mstar-sdd
178
- mutual-supervision contract), now anchored at the **side-gap vertical
179
- anchor** (`x = card right edge + 18px`, vertical bezier flow, arrows along
180
- the vertical tangent — design doc §2.5/§2.7); dim dashed by default, lit
181
- business SOLID when the projected `evidenced` flag is true —
182
- evidence-driven lighting, never a fabricated activation); the 事件记录 tab
183
- (`EventLogPage`, spec panel-tabs §5, plan `20260811-panel-event-log`) is a
184
- NON-canvas log page with two partitions — **Agent 流转事件** (`view.events`
185
- ≤50 latest-first; off-pipeline unexpected dispatches fold in once via
186
- `expected: false` and carry a dispatch-only 「未匹配角色」 badge — settle
187
- rows are completion records and never flag as unexpected) and **违规记录**
188
- (`view.violations`, gate violations with severity/code/message); every row
189
- is an expandable native `<details>` (no-JS, keyboard-accessible) whose body
190
- shows the full catalog fields — missing fields render「—」, never a guessed
191
- value. Layout (plan `20260811-panel-f3-agent-general`): the two partitions
192
- render SIDE BY SIDE in a locked-height two-column grid
193
- (`repeat(2, minmax(0, 1fr))` — the page never scrolls as a whole; each
194
- partition pins its title and owns an internal `overflow-y` scroll on its
195
- row list; plan `20260813-panel-quick-fixes` Task 4 root-caused the
196
- whole-page scroll — the panel root opts into the host
197
- `data-conversation-composer-overlay` (the host's documented full-height
198
- opt-in), so the host `.viewArea` becomes a definite-height container and
199
- `height:100%` resolves: `.rowList`'s `overflow-y: auto` now scrolls
200
- INSIDE the partition and the host page no longer scrolls, with bottom
201
- clearance reserving the floating composer via the host-published
202
- `--dsh-composer-height`), falling back to two stacked 50/50 locked rows
203
- below 1200px —
204
- the `data-event-log-*` anchor family is unchanged. The canvas-corner **`AgentEventDock`** is REMOVED with the page
205
- (无双份日志 — its row layout + status chips migrated into `EventLogPage`);
206
- the fixed footer bar (zone legend + gate summary + violations) died with
207
- the WorkflowCanvas in plan `20260811-panel-tabs-shell` — the footer that
208
- remains is the freshness marker. Empty branches (spec §2 — plan
209
- `20260812-panel-f5-agent-layout` Task 3): waiting keeps the muted hint,
210
- and NO harness renders a **CENTERED inactive-state card** (folder icon +
211
- 「No Morning Star harness detected」 title + the hint copy — the detail
212
- panel stays inactive, no tabs / no sidebar, activating automatically once
213
- a harness is detected; the `data-mstar-empty="no-harness"` anchor stays on
214
- the title, `data-mstar-graph` on the main container). Below 1200px
215
- the zones stack vertically. Pure `projectGraph` projection (never throws,
216
- explicit degraded states — muted empty states, never orange warn boxes).
217
- The branches block left the sidebar in plan `20260810-panel-sidebar-info`
218
- (its anchor fields ride the row's per-session snapshot payload, NOT the
219
- persisted source — the source is the bare first-party `plugin` arm; the
220
- iteration zone renders them via plan `20260810-panel-canvas-zones`); refresh
221
- follows the session snapshot, no polling — while the main agent is ACTIVELY
222
- orchestrating, a
223
- ledger record (dispatch/settle) invalidates the workspace's TTL-cached
224
- catalog row so the next pre-step rebuilds and (digest text change)
225
- re-injects it, and the panel refreshes per step (seconds, not the 60 s TTL);
226
- while the main agent IDLES (waiting, no tool calls) the panel keeps the
227
- LAST snapshot — no live push channel (documented limit, plan
228
- `20260811-panel-f4-timeliness`). Bundle served at
229
- `/plugins/@mstar-harness/dsh/client.js` (closure-factory CJS with NO graph
230
- library inlined — react-flow removed; the build asserts the bundle contains
231
- no `xyflow`/`reactflow` markers, no `@deepseek-ai/*` value imports, and no
232
- `import.meta` / ESM statements — the loader runs plugin bundles as classic
233
- scripts). **Known limitations**: the stepper's Step 1 (iteration-start) IS
234
- the current step while the steering compass is `status: active` (Phase 1 in
235
- flight — catalog `compassStatus` field), carrying NO PASS/FAIL badge (Phase
236
- 1 has no gate verdict); Step 5 (merge-ready) can never be the CURRENT step —
237
- the engine phase gate only evaluates Phase 2→3→4 (merge-ready is never a gate
238
- transition); it renders `next` only while Step 4 (pr-delivery) is current,
239
- idle otherwise;
240
- the current step follows the TTL-refreshed `compassStatus` — up to one
241
- catalog interval (60 s) behind a mid-session `active`→`locked` flip (bounded,
242
- documented staleness, never a wrong verdict); the agent-entity
243
- status derivation pairs a PAIRED settle exactly by its dispatch identity
244
- (`agent`, `role`, `planId`, `taskId` — under QC-tri N=3 concurrency each
245
- settle lands on ITS dispatch), and an unpaired dispatch stays `running`
246
- (no paired settle — never guessed, never faked); the current-iteration
247
- filter with NO steering compass infers the iteration from plan ids
248
- (8-digit date prefix) + doneAt — deterministic, documented heuristic, and
249
- only provably cross-iteration events are dropped; no historical back-scan of
250
- resumed long logs; no custom
251
- top-level slot (the `conversation.view` tab is the only session-level panel
252
- seat without dsh-private layout changes); no-session → shell hero
253
- (strict-session view ring). Panel acceptance is dual-track: in-loop browser
254
- harness verification (agent-browser/CDP against the rebuilt bundle,
255
- iteration guides record the verified runs) plus user-restart final GUI
256
- acceptance.
47
+ and renders the session's stored snapshot, or an explicit unavailable
48
+ reason). **Morning Star Workflow layout**: a narrow-column shell bound to the
49
+ sidebar pane's definite height — exactly three zones: the **section nav**
50
+ (任务迭代 / 代理执行 / 事件记录; `data-mstar-tab-nav`), the panel-owned
51
+ **single scroll body** (`[data-mstar-scroll]` — the ONLY `overflow-y`
52
+ element in the panel; nothing scrolls horizontally; `data-mstar-graph`
53
+ rides it), and the pinned **meta dock** (version + harness dir; never
54
+ scrolls). The workspace-state digest (plans ≤5 time-desc + `+N more`,
55
+ open residual findings ≤10 with severity chips + overflow hint, policy
56
+ with **enforcement first** then push / worktree / control worktree,
57
+ leases, knowledge, direction) renders IN FLOW at the end of the scroll
58
+ body, closed by the freshness footer (`snapshot {time} · turn {turn}` —
59
+ the served snapshot's own timestamp + turn, never "live"). The three
60
+ sections stack in the scroll body: the tasks page (iteration head +
61
+ **vertical** 5-step stepper with the FOUR-STATE `current` / `next` /
62
+ `done` / `idle` machine + the branch panel + five stacked status groups
63
+ — the merged「受阻/未知」/「Blocked / Unknown」column kept, `PLAN_CAP`
64
+ render caps + the clickable 「更多」/「收起」 expand button
65
+ (`data-kanban-more`); the projection keeps ALL plan rows — then the
66
+ project rollup), the events page (two partitions — Agent 流转事件 /
67
+ 违规记录 — as flow rows, every row an expandable native `<details>`
68
+ carrying the full catalog fields, missing fields render 「—」 never a
69
+ guessed value), and the agents page — a **vertical grouped list** (the
70
+ react-flow canvas, its SVG edge layer, card ports and pointer pan are
71
+ REMOVED): two Phase groups in constant order (Phase 1 review-edit-chain
72
+ above; Phase 2 sdd-implement → qc-tri → qa-gate below, its label
73
+ annotating the CURRENT plan — `data-agent-group-plan` + `+N more`),
74
+ `sdd-implement` split into implementor / reviewer sub-partitions, the
75
+ `general` bucket sunk into an `unknown` sub-bucket, the full 14-role
76
+ roster as full-width flow rows (idle rows dashed muted — the roster is
77
+ never hidden) with role chip / status point / `×N` count / record line,
78
+ the `N executing · M pending` summary, and the three-entry legend in
79
+ flow below the list; rows carry the projected **emphasis tier**
80
+ (`--mstar-canvas-emphasis-*` chrome alpha mix — never a whole-row
81
+ `opacity`, so the status point + running glow stay opaque), settled
82
+ entities get the standalone GREEN done frame + ✓
83
+ (`data-agent-done="true"`) ONLY when `emphasis ≠ 'off'`; the agents page
84
+ contains zero `<svg>`, zero `data-agent-port` / `data-canvas-*` anchors
85
+ and no pan transform. The **iteration info section is shared by the
86
+ tasks AND agents pages** (one `IterationInfoSection`, both render the
87
+ same `view.iteration` block). Empty branches are explicit states —
88
+ `waiting` / `loading` / `unavailable` (with its reason) / no-harness
89
+ each carry their OWN anchor and copy and render no tabs, no digest and
90
+ no meta dock; no harness renders a CENTERED inactive-state card that
91
+ activates automatically once a harness is detected (inside the same
92
+ single scroll zone). Projection is the pure `projectGraph(source)`
93
+ function (schema constants vs catalog evidence strictly separated; never
94
+ throws; explicit degraded states — muted empty states, never orange warn
95
+ boxes). Refresh follows the session snapshot, no polling — while the
96
+ main agent is ACTIVELY orchestrating, a ledger record (dispatch/settle)
97
+ invalidates the workspace's TTL-cached catalog row so the next pre-step
98
+ rebuilds and (digest text change) re-injects it, and the panel refreshes
99
+ per step (seconds, not the 60 s TTL); while the main agent IDLES the
100
+ panel keeps the LAST snapshot — no live push channel. Bundle served at
101
+ `/plugins/@mstar-harness/dsh/client.js` (closure-factory CJS with NO
102
+ graph library inlined — react-flow removed; the build asserts the bundle
103
+ contains no `xyflow`/`reactflow` markers, no `@deepseek-ai/*` value
104
+ imports, and no `import.meta` / ESM statements — the loader runs plugin
105
+ bundles as classic scripts). Full realized layout detail:
106
+ `packages/dsh/README.md` (§ Web client plugin). **Known limitations**:
107
+ the stepper's Step 1 (iteration-start) IS the current step while the
108
+ steering compass is `status: active` (Phase 1 in flight — catalog
109
+ `compassStatus` field), carrying NO PASS/FAIL badge (Phase 1 has no gate
110
+ verdict); Step 5 (merge-ready) can never be the CURRENT step — the
111
+ engine phase gate only evaluates Phase 2→3→4; the current step follows
112
+ the TTL-refreshed `compassStatus` — up to one catalog interval (60 s)
113
+ behind a mid-session `active`→`locked` flip (bounded, documented
114
+ staleness, never a wrong verdict); the agent-entity status derivation
115
+ pairs a PAIRED settle exactly by its dispatch identity (`agent`, `role`,
116
+ `planId`, `taskId`), and an unpaired dispatch stays `running` (never
117
+ guessed, never faked); with NO steering compass the current-iteration
118
+ filter infers the iteration from plan ids (8-digit date prefix) +
119
+ doneAt — deterministic, documented heuristic, only provably
120
+ cross-iteration events are dropped, no historical back-scan of resumed
121
+ long logs; the sidebar chip title is captured at open time; a docked
122
+ body renders nothing while `tab.visible === false`. Panel acceptance is
123
+ dual-track: in-loop browser harness verification against the rebuilt
124
+ bundle plus user-restart final GUI acceptance.
257
125
 
258
126
  ## Skill loading
259
127
 
@@ -324,10 +192,8 @@ build (`catalogTtlMs`, default 60 s).
324
192
 
325
193
  The plugin records ACTUAL subagent dispatch and real-completion settle events —
326
194
  the evidence of what really happened, distinct from the client-side expected
327
- role flow. The workflow panel's agent-execution zone (the stage/entity
328
- projection — plan `20260810-panel-agent-flow-zone`) and the 事件记录 tab's
329
- `EventLogPage` log page (plan `20260811-panel-event-log`) are pure consumers
330
- of this evidence.
195
+ role flow. The workflow panel's 代理执行 (agents) page and the 事件记录
196
+ tab's `EventLogPage` log page are pure consumers of this evidence.
331
197
 
332
198
  - **Recording point (one core)**: `DshHostAdapter.dispatchGate` is the SINGLE
333
199
  record path behind both dispatch surfaces — the `tools/pre-execute` listener
@@ -355,8 +221,8 @@ of this evidence.
355
221
  summary. A MISSING file reads as the empty view ("no actual dispatches yet"
356
222
  — recording starts at plan merge); an unreadable file is absent evidence;
357
223
  malformed lines are skipped, never fatal.
358
- - **Settle = real completion pairing, never faked** (plan
359
- `20260811-panel-f4-timeliness`): `tools/post-execute` IS part of the
224
+ - **Settle = real completion pairing, never faked**: `tools/post-execute`
225
+ IS part of the
360
226
  verified dsh-tools registry surface (`runPostExecute` dispatches the
361
227
  waterfall for every tool call — verified against the upstream source and
362
228
  pinned by a real-call probe). The pairing listener matches dispatch TOOLS
@@ -386,8 +252,8 @@ of this evidence.
386
252
  top-5 + latest dispatch with HH:MM — the event detail lives in the
387
253
  structured source, never the model text). A ledger record (dispatch/settle)
388
254
  invalidates the affected workspace's TTL cache entry IMMEDIATELY
389
- (apply-scoped `harnessDir → cache key` reverse map + invalidation closure,
390
- plan `20260811-panel-f4-timeliness`) → the next pre-step rebuilds and (digest
255
+ (apply-scoped `harnessDir → cache key` reverse map + invalidation closure)
256
+ → the next pre-step rebuilds and (digest
391
257
  text change) re-injects the row — the 60 s TTL no longer bounds
392
258
  ledger-change latency; it still bounds non-ledger staleness.
393
259
  - **Maintainer view**: change the ledger shape (event schema, bounds, settle
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mstar-harness/dsh",
3
- "version": "3.8.0",
3
+ "version": "3.8.1",
4
4
  "description": "Morning Star harness dsh (DeepSeek Harness) cordis function plugin — in-process engine gates (status/dispatch/lease) with hard refusal channels.",
5
5
  "keywords": [
6
6
  "dsh",
@@ -48,7 +48,8 @@
48
48
  "@deepseek-ai/dsh-client-store",
49
49
  "@deepseek-ai/dsh-client-ui-conversation",
50
50
  "@deepseek-ai/dsh-client-locale",
51
- "@deepseek-ai/dsh-client-connection"
51
+ "@deepseek-ai/dsh-client-connection",
52
+ "@deepseek-ai/dsh-client-ui-sidebar-right"
52
53
  ],
53
54
  "platform": "web"
54
55
  }
@@ -68,67 +69,68 @@
68
69
  },
69
70
  "peerDependencies": {
70
71
  "@deepseek-ai/cordis": "^4.0.2",
71
- "@deepseek-ai/dsh-agent": "^0.1.5-rc.1",
72
- "@deepseek-ai/dsh-agent-default-model": "^0.1.5-rc.1",
73
- "@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.1",
74
- "@deepseek-ai/dsh-api-gateway": "^0.1.5-rc.1",
75
- "@deepseek-ai/dsh-api-remotes": "^0.1.5-rc.1",
76
- "@deepseek-ai/dsh-api-session-controller": "^0.1.5-rc.1",
77
- "@deepseek-ai/dsh-atomic-write": "^0.1.5-rc.1",
78
- "@deepseek-ai/dsh-attachment": "^0.1.5-rc.1",
79
- "@deepseek-ai/dsh-brand": "^0.1.5-rc.1",
80
- "@deepseek-ai/dsh-chunked-list": "^0.1.5-rc.1",
81
- "@deepseek-ai/dsh-client-connection": "^0.1.5-rc.1",
82
- "@deepseek-ai/dsh-client-file-upload": "^0.1.5-rc.1",
83
- "@deepseek-ai/dsh-client-locale": "^0.1.5-rc.1",
84
- "@deepseek-ai/dsh-client-store": "^0.1.5-rc.1",
85
- "@deepseek-ai/dsh-client-ui-chat": "^0.1.5-rc.1",
86
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.1",
87
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.1",
88
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.1",
89
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.1",
90
- "@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.5-rc.1",
91
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.1",
92
- "@deepseek-ai/dsh-code-runtime": "^0.1.5-rc.1",
93
- "@deepseek-ai/dsh-commands": "^0.1.5-rc.1",
94
- "@deepseek-ai/dsh-credentials": "^0.1.5-rc.1",
95
- "@deepseek-ai/dsh-deque": "^0.1.5-rc.1",
96
- "@deepseek-ai/dsh-file-reference": "^0.1.5-rc.1",
97
- "@deepseek-ai/dsh-fs": "^0.1.5-rc.1",
98
- "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.1",
99
- "@deepseek-ai/dsh-invariants": "^0.1.5-rc.1",
100
- "@deepseek-ai/dsh-jobs": "^0.1.5-rc.1",
101
- "@deepseek-ai/dsh-llm": "^0.1.5-rc.1",
102
- "@deepseek-ai/dsh-llm-retry": "^0.1.5-rc.1",
103
- "@deepseek-ai/dsh-native-command": "^0.1.5-rc.1",
104
- "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.1",
105
- "@deepseek-ai/dsh-sandbox-policy": "^0.1.5-rc.1",
106
- "@deepseek-ai/dsh-scope": "^0.1.5-rc.1",
107
- "@deepseek-ai/dsh-session": "^0.1.5-rc.1",
108
- "@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.1",
109
- "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.1",
110
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.5-rc.1",
111
- "@deepseek-ai/dsh-session-query": "^0.1.5-rc.1",
112
- "@deepseek-ai/dsh-session-title": "^0.1.5-rc.1",
113
- "@deepseek-ai/dsh-settings": "^0.1.5-rc.1",
114
- "@deepseek-ai/dsh-skill": "^0.1.5-rc.1",
115
- "@deepseek-ai/dsh-skill-filesystem": "^0.1.5-rc.1",
116
- "@deepseek-ai/dsh-storage": "^0.1.5-rc.1",
117
- "@deepseek-ai/dsh-storage-domain": "^0.1.5-rc.1",
118
- "@deepseek-ai/dsh-subagent": "^0.1.5-rc.1",
119
- "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.1",
120
- "@deepseek-ai/dsh-timeout": "^0.1.5-rc.1",
121
- "@deepseek-ai/dsh-tool-subagent": "^0.1.5-rc.1",
122
- "@deepseek-ai/dsh-tool-todo": "^0.1.5-rc.1",
123
- "@deepseek-ai/dsh-tools": "^0.1.5-rc.1",
124
- "@deepseek-ai/dsh-typert-protocol": "^0.1.5-rc.1",
125
- "@deepseek-ai/dsh-typert-registry": "^0.1.5-rc.1",
126
- "@deepseek-ai/dsh-user-approval": "^0.1.5-rc.1",
127
- "@deepseek-ai/dsh-util-crypto": "^0.1.5-rc.1",
128
- "@deepseek-ai/dsh-util-time": "^0.1.5-rc.1",
129
- "@deepseek-ai/dsh-util-values": "^0.1.5-rc.1",
130
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.5-rc.1",
131
- "@deepseek-ai/dsh-workspace": "^0.1.5-rc.1",
72
+ "@deepseek-ai/dsh-agent": "^0.1.5-rc.2",
73
+ "@deepseek-ai/dsh-agent-default-model": "^0.1.5-rc.2",
74
+ "@deepseek-ai/dsh-agent-presets": "^0.1.5-rc.2",
75
+ "@deepseek-ai/dsh-api-gateway": "^0.1.5-rc.2",
76
+ "@deepseek-ai/dsh-api-remotes": "^0.1.5-rc.2",
77
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.5-rc.2",
78
+ "@deepseek-ai/dsh-atomic-write": "^0.1.5-rc.2",
79
+ "@deepseek-ai/dsh-attachment": "^0.1.5-rc.2",
80
+ "@deepseek-ai/dsh-brand": "^0.1.5-rc.2",
81
+ "@deepseek-ai/dsh-chunked-list": "^0.1.5-rc.2",
82
+ "@deepseek-ai/dsh-client-connection": "^0.1.5-rc.2",
83
+ "@deepseek-ai/dsh-client-file-upload": "^0.1.5-rc.2",
84
+ "@deepseek-ai/dsh-client-locale": "^0.1.5-rc.2",
85
+ "@deepseek-ai/dsh-client-store": "^0.1.5-rc.2",
86
+ "@deepseek-ai/dsh-client-ui-chat": "^0.1.5-rc.2",
87
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.5-rc.2",
88
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.2",
89
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.2",
90
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.2",
91
+ "@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.5-rc.2",
92
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "^0.1.5-rc.2",
93
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.2",
94
+ "@deepseek-ai/dsh-code-runtime": "^0.1.5-rc.2",
95
+ "@deepseek-ai/dsh-commands": "^0.1.5-rc.2",
96
+ "@deepseek-ai/dsh-credentials": "^0.1.5-rc.2",
97
+ "@deepseek-ai/dsh-deque": "^0.1.5-rc.2",
98
+ "@deepseek-ai/dsh-file-reference": "^0.1.5-rc.2",
99
+ "@deepseek-ai/dsh-fs": "^0.1.5-rc.2",
100
+ "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.2",
101
+ "@deepseek-ai/dsh-invariants": "^0.1.5-rc.2",
102
+ "@deepseek-ai/dsh-jobs": "^0.1.5-rc.2",
103
+ "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
104
+ "@deepseek-ai/dsh-llm-retry": "^0.1.5-rc.2",
105
+ "@deepseek-ai/dsh-native-command": "^0.1.5-rc.2",
106
+ "@deepseek-ai/dsh-sandbox": "^0.1.5-rc.2",
107
+ "@deepseek-ai/dsh-sandbox-policy": "^0.1.5-rc.2",
108
+ "@deepseek-ai/dsh-scope": "^0.1.5-rc.2",
109
+ "@deepseek-ai/dsh-session": "^0.1.5-rc.2",
110
+ "@deepseek-ai/dsh-session-persistence": "^0.1.5-rc.2",
111
+ "@deepseek-ai/dsh-session-projection": "^0.1.5-rc.2",
112
+ "@deepseek-ai/dsh-session-projection-cache": "^0.1.5-rc.2",
113
+ "@deepseek-ai/dsh-session-query": "^0.1.5-rc.2",
114
+ "@deepseek-ai/dsh-session-title": "^0.1.5-rc.2",
115
+ "@deepseek-ai/dsh-settings": "^0.1.5-rc.2",
116
+ "@deepseek-ai/dsh-skill": "^0.1.5-rc.2",
117
+ "@deepseek-ai/dsh-skill-filesystem": "^0.1.5-rc.2",
118
+ "@deepseek-ai/dsh-storage": "^0.1.5-rc.2",
119
+ "@deepseek-ai/dsh-storage-domain": "^0.1.5-rc.2",
120
+ "@deepseek-ai/dsh-subagent": "^0.1.5-rc.2",
121
+ "@deepseek-ai/dsh-system-prompt": "^0.1.5-rc.2",
122
+ "@deepseek-ai/dsh-timeout": "^0.1.5-rc.2",
123
+ "@deepseek-ai/dsh-tool-subagent": "^0.1.5-rc.2",
124
+ "@deepseek-ai/dsh-tool-todo": "^0.1.5-rc.2",
125
+ "@deepseek-ai/dsh-tools": "^0.1.5-rc.2",
126
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.5-rc.2",
127
+ "@deepseek-ai/dsh-typert-registry": "^0.1.5-rc.2",
128
+ "@deepseek-ai/dsh-user-approval": "^0.1.5-rc.2",
129
+ "@deepseek-ai/dsh-util-crypto": "^0.1.5-rc.2",
130
+ "@deepseek-ai/dsh-util-time": "^0.1.5-rc.2",
131
+ "@deepseek-ai/dsh-util-values": "^0.1.5-rc.2",
132
+ "@deepseek-ai/dsh-util-workspace-path": "^0.1.5-rc.2",
133
+ "@deepseek-ai/dsh-workspace": "^0.1.5-rc.2",
132
134
  "@deepseek-ai/schemastery": "^3.18.1"
133
135
  },
134
136
  "publishConfig": {