refactor(contracts,agent): single capability spec and agent run event definitions in contracts

B3: CapabilityDescriptor gains replay; CapabilitySpec + capabilitySpec(id) assemble
CAPABILITY_CATALOG + CAPABILITY_IO; drop CapabilityDefinition/CapabilityRisk. agent
registry registers contracts CapabilitySpec (kind/allowedKinds instead of its own
scope enum; approve also requires authorize). AgentRun port renamed AgentRunHandle.

B9: contracts AgentRunEvent/AgentRunEventBody/AgentRunEventRow/AgentUsageTotals with
row and SSE mapping helpers; agent onEvent receives AgentRunEvent, delivered serially
in seq order, firstSeq continues numbering across processes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-27 19:15:49 +08:00
1 parent 8f59bf3772
commit db5352eecd
18 files changed
+553 -293

No files matched your search

+8 -1
View File
@@ -40,6 +40,7 @@ const ROWS: Record<string, { row: Obj; dbOnly?: string[]; apiOnly?: string[] }>
AcquisitionPlan: { row: C.AcquisitionPlan },
AcquisitionSlot: { row: C.AcquisitionSlot },
AgentRun: { row: C.AgentRun },
AgentRunEvent: { row: C.AgentRunEventRow },
ApiKey: { row: C.ApiKey, dbOnly: ["keyHash"] },
Approval: { row: C.Approval },
Artifact: { row: C.Artifact },
@@ -80,6 +81,10 @@ const ROWS: Record<string, { row: Obj; dbOnly?: string[]; apiOnly?: string[] }>
TitleAlias: { row: C.TitleAlias },
};
/** 引擎自有表(@umt/tasks 内部使用,不经 API 暴露),不要求 Row schema */
const INTERNAL_TABLES = ["TasksRunMeta", "TasksFact", "TasksOpLedger"];
const INTERNAL_ENUMS = ["TasksOpLedgerStatus"];
/** DB 枚举类型名 → contracts 枚举 */
const ENUMS: Record<string, z.ZodEnum> = {
AcquisitionPlanPurpose: C.PlanPurpose,
@@ -88,6 +93,7 @@ const ENUMS: Record<string, z.ZodEnum> = {
AcquisitionSlotStatus: C.SlotStatus,
AgentRunTrigger: C.AgentTrigger,
AgentRunStatus: C.AgentRunStatus,
AgentRunEventType: C.AgentRunEventType,
ApprovalStatus: C.ApprovalStatus,
ArtifactKind: C.ArtifactKind,
AssetLocationLocationKind: C.LocationKind,
@@ -177,7 +183,7 @@ describe("contracts ⇔ db 表结构同步", () => {
const tables = tableColumns();
it("每张表都有 Row schema", () => {
expect([...tables.keys()].sort()).toEqual(Object.keys(ROWS).sort());
expect([...tables.keys()].filter((t) => !INTERNAL_TABLES.includes(t)).sort()).toEqual(Object.keys(ROWS).sort());
});
for (const [table, spec] of Object.entries(ROWS)) {
@@ -190,6 +196,7 @@ describe("contracts ⇔ db 表结构同步", () => {
it("每个 DB 枚举都有对应 contracts 枚举且取值一致", () => {
const aliases = enumAliases();
for (const internal of INTERNAL_ENUMS) aliases.delete(internal);
expect([...aliases.keys()].sort()).toEqual(Object.keys(ENUMS).sort());
for (const [name, values] of aliases) {
expect(ENUMS[name]!.options, name).toEqual(values);