Files
2026-08-14 14:28:28 +08:00

28 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lskj.CommandKernel
`purchase.invoice.resolve/create` `1.4` 在严格 `YYYY-MM-DD` 发票日期基础上增加可信附件预处理契约。任何时间、`Z`、偏移、区域格式或不存在日期都在查询业务数据前被拒绝;图片、PDF、CSV、XLSX 还必须分别绑定固定处理器,模型不能声明或替换 `preprocessContract`
旧 ERP 的无界面业务命令内核,目标框架保持 `.NET Framework 4.0 / x86`
CLI、ERP 进程内 AgentBridge、AstrBot Tool 和后续 MCP Server 必须复用本程序集,不得复制模块 Schema、权限、计划、验证和执行逻辑。
当前包含低代码模块检查、字段 Schema、新增计划预检、采购主数据解析与确定性来源匹配、单日/多日自然语言请假日历与冲突校验,以及 `purchase.invoice.resolve/create``hr.leave.resolve/create/submit` 业务命令处理器。多日区间要求两端都有明确上午/下午/全天,边界来自员工日历,整段工时再由 ERP 日历计算器核算并绑定短期凭证。`ModuleMenuDiscovery` 对当前 ERP 已按用户权限过滤的菜单做确定性名称/编号搜索,拒绝控制字符和不安全编号,单次最多输出 20 项;ERP 桥固定使用 10 项。普通用户界面说明只投影可见业务标签及必填/只读/Lookup 属性,不输出表、SQL、物理字段、DLL、Lookup 字段或启动参数。处理器只依赖强类型客户适配器,不包含通用 SQL、表名或反射执行入口。
`ModuleInitializationDiagnosticAnalyzer` 把限时 SQL Trace 转换成稳定诊断合同:按错误码、会话密钥保护的 SQL 指纹和调用点别名归并重复故障,区分低代码配置、过程合同、数据库权限、连接、性能、字段映射和客户端初始化配置;输出只保留 SQL 关键字/运算符与会话内 `id_####``@p_####``caller_####` 别名、参数类型、稳定分类和修复建议。客户表名、字段名、存储过程名、参数名、调用类名、参数值、原始异常消息和 CLR 异常类型都不会离开 ERP 进程。最多分析 200 条事件;时间、事件数、源 SQL 或安全投影任一达到上限都必须标记 `trace_truncated`,不能把不完整证据说成确定结论。
`CommandContracts.cs` 已定义命令版本、严格输入 JSON Schema、风险、计划、执行上下文、结果、处理器注册表、审计、幂等和确认接口。`CommandDescriptorContract` 在注册时要求安全命令名、版本、权限、说明和有界 Schema,写入/关键风险必须同时启用确认与幂等,其他风险不得伪装这些门禁;整个批次先验证后原子加入。注册表只保存深拷贝快照,`Resolve/List` 返回的描述符也不能反向修改已注册合同,同时保留请假创建后的受控 follow-up 接口。服务端执行状态存放在 `CommandPlan` 的私有字典中,不进入桥响应;客户端只看到安全预览。能力发现会按当前 ERP 会话权限过滤,模型不能看到无权使用的管理员命令。
计划所有权同时绑定客户端会话、ERP 用户、账套、子系统和大小写敏感的原始 `correlationId`。桌宠宿主的关联链校验只是第一层;ERP 进程内 `CommandDispatcher` 会在弹出原生确认窗口和占用幂等键之前再次拒绝关联 ID 调换,HMAC 确认令牌也包含计划与执行上下文的关联 ID。绕过桌宠直接调用本地桥不能改变预览、执行和审计所属的关联链。
Agent 专属管理员判断不沿用旧 ERP 的“显示名等于管理员”规则。`AdministratorIdentity` 要求当前会话同时满足内置用户 ID `1` 和精确名称 `管理员`;同名普通账号、改名账号或带空白的伪造 ID 都没有诊断与权限绕过能力。CLI 模块诊断、桥能力过滤、上下文投影和客户兼容过程使用同一身份边界;未来如需委派其他配置管理员,必须增加独立、可签字的显式授权合同,不能退回显示名判断。
任何生产写命令必须实现这些契约。`BusinessAdapterRegistrationGate` 是失败关闭式注册门禁:客户字段映射、低代码模块健康检查、参数化查询、事务保存、数据库持久幂等、权限复核和 Windows 集成证据缺少任意一项,处理器构造或注册都会失败,命令也不会出现在能力列表中。就绪状态会在计划和执行时再次检查,不能只在启动时伪装通过。
幂等键按账套、子系统、ERP 用户和命令隔离,并绑定规范化 SHA-256 输入指纹;同一 key 被用于另一份业务内容时返回 `idempotency_key_conflict`。成功的适配器结果还必须逐笔返回事务、业务审计、实际幂等键和输入指纹证据,防止数据库已提交但外围日志失败时发生不安全重试。
采购先用 `purchase.invoice.resolve` 通过客户只读过程把 OCR 供应商名称/税号、币种和物料名称/规格/单位解析为唯一 ERP 编码;零候选或多候选只返回问题,不能执行。受信任附件 Tool 自动注入的 `sourceDocuments` 包含类型、净化文件名、大小、源文件/精确提取 SHA-256 与 `preprocessContract`;图片固定为 `minimax_vlm_0.0.4`PDF 固定为 `pdfium_minimax_pages_v1`,CSV/XLSX 固定为各自隔离文档 worker。字段、后缀和处理器必须精确对应,并共同进入完整创建输入。解析成功后服务器签发绑定当前用户、账套、子系统、附件来源和完整创建输入的短期 HMAC `resolutionProof``purchase.invoice.create` 会先复核该凭证,模型绕过解析、篡改编码、摘要或处理器、跨会话复用或凭证过期时均不查询业务表。生产配置必须明确含税或不含税口径,内核会复核数量乘单价、行税额、明细汇总、头部不含税金额/税额/价税合计和币种舍入;关闭金额校验或任一价税不平时注册/计划失败。随后创建命令才读取来源,并在确认后再次精确比较来源单、行、单位、剩余量、原币价格、税率、汇率和本次分配数量;同一发票匹配多个汇率会被阻断。适配器还必须在同一事务中重新计算价税、锁定来源行、登记数据库幂等键并调用原 ERP 保存链。
自然语言请假先以有限语法解析“我/事假/明天下午”,再由客户过程唯一解析当前员工可用假别、员工日历范围和有效流转配置行。解析成功后服务器签发绑定当前用户、账套、子系统、员工、假别、流转类别、本地时段、日历工时、原因和提交意图的 5 分钟 HMAC `resolutionProof``hr.leave.create` 必须原样验证,模型直接拼装编码、篡改输入、跨会话复用或凭证过期时均在业务查询前失败关闭。`flowTypeCode``p_systemdlltabflowtype.id` 一类客户配置行标识;候选不唯一时必须追问,模型不得按职级或天数猜测。员工、假别、流程类别、原因、时间表达、申请编号的长度和控制字符在任何业务查询前检查;`startLocal/endLocal` 只接受不带 `Z` 或时区偏移的 ISO 本地时间,防止客户电脑时区换算导致错日或错时段。自然语言未明确工时时,解析器把 ERP 日历工时写入受签名创建输入;确认后再精确复核,排班导致工时发生任何变化都返回 `leave_request_changed` 并要求重新预览。请假创建和提交是两个独立命令、两次确认和两条审计记录;当解析输入包含“创建后提交”时,创建成功只生成一个新的 `hr.leave.submit` 计划,绝不在回调中自动提交。未提供客户模块字段映射和真实适配器时,不注册写命令。
`allowPastStart=false` 时,已开始的当天时段会在解析和创建复核两层拒绝;用户明确说出的工时与员工日历超出 `hoursTolerance` 时返回 `leave_requested_hours_mismatch`,不签发解析凭证。运行配置的 `maximumCalendarDays` 限制为 1-31`hoursTolerance` 限制为 0-1,超出时在启动注册前失败关闭。