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,129 @@
|
|
|
1
|
+
# 底座(`base`)· 规格(v2 · MCP 与数据 单页)
|
|
2
|
+
|
|
3
|
+
> **定位**:底座是四 Bot 的**能力接入**(MCP 通道与服务、技能)与**数据供给**(源 / 批次 / 主数据 / 口径 / 质量)合一的基座页,加一条**回执与审计**证据链;一句话就是 **MCP + 数据**,不是一个业务 Bot 页。
|
|
4
|
+
> **结构**:左侧导航只有一个「底座 · MCP 与数据」入口(en: Base · MCP and Data);**页内没有 tab**,一屏就是「4 张 KPI + 一张工作台(左清单 8 项 + 右主内容)」,复用现有单页工作台渲染器。
|
|
5
|
+
> **合并**:原「数据 / 治理」两个 tab 的 12 个清单项按「能力 → 数据 → 证据」合并为 8 项;去掉了工具与白名单、健康度、场景与运行、导出与回执 4 个独立清单项,内容分别并入保留项,不丢信息。
|
|
6
|
+
> **布局**:KPI 行 4 张卡(7 种变体与 `MetricDetailModal` 不变)+ 工作台两栏;不新增渲染器、不改其它页,payload 仍是纯数据对象(`PAGES.base`)。
|
|
7
|
+
> **范围**:本 spec 只写页面定位、无 tab 规则、KPI 形态、清单能力、技能注册表、与四 Bot 的关系、边界与验收;金额、比率、日期、算式、数据集列定义与任何真实数据一律不写,由 payload 与渲染器承载。
|
|
8
|
+
> **Chat 入口**:阶段 4 接入;接入后沿用 Bot 页的会话 / 画布规则,本轮不改布局。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. 页面定位与无 tab 规则
|
|
13
|
+
|
|
14
|
+
- **页面身份**:页面 id 仍是 `base`,标题 `底座 · MCP 与数据` / `Base · MCP and Data`;rail 仍只有一个「底座」入口,不再出现第二个入口或页内导航。
|
|
15
|
+
- **本页讲什么**:MCP 通道与技能(能力接入)、数据(源 / 批次 / 主数据 / 口径 / 质量),以及一条回执与审计(证据链)。
|
|
16
|
+
- **无 tab**:页内不再有 tab 条、不再有两套 KPI 行、不再有 tab 记忆键;所有内容在同一屏内由「4 KPI + 8 清单项」承载。
|
|
17
|
+
- **深链别名**:`#/erp/shu` 与 `#/erp/guan` 都落到同一 `base` 页(路由别名,不改页面 id、不产生第二个页面);rail 在两种深链下都保持「底座」高亮。
|
|
18
|
+
- **布局**:KPI 行下方是一张工作台——左清单 8 项顺序固定,右栏按选中项渲染;图表类保留 `alt` 双视图;与现有单页工作台共用渲染器。
|
|
19
|
+
- **权限分层**:数据工程 / 主数据角色可写数据类对象;平台管理员可写 MCP 通道与技能策略;审计角色只读回执与审计。无权限时显示锁定卡与原因,不给假数据。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. KPI 行(4 张,不写数值)
|
|
24
|
+
|
|
25
|
+
- 顶排固定 4 张 KPI 卡;7 种变体、卡序、卡位、点开的 `MetricDetailModal` 全部保留;spec 不写任何业务数据值。
|
|
26
|
+
- 四张卡(标签与代码一致):
|
|
27
|
+
|
|
28
|
+
| # | 卡(zh / en) | kind | 卡面形态 |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
| 1 | `MCP 通道` / `MCP channels` | `split` | 通道总数 + 两段占比(已连接 / 部分授权) |
|
|
31
|
+
| 2 | `数据源` / `Data sources` | `split` | 源总数 + 三段占比(核算与银行 / 票税 / 业务) |
|
|
32
|
+
| 3 | `指标` / `Metrics` | `gauge` | 指标数 + 可用率环形(`ratio` + `caption`) |
|
|
33
|
+
| 4 | `质量异常` / `Quality anomalies` | `status` | 待处理异常数 + `warn` 徽标「待处理」+ 准确性 / 一致性 / 及时性三行 |
|
|
34
|
+
|
|
35
|
+
- 卡面字段:`label {zh,en}` / `value` / `cardSub {zh,en}` / `trend` / `pct` / 微型图;`pct` 与 `trend` 同向,`trend` 只表示相对上期方向、不表示好坏。
|
|
36
|
+
- 四张卡均给 `detail`(可复算等式 + 分解 + 更新时间),具体数值、公式与更新时间由 payload 提供,不进 spec。
|
|
37
|
+
- **被降级的 KPI**:同步延迟 → 蒸馏批次的 `foot`;可联通数据 → MCP 通道与服务项的 `alt` / `foot`;技能总数 → 技能与场景项的 `pill`;场景总数 → 技能与场景项的 `alt` / `foot`。降级后信息仍在本页,不再占独立 KPI 卡。
|
|
38
|
+
- 易错语义写进实现约束:同步延迟的单位是分钟、不是金额;质量异常数与主数据待复核数是两个队列,不互相顶替、不相加;本页 KPI 都是计数或状态,不写金额。
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 3. 清单 8 项(合并来源、能力与职责、写权限)
|
|
43
|
+
|
|
44
|
+
| # | 清单项(zh / en) | icon | kind | 合并来源 | 能力与职责 | 写权限 |
|
|
45
|
+
|---|---|---|---|---|---|---|
|
|
46
|
+
| 1 | MCP 通道与服务 / MCP channels and services | `swap` | `table` + `alt` table | 原治理「MCP 通道」+「工具与白名单」+「健康度」;原治理 KPI「可联通数据」 | 通道连接、协议与鉴权、能力描述(只读 / 受控写)、工具启用与注册、可用率与延迟分位、越权拦截;`alt` = 可联通资产清单,`foot` 收健康度与配置版本 | 可写:增删通道、启停工具、改作用域;写后留配置版本与审计 |
|
|
47
|
+
| 2 | 技能与场景 / Skills and scenarios | `spark` | `table` + `alt` list | 原治理「技能策略」+「场景与运行」 | 技能注册表(12 项)、版本链、启用范围、依赖通道、灰度与停用、升级与回滚;`alt` = 场景与运行(触发方式、绑定技能、适用页面 / 角色、运行状态) | 可写:注册 / 升级 / 启停 / 回滚技能,场景配置 |
|
|
48
|
+
| 3 | 数据源 / Sources | `doc` | `table` | 原数据「数据源」,原样保留 | 登记源清单、接入方式、凭据状态与最近批次;只登记接入,不直连 ERP | 可写:登记与维护源与接入方式;凭据只读 |
|
|
49
|
+
| 4 | 蒸馏批次 / Pipelines | `pulse` | `chart` + `alt` table | 原数据「蒸馏批次」,原样保留;`foot` 收同步延迟 | 批次序列、成功与失败、全量批次与回放;批次只增不改 | 可写:新增批次(只增不改) |
|
|
50
|
+
| 5 | 主数据映射 / Master data | `users` | `table` | 原数据「主数据映射」,原样保留 | 维护六类实体的映射、生效日与待复核;变更在 ERP,本页只做映射与复核 | 可写:映射与复核结论 |
|
|
51
|
+
| 6 | 指标与口径 / Metrics and caliber | `grid` | `bars` + `alt` list | 原数据「指标与口径」,原样保留 | 查看六域指标分布、口径版本链与影响面;不解释业务结论、不给管理建议 | 可写:口径版本;不解释业务结论 |
|
|
52
|
+
| 7 | 质量与对账 / Quality and recon | `eye` | `checks` | 原数据「质量与对账」,原样保留 | 配置规则、查看命中与处置、源账对账差异与批次完整性 | 可写:质量规则;处置结论只读,处置在总览 |
|
|
53
|
+
| 8 | 回执与审计 / Receipts and audit | `eye` | `table` + `alt` list | 原治理「回执与审计」+ 原数据「导出与回执」 | 回执(谁 / 上下文 / 调了什么 / 返回 / 是否被拦)、审计链、幂等与重放、身份快照;`alt` = 导出与回执(导出任务、水印五件、回执),`summary` 收调用、失败与审计断链 | 只读:追加是唯一写 |
|
|
54
|
+
|
|
55
|
+
- 顺序按**能力 → 数据 → 证据**固定:MCP 通道与服务 → 技能与场景 → 数据源 → 蒸馏批次 → 主数据映射 → 指标与口径 → 质量与对账 → 回执与审计;图标与渲染器按页面契约固定。
|
|
56
|
+
- 每项沿用现有壳能力:`icon` / `label` / `kind` / `pill` / `summary`(3 条)/ `data` / `foot`;`chart` / `bars` 类必须有 `alt` 双视图。
|
|
57
|
+
- **被去掉的 4 个独立项**:工具与白名单、健康度并入第 1 项;场景与运行并入第 2 项;导出与回执并入第 8 项;不再作为独立清单项、不新增清单项、不新增 KPI。
|
|
58
|
+
- 状态三档只用于 UI:`ok` / `warn` / `off`(质量与检查类可用 `ok` / `warn` / `error`);不允许全 `ok`。
|
|
59
|
+
- 空态与异常:无通道 → 显示注册入口;鉴权失效 → 标 `warn` 且不落凭据;断连 / 缺批次 / 未映射 / 回放未回 → 显示对应异常文案;采集断档 → 折线断点并标「采集缺失」,不插值。处置入口指向总览,本页不提供重试按钮。
|
|
60
|
+
- 配置类写操作一律先复核后生效,写后留 `config_version` 记录与审计条目;只读项不提供写按钮。
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 4. 技能注册表(12 项,在「技能与场景」项)
|
|
65
|
+
|
|
66
|
+
- 平台技能注册表固定 **12 项**,是「技能与场景」项的**主表**;技能的版本、状态、服务 Bot、启用范围与依赖通道由 payload 提供,spec 不冻结具体值与聚合计数。
|
|
67
|
+
- 注册表字段:技能 id、名称、版本、状态、服务 Bot、启用范围、依赖通道;不含调用次数与业务结果。
|
|
68
|
+
- 12 项技能(名称):
|
|
69
|
+
|
|
70
|
+
| # | 技能 | # | 技能 |
|
|
71
|
+
|---|---|---|---|
|
|
72
|
+
| 1 | 凭证识别录入 | 7 | 发票查验 |
|
|
73
|
+
| 2 | 智能对账 | 8 | 旧银企 RPA |
|
|
74
|
+
| 3 | 账龄分析 | 9 | 预算编制 |
|
|
75
|
+
| 4 | 现金流预测 | 10 | 管报生成 |
|
|
76
|
+
| 5 | 月末关账助手 | 11 | 差异归因 |
|
|
77
|
+
| 6 | 税务申报助手 | 12 | 主数据匹配 |
|
|
78
|
+
|
|
79
|
+
- 状态取**启用 / 灰度 / 停用**之一(技能状态,不是 UI 的 `ok / warn / off`):灰度技能可加载、Bot 侧带「灰度」角标、默认只读;停用技能置灰、不可加载。
|
|
80
|
+
- 版本链以 `supersedes` 连接,旧版只 `superseded`、永不删除;回滚目标必须是链上存在且未删除的版本。
|
|
81
|
+
- 本页只做注册 / 升级 / 启停 / 回滚与版本链,不改技能逻辑内容;不记录调用次数与业务结果,这些由回执与 payload 承载。
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 5. 与四 Bot 的关系
|
|
86
|
+
|
|
87
|
+
| Bot | 本页提供 | 不提供 |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| 财 `cai` | 凭证与账簿取数的源登记、科目等主数据映射、口径版本与质量对账引用 | 不落财页主数,不替财 Bot 解释账务结论 |
|
|
90
|
+
| 资 `zi` | 银行账户与流水源的登记、账户主数据与对账结果引用 | 不落资金主数,不替资 Bot 做资金判断 |
|
|
91
|
+
| 推 `tui` | 费控与手工等源登记、指标口径与假设版本的口径说明 | 不落预算与管报主数,不改假设版本 |
|
|
92
|
+
| 税 `shui` | 票税源登记、税会口径与核对结果引用 | 不落税额与申报主数,不替税 Bot 解释申报 |
|
|
93
|
+
|
|
94
|
+
- **数据输入**:Bot 的画布与回答都来自本页登记并经质量校验的数据;本页状态异常时,Bot 应提示数据待复核,不静默给数。
|
|
95
|
+
- **口径单一**:同一指标只保留一个口径版本,四 Bot 画布读同一个值;本页不改四 Bot 画布读到的数据。
|
|
96
|
+
- **不落 Bot 主数**:账、资金、票据、税额、预算与管报的主数在各自 Bot 页;本页只在核对与质量结果中引用结论,不并列第二套数。
|
|
97
|
+
- **技能唯一来源**:技能注册表是四 Bot「加载技能」的唯一来源;Bot 画布**只加载**,不能改写版本、策略与口径。
|
|
98
|
+
- **加载状态**:Bot 的已加载 / 可加载 / 停用状态由注册表与 Bot 记忆共同决定:加载写入 Bot 记忆的 `skills.inventory`,版本与本页一致;停用技能从 Bot 可加载列表移除,已加载的置灰并提示版本已停用。
|
|
99
|
+
- **隔离与证据**:本页不读 Bot 会话与记忆;Bot 只保留回执引用,审计链唯一在本页;版本升级或回滚在下次加载生效,不回改已发生的对话与画布结果。
|
|
100
|
+
- **越界规则**:本页不回答业务结论;问题涉及账 / 资金 / 票 / 推时,指向对应 Bot。
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 6. 边界
|
|
105
|
+
|
|
106
|
+
- **数据写边界**:本页可写数据源、蒸馏批次(只增不改)、主数据映射与口径;账务不在本页写。
|
|
107
|
+
- **主数据边界**:主数据新增与改写都在 ERP;本页只做映射、生效日核对与标未映射。
|
|
108
|
+
- **审计唯一**:审计链唯一在本页;回执只追加、不改回执编号体系,Bot 只保留回执引用。
|
|
109
|
+
- **导出只读**:本页只声明导出规则、查看导出任务与回执;发起 / 审批 / 下载不在本页,导出带水印并留痕。
|
|
110
|
+
- **待办处置在总览**:本页只呈现状态与计数;重跑、处置、审批都不在本页,指向总览。
|
|
111
|
+
- **不直连 ERP**:页面与 AI 只读数据视图,不直连 ERP,不产生账务数据,不做第二账本、不并列第二套数。
|
|
112
|
+
- **渲染契约**:7 种 KPI 变体、12 种渲染器与 payload 契约保留;spec 不定义数据集列。
|
|
113
|
+
- **Chat 入口**:阶段 4 接入后沿用 Bot 页的会话、画布与降级规则;本轮不实现、不改布局。
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 7. 验收清单
|
|
118
|
+
|
|
119
|
+
- [ ] rail 只有一个「底座」入口;页面标题 `底座 · MCP 与数据` / `Base · MCP and Data`;页内无 tab 条、无两套 KPI 行。
|
|
120
|
+
- [ ] 深链 `#/erp/shu` / `#/erp/guan` 都落到同一 `base` 页,rail 仍高亮「底座」;页面 id 仍为 `base`,不再有 tab 记忆键。
|
|
121
|
+
- [ ] 4 张 KPI 名称与顺序齐全:MCP 通道 / 数据源 / 指标 / 质量异常;7 种变体与 `MetricDetailModal` 不变;spec 中未出现任何业务数据值(金额 / 比率 / 时点 / 数据量)。
|
|
122
|
+
- [ ] 工作台只有一栏清单、共 8 项,名称与顺序齐全:MCP 通道与服务 / 技能与场景 / 数据源 / 蒸馏批次 / 主数据映射 / 指标与口径 / 质量与对账 / 回执与审计。
|
|
123
|
+
- [ ] 合并来源落实:工具与白名单、健康度并入 MCP 通道与服务;场景与运行并入技能与场景;导出与回执并入回执与审计;4 项不再作为独立清单项。
|
|
124
|
+
- [ ] 技能注册表 12 项在「技能与场景」项;Bot 画布只加载,不改版本、策略与口径。
|
|
125
|
+
- [ ] 每项都有 `icon` / `label` / `kind` / `pill` / `summary` / `data` / `foot`;`chart` / `bars` 带 `alt` 双视图;状态只用 `ok / warn / off`(`checks` 可用 `error`),清单项状态不得全 `ok`。
|
|
126
|
+
- [ ] 与四 Bot 的关系写清:本页提供数据输入与技能唯一来源,且不落 Bot 主数。
|
|
127
|
+
- [ ] 权限写清:数据工程 / 主数据角色可写数据类;平台管理员可写通道与技能;审计只读。
|
|
128
|
+
- [ ] 跨页锚点全部仍在 `PAGES.base` payload 中(回执号、口径版本、金额、比率、延迟分钟等),由渲染检查断言覆盖;spec 不复述具体值。
|
|
129
|
+
- [ ] 双语成对、英文无汉字与撇号;无感叹号、营销词与 emoji;不含过程记录与历史稿引用,不引用已移除的独立页面规格。
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# 财 · 账房 Bot(cai)· Bot 规格(v5 · 对话主导 + 头像配置)
|
|
2
|
+
|
|
3
|
+
> **一句话定位**:账房 Bot 是「账与表」的对话入口——把账记对、把账关好、把证据留全;钱在资 Bot,票与税在税 Bot,预算与管报在推 Bot,口径与主数据在底座(MCP 与数据)。
|
|
4
|
+
> **布局**:TopBar(无 AI 助手入口)+ 左 rail + 顶排 4 张 KPI 卡(布局与 7 种变体不变,点开仍是 `MetricDetailModal`,spec 不写数值)+ KPI 行以下整块 **Chat 卡片**(核心板块);不再有常驻左栏、不再有浮动 Dock / Rail / Overlay。
|
|
5
|
+
> **配置**:对话头部可点击的 **Bot 头像** → 右侧配置抽屉(身份 / 技能 / 记忆三页签),覆盖式呈现、不挤压对话;身份与技能不常驻显示。
|
|
6
|
+
> **口径**:本 spec 只写 Bot 身份定义、技能配置、记忆配置与对话 / 画布交互逻辑;KPI 数值、金额、比率、时点、算式与数据集列定义一律不写,由 payload 与画布渲染器承载。
|
|
7
|
+
|
|
8
|
+
## 1. 页面与对话布局
|
|
9
|
+
|
|
10
|
+
### 1.1 页面骨架(KPI 行 + Chat 卡,无左栏)
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
┌────────────────────────────────────────────────────────────────┐
|
|
14
|
+
│ TopBar:品牌 / 问候 / 搜索 / 通知 / 头像(无 AI 助手入口) │
|
|
15
|
+
├────┬───────────────────────────────────────────────────────────┤
|
|
16
|
+
│ R │ 4 × KPI 卡(布局与 7 种变体不变,点开 MetricDetailModal) │
|
|
17
|
+
│ a ├───────────────────────────────────────────────────────────┤
|
|
18
|
+
│ i │ Chat 卡片(占满 KPI 行以下剩余空间,核心板块) │
|
|
19
|
+
│ l │ ┌───────────────────────────────────────────────────────┐ │
|
|
20
|
+
│ │ │ 头部:[Bot 头像▾] 账房 · 一句话角色 ● 就绪 │ │
|
|
21
|
+
│ 7 │ │ 会话标题 ──────────── 历史 新会话 画布 │ │
|
|
22
|
+
│ 页 │ ├───────────────────────────────────────────────────────┤ │
|
|
23
|
+
│ │ │ 官方会话(embedded chat):开场白 + 引导 chips + 消息流 │ │
|
|
24
|
+
│ │ ├───────────────────────────────────────────────────────┤ │
|
|
25
|
+
│ │ │ 官方 composer(输入区) │ │
|
|
26
|
+
│ │ └───────────────────────────────────────────────────────┘ │
|
|
27
|
+
└────┴───────────────────────────────────────────────────────────┘
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- KPI 行以上与左 rail 沿用现有导航;KPI 行以下只剩 Chat 卡片,没有常驻 Bot 面板。
|
|
31
|
+
- 点头像 → 右侧配置抽屉;点「看结果」/「查看结果」→ 右侧画布抽屉;两者都覆盖在 Chat 之上,不新增路由、不刷新页面、不销毁会话。
|
|
32
|
+
|
|
33
|
+
### 1.2 Chat 卡(头部 / 会话 / 欢迎 chips / composer)
|
|
34
|
+
|
|
35
|
+
- **头部左侧**:圆形 Bot 头像按钮(Aurora 强调色 + 运行状态点),点击打开配置抽屉;旁边是 Bot 名称「账房」+ 一句话角色 + 状态文字。窄屏保留头像,文字「配置」按钮收进「更多」。
|
|
36
|
+
- **头部右侧**:会话标题(可截断,点击展开历史列表)+ 历史 / 新会话 / 画布三个图标按钮;「画布」打开上次画布。
|
|
37
|
+
- **状态点**:就绪 / 运行中 / 待交互 / 未读 / 错误,与官方会话状态同源。
|
|
38
|
+
- **对话体**:官方 `conversation.content` 嵌入(`variant: 'embedded'`);欢迎态显示开场白 + 3 个引导 chips,之后是消息流。
|
|
39
|
+
- **输入区**:官方 composer,不自绘;预填走 `requestDraftInitialization`(`whenDraftExists: 'replace'`),预填只写草稿、不自动发送。
|
|
40
|
+
- **页面 state**:只保留语言、主题、当前页、当前 Bot 会话;会话、消息、草稿其余交给会话服务。
|
|
41
|
+
|
|
42
|
+
### 1.3 头像 → 配置抽屉(入口 / 三页签 / 关闭行为)
|
|
43
|
+
|
|
44
|
+
- **入口**:头部头像;窄屏「配置」文字按钮等价。抽屉为右侧覆盖式 `aside`(宽 420–480px,≤900px 时全宽),覆盖 Chat,但不挤压、不销毁对话。
|
|
45
|
+
- **页签**:
|
|
46
|
+
|
|
47
|
+
| 页签 | 内容 | 可编辑性 |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| 身份 | 身份卡(名称 / 角色 / 图标 / 强调色 / 版本)+ 角色定义(职责 / 语气 / 边界 / 不适用) | 角色定义只读;称呼、问候语偏好、回复语气偏好、时间与单位偏好可改,即时保存 |
|
|
50
|
+
| 技能 | 已加载 / 可加载两组;每行 = 名称 + 来源(本地 / 平台)+ 版本 + 优先级 + 状态开关 + 「问这个」;顶部显示 `已加载 N / 12`;底部「从平台技能库加载」入口 | 加载 / 卸载即时生效并写入记忆 |
|
|
51
|
+
| 记忆 | 用户身份关系(登录人 / 角色 / 组织 / 复核与审批关系 / 数据权限 / 偏好)+ 技能清单摘要 + 实际工作区路径 + 「恢复默认」 | 身份关系只读摘要;恢复默认需二次确认 |
|
|
52
|
+
|
|
53
|
+
- **关闭行为**:Escape、点击遮罩、关闭按钮均可关闭;关闭后对话会话、滚动位置、输入草稿均不丢;抽屉打开不新增路由、不刷新页面。
|
|
54
|
+
|
|
55
|
+
### 1.4 技能画布(按需抽屉)
|
|
56
|
+
|
|
57
|
+
- **触发**:对话回复中的「查看结果」、技能行的「看结果」、头部「画布」按钮(打开上次画布)。
|
|
58
|
+
- **呈现**:右侧覆盖式画布抽屉(与配置抽屉同层规则),顶部「技能名 + 返回对话」;内容复用 12 种渲染器与 payload 契约。
|
|
59
|
+
- **临时视图**:关闭即回对话;不改变会话、不改变技能加载状态;图表类技能保留 `alt`(图表 / 清单双视图)规则。
|
|
60
|
+
- 画布与 KPI 读同一 payload 快照,前端不重算业务数。
|
|
61
|
+
|
|
62
|
+
### 1.5 响应式与主题
|
|
63
|
+
|
|
64
|
+
- 宽度用 `.erp-app` 容器查询(`container-name: erp`):`≤1180px` KPI 行两列、头部动作收进「更多」;`≤900px` 配置 / 画布抽屉全宽;`≤720px` 引导 chips 折行、头像与名称纵向排列;`≤560px` 隐藏角色副标。
|
|
65
|
+
- 高度用 `.erp-board` 容器查询(`container-name: board`):短高度下欢迎语缩短、chips 收成一行、输入区始终可见。
|
|
66
|
+
- 主题跟随 DSH(`useHostTheme`),抽屉与画布沿用 `--erp-*` token;禁止用 `@media` 判断面板尺寸。
|
|
67
|
+
|
|
68
|
+
## 2. Bot 身份定义
|
|
69
|
+
|
|
70
|
+
### 2.1 身份字段
|
|
71
|
+
|
|
72
|
+
| 字段 | 值 |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `id` · 页面 | `cai` · 财 · 过去 / Books · Past |
|
|
75
|
+
| 名称 `name` | 账房 / The Ledger |
|
|
76
|
+
| 角色 `role` | 把账记对、把账关好、把证据留全 / Keep the books correct, close them cleanly, keep the evidence complete |
|
|
77
|
+
| 图标 · 强调色 | `ledger` · `aurora-v1` |
|
|
78
|
+
| 版本 | 技能注册表 `S3`(身份卡版本徽标) |
|
|
79
|
+
| 工作区 `workspaceDir` | `D:\erpBot\cai`;D 盘不可用时降级 `Documents\deepseek-harness\erpbot-cai` |
|
|
80
|
+
| 会话键 `sessionKey` | `dsh-erpbot.bot.session.v1.cai` |
|
|
81
|
+
| 记忆键 `memoryKey` | `dsh-erpbot.bot.memory.v1.cai` |
|
|
82
|
+
| 可编辑偏好 `identityEditable` | `salutation` / `greetingStyle` / `replyTone` / `timeUnit`(职责、边界、不适用项只读) |
|
|
83
|
+
| 写边界 | 只读;受控写只经 MCP,回执落底座审计 |
|
|
84
|
+
|
|
85
|
+
### 2.2 角色定义
|
|
86
|
+
|
|
87
|
+
| 项 | zh | en |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| 职责 | 负责解释本期账与表的事实:凭证与分录、账簿与试算、往来与资产明细、期末关账、法定报表、核对底稿;先给结论,再给口径与证据路径。越界问题明确拒答并指向对应 Bot。 | Explains the facts behind the books and statements: vouchers, ledgers, working capital details, the period close, statutory statements and workpapers. Gives the conclusion first, then the definition and the evidence path. Declines out-of-scope questions and points to the right Bot. |
|
|
90
|
+
| 语气 | 严谨、审计口吻、先结论后口径;短句;主动披露差异与例外;不确定就写「待复核」;不寒暄、不夸张、不猜测。 | Rigorous, audit tone, conclusion before definition. Short sentences. Volunteers gaps and exceptions. Says pending review when unsure. No small talk, no hype, no guessing. |
|
|
91
|
+
| 边界 | 不审不批不退;不直写 ERP(受控写只经 MCP);不替人签批;不重跑批次、不锁账、不解锁、不重出报表、不申报;不改口径、不在前端重算业务数、不引入本 spec 之外的新数。 | Does not review, approve or return items. Does not write to ERP directly; controlled writes go through MCP. Does not sign for people. Does not rerun batches, lock or unlock periods, reissue statements or file returns. Does not change definitions, does not recompute business numbers in the front end, and never introduces numbers outside this spec. |
|
|
92
|
+
| 不适用 | 外币折算 / 汇兑损益:账套为单一本位币。合并范围 / 合并抵消 / 权益法:单一法人、无子公司。 | FX translation and exchange differences do not apply; the ledger uses a single functional currency. Consolidation scope, eliminations and the equity method do not apply; the company is a single legal entity with no subsidiaries. |
|
|
93
|
+
|
|
94
|
+
### 2.3 开场白与欢迎 chips(逻辑说明)
|
|
95
|
+
|
|
96
|
+
- **开场白**:`我是账房。账平不平、期间走到哪、报表能不能出,都可以问我;先看哪一段?` / `I am the Ledger. Ask me whether the books balance, where the close stands, or whether the statements are ready. Where do you want to start?`
|
|
97
|
+
- **chips 生成**:取已加载技能中 P0 的前 3 条第一触发语;已加载不足 3 条时用本页内置兜底问法补齐;点击只预填 composer,不自动发送。
|
|
98
|
+
- **chips 规则**:最多 3 个;措辞与身份语气一致;不写死具体数值;技能状态变化后欢迎态 chips 同步刷新。
|
|
99
|
+
|
|
100
|
+
| # | chip 文案(zh / en) | 指向技能 |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| 1 | `本期账平不平,有没有单边或断号` / `Do the books balance this period and are there one-sided or missing entries` | `cai.vouchers` |
|
|
103
|
+
| 2 | `期末还剩哪几步,谁在等谁` / `Which close steps are left and what blocks them` | `cai.close` |
|
|
104
|
+
| 3 | `报表能不能出,复核和证据到哪一步` / `Are the statements ready and how far did review and evidence get` | `cai.statements` |
|
|
105
|
+
|
|
106
|
+
## 3. 技能配置
|
|
107
|
+
|
|
108
|
+
### 3.1 本地技能
|
|
109
|
+
|
|
110
|
+
| id | 名称(zh / en) | 能力描述 | P 级 | 默认状态 | 触发问法(zh / en) |
|
|
111
|
+
|---|---|---|---|---|---|
|
|
112
|
+
| `cai.vouchers` | 凭证与分录 / Vouchers | 查看本期凭证批、来源与过账情况,定位单边与断号 | P0 | `loaded` | `本期凭证齐不齐、平不平` / `Are vouchers complete and balanced this period` |
|
|
113
|
+
| `cai.ledgers` | 账簿与试算 / Ledgers | 六栏试算与关键科目余额,判断试算是否平衡 | P0 | `loaded` | `试算平不平,关键科目余额是多少` / `Is the trial balance level and what are the key balances` |
|
|
114
|
+
| `cai.ar-aging` | 应收账龄 / AR aging | 应收账龄结构、逾期情况与坏账准备 | P1 | `available` | `应收账龄和逾期情况怎么样` / `What is the aging structure and overdue status` |
|
|
115
|
+
| `cai.payables` | 应付账款 / Payables | 应付余额、供应商对账差异、暂估与未取票 | P1 | `available` | `应付对账差异和暂估清楚吗` / `Are payable reconciliation gaps and accruals clear` |
|
|
116
|
+
| `cai.fixed-assets` | 固定资产 / Fixed assets | 类别原值、累计折旧与净值,月折旧与盘点 / 转固异常 | P1 | `available` | `折旧提了吗,盘点差异在哪` / `Is depreciation booked and where are the count gaps` |
|
|
117
|
+
| `cai.close` | 期末关账 / Period close | 关账批次步骤、锁账状态、剩余步骤与证据 | P0 | `loaded` | `期末还剩哪几步,谁在等谁` / `Which close steps are left and what blocks them` |
|
|
118
|
+
| `cai.statements` | 财务报表 / Statements | 报表实例与状态(已出 / 已复核 / 已签署)、取数链 | P0 | `loaded` | `报表能不能出,复核到哪一步` / `Are the statements ready and how far did review get` |
|
|
119
|
+
| `cai.workpapers` | 核对底稿 / Workpapers | 试算、往来、税会口径、漏账与取数链的底稿与差异 | P0 | `loaded` | `底稿差异怎么来的,谁复核的` / `Where does the workpaper difference come from and who reviewed it` |
|
|
120
|
+
|
|
121
|
+
- **渲染器绑定**:凭证与分录 `table` · 账簿与试算 `checks` · 应收账龄 `bars` · 应付账款 `list` · 固定资产 `cards` · 期末关账 `steps` · 财务报表 `table` · 核对底稿 `checks`(12 种渲染器之一)。
|
|
122
|
+
- **写边界**:本页 8 个技能均为 `writeScope: read`、`audit: none`;不直接产生业务数据。
|
|
123
|
+
|
|
124
|
+
### 3.2 可加载的平台技能
|
|
125
|
+
|
|
126
|
+
来源为底座「技能与场景」的技能注册表 `S3`;账房只能加载,不能改写版本与策略。
|
|
127
|
+
|
|
128
|
+
| 技能(zh / en) | 注册表 id | 版本 | 状态 | 对账房的用途 |
|
|
129
|
+
|---|---|---|---|---|
|
|
130
|
+
| 凭证识别录入 / Invoice capture | `plat.invoice-ocr` | `v3.2` | 启用 | 影像识别结果是凭证与分录的上游输入,不改变本页口径 |
|
|
131
|
+
| 月末关账助手 / Close assistant | `plat.close-assistant` | `v3.0` | 启用 | 读取关账批次的步骤进度与阻塞,用于解释关账 |
|
|
132
|
+
| 账龄分析 / AR aging | `plat.ar-aging` | `v2.0` | 启用 | 生成账龄分桶与逾期分析,供应收账龄能力使用 |
|
|
133
|
+
|
|
134
|
+
> 注册表共 12 项,服务财且可加载的为上述 3 项;灰度技能可加载但带「灰度」角标、默认只读;停用技能置灰不可加载。
|
|
135
|
+
|
|
136
|
+
### 3.3 加载 / 卸载与状态规则
|
|
137
|
+
|
|
138
|
+
- **默认**:本地 P0 5 项 `loaded`;本地 P1 3 项与平台 3 项 `available`。
|
|
139
|
+
- **加载**:写入记忆 `skills.inventory`(`state: loaded` + `loadedAt`);欢迎 chips 与技能页同步更新。
|
|
140
|
+
- **卸载**:只改状态,不删画布历史与 `lastUsedAt`;已打开的画布不受影响。
|
|
141
|
+
- **上限 12**:同一 Bot 已加载技能上限 12;达上限提示「先卸载一个再加载」,不自动替换。
|
|
142
|
+
- **平台技能**:只加载、不改版本与策略;版本随注册表 `S3`;灰度 / 停用策略由底座下发,Bot 不可自行恢复。
|
|
143
|
+
- **状态三档**:`loaded` / `available` / `disabled`;`disabled` 行置灰、不可「问这个」。
|
|
144
|
+
- **不改口径**:画布读 payload 当前值,前端不重算业务数;技能加载不改变身份与回答范围。
|
|
145
|
+
|
|
146
|
+
## 4. 记忆配置
|
|
147
|
+
|
|
148
|
+
### 4.1 用户身份关系字段
|
|
149
|
+
|
|
150
|
+
| 字段 | 说明 |
|
|
151
|
+
|---|---|
|
|
152
|
+
| `user.principalId` · `displayName` | 登录人标识与显示名,来自 Host 会话;显示名可本地微调 |
|
|
153
|
+
| `user.roleKey` · `orgPath` | 主数据角色与组织路径 |
|
|
154
|
+
| `user.relations[]` | 身份关系:`reviewer` / `approver` / `collaborator` + 关系 id + 显示名;可为空 |
|
|
155
|
+
| `user.permissions` | `datasets`(可读范围)、`canExport`、`canWrite`;受控写只经 MCP |
|
|
156
|
+
| `user.preferences` | `lang` / `unit` / `periodWindow` / `salutation` / `replyTone`;后三项在身份页可改 |
|
|
157
|
+
|
|
158
|
+
### 4.2 技能清单与会话指针字段
|
|
159
|
+
|
|
160
|
+
| 字段 | 说明 |
|
|
161
|
+
|---|---|
|
|
162
|
+
| `skills.revision` | 技能注册表版本 `S3` |
|
|
163
|
+
| `skills.inventory[]` | `skillId` / `source` / `state` / `version` / `loadedAt` / `lastUsedAt` |
|
|
164
|
+
| `skills.loadedCount` · `limit` | 已加载数 / 上限 12 |
|
|
165
|
+
| `sessions` | `lastSessionId` / `lastActiveAt`,会话丢失时用于回退 |
|
|
166
|
+
| `notes` | 预留:只放用户偏好文本,禁止敏感信息 |
|
|
167
|
+
|
|
168
|
+
```text
|
|
169
|
+
记忆骨架(值为占位符,非真实数据)
|
|
170
|
+
{
|
|
171
|
+
schema: 'erp.bot.memory.v1', botId: 'cai', updatedAt: '<ISO 时间>',
|
|
172
|
+
user: {
|
|
173
|
+
principalId: '<登录人 id>', displayName: { zh: '<称呼>', en: '<name>' },
|
|
174
|
+
roleKey: '<角色>', orgPath: '<组织路径>',
|
|
175
|
+
relations: [{ type: 'reviewer|approver|collaborator', id: '<关系 id>', displayName: '<显示名>' }],
|
|
176
|
+
permissions: { datasets: ['<可读范围>'], canExport: false, canWrite: false },
|
|
177
|
+
preferences: { lang: '<lang>', unit: '<unit>', periodWindow: '<期间>', salutation: '<称呼>', replyTone: '<语气>' }
|
|
178
|
+
},
|
|
179
|
+
skills: {
|
|
180
|
+
revision: 'S3',
|
|
181
|
+
inventory: [{ skillId: '<技能 id>', source: 'bot-local|platform', state: 'loaded|available|disabled',
|
|
182
|
+
version: '<版本>', loadedAt: '<时间>', lastUsedAt: '<时间>' }],
|
|
183
|
+
loadedCount: '<已加载数>', limit: 12
|
|
184
|
+
},
|
|
185
|
+
sessions: { lastSessionId: '<会话 id>', lastActiveAt: '<时间>' },
|
|
186
|
+
notes: []
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 4.3 存储 / 恢复默认 / 隐私
|
|
191
|
+
|
|
192
|
+
| 项 | 规则 |
|
|
193
|
+
|---|---|
|
|
194
|
+
| 主存储 | `localStorage['dsh-erpbot.bot.memory.v1.cai']`,单 Bot 单键、JSON |
|
|
195
|
+
| 写入时机 | 加载 / 卸载技能、修改身份偏好、更新身份关系、恢复默认 |
|
|
196
|
+
| 读取时机 | 配置抽屉打开时、欢迎态渲染时、工作区切换后 |
|
|
197
|
+
| 缺失 / 损坏 | 回退默认记忆(登录人 + 本页 P0 技能),不阻塞页面、不弹窗 |
|
|
198
|
+
| 恢复默认 | 「记忆」页二次确认,仅重置本地记忆;不动会话、画布与工作区文件 |
|
|
199
|
+
| 隐私 | 只存关系 id / 显示名 / 权限摘要;不存手机号、证件号、银行账号;不随导出外发 |
|
|
200
|
+
| 隔离 | 四个 Bot 各一份,不互相读取;底座(MCP 与数据)不读 Bot 记忆 |
|
|
201
|
+
|
|
202
|
+
## 5. 对话交互
|
|
203
|
+
|
|
204
|
+
### 5.1 会话与工作区(`D:\erpBot\cai` + 降级)
|
|
205
|
+
|
|
206
|
+
- **复用**:`createAssistant` 的会话 / 工作区 / 预填能力(`ensureWorkspace`、`sessions.create` / `retain`、`requestDraftInitialization`、`conversation.content` 嵌入、主题桥)。
|
|
207
|
+
- **每 Bot 独立工作区**:默认 `D:\erpBot\cai`,标题 `erpBot · 财 Bot`;Host 路由 `POST /erp/workspace` 只接受白名单 `{ bot: 'cai' }`,目录由插件固定映射,不接受请求传入路径。
|
|
208
|
+
- **降级**:D 盘不可用(不存在 / 无写权限)时降级到 `Documents\deepseek-harness\erpbot-cai`,并在配置抽屉「记忆」页显示实际工作区路径,不静默失败。
|
|
209
|
+
- **会话键**:`dsh-erpbot.bot.session.v1.cai`;首次进入本页时把旧 `dsh-erpbot.assistant.session.v1` 一次性迁移到新键。
|
|
210
|
+
- **保留与恢复**:切页不销毁会话(`retain` 持有引用),切回恢复;页面卸载释放引用并持久化 `lastSessionId`;刷新恢复上次会话。
|
|
211
|
+
- **状态点语义**:就绪 / 运行中 / 待交互 / 未读 / 错误,与官方会话状态同源。
|
|
212
|
+
|
|
213
|
+
### 5.2 配置抽屉行为
|
|
214
|
+
|
|
215
|
+
- 头像或「配置」按钮打开;抽屉不改变当前会话、输入草稿与滚动位置。
|
|
216
|
+
- 三页签切换保留各自状态;身份页偏好修改即时写入记忆并显示「已保存 · 时间」;技能页开关即时生效,`已加载 N / 12` 实时刷新。
|
|
217
|
+
- 记忆页展示用户身份关系、技能清单摘要与实际工作区路径;「恢复默认」二次确认,仅重置记忆。
|
|
218
|
+
- 抽屉内「问这个」预填 composer 后自动关闭抽屉并回到对话;「看结果」切画布抽屉。
|
|
219
|
+
- 任何页签都不发起新路由;Esc / 遮罩 / 关闭按钮关闭后回到对话。
|
|
220
|
+
|
|
221
|
+
### 5.3 技能三入口与画布
|
|
222
|
+
|
|
223
|
+
| 入口 | 动作 | 落点 |
|
|
224
|
+
|---|---|---|
|
|
225
|
+
| 欢迎 chips | 点已加载 P0 的前 3 条第一触发语,预填 composer,用户补充后发送 | 对话流 |
|
|
226
|
+
| 配置抽屉「问这个」 | 预填该技能第一触发语(`whenDraftExists: 'replace'`),关抽屉回对话 | 对话流 |
|
|
227
|
+
| 配置抽屉「看结果」/ 对话回复「查看结果」 | 打开画布抽屉,用该技能 payload 渲染 | 画布层 |
|
|
228
|
+
| 头部「画布」 | 打开上次画布(无则空态提示「先看一个技能结果」) | 画布层 |
|
|
229
|
+
|
|
230
|
+
- 画布顶部「技能名 + 返回对话」;关闭画布回对话,会话不销毁、加载状态不变。
|
|
231
|
+
- 图表类技能保留 `alt` 双视图;画布与 KPI 读同一 payload 快照,前端不重算业务数。
|
|
232
|
+
|
|
233
|
+
### 5.4 错误与降级
|
|
234
|
+
|
|
235
|
+
| 场景 | 表现 |
|
|
236
|
+
|---|---|
|
|
237
|
+
| `sessions` / `workspaces` 服务不可用 | Chat 区显示降级说明 + 「打开官方会话」链接,不白屏 |
|
|
238
|
+
| 工作区创建失败(含 D 盘不可用且降级失败) | 显示错误 + 「重试」;配置抽屉与本地画布仍可用 |
|
|
239
|
+
| 会话丢失 / 被清理 | 自动新建会话;历史列表空态;记忆 `sessions` 指针回退 |
|
|
240
|
+
| 宿主无 `conversation.content` 槽位 | 显示 fallback 卡片,不吞错 |
|
|
241
|
+
| 技能未加载 / `disabled` | 技能行不可「问这个」;画布显示 `empty` 兜底 + 「先在技能页加载」,不伪造结果 |
|
|
242
|
+
|
|
243
|
+
## 6. 验收清单
|
|
244
|
+
|
|
245
|
+
- [ ] 顶排仍是 4 张 KPI 卡(布局与 7 种变体不变,点开 `MetricDetailModal`),spec 中未出现具体数值。
|
|
246
|
+
- [ ] KPI 行以下是一张 Chat 大卡片,占满剩余空间;无左栏 Bot 面板、无 Dock / Rail / Overlay。
|
|
247
|
+
- [ ] 对话头部有可点击的 Bot 头像 + 名称「账房」+ 一句话角色 + 状态点;点头像打开配置抽屉(身份 / 技能 / 记忆)。
|
|
248
|
+
- [ ] 配置抽屉为右侧覆盖式,480px 上限、≤900px 全宽;关闭后会话、滚动位置、输入草稿不丢。
|
|
249
|
+
- [ ] 身份页:角色定义只读;称呼 / 问候 / 语气 / 时间单位偏好可改并即时保存。
|
|
250
|
+
- [ ] 技能页:8 个本地技能与 3 个可加载平台技能可见;加载 / 卸载生效并写入记忆,已加载上限 12。
|
|
251
|
+
- [ ] 记忆页:用户身份关系与技能清单摘要可见;显示实际工作区路径;「恢复默认」二次确认只重置记忆。
|
|
252
|
+
- [ ] 每 Bot 独立工作区 `D:\erpBot\cai`;D 盘不可用时降级到 `Documents\deepseek-harness\erpbot-cai` 并显示路径。
|
|
253
|
+
- [ ] 会话键 `dsh-erpbot.bot.session.v1.cai` 与记忆键 `dsh-erpbot.bot.memory.v1.cai` 生效;切页 / 切语言 / 刷新保持。
|
|
254
|
+
- [ ] 技能三入口可用:欢迎 chips 预填、抽屉「问这个」预填、回复 / 技能行「查看结果」开画布;画布可返回对话。
|
|
255
|
+
- [ ] TopBar 与总览无 AI 助手入口;`sidebar.panellist` / `main` 槽位与 Host `/erp/workspace` 路由仍工作。
|
|
256
|
+
- [ ] 中英双语成对、英文无汉字与撇号;无感叹号、无营销词、无 emoji;状态只用 `ok / warn / off` 与 `loaded / available / disabled`。
|
|
257
|
+
- [ ] 窄面板按容器查询降级:≤1180 / ≤900 / ≤720 / ≤560;短高度下输入区始终可见;暗色主题正常。
|