M2: 基座能力 —— memory / toolbox / channel / message

- memory   任务记忆四性质(只追加·信封盖戳·治理先行·归侧)、活动记忆四层与条目三件套、
           任务日志两级投影(结构化零 LLM / 叙述性小结不入事实库)、度量八指标只读投影
- toolbox  注册两审(静态审 + 试运行审)、效应等级决定运行时待遇、契约演进只增不破坏、
           白名单与纯工具私有作用域、ToolInvoker(两缝之二,live/record/replay)
- channel  通道实例配置、入站归一(解析 → 系统写 → 数据事件)、出站发送与关联记录登记
- message  通知 / 跨任务征答(就地作答 · 驳回重答只增不改)/ 死信 / 无主兜底

app:message 接上 event 的 MessageFallback;派发器按目标 ID 取 advisory lock 串行消费 +
消费幂等表;/api/ingest 模拟邮件通道(mock 只在外界)

已验证:无主 RFQ 邮件入站 → 归属解析 no-match → 事件落库 → 兜底落 OP 岗位的消息要素
门禁五道全绿;150 个单元测试 + 1 个 PG 集成测试

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
JCAI Main Agent
2026-07-27 01:16:52 +08:00
co-authored by Claude Opus 5
parent 14d4fa046a
commit f0444f1417
73 changed files with 7488 additions and 31 deletions
+6
View File
@@ -6,18 +6,24 @@ import { serve } from '@hono/node-server';
import { loadConfig } from './config.ts';
import { createContainer } from './container.ts';
import { createServer } from './server.ts';
import { startDispatcher } from './workers/dispatcher.ts';
export async function boot(): Promise<void> {
const config = loadConfig();
const container = await createContainer(config);
await container.org.ensureSeeded();
// 派发器:投递记录即队列,按目标 ID 取 advisory lock 串行消费(ADR-008)
// 消费者随 M4(任务)/ M5(触发器)注册;此刻空表即「只标记送达」
const dispatcher = startDispatcher({ container, consumers: new Map() }, config.dispatchIntervalMs);
const app = createServer(container);
serve({ fetch: app.fetch, port: config.port }, (info) => {
process.stdout.write(`JCAI api · http://localhost:${info.port} · env=${config.nodeEnv}\n`);
});
const shutdown = async (): Promise<void> => {
dispatcher.stop();
await container.close();
process.exit(0);
};