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
+68
View File
@@ -0,0 +1,68 @@
/**
* module: toolbox —— 本模块要外界提供的能力(编码规范 §10.1 / §5.3)。
*/
import type { ToolContract } from './internal/domain/tool-contract.ts';
import type { ToolCall, ToolResult } from './contract.ts';
export type Clock = {
now(): Date;
};
export type IdGenerator = {
next(): string;
};
/** 凭证密封 —— 与 llm 同一实现,由 app 注入(ADR-009) */
export type SecretBox = {
seal(plaintext: string): string;
open(cipher: string): string;
};
export type ToolRegistry = {
list(): Promise<ToolContract[]>;
get(name: string): Promise<ToolContract | undefined>;
isEnabled(name: string): Promise<boolean>;
upsert(contract: ToolContract, connectionCipher: Record<string, string> | null): Promise<void>;
setEnabled(name: string, enabled: boolean): Promise<void>;
connectionCipher(name: string): Promise<Record<string, string> | undefined>;
setAllowlist(activityId: string, tools: readonly string[]): Promise<void>;
allowlistOf(activityId: string): Promise<string[]>;
/** 有活动声明引用即不得删除 */
referencedBy(name: string): Promise<string[]>;
};
/** 工具录制回放存储 —— 与 llm 的 ReplayStore 同构,另存一表(§7.3) */
export type ToolReplayStore = {
put(record: {
key: string;
call: ToolCall;
result: ToolResult;
recordedAt: Date;
}): Promise<void>;
get(key: string): Promise<{
call: ToolCall;
result: ToolResult;
} | undefined>;
};
/**
* 工具执行 —— 实现对系统:server 侧执行代码,运行时受限,
* **只可访问注册申报的连接目标,无其他环境能力**(OS 7.3)。
*/
export type ToolRuntime = {
execute(input: {
readonly contract: ToolContract;
readonly connection: Readonly<Record<string, string>>;
readonly call: ToolCall;
readonly idempotencyKey?: string;
}): Promise<{
ok: boolean;
output?: Record<string, unknown>;
error?: {
code: string;
retryable: boolean;
message: string;
};
}>;
};
/** JSON Schema 校验 —— ajv 在 adapter,usecase 只见本端口(ADR-003) */
export type SchemaValidator = {
validate(schema: Record<string, unknown>, value: unknown): {
ok: boolean;
errors: string[];
};
};