@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.
Files changed (222) hide show
  1. package/README.md +135 -135
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon.cjs +0 -0
  4. package/bin/bolloon.js +157 -0
  5. package/dist/agents/constraint-layer.js +19 -19
  6. package/dist/agents/judgment-protocol.js +14 -14
  7. package/dist/agents/loop-review.js +58 -0
  8. package/dist/agents/pi-sdk-tools.js +107 -0
  9. package/dist/agents/pi-sdk-types.js +12 -12
  10. package/dist/agents/pi-sdk.js +133 -91
  11. package/dist/agents/workflow-pivot-loop.js +2 -2
  12. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  13. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  14. package/dist/bollharness-integration/context-router.js +292 -292
  15. package/dist/bollharness-integration/gate-state-machine.js +13 -13
  16. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  17. package/dist/bollharness-integration/skill-adapter.js +21 -21
  18. package/dist/bootstrap/bootstrap.js +14 -1
  19. package/dist/bootstrap/chat-archiver.js +14 -14
  20. package/dist/bootstrap/context-collector.js +5 -1
  21. package/dist/bootstrap/context-os.js +21 -21
  22. package/dist/bootstrap/memory-compressor.js +13 -13
  23. package/dist/cli/ink-app.js +46 -8
  24. package/dist/cli/loading-tui.js +7 -5
  25. package/dist/cli/mention-data.js +2 -1
  26. package/dist/cli-entry.js +37 -37
  27. package/dist/constraint-runtime/setup.js +1 -1
  28. package/dist/constraint-runtime/tools/PolymarketSDK/cancelOrder.d.ts +3 -13
  29. package/dist/constraint-runtime/tools/PolymarketSDK/cancelOrder.js +4 -16
  30. package/dist/constraint-runtime/tools/PolymarketSDK/createOrder.d.ts +3 -24
  31. package/dist/constraint-runtime/tools/PolymarketSDK/createOrder.js +4 -31
  32. package/dist/constraint-runtime/tools/PolymarketSDK/getMarket.d.ts +0 -1
  33. package/dist/constraint-runtime/tools/PolymarketSDK/getMarket.js +3 -14
  34. package/dist/constraint-runtime/tools/PolymarketSDK/getOrders.d.ts +2 -11
  35. package/dist/constraint-runtime/tools/PolymarketSDK/getOrders.js +4 -23
  36. package/dist/constraint-runtime/tools/PolymarketSDK/listMarkets.d.ts +0 -4
  37. package/dist/constraint-runtime/tools/PolymarketSDK/listMarkets.js +2 -22
  38. package/dist/context-compaction/auto-compact.js +7 -7
  39. package/dist/electron/first-run.js +54 -54
  40. package/dist/electron-build/electron/first-run.js +54 -54
  41. package/dist/electron-build/utils/auto-update.js +8 -0
  42. package/dist/electron-build/utils/auto-update.js.map +1 -1
  43. package/dist/electron-preload.js.map +1 -1
  44. package/dist/electron.js.map +1 -1
  45. package/dist/index.js +246 -143
  46. package/dist/llm/config-store.js +18 -2
  47. package/dist/llm/llm-judgment-client.js +102 -102
  48. package/dist/llm/pi-ai.js +77 -59
  49. package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
  50. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  51. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  52. package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
  53. package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
  54. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  55. package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
  56. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  57. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  58. package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
  59. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  60. package/dist/llm/system-prompt/layers/core/identity.md +48 -48
  61. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  62. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  63. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  64. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  65. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  66. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  67. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  68. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  69. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  70. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  71. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  72. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  73. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  74. package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
  75. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  76. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  77. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  78. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  79. package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
  80. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  81. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  82. package/dist/llm/tool-manifest/bash.js +3 -3
  83. package/dist/llm/tool-manifest/create_file.js +4 -4
  84. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  85. package/dist/llm/tool-manifest/image_search.js +2 -2
  86. package/dist/llm/tool-manifest/index.js +0 -59
  87. package/dist/llm/tool-manifest/mcp.js +2 -2
  88. package/dist/llm/tool-manifest/message_compose.js +3 -3
  89. package/dist/llm/tool-manifest/places.js +2 -2
  90. package/dist/llm/tool-manifest/present_files.js +1 -1
  91. package/dist/llm/tool-manifest/recipe.js +2 -2
  92. package/dist/llm/tool-manifest/str_replace.js +5 -5
  93. package/dist/llm/tool-manifest/view.js +3 -3
  94. package/dist/llm/tool-manifest/weather.js +4 -4
  95. package/dist/llm/tool-manifest/web.js +4 -4
  96. package/dist/migration/external-agent-migrator.js +300 -0
  97. package/dist/pi-ecosystem-colony/index.js +365 -0
  98. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  99. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  100. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  101. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  102. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  103. package/dist/security/context-router-tool.js +15 -15
  104. package/dist/security/tool-gate.js +2 -0
  105. package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
  106. package/dist/social/ant-colony/PheromoneEngine.js +227 -0
  107. package/dist/social/ant-colony/index.js +6 -0
  108. package/dist/social/ant-colony/types.js +24 -0
  109. package/dist/test/ai-judgment-test.js +80 -0
  110. package/dist/test/bollharness-integration.test.js +318 -0
  111. package/dist/test/channel-agent-multi-dialogue.js +205 -0
  112. package/dist/test/channel-heartbeat-agent-test.js +201 -0
  113. package/dist/test/constraint-layer.test.js +164 -0
  114. package/dist/test/diap-identity-test.js +172 -0
  115. package/dist/test/diap-quick-test.js +62 -0
  116. package/dist/test/global-shared-context.test.js +315 -0
  117. package/dist/test/harness-judgment-injection.test.js +246 -0
  118. package/dist/test/harness-workflow-integrator-test.js +228 -0
  119. package/dist/test/human-value-store.test.js +243 -0
  120. package/dist/test/hybrid-integration-test.js +118 -0
  121. package/dist/test/hybrid-messenger-verify.js +55 -0
  122. package/dist/test/iroh-bistream-debug.js +38 -0
  123. package/dist/test/iroh-communication.test.js +66 -0
  124. package/dist/test/iroh-debug-test.js +57 -0
  125. package/dist/test/iroh-diap-test.js +71 -0
  126. package/dist/test/iroh-direct-connect.js +55 -0
  127. package/dist/test/iroh-e2e-fixed.js +89 -0
  128. package/dist/test/iroh-e2e-same-process.js +63 -0
  129. package/dist/test/iroh-e2e.js +66 -0
  130. package/dist/test/iroh-final-e2e.js +72 -0
  131. package/dist/test/iroh-relay-test.js +37 -0
  132. package/dist/test/iroh-simple-test.js +41 -0
  133. package/dist/test/iroh-transport-verify.js +54 -0
  134. package/dist/test/iroh-transport.test.js +37 -0
  135. package/dist/test/iroh-two-nodes.js +70 -0
  136. package/dist/test/iroh-verify.js +44 -0
  137. package/dist/test/judgment-decision.test.js +219 -0
  138. package/dist/test/llm-judgment-integration.test.js +220 -0
  139. package/dist/test/p2p-agent-complex-dialogue.js +385 -0
  140. package/dist/test/p2p-agent-dialogue.js +341 -0
  141. package/dist/test/p2p-agent-full-bidirectional.js +510 -0
  142. package/dist/test/p2p-agent-harness-flow.js +437 -0
  143. package/dist/test/p2p-agent-harness-single.js +143 -0
  144. package/dist/test/p2p-ai-dialogue-test.js +318 -0
  145. package/dist/test/p2p-cid-connect-test.js +195 -0
  146. package/dist/test/p2p-connect-receiver.js +69 -0
  147. package/dist/test/p2p-doc-transfer.js +110 -0
  148. package/dist/test/p2p-identity-page-test.js +77 -0
  149. package/dist/test/p2p-iroh-test.js +171 -0
  150. package/dist/test/p2p-minimal-test.js +241 -0
  151. package/dist/test/p2p-node-1.js +148 -0
  152. package/dist/test/p2p-node-2.js +148 -0
  153. package/dist/test/p2p-server.js +281 -0
  154. package/dist/test/p2p-two-nodes-test.js +438 -0
  155. package/dist/test/pi-sdk.test.js +44 -0
  156. package/dist/test/set-persona.js +40 -0
  157. package/dist/test/simple.test.js +9 -0
  158. package/dist/test/storage-integration.test.js +150 -0
  159. package/dist/test/subagent-manager.test.js +276 -0
  160. package/dist/test/test-gate-flow.test.js +81 -0
  161. package/dist/test/workflow-engine.test.js +87 -0
  162. package/dist/test/workflow-pivot-loop.test.js +246 -0
  163. package/dist/utils/auto-update.js +7 -0
  164. package/dist/web/api-config.html +779 -779
  165. package/dist/web/client-hearth.js +10 -10
  166. package/dist/web/components/wallet-viem.mjs +118 -118
  167. package/dist/web/index.html +424 -424
  168. package/dist/web/manifest.json +20 -20
  169. package/dist/web/server.js +13 -13
  170. package/dist/web/style.css +4914 -4914
  171. package/package.json +193 -193
  172. package/scripts/build-cli.js +215 -215
  173. package/scripts/build-web.ts +130 -130
  174. package/scripts/postinstall.js +152 -152
  175. package/bin/bolloon-daemon.sh +0 -207
  176. package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +0 -63
  177. package/dist/constraint-runtime/reference_data/commands_snapshot.json +0 -1037
  178. package/dist/constraint-runtime/reference_data/subsystems/assistant.json +0 -8
  179. package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +0 -8
  180. package/dist/constraint-runtime/reference_data/subsystems/bridge.json +0 -32
  181. package/dist/constraint-runtime/reference_data/subsystems/buddy.json +0 -13
  182. package/dist/constraint-runtime/reference_data/subsystems/cli.json +0 -26
  183. package/dist/constraint-runtime/reference_data/subsystems/components.json +0 -32
  184. package/dist/constraint-runtime/reference_data/subsystems/constants.json +0 -28
  185. package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +0 -8
  186. package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +0 -15
  187. package/dist/constraint-runtime/reference_data/subsystems/hooks.json +0 -32
  188. package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +0 -21
  189. package/dist/constraint-runtime/reference_data/subsystems/memdir.json +0 -15
  190. package/dist/constraint-runtime/reference_data/subsystems/migrations.json +0 -18
  191. package/dist/constraint-runtime/reference_data/subsystems/moreright.json +0 -8
  192. package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +0 -11
  193. package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +0 -8
  194. package/dist/constraint-runtime/reference_data/subsystems/plugins.json +0 -9
  195. package/dist/constraint-runtime/reference_data/subsystems/remote.json +0 -11
  196. package/dist/constraint-runtime/reference_data/subsystems/schemas.json +0 -8
  197. package/dist/constraint-runtime/reference_data/subsystems/screens.json +0 -10
  198. package/dist/constraint-runtime/reference_data/subsystems/server.json +0 -10
  199. package/dist/constraint-runtime/reference_data/subsystems/services.json +0 -32
  200. package/dist/constraint-runtime/reference_data/subsystems/skills.json +0 -27
  201. package/dist/constraint-runtime/reference_data/subsystems/state.json +0 -13
  202. package/dist/constraint-runtime/reference_data/subsystems/types.json +0 -18
  203. package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +0 -9
  204. package/dist/constraint-runtime/reference_data/subsystems/utils.json +0 -32
  205. package/dist/constraint-runtime/reference_data/subsystems/vim.json +0 -12
  206. package/dist/constraint-runtime/reference_data/subsystems/voice.json +0 -8
  207. package/dist/constraint-runtime/reference_data/tools_snapshot.json +0 -922
  208. package/dist/constraint-runtime/tools/PolymarketSDK/clobShared.d.ts +0 -50
  209. package/dist/constraint-runtime/tools/PolymarketSDK/clobShared.js +0 -78
  210. package/dist/electron/config.js.map +0 -1
  211. package/dist/electron/dialogs.js.map +0 -1
  212. package/dist/electron/first-run.js.map +0 -1
  213. package/dist/electron/ipc.js.map +0 -1
  214. package/dist/electron/logger.js.map +0 -1
  215. package/dist/electron/main.js.map +0 -1
  216. package/dist/electron/menu.js.map +0 -1
  217. package/dist/electron/paths.js.map +0 -1
  218. package/dist/electron/server.js.map +0 -1
  219. package/dist/electron/tray.js.map +0 -1
  220. package/dist/electron/window.js.map +0 -1
  221. package/dist/utils/auto-update.js.map +0 -1
  222. package/dist/web/client.js.map +0 -7
@@ -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
- const CONFIG_PATH = path.join(CONFIG_DIR, 'llm-config.json');
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
- await fs.writeFile(CONFIG_PATH, JSON.stringify(this.config, null, 2));
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 = path.join(process.env.HOME || '/tmp', '.bolloon', 'llm-config.json');
597
- const configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
598
- if (configData.activeProvider && configData.providers[configData.activeProvider]) {
599
- console.log('[PiAIModel] Detected provider from config:', configData.activeProvider);
600
- return configData.activeProvider;
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 = path.join(process.env.HOME || '/tmp', '.bolloon', 'llm-config.json');
660
- const configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
661
- const providerConfig = configData.providers[provider];
662
- if (providerConfig?.apiKey) {
663
- apiKey = providerConfig.apiKey;
664
- console.log('[PiAIModel] Loaded apiKey from config for', provider);
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 重新协商, 不强推修改