@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,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* wiring/monitor.ts — 接缝 ④「有谁卡住了, 该谁动手?」 (**M3 独占**)
|
|
4
|
+
*
|
|
5
|
+
* 归属: `seams.ts` 的 `SEAM_ROSTER` 里 `id: 'monitor'`, `stage: 'M3'`。
|
|
6
|
+
* M3 只准改本文件 + `wiring/contract.ts` + 声明的 `wiringPoints` (`goal-flywheel/work-monitor.ts`)。
|
|
7
|
+
*
|
|
8
|
+
* ## 这条接缝钉住的冻结规则
|
|
9
|
+
*
|
|
10
|
+
* **规则 ④ 的"子 Agent 被阻塞"那一类终止路径必须经过收尾漏斗**。
|
|
11
|
+
* Watchdog 只看进程存活; 这条接缝看的是"任务卡住了没有"。它只做三件事:
|
|
12
|
+
* ① **统一巡检** (`sweepAll` / `sweep`): 一次把**所有**待回报 Goal 的阻塞查清楚 (有界, 不静默);
|
|
13
|
+
* ② **按计划处理** (`handle`): 处置动作交给宿主执行 —— 接缝自己**永不自动绕过 Harness**;
|
|
14
|
+
* ③ **用户可见态** (`visibleState` / `createVisibleStateProbe`): 只暴露冻结层的闭集, 内部词不外泄。
|
|
15
|
+
*
|
|
16
|
+
* 阻塞升级到人 → Goal 的状态变更**不在这里直接写**, 而是交给 Goal reducer
|
|
17
|
+
* (规则 ②), 由接线层在 `handle` 之后调用。本文件因此没有任何 Goal 写入面。
|
|
18
|
+
*
|
|
19
|
+
* ## M3 的两处深化 (为什么不是"又一个透传壳")
|
|
20
|
+
*
|
|
21
|
+
* 1. **统一监控**: 真实 tick 里"逐个 Goal 巡检"是散在各处的循环 (`execution-supervisor.ts` 那段
|
|
22
|
+
* `listGoalsWithPendingWork` → `collectWorkBlocks` → `applyBlockHandling`)。`sweepAll` 把这条循环
|
|
23
|
+
* 收成**一次调用**: 有界扫描 + 每个 Goal 一份结论 + **失败必须留痕** (`errors[]`),
|
|
24
|
+
* 不许"某个 Goal 巡检抛错 → 这一轮当它不存在"。
|
|
25
|
+
* 2. **用户只看到闭集**: `createVisibleStateProbe` 以前是**裸透传** (`return deps.visible(input)`),
|
|
26
|
+
* 端口给什么就往外说什么 —— 于是"用户视野只有这几类"只是端口自觉。现在它**逐值校验闭集**
|
|
27
|
+
* (`USER_VISIBLE_STATES`), 闭集外的值 / 端口抛错一律**拒绝**并说清原因, 而不是把内部词
|
|
28
|
+
* 顺手暴露给用户。
|
|
29
|
+
*
|
|
30
|
+
* ### 五类还是六类 (如实说明, 不改冻结层)
|
|
31
|
+
*
|
|
32
|
+
* 设计稿 §8 写的是"用户可见只暴露**五类**": 正在执行 / 等待外部回复 / 子 Agent 被阻塞 /
|
|
33
|
+
* 暂时没有进展 / 需要你决定。冻结层 (`types.ts`) 在 2026-09-25 接线时**追加了第 6 类** `ended`
|
|
34
|
+
* (理由: 前五类里没有"已结束", 已结束的目标只能借用 `executing` 或 `needs_your_decision`,
|
|
35
|
+
* 那正是 P3/P4 要防的假象)。改冻结层要单独一个提交 + 更新类型计数门, **不归 M3**。
|
|
36
|
+
* 所以本接缝按**冻结闭集** (五类 + `ended`) 钉住: 断言"返回值只能是闭集里的值"是硬的,
|
|
37
|
+
* 断言"闭集有几个值"留给冻结层 (`goal-flywheel-types.test.ts` 的计数门)。
|
|
38
|
+
*/
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.INTERNAL_VISIBLE_WORDS = exports.USER_FACING_STATES = exports.MONITOR_SWEEP_MAX_LIMIT = exports.MONITOR_SWEEP_DEFAULT_LIMIT = exports.MONITOR_SEAM_ID = void 0;
|
|
41
|
+
exports.isUserVisibleState = isUserVisibleState;
|
|
42
|
+
exports.scanInternalLeak = scanInternalLeak;
|
|
43
|
+
exports.userFacingState = userFacingState;
|
|
44
|
+
exports.createMonitorSeam = createMonitorSeam;
|
|
45
|
+
exports.createVisibleStateProbe = createVisibleStateProbe;
|
|
46
|
+
exports.describeVisibleState = describeVisibleState;
|
|
47
|
+
const types_js_1 = require("../types.js");
|
|
48
|
+
// 自己那个阶段的实现模块 (P3, 纯函数): "用户该看到哪一类"的判定只有一份
|
|
49
|
+
const work_monitor_js_1 = require("../work-monitor.js");
|
|
50
|
+
const seams_js_1 = require("./seams.js");
|
|
51
|
+
exports.MONITOR_SEAM_ID = 'monitor';
|
|
52
|
+
/** 统一巡检的默认/上限 (有界: 不许在 tick 里无界扫盘) */
|
|
53
|
+
exports.MONITOR_SWEEP_DEFAULT_LIMIT = 20;
|
|
54
|
+
exports.MONITOR_SWEEP_MAX_LIMIT = 200;
|
|
55
|
+
function errText(e) {
|
|
56
|
+
return String(e?.message || e).slice(0, 300);
|
|
57
|
+
}
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// §1. 用户可见面: 闭集校验 + 内部词扫描 (纯函数, 可被门/变异验证复用)
|
|
60
|
+
// ============================================================================
|
|
61
|
+
/**
|
|
62
|
+
* 一个 continuation 决策是否长得像 `ContinuationDecision` (只做形状检查, 不猜内容)。
|
|
63
|
+
* 用它把 `decision?: unknown` 安全地喂给真 P3 判定: 不像就传 null (宁可少一层精化, 不许瞎 cast)。
|
|
64
|
+
*/
|
|
65
|
+
function isDecisionLike(x) {
|
|
66
|
+
if (!x || typeof x !== 'object')
|
|
67
|
+
return false;
|
|
68
|
+
const d = x;
|
|
69
|
+
return typeof d.decision === 'string' || typeof d.state === 'string';
|
|
70
|
+
}
|
|
71
|
+
/** 用户可见态的**闭集** (冻结层唯一事实来源; 本文件不另立一份) */
|
|
72
|
+
exports.USER_FACING_STATES = types_js_1.USER_VISIBLE_STATES;
|
|
73
|
+
function isUserVisibleState(x) {
|
|
74
|
+
return typeof x === 'string' && exports.USER_FACING_STATES.includes(x);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* **不该出现在用户视野里**的内部词 (设计 §8 的名单 + 同义写法)。
|
|
78
|
+
*
|
|
79
|
+
* 为什么连 `retry_count` / `leaseOwner` 这种代码标识也扫: 界面拼字符串时最常干的事就是
|
|
80
|
+
* 把内部字段名顺手带出去 (`lease owner=worker-3`), 只扫中文词会漏掉这一类。
|
|
81
|
+
*/
|
|
82
|
+
exports.INTERNAL_VISIBLE_WORDS = [
|
|
83
|
+
'lease',
|
|
84
|
+
'leaseOwner',
|
|
85
|
+
'lease_until',
|
|
86
|
+
'reducer',
|
|
87
|
+
'internal status',
|
|
88
|
+
'retry counter',
|
|
89
|
+
'retryCounter',
|
|
90
|
+
'retry_count',
|
|
91
|
+
'worker owner',
|
|
92
|
+
'workerOwner',
|
|
93
|
+
'attempts',
|
|
94
|
+
'抢租约',
|
|
95
|
+
'租约',
|
|
96
|
+
'内部状态',
|
|
97
|
+
'重试计数',
|
|
98
|
+
];
|
|
99
|
+
/** 扫出文本里出现的内部词 (空数组 = 干净)。大小写不敏感; 只报词, 不改文本。 */
|
|
100
|
+
function scanInternalLeak(text) {
|
|
101
|
+
const s = String(text ?? '');
|
|
102
|
+
if (!s)
|
|
103
|
+
return [];
|
|
104
|
+
const lower = s.toLowerCase();
|
|
105
|
+
const hits = [];
|
|
106
|
+
for (const w of exports.INTERNAL_VISIBLE_WORDS) {
|
|
107
|
+
if (lower.includes(w.toLowerCase()))
|
|
108
|
+
hits.push(w);
|
|
109
|
+
}
|
|
110
|
+
return hits;
|
|
111
|
+
}
|
|
112
|
+
/** 闭集里的一个状态 → 用户看到的**全部**内容 (只有这三样, 没有内部字段) */
|
|
113
|
+
function userFacingState(state) {
|
|
114
|
+
if (!isUserVisibleState(state)) {
|
|
115
|
+
return (0, seams_js_1.refuse)('only_supervisor_decides_continuation', `拒绝: 用户可见态 ${JSON.stringify(state) ?? String(state)} 不在冻结闭集里 `
|
|
116
|
+
+ `(${exports.USER_FACING_STATES.join(' / ')}) —— 用户可见态是 continuation 的投影, 不许第三方编一个状态出来`);
|
|
117
|
+
}
|
|
118
|
+
const labels = types_js_1.USER_VISIBLE_STATE_LABELS[state];
|
|
119
|
+
return { state, zh: labels.zh, en: labels.en };
|
|
120
|
+
}
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// §2. 接缝本体
|
|
123
|
+
// ============================================================================
|
|
124
|
+
function createMonitorSeam(deps) {
|
|
125
|
+
// 可见面来源: 宿主注入的 `visible` 优先; 否则用**真 P3** 的判定 (注入的 continuation 是它的输入)。
|
|
126
|
+
// 两条路都不通 ⇒ 探针会如实拒绝 (不编一个"正在执行")。
|
|
127
|
+
const visiblePort = deps.visible ?? (deps.continuationOf
|
|
128
|
+
? async (input) => {
|
|
129
|
+
const raw = await deps.continuationOf(input.goalId);
|
|
130
|
+
// 盘上的 continuation 允许缺字段 (goal-store 的 `pendingReports?` 是 optional; `setContinuation`
|
|
131
|
+
// 又是部分覆盖) —— 归一化只有**一份**实现 (`work-monitor.normalizeContinuationRecord`),
|
|
132
|
+
// 判定层(`toUserVisibleState`)自己也调它; 这里用同一个函数是为了让"接缝这一路也没传半份记录"可读。
|
|
133
|
+
const continuation = (0, work_monitor_js_1.normalizeContinuationRecord)(raw);
|
|
134
|
+
const decision = isDecisionLike(input.decision) ? input.decision : null;
|
|
135
|
+
return (0, work_monitor_js_1.toUserVisibleState)(continuation, input.blocks ?? [], decision);
|
|
136
|
+
}
|
|
137
|
+
: undefined);
|
|
138
|
+
const visibleOrRefuse = createVisibleStateProbe({ visible: visiblePort });
|
|
139
|
+
return {
|
|
140
|
+
id: exports.MONITOR_SEAM_ID,
|
|
141
|
+
stage: 'M3',
|
|
142
|
+
async sweep(input) {
|
|
143
|
+
if (!input.goalId) {
|
|
144
|
+
return (0, seams_js_1.refuse)('all_terminal_paths_pass_close_run', '拒绝: 阻塞巡检没有 goalId → 拿到的是"谁都不卡"的假结论');
|
|
145
|
+
}
|
|
146
|
+
return deps.collect({ goalId: input.goalId, now: input.now, runnerAvailable: input.runnerAvailable });
|
|
147
|
+
},
|
|
148
|
+
async handle(input) {
|
|
149
|
+
if (!input.blocks?.length)
|
|
150
|
+
return { actions: [], escalated: [], takeovers: [], requests: [] };
|
|
151
|
+
return deps.handle({ goalId: input.goalId, blocks: input.blocks, now: input.now });
|
|
152
|
+
},
|
|
153
|
+
pendingGoals(limit) {
|
|
154
|
+
return deps.goalsWithPendingWork(limit);
|
|
155
|
+
},
|
|
156
|
+
/**
|
|
157
|
+
* 统一监控 (M3): 一次调用 = 所有待回报 Goal 的阻塞结论。
|
|
158
|
+
*
|
|
159
|
+
* 纪律:
|
|
160
|
+
* · **子 Agent 不许巡检别人的阻塞**: `caller='child_agent'` → 拒 (规则 ⑤, 一条都不查);
|
|
161
|
+
* · **有界**: `limit` 夹在 [1, 200] (默认 20) —— tick 里扫盘不许无界;
|
|
162
|
+
* · **不静默**: 单个 Goal 巡检/处置抛错 → 该 Goal 的 `error` 与顶层 `errors[]` 都留痕,
|
|
163
|
+
* 而不是"这一轮它不存在"。全失败时 `silentRisk=true` 并要求交人;
|
|
164
|
+
* · 没有阻塞的 Goal **也占一格** (它有待回报工作 → 用户看到的是"等待外部回复", 不是"没人管")。
|
|
165
|
+
*/
|
|
166
|
+
async sweepAll(input) {
|
|
167
|
+
if (input.caller === 'child_agent') {
|
|
168
|
+
return (0, seams_js_1.refuse)('child_cannot_mutate_goal', '拒绝: 子 Agent 不许巡检/处置其它执行者的阻塞 —— 巡检与处置是父/调度器的责任面');
|
|
169
|
+
}
|
|
170
|
+
const limit = Math.min(Math.max(Math.floor(input.limit ?? exports.MONITOR_SWEEP_DEFAULT_LIMIT) || 1, 1), exports.MONITOR_SWEEP_MAX_LIMIT);
|
|
171
|
+
const view = {
|
|
172
|
+
goals: [], blockCount: 0, escalated: [], takeovers: [], requests: [],
|
|
173
|
+
visibleCounts: {}, errors: [], silentRisk: false,
|
|
174
|
+
};
|
|
175
|
+
let pending = [];
|
|
176
|
+
try {
|
|
177
|
+
const raw = await deps.goalsWithPendingWork(limit);
|
|
178
|
+
pending = Array.isArray(raw) ? raw.filter((g) => !!g?.goalId).slice(0, limit) : [];
|
|
179
|
+
if (!Array.isArray(raw))
|
|
180
|
+
view.errors.push('待回报 Goal 清单不是数组 (宿主 bug) —— 无法巡检, 不许当成"没有阻塞"');
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
view.errors.push(`取待回报 Goal 清单失败: ${errText(e)}`);
|
|
184
|
+
view.silentRisk = true;
|
|
185
|
+
return view; // 拿不到事实就如实报 (不是"巡检过了, 没问题")
|
|
186
|
+
}
|
|
187
|
+
for (const g of pending) {
|
|
188
|
+
const cell = { goalId: g.goalId, blocks: [], handling: null, visibleState: null, error: null };
|
|
189
|
+
try {
|
|
190
|
+
const blocks = await deps.collect({ goalId: g.goalId, now: input.now, runnerAvailable: input.runnerAvailable });
|
|
191
|
+
cell.blocks = Array.isArray(blocks) ? blocks : [];
|
|
192
|
+
if (cell.blocks.length > 0) {
|
|
193
|
+
cell.handling = await deps.handle({ goalId: g.goalId, blocks: cell.blocks, now: input.now });
|
|
194
|
+
view.escalated.push(...(cell.handling?.escalated ?? []));
|
|
195
|
+
view.takeovers.push(...(cell.handling?.takeovers ?? []));
|
|
196
|
+
view.requests.push(...(cell.handling?.requests ?? []));
|
|
197
|
+
}
|
|
198
|
+
const vis = await visibleOrRefuse({ goalId: g.goalId, blocks: cell.blocks, now: input.now });
|
|
199
|
+
if (vis && typeof vis === 'object' && vis.ok === false) {
|
|
200
|
+
// 可见面拒绝 → 这一格如实留痕 (不是静默给个"正在执行")
|
|
201
|
+
cell.error = vis.reason;
|
|
202
|
+
view.errors.push(`goal=${g.goalId} 可见态: ${vis.reason}`);
|
|
203
|
+
}
|
|
204
|
+
else if (vis) {
|
|
205
|
+
cell.visibleState = vis;
|
|
206
|
+
view.visibleCounts[cell.visibleState] = (view.visibleCounts[cell.visibleState] ?? 0) + 1;
|
|
207
|
+
}
|
|
208
|
+
view.blockCount += cell.blocks.length;
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
cell.error = errText(e);
|
|
212
|
+
view.errors.push(`goal=${g.goalId} 巡检失败: ${cell.error}`);
|
|
213
|
+
}
|
|
214
|
+
view.goals.push(cell);
|
|
215
|
+
}
|
|
216
|
+
const inspected = view.goals.filter((c) => c.error === null).length;
|
|
217
|
+
if (pending.length > 0 && inspected === 0) {
|
|
218
|
+
view.silentRisk = true;
|
|
219
|
+
view.escalated.push(...pending.map((g) => `巡检未完成: ${g.goalId}`));
|
|
220
|
+
}
|
|
221
|
+
return view;
|
|
222
|
+
},
|
|
223
|
+
async visibleState(input) {
|
|
224
|
+
return visibleOrRefuse({ goalId: input.goalId, blocks: input.blocks, decision: input.decision, now: input.now });
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* 用户可见态探针: 只回答"用户该看到哪一类", 且**只**能是冻结闭集里的值。
|
|
230
|
+
*
|
|
231
|
+
* 硬化的三件事 (旧版是 `return deps.visible(input)` 的裸透传):
|
|
232
|
+
* ① **闭集校验**: 端口给出闭集外的值 (或 undefined / null / 对象) → 拒绝 + 说清收到了什么 ——
|
|
233
|
+
* 用户视野的假象比"什么都不显示"更贵;
|
|
234
|
+
* ② **端口抛错不吞**: 原文进拒绝理由 (不静默降级成 `executing`);
|
|
235
|
+
* ③ **缺端口 = 拒**: 没有可见面来源就不编一个状态 (旧版会直接 `TypeError`)。
|
|
236
|
+
*
|
|
237
|
+
* 返回值用冻结类型 + `userFacingState` 的文案; 调用方拿到的就是用户看到的东西。
|
|
238
|
+
*/
|
|
239
|
+
function createVisibleStateProbe(deps) {
|
|
240
|
+
return async (input) => {
|
|
241
|
+
if (typeof deps.visible !== 'function') {
|
|
242
|
+
return (0, seams_js_1.refuse)('only_supervisor_decides_continuation', '拒绝: 没有注入用户可见面 (拿不到权威 continuation 的投影) —— 不许编一个状态给用户');
|
|
243
|
+
}
|
|
244
|
+
let raw;
|
|
245
|
+
try {
|
|
246
|
+
raw = await deps.visible(input);
|
|
247
|
+
}
|
|
248
|
+
catch (e) {
|
|
249
|
+
return (0, seams_js_1.refuse)('only_supervisor_decides_continuation', `拒绝: 用户可见面抛错 (${errText(e)}) —— 不静默降级成"正在执行"`);
|
|
250
|
+
}
|
|
251
|
+
const view = userFacingState(raw);
|
|
252
|
+
if (view.ok === false)
|
|
253
|
+
return view;
|
|
254
|
+
return view.state;
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* 给界面用的**唯一**文案出口: 状态 → `{state, zh, en}` (闭集外的值直接拒绝)。
|
|
259
|
+
* 界面不许自己拼状态名, 也不许把内部字段带出去 (见 `scanInternalLeak`)。
|
|
260
|
+
*/
|
|
261
|
+
function describeVisibleState(state) {
|
|
262
|
+
return userFacingState(state);
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../../../../src/agents/goal-flywheel/wiring/monitor.ts"],"names":[],"mappings":"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"}
|