@mstar-harness/dsh 3.8.0 → 3.8.2
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 +142 -194
- package/README.zh.md +29 -17
- 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/engine-status-client.d.ts +84 -6
- package/dist/client/panel/graph/project-graph.d.ts +35 -64
- package/dist/client/panel/graph/schema.d.ts +1 -2
- package/dist/client/panel/guards.d.ts +41 -1
- 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 +13 -7
- package/dist/client/panel/state-section.d.ts +25 -3
- package/dist/client/panel/use-mstar-engine-status.d.ts +39 -14
- package/dist/client/panel/zones/Legend.d.ts +5 -3
- package/dist/client/panel/zones/TaskBoard.d.ts +13 -9
- package/dist/client.js +1038 -1242
- package/dist/engine-status-endpoint.d.ts +85 -8
- package/dist/engine-status-store.d.ts +91 -1
- package/dist/engine-status-wire.d.ts +9 -0
- package/dist/gates/_shared.d.ts +61 -9
- package/dist/gates/adapter.d.ts +32 -2
- package/dist/gates/agent-flow.d.ts +312 -60
- package/dist/gates/catalog.d.ts +59 -38
- package/dist/gates/dispatch.d.ts +11 -2
- package/dist/gates/goal-bridge.d.ts +10 -130
- package/dist/gates/plan-mode-bridge.d.ts +20 -11
- package/dist/gates/role-persona.d.ts +16 -0
- package/dist/gates/steering.d.ts +41 -0
- package/dist/gates/workflow-ledger.d.ts +31 -4
- package/dist/gates/workflow-selection.d.ts +41 -20
- package/dist/index.js +1208 -394
- package/dist/types.d.ts +50 -18
- package/harness-commands/amazing-pr-review.md +2 -0
- package/harness-commands/codebase-audit.md +2 -0
- package/harness-skills/mstar-host/SKILL.md +3 -1
- package/harness-skills/mstar-host/references/dsh-workflow-scripts.md +424 -0
- package/harness-skills/mstar-host/references/dsh.md +259 -266
- package/harness-skills/mstar-roles/references/project-manager.md +2 -0
- package/harness-skills/mstar-sdd/SKILL.md +2 -0
- package/package.json +66 -64
- 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
|
|
|
@@ -14,7 +14,7 @@ dsh 应用如何使用本插件——安装路径、配置、挂载时发生什
|
|
|
14
14
|
|
|
15
15
|
本包以 workspace 包形式发布(`workspaces: ["packages/*"]`),构建时把 engine 打进 `dist/`(`bun run build`;dist 已被 gitignore)。安装途径是 **profile bundle**,装进现成的 `web` profile(`dsh --profile web`——开箱即用的 web 应用 profile,即 `dsh web`),经 `dsh.bundle.patch` 清单——一个叠在 dsh-base 默认层之上的补丁层:
|
|
16
16
|
|
|
17
|
-
**一条命令的 CLI 入口(推荐)**——`npx @mstar-harness/cli init --target dsh` 一次性装齐全量能力:它按序运行下面两条 `dsh plugin --profile web add` 安装(先 mstar bundle,再 `dsh-llm-fallbacks`),并可用 `npx @mstar-harness/cli doctor --target dsh` 逐行报告 `uninstalled` / `disabled` / `mounted
|
|
17
|
+
**一条命令的 CLI 入口(推荐)**——`npx @mstar-harness/cli init --target dsh` 一次性装齐全量能力:它按序运行下面两条 `dsh plugin --profile web add` 安装(先 mstar bundle,再 `dsh-llm-fallbacks`),并可用 `npx @mstar-harness/cli doctor --target dsh` 逐行报告 `uninstalled` / `disabled` / `mounted` / `drifted`(`drifted` = fallbacks 行的安装版本不等于 pin;`init --target dsh` 会按 pin 重新 add,在此之前 `doctor` 以非零退出)。它编排的仍是同一条双命令安装;`--no-fallbacks` 跳过第二行(连带跳过 seeded 角色——见下文「零配置获得什么」)。
|
|
18
18
|
|
|
19
19
|
**(a)registry 安装(发布形态)**——npm 包自带构建好的 `dist/`(安装时无需构建):
|
|
20
20
|
|
|
@@ -71,9 +71,11 @@ 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
|
-
| `workflowNames` | `string[]` | 未设置 | workflow 名字白名单(P-a):被闸门视为 KNOWN 的 `meta.name` 值。为空或缺省 ⇒ **每个**名字都 unknown(有文档——闸门**绝不**因缺省而"全放行")。ralph 调用不携带 `meta.name`——P-a 对其永不适用。 |
|
|
76
|
+
| `workflowNames` | `string[]` | 未设置 | workflow 名字白名单(P-a):被闸门视为 KNOWN 的 `meta.name` 值。为空或缺省 ⇒ **每个**名字都 unknown(有文档——闸门**绝不**因缺省而"全放行")。ralph 调用不携带 `meta.name`——P-a 对其永不适用。mstar 只读扇出路径推荐值:`['mstar-qc-tri', 'mstar-audit-fanout', 'mstar-pr-seats']`。 |
|
|
77
|
+
|
|
78
|
+
**推荐的 operator 覆盖层。** 上表三个推荐 `workflowNames` 覆盖 mstar 只读扇出路径(plan QC tri、大型仓库 `/codebase-audit`、`/amazing-pr-review deep`);写入它们是 profile 层的操作者覆盖,绝非 mstar 默认。出厂空列表下每个名字都是 *unknown*,在默认 `workflowGate: 'warn'` 下这只是运行会存活的一条 `workflow.name.unknown` 咨询。生产部署若还要否决 unknown 名字,可设置 `workflowGate: 'hard'`;出厂默认仍为 `'warn'`。
|
|
77
79
|
|
|
78
80
|
`bundledSkillDir` 默认取包内自带的 `harness-skills/` 镜像(见 Skills mount)——显式 Config 值仍然优先。相对覆盖仍是 **cwd 锚定**(skill-filesystem 以 `join()` 语义相对 dsh **进程 cwd** 解析),因此覆盖默认的部署应在 **profile 层传绝对路径**(见 `bundle/README.md`)。
|
|
79
81
|
|
|
@@ -98,7 +100,7 @@ profile bundle 组合出以下行——注册表行来自 `@deepseek-ai/dsh-base
|
|
|
98
100
|
- **seam lint**——harness 下 `DESIGN.md` / audit plan / 知识文档 / roles 目录的写入运行各自的 artifact 级 engine lint。
|
|
99
101
|
- **模型可见工具**——`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
102
|
- **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
|
|
103
|
+
- **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
104
|
|
|
103
105
|
### Enforcement semantics
|
|
104
106
|
|
|
@@ -172,7 +174,7 @@ persona 交付走 dsh 原生的 `SubagentStartRequest.persona` 槽(`@deepseek-
|
|
|
172
174
|
|
|
173
175
|
### 角色 seeds 与采纳建议(Adoption advisory)
|
|
174
176
|
|
|
175
|
-
当可选的 `dsh-llm-fallbacks` 能力**已挂载**(第二条安装命令——见 Install paths)时,mstar 插件会向 fallbacks seed registry **零配置声明 13 个 `mode: subagent` mstar 角色 seed**:persona = `harness-agents/` 镜像 `description`(原样)+ 一行强制加载引导(`Load mstar-roles (references/<role-id>.md) first — identity comes before skills; load topic skills only when the Assignment activates them via its Skill presets field.`);含 `{{...}}` 插值风险的 persona 跳过并告警,绝不声明。声明会**合并保留 readback 中当前已 seeded 的非 mstar id**——例如上游包在其自身 apply 时自声明的
|
|
177
|
+
当可选的 `dsh-llm-fallbacks` 能力**已挂载**(第二条安装命令——见 Install paths)时,mstar 插件会向 fallbacks seed registry **零配置声明 13 个 `mode: subagent` mstar 角色 seed**:persona = `harness-agents/` 镜像 `description`(原样)+ 一行强制加载引导(`Load mstar-roles (references/<role-id>.md) first — identity comes before skills; load topic skills only when the Assignment activates them via its Skill presets field.`);含 `{{...}}` 插值风险的 persona 跳过并告警,绝不声明。声明会**合并保留 readback 中当前已 seeded 的非 mstar id**——例如上游包在其自身 apply 时自声明的 5 个上游 preset 角色:上游 `declare` **全量替换** registry,若不保留,mstar-only 批会摘掉 preset id 的 seeded 注记(行仍在,仅失去 seeded)。声明在每次 fallbacks(重新)apply(HMR/纤程切换)时幂等重放——绝不用一次性 latch——因此两种 boot 顺序(presets 先或 mstar 先)都收敛到同一 18-id 全 seeded registry。boot 时收敛经 bounded retry(有界重试):上游的 seed 写通道在其 apply 之后一个 macrotask 才绑定,因此 apply 窗口内首次尝试被 `seeds: settings service is unavailable` 拒绝时会重试(跨上游 apply 窗口的 3 次尝试),暂时性拒绝自行收敛;仅当所有尝试最终失败时,声明才记录恰好一条终态错误,同时 advisory 的决策点 re-declare 仍可用作 retry 路径。**无需手动编辑 `roles.list`。**
|
|
176
178
|
|
|
177
179
|
一条只告警的采纳建议通道(日志器 `mstar/fallbacks-advisory`)**每次 apply 只跑一遍**——apply 时先尝试一次;当 fallbacks 行在 `dsh` 之后挂载(loader 并发挂载条目)时,改在首个 `subagent/start` 决策点只跑一遍。服务存在时,通道**先 await 幂等 re-declare**(闭合 boot 竞争窗口)再读取**有效状态**(`getEffectiveRoles`),并按**每类至多一条告警**有界报告:
|
|
178
180
|
|
|
@@ -240,13 +242,21 @@ mstar 技能通过 dsh skill-filesystem 提供者以**单一规范挂载**接入
|
|
|
240
242
|
|
|
241
243
|
## Engine-status catalog
|
|
242
244
|
|
|
243
|
-
一个咨询式 `agent/pre-step` 瀑布监听器向每个组合后的步骤追加**一条** **`mstar-engine
|
|
245
|
+
一个咨询式 `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
246
|
|
|
245
247
|
该行是 **digest 门控**的:按 agent+workspace,每个 turn 只注入一次,仅当渲染文本变化时重新注入——20 步的 turn 只显示一次 catalog,而不是 20 次。source 共享**同一**按工作区缓存条目:显式 `harnessDir` 时在 boot 构建(否则在工作区首次 pre-step 构建),并按 TTL 刷新(`catalogTtlMs`,默认 60 秒)——刷新间隔之间热路径只是时间戳比较 + Map 命中,会话中 plan/compass/residual 的变化在一个间隔内落地。
|
|
246
248
|
|
|
247
|
-
## Agent-flow ledger
|
|
249
|
+
## Agent-flow ledger
|
|
250
|
+
|
|
251
|
+
agent-flow 账本位于**当前活动 workflow 目录**——`{HARNESS_DIR}/workflows/<id>/agent-flow.jsonl`(JSON Lines,保留最近 500 条)——即 catalog 的 `state.agentFlow` 证据所读的同一 JSONL。无活动生命周期时记录被**跳过**并只告警一次——绝不写 harness 根,绝不写终态快照目录。它记录**真实的** subagent 派发与结算证据(咨询式、try/catch 含容——账本写入失败绝不阻断派发或结算):
|
|
252
|
+
|
|
253
|
+
- **派发(dispatch)**——每个 Assignment 形态的派发一行,记录派发身份:`role`(在写入边界归一化——去首尾空白并剥掉**一个**前导 `@`,故 `@explore` 与 `explore` 是同一 actor 而非两个角色)、`planId`、Assignment 的 `Task N` 标签记为 `taskId`、`taskCategory` 与判定。
|
|
254
|
+
- **结算(settle)**——仅为**真实配对**的完成记录。前台调用在 `tools/post-execute` 监听器结算;`{ kind: 'background', jobId }` 结果按注册表 **`jobId`** 配对(jobs 注册表键,绝非子会话 id),待 `ctx.inject(['jobs'])` → `jobs.onJobDone` 报告终态快照时结算(`completed → ok` / `killed → denied` / `failed → error`,可用时附 `durationMs`)。每条配对结算都携带派发身份(`Task N` 标签仍是 `taskId`;`taskRef` 专用于注册表 job id,仅后台结算携带)外加**可选** `childId`——前台 `runId`,或 catalog 关联已提供的后台子会话 id。可选 id 缺失或超长时**只省略该字段**:真实完成照常记录,id 绝不截断、绝不重键。未配对载荷**不记录任何东西**——绝不伪造结算。
|
|
255
|
+
- **`subagent-link`(非终态)**——某次派发实际启动的子会话 id,由上游以**父会话自有**的 `subagent/catalog` 会话事件发布(`label` = 委派 `description`;continuable 路径在工具返回**之前**追加)。逐派发的**调用窗口**关联——pre-execute 预留槽位、有效 `background` / `continuable` 结果使其可选中、`eventAt(seq)` 补扫加**一个**活的根上下文 `session/event` 观察者——把该 catalog 子会话关联回派发身份(`role` / `planId` / `taskId`,后台 one-shot 另带 `taskRef`),写入**该派发自己的** workflow 目录。它是**身份记录**,**不是**完成:无 `outcome`、无 `verdict`、无 `paired` 标记。该关联为 apply 作用域——无全历史冷扫描、无 `session/created` 回填,故 apply 之前写入的 catalog 绝不可能给更晚的派发贴标签——而 provider 不发出 catalog 的派发就是没有 link 行。
|
|
248
256
|
|
|
249
|
-
|
|
257
|
+
### Workflow 行
|
|
258
|
+
|
|
259
|
+
同一账本还记录 **workflow / ralph 扇出运行**:一个会话事件消费者(日志器 `mstar/workflow-ledger`,apply 时注册)把四个持久化的 `tool-workflow/*` 会话事件映射为三种新账本类型。事实来源是**持久化会话事件**——追加进**调用方父会话**的日志(仅顶层运行;嵌套 transport 调用上游不记录任何东西),而**不是**内存中的 `workflow/*` emits(roadmap §10.4 N4):会话日志才是可回放的事实,因此消费者以 **apply 时冷扫描**(构造期种子事件从不进 firehose——`firstLiveSeq`)加实时 **`session/event` firehose** 监听覆盖它,按**持久化逐会话水位线**(会话日志 `seq` 位置)去重——水位线持久化到 `{HARNESS_DIR}/workflows/<id>/workflow-ledger-cursors.json`(账本旁的小型有界 sidecar,temp 文件 + rename 原子写入)。
|
|
250
260
|
|
|
251
261
|
| `tool-workflow/*` 事件 | 账本行 | 字段 |
|
|
252
262
|
| --- | --- | --- |
|
|
@@ -258,7 +268,7 @@ agent-flow 账本——`{HARNESS_DIR}/agent-flow.jsonl`,即 catalog 的 `state
|
|
|
258
268
|
|
|
259
269
|
**第四种类型 `workflow-verdict`** 由 workflow/ralph 闸门(而非本消费者)写入——每个被把关的调用一行(`tool`、`workflow`/`objective`、`mode`、判定 `ok`/`advisory`/`denied`/`ask`、违规 `code`)——见 Gates → Workflow / ralph gate。展示身份字段(`workflow` / `objective`)同样带 1024 字符上限;判定的违规码绝不猜测(P-a `workflow.name.unknown` vs P-b `workflow.lease.uncovered`)。
|
|
260
270
|
|
|
261
|
-
**去重与回放范围。** 持久化水位线即去重机制:**冷热重叠**以及**插件重应用/重启**(重注册读取持久化水位线而非从空游标开始)下每个 `(runId, kind, seq)` 只产一行。**apply 之后创建**、带构造期种子日志(恢复/分叉会话——其种子从不进 firehose)的会话会在上游 `session/created`
|
|
271
|
+
**去重与回放范围。** 持久化水位线即去重机制:**冷热重叠**以及**插件重应用/重启**(重注册读取持久化水位线而非从空游标开始)下每个 `(runId, kind, seq)` 只产一行。**apply 之后创建**、带构造期种子日志(恢复/分叉会话——其种子从不进 firehose)的会话会在上游 `session/created` 事件上**冷扫描一次**,水位线同样保证该回填幂等。**分叉**会话的扫描从其 `inheritedEventCount` 开始:继承来的前缀属于父会话的历史,因此子会话只记录**自己**的事件——绝不会把父会话的行以子会话身份再记一份。水位线 sidecar 有界(每 harness 会话数上限,驱逐优先已不在线的会话)且完全受控:水位线不可读/不可写时降级为仅内存并告警一次——重启后会重录(诚实的去重欠录,绝不丢数据、绝不阻塞)。
|
|
262
272
|
|
|
263
273
|
**childId 关联 + 成员计数。** `workflow-agent` 行保留已发布成员的 `childId`(子会话 id);运行的展示 `name` 只存在于 `workflow-run` 行,面板为 agent/end 行经窗口查找解析(同一 `runId`——成员行本身不带名称)。面板把成员 COUNT 挂到 `workflow-run` 行(窗口内该 `runId` 的 `workflow-agent` 行数;窗口有界——被 ≤50 事件窗口截掉的成员如实缺席,绝不猜 0)。
|
|
264
274
|
|
|
@@ -274,11 +284,13 @@ agent-flow 账本——`{HARNESS_DIR}/agent-flow.jsonl`,即 catalog 的 `state
|
|
|
274
284
|
|
|
275
285
|
本包为 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
286
|
|
|
277
|
-
|
|
287
|
+
客户端入口经公开的两段式席位契约把面板注册为**右 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)。
|
|
288
|
+
|
|
289
|
+
面板是最新 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 时渲染居中未激活态卡片,检测到后自动呈现。
|
|
278
290
|
|
|
279
|
-
|
|
291
|
+
三个分区在唯一滚动主体内堆叠。**任务迭代**渲染迭代头部(未激活时为折叠摘要)+ **竖直** 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)。
|
|
280
292
|
|
|
281
|
-
|
|
293
|
+
**依赖**:面板客户端 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
294
|
|
|
283
295
|
安装 / 验证(客户端半体与服务器半体走同一条 bundle 行安装):
|
|
284
296
|
|
|
@@ -292,7 +304,7 @@ dsh web # 启动 → 服务 /plugins/@mstar-harness/dsh/clie
|
|
|
292
304
|
|
|
293
305
|
本地已验证(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
306
|
|
|
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
|
|
307
|
+
**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
308
|
|
|
297
309
|
## Development
|
|
298
310
|
|
|
@@ -314,7 +326,7 @@ bun run build
|
|
|
314
326
|
|
|
315
327
|
#### What the model sees
|
|
316
328
|
|
|
317
|
-
每个组合后的步骤携带一条 `mstar-engine
|
|
329
|
+
每个组合后的步骤携带一条 `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
330
|
|
|
319
331
|
**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
332
|
|
|
@@ -349,7 +361,7 @@ catalog 行在委托之后追加到组合步骤消息的**末尾**——请求
|
|
|
349
361
|
- **CLI `HOST_SIGNALS` 缺少 `subagent` token**——engine `ToolSignal` 联合已包含它且 `detectHost` 能处理,但 `packages/cli` 的 `HOST_SIGNALS` 尚未更新,`mstar host detect --signals subagent` 会拒绝,直到上游化时更新 CLI 列表。
|
|
350
362
|
- **入口是 `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
363
|
- **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
|
|
364
|
+
- **迭代 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
365
|
- **`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
366
|
- **本批次未交付角色→模型覆盖**——把角色路由到 fallbacks `model`(或经 fallbacks 规则路由 persona)需要改写启动请求上的子会话 `agentOptions`,但启动请求选项由调用方控制(tool-subagent 自己的 Config;调用参数仅为 `description`/`prompt`/`run_in_background`,且深度冻结)。等待上游 `fallbacks-explicit-role-tool` 或 N-B1 systemPrompt 采纳(roadmap §10.4)。
|
|
355
367
|
- **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,173 +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
|
-
|
|
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
|
|
107
119
|
`connection.rpc.call('/api', 'mstar/engineStatus', { args: { sessionId, cwd } })`
|
|
108
|
-
and renders the session's stored snapshot, or an explicit unavailable
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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)`
|
|
118
170
|
function (schema constants vs catalog evidence strictly separated; never
|
|
119
171
|
throws; explicit degraded states — muted empty states, never orange warn
|
|
120
|
-
boxes)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
base / target / spec integration, rendered only while active; the expanded
|
|
127
|
-
head is a LEFT-RIGHT SPLIT — branches (small left half, WIDTH-CAPPED —
|
|
128
|
-
`flex: 0 1 260px` + `max-width: 280px`, never stretches with the container; the
|
|
129
|
-
<860px column stack resets to content height) + steps (large right half,
|
|
130
|
-
`flex: 1 1 0` absorbing the remaining width) via `data-iteration-head-split`,
|
|
131
|
-
stacking on narrow widths, and NO
|
|
132
|
-
branch panel when there is no active iteration; the current step follows the
|
|
133
|
-
steering compass: `compassStatus: 'active'` (Phase 1 in flight) → Step 1
|
|
134
|
-
(iteration-start) is CURRENT with verdict `unknown` — no PASS/FAIL badge —
|
|
135
|
-
plan `20260811-panel-f4-iteration-zone`; the branches
|
|
136
|
-
block left the sidebar for this in plan `20260810-panel-sidebar-info`), a
|
|
137
|
-
**tasks zone** (5-column kanban: Todo / InProgress / InReview / Done /
|
|
138
|
-
`blocked-unknown` — the Blocked state and the former unknown catch-all fold
|
|
139
|
-
into ONE merged column titled「受阻/未知」/「Blocked / Unknown」, plan
|
|
140
|
-
`20260813-panel-quick-fixes` Task 1 — with count badges; every column caps
|
|
141
|
-
its rendered rows at `PLAN_CAP` with a clickable 「更多」/「收起」 expand
|
|
142
|
-
button (`data-kanban-more` anchor) unfolding the full column — the
|
|
143
|
-
projection keeps ALL plan rows, the cap is a render concern never a
|
|
144
|
-
discard), an
|
|
145
|
-
**agent-execution zone** (the four EXPECTED_ROLE_FLOW stage/phase columns
|
|
146
|
-
— review-edit-chain → sdd-implement → qc-tri → qa-gate (the terminal
|
|
147
|
-
stage; the former `sdd-task-review` stage is removed, its SDD L2 reviewer
|
|
148
|
-
is now the pipeline role `code-reviewer`, v2.1.1) — a strict FOUR-column
|
|
149
|
-
layout with NO standalone unknown column (plan
|
|
150
|
-
`20260812-panel-f5-design-system` Task 5, user 2026-08-12 round-2 decision —
|
|
151
|
-
the former rightmost unknown column of plan `20260812-panel-f5-agent-layout`
|
|
152
|
-
is superseded): the `general` bucket sinks into an **unknown sub-partition
|
|
153
|
-
at the bottom of the `qa-gate` column** (a `data-sub-bucket="unknown"`
|
|
154
|
-
caption row 「unknown / 未匹配角色」 after the last qa-gate card, then the
|
|
155
|
-
general cards; the standalone on-demand column was already removed in the
|
|
156
|
-
agent-layout plan); `explore` is removed — no card, no column. The `sdd-implement`
|
|
157
|
-
column splits into **sub-buckets** by the projected `entity.bucket` (never
|
|
158
|
-
a render guess): the **implementor** partition above — flow roles in the
|
|
159
|
-
stage's original order (fullstack-dev / fullstack-dev-2 / frontend-dev),
|
|
160
|
-
then the on-demand roles (ops-engineer / prompt-engineer, carrying the
|
|
161
|
-
**on-demand badge** — no standalone on-demand column) — and the
|
|
162
|
-
**sdd-reviewer** partition below (code-reviewer, the SDD L2 task reviewer),
|
|
163
|
-
with implementor / sdd-reviewer caption labels; `zone: 'on-demand'` entities
|
|
164
|
-
live in the implementor partition, `zone: 'general'` entities render in the
|
|
165
|
-
qa-gate column's bottom unknown sub-partition. The canvas is laid out in
|
|
166
|
-
**TWO side-by-side Phase groups** (plan `20260812-panel-f5-design-system`
|
|
167
|
-
Task 8, user 2026-08-12 round-4 decision #2; side-by-side layout per plan
|
|
168
|
-
`20260813-panel-agent-canvas-legend-layout` Task 2): the **Phase 1 group on
|
|
169
|
-
the LEFT** (review-edit-chain — the sequential Review & Edit chain) and the
|
|
170
|
-
**Phase 2 group on the RIGHT** (sdd-implement → qc-tri → qa-gate — the
|
|
171
|
-
iterative plan loop), top-aligned (all group label rows share the same
|
|
172
|
-
`y = PAD_Y`), each with its group label row; the **Phase-2 label annotates
|
|
173
|
-
the CURRENT PLAN** (projected `agents.activePlanId` — the first InProgress
|
|
174
|
-
`state.plans[]` row, `data-canvas-group-plan`; `+N more` when several plans
|
|
175
|
-
run in parallel, muted「无进行中 plan」when none). The subagent ENTITY cards aggregate **by role** from actual
|
|
176
|
-
dispatch evidence — the same role across sessions folds into one card ×N,
|
|
177
|
-
and every off-roster dispatch (the former `generalPurpose` SDD reviewer,
|
|
178
|
-
`scout`, anonymous `role === ''`) folds into the single `general` bucket
|
|
179
|
-
entity (the card is role-titled — the role id; the agent session id / task
|
|
180
|
-
tag ride the record line, never the title) — role chip / status point / ×N
|
|
181
|
-
count; running entities carry the business glow-pulse
|
|
182
|
-
highlight (on the ROUNDED `.card-body` — the card is a single rounded
|
|
183
|
-
element, no square outline overlay, plan `20260812-panel-f5-design-system`
|
|
184
|
-
Task 5), un-evidenced stages render the dashed "待执行" pending
|
|
185
|
-
placeholder with their expected role chips, un-evidenced KNOWN_AGENTS
|
|
186
|
-
members render dashed idle cards (the full 14-role roster is never
|
|
187
|
-
hidden), and the header shows the
|
|
188
|
-
`N executing · M pending` summary; cards carry the projected **emphasis
|
|
189
|
-
tier** (plan `20260812-panel-f5-design-system` Task 4, design doc §3):
|
|
190
|
-
`emphasis: 'current' | 'next' | 'off' | null` — the iteration's
|
|
191
|
-
current-phase roles render at **100%** chrome intensity, later-phase
|
|
192
|
-
expected roles at **75%**, already-passed / stage-less (on-demand, general)
|
|
193
|
-
roles at **45%**, and `null` (no iteration / unresolved transition) applies
|
|
194
|
-
NO override — always a chrome **alpha mix** (`--mstar-canvas-emphasis-*`
|
|
195
|
-
tokens; never a whole-card `opacity`, so the status point + running glow
|
|
196
|
-
stay opaque). Settled entities get a **standalone GREEN done frame + green
|
|
197
|
-
✓** (plan `20260812-panel-f5-design-system` Task 8, user round-4 decisions
|
|
198
|
-
#1/#3: `data-agent-done="true"` — a full-strength success border + 1px ring
|
|
199
|
-
on the rounded card body + the ✓ in the status point) **ONLY when
|
|
200
|
-
`emphasis ≠ 'off'`** — an off-tier role (already-passed / stage-less
|
|
201
|
-
on-demand + general) renders the muted dot instead and NEVER shows the
|
|
202
|
-
completion marker. The agent canvas filters dispatch evidence to the
|
|
203
|
-
**current iteration's plans only** (plan `20260813-panel-quick-fixes` Task
|
|
204
|
-
2): the steering compass `iterationId` when active, else the nearest
|
|
205
|
-
iteration from the catalog `plans[].iterationRefs` (most-recent plan by
|
|
206
|
-
8-digit id date prefix + doneAt); provably cross-iteration events produce
|
|
207
|
-
no entity/edge — the roster keeps its idle cards, and plan-less /
|
|
208
|
-
unknown-plan / standalone dispatches are never hidden. Status honesty (Task
|
|
209
|
-
2): `advisory` is no longer terminal — a soft-enforcement dispatch falls
|
|
210
|
-
through to its paired settle (green ✓ when a settle exists, `running` when
|
|
211
|
-
none), `denied` stays terminal, and the advisory verdict still renders in
|
|
212
|
-
the event log. The canvas legend sits BELOW the viewport (Task 3, moved
|
|
213
|
-
from above). The **iteration info section is SHARED by the tasks AND
|
|
214
|
-
agents tabs** (Task 8, decision #4 — one `IterationInfoSection` component,
|
|
215
|
-
both tabs render the same `view.iteration` block). Edges — plan `20260812-panel-f5-design-system` Task 5 (design
|
|
216
|
-
doc §2): the `expected` stage skeleton arrows AND the ANIMATED **next** edge
|
|
217
|
-
(the former `@keyframes agent-dash-flow` dash-flow arrow of plan
|
|
218
|
-
`20260810-panel-agent-flow-zone`) are **REMOVED** — flow order is implied
|
|
219
|
-
by the fixed column order + column labels, the current position by the
|
|
220
|
-
running card glow + status point — leaving TWO semantic kinds: the
|
|
221
|
-
evidence-driven **`actual` handoff** edges (same-plan ts-adjacent dispatch
|
|
222
|
-
entity-key pairs, `general` endpoints filtered, ≤1 per entity pair) drawn as
|
|
223
|
-
**bezier `C` curves** anchored to card **ports** — 4 fixed edge-midpoint
|
|
224
|
-
ports (north / south / east / west; static-invisible, hover-revealed as
|
|
225
|
-
small dots) with the arrow tip pulled back to a **10px standoff** off the
|
|
226
|
-
port — the arrow follows the line's local tangent at the anchor (**H1**),
|
|
227
|
-
and no line's stroke or arrow crosses any text (**H2**: standoff + side-gap
|
|
228
|
-
routing, design doc §2.0/§2.5/§2.6; tightened in plan
|
|
229
|
-
`20260813-panel-quick-fixes` Task 3 — same-column vertical flows whose
|
|
230
|
-
center-x line would cross an in-between card body reroute into the column's
|
|
231
|
-
LEFT side gap (forward AND reverse), and reverse horizontal beziers keep
|
|
232
|
-
direction-aware control points BETWEEN the endpoints, never bulging into
|
|
233
|
-
the adjacent column) — plus the **bidirectional supervise
|
|
234
|
-
line** (plan `20260812-panel-f5-agent-layout` Task 1/2) — one static
|
|
235
|
-
design-knowledge sub-bucket edge inside the `sdd-implement` column
|
|
236
|
-
(implementor ↔ sdd-reviewer — the mstar-sdd mutual-supervision contract),
|
|
237
|
-
now anchored at the **side-gap vertical anchor** (`x = card right edge +
|
|
238
|
-
18px`, vertical bezier flow, arrows along the vertical tangent — design doc
|
|
239
|
-
§2.5/§2.7); dim dashed by default, lit business SOLID when the projected
|
|
240
|
-
`evidenced` flag is true — evidence-driven lighting, never a fabricated
|
|
241
|
-
activation), with the
|
|
242
|
-
agent-flow event strip migrated into the **事件记录 (Event Log) tab** — a
|
|
243
|
-
non-canvas log page (spec F1.5, plan `20260811-panel-event-log`): two
|
|
244
|
-
partitions (Agent 流转事件 / 违规记录), every row an expandable native
|
|
245
|
-
`<details>` carrying the full catalog fields (missing → 「—」), muted empty
|
|
246
|
-
states — the two partitions render SIDE BY SIDE in a locked-height
|
|
247
|
-
two-column grid (`repeat(2, minmax(0, 1fr))` — the page never scrolls as a
|
|
248
|
-
whole; each partition pins its title and owns an internal `overflow-y`
|
|
249
|
-
scroll on its row list; plan `20260813-panel-quick-fixes` Task 4
|
|
250
|
-
root-caused the whole-page scroll — the panel root opts into the host
|
|
251
|
-
`data-conversation-composer-overlay` (the host's full-height opt-in), so
|
|
252
|
-
`height:100%` resolves and `.rowList`'s `overflow-y: auto` scrolls INSIDE
|
|
253
|
-
the partition (the host page no longer scrolls), with bottom clearance
|
|
254
|
-
reserving the floating composer via the host-published
|
|
255
|
-
`--dsh-composer-height`), falling back to two stacked 50/50 locked rows
|
|
256
|
-
below 1200px (`data-event-log-*` anchors unchanged, plan
|
|
257
|
-
`20260811-panel-f3-agent-general`) — the canvas-corner **AgentEventDock** is REMOVED with the page
|
|
258
|
-
(无双份日志, spec §5; the fixed footer bar — zone legend + gate summary +
|
|
259
|
-
violations — died with the WorkflowCanvas in the tabs-shell plan; the
|
|
260
|
-
footer that remains is the freshness marker). Empty branches (spec §2, plan
|
|
261
|
-
`20260812-panel-f5-agent-layout` Task 3): waiting keeps the muted hint, and
|
|
262
|
-
NO harness renders a **centered inactive-state card** — folder icon + 「No
|
|
263
|
-
Morning Star harness detected」 title + hint copy (the detail panel stays
|
|
264
|
-
inactive — no tabs, no sidebar — and activates automatically once a harness
|
|
265
|
-
is detected; `data-mstar-empty="no-harness"` stays on the title,
|
|
266
|
-
`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
|
+
|
|
267
178
|
Build step: `bun run
|
|
268
179
|
build-client` (`scripts/build-client-bundle.ts` — closure-factory CJS,
|
|
269
180
|
CLIENT_EXTERNALS external, CSS modules hashed + `<style data-plugin>`
|
|
@@ -272,11 +183,11 @@ injection, purity gate, and inline assertions that the bundle carries **no
|
|
|
272
183
|
and its plain-`.css` text loader were removed with the graph layer), zero
|
|
273
184
|
`@deepseek-ai/*` value imports and no `import.meta` / ESM statements — the
|
|
274
185
|
web loader executes plugin bundles as classic `<script>`s); the full `bun run
|
|
275
|
-
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
|
|
276
188
|
`/plugins/<id>/client.js` route serving the exact built bundle, and the
|
|
277
189
|
browser-handoff materialization (`inject`/`apply`/CSS injection under
|
|
278
|
-
classic-script semantics)
|
|
279
|
-
`install-verification.md` guide of the panel-beautify iteration (local harness root).
|
|
190
|
+
classic-script semantics).
|
|
280
191
|
|
|
281
192
|
Known limitations (this iteration): the iteration stepper's Step 1
|
|
282
193
|
(iteration-start) IS the current step while the steering compass is
|
|
@@ -296,9 +207,10 @@ never faked); the current-iteration filter with NO steering compass infers
|
|
|
296
207
|
the iteration from plan ids (8-digit date prefix) + doneAt — a
|
|
297
208
|
deterministic, documented heuristic, and only provably cross-iteration
|
|
298
209
|
events are dropped; no historical
|
|
299
|
-
back-scan of resumed long logs;
|
|
300
|
-
|
|
301
|
-
|
|
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
|
|
302
214
|
acceptance (R1 folded into this iteration's AC-1/2).
|
|
303
215
|
|
|
304
216
|
## Known constraints
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,20 +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
5
|
* On apply: creates the engine-status client over the client `connection`
|
|
6
6
|
* service (the panel's data path is the host's shared `/api` typert gateway —
|
|
7
7
|
* the persisted catalog row is only the anchor), registers the `mstar-panel`
|
|
8
|
-
* dictionaries,
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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).
|
|
13
15
|
*
|
|
14
16
|
* The client is created ONCE per apply and disposed with the fiber, so a
|
|
15
|
-
* reloaded plugin starts from a clean snapshot cache.
|
|
17
|
+
* reloaded plugin starts from a clean snapshot cache. Every registration
|
|
18
|
+
* sits in its own `ctx.effect` so unload disposes it.
|
|
16
19
|
*/
|
|
17
20
|
import type { Context as ClientContext } from '@deepseek-ai/cordis';
|
|
18
|
-
/**
|
|
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
|
+
*/
|
|
19
28
|
export declare const inject: string[];
|
|
20
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;
|