@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-sdk-types.js","sourceRoot":"","sources":["../../../src/agents/pi-sdk-types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"pi-sdk-types.js","sourceRoot":"","sources":["../../../src/agents/pi-sdk-types.ts"],"names":[],"mappings":";;;AAwIa,QAAA,gBAAgB,GAAG;;;;;;;;;;;;CAY/B,CAAC"}
|
|
@@ -67,6 +67,9 @@ const workflow_pivot_loop_js_1 = require("./workflow-pivot-loop.js");
|
|
|
67
67
|
const p2p_document_tools_js_1 = require("./p2p-document-tools.js");
|
|
68
68
|
const run_store_js_1 = require("./run-store.js");
|
|
69
69
|
const goal_store_js_1 = require("./goal-store.js");
|
|
70
|
+
const model_selection_js_1 = require("../llm/model-selection.js");
|
|
71
|
+
// 2026-09-26: 工具名出网净化 (pi-ai.ts 唯一边界) + 回程派发还原 (原名 ↔ API 名)
|
|
72
|
+
const tool_name_js_1 = require("../llm/tool-name.js");
|
|
70
73
|
const pi_harness_js_1 = require("./pi-harness.js");
|
|
71
74
|
const heartbeat_js_1 = require("../social/heartbeat.js");
|
|
72
75
|
const constraint_runtime_2 = require("@bolloon/constraint-runtime");
|
|
@@ -688,6 +691,18 @@ class PiAgentSession {
|
|
|
688
691
|
return false;
|
|
689
692
|
}
|
|
690
693
|
}
|
|
694
|
+
/**
|
|
695
|
+
* 2026-09-26: 这个 Run 开始那一刻**真实生效**的模型配置快照, 由 startRun 落进 Run 记录。
|
|
696
|
+
* 拿不到 (配置读不出来) 就返回 undefined —— 宁可这个字段缺, 也不编一个假的进去。
|
|
697
|
+
*/
|
|
698
|
+
async runModelSnapshot() {
|
|
699
|
+
try {
|
|
700
|
+
return await (0, model_selection_js_1.captureRunModelConfig)();
|
|
701
|
+
}
|
|
702
|
+
catch {
|
|
703
|
+
return undefined;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
691
706
|
/** 2026-08-07: prompt 出口统一上报 token 用量到 ContextManager (fallback/pivot/react 全路径覆盖) —
|
|
692
707
|
* 之前只有 runReActLoop 迭代内上报, chitchat/fallback/pivot 路径状态栏恒 0 */
|
|
693
708
|
reportUsageToContextManager() {
|
|
@@ -792,6 +807,7 @@ class PiAgentSession {
|
|
|
792
807
|
goalId: boundGoalId,
|
|
793
808
|
channelId: this.currentChannelId || undefined,
|
|
794
809
|
agentId: this.currentAgentId || undefined,
|
|
810
|
+
modelConfig: await this.runModelSnapshot(),
|
|
795
811
|
});
|
|
796
812
|
this.lastRunId = rec.runId;
|
|
797
813
|
await (0, goal_store_js_1.attachRun)(boundGoalId, rec.runId).catch(() => null);
|
|
@@ -800,6 +816,30 @@ class PiAgentSession {
|
|
|
800
816
|
status: 'needs_human',
|
|
801
817
|
error: 'LLM 不可用: provider 未初始化或无 apiKey (fallback 不是执行结果, 需要配置或人工处理)',
|
|
802
818
|
});
|
|
819
|
+
// ★ M0: "工具/权限不可用"也是一条终止路径 → 同样进收尾漏斗 (规则 ④)。
|
|
820
|
+
const wiring = await Promise.resolve().then(() => __importStar(require('./goal-flywheel-wiring.js')));
|
|
821
|
+
const closed = await wiring.closeRunOnce({
|
|
822
|
+
goalId: boundGoalId,
|
|
823
|
+
runId: rec.runId,
|
|
824
|
+
caller: 'runner',
|
|
825
|
+
now: new Date().toISOString(),
|
|
826
|
+
finalReview: `LLM 不可用 → fallback 收尾 (不是执行结果): ${response}`,
|
|
827
|
+
});
|
|
828
|
+
if (!wiring.isRefusal(closed) && closed.outcome) {
|
|
829
|
+
const { reduceGoalState } = await Promise.resolve().then(() => __importStar(require('./goal-state-reducer.js')));
|
|
830
|
+
await reduceGoalState({
|
|
831
|
+
goalId: boundGoalId,
|
|
832
|
+
intent: 'closure_outcome',
|
|
833
|
+
now: new Date().toISOString(),
|
|
834
|
+
by: 'runner',
|
|
835
|
+
outcome: {
|
|
836
|
+
goalStatus: wiring.goalStatusFromDecision(closed.outcome.decision),
|
|
837
|
+
continuation: wiring.toGoalStoreContinuation(closed.outcome.continuation),
|
|
838
|
+
reason: closed.outcome.decision.reason,
|
|
839
|
+
},
|
|
840
|
+
runId: rec.runId,
|
|
841
|
+
});
|
|
842
|
+
}
|
|
803
843
|
console.log(`[PiAgent] LLM 不可用 → 本次仍落 Run ${rec.runId} (needs_human), 不伪装成正常执行`);
|
|
804
844
|
}
|
|
805
845
|
catch (err) {
|
|
@@ -1100,7 +1140,7 @@ class PiAgentSession {
|
|
|
1100
1140
|
const backoffMs = 1000 * Math.pow(2, attempt - 1); // 1s, 2s, 4s
|
|
1101
1141
|
console.log(`[PiAgent] loop 自动重试 ${attempt}/${MAX_LOOP_RETRIES}, 等待 ${backoffMs}ms`);
|
|
1102
1142
|
if (onStream) {
|
|
1103
|
-
onStream({ type: 'status', content: `↻ 自动重试 loop ${attempt}/${MAX_LOOP_RETRIES} (${(backoffMs / 1000).toFixed(0)}s 后)`, tool: 'system' });
|
|
1143
|
+
onStream({ type: 'status', internal: true, content: `↻ 自动重试 loop ${attempt}/${MAX_LOOP_RETRIES} (${(backoffMs / 1000).toFixed(0)}s 后)`, tool: 'system' });
|
|
1104
1144
|
}
|
|
1105
1145
|
// 中途 abort 也要响应
|
|
1106
1146
|
await new Promise((resolve, reject) => {
|
|
@@ -1400,17 +1440,51 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1400
1440
|
* 2026-09-16 (M2): 从 checkpoint 恢复一次运行 —— **不是**重发原 prompt。
|
|
1401
1441
|
* 语义: prepareResume (校验状态 + 读 checkpoint + 记 recovery + 落 recovering) → 用恢复指令
|
|
1402
1442
|
* 驱动同一个 runId 继续 (历史保留), 非幂等动作由重放守卫挡住。
|
|
1443
|
+
*
|
|
1444
|
+
* 2026-09-26: 恢复前**反查一次模型配置**。Run 记录里存的 `modelConfig` 快照此前只被写进
|
|
1445
|
+
* 快照和回显, 没人拿它核对现状 —— 于是"快照记的是 A, 现在盘上生效的是 B"这种情况会被
|
|
1446
|
+
* 静默继续下去 (长任务的历史执行链就说不清了)。现在: 漂了就 `console.warn` 说清哪几个字段漂了,
|
|
1447
|
+
* 并把结论放进返回值 (`modelDrift`) 让调用方能上报; 一致时也有一句明确结论。
|
|
1448
|
+
* 判断失败 (读不到 Run 等) 不阻塞恢复。
|
|
1403
1449
|
*/
|
|
1404
1450
|
async resumeRun(runId) {
|
|
1451
|
+
let modelDrift;
|
|
1452
|
+
let modelApplied;
|
|
1453
|
+
try {
|
|
1454
|
+
const { detectRunConfigDrift } = await Promise.resolve().then(() => __importStar(require('../llm/model-selection.js')));
|
|
1455
|
+
modelDrift = (await detectRunConfigDrift(runId)) || undefined;
|
|
1456
|
+
if (modelDrift?.drifted) {
|
|
1457
|
+
console.warn('[pi-sdk] 恢复时模型配置已偏离 Run 快照:', modelDrift.message);
|
|
1458
|
+
}
|
|
1459
|
+
else if (modelDrift) {
|
|
1460
|
+
console.log('[pi-sdk] 恢复前核对:', modelDrift.message);
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1463
|
+
catch { /* 核对本身失败不阻塞恢复 */ }
|
|
1405
1464
|
const prep = await (0, run_store_js_1.prepareResume)(runId);
|
|
1406
1465
|
if (!prep.ok || !prep.plan)
|
|
1407
|
-
return { ok: false, reason: prep.reason };
|
|
1466
|
+
return { ok: false, reason: prep.reason, ...(modelDrift ? { modelDrift } : {}) };
|
|
1467
|
+
// 2026-09-26 (P6 × P7): 恢复一个在跑的 Run, 用的是**它自己那份快照**, 不是盘上现在的全局默认 ——
|
|
1468
|
+
// 否则这次恢复就是"带着漂移继续跑", 之后再存快照会把漂移固化成历史。
|
|
1469
|
+
// 只在"漂了"或"核对不了"时重装 (一致时运行时本来就是对的, 重装是白跑一趟)。
|
|
1470
|
+
// 装配只有一处实现: `applyRunModelConfigToRuntime` → `installRuntime` (这里不自己 initMinimax)。
|
|
1471
|
+
if (modelDrift && (modelDrift.drifted || !modelDrift.verified)) {
|
|
1472
|
+
try {
|
|
1473
|
+
const { applyRunModelConfigToRuntime } = await Promise.resolve().then(() => __importStar(require('../llm/model-selection.js')));
|
|
1474
|
+
modelApplied = await applyRunModelConfigToRuntime(modelDrift.snapshot);
|
|
1475
|
+
console.log(`[pi-sdk] 已按 Run 快照装配运行时: ${modelApplied.provider}/${modelApplied.model} (configHash ${String(modelApplied.configHash).slice(0, 12)})`);
|
|
1476
|
+
}
|
|
1477
|
+
catch (e) {
|
|
1478
|
+
// 装配失败不阻塞恢复 (如实说; 调用方可以从返回值里看出没装成)
|
|
1479
|
+
console.warn('[pi-sdk] 按 Run 快照装配运行时失败, 保持当前运行时:', String(e?.message || e).slice(0, 160));
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1408
1482
|
this.resumeRunId = runId;
|
|
1409
1483
|
this.resumePlan = prep.plan;
|
|
1410
1484
|
this.currentGoalId = prep.plan.goalId || this.currentGoalId;
|
|
1411
1485
|
try {
|
|
1412
1486
|
const reply = await this.prompt((0, run_store_js_1.buildResumeInstruction)(prep.plan), {});
|
|
1413
|
-
return { ok: true, reply };
|
|
1487
|
+
return { ok: true, reply, ...(modelDrift ? { modelDrift } : {}), ...(modelApplied ? { modelApplied } : {}) };
|
|
1414
1488
|
}
|
|
1415
1489
|
finally {
|
|
1416
1490
|
this.resumeRunId = '';
|
|
@@ -1480,7 +1554,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1480
1554
|
const loopActionLog = [];
|
|
1481
1555
|
// 发送循环开始的事件
|
|
1482
1556
|
if (onStream) {
|
|
1483
|
-
onStream({ type: 'status', content: '🔄 开始 ReAct 循环...', tool: 'system' });
|
|
1557
|
+
onStream({ type: 'status', internal: true, content: '🔄 开始 ReAct 循环...', tool: 'system' });
|
|
1484
1558
|
}
|
|
1485
1559
|
// React Harness: 循环开始 (重置 turn 计数 + 触发 harness sessionStart)
|
|
1486
1560
|
// 失败静默 (fail-open), 不阻塞主循环
|
|
@@ -1512,7 +1586,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1512
1586
|
}
|
|
1513
1587
|
const doneN = this.resumePlan?.completedSteps.length ?? 0;
|
|
1514
1588
|
const guards = this.resumePlan?.replayGuards.length ?? 0;
|
|
1515
|
-
onStream?.({ type: 'status', content: `♻️ 从 checkpoint 恢复运行 ${this.currentRunId} (已完成 ${doneN} 步, 非幂等重放守卫 ${guards} 条)`, tool: 'harness' });
|
|
1589
|
+
onStream?.({ type: 'status', internal: true, content: `♻️ 从 checkpoint 恢复运行 ${this.currentRunId} (已完成 ${doneN} 步, 非幂等重放守卫 ${guards} 条)`, tool: 'harness' });
|
|
1516
1590
|
}
|
|
1517
1591
|
else {
|
|
1518
1592
|
// 2026-09-16 (M2): 目标绑定 —— 有 goalId 就在该 Goal 下执行; 没有就建 Goal 再建 Run。
|
|
@@ -1555,6 +1629,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1555
1629
|
goalId: boundGoalId || undefined,
|
|
1556
1630
|
channelId: this.currentChannelId || undefined,
|
|
1557
1631
|
agentId: this.currentAgentId || undefined,
|
|
1632
|
+
modelConfig: await this.runModelSnapshot(),
|
|
1558
1633
|
});
|
|
1559
1634
|
this.currentRunId = rec.runId;
|
|
1560
1635
|
this.lastRunId = rec.runId;
|
|
@@ -1563,7 +1638,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1563
1638
|
// Run → Goal 反查链: runId → goalId → objective / success criteria
|
|
1564
1639
|
await (0, goal_store_js_1.attachRun)(this.currentGoalId, rec.runId).catch((err) => console.warn('[PiAgent] attachRun 失败:', err?.message));
|
|
1565
1640
|
}
|
|
1566
|
-
onStream?.({ type: 'status', content: `🧷 运行已登记 (run=${rec.runId}${this.currentGoalId ? `, goal=${this.currentGoalId}` : ''}, 预算 ${rec.budget.maxSteps} 步 / ${Math.round(rec.budget.deadlineMs / 60000)} 分钟)`, tool: 'harness' });
|
|
1641
|
+
onStream?.({ type: 'status', internal: true, content: `🧷 运行已登记 (run=${rec.runId}${this.currentGoalId ? `, goal=${this.currentGoalId}` : ''}, 预算 ${rec.budget.maxSteps} 步 / ${Math.round(rec.budget.deadlineMs / 60000)} 分钟)`, tool: 'harness' });
|
|
1567
1642
|
}
|
|
1568
1643
|
catch (err) {
|
|
1569
1644
|
// 核心写失败: 不再 warn 后继续 —— 没有运行记录就不执行 (strict 模式默认如此)
|
|
@@ -1681,7 +1756,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1681
1756
|
if ((0, react_loop_js_1.shouldCompactBeforeIteration)(estimatedTokensBefore, compactThreshold)) {
|
|
1682
1757
|
const tokensBeforeCompact = estimatedTokensBefore;
|
|
1683
1758
|
console.log(`[PiAgent] loop 入口 token ${tokensBeforeCompact} > ${compactThreshold}, 触发自动压缩`);
|
|
1684
|
-
onStream?.({ type: 'status', content: `🗜️ loop 自动压缩 (token ${tokensBeforeCompact} > ${compactThreshold})`, tool: 'compactor' });
|
|
1759
|
+
onStream?.({ type: 'status', internal: true, content: `🗜️ loop 自动压缩 (token ${tokensBeforeCompact} > ${compactThreshold})`, tool: 'compactor' });
|
|
1685
1760
|
try {
|
|
1686
1761
|
await this.maybeAutoCompact(onStream, signal);
|
|
1687
1762
|
}
|
|
@@ -1703,7 +1778,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1703
1778
|
// 调试日志:显示每次循环开始
|
|
1704
1779
|
console.log(`[PiAgent] 循环 ${iteration}/${this.MAX_REACT_ITERATIONS} 开始`);
|
|
1705
1780
|
if (onStream) {
|
|
1706
|
-
onStream({ type: 'status', content: `🔄 循环 ${iteration}/${this.MAX_REACT_ITERATIONS}`, tool: 'loop' });
|
|
1781
|
+
onStream({ type: 'status', internal: true, content: `🔄 循环 ${iteration}/${this.MAX_REACT_ITERATIONS}`, tool: 'loop' });
|
|
1707
1782
|
}
|
|
1708
1783
|
const context = this.buildContext();
|
|
1709
1784
|
// M3.5 (2026-06-17): 也构造 messages 数组版本, 让 LLM 看到结构化 tool 角色
|
|
@@ -1892,7 +1967,10 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1892
1967
|
}
|
|
1893
1968
|
// 路径 B: 文本解析 (parseAllToolCalls 收集全部)
|
|
1894
1969
|
if (toolCalls.length === 0) {
|
|
1895
|
-
|
|
1970
|
+
// 2026-09-26: 已知名集合 = 注册表原名 + 它们的 API 名 (净化后的).
|
|
1971
|
+
// 出网时工具面给的是 API 名 (见 pi-ai.ts 的唯一净化边界), LLM 在文本里
|
|
1972
|
+
// 回吐的也可能是 API 名 —— 只用原名集合过滤会把这类调用整个丢掉.
|
|
1973
|
+
const knownTools = (0, tool_name_js_1.expandKnownToolNames)(this.tools.keys());
|
|
1896
1974
|
toolCalls = (0, parse_tool_call_js_1.parseAllToolCalls)(reply, { tools: knownTools });
|
|
1897
1975
|
}
|
|
1898
1976
|
// 回退路径 C: 原生 parseToolCall (单个)
|
|
@@ -1901,6 +1979,12 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1901
1979
|
if (single)
|
|
1902
1980
|
toolCalls.push(single);
|
|
1903
1981
|
}
|
|
1982
|
+
// 2026-09-26: **回程派发的唯一还原点** —— LLM 回吐的是 API 名 (净化过的), 这里
|
|
1983
|
+
// 还原成注册表真名再交给 this.tools.get(); 原名 (LLM 照 system prompt 抄的) 原样穿透.
|
|
1984
|
+
for (const tc of toolCalls) {
|
|
1985
|
+
if (typeof tc.name === 'string' && tc.name)
|
|
1986
|
+
tc.name = (0, tool_name_js_1.resolveApiToolName)(tc.name);
|
|
1987
|
+
}
|
|
1904
1988
|
// 给每个 toolCall 分配稳定 id
|
|
1905
1989
|
for (const tc of toolCalls) {
|
|
1906
1990
|
if (!tc.id) {
|
|
@@ -1925,7 +2009,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
1925
2009
|
if (onStream) {
|
|
1926
2010
|
onStream({ type: 'tool', content: `🔧 调用工具 (${ti + 1}/${toolCalls.length}): ${toolCall.name}`, tool: toolCall.name });
|
|
1927
2011
|
if (toolCall.args && Object.keys(toolCall.args).length > 0) {
|
|
1928
|
-
onStream({ type: 'status', content: `📋 参数: ${JSON.stringify(toolCall.args)}`, tool: toolCall.name });
|
|
2012
|
+
onStream({ type: 'status', internal: true, content: `📋 参数: ${JSON.stringify(toolCall.args)}`, tool: toolCall.name });
|
|
1929
2013
|
}
|
|
1930
2014
|
onStream({
|
|
1931
2015
|
type: 'step_start',
|
|
@@ -2055,7 +2139,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2055
2139
|
const toolDurationMs = Date.now() - toolStart;
|
|
2056
2140
|
if (replaySkip) {
|
|
2057
2141
|
console.log(`[PiAgent] 恢复重放守卫: 跳过已完成的非幂等工具 ${toolCall.name}`);
|
|
2058
|
-
onStream?.({ type: 'status', content: `🛡️ 恢复保护: ${toolCall.name} 此前已成功执行, 本次不重复执行`, tool: toolCall.name });
|
|
2142
|
+
onStream?.({ type: 'status', internal: true, content: `🛡️ 恢复保护: ${toolCall.name} 此前已成功执行, 本次不重复执行`, tool: toolCall.name });
|
|
2059
2143
|
}
|
|
2060
2144
|
console.log(`[PiAgent] 工具 ${toolCall.name} 执行完成: success=${result.success} (${toolDurationMs}ms)`);
|
|
2061
2145
|
// 2026-09-16 (M3): 失败接线 —— 分类 + recovery 留痕 + 熔断 / 外部等待
|
|
@@ -2128,7 +2212,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2128
2212
|
}
|
|
2129
2213
|
if (onStream) {
|
|
2130
2214
|
if (result.success) {
|
|
2131
|
-
onStream({ type: 'status', content: `✅ ${toolCall.name} 执行成功`, tool: toolCall.name });
|
|
2215
|
+
onStream({ type: 'status', internal: true, content: `✅ ${toolCall.name} 执行成功`, tool: toolCall.name });
|
|
2132
2216
|
if (result.output) {
|
|
2133
2217
|
onStream({ type: 'tool', content: `📤 结果: ${result.output.substring(0, 200)}${result.output.length > 200 ? '...' : ''}`, tool: toolCall.name });
|
|
2134
2218
|
}
|
|
@@ -2158,7 +2242,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2158
2242
|
refineAttempts++;
|
|
2159
2243
|
}
|
|
2160
2244
|
if (onStream) {
|
|
2161
|
-
onStream({ type: 'status', content: `🔄 工具执行完成,继续循环...`, tool: 'loop' });
|
|
2245
|
+
onStream({ type: 'status', internal: true, content: `🔄 工具执行完成,继续循环...`, tool: 'loop' });
|
|
2162
2246
|
}
|
|
2163
2247
|
}
|
|
2164
2248
|
else {
|
|
@@ -2244,7 +2328,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2244
2328
|
content: `[dive-into stop condition] 你之前已成功执行了 ${unreported} 个工具, 但当前回复里没把它们的结果告诉用户. 请基于已有的工具结果 (在 history 里) 写一个完整总结回复给用户, 用 <final gen> 结尾. 不要再调工具.`
|
|
2245
2329
|
});
|
|
2246
2330
|
if (onStream) {
|
|
2247
|
-
onStream({ type: 'status', content: `🔄 还有 ${unreported} 个工具结果未汇报, 让 LLM 继续总结 (${unreportedRetries}/${MAX_UNREPORTED_RETRIES})`, tool: 'system' });
|
|
2331
|
+
onStream({ type: 'status', internal: true, content: `🔄 还有 ${unreported} 个工具结果未汇报, 让 LLM 继续总结 (${unreportedRetries}/${MAX_UNREPORTED_RETRIES})`, tool: 'system' });
|
|
2248
2332
|
}
|
|
2249
2333
|
continue;
|
|
2250
2334
|
}
|
|
@@ -2257,7 +2341,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2257
2341
|
content: `[dive-into stop condition] 已多次提示汇报工具结果仍未完成 (超过 ${MAX_UNREPORTED_RETRIES} 次). 现在直接基于你已知的信息写最终回复给用户, 用 <final gen> 结尾, 不要再调任何工具.`
|
|
2258
2342
|
});
|
|
2259
2343
|
if (onStream) {
|
|
2260
|
-
onStream({ type: 'status', content: `🔄 工具结果汇报超限, 强制收尾`, tool: 'system' });
|
|
2344
|
+
onStream({ type: 'status', internal: true, content: `🔄 工具结果汇报超限, 强制收尾`, tool: 'system' });
|
|
2261
2345
|
}
|
|
2262
2346
|
}
|
|
2263
2347
|
lastQualityScore = this.estimateResponseQuality(reply);
|
|
@@ -2287,7 +2371,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2287
2371
|
console.log(`[PiAgent] review ${loopReviewCount}/${loop_review_js_1.DEFAULT_MAX_REVIEWS}: LLM 想 final 但先对齐需求深挖一次`);
|
|
2288
2372
|
this.messageHistory.push({ role: 'system', content: reviewDecision.hint });
|
|
2289
2373
|
if (onStream) {
|
|
2290
|
-
onStream({ type: 'status', content: `🔄 目标对齐 review ${loopReviewCount}/${loop_review_js_1.DEFAULT_MAX_REVIEWS}: 深挖续跑`, tool: 'system' });
|
|
2374
|
+
onStream({ type: 'status', internal: true, content: `🔄 目标对齐 review ${loopReviewCount}/${loop_review_js_1.DEFAULT_MAX_REVIEWS}: 深挖续跑`, tool: 'system' });
|
|
2291
2375
|
}
|
|
2292
2376
|
continue; // 让 LLM 看到 hint, 深挖或确认完成后再次 final
|
|
2293
2377
|
}
|
|
@@ -2311,14 +2395,14 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2311
2395
|
if (needsMoreWork && iteration < this.MAX_REACT_ITERATIONS) {
|
|
2312
2396
|
console.log(`[PiAgent] 继续循环处理 (${iteration}/${this.MAX_REACT_ITERATIONS}): needsMoreWork=${needsMoreWork}, hasError=${hasError}, containsToolCallIntent=${containsToolCallIntent}`);
|
|
2313
2397
|
if (onStream) {
|
|
2314
|
-
onStream({ type: 'status', content: `🔄 继续处理,循环 ${iteration}...`, tool: 'loop' });
|
|
2398
|
+
onStream({ type: 'status', internal: true, content: `🔄 继续处理,循环 ${iteration}...`, tool: 'loop' });
|
|
2315
2399
|
}
|
|
2316
2400
|
continue;
|
|
2317
2401
|
}
|
|
2318
2402
|
// 否则把这个当作可能的最终回答
|
|
2319
2403
|
finalResponse = reply;
|
|
2320
2404
|
if (onStream) {
|
|
2321
|
-
onStream({ type: 'status', content: `📝 提取最终回答,长度 ${reply.length}`, tool: 'system' });
|
|
2405
|
+
onStream({ type: 'status', internal: true, content: `📝 提取最终回答,长度 ${reply.length}`, tool: 'system' });
|
|
2322
2406
|
}
|
|
2323
2407
|
break;
|
|
2324
2408
|
}
|
|
@@ -2336,7 +2420,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2336
2420
|
}
|
|
2337
2421
|
// 通知前端循环完成
|
|
2338
2422
|
if (onStream) {
|
|
2339
|
-
onStream({ type: 'status', content: `✅ 处理完成,共 ${iteration - 1} 次循环`, tool: 'system' });
|
|
2423
|
+
onStream({ type: 'status', internal: true, content: `✅ 处理完成,共 ${iteration - 1} 次循环`, tool: 'system' });
|
|
2340
2424
|
}
|
|
2341
2425
|
this.messageHistory.push({ role: 'assistant', content: finalResponse });
|
|
2342
2426
|
// React Harness: 循环结束
|
|
@@ -2384,30 +2468,61 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2384
2468
|
await (0, run_store_js_1.recordDegradation)({ kind: 'core', op: 'pi-sdk.finishRun', runId: this.currentRunId, message }).catch(() => { });
|
|
2385
2469
|
onStream?.({ type: 'error', content: `⚠️ ${message}`, tool: 'harness' });
|
|
2386
2470
|
}
|
|
2387
|
-
// 2026-09-
|
|
2471
|
+
// ★ 2026-09-25 (M0 接线冻结, 规则 ③ + ④): Run 结束**必过收尾漏斗**。
|
|
2472
|
+
//
|
|
2473
|
+
// 旧写法在这里另起了一套 Goal 侧收尾 (读证据 → `evaluateGoalCompletion` →
|
|
2474
|
+
// `completeGoalIfEligible` / `setUnresolved`): 它**不收尾** —— 不写 Memory、不生成 Skill 候选、
|
|
2475
|
+
// 不写权威 continuation、不留决策记录。于是同一条 Run 在 Supervisor 那里还会再收一次 (或反过来
|
|
2476
|
+
// 这条路径根本不收), 全仓就有了两套"这一轮跑完意味着什么"。那一套已删除。
|
|
2477
|
+
//
|
|
2478
|
+
// 现在: `closeRunOnce` (幂等) → 9 步收尾 → 产物落盘; 再由 Goal reducer 把"下一步是什么"
|
|
2479
|
+
// 落进 Goal (没有 Supervisor 宿主时 Runner 也要留下 continuation, 否则下一次还是从零开始)。
|
|
2388
2480
|
if (this.currentGoalId) {
|
|
2389
2481
|
try {
|
|
2390
|
-
const
|
|
2391
|
-
const
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2482
|
+
const wiring = await Promise.resolve().then(() => __importStar(require('./goal-flywheel-wiring.js')));
|
|
2483
|
+
const { reduceGoalState } = await Promise.resolve().then(() => __importStar(require('./goal-state-reducer.js')));
|
|
2484
|
+
const nowIso = new Date().toISOString();
|
|
2485
|
+
const closed = await wiring.closeRunOnce({
|
|
2486
|
+
goalId: this.currentGoalId,
|
|
2487
|
+
runId: this.currentRunId,
|
|
2488
|
+
caller: 'runner',
|
|
2489
|
+
now: nowIso,
|
|
2490
|
+
finalReview: finalResponse ? String(finalResponse).slice(0, 2000) : '',
|
|
2491
|
+
});
|
|
2492
|
+
if (wiring.isRefusal(closed)) {
|
|
2493
|
+
onStream?.({ type: 'status', content: `⚠️ 收尾被拒 (不当作收过): ${closed.reason}`, tool: 'harness' });
|
|
2494
|
+
}
|
|
2495
|
+
else if (closed.outcome) {
|
|
2496
|
+
const view = closed.outcome;
|
|
2497
|
+
const applied = await reduceGoalState({
|
|
2498
|
+
goalId: this.currentGoalId,
|
|
2499
|
+
intent: 'closure_outcome',
|
|
2500
|
+
now: nowIso,
|
|
2501
|
+
by: 'runner',
|
|
2502
|
+
outcome: {
|
|
2503
|
+
goalStatus: wiring.goalStatusFromDecision(view.decision),
|
|
2504
|
+
continuation: wiring.toGoalStoreContinuation(view.continuation),
|
|
2505
|
+
reason: view.decision.reason,
|
|
2506
|
+
},
|
|
2507
|
+
runId: view.runId,
|
|
2508
|
+
});
|
|
2509
|
+
const line = view.decision.decision === 'complete'
|
|
2510
|
+
? `🎯 目标已达成 (仍要过完成门): ${view.decision.reason}`
|
|
2511
|
+
: `🎯 目标仍在进行 (未判完成): ${view.decision.reason}`;
|
|
2512
|
+
onStream?.({
|
|
2513
|
+
type: 'status', internal: true,
|
|
2514
|
+
content: `${line}${applied.gateRejected ? ` [完成门拒绝: ${applied.gateRejected}]` : ''} `
|
|
2515
|
+
+ `(收尾 ${view.steps} 步 · memory ${view.memories} · skill 候选 ${view.candidates} · goal=${this.currentGoalId})`,
|
|
2516
|
+
tool: 'harness',
|
|
2517
|
+
});
|
|
2518
|
+
}
|
|
2519
|
+
else {
|
|
2520
|
+
// 幂等: 别处 (或上一次) 已经收过尾 —— 事实读不回来就如实说, 不重收也不假装
|
|
2521
|
+
onStream?.({ type: 'status', content: `🎯 ${closed.reason}`, tool: 'harness' });
|
|
2407
2522
|
}
|
|
2408
2523
|
}
|
|
2409
2524
|
catch (err) {
|
|
2410
|
-
await (0, run_store_js_1.recordDegradation)({ kind: 'observational', op: 'pi-sdk.
|
|
2525
|
+
await (0, run_store_js_1.recordDegradation)({ kind: 'observational', op: 'pi-sdk.runClosure', runId: this.currentRunId, message: String(err?.message || err).slice(0, 160) }).catch(() => { });
|
|
2411
2526
|
}
|
|
2412
2527
|
}
|
|
2413
2528
|
this.currentRunId = '';
|
|
@@ -2585,7 +2700,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2585
2700
|
const estimated = this.estimateHistoryTokens();
|
|
2586
2701
|
if (estimated > this.maxContextTokens() * 0.8) {
|
|
2587
2702
|
console.warn(`[PiAgent] reactive compaction pre-check (${estimated} tokens > 80% threshold)`);
|
|
2588
|
-
onStream?.({ type: 'status', content: '⚠️ reactive compaction 预检触发', tool: 'recovery' });
|
|
2703
|
+
onStream?.({ type: 'status', internal: true, content: '⚠️ reactive compaction 预检触发', tool: 'recovery' });
|
|
2589
2704
|
try {
|
|
2590
2705
|
const compacted = this.compressHistorySync(this.messageHistory);
|
|
2591
2706
|
this.messageHistory = compacted;
|
|
@@ -2739,7 +2854,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2739
2854
|
async maybeAutoCompact(onStream, signal) {
|
|
2740
2855
|
if (this.messageHistory.length < 10)
|
|
2741
2856
|
return; // 历史太短, 不值得压
|
|
2742
|
-
onStream?.({ type: 'status', content: '🗜️ 评估是否需要压缩上下文...', tool: 'compactor' });
|
|
2857
|
+
onStream?.({ type: 'status', internal: true, content: '🗜️ 评估是否需要压缩上下文...', tool: 'compactor' });
|
|
2743
2858
|
// 注入 LLM (用 getMinimax().chat, 与 judgment 注入门 / ReAct 循环同一来源)
|
|
2744
2859
|
// 给 Context Collapse (虚拟投影) 和 Auto-Compact (摘要) 共用
|
|
2745
2860
|
const llm = (0, index_js_1.getMinimax)();
|
|
@@ -2767,7 +2882,7 @@ ${PiAgentSession.TOOL_SELECTION_GUIDE}
|
|
|
2767
2882
|
const savedTokens = Math.max(0, beforeTokens - afterTokens);
|
|
2768
2883
|
cm.markCompressStart(beforeTokens);
|
|
2769
2884
|
onStream?.({
|
|
2770
|
-
type: 'status',
|
|
2885
|
+
type: 'status', internal: true,
|
|
2771
2886
|
content: `🗜️ 上下文压缩: ${stagesApplied || 'no-op'} | 节省 ${saved} 条 / ${savedTokens.toLocaleString()} tokens (剩余 ${result.history.length}, collapse=${isContextCollapseEnabled() ? 'on' : 'off'})`,
|
|
2772
2887
|
tool: 'compactor',
|
|
2773
2888
|
});
|