@bolloon/bolloon-agent 0.4.33 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/contacts/chain.js +27 -7
- package/dist/agents/execution-supervisor.js +580 -40
- package/dist/agents/external-events.js +35 -6
- package/dist/agents/gateway-group.js +100 -12
- package/dist/agents/goal-criteria.js +10 -3
- package/dist/agents/goal-flywheel/block-executor.js +346 -0
- package/dist/agents/goal-flywheel/continuation-decision.js +592 -0
- package/dist/agents/goal-flywheel/goal-change.js +754 -0
- package/dist/agents/goal-flywheel/index.js +26 -0
- package/dist/agents/goal-flywheel/memory-layers.js +227 -0
- package/dist/agents/goal-flywheel/run-closure.js +809 -0
- package/dist/agents/goal-flywheel/skill-candidate.js +628 -0
- package/dist/agents/goal-flywheel/types.js +329 -0
- package/dist/agents/goal-flywheel/wiring/change.js +288 -0
- package/dist/agents/goal-flywheel/wiring/closure.js +697 -0
- package/dist/agents/goal-flywheel/wiring/continuation.js +432 -0
- package/dist/agents/goal-flywheel/wiring/contract.js +270 -0
- package/dist/agents/goal-flywheel/wiring/index.js +26 -0
- package/dist/agents/goal-flywheel/wiring/monitor.js +254 -0
- package/dist/agents/goal-flywheel/wiring/seams.js +592 -0
- package/dist/agents/goal-flywheel/work-contract.js +478 -0
- package/dist/agents/goal-flywheel/work-monitor.js +488 -0
- package/dist/agents/goal-flywheel-wiring.js +1870 -0
- package/dist/agents/goal-state-reducer.js +406 -0
- package/dist/agents/goal-store.js +35 -1
- package/dist/agents/mobile-flywheel-view.js +144 -0
- package/dist/agents/mobile-task-actions-verify.js +74 -0
- package/dist/agents/mobile-task-actions.js +178 -0
- package/dist/agents/mobile-task-views.js +199 -0
- package/dist/agents/model-policy.js +651 -0
- package/dist/agents/network-pulse.js +304 -18
- package/dist/agents/pi-sdk-tools.js +84 -33
- package/dist/agents/pi-sdk.js +157 -42
- package/dist/agents/run-store.js +71 -5
- package/dist/agents/skill-readiness.js +52 -10
- package/dist/agents/subagent-manager.js +209 -3
- package/dist/agents/task/task-runner.js +17 -4
- package/dist/agents/task-group.js +8 -51
- package/dist/agents/task-public-text.js +89 -0
- package/dist/agents/workflow-pivot-loop.js +19 -12
- package/dist/cli/clipboard.js +65 -0
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/tasks.js +350 -2
- package/dist/cli/identity-command.js +177 -0
- package/dist/cli/ink-app.js +145 -17
- package/dist/cli/log-gate.js +386 -0
- package/dist/cli/mention-data.js +2 -0
- package/dist/cli/model-selector.js +538 -0
- package/dist/cli/reply-hygiene.js +54 -0
- package/dist/cli/setup-wizard.js +757 -69
- package/dist/cli/startup-notice.js +160 -0
- package/dist/cli/stores.js +22 -1
- package/dist/cli/theme.js +49 -0
- package/dist/cli/tui-select.js +970 -0
- package/dist/cli/update-commands.js +150 -24
- package/dist/cli-entry.js +137 -20
- package/dist/electron-build/agents/contacts/chain.js +26 -6
- package/dist/electron-build/agents/contacts/chain.js.map +1 -1
- package/dist/electron-build/agents/execution-supervisor.js +578 -38
- package/dist/electron-build/agents/execution-supervisor.js.map +1 -1
- package/dist/electron-build/agents/external-events.js +34 -5
- package/dist/electron-build/agents/external-events.js.map +1 -1
- package/dist/electron-build/agents/goal-criteria.js +10 -3
- package/dist/electron-build/agents/goal-criteria.js.map +1 -1
- package/dist/electron-build/agents/goal-flywheel/continuation-decision.js +598 -0
- package/dist/electron-build/agents/goal-flywheel/continuation-decision.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/goal-change.js +773 -0
- package/dist/electron-build/agents/goal-flywheel/goal-change.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/memory-layers.js +269 -0
- package/dist/electron-build/agents/goal-flywheel/memory-layers.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/run-closure.js +818 -0
- package/dist/electron-build/agents/goal-flywheel/run-closure.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/skill-candidate.js +642 -0
- package/dist/electron-build/agents/goal-flywheel/skill-candidate.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/types.js +333 -0
- package/dist/electron-build/agents/goal-flywheel/types.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/change.js +294 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/change.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/closure.js +742 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/closure.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js +444 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/contract.js +279 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/contract.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/index.js +111 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/index.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js +264 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/seams.js +612 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/seams.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/work-contract.js +488 -0
- package/dist/electron-build/agents/goal-flywheel/work-contract.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/work-monitor.js +501 -0
- package/dist/electron-build/agents/goal-flywheel/work-monitor.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel-wiring.js +1962 -0
- package/dist/electron-build/agents/goal-flywheel-wiring.js.map +1 -0
- package/dist/electron-build/agents/goal-state-reducer.js +414 -0
- package/dist/electron-build/agents/goal-state-reducer.js.map +1 -0
- package/dist/electron-build/agents/goal-store.js +35 -1
- package/dist/electron-build/agents/goal-store.js.map +1 -1
- package/dist/electron-build/agents/model-policy.js +706 -0
- package/dist/electron-build/agents/model-policy.js.map +1 -0
- package/dist/electron-build/agents/network-pulse.js +307 -19
- package/dist/electron-build/agents/network-pulse.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-tools.js +84 -33
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-types.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +156 -41
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/run-store.js +75 -6
- package/dist/electron-build/agents/run-store.js.map +1 -1
- package/dist/electron-build/agents/skill-readiness.js +52 -9
- package/dist/electron-build/agents/skill-readiness.js.map +1 -1
- package/dist/electron-build/agents/task/task-runner.js +16 -3
- package/dist/electron-build/agents/task/task-runner.js.map +1 -1
- package/dist/electron-build/agents/workflow-pivot-loop.js +19 -12
- package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
- package/dist/electron-build/llm/config-store.js +146 -6
- package/dist/electron-build/llm/config-store.js.map +1 -1
- package/dist/electron-build/llm/connection-probe.js +764 -0
- package/dist/electron-build/llm/connection-probe.js.map +1 -0
- package/dist/electron-build/llm/custom-provider-store.js +272 -0
- package/dist/electron-build/llm/custom-provider-store.js.map +1 -0
- package/dist/electron-build/llm/data/provider-catalog-baked.js +23 -0
- package/dist/electron-build/llm/data/provider-catalog-baked.js.map +1 -0
- package/dist/electron-build/llm/model-catalog.js +778 -0
- package/dist/electron-build/llm/model-catalog.js.map +1 -0
- package/dist/electron-build/llm/model-discovery.js +1202 -0
- package/dist/electron-build/llm/model-discovery.js.map +1 -0
- package/dist/electron-build/llm/model-selection.js +1315 -0
- package/dist/electron-build/llm/model-selection.js.map +1 -0
- package/dist/electron-build/llm/pi-ai.js +70 -11
- package/dist/electron-build/llm/pi-ai.js.map +1 -1
- package/dist/electron-build/llm/provider-catalog.js +969 -0
- package/dist/electron-build/llm/provider-catalog.js.map +1 -0
- package/dist/electron-build/llm/provider-registry.js +950 -0
- package/dist/electron-build/llm/provider-registry.js.map +1 -0
- package/dist/electron-build/llm/tool-name.js +266 -0
- package/dist/electron-build/llm/tool-name.js.map +1 -0
- package/dist/electron-build/orbitdb/cid-database.js +83 -17
- package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
- package/dist/electron-build/orbitdb/ipfs-node.js +31 -2
- package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -1
- package/dist/electron-build/utils/dual-source-facts.js +236 -0
- package/dist/electron-build/utils/dual-source-facts.js.map +1 -0
- package/dist/electron-build/utils/dual-source.js +347 -0
- package/dist/electron-build/utils/dual-source.js.map +1 -0
- package/dist/electron-build/utils/update-manager.js +328 -104
- package/dist/electron-build/utils/update-manager.js.map +1 -1
- package/dist/electron-build/utils/update-state.js +9 -11
- package/dist/electron-build/utils/update-state.js.map +1 -1
- package/dist/electron-build/utils/version-identity.js +193 -0
- package/dist/electron-build/utils/version-identity.js.map +1 -0
- package/dist/electron-build/utils/version-info.js +57 -31
- package/dist/electron-build/utils/version-info.js.map +1 -1
- package/dist/index.js +385 -108
- package/dist/ios/bolloon-web.json +10 -0
- package/dist/ios/chain-explorer.js +617 -0
- package/dist/ios/explorer.html +163 -0
- package/dist/ios/index.html +96 -0
- package/dist/ios/mobile-agent.js +2 -2
- package/dist/ios/mobile-contacts.js +362 -0
- package/dist/ios/mobile-core.js +3102 -310
- package/dist/ios/mobile-privacy.js +185 -0
- package/dist/ios/mobile-tasks.js +339 -0
- package/dist/ios/mobile-update.js +1442 -0
- package/dist/ios/mobile.css +19 -0
- package/dist/ios/mobile.html +96 -0
- package/dist/ios/mobile.js +1013 -41
- package/dist/ios/routes-chain-index.js +108 -0
- package/dist/ios/routes-contacts.js +420 -0
- package/dist/ios/routes-llm-config.js +344 -52
- package/dist/ios/routes-mobile-tasks.js +353 -0
- package/dist/ios/routes-onchain-trade.js +99 -0
- package/dist/ios/routes-x402-info.js +1 -0
- package/dist/ios/server.js +921 -0
- package/dist/ios/sw.js +1 -1
- package/dist/ios/task-frame-server.js +211 -0
- package/dist/llm/config-store.js +146 -6
- package/dist/llm/connection-probe.js +744 -0
- package/dist/llm/custom-provider-store.js +224 -0
- package/dist/llm/data/provider-catalog-baked.js +19 -0
- package/dist/llm/model-catalog.js +717 -0
- package/dist/llm/model-discovery.js +1137 -0
- package/dist/llm/model-selection.js +1241 -0
- package/dist/llm/pi-ai.js +70 -11
- package/dist/llm/provider-catalog.js +898 -0
- package/dist/llm/provider-registry.js +917 -0
- package/dist/llm/tool-name.js +220 -0
- package/dist/orbitdb/cid-database.js +81 -16
- package/dist/orbitdb/ipfs-node.js +31 -2
- package/dist/setup/onboard.js +34 -8
- package/dist/utils/dual-source-facts.js +223 -0
- package/dist/utils/dual-source.js +297 -0
- package/dist/utils/update-cli.js +16 -21
- package/dist/utils/update-health.js +35 -5
- package/dist/utils/update-manager.js +325 -96
- package/dist/utils/update-state.js +13 -10
- package/dist/utils/version-identity.js +176 -0
- package/dist/utils/version-info.js +27 -22
- package/dist/web/bolloon-web.json +10 -0
- package/dist/web/mobile-contacts.js +44 -11
- package/dist/web/mobile-core.js +2901 -580
- package/dist/web/mobile-tasks.js +339 -0
- package/dist/web/mobile-update.js +1442 -0
- package/dist/web/mobile.css +19 -0
- package/dist/web/mobile.html +64 -0
- package/dist/web/mobile.js +838 -35
- package/dist/web/routes-llm-config.js +344 -52
- package/dist/web/routes-mobile-tasks.js +353 -0
- package/dist/web/server.js +163 -4
- package/dist/web/sw.js +1 -1
- package/package.json +3 -1
- package/scripts/build-web.ts +36 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* goal-flywheel/work-contract.ts — P2 「子 Agent 工作合同」(独立模块, **未接线**)
|
|
4
|
+
*
|
|
5
|
+
* 解决的问题 (设计 §7 / §14 P2): 现在子 Agent "回一段文本也能算数"。
|
|
6
|
+
* 这一层给出**唯一**的派遣前契约 (`AgentWorkContract`) 与**结构化回报**的核验,
|
|
7
|
+
* 让父能明确回答三件事:
|
|
8
|
+
* ① 这份合同签得合不合法 —— 缺目标 / 缺判据 / deadline 早于 now / 金额没币种 → **拒签** (抛错)
|
|
9
|
+
* ② 这份回报够不够格 —— 缺字段 / 缺判据证据 / 越界 (`ChildProhibition`)
|
|
10
|
+
* ③ 能不能算「完成」 —— 只有: 状态 `completed` + 报告完整 + 逐条判据有证据 + 没越界 + 没超期
|
|
11
|
+
*
|
|
12
|
+
* 边界 (刻意不做, 与设计 §13 一致):
|
|
13
|
+
* - **不做 I/O, 不读真实钟**: 时间一律由 `now` / `deadline` / `reportedAt` 注入;
|
|
14
|
+
* 本文件不 import `fs` / `node:*` / 任何阶段的实现文件, 只 import `./types.js` 的类型与枚举。
|
|
15
|
+
* - **不改现有调用方**: `execution-supervisor.ts` / `goal-store.ts` / `pi-sdk.ts` / watchdog 一律没碰。
|
|
16
|
+
* 派遣时签合同、收到回报时核验 —— 那是接线 (单一所有者) 后续的事。
|
|
17
|
+
* - **不做监控**: "多久没心跳 / 要不要接管" 是 P3 (`work-monitor.ts`) 的事;
|
|
18
|
+
* 本文件只核验报告内容, 不判断时间流逝 (因此 `acceptsAsComplete` 没有 `now` 参数)。
|
|
19
|
+
*
|
|
20
|
+
* 回报协议 (`bolloon-work-report/1`, 即合同里的 `reportSchema`):
|
|
21
|
+
* - 每条 `successCriteria` 都要有**两件**东西:
|
|
22
|
+
* ① 一条证据: `WorkEvidence.kind` 或 `.ref` === `criterion:<判据原文>`
|
|
23
|
+
* ② 一条检查: `WorkCheck.name` === `criterion:<判据原文>` 且 `verdict === 'pass'`
|
|
24
|
+
* - `issueWorkContract` 把这条约定**写进合同的 `requiredEvidence`**, 子不需要猜。
|
|
25
|
+
* - 对自称 `completed` 的报告: 上述任意一条缺失 → 判越界 `mark_unverified_as_complete`
|
|
26
|
+
* (设计 §10 强负例 7: 漂亮但无证据的结果 → 父 Goal **不完成**)。
|
|
27
|
+
* - 非 `completed` 的报告 (`partial` / `blocked` / `failed` / `cancelled`) **允许**判据未满足
|
|
28
|
+
* (被卡住本来就拿不到证据, 硬要证据只会逼出假证据), 但仍然必须带**至少一条**证据
|
|
29
|
+
* (禁"只回一段文本"), 且 `blocked` 必须给结构化 `BlockRecord` (禁写成一句"有问题")。
|
|
30
|
+
*
|
|
31
|
+
* 无法从回报核验的两条禁则 (`mutate_parent_goal_state` / `spawn_unbounded_subtasks`):
|
|
32
|
+
* 回报里**没有对应字段**, 本文件**不假装**能查 —— 见 `NOT_CHECKABLE_FROM_REPORT`,
|
|
33
|
+
* 由监控层 / 接线层拦。
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WorkContractError = exports.NOT_CHECKABLE_FROM_REPORT = exports.REPORT_CHECKABLE_PROHIBITIONS = exports.DEFAULT_CANCEL_POLICY = exports.DEFAULT_FAILURE_POLICY = exports.MAX_HEARTBEAT_INTERVAL_MS = exports.MIN_HEARTBEAT_INTERVAL_MS = exports.DEFAULT_HEARTBEAT_INTERVAL_MS = exports.CRITERION_REF_PREFIX = exports.WORK_REPORT_SCHEMA = void 0;
|
|
37
|
+
exports.criterionRef = criterionRef;
|
|
38
|
+
exports.stableHash = stableHash;
|
|
39
|
+
exports.issueWorkContract = issueWorkContract;
|
|
40
|
+
exports.validateChildReport = validateChildReport;
|
|
41
|
+
exports.acceptsAsComplete = acceptsAsComplete;
|
|
42
|
+
const types_js_1 = require("./types.js");
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// §0. 常量与默认值 (合同里没有入参的字段, 默认值在这里一份写死)
|
|
45
|
+
// ============================================================================
|
|
46
|
+
/** 回报协议名 (写进合同的 `reportSchema`) */
|
|
47
|
+
exports.WORK_REPORT_SCHEMA = 'bolloon-work-report/1';
|
|
48
|
+
/** 判据引用前缀: `criterion:<判据原文>` —— 证据与检查都按这个名字对齐 */
|
|
49
|
+
exports.CRITERION_REF_PREFIX = 'criterion:';
|
|
50
|
+
/** 心跳默认间隔 (没有预算/期限约束时) */
|
|
51
|
+
exports.DEFAULT_HEARTBEAT_INTERVAL_MS = 30_000;
|
|
52
|
+
/** 心跳下限 (再短就是噪音) */
|
|
53
|
+
exports.MIN_HEARTBEAT_INTERVAL_MS = 5_000;
|
|
54
|
+
/** 心跳上限 (再长就等于没有心跳) */
|
|
55
|
+
exports.MAX_HEARTBEAT_INTERVAL_MS = 60_000;
|
|
56
|
+
/** 判据引用名 (证据与检查共用) */
|
|
57
|
+
function criterionRef(criterion) {
|
|
58
|
+
return `${exports.CRITERION_REF_PREFIX}${criterion}`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 默认失败处置 (设计 §7 职责划分 + §8 处理规则):
|
|
62
|
+
* - 心跳没了: 先 `stall` (标停), **不是**自动接管 —— 接管要先查 lease (P3)
|
|
63
|
+
* - 预算用尽: `stop_and_report` (硬底线, 不许自行扩预算)
|
|
64
|
+
* - 工具被拒: `report` (强调**不自动绕过 Harness**)
|
|
65
|
+
* - 反复失败: `escalate` (升级给父, 不许自己重试到天荒地老)
|
|
66
|
+
*/
|
|
67
|
+
exports.DEFAULT_FAILURE_POLICY = Object.freeze({
|
|
68
|
+
onHeartbeatMiss: 'stall',
|
|
69
|
+
onBudgetExhausted: 'stop_and_report',
|
|
70
|
+
onToolDenied: 'report',
|
|
71
|
+
onRepeatedFailure: 'escalate',
|
|
72
|
+
});
|
|
73
|
+
/** 默认取消策略: 宽限收尾 + 保留工件 (取消不该销毁已产出的东西) */
|
|
74
|
+
exports.DEFAULT_CANCEL_POLICY = Object.freeze({
|
|
75
|
+
onParentCancel: 'graceful',
|
|
76
|
+
graceMs: 3_000,
|
|
77
|
+
preserveArtifacts: true,
|
|
78
|
+
onParentGoalClosed: 'finish_current_step',
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* 能从**回报本身**核验的禁则 (本文件真的实现并测了)。
|
|
82
|
+
* 固定优先级 = `CHILD_PROHIBITIONS` 的声明顺序 (同一份报告只回第一条, 结果可复现)。
|
|
83
|
+
*/
|
|
84
|
+
exports.REPORT_CHECKABLE_PROHIBITIONS = [
|
|
85
|
+
'expand_own_budget',
|
|
86
|
+
'mark_unverified_as_complete',
|
|
87
|
+
'rewrite_success_criteria',
|
|
88
|
+
];
|
|
89
|
+
/**
|
|
90
|
+
* 回报里**没有字段**可供核验的禁则 —— 本文件不假装能查, 由监控层 / 接线层拦。
|
|
91
|
+
* (`AgentWorkReport` 里既没有"父 Goal 状态的镜像", 也没有"派生了几条子任务"的记录。)
|
|
92
|
+
*/
|
|
93
|
+
exports.NOT_CHECKABLE_FROM_REPORT = [
|
|
94
|
+
'mutate_parent_goal_state',
|
|
95
|
+
'spawn_unbounded_subtasks',
|
|
96
|
+
];
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// §1. 工具 (纯函数: 无 I/O, 无全局状态, 不读真实钟)
|
|
99
|
+
// ============================================================================
|
|
100
|
+
/** 拒签合同的错误 —— 带上**结构化**原因清单 (不许只给一句人话) */
|
|
101
|
+
class WorkContractError extends Error {
|
|
102
|
+
issues;
|
|
103
|
+
constructor(issues) {
|
|
104
|
+
super(`拒绝签发工作合同: ${issues.join('; ')}`);
|
|
105
|
+
this.name = 'WorkContractError';
|
|
106
|
+
this.issues = issues;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.WorkContractError = WorkContractError;
|
|
110
|
+
function isNonEmptyString(v) {
|
|
111
|
+
return typeof v === 'string' && v.trim().length > 0;
|
|
112
|
+
}
|
|
113
|
+
function isFiniteNumber(v) {
|
|
114
|
+
return typeof v === 'number' && Number.isFinite(v);
|
|
115
|
+
}
|
|
116
|
+
function isPlainObject(v) {
|
|
117
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
118
|
+
}
|
|
119
|
+
/** ISO 时间戳宽松判定: 必须是 `YYYY-MM-DD…` 且 `Date.parse` 认得出 (宽松是为兼容全仓既有写法) */
|
|
120
|
+
function isIsoLike(v) {
|
|
121
|
+
return typeof v === 'string' && /^\d{4}-\d{2}-\d{2}/.test(v) && !Number.isNaN(Date.parse(v));
|
|
122
|
+
}
|
|
123
|
+
function isWorkReportStatus(v) {
|
|
124
|
+
return types_js_1.WORK_REPORT_STATUSES.includes(v);
|
|
125
|
+
}
|
|
126
|
+
/** 去重但保留首次出现顺序 */
|
|
127
|
+
function dedupe(values) {
|
|
128
|
+
const seen = new Set();
|
|
129
|
+
const out = [];
|
|
130
|
+
for (const v of values) {
|
|
131
|
+
if (seen.has(v))
|
|
132
|
+
continue;
|
|
133
|
+
seen.add(v);
|
|
134
|
+
out.push(v);
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
/** FNV-1a 32 位 (两次不同种子拼成 16 位十六进制) —— 让 workId 可复现, 不引入随机数/时钟依赖 */
|
|
139
|
+
function fnv1a32(input, seed) {
|
|
140
|
+
let h = seed >>> 0;
|
|
141
|
+
for (let i = 0; i < input.length; i++) {
|
|
142
|
+
h ^= input.charCodeAt(i);
|
|
143
|
+
h = Math.imul(h, 0x01000193) >>> 0;
|
|
144
|
+
}
|
|
145
|
+
return h.toString(16).padStart(8, '0');
|
|
146
|
+
}
|
|
147
|
+
/** 稳定哈希 (同一输入 → 同一结果; 不读时钟, 不用随机数) */
|
|
148
|
+
function stableHash(input) {
|
|
149
|
+
return fnv1a32(input, 0x811c9dc5) + fnv1a32(`${input}\u0000#2`, 0x01000193);
|
|
150
|
+
}
|
|
151
|
+
/** 深冻结 (合同是只读的) */
|
|
152
|
+
function deepFreeze(value) {
|
|
153
|
+
if (value !== null && typeof value === 'object') {
|
|
154
|
+
for (const key of Object.keys(value)) {
|
|
155
|
+
deepFreeze(value[key]);
|
|
156
|
+
}
|
|
157
|
+
Object.freeze(value);
|
|
158
|
+
}
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 拷贝 `inputs` 再冻结 —— **不动调用方的对象** (只冻结我们自己的副本)。
|
|
163
|
+
* `structuredClone` 拿不到的类型 (函数/Promise 等) 退化为浅拷贝, 但绝不抛。
|
|
164
|
+
*/
|
|
165
|
+
function cloneInputs(inputs) {
|
|
166
|
+
try {
|
|
167
|
+
return structuredClone(inputs);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return { ...inputs };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 心跳间隔推导 (合同里没有这个入参, 只能推):
|
|
175
|
+
* 取 min(默认 30s, 预算时长/6, 到 deadline 剩余/3), 再夹到 [5s, 60s]。
|
|
176
|
+
* 理由: 心跳至少要能在"预算用尽 / 超期"之前发出几次, 长预算也不许把心跳拉长到没意义。
|
|
177
|
+
*/
|
|
178
|
+
function deriveHeartbeatIntervalMs(budget, deadline, now) {
|
|
179
|
+
const candidates = [exports.DEFAULT_HEARTBEAT_INTERVAL_MS];
|
|
180
|
+
if (isFiniteNumber(budget?.maxDurationMs) && budget.maxDurationMs > 0) {
|
|
181
|
+
candidates.push(Math.floor(budget.maxDurationMs / 6));
|
|
182
|
+
}
|
|
183
|
+
if (deadline !== null && isIsoLike(deadline) && isIsoLike(now)) {
|
|
184
|
+
const remaining = Date.parse(deadline) - Date.parse(now);
|
|
185
|
+
if (remaining > 0)
|
|
186
|
+
candidates.push(Math.floor(remaining / 3));
|
|
187
|
+
}
|
|
188
|
+
const raw = Math.min(...candidates);
|
|
189
|
+
return Math.min(Math.max(raw, exports.MIN_HEARTBEAT_INTERVAL_MS), exports.MAX_HEARTBEAT_INTERVAL_MS);
|
|
190
|
+
}
|
|
191
|
+
// ============================================================================
|
|
192
|
+
// §2. 签发合同 (issueWorkContract)
|
|
193
|
+
// ============================================================================
|
|
194
|
+
/**
|
|
195
|
+
* 签发子 Agent 工作合同 (设计 §14 冻结签名)。
|
|
196
|
+
*
|
|
197
|
+
* 合同不合法就**不签** —— 抛 `WorkContractError` (带 `issues` 结构化原因), 不做"差不多就行"的宽容。
|
|
198
|
+
* 返回的对象是**深冻结**的: 子拿到的合同不能被就地改写 (失败/取消策略、判据、预算都不可改)。
|
|
199
|
+
*
|
|
200
|
+
* `workId` 由 (goalId, parentRunId, childAgentId, capability, objective, now) 稳定哈希得出 ——
|
|
201
|
+
* 同输入同 id (可复现、可幂等), 不读时钟也不用随机数。
|
|
202
|
+
*/
|
|
203
|
+
function issueWorkContract(input) {
|
|
204
|
+
const issues = [];
|
|
205
|
+
const named = [
|
|
206
|
+
['goalId', input.goalId],
|
|
207
|
+
['parentRunId', input.parentRunId],
|
|
208
|
+
['childAgentId', input.childAgentId],
|
|
209
|
+
['capability', input.capability],
|
|
210
|
+
['objective', input.objective],
|
|
211
|
+
['issuedBy', input.issuedBy],
|
|
212
|
+
];
|
|
213
|
+
for (const [name, value] of named) {
|
|
214
|
+
if (!isNonEmptyString(value))
|
|
215
|
+
issues.push(`${name} 为空/缺失 (合同必须有明确的 ${name})`);
|
|
216
|
+
}
|
|
217
|
+
if (!isIsoLike(input.now))
|
|
218
|
+
issues.push('now 不是合法 ISO 时间戳');
|
|
219
|
+
if (input.deadline !== null) {
|
|
220
|
+
if (!isIsoLike(input.deadline)) {
|
|
221
|
+
issues.push('deadline 不是合法 ISO 时间戳 (null = 不设期限)');
|
|
222
|
+
}
|
|
223
|
+
else if (isIsoLike(input.now) && Date.parse(input.deadline) < Date.parse(input.now)) {
|
|
224
|
+
issues.push('deadline 早于签发时间 now (还没开始就超期的合同不许签)');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (!isPlainObject(input.inputs))
|
|
228
|
+
issues.push('inputs 必须是结构化对象 (Record<string, unknown>)');
|
|
229
|
+
const rawCriteria = Array.isArray(input.successCriteria) ? input.successCriteria : [];
|
|
230
|
+
const criteriaTrimmed = rawCriteria.map((c) => (typeof c === 'string' ? c.trim() : ''));
|
|
231
|
+
if (criteriaTrimmed.some((c) => c.length === 0))
|
|
232
|
+
issues.push('successCriteria 含空条目');
|
|
233
|
+
const successCriteria = dedupe(criteriaTrimmed.filter((c) => c.length > 0));
|
|
234
|
+
if (successCriteria.length === 0) {
|
|
235
|
+
issues.push('successCriteria 为空 (没有成功判据 = 没有"完成"的定义, 这种合同一定会扯皮)');
|
|
236
|
+
}
|
|
237
|
+
const rawTools = Array.isArray(input.allowedTools) ? input.allowedTools : [];
|
|
238
|
+
const toolsTrimmed = rawTools.map((t) => (typeof t === 'string' ? t.trim() : ''));
|
|
239
|
+
if (toolsTrimmed.some((t) => t.length === 0))
|
|
240
|
+
issues.push('allowedTools 含空条目');
|
|
241
|
+
// 空数组是合法的: "无工具授权" (只能基于 inputs 推理) —— 但不许出现空字符串这种脏数据
|
|
242
|
+
const allowedTools = dedupe(toolsTrimmed.filter((t) => t.length > 0));
|
|
243
|
+
const budget = input.budget;
|
|
244
|
+
if (!isPlainObject(budget)) {
|
|
245
|
+
issues.push('budget 缺失 (子不许自行扩预算, 所以父必须把上限写清)');
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
for (const field of ['maxSteps', 'maxDurationMs', 'maxAmount']) {
|
|
249
|
+
const v = budget[field];
|
|
250
|
+
if (v === null || v === undefined)
|
|
251
|
+
continue;
|
|
252
|
+
if (!isFiniteNumber(v) || v <= 0) {
|
|
253
|
+
issues.push(`budget.${field} 必须是 null 或正数 (现在: ${String(v)})`);
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (field === 'maxSteps' && !Number.isInteger(v))
|
|
257
|
+
issues.push('budget.maxSteps 必须是整数');
|
|
258
|
+
}
|
|
259
|
+
if (budget.maxAmount !== null && budget.maxAmount !== undefined && !isNonEmptyString(budget.currency)) {
|
|
260
|
+
issues.push('budget.maxAmount 有值但 budget.currency 为空 (金额没有币种 = 无法核验)');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (issues.length > 0)
|
|
264
|
+
throw new WorkContractError(issues);
|
|
265
|
+
const workId = `work-${stableHash([input.goalId, input.parentRunId, input.childAgentId, input.capability, input.objective, input.now].join('\u0000'))}`;
|
|
266
|
+
const contract = {
|
|
267
|
+
workId,
|
|
268
|
+
goalId: input.goalId,
|
|
269
|
+
parentRunId: input.parentRunId,
|
|
270
|
+
childAgentId: input.childAgentId,
|
|
271
|
+
capability: input.capability,
|
|
272
|
+
objective: input.objective,
|
|
273
|
+
inputs: cloneInputs(input.inputs),
|
|
274
|
+
allowedTools,
|
|
275
|
+
budget: {
|
|
276
|
+
maxSteps: budget.maxSteps ?? null,
|
|
277
|
+
maxDurationMs: budget.maxDurationMs ?? null,
|
|
278
|
+
maxAmount: budget.maxAmount ?? null,
|
|
279
|
+
currency: budget.currency ?? null,
|
|
280
|
+
},
|
|
281
|
+
deadline: input.deadline,
|
|
282
|
+
successCriteria,
|
|
283
|
+
reportSchema: exports.WORK_REPORT_SCHEMA,
|
|
284
|
+
heartbeatIntervalMs: deriveHeartbeatIntervalMs(budget, input.deadline, input.now),
|
|
285
|
+
failurePolicy: { ...exports.DEFAULT_FAILURE_POLICY },
|
|
286
|
+
cancelPolicy: { ...exports.DEFAULT_CANCEL_POLICY },
|
|
287
|
+
// 约定写进合同: 每条判据一条证据 (子不需要猜要交什么)
|
|
288
|
+
requiredEvidence: successCriteria.map((c) => criterionRef(c)),
|
|
289
|
+
issuedAt: input.now,
|
|
290
|
+
issuedBy: input.issuedBy,
|
|
291
|
+
};
|
|
292
|
+
return deepFreeze(contract);
|
|
293
|
+
}
|
|
294
|
+
// ============================================================================
|
|
295
|
+
// §3. 核验回报 (validateChildReport)
|
|
296
|
+
// ============================================================================
|
|
297
|
+
/**
|
|
298
|
+
* `BlockRecord` 在回报里必须自带这些事实 (缺一项 = 说不清卡在哪, 设计 §8):
|
|
299
|
+
* 必带键 + 必须非空的键。`note` 也算"说清", 空说明等于没报 (禁"有问题"式回报)。
|
|
300
|
+
*/
|
|
301
|
+
const BLOCK_RECORD_KEYS = [
|
|
302
|
+
'kind',
|
|
303
|
+
'blockedAt',
|
|
304
|
+
'lastProgressAt',
|
|
305
|
+
'owner',
|
|
306
|
+
'dependency',
|
|
307
|
+
'suggestedAction',
|
|
308
|
+
'note',
|
|
309
|
+
];
|
|
310
|
+
/** 阻塞记录是否说得清 (返回问题清单; 空 = 合格) */
|
|
311
|
+
function blockRecordIssues(block) {
|
|
312
|
+
if (!isPlainObject(block))
|
|
313
|
+
return ['blockReason 不是结构化对象 (不许写成一句"有问题")'];
|
|
314
|
+
const issues = [];
|
|
315
|
+
for (const key of BLOCK_RECORD_KEYS) {
|
|
316
|
+
if (!(key in block))
|
|
317
|
+
issues.push(`blockReason 缺字段 ${key}`);
|
|
318
|
+
}
|
|
319
|
+
for (const key of ['kind', 'blockedAt', 'lastProgressAt', 'owner', 'suggestedAction', 'note']) {
|
|
320
|
+
if (key in block && !isNonEmptyString(block[key]))
|
|
321
|
+
issues.push(`blockReason.${key} 为空`);
|
|
322
|
+
}
|
|
323
|
+
return issues;
|
|
324
|
+
}
|
|
325
|
+
/** 报告里的检查是否满足某条判据 (`criterion:<原文>` 且 verdict='pass') */
|
|
326
|
+
function verdictOfCriterion(report, criterion) {
|
|
327
|
+
const checks = Array.isArray(report?.checks) ? report.checks : [];
|
|
328
|
+
const hit = checks.find((c) => isPlainObject(c) && c.name === criterionRef(criterion));
|
|
329
|
+
if (!hit || !isPlainObject(hit))
|
|
330
|
+
return null;
|
|
331
|
+
const verdict = hit.verdict;
|
|
332
|
+
return types_js_1.CHECK_VERDICTS.includes(verdict) ? verdict : null;
|
|
333
|
+
}
|
|
334
|
+
/** 某条证据是否引用了合同要求的证据名 (kind 或 ref 任一对上 —— 精确匹配, 不许模糊) */
|
|
335
|
+
function citesRequirement(evidence, requirement) {
|
|
336
|
+
if (!isPlainObject(evidence))
|
|
337
|
+
return false;
|
|
338
|
+
const e = evidence;
|
|
339
|
+
return e.kind === requirement || e.ref === requirement;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* 核验子 Agent 回报 (设计 §14 冻结签名)。
|
|
343
|
+
*
|
|
344
|
+
* 三个桶都**返回原因**, 不只是 boolean:
|
|
345
|
+
* - `missingFields` —— 字段级不合格: 缺失 / 空 / 格式错 / **与合同不一致**
|
|
346
|
+
* (例如回报里的 `workId` 不是本合同签发的那个)。`evidence` 为空数组、`checks` 为空数组、
|
|
347
|
+
* `status='blocked'` 却没给结构化 `blockReason` 都算这里。
|
|
348
|
+
* - `missingEvidence` —— **自称 `completed`** 时, 合同的 `requiredEvidence` 里查不到对应证据的条目。
|
|
349
|
+
* (非完成状态本来就允许判据未满足 → 这一桶为空, 但"至少一条证据"仍由 `missingFields` 兜着。)
|
|
350
|
+
* - `violation` —— 越界, 取值见 `REPORT_CHECKABLE_PROHIBITIONS`; 多条命中时按
|
|
351
|
+
* `CHILD_PROHIBITIONS` 声明顺序取第一条 (结果可复现)。
|
|
352
|
+
*
|
|
353
|
+
* 本函数**不改**合同与回报 (测试里用深冻结输入钉住这一点)。
|
|
354
|
+
*/
|
|
355
|
+
function validateChildReport(contract, report) {
|
|
356
|
+
// 报告可能根本不是它自称的那个形状 (子只回了文本 / 少字段), 所以按 unknown 读
|
|
357
|
+
const r = (report ?? {});
|
|
358
|
+
const missingFields = [];
|
|
359
|
+
if (!isNonEmptyString(r.workId) || r.workId !== contract.workId)
|
|
360
|
+
missingFields.push('workId');
|
|
361
|
+
if (!isNonEmptyString(r.childAgentId) || r.childAgentId !== contract.childAgentId)
|
|
362
|
+
missingFields.push('childAgentId');
|
|
363
|
+
if (!isWorkReportStatus(r.status))
|
|
364
|
+
missingFields.push('status');
|
|
365
|
+
if (!isNonEmptyString(r.summary))
|
|
366
|
+
missingFields.push('summary');
|
|
367
|
+
if (!Array.isArray(r.evidence) || r.evidence.length === 0)
|
|
368
|
+
missingFields.push('evidence');
|
|
369
|
+
if (!Array.isArray(r.artifacts))
|
|
370
|
+
missingFields.push('artifacts');
|
|
371
|
+
if (!Array.isArray(r.checks) || r.checks.length === 0)
|
|
372
|
+
missingFields.push('checks');
|
|
373
|
+
if (!Array.isArray(r.unresolvedItems))
|
|
374
|
+
missingFields.push('unresolvedItems');
|
|
375
|
+
if (!isNonEmptyString(r.nextRecommendation))
|
|
376
|
+
missingFields.push('nextRecommendation');
|
|
377
|
+
if (!isFiniteNumber(r.durationMs) || r.durationMs < 0)
|
|
378
|
+
missingFields.push('durationMs');
|
|
379
|
+
if (!isIsoLike(r.reportedAt))
|
|
380
|
+
missingFields.push('reportedAt');
|
|
381
|
+
// 被阻塞 → 必须有能说清卡在哪的阻塞记录 (null 或结构不全都算不合格)
|
|
382
|
+
if (r.status === 'blocked' && !isPlainObject(r.blockReason)) {
|
|
383
|
+
missingFields.push('blockReason');
|
|
384
|
+
}
|
|
385
|
+
else if (r.blockReason !== null && r.blockReason !== undefined && blockRecordIssues(r.blockReason).length > 0) {
|
|
386
|
+
missingFields.push('blockReason');
|
|
387
|
+
}
|
|
388
|
+
// 判据证据: 只对"自称完成"的报告要求 (非完成状态不许逼出自证)
|
|
389
|
+
const missingEvidence = [];
|
|
390
|
+
if (r.status === 'completed') {
|
|
391
|
+
const evidence = Array.isArray(r.evidence) ? r.evidence : [];
|
|
392
|
+
for (const requirement of contract.requiredEvidence) {
|
|
393
|
+
if (!evidence.some((e) => citesRequirement(e, requirement)))
|
|
394
|
+
missingEvidence.push(requirement);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
const violation = detectViolation(contract, report, missingEvidence);
|
|
398
|
+
const ok = missingFields.length === 0 && missingEvidence.length === 0 && violation === null;
|
|
399
|
+
return { ok, missingFields, missingEvidence, violation };
|
|
400
|
+
}
|
|
401
|
+
/** 越界判定 (纯函数; 固定优先级见 `REPORT_CHECKABLE_PROHIBITIONS`) */
|
|
402
|
+
function detectViolation(contract, report, missingEvidence) {
|
|
403
|
+
const r = (report ?? {});
|
|
404
|
+
// ① 超预算: 报告里唯一能核验的预算是耗时 (maxSteps / maxAmount 回报里没有对应字段 → 不假装能查)
|
|
405
|
+
const maxDurationMs = contract.budget?.maxDurationMs ?? null;
|
|
406
|
+
const budgetOverrun = maxDurationMs !== null && isFiniteNumber(r.durationMs) && r.durationMs > maxDurationMs;
|
|
407
|
+
// ② 把未验证的结果标完成
|
|
408
|
+
const evidenceEmpty = !Array.isArray(r.evidence) || r.evidence.length === 0;
|
|
409
|
+
const unresolvedLeft = Array.isArray(r.unresolvedItems) && r.unresolvedItems.length > 0;
|
|
410
|
+
const criteriaWithoutPass = contract.successCriteria.filter((c) => verdictOfCriterion(report, c) !== 'pass');
|
|
411
|
+
const unverifiedComplete = r.status === 'completed' &&
|
|
412
|
+
(evidenceEmpty || missingEvidence.length > 0 || criteriaWithoutPass.length > 0 || unresolvedLeft);
|
|
413
|
+
// ③ 私改成功判据: 报告里对合同**没有**的判据给了检查 (自己另立了一套判据)
|
|
414
|
+
const checks = Array.isArray(r.checks) ? r.checks : [];
|
|
415
|
+
const forgedCriteria = checks.some((c) => {
|
|
416
|
+
if (!isPlainObject(c))
|
|
417
|
+
return false;
|
|
418
|
+
const name = c.name;
|
|
419
|
+
if (!isNonEmptyString(name) || !name.startsWith(exports.CRITERION_REF_PREFIX))
|
|
420
|
+
return false;
|
|
421
|
+
return !contract.successCriteria.includes(name.slice(exports.CRITERION_REF_PREFIX.length));
|
|
422
|
+
});
|
|
423
|
+
const hit = [];
|
|
424
|
+
if (budgetOverrun)
|
|
425
|
+
hit.push('expand_own_budget');
|
|
426
|
+
if (unverifiedComplete)
|
|
427
|
+
hit.push('mark_unverified_as_complete');
|
|
428
|
+
if (forgedCriteria)
|
|
429
|
+
hit.push('rewrite_success_criteria');
|
|
430
|
+
return types_js_1.CHILD_PROHIBITIONS.find((p) => hit.includes(p)) ?? null;
|
|
431
|
+
}
|
|
432
|
+
// ============================================================================
|
|
433
|
+
// §4. 是否接受为完成 (acceptsAsComplete)
|
|
434
|
+
// ============================================================================
|
|
435
|
+
/**
|
|
436
|
+
* 能不能把这份回报**接受为完成** (设计 §14 冻结签名)。这是父的判定, 不是子的自评。
|
|
437
|
+
*
|
|
438
|
+
* 拒绝原因按固定优先级给第一条 (越早发现越该先说):
|
|
439
|
+
* ① 自报状态不是 `completed`
|
|
440
|
+
* ② 报告不完整 (`missingFields`) —— 证据/检查为空的报告一律不接受
|
|
441
|
+
* ③ 判据缺证据 (`missingEvidence`)
|
|
442
|
+
* ④ 越界 (`violation`, 含 `mark_unverified_as_complete`)
|
|
443
|
+
* ⑤ 超期 (`reportedAt > deadline`) —— 超期是**交付时间**问题, 不是报告质量问题:
|
|
444
|
+
* 此时 `validateChildReport` 仍可能 `ok=true` (报告本身合格), 但要父决定是否重签合同。
|
|
445
|
+
*
|
|
446
|
+
* 通过 = 上面五条全不成立 (判据逐条有证据 + 逐条 `pass` 检查 + 无未解决项)。
|
|
447
|
+
*/
|
|
448
|
+
function acceptsAsComplete(contract, report) {
|
|
449
|
+
const r = (report ?? {});
|
|
450
|
+
const validation = validateChildReport(contract, report);
|
|
451
|
+
if (r.status !== 'completed') {
|
|
452
|
+
return {
|
|
453
|
+
accepted: false,
|
|
454
|
+
reason: `子 Agent 自报状态 '${String(r.status)}', 不是 'completed' —— 不算完成 (未完成的工作可以继续等, 但不许当完成记账)`,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
if (validation.missingFields.length > 0) {
|
|
458
|
+
return {
|
|
459
|
+
accepted: false,
|
|
460
|
+
reason: `报告不完整, 缺/不合格字段: ${validation.missingFields.join(', ')} (证据与检查为空的报告一律不接受为完成)`,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
if (validation.missingEvidence.length > 0) {
|
|
464
|
+
return {
|
|
465
|
+
accepted: false,
|
|
466
|
+
reason: `判据缺证据: ${validation.missingEvidence.join(', ')} —— 逐条判据没有证据就不算完成`,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
if (validation.violation !== null) {
|
|
470
|
+
return {
|
|
471
|
+
accepted: false,
|
|
472
|
+
reason: `子 Agent 越界 (${validation.violation}) —— 该回报不能被接受为完成, 需要父/监控层处理`,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
if (contract.deadline !== null && isIsoLike(r.reportedAt) && Date.parse(r.reportedAt) > Date.parse(contract.deadline)) {
|
|
476
|
+
return {
|
|
477
|
+
accepted: false,
|
|
478
|
+
reason: `回报时间 ${String(r.reportedAt)} 超过合同 deadline ${contract.deadline} —— 超期交付由父决定是否重签合同, 这里不判完成`,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
const evidenceCount = Array.isArray(r.evidence) ? r.evidence.length : 0;
|
|
482
|
+
const unresolvedCount = Array.isArray(r.unresolvedItems) ? r.unresolvedItems.length : 0;
|
|
483
|
+
return {
|
|
484
|
+
accepted: true,
|
|
485
|
+
reason: `${contract.successCriteria.length} 条判据逐条有证据且检查 pass, 证据 ${evidenceCount} 条, 未解决项 ${unresolvedCount} 条 (workId ${contract.workId})`,
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=work-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-contract.js","sourceRoot":"","sources":["../../../../src/agents/goal-flywheel/work-contract.ts"],"names":[],"mappings":"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"}
|