@mstar-harness/dsh 3.7.3 → 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 +127 -189
- package/README.zh.md +14 -12
- package/bundle/README.md +84 -165
- package/dist/client/index.d.ts +22 -7
- package/dist/client/panel/MstarPanelTitle.d.ts +13 -0
- package/dist/client/panel/PanelView.d.ts +75 -49
- package/dist/client/panel/TabNav.d.ts +17 -14
- package/dist/client/panel/definition.d.ts +23 -0
- package/dist/client/panel/engine-status-client.d.ts +187 -0
- package/dist/client/panel/graph/project-graph.d.ts +13 -55
- package/dist/client/panel/graph/schema.d.ts +1 -2
- package/dist/client/panel/guards.d.ts +52 -3
- 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-meta.d.ts +2 -2
- package/dist/client/panel/panel-store.d.ts +28 -0
- package/dist/client/panel/sidebar.d.ts +12 -7
- package/dist/client/panel/state-section.d.ts +2 -2
- package/dist/client/panel/use-mstar-engine-status.d.ts +105 -32
- package/dist/client/panel/zones/Legend.d.ts +5 -3
- package/dist/client/panel/zones/TaskBoard.d.ts +13 -9
- package/dist/client.js +1017 -1236
- package/dist/engine-status-endpoint.d.ts +154 -0
- package/dist/engine-status-store.d.ts +190 -0
- package/dist/engine-status-wire.d.ts +29 -0
- package/dist/gates/_shared.d.ts +9 -0
- package/dist/gates/catalog.d.ts +8 -8
- package/dist/gates/system-prompt.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +528 -94
- package/dist/types.d.ts +40 -19
- package/harness-skills/mstar-artifacts/references/status-and-residuals.md +1 -1
- package/harness-skills/mstar-host/references/dsh.md +94 -219
- package/package.json +67 -63
- package/dist/client/panel/pages/AgentCanvasPage.d.ts +0 -345
package/README.zh.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) | 中文
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|
|
|
7
|
-
让 [Morning Star](https://github.com/btspoony/mstar-harness) 成为一等公民的 dsh(DeepSeek Harness)宿主——一个 cordis 函数插件,将 mstar engine 进程内挂载,实现 engine `HostAdapter`(`host: 'dsh'`),守护 `{HARNESS_DIR}/status.json` 写入(校验 + 咨询;hard 下按修复逃生放行),在 `Enforcement: hard` 开启时阻止被禁止的 subagent 派发,对挂载技能根下的 `SKILL.md` 写入执行技能撰写 lint,通过 dsh skill-filesystem 提供者挂载 mstar `skills/` 镜像(单一规范挂载),并向每个组合后的 agent 步骤追加一条持久化的 `mstar-engine
|
|
7
|
+
让 [Morning Star](https://github.com/btspoony/mstar-harness) 成为一等公民的 dsh(DeepSeek Harness)宿主——一个 cordis 函数插件,将 mstar engine 进程内挂载,实现 engine `HostAdapter`(`host: 'dsh'`),守护 `{HARNESS_DIR}/status.json` 写入(校验 + 咨询;hard 下按修复逃生放行),在 `Enforcement: hard` 开启时阻止被禁止的 subagent 派发,对挂载技能根下的 `SKILL.md` 写入执行技能撰写 lint,通过 dsh skill-filesystem 提供者挂载 mstar `skills/` 镜像(单一规范挂载),并向每个组合后的 agent 步骤追加一条持久化的 `mstar-engine` catalog 行(持久化日志的读取方也接受旧标识 `mstar-engine-status`)。随 dsh Loader 应用启动;一切均通过 seam 的拒绝/咨询通道行使职责,从不改动工具本身。
|
|
8
8
|
|
|
9
9
|
## Usage
|
|
10
10
|
|
|
@@ -71,7 +71,7 @@ dsh plugin --profile headless add @mstar-harness/dsh
|
|
|
71
71
|
| `rolePersonas` | `Record<string, string>` | 未设置(打包镜像默认) | mstar 角色 id(`Execute as`)→ persona 文本;原生 subagent persona 通道的**覆盖**来源——角色匹配的 start(一次性 `start` 或可选的 continuable `startContinuable`)会把 persona 合入原生请求的 `persona` 槽(子会话体现角色 persona 而**非**部署 persona;持久化并在 resume 时重放)。合并次序:请求自身已携带 `persona` 时**原样生效**(调用方意图绝不被覆盖——不做角色合并);否则非空条目优先于打包的 `harness-agents/` 镜像默认值,**空字符串**条目视为未设置并回落到镜像默认值,无条目时使用镜像默认值(见 LLM fallbacks integration)。 |
|
|
72
72
|
| `skillRoots` | `string[]` | 未设置(不注册自定义根) | 向 dsh skill-filesystem 提供者注册的额外技能根(`customSkillDirs` 语义——先于用户根扫描)。开发期:镜像 `<repo-root>/skills` 的绝对路径。 |
|
|
73
73
|
| `bundledSkillDir` | `string` | 打包的 `harness-skills/` 镜像(包相对路径) | 向 dsh skill-filesystem 提供者注册的打包技能根(`bundledSkillDir` 语义——最后扫描、受信任)。默认取包内自带的 `harness-skills/` 镜像(`bundle-assets` 同步;gitignore)——包相对路径,**非** cwd 锚定。显式值优先。 |
|
|
74
|
-
| `catalogTtlMs` | `number` | `60000` | pre-step catalog 缓存刷新间隔(毫秒):按工作区缓存的统一 `mstar-engine
|
|
74
|
+
| `catalogTtlMs` | `number` | `60000` | pre-step catalog 缓存刷新间隔(毫秒):按工作区缓存的统一 `mstar-engine` 行(水印 + 迭代闸门 + 工作区摘要)多久重读一次 `status.json` / compass / 知识索引。刷新间隔之间热路径只是时间戳比较 + Map 命中;会话中 plan/compass/residual 的变化会在一个间隔内落地。 |
|
|
75
75
|
| `workflowGate` | `'off' \| 'warn' \| 'ask' \| 'hard'` | `'warn'` | workflow/ralph 闸门模式(见 Gates → Workflow / ralph gate)。`off` = 直通且不产生 verdict 行;`warn` = 仅咨询;`ask` = 首见名字走审批瀑布(P-c);`hard` = 策略违规在任何子进程启动前否决。默认 `warn` 不改任何 hard 行为——除非部署显式选入 `ask`/`hard`,闸门仅咨询。 |
|
|
76
76
|
| `workflowNames` | `string[]` | 未设置 | workflow 名字白名单(P-a):被闸门视为 KNOWN 的 `meta.name` 值。为空或缺省 ⇒ **每个**名字都 unknown(有文档——闸门**绝不**因缺省而"全放行")。ralph 调用不携带 `meta.name`——P-a 对其永不适用。 |
|
|
77
77
|
|
|
@@ -98,7 +98,7 @@ profile bundle 组合出以下行——注册表行来自 `@deepseek-ai/dsh-base
|
|
|
98
98
|
- **seam lint**——harness 下 `DESIGN.md` / audit plan / 知识文档 / roles 目录的写入运行各自的 artifact 级 engine lint。
|
|
99
99
|
- **模型可见工具**——`mstar_sdd_workspace`、`mstar_sdd_task_brief`、`mstar_iteration_gate`、`mstar_design_md_validate`、`mstar_audit_validate`、`mstar_compound_validate`、`mstar_roles_validate` 注册到 `ctx.tools`。`mstar_iteration_gate` 镜像改用 v3 输入 `snapshot_path`(`{HARNESS_DIR}/workflows/<id>/snapshot.json`——镜像 `mstar iteration gate --workflow <id>`;旧的根 `status_path` 输入随 v1 读取路径移除)。
|
|
100
100
|
- **bundled 命令**——向 `ctx.commands` 注册 `/iteration-start`、`/iteration-drive`、`/iteration-loop`、`/codebase-audit`(来自打包的 `harness-commands/` 镜像;每条声明 frontmatter `input` hint,使 web 客户端 claim `/name ` 并等待用户后续输入而非立即执行;handler 把命令正文 + 用户输入 steer 进接收 agent)。
|
|
101
|
-
- **pre-step catalog 行**——每个组合后的 agent 步骤都会追加**一条**统一的 `mstar-engine
|
|
101
|
+
- **pre-step catalog 行**——每个组合后的 agent 步骤都会追加**一条**统一的 `mstar-engine` catalog 消息:水印(统一 mstar 版本、harness 目录、enforcement)、迭代相位闸门段(解析到 steering compass 时)与工作区状态摘要段(工作区有 `status.json` 时:plan 注册表、open residual、分支/政策锚点、活跃 lease、知识摘要、compass 方向)。该行是 digest 门控的(每 turn 注入一次、变化时才重发),并共享一次按工作区 TTL 缓存的构建(`catalogTtlMs`,默认 60 秒)。
|
|
102
102
|
|
|
103
103
|
### Enforcement semantics
|
|
104
104
|
|
|
@@ -232,7 +232,7 @@ mstar 技能通过 dsh skill-filesystem 提供者以**单一规范挂载**接入
|
|
|
232
232
|
| host(resolveSkillRoot、HostAdapter) | engine host.ts 检测行 + 插件适配器(`host: 'dsh'`) | 已交付(P2) |
|
|
233
233
|
| skill-authoring(lintFrontmatter、lintFiveQuestion) | skill-filesystem 根 + 对 SKILL.md 的 `fs/write-intent` | 已交付(P2) |
|
|
234
234
|
| lint(lintSkillFrontmatter、planQualityBar、assertSddTddTriple) | 未接线——plan/tdd 的 fs 闸门为延后项;`lintSkillFrontmatter` 仅运行于 skills-mount 测试套件 | 延后 |
|
|
235
|
-
| agent catalog |
|
|
235
|
+
| agent catalog | 一方 `plugin` catalog source(锚点)+ `/api/mstar/engineStatus` 快照读取(模型可见 ⟺ 已记录) | 已交付(P2) |
|
|
236
236
|
| sdd(sddWorkspace、taskBrief) | 注册在 `ctx.tools` 上的 `defineTool` 包装 | 已交付(P3) |
|
|
237
237
|
| iteration(evaluatePhaseGate、parseCompassFrontmatter) | `agent/pre-step` + iteration 闸门 | 已交付(P3) |
|
|
238
238
|
| worktree(l1PreDispatchCheck、l2PreDispatchCheck) | `tools/pre-execute` L1/L2(派发闸门内) | 已交付(P3) |
|
|
@@ -240,7 +240,7 @@ mstar 技能通过 dsh skill-filesystem 提供者以**单一规范挂载**接入
|
|
|
240
240
|
|
|
241
241
|
## Engine-status catalog
|
|
242
242
|
|
|
243
|
-
一个咨询式 `agent/pre-step` 瀑布监听器向每个组合后的步骤追加**一条** **`mstar-engine
|
|
243
|
+
一个咨询式 `agent/pre-step` 瀑布监听器向每个组合后的步骤追加**一条** **`mstar-engine`** catalog MessageSource——一方 `plugin` 臂,即恰好 `{ kind: 'plugin', plugin: 'mstar-engine', form: 'catalog' }`、**不含任何其它成员**(镜像 dsh tool-skill 先例):模型可见的 `<mstar_engine_status>` 块渲染水印字段——**mstar 版本**(插件自身清单;单一版本不变量把打包的 engine 钉在同一版本)、**harness 目录**(解析后的 `{HARNESS_DIR}`,缺失为 `none`)、**enforcement**(compass 模式,`soft` / `hard (compass)`)——以及 **迭代相位闸门段**(当 steering compass + `status.json` 可解析时:迭代 id、transition、all-plans-done、闸门判定 + 违规码——即 `mstar iteration gate` 工具结果形态)与 **工作区状态摘要段**(当工作区有 `status.json` 时):**plans**(`id(status)` 注册表)、**residuals**(按 severity 的 open 计数)、**branch**(base → target、spec 集成)、**policy**(push 政策、worktree 模式、control 根)、**leases**(活跃 plan 执行租约:持有者 + worktree)、**knowledge**(知识索引文档数与分类)与 **direction**(steering compass 的 problem statement 一句话)。监听器先调用 `next()` 并基于委托后的决策追加——从不否决步骤、从不替换已组合的消息。模型可见 ⟺ 已记录:持久化的 source 不携带任何事实——该行是持久化的**锚点**,其**实际发出**的 payload 在同一次 digest 门控发射时按会话快照到 `{HARNESS_DIR}/snapshots/engine-status.json`,因此「会话日志 + 该存储」无需重新解析该块即可重建该行(dsh packages/AGENTS.md)。任何已发布的会话格式边界都不接受 message source 上的多余成员,故 `source` 上永远只写 `plugin` 臂。**锚点标识(更名,带读兼容)**:发出的 `plugin` 值为 `mstar-engine`(原 `mstar-engine-status`);更名前已发布构建发出的行在已写入的会话日志中持久化旧标识,面板的锚点读取方把 `mstar-engine` 与 `mstar-engine-status` **都**视作本插件的一方臂——任何其它 `plugin` 值都不是锚点,会话降级为显式 `waiting` 态(绝不猜测数据)。工作流面板通过宿主共享的 `/api` typert 网关按需读取该快照:**路由由宿主网关持有**(插件无法注册路由;`connection.rpc.handle` 的普通信道会经由调用 fiber 上的 `webServer` 挂载、并使本行的 boot 挂起——本包刻意不走该机制),本包只经可选 `ctx.typert.register(...)` 子单元贡献 `mstar/engineStatus` 端点描述符。浏览器半体调用 `connection.rpc.call('/api', 'mstar/engineStatus', { args: { sessionId, cwd } })`,得到该会话自己的已存快照,或带原因的显式 `unavailable`(绝不返回其它会话的数据、绝不静默空字段)。**信任边界,如实说明:**该端点自身不做任何鉴权——传输层围栏(host/origin + 浏览器鉴权)只证明调用方是本宿主自己服务的页面,因此*持有 `(sessionId, cwd)` 组合 + 能访问本机 `/api` 网关即为能力*。应答按**请求**限定:查询以被断言的 id 为键,存储记录的 `cwd` 必须同时等于断言值与服务端解析出的会话 `cwd`,客户端在渲染前还会复核回显的 id 与工作区——因此一个会话的请求绝不会被返回另一个会话的记录。payload 是工作区摘要(版本、harness 目录、enforcement、plan/residual/lease 计数),面板自身的会话记录本就暴露这些信息;它不被当作机密,而不同的 `unavailable` 原因会让该端点对已持有 id 的调用方成为一个弱的「会话是否存在」探针。fiber 销毁即移除监听器(HMR 安全)。
|
|
244
244
|
|
|
245
245
|
该行是 **digest 门控**的:按 agent+workspace,每个 turn 只注入一次,仅当渲染文本变化时重新注入——20 步的 turn 只显示一次 catalog,而不是 20 次。source 共享**同一**按工作区缓存条目:显式 `harnessDir` 时在 boot 构建(否则在工作区首次 pre-step 构建),并按 TTL 刷新(`catalogTtlMs`,默认 60 秒)——刷新间隔之间热路径只是时间戳比较 + Map 命中,会话中 plan/compass/residual 的变化在一个间隔内落地。
|
|
246
246
|
|
|
@@ -274,11 +274,13 @@ agent-flow 账本——`{HARNESS_DIR}/agent-flow.jsonl`,即 catalog 的 `state
|
|
|
274
274
|
|
|
275
275
|
本包为 dsh **web** profile 提供浏览器客户端半体,在**已安装的 `mstar` bundle 行**上被自动发现(package.json 的 `dsh.client` 声明 + `exports["./client"]` → `dist/client.js`——上游 web `dsh.client` 发现逻辑扫描 loader entries,并把每个客户端的 `exports["./client"]` 解析进 boot 图)——**无需独立 profile 层或安装步骤**(spec §6.1)。web 应用在 `/plugins/@mstar-harness/dsh/client.js` 提供该 bundle,并经 closure-factory loader 握手加载(`window.__ModuleLoader__.load({ id, factory })`)。
|
|
276
276
|
|
|
277
|
-
|
|
277
|
+
客户端入口经公开的两段式席位契约把面板注册为**右 Sidebar 页签类型**:`ctx.sidebarRightTabs.register(definition)`——`id: '@mstar-harness/dsh'`、`kind: 'mstar-workflow'`(页类型——无 `patterns`/`canOpen`/`priority`,按 kind 打开)、跟随 locale 的 `title()` thunk,以及**恰好一个引导页 capsule**(`order: 20`,描述 + MStar glyph 图标)——点选 capsule 会在该 pane 的槽位打开面板(替换引导页签、展开侧栏),再次点选聚焦既有页签(宿主页去重规则)——不自动打开、不重复表面。旧 **`conversation.view`** view-ring 页签**已移除**(迁移,而非第二表面):sidebar 页签取代会话区页签。面板体与其 chip 标题在同一 id 下注册为 keyed 席位(`sidebar.right.pane.tab` + `sidebar.right.pane.tab.title`;chip 为 glyph + 打开时捕获的标题——不跟随会话中途的语言切换)。`tab.visible === false`(列折叠或同 pane 其它页签激活)时面板体**不渲染任何内容**(无投影、无 DOM),选中分区存放在按页签记录键控的 entry slot store 中,因此能在 docked 面板体卸载后存活。文案来自 `mstar-panel` locale 命名空间:**"启明星工作流"**(zh)/ **"Morning Star Workflow"**(en)。
|
|
278
278
|
|
|
279
|
-
|
|
279
|
+
面板是最新 catalog 快照(取自宿主 `/api/mstar/engineStatus` 端点——刷新跟随拉取,不轮询)的纯渲染:**窄列布局**为绑定 sidebar pane 确定高度的单列 flex,恰好三个分区——**分区导航**(任务迭代 / 代理执行 / 事件记录,flex: none)、面板自有的**唯一滚动主体**(`[data-mstar-scroll]`——面板内**唯一** `overflow-y` 元素;任何元素都不横向滚动;`data-mstar-graph` 随其上)、钉住的 **meta 小面板**(版本 + harness 目录;永不滚动)。工作区状态摘要(计划 ≤5 时间倒序 + `+N more`、未决残留 findings ≤10 带 severity chip、策略 **enforcement 首位** + push / worktree / control worktree、租约、知识、方向)以流内内容位于滚动主体末尾——固定 300px 兄弟列及其嵌套滚动器已删除——新鲜度 footer(`last-updated HH:MM:SS` + turn)收尾滚动主体。宿主 composer-overlay opt-in 不再需要(sidebar pane 体本就是确定高度盒),过时的视口媒体查询已删除:壳层携带 `container-type: inline-size`,宽度规则为**容器查询**——容器宽 480px 以下内距与分组间距收紧(300px 下限的紧凑节奏);≥720px 共享分组网格铺开为两列(`repeat(auto-fit, minmax(280px, 1fr))`)——这是任何宽度带来的**唯一**结构变化(一份 DOM、一棵树;无 JS 布局测量)。缺失字段显式降级为空态/最后已知态(muted,绝无橙色 warn 框);`waiting` 保留 muted hint;无 harness 时渲染居中未激活态卡片,检测到后自动呈现。
|
|
280
280
|
|
|
281
|
-
|
|
281
|
+
三个分区在唯一滚动主体内堆叠。**任务迭代**渲染迭代头部(未激活时为折叠摘要)+ **竖直** 5 步 stepper(每步一行——徽标 · 相位 · chip · 预留 verdict 席位;保留四态 `current` / `next` / `done` / `idle` 状态机:current 之前的步骤投影为 `done`「已完成」,`next` 为唯一前向目标,`idle` 仅为 schema 余项;steering compass 为 `status: active` 时 Step 1 即当前步——无 PASS/FAIL 徽标——Step 5 永远不会是当前步)+ 分支面板(迭代 base / 目标 / spec 集成分支,仅激活时渲染)+ 计划板为**五个竖排状态组**(恒定顺序——Todo / InProgress / InReview / Done / 合并的「受阻/未知」/「Blocked / Unknown」列),每 `data-kanban-column` / `data-kanban-arrow` / `data-kanban-count` 锚点全保留;每组渲染行数以 `PLAN_CAP` 封顶,超限显示可点击「更多」/「收起」展开按钮(`data-kanban-more`)展开全量(投影保留全部 plan 行——封顶只是渲染关注点,绝不丢弃)——随后是项目 rollup。**事件记录**把两个分区(Agent 流转事件 / 违规记录)渲染为流内容——每条可展开原生 `<details>` 呈现完整 catalog 字段(缺失显示「—」,绝不捏造;workflow 行保留 name / 成员数 / stop-reason 字段),无分区自有滚动器。**代理执行**把 agents 渲染为**竖直分组列表**——绝对定位画布连同 SVG 连线层、卡片端口与指针 pan **已删除**:两个 Phase 组恒定顺序,Phase 1(`iteration-start`——顺序完成的 Review & Edit 链:product-manager → architect → writing-specialist)在上,Phase 2(`autonomous-execute`——循环迭代 plans;其组标签标注**当前 plan**:投影 `activePlanId`(`data-agent-group-plan`),多个进行中 → `+N more`(`data-agent-group-plan-more`),无 → 灰字「无进行中 plan」(`data-agent-group-no-plan`))在下;每个 Phase 组竖排其 stage 组——`sdd-implement` 拆为上方 **implementor** 分区(flow 角色 fullstack-dev / fullstack-dev-2 / frontend-dev 按 flow 序,随后 on-demand 角色 ops-engineer / prompt-engineer,带虚线**按需徽标**)与下方 **reviewer** 分区(code-reviewer),`general` 桶下沉到最后一个 stage 组底部的 `unknown` 子桶、仅有成员时渲染;每个 stage 组把完整 14 角色 roster 渲染为**全宽流行(flow row)**(idle 行虚线 muted——roster 永不隐藏),带 role chip / 状态点 / `×N` 计数 / 记录行(session id · 任务标签——辅助字段,绝不作标题),头部为 `N 执行中 · M 待执行` 摘要(`data-agent-summary-*`),三态图例以流内形式位于列表下方。行携带投影**透明度分级**:`emphasis: 'current' | 'next' | 'off' | null`——当前阶段角色 **100%** chrome 强度、后续阶段预期角色 **75%**、已过阶段 / 无阶段角色(on-demand、general)**45%**,`null`(无迭代 / transition 不可解析)**不覆盖**——恒为 chrome **alpha 混合**(`--mstar-canvas-emphasis-*` token;绝不整行 `opacity`,状态点与 running 辉光保持不透明)。已结算实体带**独立绿色完成框 + 绿 ✓**(`data-agent-done="true"`——圆角行体 success 边框 + 1px ring + 状态点绿 ✓,全强度 evidence 态)——**仅当 `emphasis ≠ 'off'`**;off 档角色显示灰字圆点、**绝不显示完成标记**。代理执行页含**零** `<svg>` 元素、零 `data-agent-port` / `data-canvas-*` 锚点、无 pan 变换。派发证据仍只投影**当前迭代的 plans**(steering compass `iterationId` 活跃时取之,否则经 catalog `plans[].iterationRefs` 推导最近迭代);可证明跨迭代的事件不产生实体——roster 常驻 idle 卡,无 plan / 未知 plan / 独立 plan 的派发绝不隐藏。状态诚实:`advisory` **不再终态**——软执法派发落到配对 settle(有 settle 绿 ✓ 已完成、无 settle 显示执行中),`denied` 仍为终态,advisory verdict 仍在事件记录页呈现。**迭代信息 Section 由任务迭代与代理执行两页共用**——单一 `IterationInfoSection` 组件,两页渲染同一 `view.iteration` 块(摘要 + steps + 分支)。投影为纯函数 `projectGraph(source)`(schema 常量与 catalog 证据严格分离;永不 throw)。
|
|
282
|
+
|
|
283
|
+
**依赖**:面板客户端 bundle **不携带任何图库**——`@xyflow/react` devDependency(此前构建期内联进 `dist/client.js`)随 react-flow 渲染层一并移除,唯一消费者是 `@xyflow/react/dist/style.css` 的 plain-`.css` text loader 也已删除(`CLIENT_EXTERNALS` 不变——react / react-dom 与 `@deepseek-ai/dsh-client-*` 平台模块保持外部)。构建脚本端到端断言移除成立:产物**不得含 `xyflow`/`reactflow` 标记**、`@deepseek-ai/*` 值导入为 0、**无 `import.meta` / ESM 语句**——web loader 以**经典 `<script>`** 执行插件 bundle,字面 `import.meta` 是 parse-time SyntaxError(zustand v4 的 `import.meta.env` 读取已在构建期 define 消除;见本迭代 install-verification guide §6)。当前 bundle 体积:**145,159 B raw / 29,460 B gzip**(以各迭代 install-verification guide 为重新测量 SSOT——react-flow 移除后缩至约 85 KB,代理执行页实体渲染落地后回升,透明度分级样式后再度增长)。
|
|
282
284
|
|
|
283
285
|
安装 / 验证(客户端半体与服务器半体走同一条 bundle 行安装):
|
|
284
286
|
|
|
@@ -292,7 +294,7 @@ dsh web # 启动 → 服务 /plugins/@mstar-harness/dsh/clie
|
|
|
292
294
|
|
|
293
295
|
本地已验证(install-verification guide):boot 图包含客户端 entry(`@mstar-harness/dsh` 携声明的 inject 面)、`/plugins/<id>/client.js` 路由服务的正是构建产物(rev = 内容 sha1)、浏览器握手 materialize 出插件入口(`inject` + `apply` + CSS 注入,经典脚本语义)——见 panel-beautify 迭代的 `install-verification.md` guide(本地 harness root)。
|
|
294
296
|
|
|
295
|
-
**Known Limitations**(本迭代):迭代 stepper 的 Step 1(iteration-start)在 steering compass `status: active`(Phase 1 进行中——catalog `compassStatus` 字段)时为**当前步**,且不携带 PASS/FAIL 徽标(Phase 1 无 gate 判定);Step 5(merge-ready)**永远不会是当前步**——engine 相位门只评估 Phase 2→3→4(merge-ready 从不是 gate transition);仅当 Step 4(pr-delivery)为当前步时渲染 `next`,其余为 idle;当前步跟随 TTL 刷新的 `compassStatus`——会话中途 `active`→`locked` 翻转后最多落后一个 catalog 间隔(60 秒)(有界、已记录的陈旧;绝不给出错误判定);代理实体状态按**精确配对**派生(paired settle 携带的 `(agent, role, planId, taskId)` 标识精确配对到对应派发——QC tri N=3 并发下各卡各自结算;未配对派发保持 running,绝不捏造);无 steering compass 时的「当前迭代」过滤按 plan id(8 位日期前缀)+ doneAt 推导迭代——确定性、已记录的启发式,且只丢弃可证明跨迭代的事件);不回溯 resumed 长日志的历史行(服务端每 turn 首步必重发,digest
|
|
297
|
+
**Known Limitations**(本迭代):迭代 stepper 的 Step 1(iteration-start)在 steering compass `status: active`(Phase 1 进行中——catalog `compassStatus` 字段)时为**当前步**,且不携带 PASS/FAIL 徽标(Phase 1 无 gate 判定);Step 5(merge-ready)**永远不会是当前步**——engine 相位门只评估 Phase 2→3→4(merge-ready 从不是 gate transition);仅当 Step 4(pr-delivery)为当前步时渲染 `next`,其余为 idle;当前步跟随 TTL 刷新的 `compassStatus`——会话中途 `active`→`locked` 翻转后最多落后一个 catalog 间隔(60 秒)(有界、已记录的陈旧;绝不给出错误判定);代理实体状态按**精确配对**派生(paired settle 携带的 `(agent, role, planId, taskId)` 标识精确配对到对应派发——QC tri N=3 并发下各卡各自结算;未配对派发保持 running,绝不捏造);无 steering compass 时的「当前迭代」过滤按 plan id(8 位日期前缀)+ doneAt 推导迭代——确定性、已记录的启发式,且只丢弃可证明跨迭代的事件);不回溯 resumed 长日志的历史行(服务端每 turn 首步必重发,digest 门控);sidebar chip 标题在打开时捕获(会话中途切换语言不会翻转它——为与一方 chip 的 glyph 形态对齐而接受);列折叠或同 pane 其它页签激活时(`tab.visible === false`)面板体不渲染任何内容(无投影、无 DOM、隐藏期零快照开销)。面板验收为双轨:in-loop 浏览器 harness 验证(对重建 bundle)+ 用户重启后 GUI 终验——重跑步骤见 install-verification guide §8。
|
|
296
298
|
|
|
297
299
|
## Development
|
|
298
300
|
|
|
@@ -314,7 +316,7 @@ bun run build
|
|
|
314
316
|
|
|
315
317
|
#### What the model sees
|
|
316
318
|
|
|
317
|
-
每个组合后的步骤携带一条 `mstar-engine
|
|
319
|
+
每个组合后的步骤携带一条 `mstar-engine` catalog 用户消息(`<mstar_engine_status>` 水印块——见 Engine-status catalog 一节)。闸门决策额外添加:派发否决以注册表物化的 `PreToolDecision { kind: 'deny', reason }` 错误呈现;状态闸门以 `mstar/status-gate` 咨询呈现(告警放行、hard 修复逃生或降级放行);派发闸门以 `mstar/dispatch-gate` 咨询呈现(告警放行或降级);技能 lint 闸门以 `mstar/skill-lint` 咨询呈现(告警放行、hard 修复逃生或降级放行)。每条模型可见的行都能从会话日志重建(catalog 形态 source + 咨询事件)。
|
|
318
320
|
|
|
319
321
|
**Leaf 交付纪律(PM 2026-08-12)**:leaf 子代理在**最终(closing)消息**中交回完成报告,**不**通过 `report` 工具交付——dsh tool-subagent-report 默认 `reportDelivery: quiet` 会把报告投递到父代理的 next-step 队列,父代理 turn 结束(无 step 边界)后报告会滞留队列。closing 消息是可靠交付通道;`report` 保留给「中途发现、需要父代理改变下一步」的发现(SSOT:`skills/mstar-host/references/dsh.md` → PM dispatch)。
|
|
320
322
|
|
|
@@ -349,7 +351,7 @@ catalog 行在委托之后追加到组合步骤消息的**末尾**——请求
|
|
|
349
351
|
- **CLI `HOST_SIGNALS` 缺少 `subagent` token**——engine `ToolSignal` 联合已包含它且 `detectHost` 能处理,但 `packages/cli` 的 `HOST_SIGNALS` 尚未更新,`mstar host detect --signals subagent` 会拒绝,直到上游化时更新 CLI 列表。
|
|
350
352
|
- **入口是 `src/gates/*` 之上的模块索引**——拆分已交付:`src/index.ts` 从各 gate 模块(`_shared` / `status` / `skill-lint` / `seams` / `dispatch` / `catalog` / `tools` / `adapter`)原样 re-export 冻结的 56 名导出面(31 值导出 + 25 type-only 名;`Config` 计一次),并保留插件 manifest、单一 cordis augmentation 点、命令注册与 `apply()` 启动接线。导出面由 `tests/export-surface.spec.ts` 冻结——运行时值导出集 + `typecheck:tests`(`bunx tsc --noEmit -p tests/tsconfig.json`)下的值命名空间恒等与逐名类型探测。
|
|
351
353
|
- **engine dsh 行待上游化**——engine `host.ts` 的 dsh 改动(`DetectResult`、`ToolSignal`、`resolveSkillRoot`)位于 mstar-workflow engine 镜像,计划经用户授权的上游 PR 合入 mstar-harness;`mstar-host` 技能镜像(§ Detect / § Resolve loaded skill root / `references/dsh.md`)随之一并更新。
|
|
352
|
-
- **迭代 stepper:Step 1 为 compass 驱动,Step 5 为 schema
|
|
354
|
+
- **迭代 stepper:Step 1 为 compass 驱动,Step 5 为 schema 驱动**——工作流面板的 Step 1(iteration-start)在 steering compass `status: active`(Phase 1 进行中)时为当前步(无 gate 判定 → 无 PASS/FAIL 徽标);Step 5(merge-ready)是 engine 闸门永不点亮为当前的 schema 常量(transition 只覆盖 Phase 2→3→4,merge-ready 从不是 gate transition);仅当 Step 4 为当前步时作为 `next` 渲染,其余为 idle——已记录于迭代 guide,非缺陷。完整面板限制清单见 Web 客户端插件一节。
|
|
353
355
|
- **`dsh-llm-fallbacks` 为可选的开发期依赖**——dsh 原生覆盖 subagent 定制,fallbacks 因此严格可选:`src/` 对其零导入(运行时与类型——被消费面是本地结构镜像 `fallbacks-structural.ts`,由探测的 exact-keys 漂移闸门 + `typecheck:tests` 的 real → view 可赋值检查保持同步),`package.json` 仅在 `devDependencies` 携带它(类型镜像 + 真实包测试 harness),`dist/` 无导入也无类型引用(仅 1 处命名该包的字符串字面量——探测的 loader 条目匹配;建议日志写作 `fallbacks`)。激活是**单独显式安装**(双命令契约),绝不传递;不再有 `--external` 护栏——未来的值导入必须按设计重新加入运行时依赖。
|
|
354
356
|
- **本批次未交付角色→模型覆盖**——把角色路由到 fallbacks `model`(或经 fallbacks 规则路由 persona)需要改写启动请求上的子会话 `agentOptions`,但启动请求选项由调用方控制(tool-subagent 自己的 Config;调用参数仅为 `description`/`prompt`/`run_in_background`,且深度冻结)。等待上游 `fallbacks-explicit-role-tool` 或 N-B1 systemPrompt 采纳(roadmap §10.4)。
|
|
355
357
|
- **persona 交付为 dsh 原生——不再有附加段**——角色 persona 合入 `SubagentStartRequest.persona`(一次性 `start` 与可选的 continuable `startContinuable` 两个启动面),对角色匹配的子会话**遮蔽**部署 persona(子会话体现角色;持久化并在 resume 时重放)。`mstar:role-persona` system-prompt 段已不复存在。
|
package/bundle/README.md
CHANGED
|
@@ -82,7 +82,7 @@ The `mstar` row accepts the plugin `Config` (see `src/index.ts`):
|
|
|
82
82
|
| `dispatchBinding` | unset → fail-closed `empty-binding` under hard | the dispatching agent's own role (the anti-recursion CALLER) for the precheck |
|
|
83
83
|
| `skillRoots` | unset | additional skill roots (custom mirrors) |
|
|
84
84
|
| `bundledSkillDir` | unset → plugin resolves its OWN packaged `harness-skills/` mirror package-relative | bundled skill mount — the repo-root `skills/` mirror synced by `bundle-assets` at build time (gitignored), resolved package-relative (NOT cwd-anchored). An explicit value wins; a RELATIVE override stays cwd-anchored, so pass an absolute path in the profile layer |
|
|
85
|
-
| `catalogTtlMs` | unset → `60000` | pre-step catalog cache refresh interval (ms) — how often the per-workspace unified `mstar-engine
|
|
85
|
+
| `catalogTtlMs` | unset → `60000` | pre-step catalog cache refresh interval (ms) — how often the per-workspace unified `mstar-engine` catalog row (watermark + iteration gate + workspace-state digest) re-reads `status.json` / the compass / the knowledge index; the hot path is a timestamp compare + cache hit between refreshes |
|
|
86
86
|
|
|
87
87
|
## Client half (workflow panel)
|
|
88
88
|
|
|
@@ -97,166 +97,84 @@ boot the web app serves the closure-factory CJS bundle at
|
|
|
97
97
|
`/plugins/@mstar-harness/dsh/client.js` (rev = content sha1) and loads it via
|
|
98
98
|
`window.__ModuleLoader__.load({ id, factory })`.
|
|
99
99
|
|
|
100
|
-
The client entry registers a
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
100
|
+
The client entry registers a right-Sidebar page tab type (`id:
|
|
101
|
+
'@mstar-harness/dsh'`, `kind: 'mstar-workflow'`, one guide-page capsule at
|
|
102
|
+
`order: 20`), labeled **"MStar 工作流" / "MStar
|
|
103
|
+
Workflow"**; clicking the capsule opens the panel in that pane's slot
|
|
104
|
+
(replacing the guide tab, expanding the sidebar) and a second click focuses
|
|
105
|
+
the existing tab (the host's page-dedup rule). The former
|
|
106
|
+
`conversation.view` view-ring tab is REMOVED (migration, not a second
|
|
107
|
+
surface). The body + its chip title register as keyed seats under the same
|
|
108
|
+
id (`sidebar.right.pane.tab` + `sidebar.right.pane.tab.title`; the chip is
|
|
109
|
+
the glyph + the title captured at open — it does not follow a mid-session
|
|
110
|
+
locale switch), and a docked body renders NOTHING while `tab.visible ===
|
|
111
|
+
false` (collapsed column or another pane tab active). The tab renders the
|
|
112
|
+
latest `mstar-engine` catalog **anchor** row — the persisted source is the
|
|
113
|
+
bare first-party `plugin` arm
|
|
114
|
+
(`{ kind: 'plugin', plugin: 'mstar-engine', form: 'catalog' }`; the anchor
|
|
115
|
+
reader also accepts the legacy `mstar-engine-status` identity from
|
|
116
|
+
persisted logs) — and the payload is fetched from the host's
|
|
117
|
+
`/api/mstar/engineStatus` endpoint (the gateway owns the route; the
|
|
118
|
+
panel's browser half calls
|
|
119
|
+
`connection.rpc.call('/api', 'mstar/engineStatus', { args: { sessionId, cwd } })`
|
|
120
|
+
and renders the session's stored snapshot, or an explicit unavailable
|
|
121
|
+
reason).
|
|
122
|
+
|
|
123
|
+
**MStar Workflow layout**: a narrow-column shell bound to the sidebar
|
|
124
|
+
pane's definite height — exactly three zones: the **section nav** (任务迭代
|
|
125
|
+
/ 代理执行 / 事件记录; `data-mstar-tab-nav`), the panel-owned **single
|
|
126
|
+
scroll body** (`[data-mstar-scroll]` — the ONLY `overflow-y` element in
|
|
127
|
+
the panel; nothing scrolls horizontally; `data-mstar-graph` rides it), and
|
|
128
|
+
the pinned **meta dock** (version + harness dir; never scrolls). The
|
|
129
|
+
workspace-state digest (plans ≤5 time-desc + `+N more`, open residual
|
|
130
|
+
findings ≤10 with severity chips + overflow hint, policy with enforcement
|
|
131
|
+
first then push / worktree / control worktree, leases, knowledge,
|
|
132
|
+
direction) renders IN FLOW at the end of the scroll body, closed by the
|
|
133
|
+
freshness footer (`snapshot {time} · turn {turn}` — the served snapshot's
|
|
134
|
+
own timestamp + turn, never "live"). The shell carries `container-type:
|
|
135
|
+
inline-size`: below 480px container width padding and group gap tighten;
|
|
136
|
+
at ≥720px the shared group grid spreads to two columns
|
|
137
|
+
(`repeat(auto-fit, minmax(280px, 1fr))`) — the only structural change any
|
|
138
|
+
width makes (one DOM, one tree; no JS layout measurement). The three
|
|
139
|
+
sections stack in the scroll body: the tasks page (iteration head +
|
|
140
|
+
**vertical** 5-step stepper with the FOUR-STATE `current` / `next` /
|
|
141
|
+
`done` / `idle` machine + the branch panel + five stacked status groups —
|
|
142
|
+
the merged「受阻/未知」/「Blocked / Unknown」column kept, `PLAN_CAP` render
|
|
143
|
+
caps + the clickable 「更多」/「收起」 expand button (`data-kanban-more`) —
|
|
144
|
+
then the project rollup), the events page (two partitions — Agent 流转事件
|
|
145
|
+
/ 违规记录 — as flow rows, every row an expandable native `<details>`
|
|
146
|
+
carrying the full catalog fields, missing fields render 「—」 never a
|
|
147
|
+
guessed value), and the agents page — a **vertical grouped list** (the
|
|
148
|
+
react-flow canvas, its SVG edge layer, card ports and pointer pan are
|
|
149
|
+
REMOVED): two Phase groups in constant order (Phase 1 review-edit-chain
|
|
150
|
+
above; Phase 2 sdd-implement → qc-tri → qa-gate below, its label
|
|
151
|
+
annotating the CURRENT plan — `data-agent-group-plan` + `+N more`),
|
|
152
|
+
`sdd-implement` split into implementor / reviewer sub-partitions, the
|
|
153
|
+
`general` bucket sunk into an `unknown` sub-bucket, the full 14-role
|
|
154
|
+
roster as full-width flow rows (idle rows dashed muted — the roster is
|
|
155
|
+
never hidden) with role chip / status point / `×N` count / record line,
|
|
156
|
+
the `N executing · M pending` summary, and the three-entry legend in flow
|
|
157
|
+
below the list; rows carry the projected **emphasis tier**
|
|
158
|
+
(`--mstar-canvas-emphasis-*` chrome alpha mix — never a whole-row
|
|
159
|
+
`opacity`, so the status point + running glow stay opaque), settled
|
|
160
|
+
entities get the standalone GREEN done frame + ✓ (`data-agent-done="true"`)
|
|
161
|
+
ONLY when `emphasis ≠ 'off'`; the agents page contains zero `<svg>`, zero
|
|
162
|
+
`data-agent-port` / `data-canvas-*` anchors and no pan transform. The
|
|
163
|
+
**iteration info section is shared by the tasks AND agents pages** (one
|
|
164
|
+
`IterationInfoSection`, both render the same `view.iteration` block).
|
|
165
|
+
Empty branches are explicit states — `waiting` / `loading` /
|
|
166
|
+
`unavailable` (with its reason) / no-harness each carry their OWN anchor
|
|
167
|
+
and copy and render no tabs, no digest and no meta dock; no harness
|
|
168
|
+
renders a CENTERED inactive-state card that activates automatically once a
|
|
169
|
+
harness is detected. Projection is the pure `projectGraph(source)`
|
|
111
170
|
function (schema constants vs catalog evidence strictly separated; never
|
|
112
171
|
throws; explicit degraded states — muted empty states, never orange warn
|
|
113
|
-
boxes)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
base / target / spec integration, rendered only while active; the expanded
|
|
120
|
-
head is a LEFT-RIGHT SPLIT — branches (small left half, WIDTH-CAPPED —
|
|
121
|
-
`flex: 0 1 260px` + `max-width: 280px`, never stretches with the container; the
|
|
122
|
-
<860px column stack resets to content height) + steps (large right half,
|
|
123
|
-
`flex: 1 1 0` absorbing the remaining width) via `data-iteration-head-split`,
|
|
124
|
-
stacking on narrow widths, and NO
|
|
125
|
-
branch panel when there is no active iteration; the current step follows the
|
|
126
|
-
steering compass: `compassStatus: 'active'` (Phase 1 in flight) → Step 1
|
|
127
|
-
(iteration-start) is CURRENT with verdict `unknown` — no PASS/FAIL badge —
|
|
128
|
-
plan `20260811-panel-f4-iteration-zone`; the branches
|
|
129
|
-
block left the sidebar for this in plan `20260810-panel-sidebar-info`), a
|
|
130
|
-
**tasks zone** (5-column kanban: Todo / InProgress / InReview / Done /
|
|
131
|
-
`blocked-unknown` — the Blocked state and the former unknown catch-all fold
|
|
132
|
-
into ONE merged column titled「受阻/未知」/「Blocked / Unknown」, plan
|
|
133
|
-
`20260813-panel-quick-fixes` Task 1 — with count badges; every column caps
|
|
134
|
-
its rendered rows at `PLAN_CAP` with a clickable 「更多」/「收起」 expand
|
|
135
|
-
button (`data-kanban-more` anchor) unfolding the full column — the
|
|
136
|
-
projection keeps ALL plan rows, the cap is a render concern never a
|
|
137
|
-
discard), an
|
|
138
|
-
**agent-execution zone** (the four EXPECTED_ROLE_FLOW stage/phase columns
|
|
139
|
-
— review-edit-chain → sdd-implement → qc-tri → qa-gate (the terminal
|
|
140
|
-
stage; the former `sdd-task-review` stage is removed, its SDD L2 reviewer
|
|
141
|
-
is now the pipeline role `code-reviewer`, v2.1.1) — a strict FOUR-column
|
|
142
|
-
layout with NO standalone unknown column (plan
|
|
143
|
-
`20260812-panel-f5-design-system` Task 5, user 2026-08-12 round-2 decision —
|
|
144
|
-
the former rightmost unknown column of plan `20260812-panel-f5-agent-layout`
|
|
145
|
-
is superseded): the `general` bucket sinks into an **unknown sub-partition
|
|
146
|
-
at the bottom of the `qa-gate` column** (a `data-sub-bucket="unknown"`
|
|
147
|
-
caption row 「unknown / 未匹配角色」 after the last qa-gate card, then the
|
|
148
|
-
general cards; the standalone on-demand column was already removed in the
|
|
149
|
-
agent-layout plan); `explore` is removed — no card, no column. The `sdd-implement`
|
|
150
|
-
column splits into **sub-buckets** by the projected `entity.bucket` (never
|
|
151
|
-
a render guess): the **implementor** partition above — flow roles in the
|
|
152
|
-
stage's original order (fullstack-dev / fullstack-dev-2 / frontend-dev),
|
|
153
|
-
then the on-demand roles (ops-engineer / prompt-engineer, carrying the
|
|
154
|
-
**on-demand badge** — no standalone on-demand column) — and the
|
|
155
|
-
**sdd-reviewer** partition below (code-reviewer, the SDD L2 task reviewer),
|
|
156
|
-
with implementor / sdd-reviewer caption labels; `zone: 'on-demand'` entities
|
|
157
|
-
live in the implementor partition, `zone: 'general'` entities render in the
|
|
158
|
-
qa-gate column's bottom unknown sub-partition. The canvas is laid out in
|
|
159
|
-
**TWO side-by-side Phase groups** (plan `20260812-panel-f5-design-system`
|
|
160
|
-
Task 8, user 2026-08-12 round-4 decision #2; side-by-side layout per plan
|
|
161
|
-
`20260813-panel-agent-canvas-legend-layout` Task 2): the **Phase 1 group on
|
|
162
|
-
the LEFT** (review-edit-chain — the sequential Review & Edit chain) and the
|
|
163
|
-
**Phase 2 group on the RIGHT** (sdd-implement → qc-tri → qa-gate — the
|
|
164
|
-
iterative plan loop), top-aligned (all group label rows share the same
|
|
165
|
-
`y = PAD_Y`), each with its group label row; the **Phase-2 label annotates
|
|
166
|
-
the CURRENT PLAN** (projected `agents.activePlanId` — the first InProgress
|
|
167
|
-
`state.plans[]` row, `data-canvas-group-plan`; `+N more` when several plans
|
|
168
|
-
run in parallel, muted「无进行中 plan」when none). The subagent ENTITY cards aggregate **by role** from actual
|
|
169
|
-
dispatch evidence — the same role across sessions folds into one card ×N,
|
|
170
|
-
and every off-roster dispatch (the former `generalPurpose` SDD reviewer,
|
|
171
|
-
`scout`, anonymous `role === ''`) folds into the single `general` bucket
|
|
172
|
-
entity (the card is role-titled — the role id; the agent session id / task
|
|
173
|
-
tag ride the record line, never the title) — role chip / status point / ×N
|
|
174
|
-
count; running entities carry the business glow-pulse
|
|
175
|
-
highlight (on the ROUNDED `.card-body` — the card is a single rounded
|
|
176
|
-
element, no square outline overlay, plan `20260812-panel-f5-design-system`
|
|
177
|
-
Task 5), un-evidenced stages render the dashed "待执行" pending
|
|
178
|
-
placeholder with their expected role chips, un-evidenced KNOWN_AGENTS
|
|
179
|
-
members render dashed idle cards (the full 14-role roster is never
|
|
180
|
-
hidden), and the header shows the
|
|
181
|
-
`N executing · M pending` summary; cards carry the projected **emphasis
|
|
182
|
-
tier** (plan `20260812-panel-f5-design-system` Task 4, design doc §3):
|
|
183
|
-
`emphasis: 'current' | 'next' | 'off' | null` — the iteration's
|
|
184
|
-
current-phase roles render at **100%** chrome intensity, later-phase
|
|
185
|
-
expected roles at **75%**, already-passed / stage-less (on-demand, general)
|
|
186
|
-
roles at **45%**, and `null` (no iteration / unresolved transition) applies
|
|
187
|
-
NO override — always a chrome **alpha mix** (`--mstar-canvas-emphasis-*`
|
|
188
|
-
tokens; never a whole-card `opacity`, so the status point + running glow
|
|
189
|
-
stay opaque). Settled entities get a **standalone GREEN done frame + green
|
|
190
|
-
✓** (plan `20260812-panel-f5-design-system` Task 8, user round-4 decisions
|
|
191
|
-
#1/#3: `data-agent-done="true"` — a full-strength success border + 1px ring
|
|
192
|
-
on the rounded card body + the ✓ in the status point) **ONLY when
|
|
193
|
-
`emphasis ≠ 'off'`** — an off-tier role (already-passed / stage-less
|
|
194
|
-
on-demand + general) renders the muted dot instead and NEVER shows the
|
|
195
|
-
completion marker. The agent canvas filters dispatch evidence to the
|
|
196
|
-
**current iteration's plans only** (plan `20260813-panel-quick-fixes` Task
|
|
197
|
-
2): the steering compass `iterationId` when active, else the nearest
|
|
198
|
-
iteration from the catalog `plans[].iterationRefs` (most-recent plan by
|
|
199
|
-
8-digit id date prefix + doneAt); provably cross-iteration events produce
|
|
200
|
-
no entity/edge — the roster keeps its idle cards, and plan-less /
|
|
201
|
-
unknown-plan / standalone dispatches are never hidden. Status honesty (Task
|
|
202
|
-
2): `advisory` is no longer terminal — a soft-enforcement dispatch falls
|
|
203
|
-
through to its paired settle (green ✓ when a settle exists, `running` when
|
|
204
|
-
none), `denied` stays terminal, and the advisory verdict still renders in
|
|
205
|
-
the event log. The canvas legend sits BELOW the viewport (Task 3, moved
|
|
206
|
-
from above). The **iteration info section is SHARED by the tasks AND
|
|
207
|
-
agents tabs** (Task 8, decision #4 — one `IterationInfoSection` component,
|
|
208
|
-
both tabs render the same `view.iteration` block). Edges — plan `20260812-panel-f5-design-system` Task 5 (design
|
|
209
|
-
doc §2): the `expected` stage skeleton arrows AND the ANIMATED **next** edge
|
|
210
|
-
(the former `@keyframes agent-dash-flow` dash-flow arrow of plan
|
|
211
|
-
`20260810-panel-agent-flow-zone`) are **REMOVED** — flow order is implied
|
|
212
|
-
by the fixed column order + column labels, the current position by the
|
|
213
|
-
running card glow + status point — leaving TWO semantic kinds: the
|
|
214
|
-
evidence-driven **`actual` handoff** edges (same-plan ts-adjacent dispatch
|
|
215
|
-
entity-key pairs, `general` endpoints filtered, ≤1 per entity pair) drawn as
|
|
216
|
-
**bezier `C` curves** anchored to card **ports** — 4 fixed edge-midpoint
|
|
217
|
-
ports (north / south / east / west; static-invisible, hover-revealed as
|
|
218
|
-
small dots) with the arrow tip pulled back to a **10px standoff** off the
|
|
219
|
-
port — the arrow follows the line's local tangent at the anchor (**H1**),
|
|
220
|
-
and no line's stroke or arrow crosses any text (**H2**: standoff + side-gap
|
|
221
|
-
routing, design doc §2.0/§2.5/§2.6; tightened in plan
|
|
222
|
-
`20260813-panel-quick-fixes` Task 3 — same-column vertical flows whose
|
|
223
|
-
center-x line would cross an in-between card body reroute into the column's
|
|
224
|
-
LEFT side gap (forward AND reverse), and reverse horizontal beziers keep
|
|
225
|
-
direction-aware control points BETWEEN the endpoints, never bulging into
|
|
226
|
-
the adjacent column) — plus the **bidirectional supervise
|
|
227
|
-
line** (plan `20260812-panel-f5-agent-layout` Task 1/2) — one static
|
|
228
|
-
design-knowledge sub-bucket edge inside the `sdd-implement` column
|
|
229
|
-
(implementor ↔ sdd-reviewer — the mstar-sdd mutual-supervision contract),
|
|
230
|
-
now anchored at the **side-gap vertical anchor** (`x = card right edge +
|
|
231
|
-
18px`, vertical bezier flow, arrows along the vertical tangent — design doc
|
|
232
|
-
§2.5/§2.7); dim dashed by default, lit business SOLID when the projected
|
|
233
|
-
`evidenced` flag is true — evidence-driven lighting, never a fabricated
|
|
234
|
-
activation), with the
|
|
235
|
-
agent-flow event strip migrated into the **事件记录 (Event Log) tab** — a
|
|
236
|
-
non-canvas log page (spec F1.5, plan `20260811-panel-event-log`): two
|
|
237
|
-
partitions (Agent 流转事件 / 违规记录), every row an expandable native
|
|
238
|
-
`<details>` carrying the full catalog fields (missing → 「—」), muted empty
|
|
239
|
-
states — the two partitions render SIDE BY SIDE in a locked-height
|
|
240
|
-
two-column grid (`repeat(2, minmax(0, 1fr))` — the page never scrolls as a
|
|
241
|
-
whole; each partition pins its title and owns an internal `overflow-y`
|
|
242
|
-
scroll on its row list; plan `20260813-panel-quick-fixes` Task 4
|
|
243
|
-
root-caused the whole-page scroll — the panel root opts into the host
|
|
244
|
-
`data-conversation-composer-overlay` (the host's full-height opt-in), so
|
|
245
|
-
`height:100%` resolves and `.rowList`'s `overflow-y: auto` scrolls INSIDE
|
|
246
|
-
the partition (the host page no longer scrolls), with bottom clearance
|
|
247
|
-
reserving the floating composer via the host-published
|
|
248
|
-
`--dsh-composer-height`), falling back to two stacked 50/50 locked rows
|
|
249
|
-
below 1200px (`data-event-log-*` anchors unchanged, plan
|
|
250
|
-
`20260811-panel-f3-agent-general`) — the canvas-corner **AgentEventDock** is REMOVED with the page
|
|
251
|
-
(无双份日志, spec §5; the fixed footer bar — zone legend + gate summary +
|
|
252
|
-
violations — died with the WorkflowCanvas in the tabs-shell plan; the
|
|
253
|
-
footer that remains is the freshness marker). Empty branches (spec §2, plan
|
|
254
|
-
`20260812-panel-f5-agent-layout` Task 3): waiting keeps the muted hint, and
|
|
255
|
-
NO harness renders a **centered inactive-state card** — folder icon + 「No
|
|
256
|
-
Morning Star harness detected」 title + hint copy (the detail panel stays
|
|
257
|
-
inactive — no tabs, no sidebar — and activates automatically once a harness
|
|
258
|
-
is detected; `data-mstar-empty="no-harness"` stays on the title,
|
|
259
|
-
`data-mstar-graph` on the main container). Below 1200px the zones stack vertically.
|
|
172
|
+
boxes). Refresh follows the session snapshot, no polling — a ledger
|
|
173
|
+
record (dispatch/settle) invalidates the workspace's TTL-cached catalog
|
|
174
|
+
row so the panel refreshes per step; while the main agent idles the panel
|
|
175
|
+
keeps the last snapshot (no live push channel). Full realized layout
|
|
176
|
+
detail: `packages/dsh/README.md` (§ Web client plugin).
|
|
177
|
+
|
|
260
178
|
Build step: `bun run
|
|
261
179
|
build-client` (`scripts/build-client-bundle.ts` — closure-factory CJS,
|
|
262
180
|
CLIENT_EXTERNALS external, CSS modules hashed + `<style data-plugin>`
|
|
@@ -265,11 +183,11 @@ injection, purity gate, and inline assertions that the bundle carries **no
|
|
|
265
183
|
and its plain-`.css` text loader were removed with the graph layer), zero
|
|
266
184
|
`@deepseek-ai/*` value imports and no `import.meta` / ESM statements — the
|
|
267
185
|
web loader executes plugin bundles as classic `<script>`s); the full `bun run
|
|
268
|
-
build` runs it after the node half. Verified
|
|
186
|
+
build` runs it after the node half. Verified against the realized install
|
|
187
|
+
surface: boot graph entry, the
|
|
269
188
|
`/plugins/<id>/client.js` route serving the exact built bundle, and the
|
|
270
189
|
browser-handoff materialization (`inject`/`apply`/CSS injection under
|
|
271
|
-
classic-script semantics)
|
|
272
|
-
`install-verification.md` guide of the panel-beautify iteration (local harness root).
|
|
190
|
+
classic-script semantics).
|
|
273
191
|
|
|
274
192
|
Known limitations (this iteration): the iteration stepper's Step 1
|
|
275
193
|
(iteration-start) IS the current step while the steering compass is
|
|
@@ -289,9 +207,10 @@ never faked); the current-iteration filter with NO steering compass infers
|
|
|
289
207
|
the iteration from plan ids (8-digit date prefix) + doneAt — a
|
|
290
208
|
deterministic, documented heuristic, and only provably cross-iteration
|
|
291
209
|
events are dropped; no historical
|
|
292
|
-
back-scan of resumed long logs;
|
|
293
|
-
|
|
294
|
-
|
|
210
|
+
back-scan of resumed long logs; the sidebar chip title is captured at open
|
|
211
|
+
time (a mid-session locale switch does not flip it), and a docked body
|
|
212
|
+
renders nothing while the column is collapsed or another pane tab is active
|
|
213
|
+
(`tab.visible === false`). Browser UI observation is the user-restart
|
|
295
214
|
acceptance (R1 folded into this iteration's AC-1/2).
|
|
296
215
|
|
|
297
216
|
## Known constraints
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Morning Star workflow panel — dsh client plugin entry (
|
|
2
|
+
* Morning Star workflow panel — dsh client plugin entry (plan sidebar §L1.3):
|
|
3
3
|
* `inject` (cordis service waits) + `apply(ctx: ClientContext)`.
|
|
4
4
|
*
|
|
5
|
-
* On apply:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `ctx.
|
|
5
|
+
* On apply: creates the engine-status client over the client `connection`
|
|
6
|
+
* service (the panel's data path is the host's shared `/api` typert gateway —
|
|
7
|
+
* the persisted catalog row is only the anchor), registers the `mstar-panel`
|
|
8
|
+
* dictionaries, registers the panel as a right-Sidebar page tab type
|
|
9
|
+
* (`ctx.sidebarRightTabs.register`, `kind: 'mstar-workflow'`, one guide
|
|
10
|
+
* capsule at order 20), then waits for the ui-sidebar-right seat
|
|
11
|
+
* declarations and registers the panel body and its chip title as keyed
|
|
12
|
+
* entries under the definition's `id` — the two-stage seat contract. The old
|
|
13
|
+
* conversation-area view-tab registration is gone: the sidebar tab REPLACES
|
|
14
|
+
* the conversation-area tab (a migration, not a second surface).
|
|
15
|
+
*
|
|
16
|
+
* The client is created ONCE per apply and disposed with the fiber, so a
|
|
17
|
+
* reloaded plugin starts from a clean snapshot cache. Every registration
|
|
18
|
+
* sits in its own `ctx.effect` so unload disposes it.
|
|
10
19
|
*/
|
|
11
20
|
import type { Context as ClientContext } from '@deepseek-ai/cordis';
|
|
12
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Cordis service faces the plugin waits for (spec §4.4: slots + sessions +
|
|
23
|
+
* locale + the wire + the tab-type registry). `sessions` is load-bearing as
|
|
24
|
+
* the session standard scope's wait and `connection` carries the
|
|
25
|
+
* engine-status transport; `sidebarRightTabs` is the registry `apply`
|
|
26
|
+
* registers the page tab type into.
|
|
27
|
+
*/
|
|
13
28
|
export declare const inject: string[];
|
|
14
29
|
export declare function apply(ctx: ClientContext): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The panel's chip title seat (plan sidebar §L1.3): draws the MStar glyph
|
|
3
|
+
* before the tab title, exactly as the shipped glyph-bearing title seats do,
|
|
4
|
+
* so the chip does not read as a bare label next to first-party chips. It is
|
|
5
|
+
* decoration only — the copy comes from the registry's `title(address)` text
|
|
6
|
+
* captured at open time, so it does not follow a live locale switch
|
|
7
|
+
* (documented regression F2; restoring liveness would cost a store-backed
|
|
8
|
+
* title registration for no user-visible gain).
|
|
9
|
+
*/
|
|
10
|
+
import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
11
|
+
/** The chip title seat's props: the framework-injected tab information hook. */
|
|
12
|
+
export type MstarPanelTitleProps = PropsRuntime<'sidebar.right.pane.tab.title'>;
|
|
13
|
+
export declare function MstarPanelTitle({ useTabInfo }: MstarPanelTitleProps): import("react").JSX.Element;
|