@bolloon/bolloon-agent 0.4.33 → 0.5.0
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 +493 -35
- 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/network-pulse.js +304 -18
- package/dist/agents/pi-sdk.js +75 -20
- package/dist/agents/run-store.js +18 -5
- package/dist/agents/skill-readiness.js +52 -10
- package/dist/agents/subagent-manager.js +209 -3
- package/dist/agents/task/task-runner.js +9 -3
- package/dist/agents/task-group.js +8 -51
- package/dist/agents/task-public-text.js +89 -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/setup-wizard.js +71 -0
- package/dist/cli/update-commands.js +150 -24
- package/dist/cli-entry.js +12 -2
- 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 +492 -34
- 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/network-pulse.js +307 -19
- package/dist/electron-build/agents/network-pulse.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +74 -19
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/run-store.js +20 -5
- 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 +8 -2
- package/dist/electron-build/agents/task/task-runner.js.map +1 -1
- 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.js +471 -0
- package/dist/electron-build/utils/dual-source.js.map +1 -0
- package/dist/electron-build/utils/update-manager.js +331 -57
- package/dist/electron-build/utils/update-manager.js.map +1 -1
- package/dist/electron-build/utils/update-state.js +16 -1
- package/dist/electron-build/utils/update-state.js.map +1 -1
- package/dist/electron-build/utils/version-info.js +82 -2
- package/dist/electron-build/utils/version-info.js.map +1 -1
- package/dist/index.js +103 -12
- 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 +329 -0
- package/dist/ios/mobile-core.js +1379 -226
- package/dist/ios/mobile-privacy.js +185 -0
- package/dist/ios/mobile.css +19 -0
- package/dist/ios/mobile.html +96 -0
- package/dist/ios/mobile.js +706 -7
- package/dist/ios/routes-chain-index.js +108 -0
- package/dist/ios/routes-contacts.js +420 -0
- package/dist/ios/routes-onchain-trade.js +99 -0
- package/dist/ios/routes-x402-info.js +1 -0
- package/dist/ios/server.js +762 -0
- package/dist/ios/task-frame-server.js +211 -0
- package/dist/orbitdb/cid-database.js +81 -16
- package/dist/orbitdb/ipfs-node.js +31 -2
- package/dist/utils/dual-source.js +426 -0
- package/dist/utils/update-cli.js +16 -21
- package/dist/utils/update-health.js +35 -5
- package/dist/utils/update-manager.js +329 -57
- package/dist/utils/update-state.js +16 -1
- package/dist/utils/version-info.js +75 -1
- package/dist/web/mobile-contacts.js +44 -11
- package/dist/web/mobile-core.js +1197 -513
- package/dist/web/mobile-tasks.js +339 -0
- package/dist/web/mobile.css +19 -0
- package/dist/web/mobile.html +64 -0
- package/dist/web/mobile.js +531 -1
- package/dist/web/routes-mobile-tasks.js +353 -0
- package/dist/web/server.js +163 -4
- package/package.json +3 -1
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* wiring/change.ts — 接缝 ⑤「人中途改了什么要求, 用户该看到哪一类状态?」 (**M4 独占**)
|
|
4
|
+
*
|
|
5
|
+
* 归属: `seams.ts` 的 `SEAM_ROSTER` 里 `id: 'change'`, `stage: 'M4'`。
|
|
6
|
+
* M4 只准改本文件 + 声明的 `wiringPoints` (`goal-flywheel/goal-change.ts` · `web/server.ts`)。
|
|
7
|
+
*
|
|
8
|
+
* ## 这条接缝要回答的四件事 (以前只回答第四件)
|
|
9
|
+
*
|
|
10
|
+
* ```
|
|
11
|
+
* 用户/外部在目标**跑着的时候**提要求
|
|
12
|
+
* ① 原话逐字入档了吗? → 没原文 / 被改写过 → 拒绝 (原话就是证据)
|
|
13
|
+
* ② 在跑的这一轮怎么办? → 撤销 = 停; 其余 = 让这一轮跑完, 只影响后续 Run (规则 4)
|
|
14
|
+
* ③ 在跑的子 Agent 怎么办? → 规则 5: 逐 workId 一份下发内容, 必须先 ack 再继续
|
|
15
|
+
* ④ 用户该看到哪一类状态? → 有待决定的变更 → `needs_your_decision` (只升不降)
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* ## 为什么"在跑的 Run 要停"这件事归这条接缝
|
|
19
|
+
*
|
|
20
|
+
* 用户撤销的语义是"别再继续了"。撤销落到 Goal 上 (`abandoned`) 之后, **在飞的 Run 并不会自己
|
|
21
|
+
* 发现** —— 执行器只在每一轮循环开头读一次自己 Run 记录的状态 (`paused` / `aborted` 就自行停下,
|
|
22
|
+
* 轮内不打断)。所以"停"必须由**注入变更的那一方**写进 Run 记录: 除了这条接缝, 没有第二个人
|
|
23
|
+
* 知道"用户刚刚撤销了"。写状态用的是**既有的外部控制面原语**(与 `POST /api/runs/:id/abort`
|
|
24
|
+
* 同一条路), 不是新造一条停止通道 —— 否则就是第二套事实。
|
|
25
|
+
*
|
|
26
|
+
* ## 两条边界 (接缝的自律)
|
|
27
|
+
*
|
|
28
|
+
* · **判定在 `goal-change.ts` (纯函数), 副作用在接线层** —— 接缝自己不读盘/不写盘/不读钟:
|
|
29
|
+
* "在跑的 Run 是谁"由宿主注入 (`runningRun`), "怎么停"由宿主注入 (`stopRunningRun`)。
|
|
30
|
+
* 宿主没注入 → 接缝返回 `stopped: false` + 结构化原因, **绝不假装停过** (也不偷偷放行)。
|
|
31
|
+
* · **只升不降**: 变更对用户可见态的影响只有"抬成 `needs_your_decision`"这一种, 绝不把
|
|
32
|
+
* `ended` / `child_blocked` / `no_progress` 降级成"正在执行"。已结束的目标上, 待批的变更
|
|
33
|
+
* 已经没有生效对象 → 不许把 `ended` 抬成"需要你决定"。
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DECISION_PENDING_STATUSES = exports.CHANGE_OUTCOMES = exports.USER_ONLY_CHANGE_KINDS = exports.CHANGE_SEAM_ID = void 0;
|
|
37
|
+
exports.changeVisibleState = changeVisibleState;
|
|
38
|
+
exports.createChangeSeam = createChangeSeam;
|
|
39
|
+
const goal_change_js_1 = require("../goal-change.js");
|
|
40
|
+
const seams_js_1 = require("./seams.js");
|
|
41
|
+
exports.CHANGE_SEAM_ID = 'change';
|
|
42
|
+
/** 只有人能做"撤销/缩范围"这类动作 */
|
|
43
|
+
exports.USER_ONLY_CHANGE_KINDS = ['abort', 'scope_reduction'];
|
|
44
|
+
/** `applyChange` 的三个 outcome (宿主返回别的值 = 接线坏了, 抛错而不是当没看见) */
|
|
45
|
+
exports.CHANGE_OUTCOMES = ['next_run', 'pending_approval', 'rejected'];
|
|
46
|
+
/** 变更记录状态里"还在等一个人拍板"的那些 → 用户可见态必须说"需要你决定" */
|
|
47
|
+
exports.DECISION_PENDING_STATUSES = ['needs_approval', 'triaged'];
|
|
48
|
+
/**
|
|
49
|
+
* 变更驱动的用户可见态覆盖 —— **只升不降**。
|
|
50
|
+
*
|
|
51
|
+
* 为什么必须有这一条: 目标在跑 (`executing`) 时用户提了一条"要加权限"的要求, 它被正确判成
|
|
52
|
+
* `needs_approval` 等待人批准 —— 但界面上仍然是"正在执行", 于是没有人知道这里有东西卡在
|
|
53
|
+
* 等人。设计稿 §8 的第五类状态 (`needs_your_decision`) 正是为这一刻存在的。
|
|
54
|
+
*
|
|
55
|
+
* 不覆盖的情形也有理由: `ended` (目标已结束, 待批的变更已经没有生效对象)。
|
|
56
|
+
* `base === null` = 基础态**读不到**: 有待拍板的变更时仍抬成"需要你决定" (有人必须看一眼这件事
|
|
57
|
+
* 与基础态无关); 没有待拍板的变更时返回 `null` —— 不编一个态出来。
|
|
58
|
+
*/
|
|
59
|
+
function changeVisibleState(input) {
|
|
60
|
+
const waiting = input.changes.filter((c) => exports.DECISION_PENDING_STATUSES.includes(String(c.status)));
|
|
61
|
+
if (waiting.length === 0) {
|
|
62
|
+
return {
|
|
63
|
+
state: input.base,
|
|
64
|
+
elevated: false,
|
|
65
|
+
reason: input.base === null
|
|
66
|
+
? '基础可见态读不到, 且没有等拍板的变更 → 不断言 (不把"读不到"说成"正在执行")'
|
|
67
|
+
: '没有等拍板的变更 → 用户可见态不变',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const ids = waiting.map((c) => c.changeId).slice(0, 3).join(', ');
|
|
71
|
+
if (input.base === 'ended') {
|
|
72
|
+
return {
|
|
73
|
+
state: 'ended',
|
|
74
|
+
elevated: false,
|
|
75
|
+
reason: `目标已结束 → 不把 ${waiting.length} 条变更 (${ids}) 抬成"需要你决定" (已结束的目标上没有生效对象)`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (input.base === 'needs_your_decision') {
|
|
79
|
+
return {
|
|
80
|
+
state: 'needs_your_decision',
|
|
81
|
+
elevated: false,
|
|
82
|
+
reason: `本来就是"需要你决定", 另等 ${waiting.length} 条变更拍板 (${ids})`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
state: 'needs_your_decision',
|
|
87
|
+
elevated: true,
|
|
88
|
+
reason: `${waiting.length} 条变更等你决定 (${ids}) → 覆盖 "${input.base ?? '读不到的基础态'}" `
|
|
89
|
+
+ '(否则界面会一直显示"正在执行", 没人知道有东西在等人)',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
93
|
+
// 接缝实例
|
|
94
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
95
|
+
/** 在跑的 Run 的事实: 宿主当场传入 > 依赖注入 > 不知道 (undefined) */
|
|
96
|
+
async function resolveRunningRun(deps, input) {
|
|
97
|
+
if (input.runningRun !== undefined)
|
|
98
|
+
return input.runningRun;
|
|
99
|
+
if (!deps.runningRun)
|
|
100
|
+
return undefined;
|
|
101
|
+
try {
|
|
102
|
+
return await deps.runningRun(input.goalId);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// 探测失败 = 事实缺失 (不是"没有在跑的 Run"): 上层拿到 factsMissing 后不做任何断言
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 在跑的子 Agent 工作的事实: 调用方当场传入 > 依赖注入 > 没给 (`undefined`)。
|
|
111
|
+
*
|
|
112
|
+
* `undefined` 的语义与"宿主没传这份事实"**完全一致** —— 接缝不在这里另立一套
|
|
113
|
+
* "事实缺失"标记 (`ChangeInjectionPlan` 没有这个字段, 那是 M4 纯函数的既定口径);
|
|
114
|
+
* 探针抛错 (读盘失败) 也按"没给"处理并返回 undefined, 绝不编出几个 workId 来。
|
|
115
|
+
*/
|
|
116
|
+
async function resolveLiveWorkIds(deps, input) {
|
|
117
|
+
if (input.liveWorkIds !== undefined)
|
|
118
|
+
return input.liveWorkIds;
|
|
119
|
+
if (!deps.liveWorkIds)
|
|
120
|
+
return undefined;
|
|
121
|
+
try {
|
|
122
|
+
const ids = await deps.liveWorkIds(input.goalId);
|
|
123
|
+
return Array.isArray(ids) ? ids : undefined;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 基础用户可见态 (读不到就返回 null + 原因)。
|
|
131
|
+
*
|
|
132
|
+
* 为什么必须容错: 入档本身**已经成功**了 (原话落档 + 判定 + 下一 Run 指令)。这时如果读可见态
|
|
133
|
+
* 抛错, 整个人口会 500 —— 人会以为"没提上去"而重提一遍 (重复变更)。所以读不到就读不到:
|
|
134
|
+
* 如实返回 null, 让视图说"读不到", 而不是把已经生效的变更报成失败。
|
|
135
|
+
*/
|
|
136
|
+
async function resolveBaseVisible(deps, input) {
|
|
137
|
+
try {
|
|
138
|
+
return { base: await deps.visibleState(input), reason: null };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return { base: null, reason: `用户可见态读不到 (${String(err?.message || err).slice(0, 120)})` };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function dedupeChanges(list) {
|
|
145
|
+
const byId = new Map();
|
|
146
|
+
for (const c of list)
|
|
147
|
+
byId.set(String(c.changeId), c);
|
|
148
|
+
return [...byId.values()];
|
|
149
|
+
}
|
|
150
|
+
function createChangeSeam(deps) {
|
|
151
|
+
async function applyRunBoundary(input) {
|
|
152
|
+
const b = input.plan.runBoundary;
|
|
153
|
+
if (b.action === 'let_finish') {
|
|
154
|
+
return {
|
|
155
|
+
action: 'let_finish',
|
|
156
|
+
stopped: false,
|
|
157
|
+
runId: b.runId,
|
|
158
|
+
runStatus: null,
|
|
159
|
+
reason: `不需要停动作 (在跑的 Run 继续跑完): ${b.reason}`,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const runStatus = b.runStatus === 'paused' || b.runStatus === 'aborted' ? b.runStatus : 'paused';
|
|
163
|
+
if (!b.runId) {
|
|
164
|
+
return {
|
|
165
|
+
action: 'stop_running_run',
|
|
166
|
+
stopped: false,
|
|
167
|
+
runId: null,
|
|
168
|
+
runStatus,
|
|
169
|
+
reason: '计划要求停 Run, 但没有 runId → 拒绝凭空停一个 Run (拿不到对象就不动手)',
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const stop = input.stop ?? deps.stopRunningRun;
|
|
173
|
+
if (!stop) {
|
|
174
|
+
return {
|
|
175
|
+
action: 'stop_running_run',
|
|
176
|
+
stopped: false,
|
|
177
|
+
runId: b.runId,
|
|
178
|
+
runStatus,
|
|
179
|
+
reason: `计划要求停 Run ${b.runId} (→${runStatus}), 但宿主没有注入停 Run 的执行器 → **没有停**`
|
|
180
|
+
+ ' (需要主线在 M0 的 createChangeSeam 注入 stopRunningRun, 或由入口按参数传入; 本接缝不做 I/O, 也不假装停过)',
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const res = await stop({ goalId: input.plan.goalId, runId: b.runId, runStatus, reason: b.reason, now: input.now });
|
|
184
|
+
return {
|
|
185
|
+
action: 'stop_running_run',
|
|
186
|
+
stopped: !!res?.ok,
|
|
187
|
+
runId: b.runId,
|
|
188
|
+
runStatus,
|
|
189
|
+
reason: res?.ok
|
|
190
|
+
? `已把 Run ${b.runId} 置为 ${runStatus}: 执行器下一轮循环读到后自行停下 (轮内不打断, 已发生的步骤不改写)`
|
|
191
|
+
: `停 Run ${b.runId} 被拒绝: ${res?.reason || '执行器没给原因 (不静默当成功)'}`,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
id: exports.CHANGE_SEAM_ID,
|
|
196
|
+
stage: 'M4',
|
|
197
|
+
async ingestChange(input) {
|
|
198
|
+
const raw = String(input.instruction ?? '');
|
|
199
|
+
// ① 原话是证据: 没有原文就不许往下走 (一句"理解"不能代替人说过的话)
|
|
200
|
+
if (!raw.trim()) {
|
|
201
|
+
return (0, seams_js_1.refuse)('child_cannot_mutate_goal', '拒绝: 变更没有原文 —— 不许用一句"理解"代替人说过的话');
|
|
202
|
+
}
|
|
203
|
+
// ② 只有人能撤销 / 缩小意图 (设计稿「意图的落位」纪律 2)。
|
|
204
|
+
// 判据 = 真实分诊 (`userOnlyChangeKind`), 不再只认字面关键词:
|
|
205
|
+
// "别继续做了 / abort this / 只做第一条" 这些说法现在也认得出来。
|
|
206
|
+
const userOnly = (0, goal_change_js_1.userOnlyChangeKind)(raw);
|
|
207
|
+
if (userOnly && input.source !== 'user') {
|
|
208
|
+
return (0, seams_js_1.refuse)('only_goal_reducer_changes_goal_state', `拒绝: ${input.source} 想提「${userOnly}」类变更 —— 只有人能撤销/缩小意图 `
|
|
209
|
+
+ '(Agent 不得因为"执行起来方便"就替人改意图)');
|
|
210
|
+
}
|
|
211
|
+
const out = await deps.ingest({ ...input, instruction: raw });
|
|
212
|
+
if (!out?.request || !out?.application) {
|
|
213
|
+
throw new Error('[change 接缝] 宿主没有返回变更记录/生效判定 (接缝不替它编一份)');
|
|
214
|
+
}
|
|
215
|
+
if (!exports.CHANGE_OUTCOMES.includes(String(out.application.outcome))) {
|
|
216
|
+
throw new Error(`[change 接缝] 宿主返回的 outcome 非法: "${String(out.application.outcome)}" (合法: ${exports.CHANGE_OUTCOMES.join('/')})`);
|
|
217
|
+
}
|
|
218
|
+
// ③ 规则 4 是**宿主契约**: 记录必须标着"只影响后续 Run"。违反 = 接线坏了 → 抛错, 不假绿。
|
|
219
|
+
if (out.request.appliesToFutureRunsOnly !== true) {
|
|
220
|
+
throw new Error('[change 接缝] 宿主返回的变更记录没标 appliesToFutureRunsOnly —— 规则 4: 已发生的 Run 历史不可被新要求改写');
|
|
221
|
+
}
|
|
222
|
+
// ④ 原话必须逐字入档: 被改写过的"原话"不是证据
|
|
223
|
+
if (out.request.instruction !== raw) {
|
|
224
|
+
return (0, seams_js_1.refuse)('child_cannot_mutate_goal', '拒绝: 变更记录里的 instruction 与用户原话不一致 (原话必须逐字入档)');
|
|
225
|
+
}
|
|
226
|
+
// ⑤ 正在运行的 Goal: 拿事实 → 判定 (纯函数) → 按判定执行 (宿主注入的执行器)
|
|
227
|
+
const runningRun = await resolveRunningRun(deps, input);
|
|
228
|
+
const liveWorkIds = await resolveLiveWorkIds(deps, input);
|
|
229
|
+
const plan = (0, goal_change_js_1.planChangeInjection)({
|
|
230
|
+
request: out.request,
|
|
231
|
+
application: out.application,
|
|
232
|
+
runningRun,
|
|
233
|
+
liveWorkIds,
|
|
234
|
+
});
|
|
235
|
+
const runBoundary = await applyRunBoundary({ plan, now: input.now });
|
|
236
|
+
// ⑥ 规则 5: 逐 workId 一份下发内容 (计划里已经算好; 这里只补"要不要先补全影响面")
|
|
237
|
+
const childDelivery = {
|
|
238
|
+
directives: plan.childDirectives,
|
|
239
|
+
workIds: plan.liveWorkIds,
|
|
240
|
+
scopeMissing: plan.childScopeMissing,
|
|
241
|
+
blocked: plan.childScopeMissing,
|
|
242
|
+
mustAck: true,
|
|
243
|
+
note: plan.childScopeMissing
|
|
244
|
+
? `在跑的 ${plan.liveWorkIds.length} 个子 Agent 必须收到变更版本, 但这条变更没点明影响面 → 下发前先用 scopeChangeToWork 补全 (不许静默漏发)`
|
|
245
|
+
: plan.childDirectives.length
|
|
246
|
+
? `已为 ${plan.childDirectives.length} 个在跑的子 Agent 各生成一份下发内容 (每个都必须先 ack 再继续)`
|
|
247
|
+
: '没有在跑的子 Agent 需要下发 (子 Agent 条款仍在下一 Run 指令里)',
|
|
248
|
+
};
|
|
249
|
+
// ⑦ 用户可见态: 有待拍板的变更 → "需要你决定" (只升不降; 基础态读不到也不编一个态出来)
|
|
250
|
+
const observed = await resolveBaseVisible(deps, { goalId: input.goalId, now: input.now });
|
|
251
|
+
const recorded = await deps.pending(input.goalId).catch(() => []);
|
|
252
|
+
const visible = changeVisibleState({
|
|
253
|
+
base: observed.base,
|
|
254
|
+
// 新入档这条用它自己的真实结论 (宿主回传的 request.status 停在分诊那一刻, 不是终态)
|
|
255
|
+
changes: dedupeChanges([
|
|
256
|
+
...recorded,
|
|
257
|
+
{ changeId: out.request.changeId, kind: out.request.kind, status: (0, goal_change_js_1.nextStatusFor)(out.application.outcome) },
|
|
258
|
+
]),
|
|
259
|
+
});
|
|
260
|
+
return {
|
|
261
|
+
request: out.request,
|
|
262
|
+
classification: out.application,
|
|
263
|
+
application: out.application,
|
|
264
|
+
instructionVerbatim: raw,
|
|
265
|
+
plan,
|
|
266
|
+
runBoundary,
|
|
267
|
+
childDelivery,
|
|
268
|
+
visibleState: visible.state,
|
|
269
|
+
visibleReason: observed.reason ? `${visible.reason}; ${observed.reason}` : visible.reason,
|
|
270
|
+
needsDisambiguation: out.request.status === 'received' || !out.request.interpreted,
|
|
271
|
+
};
|
|
272
|
+
},
|
|
273
|
+
applyRunBoundary,
|
|
274
|
+
nextRunDirective(goalId) {
|
|
275
|
+
return deps.nextRunDirective(goalId);
|
|
276
|
+
},
|
|
277
|
+
async markConsumed(goalId, runIndex, now) {
|
|
278
|
+
if (!Number.isInteger(runIndex) || runIndex < 0) {
|
|
279
|
+
throw new Error(`[change 接缝] markConsumed 的 runIndex 必须是 >=0 的整数 (收到 ${String(runIndex)}) —— 版本下发的记账不许记在一个不存在的 Run 序号上`);
|
|
280
|
+
}
|
|
281
|
+
await deps.markConsumed(goalId, runIndex, now);
|
|
282
|
+
},
|
|
283
|
+
async visibleState(input) {
|
|
284
|
+
const observed = await resolveBaseVisible(deps, { goalId: input.goalId, now: input.now });
|
|
285
|
+
const recorded = await deps.pending(input.goalId).catch(() => []);
|
|
286
|
+
// 基础态读不到且没有待拍板的变更 → null (不编一个态出来)
|
|
287
|
+
return changeVisibleState({ base: observed.base, changes: recorded }).state;
|
|
288
|
+
},
|
|
289
|
+
pendingChanges(goalId) {
|
|
290
|
+
return deps.pending(goalId);
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change.js","sourceRoot":"","sources":["../../../../../src/agents/goal-flywheel/wiring/change.ts"],"names":[],"mappings":"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"}
|