dsh-erpbot 0.1.0 → 0.1.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.md +50 -29
- package/bot-identity.js +246 -0
- package/client.js +2438 -627
- package/cordis.patch.yml +128 -0
- package/docs/README.md +39 -0
- package/docs/acceptance.md +136 -0
- package/docs/architecture.md +161 -0
- package/docs/bot-agents-spec.md +205 -0
- package/docs/bot-collaboration-spec.md +161 -0
- package/docs/data-contract.md +262 -0
- package/docs/mcp-inventory-analysis.md +58 -0
- package/docs/requirements.md +234 -0
- package/index.js +270 -15
- package/package.json +6 -2
- package/scripts/check-bot-identity.mjs +71 -0
- package/scripts/lint-factories.mjs +315 -0
- package/scripts/lint-scopes.mjs +179 -0
- package/scripts/scaffold-bots.mjs +76 -0
- package/scripts/test-manifest.mjs +72 -0
- package/scripts/verify.mjs +159 -0
- package/spec/README.md +299 -0
- package/spec/base-content-spec.md +129 -0
- package/spec/cai-content-spec.md +257 -0
- package/spec/shui-content-spec.md +252 -0
- package/spec/spec-CORE.md +155 -0
- package/spec/tui-content-spec.md +259 -0
- package/spec/zi-content-spec.md +256 -0
- package/src/assistant/index.js +389 -4
- package/src/bot-data.js +25 -13
- package/src/bundle.json +1 -0
- package/src/cards/index.js +18 -4
- package/src/dashboard/index.js +65 -25
- package/src/entry.js +7 -7
- package/src/i18n/index.js +80 -60
- package/src/mount.js +19 -2
- package/src/nav.js +7 -5
- package/src/pages-data.js +29 -262
- package/src/shell/index.js +57 -33
- package/src/styles.js +396 -78
- package/src/workbench/index.js +1297 -85
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# 推 · 军师 Bot(tui)· Bot 规格(v5 · 对话主导 + 头像配置)
|
|
2
|
+
|
|
3
|
+
> 定位:军师把不确定性与假设讲清楚;页面以对话为主区,KPI 行保留,KPI 行以下整块是 Chat 卡片。
|
|
4
|
+
> 布局:TopBar(无 AI 助手入口)+ 左 rail + 顶排 4 张 KPI 卡(布局、7 种变体、`MetricDetailModal` 不变)+ KPI 行以下整块 Chat 卡;无常驻左栏、无常驻 Bot 面板。
|
|
5
|
+
> 配置:点对话头部 Bot 头像打开右侧配置抽屉(身份 / 技能 / 记忆三页签),覆盖式、不挤压对话;技能结果在画布抽屉用原渲染器呈现。
|
|
6
|
+
> 范围:本 spec 只写身份、技能、记忆与对话交互逻辑;不写数值、金额、比率、时点、勾稽与数据集列定义,这些由 payload 与画布承载。
|
|
7
|
+
|
|
8
|
+
## 1. 页面与对话布局
|
|
9
|
+
|
|
10
|
+
### 1.1 页面骨架
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
14
|
+
│ TopBar:品牌 / 问候 / 搜索 / 通知 / 头像(无 AI 助手入口) │
|
|
15
|
+
├────┬─────────────────────────────────────────────────────────┤
|
|
16
|
+
│ R │ 4 × KPI 卡(布局与 7 种变体不变,点开 MetricDetailModal) │
|
|
17
|
+
│ a ├─────────────────────────────────────────────────────────┤
|
|
18
|
+
│ i │ Chat 卡片(KPI 行以下整块,核心板块) │
|
|
19
|
+
│ l │ ┌─────────────────────────────────────────────────────┐ │
|
|
20
|
+
│ │ │ [头像▾] 军师 · 把不确定性与假设讲清楚 ● 就绪 │ │
|
|
21
|
+
│ 7 │ │ 会话标题 历史 新会话 画布 │ │
|
|
22
|
+
│ │ ├─────────────────────────────────────────────────────┤ │
|
|
23
|
+
│ 页 │ │ 官方会话(embedded chat):开场白 + chips + 消息流 │ │
|
|
24
|
+
│ │ ├─────────────────────────────────────────────────────┤ │
|
|
25
|
+
│ │ │ 官方 composer │ │
|
|
26
|
+
│ │ └─────────────────────────────────────────────────────┘ │
|
|
27
|
+
└────┴─────────────────────────────────────────────────────────┘
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 1.2 Chat 卡
|
|
31
|
+
|
|
32
|
+
- 外层沿用工作台卡片族与容器查询;卡内只有对话,不设常驻左栏。
|
|
33
|
+
- 头部左:圆形 Bot 头像按钮(Aurora 强调色 + 运行状态点),点击打开配置抽屉;旁边是名称 + 一句话角色 + 状态。
|
|
34
|
+
- 状态点语义:就绪 / 运行中 / 待交互 / 未读 / 错误,与官方会话状态同源。
|
|
35
|
+
- 头部右:会话标题(可截断,点击展开历史)+ 历史 / 新会话 / 画布三个按钮。
|
|
36
|
+
- 对话体:官方 `conversation.content` 嵌入(`variant: embedded`);欢迎态显示开场白 + 3 个引导 chips,点击预填 composer。
|
|
37
|
+
- 输入区:官方 composer,不自绘输入框。
|
|
38
|
+
- 页面级 state 只有语言、主题、当前页、当前 Bot 会话,其余交给会话服务。
|
|
39
|
+
|
|
40
|
+
### 1.3 头像 → 配置抽屉
|
|
41
|
+
|
|
42
|
+
- 入口:点头像;宽屏另有「配置」文字按钮,窄屏只留头像。键盘可聚焦,Enter / Space 打开。
|
|
43
|
+
- 呈现:右侧覆盖式 `aside`,宽 `420–480px`,覆盖在 Chat 之上,**不挤压、不销毁对话**;`≤900px` 全宽;Escape 或点击遮罩关闭。
|
|
44
|
+
- 页签一 · 身份:身份卡(名称 / 角色 / 图标 / 强调色 / 版本)+ 角色定义(职责 / 语气 / 边界 / 不适用,只读)+ 可编辑偏好(称呼、问候语偏好、回复语气偏好、时间与单位偏好)。
|
|
45
|
+
- 页签二 · 技能:已加载 / 可加载两组;每行 = 名称 + 来源 + 版本 + P 级 + 状态开关 + 「问这个」;顶部显示 `已加载 N / 12`;底部「从平台技能库加载」;灰度技能带「灰度」角标,停用技能置灰。
|
|
46
|
+
- 页签三 · 记忆:用户身份关系 + 技能清单摘要 + 实际工作区路径 + 「恢复默认」;自动保存并显示保存状态与时点。
|
|
47
|
+
- 关闭:不新增路由、不刷新页面;会话、滚动位置与输入草稿保留;焦点归还头像按钮。
|
|
48
|
+
- 抽屉打开时焦点移入抽屉,Tab 不逃逸到背景;配置抽屉与画布抽屉不同时打开。
|
|
49
|
+
|
|
50
|
+
### 1.4 技能画布
|
|
51
|
+
|
|
52
|
+
- 入口:对话回复「查看结果」、技能行「看结果」、头部「画布」按钮(打开上次画布)。
|
|
53
|
+
- 呈现:右侧覆盖式画布抽屉(与配置抽屉同层规则);顶部「技能名 + 返回对话」。
|
|
54
|
+
- 内容复用 12 种渲染器与 payload;图表类保留 `alt` 图表 / 清单双视图与合计对平规则。
|
|
55
|
+
- 临时视图:关闭即回对话;不改会话、不改技能加载状态;画布与对话读同一 payload 快照。
|
|
56
|
+
|
|
57
|
+
### 1.5 响应式与主题
|
|
58
|
+
|
|
59
|
+
- 宽度用 `.erp-app` 容器查询(`container-name: erp`):`≤1180px` KPI 行 2 列、头部动作收进「更多」菜单;`≤900px` 配置 / 画布抽屉全宽;`≤720px` chips 折行、头像与名称纵向排列;`≤560px` 隐藏角色副标。
|
|
60
|
+
- 高度用 `.erp-board` 容器查询(`container-name: board`):短高度下欢迎语缩短、chips 收成一行、输入区始终可见。
|
|
61
|
+
- 禁止 `@media` 判断面板尺寸;CSS 注释禁止出现反引号。
|
|
62
|
+
- 明暗主题跟随 DSH(`useHostTheme`);抽屉、画布与 Chat 共用 `--erp-*` token。
|
|
63
|
+
|
|
64
|
+
## 2. Bot 身份定义
|
|
65
|
+
|
|
66
|
+
### 2.1 身份字段
|
|
67
|
+
|
|
68
|
+
| 字段 | 值 |
|
|
69
|
+
|---|---|
|
|
70
|
+
| id | `tui` |
|
|
71
|
+
| 名称 | 军师 / The Planner |
|
|
72
|
+
| 一句话角色 | 把不确定性与假设讲清楚 |
|
|
73
|
+
| 图标 | `compass` |
|
|
74
|
+
| 强调色 | `aurora-v1` |
|
|
75
|
+
| 版本 | `S3` |
|
|
76
|
+
| 工作区 | `D:\erpBot\tui`(D 盘不可用时降级 `Documents\deepseek-harness\erpbot-tui`) |
|
|
77
|
+
| 工作区标题 | `erpBot · 推 Bot` |
|
|
78
|
+
| 会话键 | `dsh-erpbot.bot.session.v1.tui` |
|
|
79
|
+
| 记忆键 | `dsh-erpbot.bot.memory.v1.tui` |
|
|
80
|
+
|
|
81
|
+
### 2.2 角色定义
|
|
82
|
+
|
|
83
|
+
| 维度 | zh | en |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| 职责 | 解释预算、预测、情景、假设、分摊、管报、差异与资金计划的口径和版本;先给区间再给结论;说明结论依赖的假设与生效版本;证据交给画布。 | Explain the basis and version of budget, forecast, scenario, assumption, allocation, management report, variance and cash planning. Give the range before the conclusion. State the assumptions and effective version behind each conclusion. Leave the evidence to the canvas. |
|
|
86
|
+
| 语气 | 结构化、假设先行;先区间后结论;不寒暄、不夸张、不用形容词替代口径。 | Structured and assumption first. Range before conclusion. No small talk, no exaggeration, no adjectives in place of a stated basis. |
|
|
87
|
+
| 边界 | 不改变已生效口径;不替业务拍板;不把预测写成承诺;不维护参数与版本;不做待办处置;越界时明确拒答并指向对应 Bot。 | Do not change an effective basis. Do not decide for the business. Do not present a forecast as a commitment. Do not maintain parameters or versions. Do not handle to-dos. When out of scope, decline and point to the owning Bot. |
|
|
88
|
+
| 不适用 | 法定报表与凭证(财)、账户与收付(资)、申报与税款(税)、数据源与口径维护、工具权限与审计(底座 · MCP 与数据)、待办处置(总览)。 | Statutory statements and vouchers (cai). Accounts and payments (zi). Filing and tax (shui). Data sources, basis maintenance, tools, permissions and audit (base, MCP and data). To-do handling (overview). |
|
|
89
|
+
|
|
90
|
+
### 2.3 开场白与欢迎 chips
|
|
91
|
+
|
|
92
|
+
- 开场白 `zh`:我是军师,负责把不确定性与假设讲清楚。可以从预算、预测、情景、假设、分摊、管报、差异或资金计划开始。
|
|
93
|
+
- 开场白 `en`:I am The Planner. I make uncertainty and assumptions explicit. Start from budget, forecast, scenario, assumption, allocation, management report, variance or cash plan.
|
|
94
|
+
- chips 逻辑:默认取已加载技能中 P0 技能的前 3 条触发问法(问法见 §3.1),点击经 `requestDraftInitialization`(`whenDraftExists: replace`)预填 composer;发送前可编辑,不自动发送。
|
|
95
|
+
- 无可加载技能时不显示 chips,只显示开场白与输入区。
|
|
96
|
+
- 身份可微调不可改内核:称呼、问候偏好、语气偏好、时间与单位偏好可改;职责 / 边界 / 不适用项只读。身份与技能解耦。
|
|
97
|
+
|
|
98
|
+
## 3. 技能配置
|
|
99
|
+
|
|
100
|
+
### 3.1 本地技能(8 项,全 P0)
|
|
101
|
+
|
|
102
|
+
| id | 名称(zh / en) | 能力描述 | 渲染器 | 默认状态 | 触发问法(zh) |
|
|
103
|
+
|---|---|---|---|---|---|
|
|
104
|
+
| `tui.budget` | 预算编制 / Budget build | 编制版本推进、部门填报与批复状态 | `bars` | `loaded` | 本版编制与上一版差在哪几个部门 |
|
|
105
|
+
| `tui.forecast` | 滚动预测 / Rolling forecast | 未来期间的收入预测与回测复核 | `chart` | `loaded` | 未来期间的预测收入按哪版假设 |
|
|
106
|
+
| `tui.scenario` | 情景模拟 / Scenario runs | 基准、乐观、压力与汇率敏感的情景对比 | `scenarios` | `loaded` | 压力情景下编制还剩多少空间 |
|
|
107
|
+
| `tui.assumption` | 假设版本 / Assumption set | 假设版本链、参数级变更与运行记录 | `timeline` | `loaded` | 当前假设相对上一版改了什么 |
|
|
108
|
+
| `tui.allocation` | 成本分摊 / Cost allocation | 归集池、分摊规则与接收方 | `donut` | `loaded` | 归集池摊到哪些部门、按哪版规则 |
|
|
109
|
+
| `tui.mgmt-report` | 管报编制 / Management reports | 管报模板、期间实例与复核状态 | `table` | `loaded` | 管报哪一项还在复核 |
|
|
110
|
+
| `tui.variance` | 差异归因 / Variance attribution | 期间预算与实际的差异项呈现 | `bars` | `loaded` | 差异最大的费用项是哪个 |
|
|
111
|
+
| `tui.cash-plan` | 资金计划 / Cash planning | 资金窗口、安全垫与情景,接资页 | `cards` | `loaded` | 资金窗口是否跌破安全垫 |
|
|
112
|
+
|
|
113
|
+
本地技能 `version` 写 `null`,`source` 为 `bot-local`;8 项全 P0、默认 `loaded`。技能状态用 `loaded / available / disabled`,UI 状态色用 `ok / warn / off`。
|
|
114
|
+
|
|
115
|
+
### 3.2 可加载的平台技能(4 项)
|
|
116
|
+
|
|
117
|
+
| 技能(zh / en) | 版本 | 状态 | 可加载 | 本页用途 |
|
|
118
|
+
|---|---|---|---|---|
|
|
119
|
+
| 现金流预测 / Cash flow forecast | `v2.1` | 灰度 | 可加载,带「灰度」角标、默认只读 | 叠加到滚动预测画布 |
|
|
120
|
+
| 预算编制 / Budget build | `v2.2` | 启用 | 可加载 | 补充编制步骤与口径提示 |
|
|
121
|
+
| 管报生成 / Management report | `v1.4` | 启用 | 可加载 | 补充管报模板与出表流程 |
|
|
122
|
+
| 差异归因 / Variance attribution | `v1.1` | 启用 | 可加载 | 补充差异基准与解释口径 |
|
|
123
|
+
|
|
124
|
+
来源为底座「技能与场景」的技能注册表 S3(共 12 项);Bot 只能加载,不能改写版本、策略与口径。
|
|
125
|
+
|
|
126
|
+
### 3.3 加载 / 卸载与状态规则
|
|
127
|
+
|
|
128
|
+
- 默认已加载 8 项本地 P0;平台技能默认 `available`,用户在配置抽屉「技能」页签加载。
|
|
129
|
+
- 同一 Bot 上限 **12**;当前已加载 8,余量 4(12 − 8);达上限提示「先卸载一个再加载」,不自动替换。
|
|
130
|
+
- 加载 / 卸载写入记忆 `skills.inventory`(`loadedAt`、`lastUsedAt`);卸载只改状态,不删画布历史。
|
|
131
|
+
- 灰度技能可加载并显示角标、默认只读;停用技能置灰不可加载(旧银企 RPA v0.9)。
|
|
132
|
+
- 8 项本地技能 `writeScope = read`;唯一写动作是「发起运行 / 发起编制」,经 MCP 落回执(`audit: RC-…`),Bot 不直写业务表。
|
|
133
|
+
- 技能不改变身份与口径:画布永远读 payload 当前值,前端不重算业务数;平台技能只加载不改版本。
|
|
134
|
+
|
|
135
|
+
## 4. 记忆配置
|
|
136
|
+
|
|
137
|
+
### 4.1 用户身份关系字段
|
|
138
|
+
|
|
139
|
+
| 字段 | 类型 | 说明 |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| `user.principalId` / `displayName` | 文本 / `{zh,en}` | 登录人与显示名,取主数据 |
|
|
142
|
+
| `user.roleKey` / `orgPath` | 文本 | 角色键与组织路径,决定默认数据范围 |
|
|
143
|
+
| `user.relations` | 数组 | `reviewer` / `approver` / `collaborator`;含 `id`、`displayName`,可带 `scope`(技能 id) |
|
|
144
|
+
| `user.permissions` | 对象 | `datasets`、`canExport`、`canWrite`;本页 `canWrite = false` |
|
|
145
|
+
| `user.preferences` | 对象 | `lang`、`unit`、`periodWindow`、`salutation`、`replyTone` |
|
|
146
|
+
|
|
147
|
+
### 4.2 技能清单字段
|
|
148
|
+
|
|
149
|
+
| 字段 | 类型 | 说明 |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| `skills.revision` | 文本 | `S3` |
|
|
152
|
+
| `skills.inventory` | 数组 | `skillId`、`source`、`state`、`version`、`loadedAt`、`lastUsedAt` |
|
|
153
|
+
| `skills.loadedCount` / `limit` | 整数 | 已加载数 / 上限 12 |
|
|
154
|
+
| `sessions` | 对象 | `lastSessionId`、`lastActiveAt` |
|
|
155
|
+
| `notes` | 数组 | 用户偏好预留;禁止存敏感信息 |
|
|
156
|
+
|
|
157
|
+
### 4.3 存储 / 恢复默认 / 隐私
|
|
158
|
+
|
|
159
|
+
| 项 | 规则 |
|
|
160
|
+
|---|---|
|
|
161
|
+
| 主存储 | `localStorage` 键 `dsh-erpbot.bot.memory.v1.tui`,单 Bot 单键,JSON |
|
|
162
|
+
| 写入时机 | 加载 / 卸载技能、修改身份偏好、更新身份关系、恢复默认 |
|
|
163
|
+
| 读取时机 | 配置抽屉打开时;对话欢迎态渲染时 |
|
|
164
|
+
| 缺失 / 损坏 | 回退默认记忆(登录人 + 8 项 P0 技能),不阻塞页面、不弹窗 |
|
|
165
|
+
| 隔离 | 四个 Bot 各一份,互不读取;底座(MCP 与数据)不读 Bot 记忆 |
|
|
166
|
+
| 隐私 | 只存 id、显示名与权限摘要;不记录业务数据;不存手机号、证件号、银行账号;不随导出外发 |
|
|
167
|
+
| 恢复默认 | 二次确认后仅重置本地记忆,不动会话、画布与工作区文件 |
|
|
168
|
+
|
|
169
|
+
示例仅示字段结构,尖括号为占位符,不含真实业务值:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"schema": "erp.bot.memory.v1",
|
|
174
|
+
"botId": "tui",
|
|
175
|
+
"updatedAt": "<ISO 时间>",
|
|
176
|
+
"user": {
|
|
177
|
+
"principalId": "<登录人 id>",
|
|
178
|
+
"displayName": { "zh": "<姓名>", "en": "<name>" },
|
|
179
|
+
"roleKey": "<角色键>",
|
|
180
|
+
"orgPath": "<组织路径>",
|
|
181
|
+
"relations": [
|
|
182
|
+
{ "type": "reviewer", "id": "<复核人 id>", "displayName": { "zh": "<姓名>", "en": "<name>" } },
|
|
183
|
+
{ "type": "approver", "id": "<审批人 id>", "displayName": { "zh": "<姓名>", "en": "<name>" } }
|
|
184
|
+
],
|
|
185
|
+
"permissions": { "datasets": ["<数据集通配>"], "canExport": false, "canWrite": false },
|
|
186
|
+
"preferences": { "lang": "<zh | en>", "unit": "<auto | wan | yuan>", "periodWindow": "<期间>", "salutation": "<称呼>", "replyTone": "<语气>" }
|
|
187
|
+
},
|
|
188
|
+
"skills": {
|
|
189
|
+
"revision": "S3",
|
|
190
|
+
"inventory": [
|
|
191
|
+
{ "skillId": "tui.budget", "source": "bot-local", "state": "loaded", "version": null, "loadedAt": "<ISO 时间>", "lastUsedAt": "<ISO 时间>" },
|
|
192
|
+
{ "skillId": "plat.cash-forecast", "source": "platform", "state": "available", "version": "v2.1" }
|
|
193
|
+
],
|
|
194
|
+
"loadedCount": "<已加载数>",
|
|
195
|
+
"limit": 12
|
|
196
|
+
},
|
|
197
|
+
"sessions": { "lastSessionId": "<会话 id>", "lastActiveAt": "<ISO 时间>" },
|
|
198
|
+
"notes": []
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## 5. 对话交互
|
|
203
|
+
|
|
204
|
+
### 5.1 会话与工作区
|
|
205
|
+
|
|
206
|
+
- 工作区默认 `D:\erpBot\tui`;Host 路由 `POST /erp/workspace` 接受白名单 `{ "bot": "tui" }`,目录由插件固定映射,不接受请求传入路径。
|
|
207
|
+
- D 盘不存在或无写权限时降级到 `Documents\deepseek-harness\erpbot-tui`,并在配置抽屉「记忆」页显示实际路径,不静默失败。
|
|
208
|
+
- 会话键 `dsh-erpbot.bot.session.v1.tui`;每 Bot 独立会话列表;工作区标题 `erpBot · 推 Bot`。
|
|
209
|
+
- 切页不销毁会话(`sessions.retain` 持有引用),切回恢复;页面卸载释放引用并持久化 `lastSessionId`。
|
|
210
|
+
- 旧会话键在首次进入时一次性迁移到 Bot 会话键,迁移失败则新建会话,不阻塞页面。
|
|
211
|
+
|
|
212
|
+
### 5.2 配置抽屉行为
|
|
213
|
+
|
|
214
|
+
- 打开方式:点头像或「配置」按钮;打开时不新增路由、不刷新页面、不重新拉取会话。
|
|
215
|
+
- 页签切换保留滚动位置与表单草稿;身份偏好在失焦或点「保存」时写入,显示「已保存 · HH:mm」。
|
|
216
|
+
- 技能页签的加载 / 卸载立即生效并写入记忆;`已加载 N / 12` 实时更新;达上限时禁用未加载行的开关。
|
|
217
|
+
- 记忆页签的「恢复默认」需二次确认;重置后身份偏好回到默认,技能清单回到 8 项本地 P0。
|
|
218
|
+
- 关闭后对话会话、滚动位置、输入草稿均不丢;Escape 与遮罩点击等效。
|
|
219
|
+
|
|
220
|
+
### 5.3 技能三入口与画布
|
|
221
|
+
|
|
222
|
+
| 入口 | 动作 | 落点 |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| 欢迎 chips | 取已加载 P0 技能的 3 条触发问法预填 composer | 对话输入区 |
|
|
225
|
+
| 技能行「问这个」 | 预填该技能触发问法,抽屉可保持打开 | 对话输入区 |
|
|
226
|
+
| 对话回复「查看结果」 | 切换到画布抽屉,用该技能对应渲染器呈现 | 画布抽屉 |
|
|
227
|
+
|
|
228
|
+
- 「看结果」与「画布」按钮同样打开画布抽屉;画布顶部「返回对话」关闭抽屉。
|
|
229
|
+
- 画布是临时视图:不改会话、不改技能加载状态;图表类保留 `alt` 双视图与合计对平规则。
|
|
230
|
+
- 画布与对话共享同一 payload 快照,不显示不同时点的数;前端不重算业务值。
|
|
231
|
+
|
|
232
|
+
### 5.4 错误与降级
|
|
233
|
+
|
|
234
|
+
| 场景 | 表现 |
|
|
235
|
+
|---|---|
|
|
236
|
+
| `sessions` / `workspaces` 服务不可用 | Chat 区显示降级说明 + 「打开官方会话」链接,不白屏 |
|
|
237
|
+
| 工作区创建失败 | 显示错误 + 「重试」;配置抽屉与画布仍可用(本地数据) |
|
|
238
|
+
| 工作区降级到 Documents | 抽屉「记忆」页显示实际路径与降级原因 |
|
|
239
|
+
| 会话丢失或清理 | 自动新建会话;历史列表给空态文案 |
|
|
240
|
+
| 宿主无 `conversation.content` 槽位 | 显示 fallback 卡片,不吞错 |
|
|
241
|
+
| 画布 payload 缺失或运行失败 | 画布显示「结果不可用」并保留上次成功快照、标 `warn`,不静默回退为 0 |
|
|
242
|
+
| 灰度技能异常 | 画布标「灰度 · 已回滚」并退回本地结果,不影响 KPI 行 |
|
|
243
|
+
|
|
244
|
+
## 6. 验收清单
|
|
245
|
+
|
|
246
|
+
- [ ] 顶排仍是 4 张 KPI 卡,7 种变体与 `MetricDetailModal` 不变;本 spec 与页面均未写具体数值。
|
|
247
|
+
- [ ] KPI 行以下是一张 Chat 大卡片,无常驻左栏、无常驻 Bot 面板。
|
|
248
|
+
- [ ] 对话头部有可点击 Bot 头像 + 名称 + 一句话角色 + 状态点;右侧有会话标题与历史 / 新会话 / 画布。
|
|
249
|
+
- [ ] 点头像打开配置抽屉(身份 / 技能 / 记忆三页签);抽屉覆盖式,不挤压对话。
|
|
250
|
+
- [ ] 关闭抽屉后会话、滚动位置与输入草稿不丢;Escape / 遮罩 / 返回均可关闭。
|
|
251
|
+
- [ ] 身份页角色定义只读、偏好可改且落记忆;技能页加载 / 卸载生效并写记忆;记忆页可见身份关系与技能清单摘要,可恢复默认。
|
|
252
|
+
- [ ] 8 项本地技能全 P0、默认 `loaded`;4 项平台技能可加载;灰度有角标、停用置灰;上限 12 生效。
|
|
253
|
+
- [ ] 技能三入口(chips / 问这个 / 查看结果)均可用;画布可打开并返回对话。
|
|
254
|
+
- [ ] 每 Bot 独立工作区 `D:\erpBot\tui` 与会话键;切页 / 切语言 / 刷新保持会话。
|
|
255
|
+
- [ ] D 盘不可用时降级到 `Documents\deepseek-harness\erpbot-tui` 并显示实际路径。
|
|
256
|
+
- [ ] 记忆键 `dsh-erpbot.bot.memory.v1.tui` 读写正常;缺失 / 损坏回退默认且不报错。
|
|
257
|
+
- [ ] TopBar 与总览无 AI 助手入口;无 Dock / Rail / Overlay 残留。
|
|
258
|
+
- [ ] 中英双语成对、英文无中文与撇号;无感叹号、营销词与 emoji。
|
|
259
|
+
- [ ] 暗色主题正常;`≤1180 / ≤900 / ≤720 / ≤560` 窄面板按容器查询降级。
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# 资 · 司库 Bot(zi)· Bot 规格(v5 · 对话主导 + 头像配置)
|
|
2
|
+
|
|
3
|
+
> 定位:**资 · 现在**的司库 Bot,守住可支付能力与安全垫;回答「钱在哪、够不够、谁没对上、不够拿什么补」。
|
|
4
|
+
> 布局:TopBar(无 AI 助手入口)+ 左 rail 7 个导航目录 + 顶排 4 张 KPI 卡(布局与 7 种变体不变)+ KPI 行以下整块 **Chat 卡片**(核心板块,无常驻左栏)。
|
|
5
|
+
> 配置:Bot 身份 / 技能 / 记忆不常驻,点 Chat 头部 **Bot 头像**打开右侧配置抽屉(身份 / 技能 / 记忆三页签,覆盖式、不挤压对话)。
|
|
6
|
+
> 数据:本 spec 不写业务数据;KPI 数值、金额、比率、时点、勾稽算式、数据集列定义均由 payload 与画布承载,这里只写身份、技能、记忆、对话与画布的逻辑。
|
|
7
|
+
> 工作区:`D:\erpBot\zi`(D 盘不可用时降级到 `Documents\deepseek-harness\erpbot-zi`);会话键 `dsh-erpbot.bot.session.v1.zi`;记忆键 `dsh-erpbot.bot.memory.v1.zi`。
|
|
8
|
+
|
|
9
|
+
## 1. 页面与对话布局
|
|
10
|
+
|
|
11
|
+
### 1.1 页面骨架(ASCII:KPI 行 + Chat 卡,无左栏)
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
TopBar:品牌 / 问候 / 搜索 / 通知 / 头像(右上角无 AI 助手入口)
|
|
15
|
+
左 rail:7 个导航目录 + 语言
|
|
16
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
17
|
+
│ 4 × KPI 卡(布局与 7 种变体不变,点开仍为 MetricDetailModal) │
|
|
18
|
+
├──────────────────────────────────────────────────────────────┤
|
|
19
|
+
│ Chat 卡片(占满 KPI 行以下全部空间) │
|
|
20
|
+
│ [头像] 司库 · 守住可支付能力与安全垫 状态点 · 就绪 │
|
|
21
|
+
│ 会话标题 历史 新会话 画布 │
|
|
22
|
+
│ 官方会话(embedded):开场白 + 3 个引导 chips + 消息流 │
|
|
23
|
+
│ 官方 composer(输入区) │
|
|
24
|
+
└──────────────────────────────────────────────────────────────┘
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 1.2 Chat 卡(头部 / 会话 / 欢迎 chips / composer)
|
|
28
|
+
|
|
29
|
+
- 外层沿用 `.card workbench` 卡片族与容器查询;Card 内只有对话,没有常驻左栏或 Bot 面板。
|
|
30
|
+
- 头部左侧:**Bot 头像按钮**(圆形、Aurora 强调色、带状态点),旁边是 Bot 名称 + 一句话角色 + 状态点(就绪 / 运行中 / 待交互 / 未读 / 错误)。
|
|
31
|
+
- 头部右侧:会话标题(可点击展开历史列表)+ 历史 / 新会话 / 画布三个按钮;窄屏收进「更多」菜单。
|
|
32
|
+
- 对话体:官方 `conversation.content` 嵌入(`variant: "embedded"`);欢迎态显示开场白 + 3 个引导 chips,消息流由会话服务驱动。
|
|
33
|
+
- 输入区:官方 composer,不自绘输入框;草稿随会话保留。
|
|
34
|
+
- KPI 卡只是 Bot 的状态牌,不改布局、不改弹层;卡内数值由 payload 提供,本 spec 不写。
|
|
35
|
+
- 页面级 state 只有语言、主题、当前页、当前 Bot 会话;其余交给会话服务。
|
|
36
|
+
|
|
37
|
+
### 1.3 头像 → 配置抽屉(入口、三页签、关闭行为)
|
|
38
|
+
|
|
39
|
+
- 入口:头部头像点击;头部「配置」文字按钮(窄屏只留头像)。
|
|
40
|
+
- 呈现:右侧覆盖式抽屉(`aside`,宽 420–480px,覆盖在 Chat 之上,**不挤压、不销毁对话**);≤900px 全宽;Escape / 点击遮罩 / 关闭按钮均可关闭。
|
|
41
|
+
- 页签三个:
|
|
42
|
+
1. **身份**:身份卡(名称 / 角色 / 图标 / 强调色 / 版本)+ 角色定义(职责 / 语气 / 边界 / 不适用,只读)+ 可编辑偏好(称呼、问候语偏好、回复语气偏好、时间与单位偏好)。
|
|
43
|
+
2. **技能**:已加载 / 可加载两组;行 = 名称 + 来源(本地 / 平台)+ 版本 + 优先级 + 状态开关 + 「问这个」;顶部显示 `已加载 N / 12`;底部「从平台技能库加载」入口;灰度技能带「灰度」角标,停用技能置灰不可加载。
|
|
44
|
+
3. **记忆**:用户身份关系(登录人 / 角色 / 组织 / 复核与审批关系 / 数据权限 / 偏好)+ 技能清单摘要 + 实际工作区路径 + 保存状态与时点 + 「恢复默认」。
|
|
45
|
+
- 行为:打开不新增路由、不刷新页面;关闭后对话滚动位置、会话与草稿不变;抽屉内操作即时生效并写记忆。
|
|
46
|
+
- 无障碍:抽屉内焦点循环,关闭后焦点回到头像按钮;页签与开关可用键盘操作。
|
|
47
|
+
|
|
48
|
+
### 1.4 技能画布(按需抽屉)
|
|
49
|
+
|
|
50
|
+
- 触发:对话回复中的「查看结果」、技能行的「看结果」、头部「画布」按钮(打开上次画布)。
|
|
51
|
+
- 呈现:右侧覆盖式画布抽屉(与配置抽屉同一层级规则),顶部「技能名 + 返回对话」;内容复用 12 种渲染器与 payload。
|
|
52
|
+
- 图表类技能保留 payload 的 `alt`(图表 / 清单双视图)规则,画布内可切换。
|
|
53
|
+
- 画布是临时视图:关闭即回对话,不改变会话、不改变技能加载状态;不新增路由。
|
|
54
|
+
|
|
55
|
+
### 1.5 响应式与主题
|
|
56
|
+
|
|
57
|
+
- 宽度用 `.erp-app` 容器查询(`container-name: erp`):`≤1180px` KPI 行 2 列、Chat 头部动作收进「更多」;`≤900px` 配置 / 画布抽屉全宽;`≤720px` 引导 chips 折行、头像与名称纵向排列;`≤560px` 隐藏角色副标。
|
|
58
|
+
- 高度用 `.erp-board` 容器查询(`container-name: board`):短高度下欢迎语缩短、chips 收成一行、输入区始终可见。
|
|
59
|
+
- 禁止 `@media` 判断面板尺寸;CSS 注释里禁止反引号。
|
|
60
|
+
- 明暗主题跟随 DSH(`useHostTheme`);抽屉与画布沿用同一套 `--erp-*` token。
|
|
61
|
+
|
|
62
|
+
## 2. Bot 身份定义
|
|
63
|
+
|
|
64
|
+
### 2.1 身份字段
|
|
65
|
+
|
|
66
|
+
| 字段 | 值 |
|
|
67
|
+
|---|---|
|
|
68
|
+
| id | `zi` |
|
|
69
|
+
| 名称 | 司库 / The Treasurer |
|
|
70
|
+
| 角色 | 守住可支付能力与安全垫 / Guard payable capacity and the safety cushion |
|
|
71
|
+
| 页面 | 资 · 现在 / Funds · Now |
|
|
72
|
+
| 图标 | `wallet` |
|
|
73
|
+
| 强调色 | `aurora-v1` |
|
|
74
|
+
| 版本 | `S3`(技能注册表版本,显示在身份卡) |
|
|
75
|
+
| 工作区 | `D:\erpBot\zi`;D 盘不可用时降级 `Documents\deepseek-harness\erpbot-zi` |
|
|
76
|
+
| 会话键 | `dsh-erpbot.bot.session.v1.zi` |
|
|
77
|
+
| 记忆键 | `dsh-erpbot.bot.memory.v1.zi` |
|
|
78
|
+
| 身份卡可见项 | 名称 / 角色 / 图标 / 强调色 / 版本 |
|
|
79
|
+
| 可编辑偏好 | 称呼 / 问候语偏好 / 回复语气偏好 / 时间与单位偏好 |
|
|
80
|
+
|
|
81
|
+
### 2.2 角色定义(职责 / 语气 / 边界 / 不适用,zh-en 成对)
|
|
82
|
+
|
|
83
|
+
| 维度 | 中文 | English |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| 职责 | 解释本页资金事实与可支付能力:账户与余额、收付待办、对账与未达、滚动资金计划、受限与冻结、票据与授信;只解释,不处理待办。 | Explain funds facts and payable capacity on this page: accounts and balances, receipts and payments, reconciliation items, the rolling cash plan, restricted and frozen funds, bills and credit. Explain only; do not process to dos. |
|
|
86
|
+
| 语气 | 直接、风险优先、数字先行:先给结论与其时点,再给依据与算式;不寒暄、不夸张。 | Direct, risk first, numbers first: give the conclusion and its as of point, then the basis and the arithmetic. No small talk and no exaggeration. |
|
|
87
|
+
| 边界 | 不动账、不调账(未达项的调账凭证由总览待办发起);不审批、不授权、不认领、不核销;不承诺授信;不对外付款;不发起归集上划;不重跑资金计划、不改假设版本;越界问题说明归属并指向对应 Bot。 | No bookkeeping and no adjustments: adjustment vouchers for unreconciled items start from the overview to do list. No approval, no authorization, no claim, no write off, no credit commitment, no outward payment, no cash pooling instruction, no plan rerun and no assumption change. For out of scope questions, state the owner and point to the right Bot. |
|
|
88
|
+
| 不适用 | 外币 / 跨境收付 / 外汇敞口(当前单币种场景,启用外币账户需另立口径);资金归集 / 上划下拨执行(网银或管 · 平台);资金日报 / 头寸看板(总览)。 | Foreign currency, cross border payments and FX exposure in the single currency scope; cash pooling and sweep execution, which belong to online banking or the platform page; daily funds report and position dashboard, which belong to the overview. |
|
|
89
|
+
|
|
90
|
+
身份与技能解耦:加载技能不改变身份,身份偏好变化不自动加载技能。
|
|
91
|
+
|
|
92
|
+
### 2.3 开场白与欢迎 chips(逻辑说明,不写业务数字)
|
|
93
|
+
|
|
94
|
+
- 开场白结构 = 身份句 + 可答范围句 + 引导句;当前时点与关键口径摘要由 payload 注入,spec 不写具体文案数值。
|
|
95
|
+
- 欢迎 chips 取已加载 P0 技能中的前 3 条触发语;点击 = `requestDraftInitialization` 预填 composer,不自动发送。
|
|
96
|
+
- 语言切换时开场白与 chips 同步重渲染;称呼偏好影响开场白称谓,问候语偏好影响第二句,回复语气偏好影响句式。
|
|
97
|
+
- 加载 / 卸载技能后欢迎态重算;unloaded 技能的触发语不再出现在 chips。
|
|
98
|
+
- 首条回复必须匹配语气定义:先结论与其时点,再依据与算式;不寒暄、不夸张、不越界。
|
|
99
|
+
|
|
100
|
+
## 3. 技能配置
|
|
101
|
+
|
|
102
|
+
### 3.1 本地技能(id / 名称 / 能力描述 / P 级 / 默认状态 / 触发问法)
|
|
103
|
+
|
|
104
|
+
6 项本地技能全 P0、默认 `loaded`;行字段 `name / desc / badge / tone / meta` 双语成对。
|
|
105
|
+
|
|
106
|
+
| id | 名称(zh / en) | 能力描述(zh / en) | 渲染器 | P 级 | 默认状态 | 触发问法(zh / en) |
|
|
107
|
+
|---|---|---|---|---|---|---|
|
|
108
|
+
| `zi.accounts` | 账户与余额 / Accounts and balances | 账户清单与余额、可动用性、银行侧与当前口径差异、账户状态与数据新鲜度 / Account list and balances, usability, gaps between the bank side and the current basis, account status and data freshness | `cards` | P0 | `loaded` | 账户余额和银行差在哪 / Where do account balances differ from the bank side;哪些钱现在能付 / Which funds can pay right now |
|
|
109
|
+
| `zi.payments` | 收付待办 / Receipts and payments | 今日与近期的收付队列:方向、到期、授权进度、认领与在途状态 / Receipt and payment queue for today and the near term: direction, due date, authorization progress, claim and in transit states | `flow` | P0 | `loaded` | 今天要收什么、付什么 / What comes in and goes out today;哪笔付款卡在授权 / Which payment is stuck in authorization |
|
|
110
|
+
| `zi.recon` | 对账与未达 / Reconciliation items | 银行对账单与账面的未达项:方向、账龄、责任人、批次状态 / Unreconciled items between bank statements and the books: direction, aging, owner and batch status | `table` | P0 | `loaded` | 谁没对上、差在哪一笔 / Which items do not reconcile and where;未达项的账龄和责任人 / What is the aging and owner of unreconciled items |
|
|
111
|
+
| `zi.plan` | 资金计划 / Cash planning | 滚动资金计划:期初、流入流出构成、期末与安全垫比较、情景敏感性;窗口与情景由数据集承载 / Rolling cash plan: opening position, inflow and outflow mix, closing position against the safety cushion, and scenario sensitivity; windows and scenarios come from the dataset | `chart` | P0 | `loaded` | 未来够不够 / Is the plan period covered;压力情景缺口拿什么补 / What covers a stress gap |
|
|
112
|
+
| `zi.restricted` | 受限资金 / Restricted funds | 受限与冻结逐笔:类型、关联账户、依据、起止与状态;可用余额分层的解释来源 / Restricted and frozen funds item by item: type, linked account, basis, term and state; the explanation layer for available balance tiers | `list` | P0 | `loaded` | 为什么账面有钱却不能用 / Why are book funds not usable;哪些受限何时解限 / Which restrictions lift and when |
|
|
113
|
+
| `zi.bills` | 票据与授信 / Bills and credit | 表内票据在池与自开、到期与托收解付规则、未动用授信(非现金资源) / Bills on book and self issued bills, maturity and collection or settlement rules, and unused credit as a non cash resource | `table` | P0 | `loaded` | 在池票据什么时候托收 / When do held bills mature for collection;授信还能动用多少 / How much credit is available |
|
|
114
|
+
|
|
115
|
+
取舍:票据与授信纳入 P0,因为缺口覆盖依赖授信可用与票据到期,属可支付能力主链;仍保留「非现金、不计入可用余额」的硬边界。
|
|
116
|
+
|
|
117
|
+
### 3.2 可加载的平台技能
|
|
118
|
+
|
|
119
|
+
来源为底座「技能与场景」的技能注册表(S3,共 12 项);Bot 只能加载,不能改版本与策略。
|
|
120
|
+
|
|
121
|
+
| 平台技能 | 版本 | 服务本页技能 | 状态(S3) | 加载后画布 |
|
|
122
|
+
|---|---|---|---|---|
|
|
123
|
+
| 智能对账 / Smart reconciliation | v2.4 | `zi.recon` | 启用 | `table`,画布标注「平台技能 · v2.4」 |
|
|
124
|
+
| 现金流预测 / Cash flow forecast | v2.1 | `zi.plan` | 灰度 | `chart`,带「灰度」角标,画布与对话回复标注「灰度」 |
|
|
125
|
+
|
|
126
|
+
- 灰度技能可加载但默认只读,标注「灰度」;停用技能置灰不可加载;启用 / 灰度 / 停用状态以底座「技能与场景」的 S3 为唯一来源。
|
|
127
|
+
- 平台技能加载后只影响技能清单与画布入口,不改本页业务口径与身份。
|
|
128
|
+
|
|
129
|
+
### 3.3 加载 / 卸载与状态规则
|
|
130
|
+
|
|
131
|
+
- 默认已加载:6 个本地 P0 技能;平台技能默认 `available`,用户可在技能页签加载。
|
|
132
|
+
- 加载写入记忆 `skills.inventory`(含 `loadedAt`、`lastUsedAt`);卸载只改状态,不删画布历史与使用记录。
|
|
133
|
+
- 同一 Bot 已加载技能上限 **12**;达上限提示「先卸载一个再加载」,不自动替换。
|
|
134
|
+
- 技能状态三档 `loaded / available / disabled`;灰度角标与停用置灰只影响 UI 与可加载性,不改 payload。
|
|
135
|
+
- 技能不改变身份与口径:画布永远读 payload 当前值,前端不重算业务数。
|
|
136
|
+
- 技能加载 / 卸载后欢迎 chips 与对话引导同步更新。
|
|
137
|
+
|
|
138
|
+
## 4. 记忆配置
|
|
139
|
+
|
|
140
|
+
每个 Bot 一份记忆,只承载 **用户身份关系** 与 **技能清单** 两件事,不记录业务数据。
|
|
141
|
+
|
|
142
|
+
### 4.1 用户身份关系字段
|
|
143
|
+
|
|
144
|
+
| 字段 | 含义 | 取值 / 占位 |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| `user.principalId` | 登录人 id | `<用户 id>` |
|
|
147
|
+
| `user.displayName` | 登录人显示名 | `{zh: "<显示名>", en: "<display name>"}` |
|
|
148
|
+
| `user.roleKey` | 主数据角色键 | `<角色键>` |
|
|
149
|
+
| `user.orgPath` | 组织路径 | `<组织路径>` |
|
|
150
|
+
| `user.relations[]` | 复核 / 审批 / 协作关系 | `{type: reviewer \| approver \| collaborator, id: "<用户 id>", displayName: {zh, en}}` |
|
|
151
|
+
| `user.permissions.datasets` | 可见数据集范围 | `["<数据集范围>"]` |
|
|
152
|
+
| `user.permissions.canExport` | 是否可导出 | 恒为 `false`,导出走底座与平台审计 |
|
|
153
|
+
| `user.permissions.canWrite` | 是否可写 | 恒为 `false`,受控写只走 MCP |
|
|
154
|
+
| `user.preferences` | 偏好 | `{lang, unit, periodWindow, salutation, replyTone}` |
|
|
155
|
+
|
|
156
|
+
### 4.2 技能清单字段
|
|
157
|
+
|
|
158
|
+
| 字段 | 含义 |
|
|
159
|
+
|---|---|
|
|
160
|
+
| `skills.revision` | 技能注册表版本 `S3` |
|
|
161
|
+
| `skills.inventory[]` | `{skillId, source, state, version, loadedAt, lastUsedAt}`;`source` 为 `bot-local` / `platform`,`state` 为 `loaded` / `available` / `disabled` |
|
|
162
|
+
| `skills.loadedCount` | 已加载数量 |
|
|
163
|
+
| `skills.limit` | 上限 `12` |
|
|
164
|
+
| `sessions` | `{lastSessionId, lastActiveAt}`,会话恢复用 |
|
|
165
|
+
| `notes` | 预留,禁止存敏感信息 |
|
|
166
|
+
|
|
167
|
+
占位示例(只用占位符,不写真实值):
|
|
168
|
+
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"schema": "erp.bot.memory.v1",
|
|
172
|
+
"botId": "zi",
|
|
173
|
+
"updatedAt": "<ISO 时间>",
|
|
174
|
+
"user": {
|
|
175
|
+
"principalId": "<用户 id>",
|
|
176
|
+
"displayName": { "zh": "<显示名>", "en": "<display name>" },
|
|
177
|
+
"roleKey": "<角色键>",
|
|
178
|
+
"orgPath": "<组织路径>",
|
|
179
|
+
"relations": [{ "type": "reviewer", "id": "<用户 id>", "displayName": { "zh": "<显示名>", "en": "<display name>" } }],
|
|
180
|
+
"permissions": { "datasets": ["<数据集范围>"], "canExport": false, "canWrite": false },
|
|
181
|
+
"preferences": { "lang": "zh", "unit": "auto", "periodWindow": "<期间>", "salutation": "<称呼>", "replyTone": "<语气偏好>" }
|
|
182
|
+
},
|
|
183
|
+
"skills": { "revision": "S3", "inventory": [{ "skillId": "<技能 id>", "source": "bot-local", "state": "loaded", "version": null, "loadedAt": "<ISO 时间>", "lastUsedAt": "<ISO 时间>" }], "loadedCount": "<数量>", "limit": 12 },
|
|
184
|
+
"sessions": { "lastSessionId": "<会话 id>", "lastActiveAt": "<ISO 时间>" },
|
|
185
|
+
"notes": []
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 4.3 存储 / 恢复默认 / 隐私
|
|
190
|
+
|
|
191
|
+
| 项 | 规则 |
|
|
192
|
+
|---|---|
|
|
193
|
+
| 主存储 | `localStorage["dsh-erpbot.bot.memory.v1.zi"]`,单 Bot 单键,JSON |
|
|
194
|
+
| 写入时机 | 加载 / 卸载技能、修改身份偏好、更新身份关系、恢复默认 |
|
|
195
|
+
| 读取时机 | 配置抽屉打开时;对话欢迎态渲染时 |
|
|
196
|
+
| 缺失 / 损坏 | 回退默认记忆(登录人 + 本页 6 个 P0 技能),不阻塞页面、不弹窗 |
|
|
197
|
+
| 隔离 | 四个 Bot 各自一份,不互相读取;底座(MCP 与数据)不读 Bot 记忆 |
|
|
198
|
+
| 隐私 | 只存 id / 显示名 / 权限摘要,不存手机号、证件号、银行账号;不随导出外发 |
|
|
199
|
+
| 重置 | 「恢复默认」二次确认,仅重置本地记忆,不动会话、画布与技能使用记录 |
|
|
200
|
+
|
|
201
|
+
## 5. 对话交互
|
|
202
|
+
|
|
203
|
+
### 5.1 会话与工作区(`D:\erpBot\zi` + 降级)
|
|
204
|
+
|
|
205
|
+
- 每 Bot 独立工作区:默认根目录 `D:\erpBot`,本页子目录 `D:\erpBot\zi`,按需创建;工作区标题 `erpBot · 资 Bot`。
|
|
206
|
+
- Host 路由 `POST /erp/workspace` 只接受白名单 bot id(`cai` / `zi` / `tui` / `shui`);目录由插件按白名单固定映射,**不接受请求传入路径**。
|
|
207
|
+
- D 盘不可用(不存在 / 无写权限)时降级到 `Documents\deepseek-harness\erpbot-zi`,并在配置抽屉「记忆」页显示实际工作区路径,不静默失败。
|
|
208
|
+
- 会话键 `dsh-erpbot.bot.session.v1.zi`;首次进入时把旧键 `dsh-erpbot.assistant.session.v1` 一次性迁移到该键。
|
|
209
|
+
- 切页不销毁会话(`sessions.retain` 持有引用),切回恢复上次会话;页面卸载释放引用并持久化 `lastSessionId`。
|
|
210
|
+
- 状态点与官方会话状态同源:就绪 / 运行中 / 待交互 / 未读 / 错误。
|
|
211
|
+
|
|
212
|
+
### 5.2 配置抽屉行为
|
|
213
|
+
|
|
214
|
+
- 打开:点头像或「配置」;打开时不新增路由、不刷新页面、不重建会话。
|
|
215
|
+
- 页签默认「身份」;页签切换不重置未保存的输入草稿。
|
|
216
|
+
- 身份偏好变更即时生效并自动保存;技能开关即时写入记忆并刷新 `已加载 N / 12`。
|
|
217
|
+
- 关闭:Escape / 遮罩 / 关闭按钮;关闭后对话滚动位置、会话与输入草稿保持不变。
|
|
218
|
+
- 记忆页「恢复默认」需二次确认,成功后显示保存状态与时点;当前工作区路径始终可见。
|
|
219
|
+
|
|
220
|
+
### 5.3 技能三入口与画布
|
|
221
|
+
|
|
222
|
+
1. **欢迎 chips**:已加载 P0 技能的前 3 条触发语,点击预填 composer,不自动发送。
|
|
223
|
+
2. **技能行「问这个」**:配置抽屉内点技能,预填该技能触发语;「看结果」打开画布抽屉。
|
|
224
|
+
3. **对话回复「查看结果」**:Bot 答复涉及某技能时,消息尾部给入口,打开同一画布抽屉。
|
|
225
|
+
|
|
226
|
+
- 画布与对话共享同一 payload 快照(`dataAsOf`),不允许画布与 KPI 不同时点;画布顶部「返回对话」。
|
|
227
|
+
- 画布不改变会话与技能状态;关闭后回到原对话位置。
|
|
228
|
+
- 图表类技能保留 `alt` 双视图;平台技能在画布标注来源与版本,灰度技能另标「灰度」。
|
|
229
|
+
|
|
230
|
+
### 5.4 错误与降级
|
|
231
|
+
|
|
232
|
+
| 场景 | 表现 |
|
|
233
|
+
|---|---|
|
|
234
|
+
| `sessions` / `workspaces` 服务不可用 | Chat 区显示降级说明 + 「打开官方会话」链接,不白屏 |
|
|
235
|
+
| 工作区创建失败 | 显示错误 + 「重试」;配置抽屉与画布仍可用 |
|
|
236
|
+
| D 盘不可用 | 自动降级到 `Documents`,记忆页显示实际路径与降级说明 |
|
|
237
|
+
| 会话丢失 / 被移除 | 自动新建会话;历史列表为空态文案 |
|
|
238
|
+
| 宿主无 `conversation.content` 槽位 | 显示 fallback 卡片,不吞错 |
|
|
239
|
+
| 记忆缺失 / 损坏 | 回退默认身份与 6 个 P0 技能,Chat 正常可用;记忆页提示「已恢复默认」 |
|
|
240
|
+
|
|
241
|
+
## 6. 验收清单
|
|
242
|
+
|
|
243
|
+
- [ ] 顶排仍是 4 张 KPI 卡,7 种变体与弹窗不变;点卡仍开 `MetricDetailModal`;spec 中未出现 KPI 数值、金额、比率、时点与勾稽算式。
|
|
244
|
+
- [ ] KPI 行以下是一张 Chat 大卡片,无常驻左栏、无常驻 Bot 面板;TopBar 与总览无 AI 助手入口,无 Dock / Rail / Overlay。
|
|
245
|
+
- [ ] 对话头部 = 可点击 Bot 头像 + 名称 + 一句话角色 + 状态点 + 会话标题 + 历史 / 新会话 / 画布。
|
|
246
|
+
- [ ] 点头像打开右侧配置抽屉(身份 / 技能 / 记忆三页签);抽屉覆盖对话、不挤压、不新增路由。
|
|
247
|
+
- [ ] 关闭抽屉后对话滚动位置、会话与输入草稿不丢;Escape / 遮罩 / 关闭按钮都能关闭。
|
|
248
|
+
- [ ] 身份页:身份卡与角色定义(职责 / 语气 / 边界 / 不适用)只读;称呼 / 问候 / 语气 / 时间单位偏好可改并自动保存。
|
|
249
|
+
- [ ] 技能页:6 个本地技能默认 `loaded`、2 个平台技能默认 `available`;加载 / 卸载生效并写入记忆;`已加载 N / 12` 正确;达 12 提示先卸载。
|
|
250
|
+
- [ ] 灰度技能可加载并带「灰度」角标,停用技能置灰不可加载;平台技能版本只读,不可改策略。
|
|
251
|
+
- [ ] 记忆页:用户身份关系与技能清单可见;记忆键 `dsh-erpbot.bot.memory.v1.zi` 可持久化;损坏时回退默认且不报错;恢复默认需二次确认。
|
|
252
|
+
- [ ] 工作区为 `D:\erpBot\zi`,会话键 `dsh-erpbot.bot.session.v1.zi`;D 盘不可用时降级到 `Documents\deepseek-harness\erpbot-zi` 并显示实际路径。
|
|
253
|
+
- [ ] 技能三入口可用:chips 预填 composer、「问这个」预填触发语、「看结果」打开画布抽屉并返回对话。
|
|
254
|
+
- [ ] 切页 / 切语言 / 刷新后会话、技能清单与身份偏好保持;四 Bot 工作区与会话互相隔离。
|
|
255
|
+
- [ ] 中英双语字段成对,英文无汉字、无撇号;无感叹号、无营销词、无 emoji;无货币金额、比率、日期与业务锚点。
|
|
256
|
+
- [ ] 窄面板按容器查询降级:`≤1180px` KPI 两列、头部动作收进更多;`≤900px` 抽屉全宽;`≤720px` chips 折行;`≤560px` 隐藏角色副标;暗色主题正常。
|