forked from ChaiHao/BPOS-MVP
app 装配收尾:18 个模块接上,MVP 判据 1-2 端到端跑通
装配(app 是唯一组装层): - wiring/engines.ts:skill/flow/loop/task/process/trigger 六个模块经端口接起来; 两个范式引擎按统一 ParadigmEngine 契约暴露给 task —— 对上层不可区分 - agent-runner.ts:loop 的 Agent 回路经 ModelGateway(两缝之一,回放审看得见); 出参过 schema 框住三型行动,不合规退化为「等人」而不是乱动世界 - container:interaction / human-tool / activity-registry / release 全部接上; event 的 TriggerMatcher 与 org 的 InFlightWorkProbe 以延迟绑定解环,端口不变 - workers/consumers.ts:派发器的两个消费者(任务监听推进旧单 / 触发器开新单,独立判定) - tools/first-party.ts:查历史价(录制回放替身)+ 三分类打标(纯工具,DMN 确定性求值) - seed-quote.ts:治理台四件事一次做完 —— 绑 LLM / 注册工具两审 / 经安装通道装活动包 / 发布流程包(闭合校验通过)+ 配触发器与邮件通道 已验证(真机): 1. 治理台配置全过;活动包静态审 0 条提示、流程包闭合校验通过 2. 一封 RFQ 邮件入站 → 归属解析 → 触发器命中 1 → 起一条工作流 → A1 任务按岗位唯一人解析落到 BD 冯兵,runtime=running 修复:zod 判别式重复值(周期触发两型展开为 periodic-calendar / periodic-data, triggerKindOf 对回三类分类学);活动构建脚本移出 activities(它要用 fs, 而活动包零环境能力 —— depcruise 拦下后按边界搬家) 358 个测试通过,门禁五道全绿 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
co-authored by
Claude Opus 5
parent
c6cdb4c310
commit
78dc03bb58
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* 第一方功能工具与纯工具的实现 —— 「实现对系统」(编码规范 §3;语义出处 OS 7.3)。
|
||||
*
|
||||
* 运行时受限:只拿得到**注册申报的连接目标**,没有其它环境能力 —— 这是 `ToolRuntime` 保证的。
|
||||
*/
|
||||
import { evaluateUnaryTest } from '@sfeel';
|
||||
import type { ToolHandler } from '@modules/toolbox';
|
||||
|
||||
/**
|
||||
* 查历史价 —— 外部系统(CRM)的**录制回放替身**。
|
||||
* README:mock 只允许出现在外界;系统内部机制一律真跑。
|
||||
*/
|
||||
const historyPriceRead: ToolHandler = async ({ input }) => {
|
||||
const pn = String(input['pn'] ?? '');
|
||||
// 录制样本:演示用的历史价情报(真 CRM 接入时换 endpoint,契约不变)
|
||||
const table: Record<string, { historyDays: number; marketStable: boolean; lifecycle: string }> = {
|
||||
LM358DR: { historyDays: 30, marketStable: true, lifecycle: '在产' },
|
||||
NE555P: { historyDays: 240, marketStable: false, lifecycle: '在产' },
|
||||
TL072CDR: { historyDays: 15, marketStable: true, lifecycle: 'EOL' },
|
||||
};
|
||||
const hit = table[pn];
|
||||
if (hit === undefined) {
|
||||
// 无历史 → 走 B(重估后报);这不是错误
|
||||
return { ok: true, output: { historyDays: 9999, marketStable: false, lifecycle: '未知', hit: false } };
|
||||
}
|
||||
return { ok: true, output: { ...hit, hit: true } };
|
||||
};
|
||||
|
||||
/** 三分类规则 P-03 的决策表 —— 与活动包里的资产同一份规则 */
|
||||
const P03_RULES = [
|
||||
{ id: 'p03-c', when: ['-', '-', '"EOL","缺货","要求替代"'], then: { type: 'C', play: '转案处理' } },
|
||||
{ id: 'p03-a', when: ['<= 90', 'true', '-'], then: { type: 'A', play: '直接快答' } },
|
||||
{ id: 'p03-b', when: ['-', '-', '-'], then: { type: 'B', play: '重估后报' } },
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* 逐条打标 —— **纯工具**:无外效应、无连接配置、活动私有作用域。
|
||||
* 「能算的不问 LLM」:同输入必同结论,零方差零 token;命中规则行随出参留痕。
|
||||
*/
|
||||
const classify: ToolHandler = async ({ input }) => {
|
||||
const values = [input['historyDays'], input['marketStable'], input['lifecycle']];
|
||||
for (const rule of P03_RULES) {
|
||||
const hit = rule.when.every((cell, i) => evaluateUnaryTest(cell, values[i], {}));
|
||||
if (hit) return { ok: true, output: { ...rule.then, rule: rule.id } };
|
||||
}
|
||||
return { ok: false, error: { code: 'no-match', retryable: false, message: '三分类规则无命中行' } };
|
||||
};
|
||||
|
||||
export const FIRST_PARTY_TOOLS: ReadonlyArray<readonly [string, ToolHandler]> = [
|
||||
['crm.history-price-read', historyPriceRead],
|
||||
['quote-intake.classify', classify],
|
||||
];
|
||||
Reference in New Issue
Block a user