@bolloon/bolloon-agent 0.6.5 → 0.6.7
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/chain/chain-settlement.js +0 -1
- package/dist/agents/chat-segmenter.js +4 -16
- package/dist/agents/contacts/human-directory.js +155 -0
- package/dist/agents/contacts/tools.js +79 -0
- package/dist/agents/experience-review.js +0 -3
- package/dist/agents/goal-flywheel/goal-change.js +3 -4
- package/dist/agents/goal-resume.js +0 -4
- package/dist/agents/ha-daemon.js +85 -0
- package/dist/agents/ha-supervisor.js +146 -0
- package/dist/agents/intent-classifier.js +1 -1
- package/dist/agents/iteration-budget.js +12 -0
- package/dist/agents/knowledge-organizer.js +0 -2
- package/dist/agents/lesson-to-skill.js +0 -1
- package/dist/agents/loop-review.js +2 -2
- package/dist/agents/memory-store.js +384 -0
- package/dist/agents/opportunity-match.js +15 -3
- package/dist/agents/opportunity-web-search.js +39 -0
- package/dist/agents/p2p-chat-tools.js +1 -2
- package/dist/agents/parse-tool-call.js +9 -22
- package/dist/agents/pi-harness.js +1 -2
- package/dist/agents/pi-sdk-session-manager.js +8 -0
- package/dist/agents/pi-sdk-tools.js +180 -5
- package/dist/agents/pi-sdk.js +210 -503
- package/dist/agents/process-runner.js +28 -9
- package/dist/agents/react-loop.js +9 -17
- package/dist/agents/runner-resolver.js +4 -3
- package/dist/agents/skill-loader.js +22 -15
- package/dist/agents/skills-manager.js +1 -25
- package/dist/agents/workflow-pivot-loop.js +152 -61
- package/dist/bootstrap/context-collector.js +67 -7
- package/dist/bootstrap/context-hierarchy.js +13 -1
- package/dist/bootstrap/persona-loader.js +26 -0
- package/dist/cli/ink-app.js +44 -17
- package/dist/cli/intent-command.js +22 -12
- package/dist/cli/loading-tui.js +8 -2
- package/dist/cli/log-gate.js +40 -8
- package/dist/cli/mention-data.js +1 -0
- package/dist/cli/reply-hygiene.js +22 -0
- package/dist/cli/trace-line.js +61 -2
- package/dist/electron-build/agents/agent-gateway.js.map +1 -1
- package/dist/electron-build/agents/chain/chain-indexer.js.map +1 -1
- package/dist/electron-build/agents/chain/chain-settlement.js +0 -1
- package/dist/electron-build/agents/chain/chain-settlement.js.map +1 -1
- package/dist/electron-build/agents/contacts/chain.js.map +1 -1
- package/dist/electron-build/agents/contacts/human-directory.js +204 -0
- package/dist/electron-build/agents/contacts/human-directory.js.map +1 -0
- package/dist/electron-build/agents/contacts/policy.js.map +1 -1
- package/dist/electron-build/agents/contacts/tools.js +112 -0
- package/dist/electron-build/agents/contacts/tools.js.map +1 -1
- package/dist/electron-build/agents/experience-review.js +0 -3
- package/dist/electron-build/agents/experience-review.js.map +1 -1
- package/dist/electron-build/agents/external-events.js.map +1 -1
- package/dist/electron-build/agents/goal-flywheel/goal-change.js +3 -4
- package/dist/electron-build/agents/goal-flywheel/goal-change.js.map +1 -1
- package/dist/electron-build/agents/goal-flywheel-wiring.js.map +1 -1
- package/dist/electron-build/agents/goal-resume.js +0 -4
- package/dist/electron-build/agents/goal-resume.js.map +1 -1
- package/dist/electron-build/agents/intent-classifier.js +1 -1
- package/dist/electron-build/agents/lesson-to-skill.js +0 -1
- package/dist/electron-build/agents/lesson-to-skill.js.map +1 -1
- package/dist/electron-build/agents/loop-review.js +2 -2
- package/dist/electron-build/agents/loop-review.js.map +1 -1
- package/dist/electron-build/agents/memory-recall.js.map +1 -1
- package/dist/electron-build/agents/memory-store.js +430 -0
- package/dist/electron-build/agents/memory-store.js.map +1 -0
- package/dist/electron-build/agents/parse-tool-call.js +9 -22
- package/dist/electron-build/agents/parse-tool-call.js.map +1 -1
- package/dist/electron-build/agents/pi-harness.js +1 -2
- package/dist/electron-build/agents/pi-harness.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-session-manager.js +8 -0
- package/dist/electron-build/agents/pi-sdk-session-manager.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-tools.js +180 -5
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +208 -501
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/pre-tool-validator.js.map +1 -1
- package/dist/electron-build/agents/process-runner.js +28 -9
- package/dist/electron-build/agents/process-runner.js.map +1 -1
- package/dist/electron-build/agents/runner-resolver.js +4 -3
- package/dist/electron-build/agents/runner-resolver.js.map +1 -1
- package/dist/electron-build/agents/skill-loader.js +22 -16
- package/dist/electron-build/agents/skill-loader.js.map +1 -1
- package/dist/electron-build/agents/skill-supervisor-link.js.map +1 -1
- package/dist/electron-build/agents/skills-manager.js +0 -24
- package/dist/electron-build/agents/skills-manager.js.map +1 -1
- package/dist/electron-build/agents/task/task-runner.js.map +1 -1
- package/dist/electron-build/agents/workflow-engine.js.map +1 -1
- package/dist/electron-build/agents/workflow-pivot-loop.js +155 -62
- package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
- package/dist/electron-build/agents/x402/goal-run-bridge.js.map +1 -1
- package/dist/electron-build/bollharness-integration/gate-state-machine.js.map +1 -1
- package/dist/electron-build/bootstrap/context-collector.js +68 -7
- package/dist/electron-build/bootstrap/context-collector.js.map +1 -1
- package/dist/electron-build/bootstrap/context-hierarchy.js +13 -1
- package/dist/electron-build/bootstrap/context-hierarchy.js.map +1 -1
- package/dist/electron-build/bootstrap/persona-loader.js +27 -0
- package/dist/electron-build/bootstrap/persona-loader.js.map +1 -1
- package/dist/electron-build/electron-preload.js.map +1 -1
- package/dist/electron-build/external-engines/delegate.js.map +1 -1
- package/dist/electron-build/kernel/channel-actor.js +31 -2
- package/dist/electron-build/kernel/channel-actor.js.map +1 -1
- package/dist/electron-build/kernel/model-runtime.js +8 -1
- package/dist/electron-build/kernel/model-runtime.js.map +1 -1
- package/dist/electron-build/llm/config-store.js +20 -0
- package/dist/electron-build/llm/config-store.js.map +1 -1
- package/dist/electron-build/llm/embedding-adapter.js +75 -0
- package/dist/electron-build/llm/embedding-adapter.js.map +1 -0
- package/dist/electron-build/llm/pi-ai.js +112 -38
- package/dist/electron-build/llm/pi-ai.js.map +1 -1
- package/dist/electron-build/llm/system-prompt/registry.js +8 -6
- package/dist/electron-build/llm/system-prompt/registry.js.map +1 -1
- package/dist/electron-build/network/agent-network.js.map +1 -1
- package/dist/electron-build/orbitdb/memory-sync.js +76 -0
- package/dist/electron-build/orbitdb/memory-sync.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/adaptive-scan.js.map +1 -1
- package/dist/electron-build/security/tool-gate.js +2 -0
- package/dist/electron-build/security/tool-gate.js.map +1 -1
- package/dist/electron-build/setup/setup-store.js +34 -6
- package/dist/electron-build/setup/setup-store.js.map +1 -1
- package/dist/electron-build/social/heartbeat.js +18 -5
- package/dist/electron-build/social/heartbeat.js.map +1 -1
- package/dist/electron-build/utils/update-manager.js.map +1 -1
- package/dist/index.js +250 -12
- package/dist/ios/bolloon-web.json +3 -3
- package/dist/ios/client.js +74 -35
- package/dist/ios/icons/icon-1400x1400.png +0 -0
- package/dist/ios/icons/icon-1400x1400.webp +0 -0
- package/dist/ios/index.html +122 -108
- package/dist/ios/mobile-agent.js +572 -45
- package/dist/ios/mobile-contacts.js +0 -4
- package/dist/ios/mobile-core.js +8079 -4590
- package/dist/ios/mobile-harness.js +1004 -0
- package/dist/ios/mobile-memory.js +317 -0
- package/dist/ios/mobile-orbitdb.js +194 -0
- package/dist/ios/mobile-persona.js +80 -0
- package/dist/ios/mobile-privacy.js +2 -3
- package/dist/ios/mobile.css +286 -21
- package/dist/ios/mobile.html +122 -108
- package/dist/ios/mobile.js +434 -152
- package/dist/ios/routes-contacts.js +94 -1
- package/dist/ios/routes-world.js +13 -2
- package/dist/ios/server.js +54 -41
- package/dist/ios/style.css +13 -5
- package/dist/ios/sw.js +1 -1
- package/dist/ios/ui/message-renderer.js +4 -18
- package/dist/ios/ui/step-timeline.js +14 -1
- package/dist/kernel/channel-actor.js +30 -2
- package/dist/kernel/gate-scan.js +2 -2
- package/dist/kernel/ha/ha-arbiter.js +177 -0
- package/dist/kernel/ha/ha-guard.js +151 -0
- package/dist/kernel/index.js +36 -0
- package/dist/kernel/model-runtime.js +8 -1
- package/dist/kernel/plan.js +5 -5
- package/dist/kernel/roster.js +3 -3
- package/dist/llm/config-store.js +20 -0
- package/dist/llm/embedding-adapter.js +69 -0
- package/dist/llm/pi-ai.js +110 -37
- package/dist/llm/system-prompt/registry.js +8 -6
- package/dist/orbitdb/memory-sync.js +70 -0
- package/dist/pi-ecosystem-judgment/adaptive-scan.js +1 -1
- package/dist/security/tool-gate.js +2 -0
- package/dist/setup/setup-store.js +34 -6
- package/dist/social/heartbeat.js +18 -5
- package/dist/web/bolloon-web.json +3 -3
- package/dist/web/client.js +74 -35
- package/dist/web/icons/icon-1400x1400.png +0 -0
- package/dist/web/icons/icon-1400x1400.webp +0 -0
- package/dist/web/index.html +37 -25
- package/dist/web/mobile-agent.js +572 -45
- package/dist/web/mobile-contacts.js +0 -4
- package/dist/web/mobile-core.js +8079 -4590
- package/dist/web/mobile-harness.js +1004 -0
- package/dist/web/mobile-memory.js +317 -0
- package/dist/web/mobile-orbitdb.js +194 -0
- package/dist/web/mobile-persona.js +80 -0
- package/dist/web/mobile-privacy.js +2 -3
- package/dist/web/mobile.css +286 -21
- package/dist/web/mobile.html +122 -108
- package/dist/web/mobile.js +434 -152
- package/dist/web/routes-contacts.js +94 -1
- package/dist/web/routes-world.js +13 -2
- package/dist/web/server.js +54 -41
- package/dist/web/style.css +13 -5
- package/dist/web/sw.js +1 -1
- package/dist/web/ui/message-renderer.js +4 -18
- package/dist/web/ui/step-timeline.js +14 -1
- package/package.json +3 -2
- package/scripts/build-web.ts +16 -1
|
@@ -13,6 +13,7 @@ import { checkWritePath } from './shell-guard.js';
|
|
|
13
13
|
import { p2pDocumentTools } from './p2p-document-tools.js';
|
|
14
14
|
import { runSelfImproveLoop } from './pi-sdk-session-factory.js';
|
|
15
15
|
import { getMinimax } from '../constraints/index.js';
|
|
16
|
+
import { llmConfigStore } from '../llm/config-store.js';
|
|
16
17
|
import { delegateToEngine, buildDelegateCommand } from '../external-engines/delegate.js';
|
|
17
18
|
import { spawnBackground } from './process-runner.js';
|
|
18
19
|
import { DELEGATE_ENV_MARK } from './background-notices.js';
|
|
@@ -858,11 +859,9 @@ export function registerBuiltinTools(ctx) {
|
|
|
858
859
|
// 与 shell_exec 的区别: 直接接受完整 shell 命令字符串, 更适合模型自主写命令.
|
|
859
860
|
// 2026-10-01 (优化 #2 v1): **工具发现** —— 125 个工具不可能都记住, 给一个"按关键词找工具"的入口。
|
|
860
861
|
// 空关键词只回**分类索引**(名称清单), 有关键词才回"名称+用途摘要" ⇒ 不刷屏。
|
|
861
|
-
// 2026-10-01 (用户: 「skills 教训学习, bolloon
|
|
862
|
-
//
|
|
863
|
-
//
|
|
864
|
-
// 她那边的做法: 启动自动装载 + 按**描述**在提示里露面 + 需要时用 `skill_view` 读全文 ✓。
|
|
865
|
-
// bolloon 有 1300 个(她百来号) ⇒ 全量注入会撑爆提示 ✗ ⇒ 改成**两个发现工具**(和 `list_tools` 同一思路 ✓)。
|
|
862
|
+
// 2026-10-01 (用户: 「skills 教训学习, bolloon 有吗」): 技能发现 = 两个工具而非全量注入 —
|
|
863
|
+
// 技能库上千个, 全量注入会撑爆提示 (历史: 19 个 skill 曾把 systemPrompt 顶到 22K 导致模型不输出)。
|
|
864
|
+
// 做法同 `list_tools`: 按关键词找 (`list_skills`) → 读全文 (`read_skill`)。
|
|
866
865
|
ctx.tools.set('list_skills', {
|
|
867
866
|
name: 'list_skills',
|
|
868
867
|
description: '用于**找技能**: 给关键词(中文/英文都行)⇒ 返回已装载技能的名字+说明(≤20 条); 不给关键词 ⇒ 先给总数与前若干条. 找到后用 read_skill 读全文再照做.',
|
|
@@ -4445,6 +4444,182 @@ export function registerWalletTools(ctx) {
|
|
|
4445
4444
|
}
|
|
4446
4445
|
}
|
|
4447
4446
|
});
|
|
4447
|
+
// 2026-10-14 (leo: 「需要向量记忆和去中心化记忆」, P0): 结构化记忆工具
|
|
4448
|
+
// —— MemoryEntry 本地 JSONL 持久化; embedding 向量 (P1) / OrbitDB 复制 (P3) 后续接
|
|
4449
|
+
const memoryAgentId = () => ctx.identity?.did || String(ctx.cwd || '');
|
|
4450
|
+
/**
|
|
4451
|
+
* P1: 记忆 embedding 配置。读 llm-config 的 `embedding` 段:
|
|
4452
|
+
* { embedding: { provider, model, baseUrl?, apiKey?, groupId? } }
|
|
4453
|
+
* 未配置 / provider 不可用 → { provider: 'none' } (记忆层回退关键词, 行为不变)。
|
|
4454
|
+
* 诚实边界: 本仓现有 provider (glm 中转 / minimax 订阅 key) 实测无可用 embedding,
|
|
4455
|
+
* 故默认 none; 将来任一供应商 key 就绪, 在此配置段填上即可, 记忆层零改动。
|
|
4456
|
+
*/
|
|
4457
|
+
const getMemoryEmbeddingConfig = () => {
|
|
4458
|
+
try {
|
|
4459
|
+
const cfg = llmConfigStore?.config;
|
|
4460
|
+
const emb = cfg?.embedding;
|
|
4461
|
+
if (emb && typeof emb === 'object' && emb.provider && emb.provider !== 'none') {
|
|
4462
|
+
return {
|
|
4463
|
+
provider: String(emb.provider),
|
|
4464
|
+
model: emb.model ? String(emb.model) : undefined,
|
|
4465
|
+
baseUrl: emb.baseUrl ? String(emb.baseUrl) : undefined,
|
|
4466
|
+
apiKey: emb.apiKey ? String(emb.apiKey) : undefined,
|
|
4467
|
+
groupId: emb.groupId ? String(emb.groupId) : undefined,
|
|
4468
|
+
};
|
|
4469
|
+
}
|
|
4470
|
+
}
|
|
4471
|
+
catch { /* 配置读取失败 → none */ }
|
|
4472
|
+
return { provider: 'none' };
|
|
4473
|
+
};
|
|
4474
|
+
ctx.tools.set('memory_save', {
|
|
4475
|
+
name: 'memory_save',
|
|
4476
|
+
description: '保存一条**结构化长期记忆** (事实/偏好/洞察/事件/关系/技能反馈)。用于: 用户明确说"记住 X"、反复出现的偏好、值得跨会话保留的事实。自动去重 (同内容不重复), 自动打分重要性。',
|
|
4477
|
+
parameters: {
|
|
4478
|
+
content: '记忆内容 (必填, ≥2 字符)',
|
|
4479
|
+
kind: '类型: fact | insight | preference | event | relationship | skill-feedback (默认 fact)',
|
|
4480
|
+
importance: '手动重要性 0-1 (可选, 缺省自动启发式打分)',
|
|
4481
|
+
refs: '关联证据 JSON 数组 (可选, 如 goalId/runId)',
|
|
4482
|
+
},
|
|
4483
|
+
execute: async (args) => {
|
|
4484
|
+
try {
|
|
4485
|
+
const { getMemoryStore } = await import('./memory-store.js');
|
|
4486
|
+
const store = getMemoryStore(memoryAgentId());
|
|
4487
|
+
// P1: 有 embedding adapter 时 save 顺便向量化 (存 vec, 供语义召回)
|
|
4488
|
+
let adapter;
|
|
4489
|
+
try {
|
|
4490
|
+
const { createEmbeddingAdapter } = await import('../llm/embedding-adapter.js');
|
|
4491
|
+
const a = createEmbeddingAdapter(getMemoryEmbeddingConfig());
|
|
4492
|
+
if (a.provider !== 'none')
|
|
4493
|
+
adapter = a;
|
|
4494
|
+
}
|
|
4495
|
+
catch { /* 无向量能力 → 只存文本 */ }
|
|
4496
|
+
const entry = await store.save({
|
|
4497
|
+
content: String(args.content || '').trim(),
|
|
4498
|
+
kind: args.kind || 'fact',
|
|
4499
|
+
importance: args.importance !== undefined ? Number(args.importance) : undefined,
|
|
4500
|
+
refs: Array.isArray(args.refs) ? args.refs.map(String) : undefined,
|
|
4501
|
+
source: 'tool',
|
|
4502
|
+
}, adapter);
|
|
4503
|
+
// P3: 条目级 OrbitDB 同步 (失败静默 — 本地记忆仍权威)
|
|
4504
|
+
try {
|
|
4505
|
+
const { syncMemoryEntryToOrbit } = await import('../orbitdb/memory-sync.js');
|
|
4506
|
+
await syncMemoryEntryToOrbit(entry);
|
|
4507
|
+
}
|
|
4508
|
+
catch { /* 同步失败不阻塞保存 */ }
|
|
4509
|
+
return { success: true, output: `✅ 已保存记忆 #${entry.id.slice(0, 8)} (${entry.kind}, 重要性 ${entry.importance.toFixed(2)})` };
|
|
4510
|
+
}
|
|
4511
|
+
catch (e) {
|
|
4512
|
+
return { success: false, error: `memory_save 失败: ${String(e.message || e)}` };
|
|
4513
|
+
}
|
|
4514
|
+
}
|
|
4515
|
+
});
|
|
4516
|
+
ctx.tools.set('memory_recall', {
|
|
4517
|
+
name: 'memory_recall',
|
|
4518
|
+
description: '按查询关键词**召回长期记忆** (事实/偏好/洞察)。每轮对话已自动做记忆召回, 这里用于显式深挖: 用户说"你还记得我之前说的 X"、或当前任务需要历史上下文时调用。',
|
|
4519
|
+
parameters: {
|
|
4520
|
+
query: '查询内容 (必填, 用关键词)',
|
|
4521
|
+
limit: '返回条数 (默认 3)',
|
|
4522
|
+
},
|
|
4523
|
+
execute: async (args) => {
|
|
4524
|
+
try {
|
|
4525
|
+
const { getMemoryStore, formatRecallBlock } = await import('./memory-store.js');
|
|
4526
|
+
const store = getMemoryStore(memoryAgentId());
|
|
4527
|
+
await store.load();
|
|
4528
|
+
// P3: 召回前先拉远端条目合并 (LWW, updatedAt 大者胜; 网络不可用静默)
|
|
4529
|
+
try {
|
|
4530
|
+
const { fetchRemoteEntries } = await import('../orbitdb/memory-sync.js');
|
|
4531
|
+
const remote = await fetchRemoteEntries(memoryAgentId());
|
|
4532
|
+
if (remote.length > 0)
|
|
4533
|
+
await store.mergeRemote(remote);
|
|
4534
|
+
}
|
|
4535
|
+
catch { /* 远端拉取失败 → 只用本地 */ }
|
|
4536
|
+
const query = String(args.query || '');
|
|
4537
|
+
// P1: 有 embedding adapter 时走向量召回; 无 → 关键词回退 (P0 行为不变)
|
|
4538
|
+
let queryVec;
|
|
4539
|
+
try {
|
|
4540
|
+
const { createEmbeddingAdapter } = await import('../llm/embedding-adapter.js');
|
|
4541
|
+
const adapter = createEmbeddingAdapter(getMemoryEmbeddingConfig());
|
|
4542
|
+
if (adapter.provider !== 'none' && query.trim()) {
|
|
4543
|
+
queryVec = await adapter.embed(query);
|
|
4544
|
+
}
|
|
4545
|
+
}
|
|
4546
|
+
catch { /* vector 不可用 → 关键词回退 */ }
|
|
4547
|
+
const hits = await store.recall({
|
|
4548
|
+
query,
|
|
4549
|
+
limit: args.limit ? Number(args.limit) : 3,
|
|
4550
|
+
queryVec,
|
|
4551
|
+
});
|
|
4552
|
+
if (!hits.length)
|
|
4553
|
+
return { success: true, output: '📭 没有找到相关记忆 (可能是新话题或记忆未保存)' };
|
|
4554
|
+
return { success: true, output: formatRecallBlock(hits) };
|
|
4555
|
+
}
|
|
4556
|
+
catch (e) {
|
|
4557
|
+
return { success: false, error: `memory_recall 失败: ${String(e.message || e)}` };
|
|
4558
|
+
}
|
|
4559
|
+
}
|
|
4560
|
+
});
|
|
4561
|
+
// P2: 价值分层工具 — 固化 / 遗忘 / 统计 (2026-10-11, decentralized-memory-design §2.7)
|
|
4562
|
+
ctx.tools.set('memory_crystallize', {
|
|
4563
|
+
name: 'memory_crystallize',
|
|
4564
|
+
description: '固化一条记忆 (crystallize): 标记为「重要, 不淡忘」+ importance 加成。用于: 用户明确说"这个要记住"、反复确认的重要约定、多次命中的核心事实。返回固化后的条目。',
|
|
4565
|
+
parameters: {
|
|
4566
|
+
entryId: '记忆 ID (从 memory_recall 的返回里拿, 形如 #xxxxxxxx)',
|
|
4567
|
+
},
|
|
4568
|
+
execute: async (args) => {
|
|
4569
|
+
try {
|
|
4570
|
+
const { getMemoryStore } = await import('./memory-store.js');
|
|
4571
|
+
const store = getMemoryStore(memoryAgentId());
|
|
4572
|
+
await store.load();
|
|
4573
|
+
const id = String(args.entryId || '').replace(/^#/, '');
|
|
4574
|
+
const e = await store.crystallize(id);
|
|
4575
|
+
if (!e)
|
|
4576
|
+
return { success: false, error: `未找到记忆 #${id}` };
|
|
4577
|
+
return { success: true, output: `✅ 已固化记忆 #${e.id.slice(0, 8)} (${e.kind}, importance ${e.importance.toFixed(2)}, 不再淡忘)` };
|
|
4578
|
+
}
|
|
4579
|
+
catch (e) {
|
|
4580
|
+
return { success: false, error: `memory_crystallize 失败: ${String(e.message || e)}` };
|
|
4581
|
+
}
|
|
4582
|
+
}
|
|
4583
|
+
});
|
|
4584
|
+
ctx.tools.set('memory_forget', {
|
|
4585
|
+
name: 'memory_forget',
|
|
4586
|
+
description: '删除一条记忆 (entryId 从 memory_recall 返回拿)。用于: 用户说"忘掉这个/删掉这条记忆"、记忆过时/错误。删除不可恢复。',
|
|
4587
|
+
parameters: {
|
|
4588
|
+
entryId: '记忆 ID (形如 #xxxxxxxx)',
|
|
4589
|
+
},
|
|
4590
|
+
execute: async (args) => {
|
|
4591
|
+
try {
|
|
4592
|
+
const { getMemoryStore } = await import('./memory-store.js');
|
|
4593
|
+
const store = getMemoryStore(memoryAgentId());
|
|
4594
|
+
await store.load();
|
|
4595
|
+
const id = String(args.entryId || '').replace(/^#/, '');
|
|
4596
|
+
const ok = await store.remove(id);
|
|
4597
|
+
if (!ok)
|
|
4598
|
+
return { success: false, error: `未找到记忆 #${id}` };
|
|
4599
|
+
return { success: true, output: `🗑️ 已删除记忆 #${id.slice(0, 8)}` };
|
|
4600
|
+
}
|
|
4601
|
+
catch (e) {
|
|
4602
|
+
return { success: false, error: `memory_forget 失败: ${String(e.message || e)}` };
|
|
4603
|
+
}
|
|
4604
|
+
}
|
|
4605
|
+
});
|
|
4606
|
+
ctx.tools.set('memory_stats', {
|
|
4607
|
+
name: 'memory_stats',
|
|
4608
|
+
description: '查看记忆库统计: 总条数 / 已固化 / 已淡化 (decay)。用于: 用户问"我存了多少记忆"、诊断记忆衰减是否生效。',
|
|
4609
|
+
parameters: {},
|
|
4610
|
+
execute: async () => {
|
|
4611
|
+
try {
|
|
4612
|
+
const { getMemoryStore } = await import('./memory-store.js');
|
|
4613
|
+
const store = getMemoryStore(memoryAgentId());
|
|
4614
|
+
await store.load();
|
|
4615
|
+
const s = store.stats();
|
|
4616
|
+
return { success: true, output: `📊 记忆统计: 共 ${s.total} 条 · 已固化 ${s.crystallized} · 已淡化 ${s.decayed}` };
|
|
4617
|
+
}
|
|
4618
|
+
catch (e) {
|
|
4619
|
+
return { success: false, error: `memory_stats 失败: ${String(e.message || e)}` };
|
|
4620
|
+
}
|
|
4621
|
+
}
|
|
4622
|
+
});
|
|
4448
4623
|
// 2026-07-28: 注册 LSP 工具 (代码智能)
|
|
4449
4624
|
// registerBuiltinTools 不是 async, 用同步 import 兜底
|
|
4450
4625
|
try {
|