M5(完成): @activity-sdk 与首个活动包 quote-intake
@activity-sdk(§8.2 / ADR-004): - 基座六件接口(契约 / 交互 / 记忆 / 数据 / 工具 / LLM)—— 活动看到的全部世界 - defineActivity() 的 ABI;本地开发宿主(mock 工具表 + 模拟工位 + 录制夹具), 宿主自身就守三规矩:裸调用拒发、视图含脚本拒推、监听无时限拒登记 activities/quote-intake —— 统一报价 A1 · RFQ 需求分析(flow): - 契约七件 / 步序声明五步(LLM 抽取 → 条件跳步补全 → 查历史价 → DMN 打标 → 验收放行) - 三分类规则 P-03 落 DMN 决策表(C 优先于 A,命中行留痕) - 台账声明两对象、监听时限必配、SLA 落 Harness depcruise 实测拦下活动包越界 import(activities → apps 双向隔离), 测试遂按边界拆分:活动侧只用 @sdk/@contracts/@sfeel 358 个测试通过,门禁五道全绿 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
co-authored by
Claude Opus 5
parent
4ad901c452
commit
c6cdb4c310
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* `defineActivity()` —— 活动包的 ABI 入口(ADR-004)。
|
||||
*
|
||||
* 「单文件 ESM,**默认导出** `defineActivity()` 的返回值;能力全部注入(基座六件句柄),
|
||||
* **零环境能力**;静态审扫描产物 import 与全局引用。」
|
||||
*/
|
||||
import type { ActivityBase } from './base.ts';
|
||||
|
||||
/** 活动的运行结论 —— 提交放行是唯一的成功出路 */
|
||||
export type ActivityOutcome =
|
||||
/** 判定成果已齐,提交放行(必交付物齐备、判据全绿只是可提交) */
|
||||
| { readonly kind: 'submit'; readonly deliverable: string; readonly rationale: string }
|
||||
/** 等外界:已立监听,回合到此为止 */
|
||||
| { readonly kind: 'await'; readonly reason: string }
|
||||
/** 无法推进,申报受阻待人 */
|
||||
| { readonly kind: 'blocked'; readonly reason: string };
|
||||
|
||||
export type ActivityDefinition = {
|
||||
readonly name: string;
|
||||
/** 范式只存在于引擎层;此处声明是给装载器看的 */
|
||||
readonly paradigm: 'loop' | 'flow';
|
||||
/**
|
||||
* 一个回合的推进。由**引擎**驱动调用 —— 活动不自转、不自设 maxSteps;
|
||||
* 预算与熔断由基座在环外强制。
|
||||
*/
|
||||
run(base: ActivityBase): Promise<ActivityOutcome>;
|
||||
};
|
||||
|
||||
export function defineActivity(definition: ActivityDefinition): ActivityDefinition {
|
||||
if (definition.name.trim() === '') throw new Error('活动必须有名字');
|
||||
return Object.freeze(definition);
|
||||
}
|
||||
Reference in New Issue
Block a user