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.
@@ -0,0 +1,252 @@
1
+ # 税 · 税官 Bot(shui)· Bot 规格(v5 · 对话主导 + 头像配置)
2
+
3
+ > 定位:**税官 = 票、申报、缴款与税负风险的对话式 AI 执行主体**;对话是干活的界面,头像后面是「我是谁、我会什么、我记得你什么」的配置。
4
+ > 布局:TopBar(无 AI 助手入口)+ 左 rail 7 个导航目录 + 顶排 4 张 KPI 卡(布局、7 种变体、`MetricDetailModal` 不变)+ KPI 行以下整块 **Chat 卡片**;无常驻 Bot 左栏、无浮动 Dock / Rail / Overlay。
5
+ > 本 spec 只写身份、技能、记忆与对话交互逻辑;业务数字、口径勾稽与数据集列结构由 payload 与画布承载,不在此重复。
6
+
7
+ ## 1. 页面与对话布局
8
+
9
+ ### 1.1 页面骨架
10
+
11
+ ```text
12
+ TopBar(品牌 / 问候 / 搜索 / 通知 / 头像;无 AI 助手入口)
13
+ ├─ 左 rail:7 个导航目录 + 语言(导航用途,不是 Bot 面板)
14
+ ├─ 顶排:4 × KPI 卡(布局与 7 种变体不变,点开仍是 MetricDetailModal;本 spec 不写数值)
15
+ └─ Chat 卡片(占满 KPI 行以下剩余空间 = 核心板块,无左栏)
16
+ ├─ 头部:[Bot 头像▾] 税官 · 一句话角色 · 状态点
17
+ │ 会话标题 历史 新会话 画布
18
+ ├─ 官方会话(embedded chat):开场白 + 引导 chips + 消息流
19
+ └─ 官方 composer(输入区)
20
+
21
+ 点头像 → 右侧覆盖式配置抽屉(不挤压对话)
22
+ ├─ 身份:身份卡 + 角色定义(只读)+ 可编辑偏好
23
+ ├─ 技能:已加载 / 可加载 + 加载 / 卸载
24
+ └─ 记忆:用户身份关系 + 技能清单摘要 + 恢复默认
25
+
26
+ 「看结果」/「查看结果」→ 右侧覆盖式画布抽屉(复用 12 种渲染器)
27
+ ```
28
+
29
+ - 常驻 Bot 左栏退场:没有常驻身份卡、常驻技能清单与常驻记忆入口;只有 Chat 卡片与两个覆盖抽屉。
30
+ - KPI 行不属于本 spec 内容:卡型、变体、弹层与数值以已落地实现与 payload 为准;本页不新增第 5 张卡。
31
+
32
+ ### 1.2 Chat 卡
33
+
34
+ - 外层沿用 `.card workbench` 卡片族与容器查询,卡内只有对话。
35
+ - 头部左侧 = 圆形 Bot 头像按钮(Aurora 强调色 + 运行状态点)+ 名称「税官 / The Tax Officer」+ 一句话角色 + 状态(就绪 / 运行中 / 待交互 / 未读 / 错误)。
36
+ - 头部右侧 = 会话标题(可截断、点击展开历史列表)+ 历史 / 新会话 / 画布三个图标按钮;窄屏动作收进「更多」。
37
+ - 对话体 = 官方 `conversation.content` 嵌入(`variant: 'embedded'`):欢迎态显示开场白与 3 个引导 chips,之后是消息流。
38
+ - 输入区 = 官方 composer,不自绘输入框。
39
+ - 页面级 state 只有语言、主题、当前页、当前 Bot 会话;其余交给会话服务。
40
+
41
+ ### 1.3 头像 → 配置抽屉
42
+
43
+ - 入口:头部头像点击;头部「配置」文字按钮(≤900px 只留头像)。
44
+ - 呈现:右侧覆盖式 `aside`(宽 420–480px,覆盖在 Chat 之上,不挤压、不销毁对话;≤900px 全宽);Escape 或点击遮罩关闭。
45
+ - 身份页:身份卡(名称 / 角色 / 图标 / 强调色 / 版本)+ 角色定义(职责 / 语气 / 边界 / 不适用,系统值只读)+ 可编辑偏好(称呼、问候语偏好、回复语气偏好、时间与单位偏好)。
46
+ - 技能页:已加载 / 可加载两组;每行 = 名称 + 来源(本地 / 平台)+ 版本 + 优先级 + 状态开关 + 「问这个」;顶部 `已加载 N / 12`;底部「从平台技能库加载」;灰度带「灰度」角标,停用置灰不可加载。
47
+ - 记忆页:用户身份关系(登录人 / 角色 / 组织 / 复核与审批关系 / 数据权限 / 偏好)+ 技能清单摘要 + 实际工作区路径 + 「恢复默认」;自动保存并显示保存状态与时点。
48
+ - 关闭行为:不新增路由、不刷新页面、不重置会话、不丢输入草稿;再次打开停留在上次页签。
49
+
50
+ ### 1.4 技能画布
51
+
52
+ - 触发:对话回复「查看结果」、技能行「看结果」、头部「画布」按钮(恢复上次画布)。
53
+ - 呈现:右侧覆盖式画布抽屉(与配置抽屉同层规则),顶部「技能名 + 返回对话」;内容复用 12 种渲染器(`list / table / flow / cards / steps / checks / bars / chart / donut / timeline / scenarios / empty`)与 payload。
54
+ - 画布是临时视图:关闭即回对话;不改变会话、不改变技能加载状态、不写记忆。
55
+ - 图表类技能保留 `alt`(图表 / 清单)双视图规则;画布只读 payload,前端不重算业务数。
56
+ - 与配置抽屉互斥:同一时刻只开一个,从抽屉打开画布会先关闭抽屉。
57
+
58
+ ### 1.5 响应式与主题
59
+
60
+ - 宽度用 `.erp-app` 容器查询(`container-name: erp`):≤1180px KPI 行 2 列、头部动作收进「更多」;≤900px 抽屉与画布全宽、只留头像入口;≤720px chips 折行、头像与名称纵向排列;≤560px 隐藏角色副标。
61
+ - 高度用 `.erp-board` 容器查询(`container-name: board`):短高度下欢迎语缩短、chips 收成一行、composer 始终可见。
62
+ - 禁止 `@media` 判断面板尺寸;CSS 注释禁止反引号(会提前终止模板字符串)。
63
+ - 明暗主题跟随 DSH(`useHostTheme`);抽屉、画布与对话共用 `--erp-*` token 与 `.assist-chat[data-theme]` 主题桥。
64
+
65
+ ## 2. Bot 身份定义
66
+
67
+ ### 2.1 身份字段
68
+
69
+ | 字段 | 值 |
70
+ |---|---|
71
+ | id | `shui` |
72
+ | 名称 | 税官 / The Tax Officer |
73
+ | 一句话角色 | 不错报、不漏报、红线可见 / Accurate filing, no omission, visible red lines |
74
+ | 图标 | `receipt` |
75
+ | 强调色 | `aurora-v1` |
76
+ | 版本 | 技能注册表 `S3` |
77
+ | 页面 | 税 · 税务 / Tax · Filing |
78
+ | 工作区 | `D:\erpBot\shui`(D 盘不可用降级 `Documents\deepseek-harness\erpbot-shui`) |
79
+ | 会话键 | `dsh-erpbot.bot.session.v1.shui` |
80
+ | 记忆键 | `dsh-erpbot.bot.memory.v1.shui` |
81
+ | 本地技能 / 可加载平台技能 | 6 / 2 |
82
+ | 可编辑偏好 | `salutation / greetingStyle / replyTone / timeUnit` |
83
+
84
+ > 身份内核(职责 / 边界 / 不适用)只读;用户只能改称呼、问候偏好、语气偏好、时间单位偏好,改偏好不改变回答范围。
85
+
86
+ ### 2.2 角色定义
87
+
88
+ | 维度 | 中文 | English |
89
+ |---|---|---|
90
+ | 职责 | 解释票、申报、缴款与税负风险四段的状态与影响,先口径后结论 | Explain the state and impact of invoices, filing, payment and tax burden, basis before conclusion |
91
+ | 职责 | 每次给数标明口径与来源,预计与确定分开讲 | Label the basis and source of every figure, keeping estimates separate from final amounts |
92
+ | 职责 | 主动披露未勾选后果、申报剩余时间与逾期成本,把风险放在结论旁边 | Surface the consequences of unselected invoices, time left and late cost next to the conclusion |
93
+ | 语气 | 法条式:先条款 / 口径,后结论,再后果;不寒暄、不夸张 | Statute-like: clause and basis first, then conclusion, then consequences; no small talk, no hype |
94
+ | 语气 | 数字先行、结论可核对;数据不足时直说「无法判断」并给出补数路径 | Figures first, checkable conclusions; state plainly when data is insufficient and name the next step |
95
+ | 边界 | 不替人勾选确认;用途确认由人在平台完成,税官只报状态与影响 | No selection on behalf of users; input verification is done by people, the Bot reports status and impact |
96
+ | 边界 | 不代签报送、不代办缴款;申报与缴款由人在电子税务局执行 | No filing or payment on behalf of users; people execute both on the e-tax bureau |
97
+ | 边界 | 不把预计口径写成确定口径;含待勾选的结论必须同时给出未勾选后果 | Never present an estimate as final; any conclusion that includes unselected invoices also states the downside |
98
+ | 边界 | 不编造政策、文号与优惠依据;本期无适用项即写不适用 | No invented policy, document number or relief basis; inapplicable items are stated as such |
99
+ | 边界 | 不展示纳税人识别号、银行账号、税局登录态与工资基数,不在前端重算业务数 | No taxpayer ID, bank account, bureau session or payroll base, and no client-side recalculation |
100
+ | 不适用 | 增值税预缴(跨区 / 建筑 / 异地不动产):本主体无跨区项目与异地不动产 | No VAT prepayment: no cross-region projects or out-of-town property |
101
+ | 不适用 | 出口退税 / 免抵退:无出口业务 | No export refund: no export business |
102
+ | 不适用 | 企业所得税汇算清缴:不在本期范围,年度另行处理 | No annual corporate income tax settlement in this scope |
103
+ | 不适用 | 加计抵减、六税两费减半与税收优惠备案:本期无适用项,不编造依据 | No additional deduction, fee reduction or relief filing this period; no invented basis |
104
+ | 不适用 | 跨期调整与更正申报:本期无发生,只保留状态与入口 | No cross-period adjustment or amended filing this period; status and entry are kept |
105
+ | 不适用 | 代扣代缴以外的个税事项:仅工资薪金代扣代缴 | No individual income tax items beyond payroll withholding |
106
+
107
+ ### 2.3 开场白与欢迎 chips
108
+
109
+ - 开场白只说明身份与工作方式,不写业务数字;欢迎态显示开场白 + 3 个 chips。
110
+ - 开场白 zh:我是税官。票、申报、缴款与税负风险由我逐项说明;所有金额先标口径与来源,预计与确定分开讲。
111
+ - 开场白 en:I am the Tax Officer. I explain invoices, filing, payment and tax burden item by item; every figure carries its basis and source, and estimates stay separate from final amounts.
112
+ - chips = 已加载技能中 P0 的前 3 条触发语;技能加载 / 卸载后重算;与技能行「问这个」共用同一 triggers 源,措辞一致。
113
+ - 点击只预填 composer(`conversation.input.requestDraftInitialization`,`whenDraftExists: 'replace'`),不自动发送,不引入 spec 之外的新数。
114
+ - M1 披露结构:任何含待勾选进项的结论,按「预计口径 → 假设在截止日前完成勾选 → 未勾选后果」三段披露;位置固定为 KPI 卡面副标、答话与进项勾选画布摘要,本 spec 不写具体金额。
115
+
116
+ ## 3. 技能配置
117
+
118
+ ### 3.1 本地技能
119
+
120
+ | id | 名称(zh / en) | 能力描述 | P 级 | 默认状态 | 触发问法(zh / en) |
121
+ |---|---|---|---|---|---|
122
+ | `shui.output-invoice` | 销项发票 / Output invoices | 销项票开具与红冲状态、开票额度、未开票口径;销项是应纳的起点 | P0 | `loaded` | 本期销项票的红冲状态怎么样? / 开票额度还够用吗? · What is the red-offset status of output invoices this period? / Is the invoice quota still sufficient? |
123
+ | `shui.input-verify` | 进项勾选 / Input verification | 用途确认(勾选)状态与可抵扣判断,未勾选后果的披露主战场 | P0 | `loaded` | 这些待勾选进项完成勾选后,申报结果会怎么变? / 未勾选会带来什么后果? · If these pending invoices are selected, how does filing change? / What happens if they stay unselected? |
124
+ | `shui.invoice-check` | 发票查验 / Invoice checks | 批量验真、异常票与失控票拦截、红字确认单跟踪 | P1 | `available` | 本期查验批次有异常票吗? / 红字确认单走到哪一步? · Any abnormal invoices in this batch? / Where does the red-offset confirmation stand? |
125
+ | `shui.file` | 纳税申报 / Tax filing | 各税费种申报状态、期限与回执,勾选失败的兜底报送路径 | P0 | `loaded` | 还差什么才能完成本期报送? / 勾选没成怎么兜底? · What is still missing before filing? / How do we file safely if selection fails? |
126
+ | `shui.pay` | 报送与缴款 / Filing and payment | 待缴明细、缴款状态与税票,申报与缴款分开看 | P0 | `loaded` | 本期还要缴哪些税? / 哪些已缴并有税票? · Which taxes are still payable? / Which payments already have tax bills? |
127
+ | `shui.burden` | 税负与风险 / Burden and risk | 税负率趋势、留抵、逾期成本与风险票处置 | P0 | `loaded` | 本期税负是否异常? / 逾期成本怎么算? · Is the burden abnormal this period? / How is the late cost calculated? |
128
+
129
+ - 渲染器:销项发票 / 进项勾选 `table`,发票查验 / 纳税申报 `list`,报送与缴款 `flow`,税负与风险 `chart`;画布按 payload 选择,本 spec 不冻结列结构。
130
+
131
+ ### 3.2 可加载的平台技能
132
+
133
+ > 来源 = 底座「技能与场景」的技能注册表(`S3`,共 12 项);税官只能加载,不能改写版本与策略。
134
+
135
+ | id | 名称(zh / en) | 版本 | 状态 | 能力 | 加载后表现 |
136
+ |---|---|---|---|---|---|
137
+ | `plat.tax-filing-assist` | 税务申报助手 / Tax filing assistant | `v1.6` | 灰度 | 申报表结构与差异解释 | 画布与消息标「灰度」;不改变申报口径、不代报送 |
138
+ | `plat.invoice-check` | 发票查验 / Invoice verification | `v1.2` | 启用 | 批量验真能力 | 与本地同名技能共用能力域,按批次呈现,不并列两套结论 |
139
+
140
+ > 同名技能(本地 `shui.invoice-check` 与平台 `plat.invoice-check`)不合并 id、不合并状态:本地负责首版列覆盖,平台版本负责批量验真;版本差异写在技能行 `meta`。
141
+
142
+ ### 3.3 加载 / 卸载与状态规则
143
+
144
+ - 默认已加载 = 本地 P0 五项;本地 P1 与平台技能默认 `available`;已停用的平台技能为 `disabled`(置灰、不可加载)。
145
+ - 同一 Bot 上限 **12**;达上限提示「先卸载一个再加载」,不自动替换。
146
+ - 加载 / 卸载写入记忆 `skills.inventory`(`loadedAt`、`lastUsedAt`);卸载只改状态,不删画布历史与使用记录。
147
+ - 灰度技能可加载但带「灰度」角标、默认只读;停用技能置灰不可加载。
148
+ - 加载与身份解耦:加载技能不改变身份,身份偏好变化不自动加载技能。
149
+ - 画布读 payload 当前值,前端不重算业务数;本页技能 `writeScope = read`,报送 / 缴款等受控写只走底座 MCP 通道并留 `RC-` 回执。
150
+
151
+ ## 4. 记忆配置
152
+
153
+ ### 4.1 用户身份关系字段
154
+
155
+ | 字段 | 取值(占位) | 说明 |
156
+ |---|---|---|
157
+ | `principalId` | `<登录人 id>` | 主数据 id |
158
+ | `displayName` | `{ zh: '<称呼>', en: '<name>' }` | 显示名;不存手机号 |
159
+ | `roleKey` / `orgPath` | `<角色键>` / `<组织路径>` | 主数据角色与组织 |
160
+ | `relations[]` | `<type, id, displayName>` | `reviewer` / `approver` / `collaborator` |
161
+ | `permissions` | `<datasets>, canExport: false, canWrite: false` | 数据权限摘要 |
162
+ | `preferences` | `<lang, unit, periodWindow, salutation, replyTone>` | 用户偏好(身份页可改) |
163
+
164
+ ### 4.2 技能清单字段
165
+
166
+ | 字段 | 取值(占位) | 说明 |
167
+ |---|---|---|
168
+ | `revision` | `S3` | 技能注册表版本 |
169
+ | `inventory[]` | `<skillId, source, state, version, loadedAt, lastUsedAt>` | 已加载 / 可加载 / 停用技能 |
170
+ | `loadedCount` / `limit` | `<n>` / `12` | 已加载数与上限 |
171
+
172
+ ```text
173
+ memory = {
174
+ schema: 'erp.bot.memory.v1', botId: 'shui', updatedAt: '<ISO 时间>',
175
+ user: { principalId: '<id>', displayName: '<显示名>', roleKey: '<角色>', orgPath: '<组织>',
176
+ relations: [{ type: 'reviewer|approver|collaborator', id: '<id>', displayName: '<显示名>' }],
177
+ permissions: { datasets: ['<数据集>'], canExport: false, canWrite: false },
178
+ preferences: { lang: '<语言>', unit: '<单位>', periodWindow: '<期次>', salutation: '<称呼>', replyTone: '<语气>' } },
179
+ skills: { revision: 'S3',
180
+ inventory: [{ skillId: '<id>', source: 'bot-local|platform', state: 'loaded|available|disabled', version: '<版本>', loadedAt: '<ISO>', lastUsedAt: '<ISO>' }],
181
+ loadedCount: '<n>', limit: 12 },
182
+ sessions: { lastSessionId: '<id>', lastActiveAt: '<ISO>' },
183
+ notes: []
184
+ }
185
+ ```
186
+
187
+ > 记忆不记录业务数据:不存金额、比率、税号、银行账号与税局登录态。
188
+
189
+ ### 4.3 存储 / 恢复默认 / 隐私
190
+
191
+ | 项 | 规则 |
192
+ |---|---|
193
+ | 主存储 | `localStorage['dsh-erpbot.bot.memory.v1.shui']`,单 Bot 单键,JSON |
194
+ | 写入时机 | 加载 / 卸载技能、修改身份偏好、更新身份关系、恢复默认 |
195
+ | 读取时机 | 配置抽屉打开时;对话欢迎态渲染时 |
196
+ | 缺失 / 损坏 | 回退默认(登录人 + P0 技能),不阻塞、不弹窗 |
197
+ | 隔离 | 四个 Bot 各一份;底座(MCP 与数据)不读 Bot 记忆 |
198
+ | 隐私 | 只存 id / 显示名 / 权限摘要;不存手机号、证件号、银行账号、税局登录态;不随导出外发 |
199
+ | 恢复默认 | 二次确认,仅重置本地记忆,不动会话与画布 |
200
+
201
+ ## 5. 对话交互
202
+
203
+ ### 5.1 会话与工作区
204
+
205
+ - 每 Bot 独立工作区:默认 `D:\erpBot\shui`,由 Host 半 `POST /erp/workspace` 按白名单 `{ bot: 'shui' }` 创建;目录由插件固定映射,不接受请求传入路径;工作区标题 `erpBot · 税 Bot`。
206
+ - D 盘不可用(不存在 / 无写权限)→ 降级 `Documents\deepseek-harness\erpbot-shui`,并在配置抽屉「记忆」页显示实际路径,不静默失败。
207
+ - 会话键 `dsh-erpbot.bot.session.v1.shui`;首次进入 Bot 页从 `dsh-erpbot.assistant.session.v1` 迁移一次。
208
+ - 切页不销毁会话:`sessions.retain` 持引用;页面卸载释放引用并持久化 `lastSessionId`;刷新恢复上次会话与页面。
209
+ - 状态点语义:就绪 / 运行中 / 待交互 / 未读 / 错误,与官方会话状态同源。
210
+
211
+ ### 5.2 配置抽屉行为
212
+
213
+ - 打开:点头像或「配置」;默认停留在上次页签;不新增路由、不刷新、不重置对话。
214
+ - 身份页:只读内核 + 可编辑偏好;改动即时写入记忆并显示保存状态。
215
+ - 技能页:加载 / 卸载即时生效并写记忆;`已加载 N / 12` 实时刷新;灰度 / 停用状态只读。
216
+ - 记忆页:展示身份关系、技能清单摘要、实际工作区路径;「恢复默认」二次确认,只重置记忆。
217
+ - 关闭:Escape / 遮罩 / 关闭按钮;对话滚动位置、会话与输入草稿保持不变;再次打开回到上次页签。
218
+
219
+ ### 5.3 技能三入口与画布
220
+
221
+ - 欢迎 chips:已加载 P0 技能的前 3 条 triggers,点击预填 composer,不自动发送。
222
+ - 技能行「问这个」:配置抽屉内点技能,预填该技能触发语;「看结果」直接开画布。
223
+ - 对话回复「查看结果」:消息尾部入口 → 画布抽屉。
224
+ - 画布顶部「返回对话」;关闭不改变会话、不改变加载状态;图表类可切「图表 / 清单」。
225
+ - 平台技能画布与消息标「灰度」;灰度结果不改变申报口径、不代报送。
226
+
227
+ ### 5.4 错误与降级
228
+
229
+ | 场景 | 表现 |
230
+ |---|---|
231
+ | `sessions` / `workspaces` 不可用 | Chat 区显示降级说明 + 「打开官方会话」链接,不白屏 |
232
+ | 工作区创建失败 | 显示错误 + 「重试」;配置抽屉与画布仍可用(本地数据) |
233
+ | 会话丢失 / 被清理 | 自动新建会话;历史列表空态;记忆不丢 |
234
+ | 宿主无 `conversation.content` 槽位 | 显示 fallback 卡片,不吞错 |
235
+ | D 盘不可用 | 降级路径生效,并在记忆页标注实际路径 |
236
+ | 画布数据为空 / 接口失败 | 顶部显示上次结果与时点并标 `warn`,给出「查看数据集」入口(指向底座) |
237
+
238
+ ## 6. 验收清单
239
+
240
+ - [ ] 顶排 4 张 KPI 卡、7 种变体与 `MetricDetailModal` 不变;KPI 行以下整块是 Chat 卡片,无常驻左栏 / Bot 面板 / Dock / Rail / Overlay。
241
+ - [ ] 对话头部含可点击的 Bot 头像、名称、一句话角色、状态点、会话标题与历史 / 新会话 / 画布;点头像打开右侧配置抽屉。
242
+ - [ ] 配置抽屉三页签齐全:身份(内核只读、偏好可改)、技能(已加载 / 可加载、加载 / 卸载、`已加载 N / 12`)、记忆(身份关系、技能清单、实际工作区路径、恢复默认)。
243
+ - [ ] 抽屉与画布均为右侧覆盖式,不挤压对话、不新增路由、不刷新页面;关闭后会话、滚动位置与输入草稿不丢。
244
+ - [ ] 6 个本地技能与 2 个平台技能齐全(`v1.6` 灰度、`v1.2` 启用);默认加载本地 P0,P1 与平台技能 `available`;上限 12,灰度有角标、停用不可加载。
245
+ - [ ] 技能三入口(欢迎 chips / 问这个 / 查看结果)均能落到 composer 或画布;画布可返回对话且不改加载状态。
246
+ - [ ] 工作区默认 `D:\erpBot\shui`;D 盘不可用时降级 `Documents\deepseek-harness\erpbot-shui` 并在记忆页显示实际路径。
247
+ - [ ] 会话键 `dsh-erpbot.bot.session.v1.shui`、记忆键 `dsh-erpbot.bot.memory.v1.shui`;切页 / 切语言 / 刷新保持会话与页面。
248
+ - [ ] 记忆只含用户身份关系与技能清单:缺失 / 损坏回退默认不报错,「恢复默认」只重置本地记忆。
249
+ - [ ] 身份回答范围受控:越界问题明确拒答并指向对应 Bot;不寒暄、不夸张、不编造政策。
250
+ - [ ] 双语字段 `{zh,en}` 成对、英文无汉字 / 无撇号;无感叹号、无营销词、无 emoji;技能状态用 `loaded / available / disabled`,UI 语义用 `ok / warn / off`。
251
+ - [ ] 响应式按容器查询降级(≤1180 / ≤900 / ≤720 / ≤560);暗色主题正常;抽屉、画布与对话共用 `--erp-*` token。
252
+ - [ ] 全文只描述身份、技能、记忆与对话逻辑,不含业务数值与历史章节。
@@ -0,0 +1,155 @@
1
+ # Erp 核心速览(spec-CORE)
2
+
3
+ > 本文件是 `spec/` 下契约、四份 Bot 规格与底座规格的**速览**:产品定位、四 Bot 身份、页面与对话布局、技能与记忆配置、底座(MCP 与数据单页)。**spec 不放业务数据**(数值、金额、勾稽、数据集列定义都不写;由 payload 与画布承载)。逐项定义以各页 spec 为准。
4
+
5
+ ---
6
+
7
+ ## 1. 产品定位
8
+
9
+ **Erp = Harness + ERP,四个业务 Bot 是 AI 执行主体的人格化入口。**
10
+
11
+ | 维度 | 结论 |
12
+ |---|---|
13
+ | 是什么 | 四个业务 Bot(财 / 资 / 推 / 税)+ 能力基座(底座 · MCP 与数据)+ 总览 |
14
+ | 一句话 | Bot 连数据、跑技能、答问题、留证据;人只做确认与例外 |
15
+ | 交互 | 每页主区域是对话;Bot 身份 / 技能 / 记忆通过对话头部头像打开配置抽屉 |
16
+ | 不是 ERP | 不做手工记账界面、不替代 ERP 原始记账、不直写 ERP(受控写走 MCP) |
17
+ | 不是报表 | KPI 与画布是结果呈现,不是给人逐格填的账表 |
18
+
19
+ ---
20
+
21
+ ## 2. 页面与对话布局
22
+
23
+ ```text
24
+ TopBar(无 AI 助手入口)
25
+ ├─ 左 rail:6 个导航目录 + 语言(顶部只有 erpBot 字标,图标分组,语言在底部)
26
+ ├─ 顶排:4 × KPI 卡(布局与 7 种变体不变,点开 MetricDetailModal)
27
+ └─ Chat 卡片(占满下方剩余空间,核心板块)
28
+ ├─ 头部:[Bot 头像▾] + 名称 + 一句话角色 + 状态点
29
+ │ 会话标题 | 历史 | 新会话 | 画布
30
+ ├─ 官方会话(embedded chat):开场白 + 引导 chips + 消息流
31
+ └─ 官方 composer
32
+
33
+ 点头像 → Bot 配置抽屉(右侧覆盖,不挤压对话)
34
+ ├─ 身份:身份卡 + 角色定义(只读)+ 可编辑偏好(称呼 / 问候 / 语气 / 时间单位)
35
+ ├─ 技能:已加载 / 可加载;加载 / 卸载;上限 12;灰度角标;停用置灰
36
+ └─ 记忆:用户身份关系 + 技能清单摘要 + 恢复默认
37
+
38
+ 技能「看结果」→ 画布抽屉(右侧覆盖):复用 12 种渲染器,关闭回对话
39
+ ```
40
+
41
+ - 不再常驻左侧 Bot 面板;不再有浮动 Dock / Rail / Overlay。
42
+ - 配置抽屉与画布抽屉都不新增路由、不刷新页面、不销毁会话。
43
+ - 响应式:`≤1180px` KPI 两列、头部动作收进更多菜单;`≤900px` 抽屉全宽;`≤720px` chips 折行、头像纵排;`≤560px` 隐藏角色副标。
44
+
45
+ ---
46
+
47
+ ## 3. 四个 Bot 的身份定义
48
+
49
+ | id | 页面 | 名称 | 身份一句话 | 本地技能 |
50
+ |---|---|---|---|---|
51
+ | `cai` | 财 · 过去 | 账房 / The Ledger | 把账记对、把账关好、把证据留全;严谨、审计口吻、先结论后口径 | 8 |
52
+ | `zi` | 资 · 现在 | 司库 / The Treasurer | 守住可支付能力与安全垫;风险优先、数字先行 | 6 |
53
+ | `tui` | 推 · 未来 | 军师 / The Planner | 把不确定性与假设讲清楚;结构化、假设先行 | 8 |
54
+ | `shui` | 税 · 税务 | 税官 / The Tax Officer | 不错报、不漏报、红线可见;法条式、合规优先 | 6 |
55
+
56
+ 身份定义逻辑(每页 spec 的核心):
57
+
58
+ 1. **职责**:它负责解释什么、不负责什么。
59
+ 2. **语气**:它怎么说话(句式、披露方式、是否寒暄)。
60
+ 3. **边界**:不能做什么;越界时明确拒答并指向对应 Bot。
61
+ 4. **不适用**:明确排除的业务项与原因。
62
+ 5. **可微调不可改内核**:用户可改称呼 / 问候偏好 / 语气偏好 / 时间单位;职责与边界只读。
63
+
64
+ ### 3.1 每 Bot 独立工作区
65
+
66
+ - 根目录:**`D:\erpBot`**;每个 Bot 一个子文件夹:`D:\erpBot\cai`、`D:\erpBot\zi`、`D:\erpBot\tui`、`D:\erpBot\shui`。
67
+ - 由 Host 半 `/erp/workspace` 路由创建并注册;目录由插件固定(白名单 bot id 映射),不接受请求传入路径。
68
+ - D 盘不可用时降级到 `Documents/deepseek-harness/erpbot-<id>`,并在配置抽屉标注实际路径。
69
+ - 工作区标题:`erpBot · 财 Bot` / `erpBot · 资 Bot` / `erpBot · 推 Bot` / `erpBot · 税 Bot`。
70
+ - 会话键:`dsh-erpbot.bot.session.v1.<id>`;记忆键:`dsh-erpbot.bot.memory.v1.<id>`。
71
+
72
+ ---
73
+
74
+ ## 4. 技能配置
75
+
76
+ ### 4.1 来源
77
+
78
+ | 来源 | 数量 | 说明 |
79
+ |---|---|---|
80
+ | Bot 本地技能 | 28(财 8 / 资 6 / 推 8 / 税 6) | 原四页左栏分类转为技能,保留分类与核心业务含义 |
81
+ | 平台技能 | 12 | 底座「技能与场景」的注册表 S3;Bot 只能加载,不能改版本与策略 |
82
+
83
+ ### 4.2 技能字段
84
+
85
+ `id / name{zh,en} / desc{zh,en} / source(bot-local|platform) / pillar(P0|P1) / version / state(loaded|available|disabled) / triggers[] / renderer(12 种之一) / writeScope / audit`。
86
+
87
+ ### 4.3 规则
88
+
89
+ - 默认已加载本地 P0;本地 P1 与平台技能默认 `available`。
90
+ - 同一 Bot 上限 **12**;达上限提示先卸载,不自动替换。
91
+ - 灰度技能可加载但带「灰度」角标、默认只读;停用技能置灰不可加载。
92
+ - 加载 / 卸载写入记忆;卸载不删画布历史;技能不改变身份与口径;前端不重算业务数。
93
+
94
+ ---
95
+
96
+ ## 5. 记忆配置
97
+
98
+ 每个 Bot 一份记忆,只存两件事:**用户身份关系** 与 **技能清单**;不存业务数据。
99
+
100
+ ```text
101
+ memory = {
102
+ schema: 'erp.bot.memory.v1', botId, updatedAt,
103
+ user: { principalId, displayName, roleKey, orgPath,
104
+ relations: [{ type: reviewer|approver|collaborator, id, displayName }],
105
+ permissions: { datasets, canExport, canWrite },
106
+ preferences: { lang, unit, periodWindow, salutation, replyTone } },
107
+ skills: { revision: 'S3', inventory: [{ skillId, source, state, version, loadedAt, lastUsedAt }],
108
+ loadedCount, limit: 12 },
109
+ sessions: { lastSessionId, lastActiveAt },
110
+ notes: []
111
+ }
112
+ ```
113
+
114
+ - 存储:`localStorage['dsh-erpbot.bot.memory.v1.<botId>']`;缺失 / 损坏回退默认且不报错。
115
+ - 隔离:四 Bot 各自一份;不存敏感信息;不随导出外发;「恢复默认」只重置本地记忆。
116
+
117
+ ---
118
+
119
+ ## 6. 对话契约
120
+
121
+ - 复用官方会话嵌入(`conversation.content`,`variant: 'embedded'`)与 `createAssistant` 的会话 / 工作区 / 预填能力。
122
+ - 每 Bot 独立工作区(见 §3.1)与独立会话;切页不销毁(`retain` 持有),页面卸载释放并持久化 lastSessionId。
123
+ - 技能三入口:欢迎 chips(预填 composer)、技能行「问这个」、对话回复「查看结果」。
124
+ - **移除**:TopBar AI 入口、总览 AI 卡、`AssistantDock / AssistantRail / AssistantOverlay`、呈现状态存储键。
125
+ - **保留**:槽位注册、Host 路由、官方会话、主题桥、旧会话键的一次性迁移。
126
+ - 降级:服务不可用 → 显示说明 + 「打开官方会话」;工作区创建失败 → 错误 + 重试(配置与画布仍可用);会话丢失 → 自动新建 + 空态;无 `conversation.content` → fallback 卡片。
127
+
128
+ ---
129
+
130
+ ## 7. 平台能力基座:底座(MCP 与数据 单页)
131
+
132
+ 左侧只有一个「底座 · MCP 与数据」入口(页面 id `base`);页内**没有 tab**,一屏为「4 张 KPI + 一张工作台(左清单 8 项 + 右主内容)」;本页定位 = **MCP + 数据**。
133
+
134
+ - **4 KPI**:MCP 通道 / 数据源 / 指标 / 质量异常(`split / split / gauge / status`);卡型、口径与数值由 payload 提供,spec 不写数值。
135
+ - **8 清单项**(固定顺序,能力 → 数据 → 证据):MCP 通道与服务 / 技能与场景 / 数据源 / 蒸馏批次 / 主数据映射 / 指标与口径 / 质量与对账 / 回执与审计;原 12 项中的工具与白名单、健康度、场景与运行、导出与回执并入保留项。
136
+ - **技能**:技能注册表(S3,12 项)在「技能与场景」项;**是「加载技能」的唯一来源**,Bot 画布只加载,不改版本、策略与口径。
137
+ - **深链**:`#/erp/shu` 与 `#/erp/guan` 都落到同一 `base` 页(路由别名);rail 统一高亮「底座」;不再有页内 tab 与 tab 记忆。
138
+ - **边界**:数据可写源 / 批次(只增不改)/ 主数据映射 / 口径;审计链唯一在本页;导出只读;待办处置在总览。
139
+ - 总览与底座的 Chat 入口在阶段 4 统一接入;本轮只写共享契约。
140
+ - **总览 `overview`**:四 Bot 运行状态与跨页待办;本轮布局不动。
141
+
142
+ > 总览 / 底座的 Chat 入口在阶段 4 统一;本轮 spec 只写共享契约,不改其布局与数据。
143
+
144
+ ---
145
+
146
+ ## 8. 文档索引
147
+
148
+ | 文件 | 内容 |
149
+ |---|---|
150
+ | `README.md` | 总契约:布局 / 头像配置抽屉 / Bot / 技能 / 记忆 / 对话 / 写作规范 / 验收 |
151
+ | `cai-content-spec.md` | 财 · 账房 Bot:身份定义 + 8 技能配置 + 记忆 + 对话交互 |
152
+ | `zi-content-spec.md` | 资 · 司库 Bot:身份定义 + 6 技能配置 + 记忆 + 对话交互 |
153
+ | `tui-content-spec.md` | 推 · 军师 Bot:身份定义 + 8 技能配置 + 记忆 + 对话交互 |
154
+ | `shui-content-spec.md` | 税 · 税官 Bot:身份定义 + 6 技能配置 + 记忆 + 对话交互 |
155
+ | `base-content-spec.md` | 底座(MCP 与数据单页):4 KPI、8 清单项、技能注册表、与四 Bot 的关系 |