forked from ChaiHao/BPOS-MVP
装配(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
43 lines
1.6 KiB
TypeScript
43 lines
1.6 KiB
TypeScript
/**
|
|
* 派发器的消费者表 —— 三级消费的两个下游(ADR-008 #2;语义出处 OS 6.3)。
|
|
*
|
|
* 「任务监听(推进旧单)与触发器(起单规则,开新单)**相互独立判定**
|
|
* —— 同一事件可既推进旧单又起新单。」
|
|
*/
|
|
import type { Delivery } from '@modules/event';
|
|
import type { TaskId } from '@contracts';
|
|
import type { Consumer } from './dispatcher.ts';
|
|
|
|
/** ① 任务监听:投递到任务,环续跑 */
|
|
const taskConsumer: Consumer = async (delivery, container) => {
|
|
const envelope = await container.event.getEvent(delivery.eventId);
|
|
if (envelope === undefined) return;
|
|
const taskId = delivery.target.id as TaskId;
|
|
const kind = envelope.type === 'control' ? 'control' : envelope.type === 'time' ? 'time' : envelope.type === 'human' ? 'human' : 'data';
|
|
await container.task.deliver(taskId, {
|
|
kind,
|
|
ref: envelope.correlation.cause.ref,
|
|
payload: envelope.payload.data,
|
|
});
|
|
};
|
|
|
|
/** ② 触发器:开新单;同一事件对同一触发器至多起一单 */
|
|
const triggerConsumer: Consumer = async (delivery, container) => {
|
|
const envelope = await container.event.getEvent(delivery.eventId);
|
|
if (envelope === undefined) return;
|
|
await container.trigger.fireByEvent(String(delivery.target.id), envelope.id, {
|
|
type: envelope.type,
|
|
keys: envelope.correlation.keys,
|
|
payload: envelope.payload.data,
|
|
source: envelope.source.kind,
|
|
occurredAt: envelope.occurredAt,
|
|
});
|
|
};
|
|
|
|
export function createConsumers(): ReadonlyMap<Delivery['target']['kind'], Consumer> {
|
|
return new Map<Delivery['target']['kind'], Consumer>([
|
|
['task', taskConsumer],
|
|
['trigger', triggerConsumer],
|
|
]);
|
|
}
|