@bolloon/bolloon-agent 0.3.43 → 0.3.45
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/README.md +135 -135
- package/bin/bolloon-cli.cjs +183 -183
- package/bin/bolloon-daemon.sh +207 -0
- package/bin/bolloon.cjs +0 -0
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/judgment-protocol.js +14 -14
- package/dist/agents/pi-sdk-types.js +12 -12
- package/dist/agents/pi-sdk.js +148 -89
- package/dist/agents/skill-writer.js +19 -0
- package/dist/agents/workflow-pivot-loop.js +2 -2
- package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
- package/dist/bollharness-integration/context-router-judgment.js +4 -4
- package/dist/bollharness-integration/context-router.js +292 -292
- package/dist/bollharness-integration/gate-state-machine.js +13 -13
- package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
- package/dist/bollharness-integration/skill-adapter.js +21 -21
- package/dist/bootstrap/chat-archiver.js +14 -14
- package/dist/bootstrap/context-os.js +21 -21
- package/dist/bootstrap/memory-compressor.js +29 -13
- package/dist/cli-entry.js +36 -36
- package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +63 -0
- package/dist/constraint-runtime/reference_data/commands_snapshot.json +1037 -0
- package/dist/constraint-runtime/reference_data/subsystems/assistant.json +8 -0
- package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +8 -0
- package/dist/constraint-runtime/reference_data/subsystems/bridge.json +32 -0
- package/dist/constraint-runtime/reference_data/subsystems/buddy.json +13 -0
- package/dist/constraint-runtime/reference_data/subsystems/cli.json +26 -0
- package/dist/constraint-runtime/reference_data/subsystems/components.json +32 -0
- package/dist/constraint-runtime/reference_data/subsystems/constants.json +28 -0
- package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +8 -0
- package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +15 -0
- package/dist/constraint-runtime/reference_data/subsystems/hooks.json +32 -0
- package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +21 -0
- package/dist/constraint-runtime/reference_data/subsystems/memdir.json +15 -0
- package/dist/constraint-runtime/reference_data/subsystems/migrations.json +18 -0
- package/dist/constraint-runtime/reference_data/subsystems/moreright.json +8 -0
- package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +11 -0
- package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +8 -0
- package/dist/constraint-runtime/reference_data/subsystems/plugins.json +9 -0
- package/dist/constraint-runtime/reference_data/subsystems/remote.json +11 -0
- package/dist/constraint-runtime/reference_data/subsystems/schemas.json +8 -0
- package/dist/constraint-runtime/reference_data/subsystems/screens.json +10 -0
- package/dist/constraint-runtime/reference_data/subsystems/server.json +10 -0
- package/dist/constraint-runtime/reference_data/subsystems/services.json +32 -0
- package/dist/constraint-runtime/reference_data/subsystems/skills.json +27 -0
- package/dist/constraint-runtime/reference_data/subsystems/state.json +13 -0
- package/dist/constraint-runtime/reference_data/subsystems/types.json +18 -0
- package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +9 -0
- package/dist/constraint-runtime/reference_data/subsystems/utils.json +32 -0
- package/dist/constraint-runtime/reference_data/subsystems/vim.json +12 -0
- package/dist/constraint-runtime/reference_data/subsystems/voice.json +8 -0
- package/dist/constraint-runtime/reference_data/tools_snapshot.json +922 -0
- package/dist/constraint-runtime/setup.js +1 -1
- package/dist/constraint-runtime/tools/PolymarketSDK/cancelOrder.d.ts +13 -3
- package/dist/constraint-runtime/tools/PolymarketSDK/cancelOrder.js +16 -4
- package/dist/constraint-runtime/tools/PolymarketSDK/clobShared.d.ts +50 -0
- package/dist/constraint-runtime/tools/PolymarketSDK/clobShared.js +78 -0
- package/dist/constraint-runtime/tools/PolymarketSDK/createOrder.d.ts +24 -3
- package/dist/constraint-runtime/tools/PolymarketSDK/createOrder.js +31 -4
- package/dist/constraint-runtime/tools/PolymarketSDK/getMarket.d.ts +1 -0
- package/dist/constraint-runtime/tools/PolymarketSDK/getMarket.js +14 -3
- package/dist/constraint-runtime/tools/PolymarketSDK/getOrders.d.ts +11 -2
- package/dist/constraint-runtime/tools/PolymarketSDK/getOrders.js +23 -4
- package/dist/constraint-runtime/tools/PolymarketSDK/listMarkets.d.ts +4 -0
- package/dist/constraint-runtime/tools/PolymarketSDK/listMarkets.js +22 -2
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron/config.js.map +1 -0
- package/dist/electron/dialogs.js.map +1 -0
- package/dist/electron/first-run.js +54 -54
- package/dist/electron/first-run.js.map +1 -0
- package/dist/electron/ipc.js.map +1 -0
- package/dist/electron/logger.js.map +1 -0
- package/dist/electron/main.js.map +1 -0
- package/dist/electron/menu.js.map +1 -0
- package/dist/electron/paths.js.map +1 -0
- package/dist/electron/server.js.map +1 -0
- package/dist/electron/tray.js.map +1 -0
- package/dist/electron/window.js.map +1 -0
- package/dist/electron-build/electron/first-run.js +54 -54
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js.map +1 -1
- package/dist/index.js +113 -113
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +48 -48
- package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
- package/dist/llm/system-prompt/layers/channel/local.md +14 -14
- package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
- package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
- package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
- package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
- package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
- package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
- package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
- package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
- package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
- package/dist/llm/system-prompt/layers/core/identity.md +48 -48
- package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
- package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
- package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
- package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
- package/dist/llm/system-prompt/layers/core/tone.md +31 -31
- package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
- package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
- package/dist/llm/system-prompt/layers/role/architect.md +20 -20
- package/dist/llm/system-prompt/layers/role/expert.md +19 -19
- package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
- package/dist/llm/system-prompt/layers/role/security.md +15 -15
- package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
- package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
- package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
- package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
- package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
- package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
- package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
- package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
- package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
- package/dist/llm/tool-manifest/ask_user_input.js +1 -1
- package/dist/llm/tool-manifest/bash.js +3 -3
- package/dist/llm/tool-manifest/create_file.js +4 -4
- package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
- package/dist/llm/tool-manifest/image_search.js +2 -2
- package/dist/llm/tool-manifest/index.js +59 -0
- package/dist/llm/tool-manifest/mcp.js +2 -2
- package/dist/llm/tool-manifest/message_compose.js +3 -3
- package/dist/llm/tool-manifest/places.js +2 -2
- package/dist/llm/tool-manifest/present_files.js +1 -1
- package/dist/llm/tool-manifest/recipe.js +2 -2
- package/dist/llm/tool-manifest/str_replace.js +5 -5
- package/dist/llm/tool-manifest/view.js +3 -3
- package/dist/llm/tool-manifest/weather.js +4 -4
- package/dist/llm/tool-manifest/web.js +4 -4
- package/dist/orbitdb/cid-database.js +41 -0
- package/dist/orbitdb/did-catalog-replication.js +199 -0
- package/dist/orbitdb/trajectory-store.js +150 -0
- package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
- package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
- package/dist/pi-ecosystem-judgment/distillation.js +14 -14
- package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
- package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
- package/dist/security/context-router-tool.js +15 -15
- package/dist/storage/did-catalog-bridge.js +271 -0
- package/dist/storage/did-catalog.js +231 -0
- package/dist/utils/auto-update.js.map +1 -0
- package/dist/web/api-config.html +779 -779
- package/dist/web/client-hearth.js +10 -10
- package/dist/web/client.js.map +7 -0
- package/dist/web/components/wallet-viem.mjs +118 -118
- package/dist/web/index.html +424 -424
- package/dist/web/manifest.json +20 -20
- package/dist/web/server.js +240 -13
- package/dist/web/style.css +4914 -4914
- package/package.json +193 -193
- package/scripts/build-cli.js +215 -215
- package/scripts/build-web.ts +130 -130
- package/scripts/postinstall.js +152 -152
- package/bin/bolloon.js +0 -157
- package/dist/pi-ecosystem-colony/index.js +0 -365
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
- package/dist/social/ant-colony/PheromoneEngine.js +0 -227
- package/dist/social/ant-colony/index.js +0 -6
- package/dist/social/ant-colony/types.js +0 -24
- package/dist/test/ai-judgment-test.js +0 -80
- package/dist/test/bollharness-integration.test.js +0 -318
- package/dist/test/channel-agent-multi-dialogue.js +0 -205
- package/dist/test/channel-heartbeat-agent-test.js +0 -201
- package/dist/test/constraint-layer.test.js +0 -164
- package/dist/test/diap-identity-test.js +0 -172
- package/dist/test/diap-quick-test.js +0 -62
- package/dist/test/global-shared-context.test.js +0 -315
- package/dist/test/harness-judgment-injection.test.js +0 -246
- package/dist/test/harness-workflow-integrator-test.js +0 -228
- package/dist/test/human-value-store.test.js +0 -243
- package/dist/test/hybrid-integration-test.js +0 -118
- package/dist/test/hybrid-messenger-verify.js +0 -55
- package/dist/test/iroh-bistream-debug.js +0 -38
- package/dist/test/iroh-communication.test.js +0 -66
- package/dist/test/iroh-debug-test.js +0 -57
- package/dist/test/iroh-diap-test.js +0 -71
- package/dist/test/iroh-direct-connect.js +0 -55
- package/dist/test/iroh-e2e-fixed.js +0 -89
- package/dist/test/iroh-e2e-same-process.js +0 -63
- package/dist/test/iroh-e2e.js +0 -66
- package/dist/test/iroh-final-e2e.js +0 -72
- package/dist/test/iroh-relay-test.js +0 -37
- package/dist/test/iroh-simple-test.js +0 -41
- package/dist/test/iroh-transport-verify.js +0 -54
- package/dist/test/iroh-transport.test.js +0 -37
- package/dist/test/iroh-two-nodes.js +0 -70
- package/dist/test/iroh-verify.js +0 -44
- package/dist/test/judgment-decision.test.js +0 -219
- package/dist/test/llm-judgment-integration.test.js +0 -220
- package/dist/test/p2p-agent-complex-dialogue.js +0 -385
- package/dist/test/p2p-agent-dialogue.js +0 -341
- package/dist/test/p2p-agent-full-bidirectional.js +0 -510
- package/dist/test/p2p-agent-harness-flow.js +0 -437
- package/dist/test/p2p-agent-harness-single.js +0 -143
- package/dist/test/p2p-ai-dialogue-test.js +0 -318
- package/dist/test/p2p-cid-connect-test.js +0 -195
- package/dist/test/p2p-connect-receiver.js +0 -69
- package/dist/test/p2p-doc-transfer.js +0 -110
- package/dist/test/p2p-identity-page-test.js +0 -77
- package/dist/test/p2p-iroh-test.js +0 -171
- package/dist/test/p2p-minimal-test.js +0 -241
- package/dist/test/p2p-node-1.js +0 -148
- package/dist/test/p2p-node-2.js +0 -148
- package/dist/test/p2p-server.js +0 -281
- package/dist/test/p2p-two-nodes-test.js +0 -438
- package/dist/test/pi-sdk.test.js +0 -44
- package/dist/test/set-persona.js +0 -40
- package/dist/test/simple.test.js +0 -9
- package/dist/test/storage-integration.test.js +0 -150
- package/dist/test/subagent-manager.test.js +0 -276
- package/dist/test/test-gate-flow.test.js +0 -81
- package/dist/test/workflow-engine.test.js +0 -87
- package/dist/test/workflow-pivot-loop.test.js +0 -246
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* did-catalog-bridge.ts — 把现有落盘存储 (memory/persona/skills/channels/context_os)
|
|
3
|
+
* 的读写入口接到 DID 目录 (did-catalog.ts)。(2026-08-08)
|
|
4
|
+
*
|
|
5
|
+
* 目标 (用户需求: "真正把现有落盘读写切换到这套目录, 而非仅 /api/on_policy 三条"):
|
|
6
|
+
* 1. 写侧写穿 (write-through): 现有写入点 (memory 摘要 / skill 候选 / persona 文件)
|
|
7
|
+
* 写完磁盘后同步 upsert 进 DID 目录对应表 → 生成 WAL 事件 → 可被多设备同步/OrbitDB 复制.
|
|
8
|
+
* 2. 启动回填 (backfill): 扫描既有磁盘目录一次性灌入 catalog 表 (幂等: 内容 sha1 未变不重复写).
|
|
9
|
+
* 3. 读侧合并 (read-through): 提供按 catalog 优先的读取辅助, 供 memory 回读 / persona 叠加.
|
|
10
|
+
*
|
|
11
|
+
* 失败静默: 桥是增强层, 任何一步失败都不影响原磁盘读写 (原路径永远可用).
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs/promises';
|
|
14
|
+
import * as os from 'os';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import { createHash } from 'crypto';
|
|
17
|
+
import { registryOpen } from './did-catalog.js';
|
|
18
|
+
const homeRoot = (h) => h || process.env.HOME || os.homedir() || '/tmp';
|
|
19
|
+
/** 从 ~/.bolloon/identity/user.json 读用户 DID (无则返回 '') */
|
|
20
|
+
export async function resolveUserDid(home) {
|
|
21
|
+
try {
|
|
22
|
+
const raw = await fs.readFile(path.join(homeRoot(home), '.bolloon', 'identity', 'user.json'), 'utf-8');
|
|
23
|
+
const p = JSON.parse(raw);
|
|
24
|
+
return typeof p.did === 'string' && p.did ? p.did : '';
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 写穿: 解析 did → 打开目录 → upsert → persist.
|
|
32
|
+
* 返回是否写入成功 (无 did / 任何异常 → false, 静默).
|
|
33
|
+
*/
|
|
34
|
+
export async function catalogUpsertQuiet(table, key, data, opts = {}) {
|
|
35
|
+
try {
|
|
36
|
+
const did = opts.did || (await resolveUserDid(opts.home));
|
|
37
|
+
if (!did)
|
|
38
|
+
return false;
|
|
39
|
+
const cat = await registryOpen(did, opts.home ? { home: opts.home } : undefined);
|
|
40
|
+
await cat.upsert(table, key, data);
|
|
41
|
+
await cat.persist();
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** 打开用户 DID 目录 (无 did → null) */
|
|
49
|
+
export async function openUserCatalog(opts = {}) {
|
|
50
|
+
try {
|
|
51
|
+
const did = opts.did || (await resolveUserDid(opts.home));
|
|
52
|
+
if (!did)
|
|
53
|
+
return null;
|
|
54
|
+
return await registryOpen(did, opts.home ? { home: opts.home } : undefined);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const sha1 = (s) => createHash('sha1').update(s).digest('hex');
|
|
61
|
+
/** 幂等 upsert: 同 key 已有同 sha1 内容 → 跳过 (不产生新 WAL 事件) */
|
|
62
|
+
async function upsertIfChanged(cat, table, key, data) {
|
|
63
|
+
const existing = cat.get(table, key);
|
|
64
|
+
const digest = sha1(JSON.stringify(data));
|
|
65
|
+
if (existing && existing.data.sha1 === digest)
|
|
66
|
+
return false;
|
|
67
|
+
await cat.upsert(table, key, { ...data, sha1: digest });
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
/** 读目录下所有文件 (递归一层), 返回相对路径列表 */
|
|
71
|
+
async function listFilesRecursive(dir, depth = 0) {
|
|
72
|
+
try {
|
|
73
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const e of entries) {
|
|
76
|
+
const full = path.join(dir, e.name);
|
|
77
|
+
if (e.isDirectory()) {
|
|
78
|
+
if (depth < 2)
|
|
79
|
+
out.push(...(await listFilesRecursive(full, depth + 1)));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
out.push(full);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 启动回填: 扫描既有磁盘目录 → 灌入 DID 目录表 (幂等).
|
|
93
|
+
* memory ~/.bolloon/memory/<agent>/sessions/*.summary.md → memory 表
|
|
94
|
+
* persona ~/.bolloon/persona/<agent>/*.md → persona 表
|
|
95
|
+
* skills ~/.bolloon/skills/**\/SKILL.md → skills 表
|
|
96
|
+
* channels ~/.bolloon/channels.json → channels 表
|
|
97
|
+
* context_os ~/.bolloon/context-os/<layer>/* → context_os 表
|
|
98
|
+
* 返回每表 {added, skipped}. 失败静默.
|
|
99
|
+
*/
|
|
100
|
+
export async function backfillDidCatalog(cat, opts = {}) {
|
|
101
|
+
const root = path.join(homeRoot(opts.home), '.bolloon');
|
|
102
|
+
const out = [];
|
|
103
|
+
const summarize = (table, added, skipped) => ({ table, added, skipped });
|
|
104
|
+
// --- memory: summary 文件 ---
|
|
105
|
+
try {
|
|
106
|
+
let added = 0, skipped = 0;
|
|
107
|
+
const memoryRoot = path.join(root, 'memory');
|
|
108
|
+
const agentDirs = await fs.readdir(memoryRoot, { withFileTypes: true }).catch(() => []);
|
|
109
|
+
for (const d of agentDirs.filter(x => x.isDirectory())) {
|
|
110
|
+
const sessionsDir = path.join(memoryRoot, d.name, 'sessions');
|
|
111
|
+
const files = await listFilesRecursive(sessionsDir);
|
|
112
|
+
for (const f of files.filter(f => f.endsWith('.summary.md'))) {
|
|
113
|
+
try {
|
|
114
|
+
const content = await fs.readFile(f, 'utf-8');
|
|
115
|
+
const st = await fs.stat(f);
|
|
116
|
+
const key = `sessions/${d.name}/${path.basename(f)}`;
|
|
117
|
+
if (await upsertIfChanged(cat, 'memory', key, {
|
|
118
|
+
agentId: d.name, file: path.basename(f), kind: 'summary',
|
|
119
|
+
summary: content.slice(0, 4000), content: content.slice(0, 4000),
|
|
120
|
+
size: content.length,
|
|
121
|
+
updatedAt: st.mtimeMs,
|
|
122
|
+
}))
|
|
123
|
+
added++;
|
|
124
|
+
else
|
|
125
|
+
skipped++;
|
|
126
|
+
}
|
|
127
|
+
catch { /* 单文件失败跳过 */ }
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
out.push(summarize('memory', added, skipped));
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
out.push(summarize('memory', 0, 0));
|
|
134
|
+
}
|
|
135
|
+
// --- persona: 6 文件按 agent 分区 ---
|
|
136
|
+
try {
|
|
137
|
+
let added = 0, skipped = 0;
|
|
138
|
+
const personaRoot = path.join(root, 'persona');
|
|
139
|
+
const agentDirs = await fs.readdir(personaRoot, { withFileTypes: true }).catch(() => []);
|
|
140
|
+
for (const d of agentDirs.filter(x => x.isDirectory())) {
|
|
141
|
+
const files = await listFilesRecursive(path.join(personaRoot, d.name));
|
|
142
|
+
for (const f of files.filter(f => f.endsWith('.md'))) {
|
|
143
|
+
try {
|
|
144
|
+
const content = await fs.readFile(f, 'utf-8');
|
|
145
|
+
const st = await fs.stat(f);
|
|
146
|
+
const key = `${d.name}/${path.basename(f).replace(/\.md$/, '')}`;
|
|
147
|
+
if (await upsertIfChanged(cat, 'persona', key, {
|
|
148
|
+
agentId: d.name, doc: path.basename(f).replace(/\.md$/, ''), kind: 'persona',
|
|
149
|
+
content: content.slice(0, 4000), size: content.length,
|
|
150
|
+
updatedAt: st.mtimeMs,
|
|
151
|
+
}))
|
|
152
|
+
added++;
|
|
153
|
+
else
|
|
154
|
+
skipped++;
|
|
155
|
+
}
|
|
156
|
+
catch { /* 单文件失败跳过 */ }
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
out.push(summarize('persona', added, skipped));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
out.push(summarize('persona', 0, 0));
|
|
163
|
+
}
|
|
164
|
+
// --- skills: SKILL.md (含 skills/<cat>/<name>/ 两级) ---
|
|
165
|
+
try {
|
|
166
|
+
let added = 0, skipped = 0;
|
|
167
|
+
const skillsRoot = path.join(root, 'skills');
|
|
168
|
+
const files = await listFilesRecursive(skillsRoot);
|
|
169
|
+
for (const f of files.filter(f => f.endsWith('SKILL.md'))) {
|
|
170
|
+
try {
|
|
171
|
+
const content = await fs.readFile(f, 'utf-8');
|
|
172
|
+
const st = await fs.stat(f);
|
|
173
|
+
const rel = path.relative(skillsRoot, f).split(path.sep);
|
|
174
|
+
const name = rel.length >= 2 ? rel.slice(0, -1).join('/') : path.basename(path.dirname(f));
|
|
175
|
+
if (await upsertIfChanged(cat, 'skills', name, {
|
|
176
|
+
name, kind: 'skill', file: path.relative(root, f),
|
|
177
|
+
content: content.slice(0, 4000), size: content.length,
|
|
178
|
+
updatedAt: st.mtimeMs,
|
|
179
|
+
}))
|
|
180
|
+
added++;
|
|
181
|
+
else
|
|
182
|
+
skipped++;
|
|
183
|
+
}
|
|
184
|
+
catch { /* 单文件失败跳过 */ }
|
|
185
|
+
}
|
|
186
|
+
out.push(summarize('skills', added, skipped));
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
out.push(summarize('skills', 0, 0));
|
|
190
|
+
}
|
|
191
|
+
// --- channels: channels.json → 每 channel 一行 ---
|
|
192
|
+
try {
|
|
193
|
+
let added = 0, skipped = 0;
|
|
194
|
+
const raw = await fs.readFile(path.join(root, 'channels.json'), 'utf-8');
|
|
195
|
+
const list = JSON.parse(raw);
|
|
196
|
+
const channels = Array.isArray(list) ? list : Array.isArray(list.channels) ? list.channels : [];
|
|
197
|
+
for (const ch of channels) {
|
|
198
|
+
if (!ch || typeof ch !== 'object')
|
|
199
|
+
continue;
|
|
200
|
+
const id = String(ch.id || ch.publicKey || '');
|
|
201
|
+
if (!id)
|
|
202
|
+
continue;
|
|
203
|
+
const key = `channel/${id}`;
|
|
204
|
+
if (await upsertIfChanged(cat, 'channels', key, {
|
|
205
|
+
id, name: String(ch.name || ''), agentId: String(ch.agentId || ''),
|
|
206
|
+
publicKey: String(ch.publicKey || ''), updatedAt: Number(ch.updatedAt || Date.now()),
|
|
207
|
+
}))
|
|
208
|
+
added++;
|
|
209
|
+
else
|
|
210
|
+
skipped++;
|
|
211
|
+
}
|
|
212
|
+
out.push(summarize('channels', added, skipped));
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
out.push(summarize('channels', 0, 0));
|
|
216
|
+
}
|
|
217
|
+
// --- context_os: 资产层文件清单 ---
|
|
218
|
+
try {
|
|
219
|
+
let added = 0, skipped = 0;
|
|
220
|
+
const ctxRoot = path.join(root, 'context-os');
|
|
221
|
+
const layers = await fs.readdir(ctxRoot, { withFileTypes: true }).catch(() => []);
|
|
222
|
+
for (const l of layers.filter(x => x.isDirectory())) {
|
|
223
|
+
const files = await listFilesRecursive(path.join(ctxRoot, l.name));
|
|
224
|
+
for (const f of files) {
|
|
225
|
+
try {
|
|
226
|
+
const st = await fs.stat(f);
|
|
227
|
+
const rel = path.relative(path.join(ctxRoot, l.name), f).split(path.sep).join('/');
|
|
228
|
+
const key = `assets/${l.name}/${rel}`;
|
|
229
|
+
if (await upsertIfChanged(cat, 'context_os', key, {
|
|
230
|
+
layer: l.name, file: rel, kind: 'asset', size: st.size,
|
|
231
|
+
updatedAt: st.mtimeMs,
|
|
232
|
+
}))
|
|
233
|
+
added++;
|
|
234
|
+
else
|
|
235
|
+
skipped++;
|
|
236
|
+
}
|
|
237
|
+
catch { /* 单文件失败跳过 */ }
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
out.push(summarize('context_os', added, skipped));
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
out.push(summarize('context_os', 0, 0));
|
|
244
|
+
}
|
|
245
|
+
await cat.persist();
|
|
246
|
+
return out;
|
|
247
|
+
}
|
|
248
|
+
/** 读侧: memory 表里某 agent 的摘要行 (按 updatedAt 新→旧), 供 memory 回读合并 */
|
|
249
|
+
export function catalogMemoryRows(cat, agentId) {
|
|
250
|
+
return cat
|
|
251
|
+
.all('memory')
|
|
252
|
+
.filter(({ row }) => row.data.agentId === agentId)
|
|
253
|
+
.map(({ key, row }) => ({ key, row }))
|
|
254
|
+
.sort((a, b) => b.row.updatedAt - a.row.updatedAt);
|
|
255
|
+
}
|
|
256
|
+
/** 读侧: persona 表里某 agent 的文档行 → {doc: content} 叠加到磁盘 persona */
|
|
257
|
+
export function catalogPersonaRows(cat, agentId) {
|
|
258
|
+
const out = {};
|
|
259
|
+
for (const { row } of cat.all('persona')) {
|
|
260
|
+
const d = row.data;
|
|
261
|
+
if (d.agentId !== agentId)
|
|
262
|
+
continue;
|
|
263
|
+
const doc = String(d.doc || '');
|
|
264
|
+
const content = String(d.content || '');
|
|
265
|
+
if (doc && content)
|
|
266
|
+
out[doc] = content;
|
|
267
|
+
}
|
|
268
|
+
return out;
|
|
269
|
+
}
|
|
270
|
+
/** 只列出目录表名 (供 API/调试) */
|
|
271
|
+
export const BRIDGE_TABLES = ['memory', 'persona', 'skills', 'channels', 'context_os', 'on_policy'];
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* did-catalog.ts — 以用户 DID 为唯一标识的 Postgres 式关系目录 (2026-08-08)
|
|
3
|
+
*
|
|
4
|
+
* 借鉴 Postgres 标准设计:
|
|
5
|
+
* - 表 (table) 由列 (columns) 定义, 每个表有主键 (dsc_key, 默认 = row 的 id 字段)
|
|
6
|
+
* - 每张表 + 每行都以主键 did 分区: 同一用户的全部数据通过 userDid 绑定
|
|
7
|
+
* - 变更写入日志 (WAL: append-only event log), 与目录一起落盘
|
|
8
|
+
* - 多设备同步 = 拉取另一台设备的 WAL → 回放 (replay) → 按 updatedAt LWW 合并
|
|
9
|
+
*
|
|
10
|
+
* 数据模型 (Postgres 式 DDL):
|
|
11
|
+
* TABLE memory (did, dsc_key, content, meta, updatedAt, deviceId)
|
|
12
|
+
* TABLE vocal (did, agentId, persona/name, did, publicKey...)
|
|
13
|
+
* TABLE on_policy (did, policyVersion, policy(JSON), updatedAt)
|
|
14
|
+
* TABLE skills ...
|
|
15
|
+
* TABLE tools / plugins / mcp / context_os ...
|
|
16
|
+
*
|
|
17
|
+
* WAL 事件谱:
|
|
18
|
+
* { seq, did, table, op: upsert|delete, key, dscid, row, ts, deviceId }
|
|
19
|
+
* 回放/合并规则: 同 (did,table,dscid) → 取 updatedAt 较大者 (LWW); 更新更大的 `rev`
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'fs/promises';
|
|
22
|
+
import * as path from 'path';
|
|
23
|
+
import * as os from 'os';
|
|
24
|
+
export const ALL_TABLES = [
|
|
25
|
+
'memory', 'persona', 'on_policy', 'skills', 'tools', 'plugins', 'mcp', 'context_os', 'channels',
|
|
26
|
+
];
|
|
27
|
+
const homeDir = (h) => {
|
|
28
|
+
if (h)
|
|
29
|
+
return h;
|
|
30
|
+
return process.env.HOME || os.homedir() || '/tmp';
|
|
31
|
+
};
|
|
32
|
+
/** 安全 DID → 目录名片段 */
|
|
33
|
+
export function didDirName(did) {
|
|
34
|
+
return did.split(':').pop()?.substring(0, 24) || 'unknown';
|
|
35
|
+
}
|
|
36
|
+
export class DidCatalog {
|
|
37
|
+
did;
|
|
38
|
+
deviceId;
|
|
39
|
+
root;
|
|
40
|
+
tables = {};
|
|
41
|
+
wal = [];
|
|
42
|
+
nextSeq = 0;
|
|
43
|
+
dirty = false;
|
|
44
|
+
constructor(did, opts = {}) {
|
|
45
|
+
this.did = did;
|
|
46
|
+
this.deviceId = opts.deviceId || 'device1';
|
|
47
|
+
const base = path.join(homeDir(opts.home), '.bolloon', 'did-catalog');
|
|
48
|
+
// 以 did 分区: ~/.bolloon/did-catalog/<did>/table.json + wal.jsonl
|
|
49
|
+
this.root = path.join(base, didDirName(did));
|
|
50
|
+
for (const t of ALL_TABLES)
|
|
51
|
+
this.tables[t] = new Map();
|
|
52
|
+
}
|
|
53
|
+
get rootPath() { return this.root; }
|
|
54
|
+
tablePath(t) { return path.join(this.root, `${t}.json`); }
|
|
55
|
+
walPath() { return path.join(this.root, 'wal.jsonl'); }
|
|
56
|
+
/** 加载本地持久化 (表 + WAL)。幂等, 可重复调。 */
|
|
57
|
+
async load() {
|
|
58
|
+
await fs.mkdir(this.root, { recursive: true });
|
|
59
|
+
for (const t of ALL_TABLES) {
|
|
60
|
+
try {
|
|
61
|
+
const raw = JSON.parse(await fs.readFile(this.tablePath(t), 'utf-8'));
|
|
62
|
+
this.tables[t] = new Map(Object.entries(raw));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
this.tables[t] = new Map();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// WAL 回放自身劫
|
|
69
|
+
this.wal = [];
|
|
70
|
+
try {
|
|
71
|
+
const text = await fs.readFile(this.walPath(), 'utf-8');
|
|
72
|
+
for (const line of text.split('\n')) {
|
|
73
|
+
if (!line.trim())
|
|
74
|
+
continue;
|
|
75
|
+
try {
|
|
76
|
+
const e = JSON.parse(line);
|
|
77
|
+
this.wal.push(e);
|
|
78
|
+
if (e.seq >= this.nextSeq)
|
|
79
|
+
this.nextSeq = e.seq + 1;
|
|
80
|
+
}
|
|
81
|
+
catch { /* 坏行跳过 */ }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch { /* 无 WAL */ }
|
|
85
|
+
}
|
|
86
|
+
/** 无参 upsert / write-return. @param keys -> 主键自动填 */
|
|
87
|
+
async upsert(table, key, data) {
|
|
88
|
+
const now = Date.now();
|
|
89
|
+
const existing = this.tables[table]?.get(key);
|
|
90
|
+
const ev = {
|
|
91
|
+
seq: this.nextSeq++,
|
|
92
|
+
did: this.did,
|
|
93
|
+
table,
|
|
94
|
+
op: 'upsert',
|
|
95
|
+
key,
|
|
96
|
+
row: { ...existing?.data, ...data, dscKey: key, updatedAt: now, deviceId: this.deviceId },
|
|
97
|
+
ts: now,
|
|
98
|
+
deviceId: this.deviceId,
|
|
99
|
+
};
|
|
100
|
+
this.tables[table].set(key, {
|
|
101
|
+
dscKey: key,
|
|
102
|
+
data: ev.row,
|
|
103
|
+
updatedAt: now,
|
|
104
|
+
deviceId: this.deviceId,
|
|
105
|
+
});
|
|
106
|
+
this.wal.push(ev);
|
|
107
|
+
this.dirty = true;
|
|
108
|
+
return ev;
|
|
109
|
+
}
|
|
110
|
+
/** 删除一行 */
|
|
111
|
+
async remove(table, key) {
|
|
112
|
+
if (!this.tables[table]?.has(key))
|
|
113
|
+
return null;
|
|
114
|
+
const ev = {
|
|
115
|
+
seq: this.nextSeq++, did: this.did, table, op: 'delete', key,
|
|
116
|
+
row: null, ts: Date.now(), deviceId: this.deviceId,
|
|
117
|
+
};
|
|
118
|
+
this.tables[table].delete(key);
|
|
119
|
+
this.wal.push(ev);
|
|
120
|
+
this.dirty = true;
|
|
121
|
+
return ev;
|
|
122
|
+
}
|
|
123
|
+
/** 读一行 */
|
|
124
|
+
get(table, key) {
|
|
125
|
+
return this.tables[table]?.get(key);
|
|
126
|
+
}
|
|
127
|
+
/** 全表 */
|
|
128
|
+
all(table) {
|
|
129
|
+
return Array.from((this.tables[table] || new Map()).entries()).map(([k, r]) => ({ key: k, row: r }));
|
|
130
|
+
}
|
|
131
|
+
/** 基础查询: 按字段精确匹配 (Postgres WHERE col = v) */
|
|
132
|
+
where(table, col, value) {
|
|
133
|
+
return this.all(table).filter(({ row }) => {
|
|
134
|
+
const v = row.data[col];
|
|
135
|
+
return String(v) === String(value);
|
|
136
|
+
}).map(({ row }) => row);
|
|
137
|
+
}
|
|
138
|
+
get walEvents() { return Array.from(this.wal); }
|
|
139
|
+
/**
|
|
140
|
+
* 多设备同步入口: 接收一台设备的 WAL 事件流, 按 updatedAt LWW 合并.
|
|
141
|
+
* 返回 {applied, merged} — applied=本机新增, merged=LWW 冲突保留较大者.
|
|
142
|
+
*/
|
|
143
|
+
syncRemote(events) {
|
|
144
|
+
const byKey = new Map();
|
|
145
|
+
for (const e of events) {
|
|
146
|
+
if (!e.table || !e.key)
|
|
147
|
+
continue;
|
|
148
|
+
if (e.did && e.did !== this.did)
|
|
149
|
+
continue; // 只收本用户 DID 的数据
|
|
150
|
+
const signature = `${e.table}::${e.key}`;
|
|
151
|
+
if (e.op === 'delete') {
|
|
152
|
+
byKey.set(signature, e);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const prior = byKey.get(signature);
|
|
156
|
+
if (!prior || (e.ts ?? 0) >= (prior.ts ?? 0))
|
|
157
|
+
byKey.set(signature, e);
|
|
158
|
+
}
|
|
159
|
+
let applied = 0, merged = 0;
|
|
160
|
+
for (const e of byKey.values()) {
|
|
161
|
+
if (e.op === 'delete') {
|
|
162
|
+
const had = this.tables[e.table]?.has(e.key);
|
|
163
|
+
if (had) {
|
|
164
|
+
this.tables[e.table]?.delete(e.key);
|
|
165
|
+
applied++;
|
|
166
|
+
}
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const cur = this.tables[e.table]?.get(e.key);
|
|
170
|
+
if (cur && (cur.updatedAt ?? 0) > (e.ts ?? 0)) {
|
|
171
|
+
merged++;
|
|
172
|
+
continue;
|
|
173
|
+
} // 本地更新 → 保留本地
|
|
174
|
+
this.tables[e.table]?.set(e.key, {
|
|
175
|
+
dscKey: e.key,
|
|
176
|
+
data: e.row,
|
|
177
|
+
updatedAt: e.ts ?? Date.now(),
|
|
178
|
+
deviceId: e.deviceId || 'remote',
|
|
179
|
+
});
|
|
180
|
+
applied++;
|
|
181
|
+
}
|
|
182
|
+
this.dirty = true;
|
|
183
|
+
return { applied, merged };
|
|
184
|
+
}
|
|
185
|
+
/** 持久化表 + WAL 到磁盘 */
|
|
186
|
+
async persist() {
|
|
187
|
+
await fs.mkdir(this.root, { recursive: true });
|
|
188
|
+
for (const t of ALL_TABLES) {
|
|
189
|
+
const obj = {};
|
|
190
|
+
for (const [k, r] of this.tables[t])
|
|
191
|
+
obj[k] = r;
|
|
192
|
+
await fs.writeFile(this.tablePath(t), JSON.stringify(obj, null, 2), 'utf-8');
|
|
193
|
+
}
|
|
194
|
+
const lines = this.wal.map(e => JSON.stringify(e)).join('\n') + '\n';
|
|
195
|
+
await fs.writeFile(this.walPath(), lines, 'utf-8');
|
|
196
|
+
this.dirty = false;
|
|
197
|
+
}
|
|
198
|
+
get isDirty() { return this.dirty; }
|
|
199
|
+
}
|
|
200
|
+
/** 轻量单例注册: 同 DID 复用同一目录实例 (跨模块共享) */
|
|
201
|
+
export function createDidCatalogRegistry(opts = {}) {
|
|
202
|
+
const cache = new Map();
|
|
203
|
+
return {
|
|
204
|
+
async open(did) {
|
|
205
|
+
if (!did)
|
|
206
|
+
throw new Error('did 必填');
|
|
207
|
+
if (!cache.has(did)) {
|
|
208
|
+
cache.set(did, (async () => {
|
|
209
|
+
const c = new DidCatalog(did, opts);
|
|
210
|
+
await c.load();
|
|
211
|
+
return c;
|
|
212
|
+
})());
|
|
213
|
+
}
|
|
214
|
+
return cache.get(did);
|
|
215
|
+
},
|
|
216
|
+
async persistAll() {
|
|
217
|
+
for (const p of cache.values()) {
|
|
218
|
+
const c = await p;
|
|
219
|
+
if (c.isDirty)
|
|
220
|
+
await c.persist();
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** 进程级默认注册表 (server / CLI 共用, 同 DID 复用实例) */
|
|
226
|
+
const _defaultRegistry = createDidCatalogRegistry();
|
|
227
|
+
/** 按 did 打开的目录 (默认注册表单例) — 供各端点快速接入 */
|
|
228
|
+
export async function registryOpen(did, opts) {
|
|
229
|
+
const reg = opts ? createDidCatalogRegistry(opts) : _defaultRegistry;
|
|
230
|
+
return reg.open(did);
|
|
231
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/utils/auto-update.ts"],"names":[],"mappings":"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"}
|