@bolloon/bolloon-agent 0.3.37 → 0.3.39
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.cjs +0 -0
- package/bin/bolloon.js +157 -0
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/judgment-protocol.js +14 -14
- package/dist/agents/loop-review.js +58 -0
- package/dist/agents/pi-sdk-tools.js +107 -0
- package/dist/agents/pi-sdk-types.js +12 -12
- package/dist/agents/pi-sdk.js +133 -91
- 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/bootstrap.js +14 -1
- package/dist/bootstrap/chat-archiver.js +14 -14
- package/dist/bootstrap/context-collector.js +5 -1
- package/dist/bootstrap/context-os.js +21 -21
- package/dist/bootstrap/memory-compressor.js +13 -13
- package/dist/cli/ink-app.js +46 -8
- package/dist/cli/loading-tui.js +7 -5
- package/dist/cli/mention-data.js +2 -1
- package/dist/cli-entry.js +37 -37
- package/dist/constraint-runtime/setup.js +1 -1
- package/dist/constraint-runtime/tools/PolymarketSDK/cancelOrder.d.ts +3 -13
- package/dist/constraint-runtime/tools/PolymarketSDK/cancelOrder.js +4 -16
- package/dist/constraint-runtime/tools/PolymarketSDK/createOrder.d.ts +3 -24
- package/dist/constraint-runtime/tools/PolymarketSDK/createOrder.js +4 -31
- package/dist/constraint-runtime/tools/PolymarketSDK/getMarket.d.ts +0 -1
- package/dist/constraint-runtime/tools/PolymarketSDK/getMarket.js +3 -14
- package/dist/constraint-runtime/tools/PolymarketSDK/getOrders.d.ts +2 -11
- package/dist/constraint-runtime/tools/PolymarketSDK/getOrders.js +4 -23
- package/dist/constraint-runtime/tools/PolymarketSDK/listMarkets.d.ts +0 -4
- package/dist/constraint-runtime/tools/PolymarketSDK/listMarkets.js +2 -22
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron/first-run.js +54 -54
- package/dist/electron-build/electron/first-run.js +54 -54
- package/dist/electron-build/utils/auto-update.js +8 -0
- package/dist/electron-build/utils/auto-update.js.map +1 -1
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js.map +1 -1
- package/dist/index.js +246 -143
- package/dist/llm/config-store.js +18 -2
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +77 -59
- 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 +0 -59
- 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/migration/external-agent-migrator.js +300 -0
- package/dist/pi-ecosystem-colony/index.js +365 -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/security/tool-gate.js +2 -0
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
- package/dist/social/ant-colony/PheromoneEngine.js +227 -0
- package/dist/social/ant-colony/index.js +6 -0
- package/dist/social/ant-colony/types.js +24 -0
- package/dist/test/ai-judgment-test.js +80 -0
- package/dist/test/bollharness-integration.test.js +318 -0
- package/dist/test/channel-agent-multi-dialogue.js +205 -0
- package/dist/test/channel-heartbeat-agent-test.js +201 -0
- package/dist/test/constraint-layer.test.js +164 -0
- package/dist/test/diap-identity-test.js +172 -0
- package/dist/test/diap-quick-test.js +62 -0
- package/dist/test/global-shared-context.test.js +315 -0
- package/dist/test/harness-judgment-injection.test.js +246 -0
- package/dist/test/harness-workflow-integrator-test.js +228 -0
- package/dist/test/human-value-store.test.js +243 -0
- package/dist/test/hybrid-integration-test.js +118 -0
- package/dist/test/hybrid-messenger-verify.js +55 -0
- package/dist/test/iroh-bistream-debug.js +38 -0
- package/dist/test/iroh-communication.test.js +66 -0
- package/dist/test/iroh-debug-test.js +57 -0
- package/dist/test/iroh-diap-test.js +71 -0
- package/dist/test/iroh-direct-connect.js +55 -0
- package/dist/test/iroh-e2e-fixed.js +89 -0
- package/dist/test/iroh-e2e-same-process.js +63 -0
- package/dist/test/iroh-e2e.js +66 -0
- package/dist/test/iroh-final-e2e.js +72 -0
- package/dist/test/iroh-relay-test.js +37 -0
- package/dist/test/iroh-simple-test.js +41 -0
- package/dist/test/iroh-transport-verify.js +54 -0
- package/dist/test/iroh-transport.test.js +37 -0
- package/dist/test/iroh-two-nodes.js +70 -0
- package/dist/test/iroh-verify.js +44 -0
- package/dist/test/judgment-decision.test.js +219 -0
- package/dist/test/llm-judgment-integration.test.js +220 -0
- package/dist/test/p2p-agent-complex-dialogue.js +385 -0
- package/dist/test/p2p-agent-dialogue.js +341 -0
- package/dist/test/p2p-agent-full-bidirectional.js +510 -0
- package/dist/test/p2p-agent-harness-flow.js +437 -0
- package/dist/test/p2p-agent-harness-single.js +143 -0
- package/dist/test/p2p-ai-dialogue-test.js +318 -0
- package/dist/test/p2p-cid-connect-test.js +195 -0
- package/dist/test/p2p-connect-receiver.js +69 -0
- package/dist/test/p2p-doc-transfer.js +110 -0
- package/dist/test/p2p-identity-page-test.js +77 -0
- package/dist/test/p2p-iroh-test.js +171 -0
- package/dist/test/p2p-minimal-test.js +241 -0
- package/dist/test/p2p-node-1.js +148 -0
- package/dist/test/p2p-node-2.js +148 -0
- package/dist/test/p2p-server.js +281 -0
- package/dist/test/p2p-two-nodes-test.js +438 -0
- package/dist/test/pi-sdk.test.js +44 -0
- package/dist/test/set-persona.js +40 -0
- package/dist/test/simple.test.js +9 -0
- package/dist/test/storage-integration.test.js +150 -0
- package/dist/test/subagent-manager.test.js +276 -0
- package/dist/test/test-gate-flow.test.js +81 -0
- package/dist/test/workflow-engine.test.js +87 -0
- package/dist/test/workflow-pivot-loop.test.js +246 -0
- package/dist/utils/auto-update.js +7 -0
- package/dist/web/api-config.html +779 -779
- package/dist/web/client-hearth.js +10 -10
- 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 +13 -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-daemon.sh +0 -207
- package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +0 -63
- package/dist/constraint-runtime/reference_data/commands_snapshot.json +0 -1037
- package/dist/constraint-runtime/reference_data/subsystems/assistant.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/bridge.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/buddy.json +0 -13
- package/dist/constraint-runtime/reference_data/subsystems/cli.json +0 -26
- package/dist/constraint-runtime/reference_data/subsystems/components.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/constants.json +0 -28
- package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +0 -15
- package/dist/constraint-runtime/reference_data/subsystems/hooks.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +0 -21
- package/dist/constraint-runtime/reference_data/subsystems/memdir.json +0 -15
- package/dist/constraint-runtime/reference_data/subsystems/migrations.json +0 -18
- package/dist/constraint-runtime/reference_data/subsystems/moreright.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +0 -11
- package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/plugins.json +0 -9
- package/dist/constraint-runtime/reference_data/subsystems/remote.json +0 -11
- package/dist/constraint-runtime/reference_data/subsystems/schemas.json +0 -8
- package/dist/constraint-runtime/reference_data/subsystems/screens.json +0 -10
- package/dist/constraint-runtime/reference_data/subsystems/server.json +0 -10
- package/dist/constraint-runtime/reference_data/subsystems/services.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/skills.json +0 -27
- package/dist/constraint-runtime/reference_data/subsystems/state.json +0 -13
- package/dist/constraint-runtime/reference_data/subsystems/types.json +0 -18
- package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +0 -9
- package/dist/constraint-runtime/reference_data/subsystems/utils.json +0 -32
- package/dist/constraint-runtime/reference_data/subsystems/vim.json +0 -12
- package/dist/constraint-runtime/reference_data/subsystems/voice.json +0 -8
- package/dist/constraint-runtime/reference_data/tools_snapshot.json +0 -922
- package/dist/constraint-runtime/tools/PolymarketSDK/clobShared.d.ts +0 -50
- package/dist/constraint-runtime/tools/PolymarketSDK/clobShared.js +0 -78
- package/dist/electron/config.js.map +0 -1
- package/dist/electron/dialogs.js.map +0 -1
- package/dist/electron/first-run.js.map +0 -1
- package/dist/electron/ipc.js.map +0 -1
- package/dist/electron/logger.js.map +0 -1
- package/dist/electron/main.js.map +0 -1
- package/dist/electron/menu.js.map +0 -1
- package/dist/electron/paths.js.map +0 -1
- package/dist/electron/server.js.map +0 -1
- package/dist/electron/tray.js.map +0 -1
- package/dist/electron/window.js.map +0 -1
- package/dist/utils/auto-update.js.map +0 -1
- package/dist/web/client.js.map +0 -7
package/dist/llm/config-store.js
CHANGED
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
import * as fs from 'fs/promises';
|
|
6
6
|
import * as path from 'path';
|
|
7
7
|
const CONFIG_DIR = path.join(process.env.HOME || '/tmp', '.bolloon');
|
|
8
|
-
|
|
8
|
+
// 2026-08-07: llm-config.json → bolloon-config.json (统一配置文件名, Bolloon 自己有写权限)
|
|
9
|
+
// initialize() 会做一次迁移: 旧文件存在且新文件不存在 → 复制旧内容, 之后统一读写新文件
|
|
10
|
+
const CONFIG_PATH = path.join(CONFIG_DIR, 'bolloon-config.json');
|
|
11
|
+
const LEGACY_CONFIG_PATH = path.join(CONFIG_DIR, 'llm-config.json');
|
|
9
12
|
export const DEFAULT_PROVIDER_CONFIGS = {
|
|
10
13
|
openai: {
|
|
11
14
|
enabled: false,
|
|
@@ -245,6 +248,18 @@ class LLMConfigStore {
|
|
|
245
248
|
return;
|
|
246
249
|
try {
|
|
247
250
|
await fs.mkdir(CONFIG_DIR, { recursive: true });
|
|
251
|
+
// 2026-08-07: 迁移 — 旧 llm-config.json 存在且新 bolloon-config.json 不存在时复制旧内容
|
|
252
|
+
try {
|
|
253
|
+
await fs.access(CONFIG_PATH);
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
try {
|
|
257
|
+
const legacy = await fs.readFile(LEGACY_CONFIG_PATH, 'utf-8');
|
|
258
|
+
await fs.writeFile(CONFIG_PATH, legacy, { mode: 0o600 });
|
|
259
|
+
console.log('[config-store] 已迁移 llm-config.json → bolloon-config.json');
|
|
260
|
+
}
|
|
261
|
+
catch { /* 旧文件也不存在 → 走默认配置 */ }
|
|
262
|
+
}
|
|
248
263
|
const data = await fs.readFile(CONFIG_PATH, 'utf-8');
|
|
249
264
|
const loadedConfig = JSON.parse(data);
|
|
250
265
|
// 确保加载的配置包含所有默认供应商,缺失的用默认值补充
|
|
@@ -271,7 +286,8 @@ class LLMConfigStore {
|
|
|
271
286
|
if (!this.config)
|
|
272
287
|
return;
|
|
273
288
|
this.config.updatedAt = new Date().toISOString();
|
|
274
|
-
|
|
289
|
+
// 2026-08-07: mode 0o600 — 仅当前用户可读写 (含 API key 的敏感配置); Bolloon 自身进程可写
|
|
290
|
+
await fs.writeFile(CONFIG_PATH, JSON.stringify(this.config, null, 2), { mode: 0o600 });
|
|
275
291
|
}
|
|
276
292
|
async getConfig() {
|
|
277
293
|
await this.initialize();
|
|
@@ -31,55 +31,55 @@ export const JUDGMENT_PROMPTS = {
|
|
|
31
31
|
default: {
|
|
32
32
|
systemPrompt: '',
|
|
33
33
|
systemPromptResolver: () => loadRoleLayer('role.expert', '你是一个专业的 AI 任务分析专家. '),
|
|
34
|
-
userPromptTemplate: `【当前输入】
|
|
35
|
-
{user_input}
|
|
36
|
-
|
|
37
|
-
【对话历史】
|
|
38
|
-
{history}
|
|
39
|
-
|
|
40
|
-
【发送者】
|
|
41
|
-
{sender_name}
|
|
42
|
-
|
|
43
|
-
请分析以上输入,判断:
|
|
44
|
-
|
|
45
|
-
## 理解
|
|
46
|
-
1. 问题本质是什么?(how-to / why / what / should / feasibility)
|
|
47
|
-
2. 核心需求是什么?
|
|
48
|
-
3. 有哪些隐含信息需要注意?
|
|
49
|
-
|
|
50
|
-
## 评估
|
|
51
|
-
1. 复杂性等级(simple / moderate / complex / profound)
|
|
52
|
-
2. 为什么是这个等级?
|
|
53
|
-
3. 需要多深的理解?(surface / deeper / fundamental)
|
|
54
|
-
|
|
55
|
-
## 决策
|
|
56
|
-
1. 推荐处理方式(answer / analyze / design / implement / coordinate)
|
|
57
|
-
2. 为什么这样处理?
|
|
58
|
-
|
|
59
|
-
## 路由
|
|
60
|
-
1. 应该调用哪些 Skills?(arch / guardian-fixer / harness-eng / harness-dev / task-arch / crystal-learn)
|
|
61
|
-
2. 需要什么协作模式?(solo / pair / team)
|
|
62
|
-
|
|
63
|
-
请用 JSON 格式输出,格式如下:
|
|
64
|
-
{
|
|
65
|
-
"understanding": {
|
|
66
|
-
"essence": "问题本质",
|
|
67
|
-
"coreNeed": "核心需求",
|
|
68
|
-
"implicit": ["隐含信息1", "隐含信息2"]
|
|
69
|
-
},
|
|
70
|
-
"assessment": {
|
|
71
|
-
"complexity": "complex",
|
|
72
|
-
"complexityReason": "评估理由",
|
|
73
|
-
"depth": "deeper"
|
|
74
|
-
},
|
|
75
|
-
"decision": {
|
|
76
|
-
"approach": "design",
|
|
77
|
-
"reasoning": "决策理由"
|
|
78
|
-
},
|
|
79
|
-
"routing": {
|
|
80
|
-
"skills": ["arch", "guardian-fixer"],
|
|
81
|
-
"collaboration": "pair"
|
|
82
|
-
}
|
|
34
|
+
userPromptTemplate: `【当前输入】
|
|
35
|
+
{user_input}
|
|
36
|
+
|
|
37
|
+
【对话历史】
|
|
38
|
+
{history}
|
|
39
|
+
|
|
40
|
+
【发送者】
|
|
41
|
+
{sender_name}
|
|
42
|
+
|
|
43
|
+
请分析以上输入,判断:
|
|
44
|
+
|
|
45
|
+
## 理解
|
|
46
|
+
1. 问题本质是什么?(how-to / why / what / should / feasibility)
|
|
47
|
+
2. 核心需求是什么?
|
|
48
|
+
3. 有哪些隐含信息需要注意?
|
|
49
|
+
|
|
50
|
+
## 评估
|
|
51
|
+
1. 复杂性等级(simple / moderate / complex / profound)
|
|
52
|
+
2. 为什么是这个等级?
|
|
53
|
+
3. 需要多深的理解?(surface / deeper / fundamental)
|
|
54
|
+
|
|
55
|
+
## 决策
|
|
56
|
+
1. 推荐处理方式(answer / analyze / design / implement / coordinate)
|
|
57
|
+
2. 为什么这样处理?
|
|
58
|
+
|
|
59
|
+
## 路由
|
|
60
|
+
1. 应该调用哪些 Skills?(arch / guardian-fixer / harness-eng / harness-dev / task-arch / crystal-learn)
|
|
61
|
+
2. 需要什么协作模式?(solo / pair / team)
|
|
62
|
+
|
|
63
|
+
请用 JSON 格式输出,格式如下:
|
|
64
|
+
{
|
|
65
|
+
"understanding": {
|
|
66
|
+
"essence": "问题本质",
|
|
67
|
+
"coreNeed": "核心需求",
|
|
68
|
+
"implicit": ["隐含信息1", "隐含信息2"]
|
|
69
|
+
},
|
|
70
|
+
"assessment": {
|
|
71
|
+
"complexity": "complex",
|
|
72
|
+
"complexityReason": "评估理由",
|
|
73
|
+
"depth": "deeper"
|
|
74
|
+
},
|
|
75
|
+
"decision": {
|
|
76
|
+
"approach": "design",
|
|
77
|
+
"reasoning": "决策理由"
|
|
78
|
+
},
|
|
79
|
+
"routing": {
|
|
80
|
+
"skills": ["arch", "guardian-fixer"],
|
|
81
|
+
"collaboration": "pair"
|
|
82
|
+
}
|
|
83
83
|
}`,
|
|
84
84
|
outputFormat: 'json'
|
|
85
85
|
},
|
|
@@ -87,26 +87,26 @@ export const JUDGMENT_PROMPTS = {
|
|
|
87
87
|
architecture: {
|
|
88
88
|
systemPrompt: '',
|
|
89
89
|
systemPromptResolver: () => loadRoleLayer('role.architect', '你是一个经验丰富的系统架构师. '),
|
|
90
|
-
userPromptTemplate: `【架构设计问题】
|
|
91
|
-
{user_input}
|
|
92
|
-
|
|
93
|
-
【上下文】
|
|
94
|
-
{context}
|
|
95
|
-
|
|
96
|
-
请进行架构分析,判断是否需要 Harness 介入。
|
|
97
|
-
|
|
98
|
-
分析维度:
|
|
99
|
-
1. 涉及哪些架构维度?(分层、微服务、事件驱动等)
|
|
100
|
-
2. 需要什么级别的架构设计?(概念性、逻辑性、物理性)
|
|
101
|
-
3. 有什么架构风险需要考虑?
|
|
102
|
-
|
|
103
|
-
输出 JSON:
|
|
104
|
-
{
|
|
105
|
-
"needsHarness": true/false,
|
|
106
|
-
"gate": 0-8,
|
|
107
|
-
"skills": ["arch", "harness-eng"],
|
|
108
|
-
"architectureType": "microservices/layered/event-driven/etc",
|
|
109
|
-
"concerns": ["concern1", "concern2"]
|
|
90
|
+
userPromptTemplate: `【架构设计问题】
|
|
91
|
+
{user_input}
|
|
92
|
+
|
|
93
|
+
【上下文】
|
|
94
|
+
{context}
|
|
95
|
+
|
|
96
|
+
请进行架构分析,判断是否需要 Harness 介入。
|
|
97
|
+
|
|
98
|
+
分析维度:
|
|
99
|
+
1. 涉及哪些架构维度?(分层、微服务、事件驱动等)
|
|
100
|
+
2. 需要什么级别的架构设计?(概念性、逻辑性、物理性)
|
|
101
|
+
3. 有什么架构风险需要考虑?
|
|
102
|
+
|
|
103
|
+
输出 JSON:
|
|
104
|
+
{
|
|
105
|
+
"needsHarness": true/false,
|
|
106
|
+
"gate": 0-8,
|
|
107
|
+
"skills": ["arch", "harness-eng"],
|
|
108
|
+
"architectureType": "microservices/layered/event-driven/etc",
|
|
109
|
+
"concerns": ["concern1", "concern2"]
|
|
110
110
|
}`,
|
|
111
111
|
outputFormat: 'json'
|
|
112
112
|
},
|
|
@@ -114,22 +114,22 @@ export const JUDGMENT_PROMPTS = {
|
|
|
114
114
|
code: {
|
|
115
115
|
systemPrompt: '',
|
|
116
116
|
systemPromptResolver: () => loadRoleLayer('role.implementer', '你是一个高效的代码实现专家. '),
|
|
117
|
-
userPromptTemplate: `【代码问题】
|
|
118
|
-
{user_input}
|
|
119
|
-
|
|
120
|
-
请判断这个问题:
|
|
121
|
-
|
|
122
|
-
1. 是新功能实现还是修复问题?
|
|
123
|
-
2. 涉及哪些代码层面?(业务逻辑、数据访问、接口设计)
|
|
124
|
-
3. 需要什么测试覆盖?
|
|
125
|
-
|
|
126
|
-
输出 JSON:
|
|
127
|
-
{
|
|
128
|
-
"needsHarness": true/false,
|
|
129
|
-
"gate": 0-8,
|
|
130
|
-
"skills": ["harness-dev", "guardian-fixer"],
|
|
131
|
-
"codeType": "feature/fix/refactor",
|
|
132
|
-
"testCoverage": "unit/integration/e2e"
|
|
117
|
+
userPromptTemplate: `【代码问题】
|
|
118
|
+
{user_input}
|
|
119
|
+
|
|
120
|
+
请判断这个问题:
|
|
121
|
+
|
|
122
|
+
1. 是新功能实现还是修复问题?
|
|
123
|
+
2. 涉及哪些代码层面?(业务逻辑、数据访问、接口设计)
|
|
124
|
+
3. 需要什么测试覆盖?
|
|
125
|
+
|
|
126
|
+
输出 JSON:
|
|
127
|
+
{
|
|
128
|
+
"needsHarness": true/false,
|
|
129
|
+
"gate": 0-8,
|
|
130
|
+
"skills": ["harness-dev", "guardian-fixer"],
|
|
131
|
+
"codeType": "feature/fix/refactor",
|
|
132
|
+
"testCoverage": "unit/integration/e2e"
|
|
133
133
|
}`,
|
|
134
134
|
outputFormat: 'json'
|
|
135
135
|
},
|
|
@@ -137,23 +137,23 @@ export const JUDGMENT_PROMPTS = {
|
|
|
137
137
|
security: {
|
|
138
138
|
systemPrompt: '',
|
|
139
139
|
systemPromptResolver: () => loadRoleLayer('role.security', '你是一个严格的安全专家. '),
|
|
140
|
-
userPromptTemplate: `【安全问题】
|
|
141
|
-
{user_input}
|
|
142
|
-
|
|
143
|
-
请分析安全问题:
|
|
144
|
-
|
|
145
|
-
1. 涉及哪些安全维度?(认证、授权、数据保护、传输安全)
|
|
146
|
-
2. 风险等级?(低/中/高/严重)
|
|
147
|
-
3. 需要什么安全措施?
|
|
148
|
-
|
|
149
|
-
输出 JSON:
|
|
150
|
-
{
|
|
151
|
-
"needsHarness": true,
|
|
152
|
-
"gate": 4,
|
|
153
|
-
"skills": ["guardian-fixer", "arch"],
|
|
154
|
-
"securityDimensions": ["authentication", "authorization"],
|
|
155
|
-
"riskLevel": "high",
|
|
156
|
-
"recommendations": ["rec1", "rec2"]
|
|
140
|
+
userPromptTemplate: `【安全问题】
|
|
141
|
+
{user_input}
|
|
142
|
+
|
|
143
|
+
请分析安全问题:
|
|
144
|
+
|
|
145
|
+
1. 涉及哪些安全维度?(认证、授权、数据保护、传输安全)
|
|
146
|
+
2. 风险等级?(低/中/高/严重)
|
|
147
|
+
3. 需要什么安全措施?
|
|
148
|
+
|
|
149
|
+
输出 JSON:
|
|
150
|
+
{
|
|
151
|
+
"needsHarness": true,
|
|
152
|
+
"gate": 4,
|
|
153
|
+
"skills": ["guardian-fixer", "arch"],
|
|
154
|
+
"securityDimensions": ["authentication", "authorization"],
|
|
155
|
+
"riskLevel": "high",
|
|
156
|
+
"recommendations": ["rec1", "rec2"]
|
|
157
157
|
}`,
|
|
158
158
|
outputFormat: 'json'
|
|
159
159
|
}
|
package/dist/llm/pi-ai.js
CHANGED
|
@@ -494,12 +494,12 @@ export class PiAIModel {
|
|
|
494
494
|
// 降级: 旧硬编码 (layer registry 不可用时不挂)
|
|
495
495
|
console.warn('[pi-ai] layer registry 不可用, 降级:', err.message?.slice(0, 100));
|
|
496
496
|
const envDetails = this.getEnvironmentDetails();
|
|
497
|
-
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
498
|
-
|
|
499
|
-
## User Working Directory
|
|
500
|
-
${context || process.cwd()}
|
|
501
|
-
|
|
502
|
-
## Environment
|
|
497
|
+
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
498
|
+
|
|
499
|
+
## User Working Directory
|
|
500
|
+
${context || process.cwd()}
|
|
501
|
+
|
|
502
|
+
## Environment
|
|
503
503
|
${envDetails}`;
|
|
504
504
|
}
|
|
505
505
|
}
|
|
@@ -507,49 +507,49 @@ ${envDetails}`;
|
|
|
507
507
|
// 保留但内部用 sync fallback; 后续可改成 async
|
|
508
508
|
buildSystemPrompt(context) {
|
|
509
509
|
const envDetails = this.getEnvironmentDetails();
|
|
510
|
-
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
511
|
-
|
|
512
|
-
## User Working Directory
|
|
513
|
-
${context || process.cwd()}
|
|
514
|
-
|
|
515
|
-
## Environment
|
|
510
|
+
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
511
|
+
|
|
512
|
+
## User Working Directory
|
|
513
|
+
${context || process.cwd()}
|
|
514
|
+
|
|
515
|
+
## Environment
|
|
516
516
|
${envDetails}`;
|
|
517
517
|
}
|
|
518
518
|
getEnvironmentDetails() {
|
|
519
|
-
return `
|
|
520
|
-
## Available Workflows
|
|
521
|
-
- read - Read documents
|
|
522
|
-
- summarize - Summarize documents
|
|
523
|
-
- improve - Improve documents
|
|
524
|
-
- collaborate - Multi-agent collaboration
|
|
525
|
-
- query - Query status
|
|
526
|
-
- report - Generate reports
|
|
527
|
-
|
|
528
|
-
## System Capabilities
|
|
529
|
-
- Document processing (Markdown, Text, PDF, DOCX)
|
|
530
|
-
- Multi-agent collaboration (P2P network)
|
|
531
|
-
- Workflow engine (constraint layer)
|
|
532
|
-
- Quality assessment and auto-send
|
|
533
|
-
|
|
534
|
-
## Current Time
|
|
519
|
+
return `
|
|
520
|
+
## Available Workflows
|
|
521
|
+
- read - Read documents
|
|
522
|
+
- summarize - Summarize documents
|
|
523
|
+
- improve - Improve documents
|
|
524
|
+
- collaborate - Multi-agent collaboration
|
|
525
|
+
- query - Query status
|
|
526
|
+
- report - Generate reports
|
|
527
|
+
|
|
528
|
+
## System Capabilities
|
|
529
|
+
- Document processing (Markdown, Text, PDF, DOCX)
|
|
530
|
+
- Multi-agent collaboration (P2P network)
|
|
531
|
+
- Workflow engine (constraint layer)
|
|
532
|
+
- Quality assessment and auto-send
|
|
533
|
+
|
|
534
|
+
## Current Time
|
|
535
535
|
${new Date().toISOString()}`;
|
|
536
536
|
}
|
|
537
537
|
buildSummarizePrompt(text, context) {
|
|
538
538
|
const maxLength = 8000;
|
|
539
539
|
const truncatedText = text.length > maxLength ? text.substring(0, maxLength) + '...' : text;
|
|
540
|
-
let prompt = `Please generate a concise and accurate summary for the following document:
|
|
541
|
-
|
|
542
|
-
${truncatedText}
|
|
543
|
-
|
|
544
|
-
Please output in the following format:
|
|
545
|
-
## Summary
|
|
546
|
-
[Write summary here]
|
|
547
|
-
|
|
548
|
-
## Quality Self-Assessment
|
|
540
|
+
let prompt = `Please generate a concise and accurate summary for the following document:
|
|
541
|
+
|
|
542
|
+
${truncatedText}
|
|
543
|
+
|
|
544
|
+
Please output in the following format:
|
|
545
|
+
## Summary
|
|
546
|
+
[Write summary here]
|
|
547
|
+
|
|
548
|
+
## Quality Self-Assessment
|
|
549
549
|
[Score 1-10, with reasoning]`;
|
|
550
550
|
if (context) {
|
|
551
|
-
prompt = `Context: ${context}
|
|
552
|
-
|
|
551
|
+
prompt = `Context: ${context}
|
|
552
|
+
|
|
553
553
|
${prompt}`;
|
|
554
554
|
}
|
|
555
555
|
return prompt;
|
|
@@ -557,17 +557,17 @@ ${prompt}`;
|
|
|
557
557
|
buildImprovePrompt(content, requirements, context) {
|
|
558
558
|
const maxLength = 8000;
|
|
559
559
|
const truncatedContent = content.length > maxLength ? content.substring(0, maxLength) + '...' : content;
|
|
560
|
-
let prompt = `Please improve the document according to the following requirements:
|
|
561
|
-
|
|
562
|
-
Requirements: ${requirements}
|
|
563
|
-
|
|
564
|
-
Original Document:
|
|
565
|
-
${truncatedContent}
|
|
566
|
-
|
|
560
|
+
let prompt = `Please improve the document according to the following requirements:
|
|
561
|
+
|
|
562
|
+
Requirements: ${requirements}
|
|
563
|
+
|
|
564
|
+
Original Document:
|
|
565
|
+
${truncatedContent}
|
|
566
|
+
|
|
567
567
|
Please output only the improved document without additional explanation.`;
|
|
568
568
|
if (context) {
|
|
569
|
-
prompt = `Context: ${context}
|
|
570
|
-
|
|
569
|
+
prompt = `Context: ${context}
|
|
570
|
+
|
|
571
571
|
${prompt}`;
|
|
572
572
|
}
|
|
573
573
|
return prompt;
|
|
@@ -590,14 +590,30 @@ ${prompt}`;
|
|
|
590
590
|
}
|
|
591
591
|
}
|
|
592
592
|
let modelInstance = null;
|
|
593
|
+
/** 2026-08-07: bolloon-config.json 优先, 旧 llm-config.json 兜底 (迁移期兼容) */
|
|
594
|
+
function resolveConfigPath() {
|
|
595
|
+
const home = process.env.HOME || '/tmp';
|
|
596
|
+
const base = path.join(home, '.bolloon');
|
|
597
|
+
for (const name of ['bolloon-config.json', 'llm-config.json']) {
|
|
598
|
+
const p = path.join(base, name);
|
|
599
|
+
try {
|
|
600
|
+
if (fs.existsSync(p))
|
|
601
|
+
return p;
|
|
602
|
+
}
|
|
603
|
+
catch { /* continue */ }
|
|
604
|
+
}
|
|
605
|
+
return null;
|
|
606
|
+
}
|
|
593
607
|
function detectProvider() {
|
|
594
608
|
// 首先检查配置文件(优先级最高)
|
|
595
609
|
try {
|
|
596
|
-
const configPath =
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
610
|
+
const configPath = resolveConfigPath();
|
|
611
|
+
if (configPath) {
|
|
612
|
+
const configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
613
|
+
if (configData.activeProvider && configData.providers[configData.activeProvider]) {
|
|
614
|
+
console.log('[PiAIModel] Detected provider from config:', configData.activeProvider);
|
|
615
|
+
return configData.activeProvider;
|
|
616
|
+
}
|
|
601
617
|
}
|
|
602
618
|
}
|
|
603
619
|
catch { }
|
|
@@ -656,12 +672,14 @@ export function initPiAI(config = {}) {
|
|
|
656
672
|
let apiKey = config.apiKey;
|
|
657
673
|
if (!apiKey) {
|
|
658
674
|
try {
|
|
659
|
-
const configPath =
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
675
|
+
const configPath = resolveConfigPath();
|
|
676
|
+
if (configPath) {
|
|
677
|
+
const configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
678
|
+
const providerConfig = configData.providers[provider];
|
|
679
|
+
if (providerConfig?.apiKey) {
|
|
680
|
+
apiKey = providerConfig.apiKey;
|
|
681
|
+
console.log('[PiAIModel] Loaded apiKey from config for', provider);
|
|
682
|
+
}
|
|
665
683
|
}
|
|
666
684
|
}
|
|
667
685
|
catch (e) {
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
---
|
|
2
|
-
added_at: 2026-07-10
|
|
3
|
-
last_reviewed_at: 2026-07-10
|
|
4
|
-
ttl_days: 180
|
|
5
|
-
author: yuanjie
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
<!-- channel.human-async@1.0.0 -->
|
|
9
|
-
# 人类异步回来 (用户几小时/几天没来, hook 唤醒你做后台任务)
|
|
10
|
-
|
|
11
|
-
**适用场景**: 当前 channel 标识 `user_away` 或 `goal_continue` 类型, 用户不在本地.
|
|
12
|
-
你被 hook 启动处理"用户离开时积累的请求" (peer 消息 / 监控告警 / 计划任务).
|
|
13
|
-
|
|
14
|
-
## 唤醒后先判断
|
|
15
|
-
|
|
16
|
-
- **`list_parked_goals`** (调 goal-resume.ts 暴露的工具) → 拿所有用户离开时挂起的目标
|
|
17
|
-
- **优先级排序**: `awaiting_external` > `channel_switch` > `user_away` > `peer_handoff`
|
|
18
|
-
- 选 1 个最值得推进的, 调 `resume_goal` 接着干
|
|
19
|
-
|
|
20
|
-
## 异步处理 (用户回来时无缝衔接)
|
|
21
|
-
|
|
22
|
-
处理时**不**写到用户原来的 channel — 开新 channel `auto-async:<timestamp>`,
|
|
23
|
-
挂上 `targetId` (= 原始 goal 的 targetId), 用户回来时:
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
1. 用户登录 → 调 list_parked_goals 查他离开时的进展
|
|
27
|
-
2. 对每个 parked goal: 调 resume_goal 续
|
|
28
|
-
3. 在 UI 显示 "📥 你离开时 X 节点帮你推进了 N 步" — 透明
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## 自动沉淀用户习性
|
|
32
|
-
|
|
33
|
-
每完成一个完整任务, **主动调 `habit-distill` skill** (`src/bollharness-integration/skill-adapter.ts`),
|
|
34
|
-
抽取用户在本次交互里展现的偏好 (输入习惯 / 术语 / 反复问的主题), 写到
|
|
35
|
-
`~/.bolloon/human-values/judgments.json`. 标注 `source: 'habit-distill'`.
|
|
36
|
-
|
|
37
|
-
## 边界 (硬约束)
|
|
38
|
-
|
|
39
|
-
- **异步任务超时 > 30min** → 自动 park + 写 judgment "用户可能想优先别的", 退出
|
|
40
|
-
- **写入类操作** (create_file / str_replace) → **先在 channel 里写** "我打算改 X 文件, 你回来时确认", 不直接落盘
|
|
41
|
-
- **不要主动给对端 peer 发消息** — 用户不在场, 你没授权
|
|
1
|
+
---
|
|
2
|
+
added_at: 2026-07-10
|
|
3
|
+
last_reviewed_at: 2026-07-10
|
|
4
|
+
ttl_days: 180
|
|
5
|
+
author: yuanjie
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- channel.human-async@1.0.0 -->
|
|
9
|
+
# 人类异步回来 (用户几小时/几天没来, hook 唤醒你做后台任务)
|
|
10
|
+
|
|
11
|
+
**适用场景**: 当前 channel 标识 `user_away` 或 `goal_continue` 类型, 用户不在本地.
|
|
12
|
+
你被 hook 启动处理"用户离开时积累的请求" (peer 消息 / 监控告警 / 计划任务).
|
|
13
|
+
|
|
14
|
+
## 唤醒后先判断
|
|
15
|
+
|
|
16
|
+
- **`list_parked_goals`** (调 goal-resume.ts 暴露的工具) → 拿所有用户离开时挂起的目标
|
|
17
|
+
- **优先级排序**: `awaiting_external` > `channel_switch` > `user_away` > `peer_handoff`
|
|
18
|
+
- 选 1 个最值得推进的, 调 `resume_goal` 接着干
|
|
19
|
+
|
|
20
|
+
## 异步处理 (用户回来时无缝衔接)
|
|
21
|
+
|
|
22
|
+
处理时**不**写到用户原来的 channel — 开新 channel `auto-async:<timestamp>`,
|
|
23
|
+
挂上 `targetId` (= 原始 goal 的 targetId), 用户回来时:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
1. 用户登录 → 调 list_parked_goals 查他离开时的进展
|
|
27
|
+
2. 对每个 parked goal: 调 resume_goal 续
|
|
28
|
+
3. 在 UI 显示 "📥 你离开时 X 节点帮你推进了 N 步" — 透明
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 自动沉淀用户习性
|
|
32
|
+
|
|
33
|
+
每完成一个完整任务, **主动调 `habit-distill` skill** (`src/bollharness-integration/skill-adapter.ts`),
|
|
34
|
+
抽取用户在本次交互里展现的偏好 (输入习惯 / 术语 / 反复问的主题), 写到
|
|
35
|
+
`~/.bolloon/human-values/judgments.json`. 标注 `source: 'habit-distill'`.
|
|
36
|
+
|
|
37
|
+
## 边界 (硬约束)
|
|
38
|
+
|
|
39
|
+
- **异步任务超时 > 30min** → 自动 park + 写 judgment "用户可能想优先别的", 退出
|
|
40
|
+
- **写入类操作** (create_file / str_replace) → **先在 channel 里写** "我打算改 X 文件, 你回来时确认", 不直接落盘
|
|
41
|
+
- **不要主动给对端 peer 发消息** — 用户不在场, 你没授权
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
---
|
|
2
|
-
added_at: 2026-06-15
|
|
3
|
-
last_reviewed_at: 2026-06-15
|
|
4
|
-
ttl_days: 180
|
|
5
|
-
author: yuanjie
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
<!-- channel.local@1.0.0 -->
|
|
9
|
-
# 本地渠道 (默认, bolloon 跑在用户本机)
|
|
10
|
-
|
|
11
|
-
你跑在用户的本地设备上, 可直接读写用户文件系统. 信任度高.
|
|
12
|
-
|
|
13
|
-
允许: 读写文件、执行命令、调用所有工具.
|
|
14
|
-
边界: 仍遵守 core.refusal / core.wellbeing / 拒绝处理.
|
|
1
|
+
---
|
|
2
|
+
added_at: 2026-06-15
|
|
3
|
+
last_reviewed_at: 2026-06-15
|
|
4
|
+
ttl_days: 180
|
|
5
|
+
author: yuanjie
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- channel.local@1.0.0 -->
|
|
9
|
+
# 本地渠道 (默认, bolloon 跑在用户本机)
|
|
10
|
+
|
|
11
|
+
你跑在用户的本地设备上, 可直接读写用户文件系统. 信任度高.
|
|
12
|
+
|
|
13
|
+
允许: 读写文件、执行命令、调用所有工具.
|
|
14
|
+
边界: 仍遵守 core.refusal / core.wellbeing / 拒绝处理.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
added_at: 2026-06-15
|
|
3
|
-
last_reviewed_at: 2026-06-15
|
|
4
|
-
ttl_days: 180
|
|
5
|
-
author: yuanjie
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
<!-- channel.p2p-agent@1.0.0 -->
|
|
9
|
-
# P2P 远程智能体 (另一个 bolloon 经 P2P 路由)
|
|
10
|
-
|
|
11
|
-
你是远端 bolloon, 收到的是**另一个 bolloon 实例**的协作请求. 信任度高 (基于 P2P 节点身份验证, 不是基于人类).
|
|
12
|
-
|
|
13
|
-
允许: 读 / 写, 协作推理, 共享上下文.
|
|
14
|
-
|
|
15
|
-
边界:
|
|
16
|
-
- 身份验证优先: 先确认对方节点 ID + 公钥签名
|
|
17
|
-
- 共享上下文时避免把人类隐私数据 (judgment / persona) 外泄给未知节点
|
|
18
|
-
- 协作冲突时回退到 snapshot 重新协商, 不强推修改
|
|
1
|
+
---
|
|
2
|
+
added_at: 2026-06-15
|
|
3
|
+
last_reviewed_at: 2026-06-15
|
|
4
|
+
ttl_days: 180
|
|
5
|
+
author: yuanjie
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- channel.p2p-agent@1.0.0 -->
|
|
9
|
+
# P2P 远程智能体 (另一个 bolloon 经 P2P 路由)
|
|
10
|
+
|
|
11
|
+
你是远端 bolloon, 收到的是**另一个 bolloon 实例**的协作请求. 信任度高 (基于 P2P 节点身份验证, 不是基于人类).
|
|
12
|
+
|
|
13
|
+
允许: 读 / 写, 协作推理, 共享上下文.
|
|
14
|
+
|
|
15
|
+
边界:
|
|
16
|
+
- 身份验证优先: 先确认对方节点 ID + 公钥签名
|
|
17
|
+
- 共享上下文时避免把人类隐私数据 (judgment / persona) 外泄给未知节点
|
|
18
|
+
- 协作冲突时回退到 snapshot 重新协商, 不强推修改
|