This repository has been archived on 2026-09-13. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
BPOS-TMP-REPO/api-report/apps/api/src/modules/loop-engine/contract.d.ts
T
JCAI Main AgentandClaude Opus 5 3c974d2860 M4: 范式引擎与任务运行时
skill-engine(L4):载方法不载权力(白名单外工具即拒)、结晶片段经 ToolInvoker 留痕、
  装配入信封、技能目录渐进披露

flow-engine(L5):四种步型、确定性谓词跳步、重试与声明给定的兜底、
  异步步即监听(时限必配)、写类工具登记动作意向、步序位置持久

loop-engine(L5):自研 CMMN 子集解析器(表外构件直接报错,子集封顶可机器证明)、
  两副标准生命周期与迁移拓扑(引擎不得私改)、Enabled ≠ Active、
  语义性前提标待裁量评估(引擎不代裁量)、DMN 确定性求值 + 命中行留痕、
  DRD 缺口演绎与拓扑序、双向驱动与交集导航(断点即人环)、三型行动、
  终局唯放行与 Harness

task(L6):终态五名裁定(released 唯一成功)、Harness 预算环外强制与停滞熔断
  (监听中是健康态)、控制三语义(叫停不是终态,记最重档纠正)、改派留痕通知双方、
  断点续跑三份持久状态、封卷触发蒸馏钩子

301 个测试通过,门禁五道全绿

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
2026-07-27 01:51:22 +08:00

101 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* module: loop-engine —— 对外类型(编码规范 §10.1;语义出处 AM 03 / 04)。
*
* loop 的运行 = **CMMN 语义引擎(下层,零 LLM)× Agent 回路(上层,临场裁量)**。
* 两层的耦合点是任务数据(驱动耦合)与任务记忆(记录同轴)。
*/
import type { LoopModel, TaskId } from '@contracts';
import type { CaseModel, PlanItem, PlanItemType } from './internal/domain/cmmn-parse.ts';
import type { CaseRuntime, CaseState, EnabledEntry, EnabledSet, ItemRuntime, ItemState, Navigation, TerminalAuthority } from './internal/domain/lifecycle.ts';
import type { DecisionResult, DecisionTrace, Gap } from './internal/domain/dmn.ts';
export type { CaseModel, CaseRuntime, CaseState, DecisionResult, DecisionTrace, EnabledEntry, EnabledSet, Gap, ItemRuntime, ItemState, LoopModel, Navigation, PlanItem, PlanItemType, TerminalAuthority, };
export { CmmnParseError } from './internal/domain/cmmn-parse.ts';
export { IllegalTransitionError } from './internal/domain/lifecycle.ts';
export declare class ForbiddenTerminalError extends Error {
readonly by: TerminalAuthority;
constructor(by: TerminalAuthority);
}
export declare class AutomaticOnWorldTouchingError extends Error {
readonly itemId: string;
constructor(itemId: string);
}
/** Agent 的三型行动 —— 每一步行动属于且仅属于其一(AM 4.2) */
export type AgentAction =
/** 调工具:系统调用与 LLM 工具 */
{
readonly kind: 'tool';
readonly itemId: string;
readonly tool: string;
readonly input: Record<string, unknown>;
}
/** 调人:四卡之一 —— 调人 = 立监听听人 */
| {
readonly kind: 'human';
readonly itemId: string;
readonly card: Record<string, unknown>;
readonly workOrder: 'execution' | 'acceptance';
}
/** 立监听:AI 不能调用世界,对世界只有两种合法姿势 —— 触达它(动作)与等它(监听) */
| {
readonly kind: 'listen';
readonly itemId: string;
readonly eventType: 'data' | 'time';
readonly keyFilter: Record<string, string>;
readonly deadline: string;
}
/** 启动一个 Enabled 项(manualStart,留痕) */
| {
readonly kind: 'start';
readonly itemId: string;
}
/** 规划裁量项入场 */
| {
readonly kind: 'plan';
readonly itemId: string;
}
/** 弃用某项(此单不走这条) */
| {
readonly kind: 'disable';
readonly itemId: string;
readonly reason: string;
}
/** 评估语义性前提(评估留痕,可回放可归因) */
| {
readonly kind: 'judge';
readonly criterion: string;
readonly satisfied: boolean;
readonly rationale: string;
}
/** 判定成果已齐,提交放行 */
| {
readonly kind: 'submit';
readonly rationale: string;
};
export type TurnOutcome = {
readonly runtime: CaseRuntime;
readonly enabled: EnabledSet;
readonly navigation: Navigation;
readonly action?: AgentAction;
readonly status: 'running' | 'awaiting' | 'submitted' | 'blocked';
readonly blockedReason?: string;
};
export type LoopEngineService = {
/** 装载:XML 进语义引擎,说明书进 Agent 上下文;版本全部入信封 */
load(taskId: TaskId, model: LoopModel): Promise<CaseRuntime>;
runtime(taskId: TaskId): Promise<CaseRuntime | undefined>;
/** 发布 Enabled 集与红绿灯 —— 引擎推进的终点 */
publish(taskId: TaskId): Promise<EnabledSet>;
/** 跑一个回合:定位 → 择向 → 决断 → 行动 → 写数据 */
runTurn(taskId: TaskId): Promise<TurnOutcome>;
/** 事件驱动续跑:数据 / 时间 / 人 / 控制 */
onEvent(taskId: TaskId, event: {
kind: 'data' | 'time' | 'human' | 'control';
ref: string;
payload: Record<string, unknown>;
}): Promise<TurnOutcome>;
/** DMN 确定性求值 —— 能算的不问 LLM */
decide(taskId: TaskId, decision: string): Promise<DecisionResult>;
/** 驳回:相关计划项以新实例重新入场(迁移不是状态) */
reenter(taskId: TaskId, itemId: string): Promise<CaseRuntime>;
};