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:
JCAI Main Agent
2026-07-27 02:09:43 +08:00
co-authored by Claude Opus 5
parent 4ad901c452
commit c6cdb4c310
11 changed files with 867 additions and 20 deletions
+32
View File
@@ -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);
}