@bolloon/bolloon-agent 0.2.9 → 0.2.11

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 (268) hide show
  1. package/README.md +467 -467
  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/agent-manifest-protocol.js +0 -52
  6. package/dist/agents/constraint-layer.js +19 -19
  7. package/dist/agents/pi-sdk.js +287 -1213
  8. package/dist/agents/shell-guard.js +2 -2
  9. package/dist/agents/workflow-pivot-loop.js +2 -81
  10. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  11. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  12. package/dist/bollharness-integration/context-router.js +292 -292
  13. package/dist/bollharness-integration/gate-state-machine.js +13 -26
  14. package/dist/bollharness-integration/integration.js +0 -71
  15. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  16. package/dist/bollharness-integration/skill-adapter.js +127 -52
  17. package/dist/bootstrap/context-collector.js +3 -6
  18. package/dist/bootstrap/lifecycle-hooks.js +1 -15
  19. package/dist/cli-entry.js +35 -39
  20. package/dist/constraint-runtime/src/_archive_helper.js +9 -0
  21. package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
  22. package/dist/constraint-runtime/src/agent/index.js +1 -0
  23. package/dist/constraint-runtime/src/assistant/index.js +12 -0
  24. package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
  25. package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
  26. package/dist/constraint-runtime/src/bridge/index.js +12 -0
  27. package/dist/constraint-runtime/src/buddy/index.js +12 -0
  28. package/dist/constraint-runtime/src/cli/index.js +12 -0
  29. package/dist/constraint-runtime/src/command_graph.js +10 -0
  30. package/dist/constraint-runtime/src/commands.js +60 -0
  31. package/dist/constraint-runtime/src/components/index.js +12 -0
  32. package/dist/constraint-runtime/src/constants/index.js +12 -0
  33. package/dist/constraint-runtime/src/constraint/budget.js +22 -0
  34. package/dist/constraint-runtime/src/constraint/index.js +2 -0
  35. package/dist/constraint-runtime/src/constraint/permission.js +20 -0
  36. package/dist/constraint-runtime/src/context.js +30 -0
  37. package/dist/constraint-runtime/src/coordinator/index.js +12 -0
  38. package/dist/constraint-runtime/src/cost_hook.js +4 -0
  39. package/dist/constraint-runtime/src/cost_tracker.js +8 -0
  40. package/dist/constraint-runtime/src/deferred_init.js +10 -0
  41. package/dist/constraint-runtime/src/direct_modes.js +6 -0
  42. package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
  43. package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
  44. package/dist/constraint-runtime/src/execution_registry.js +44 -0
  45. package/dist/constraint-runtime/src/history.js +9 -0
  46. package/dist/constraint-runtime/src/hooks/index.js +12 -0
  47. package/dist/constraint-runtime/src/index.js +26 -0
  48. package/dist/constraint-runtime/src/ink.js +4 -0
  49. package/dist/constraint-runtime/src/keybindings/index.js +12 -0
  50. package/dist/constraint-runtime/src/memdir/index.js +12 -0
  51. package/dist/constraint-runtime/src/migrations/index.js +12 -0
  52. package/dist/constraint-runtime/src/models.js +1 -0
  53. package/dist/constraint-runtime/src/moreright/index.js +12 -0
  54. package/dist/constraint-runtime/src/native_ts/index.js +12 -0
  55. package/dist/constraint-runtime/src/output_styles/index.js +12 -0
  56. package/dist/constraint-runtime/src/parity_audit.js +12 -0
  57. package/dist/constraint-runtime/src/plugins/index.js +12 -0
  58. package/dist/constraint-runtime/src/port_manifest.js +11 -0
  59. package/dist/constraint-runtime/src/prefetch.js +9 -0
  60. package/dist/constraint-runtime/src/query.js +1 -0
  61. package/dist/constraint-runtime/src/remote/index.js +12 -0
  62. package/dist/constraint-runtime/src/remote_runtime.js +9 -0
  63. package/dist/constraint-runtime/src/runtime/index.js +1 -0
  64. package/dist/constraint-runtime/src/runtime/session.js +35 -0
  65. package/dist/constraint-runtime/src/schemas/index.js +12 -0
  66. package/dist/constraint-runtime/src/screens/index.js +12 -0
  67. package/dist/constraint-runtime/src/server/index.js +12 -0
  68. package/dist/constraint-runtime/src/services/index.js +12 -0
  69. package/dist/constraint-runtime/src/session_store.js +22 -0
  70. package/dist/constraint-runtime/src/setup.js +30 -0
  71. package/dist/constraint-runtime/src/skills/index.js +1 -0
  72. package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
  73. package/dist/constraint-runtime/src/state/index.js +12 -0
  74. package/dist/constraint-runtime/src/system_init.js +20 -0
  75. package/dist/constraint-runtime/src/thinking/engine.js +42 -0
  76. package/dist/constraint-runtime/src/thinking/index.js +1 -0
  77. package/dist/constraint-runtime/src/tool_pool.js +8 -0
  78. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
  79. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
  80. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
  81. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
  82. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
  83. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
  84. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
  85. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
  86. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
  87. package/dist/constraint-runtime/src/tools.js +80 -0
  88. package/dist/constraint-runtime/src/transcript.js +19 -0
  89. package/dist/constraint-runtime/src/types/index.js +12 -0
  90. package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
  91. package/dist/constraint-runtime/src/utils/index.js +12 -0
  92. package/dist/constraint-runtime/src/vim/index.js +12 -0
  93. package/dist/constraint-runtime/src/voice/index.js +12 -0
  94. package/dist/constraint-runtime/tests/agent.test.js +16 -0
  95. package/dist/constraint-runtime/tests/constraint.test.js +41 -0
  96. package/dist/constraint-runtime/tests/skill.test.js +19 -0
  97. package/dist/constraint-runtime/tests/thinking.test.js +22 -0
  98. package/dist/context-compaction/auto-compact.js +7 -7
  99. package/dist/electron-preload.js +1 -18
  100. package/dist/electron-preload.js.map +1 -1
  101. package/dist/electron.js +168 -3
  102. package/dist/electron.js.map +1 -1
  103. package/dist/index.js +116 -136
  104. package/dist/llm/config-store.js +8 -24
  105. package/dist/llm/llm-judgment-client.js +102 -102
  106. package/dist/llm/pi-ai.js +85 -126
  107. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  108. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  109. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  110. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  111. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  112. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  113. package/dist/llm/system-prompt/layers/core/identity.md +37 -37
  114. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  115. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  116. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  117. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  118. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  119. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  120. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  121. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  122. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  123. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  124. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  125. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  126. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  127. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  128. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  129. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  130. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  131. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  132. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  133. package/dist/llm/tool-manifest/bash.js +3 -3
  134. package/dist/llm/tool-manifest/create_file.js +4 -4
  135. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  136. package/dist/llm/tool-manifest/image_search.js +2 -2
  137. package/dist/llm/tool-manifest/mcp.js +2 -2
  138. package/dist/llm/tool-manifest/message_compose.js +3 -3
  139. package/dist/llm/tool-manifest/places.js +2 -2
  140. package/dist/llm/tool-manifest/present_files.js +1 -1
  141. package/dist/llm/tool-manifest/recipe.js +2 -2
  142. package/dist/llm/tool-manifest/str_replace.js +5 -5
  143. package/dist/llm/tool-manifest/view.js +3 -3
  144. package/dist/llm/tool-manifest/weather.js +4 -4
  145. package/dist/llm/tool-manifest/web.js +4 -4
  146. package/dist/pi-ecosystem-colony/index.js +365 -0
  147. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  148. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  149. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  150. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  151. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  152. package/dist/security/context-router-tool.js +15 -15
  153. package/dist/security/tool-gate.js +0 -11
  154. package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
  155. package/dist/social/ant-colony/PheromoneEngine.js +227 -0
  156. package/dist/social/ant-colony/index.js +6 -0
  157. package/dist/social/ant-colony/types.js +24 -0
  158. package/dist/test/ai-judgment-test.js +80 -0
  159. package/dist/test/bollharness-integration.test.js +318 -0
  160. package/dist/test/channel-agent-multi-dialogue.js +205 -0
  161. package/dist/test/channel-heartbeat-agent-test.js +201 -0
  162. package/dist/test/constraint-layer.test.js +164 -0
  163. package/dist/test/diap-identity-test.js +172 -0
  164. package/dist/test/diap-quick-test.js +62 -0
  165. package/dist/test/global-shared-context.test.js +315 -0
  166. package/dist/test/harness-judgment-injection.test.js +246 -0
  167. package/dist/test/harness-workflow-integrator-test.js +228 -0
  168. package/dist/test/human-value-store.test.js +243 -0
  169. package/dist/test/hybrid-integration-test.js +118 -0
  170. package/dist/test/hybrid-messenger-verify.js +55 -0
  171. package/dist/test/iroh-bistream-debug.js +38 -0
  172. package/dist/test/iroh-communication.test.js +66 -0
  173. package/dist/test/iroh-debug-test.js +57 -0
  174. package/dist/test/iroh-diap-test.js +71 -0
  175. package/dist/test/iroh-direct-connect.js +55 -0
  176. package/dist/test/iroh-e2e-fixed.js +89 -0
  177. package/dist/test/iroh-e2e-same-process.js +63 -0
  178. package/dist/test/iroh-e2e.js +66 -0
  179. package/dist/test/iroh-final-e2e.js +72 -0
  180. package/dist/test/iroh-relay-test.js +37 -0
  181. package/dist/test/iroh-simple-test.js +41 -0
  182. package/dist/test/iroh-transport-verify.js +54 -0
  183. package/dist/test/iroh-transport.test.js +37 -0
  184. package/dist/test/iroh-two-nodes.js +70 -0
  185. package/dist/test/iroh-verify.js +44 -0
  186. package/dist/test/judgment-decision.test.js +219 -0
  187. package/dist/test/llm-judgment-integration.test.js +220 -0
  188. package/dist/test/p2p-agent-complex-dialogue.js +385 -0
  189. package/dist/test/p2p-agent-dialogue.js +341 -0
  190. package/dist/test/p2p-agent-full-bidirectional.js +510 -0
  191. package/dist/test/p2p-agent-harness-flow.js +437 -0
  192. package/dist/test/p2p-agent-harness-single.js +143 -0
  193. package/dist/test/p2p-ai-dialogue-test.js +318 -0
  194. package/dist/test/p2p-cid-connect-test.js +195 -0
  195. package/dist/test/p2p-connect-receiver.js +69 -0
  196. package/dist/test/p2p-doc-transfer.js +110 -0
  197. package/dist/test/p2p-identity-page-test.js +77 -0
  198. package/dist/test/p2p-iroh-test.js +171 -0
  199. package/dist/test/p2p-minimal-test.js +241 -0
  200. package/dist/test/p2p-node-1.js +148 -0
  201. package/dist/test/p2p-node-2.js +148 -0
  202. package/dist/test/p2p-server.js +281 -0
  203. package/dist/test/p2p-two-nodes-test.js +438 -0
  204. package/dist/test/pi-sdk.test.js +44 -0
  205. package/dist/test/set-persona.js +40 -0
  206. package/dist/test/simple.test.js +9 -0
  207. package/dist/test/storage-integration.test.js +150 -0
  208. package/dist/test/subagent-manager.test.js +276 -0
  209. package/dist/test/test-gate-flow.test.js +81 -0
  210. package/dist/test/workflow-engine.test.js +87 -0
  211. package/dist/test/workflow-pivot-loop.test.js +246 -0
  212. package/dist/web/api-config.html +520 -520
  213. package/dist/web/client.js +2917 -3791
  214. package/dist/web/components/p2p/index.js +234 -276
  215. package/dist/web/components/wallet-viem.mjs +118 -118
  216. package/dist/web/index.html +374 -373
  217. package/dist/web/manifest.json +20 -20
  218. package/dist/web/server.js +23 -775
  219. package/dist/web/style.css +4737 -4737
  220. package/dist/web/ui/message-renderer.js +373 -451
  221. package/dist/web/ui/step-timeline.js +255 -351
  222. package/package.json +160 -160
  223. package/scripts/build-cli.js +215 -215
  224. package/scripts/build-web.ts +125 -125
  225. package/scripts/postinstall.js +152 -152
  226. package/bin/bolloon-daemon.sh +0 -207
  227. package/bin/ipfs +0 -0
  228. package/dist/agents/chat-segmenter.js +0 -298
  229. package/dist/agents/judgment-protocol.js +0 -479
  230. package/dist/agents/parse-tool-call.js +0 -304
  231. package/dist/agents/peer-manifest-loader.js +0 -210
  232. package/dist/agents/react-loop.js +0 -120
  233. package/dist/agents/session-store.js +0 -171
  234. package/dist/agents/tool-registry.js +0 -136
  235. package/dist/bootstrap/chat-archiver.js +0 -276
  236. package/dist/bootstrap/memory-compressor.js +0 -170
  237. package/dist/bootstrap/persona-loader.js +0 -94
  238. package/dist/electron/config.js +0 -16
  239. package/dist/electron/config.js.map +0 -1
  240. package/dist/electron/dialogs.js +0 -71
  241. package/dist/electron/dialogs.js.map +0 -1
  242. package/dist/electron/first-run.js +0 -129
  243. package/dist/electron/first-run.js.map +0 -1
  244. package/dist/electron/ipc.js +0 -16
  245. package/dist/electron/ipc.js.map +0 -1
  246. package/dist/electron/logger.js +0 -77
  247. package/dist/electron/logger.js.map +0 -1
  248. package/dist/electron/main.js +0 -60
  249. package/dist/electron/main.js.map +0 -1
  250. package/dist/electron/menu.js +0 -140
  251. package/dist/electron/menu.js.map +0 -1
  252. package/dist/electron/paths.js +0 -33
  253. package/dist/electron/paths.js.map +0 -1
  254. package/dist/electron/server.js +0 -74
  255. package/dist/electron/server.js.map +0 -1
  256. package/dist/electron/tray.js +0 -73
  257. package/dist/electron/tray.js.map +0 -1
  258. package/dist/electron/window.js +0 -69
  259. package/dist/electron/window.js.map +0 -1
  260. package/dist/network/local-inbox-bus.js +0 -73
  261. package/dist/network/p2p-outbox.js +0 -161
  262. package/dist/network/peer-fs.js +0 -420
  263. package/dist/network/peer-resource-bridge.js +0 -216
  264. package/dist/web/components/p2p/P2PModal.js +0 -188
  265. package/dist/web/components/p2p/p2p-modal.js +0 -664
  266. package/dist/web/components/p2p/p2p-tools.js +0 -248
  267. package/dist/web/input-validator.js +0 -103
  268. package/dist/web/util/safe-name.js +0 -32
@@ -1,248 +0,0 @@
1
- /**
2
- * P2P 工具调用模块
3
- * 支持文件和本地信息的 P2P 传递
4
- */
5
- // 工具类型枚举
6
- export var P2PToolType;
7
- (function (P2PToolType) {
8
- P2PToolType["FILE_TRANSFER"] = "file_transfer";
9
- P2PToolType["LOCAL_INFO"] = "local_info";
10
- P2PToolType["SYSTEM_INFO"] = "system_info";
11
- P2PToolType["FILE_LIST"] = "file_list";
12
- })(P2PToolType || (P2PToolType = {}));
13
- // 文件传输
14
- export async function transferFile(targetDid, fileInfo, messageId) {
15
- try {
16
- const payload = {
17
- type: 'file',
18
- tool: P2PToolType.FILE_TRANSFER,
19
- data: {
20
- name: fileInfo.name,
21
- size: fileInfo.size,
22
- mimeType: fileInfo.mimeType,
23
- content: fileInfo.content
24
- }
25
- };
26
- const res = await fetch('/api/message-p2p', {
27
- method: 'POST',
28
- headers: { 'Content-Type': 'application/json' },
29
- body: JSON.stringify({
30
- targetDid,
31
- content: JSON.stringify(payload),
32
- type: 'file'
33
- })
34
- });
35
- if (res.ok) {
36
- const data = await res.json();
37
- return {
38
- success: true,
39
- messageId: data.messageId || messageId
40
- };
41
- }
42
- else {
43
- return { success: false, error: '文件传输失败' };
44
- }
45
- }
46
- catch (e) {
47
- return { success: false, error: e.message };
48
- }
49
- }
50
- // 本地信息查询
51
- export async function queryLocalInfo(targetDid, query) {
52
- try {
53
- const payload = {
54
- type: 'info_query',
55
- tool: P2PToolType.LOCAL_INFO,
56
- query: query
57
- };
58
- const res = await fetch('/api/message-p2p', {
59
- method: 'POST',
60
- headers: { 'Content-Type': 'application/json' },
61
- body: JSON.stringify({
62
- targetDid,
63
- content: JSON.stringify(payload),
64
- type: 'ai-dialogue'
65
- })
66
- });
67
- if (res.ok) {
68
- const data = await res.json();
69
- return {
70
- success: true,
71
- data: data.response,
72
- messageId: data.messageId
73
- };
74
- }
75
- else {
76
- return { success: false, error: '信息查询失败' };
77
- }
78
- }
79
- catch (e) {
80
- return { success: false, error: e.message };
81
- }
82
- }
83
- // 系统信息请求
84
- export async function getSystemInfo(targetDid) {
85
- try {
86
- const payload = {
87
- type: 'system_info_request',
88
- tool: P2PToolType.SYSTEM_INFO
89
- };
90
- const res = await fetch('/api/message-p2p', {
91
- method: 'POST',
92
- headers: { 'Content-Type': 'application/json' },
93
- body: JSON.stringify({
94
- targetDid,
95
- content: JSON.stringify(payload),
96
- type: 'ai-dialogue'
97
- })
98
- });
99
- if (res.ok) {
100
- const data = await res.json();
101
- return {
102
- success: true,
103
- data: data.response,
104
- messageId: data.messageId
105
- };
106
- }
107
- else {
108
- return { success: false, error: '系统信息获取失败' };
109
- }
110
- }
111
- catch (e) {
112
- return { success: false, error: e.message };
113
- }
114
- }
115
- // 文件列表请求
116
- export async function listFiles(targetDid, path = '/') {
117
- try {
118
- const payload = {
119
- type: 'file_list_request',
120
- tool: P2PToolType.FILE_LIST,
121
- path: path
122
- };
123
- const res = await fetch('/api/message-p2p', {
124
- method: 'POST',
125
- headers: { 'Content-Type': 'application/json' },
126
- body: JSON.stringify({
127
- targetDid,
128
- content: JSON.stringify(payload),
129
- type: 'ai-dialogue'
130
- })
131
- });
132
- if (res.ok) {
133
- const data = await res.json();
134
- return {
135
- success: true,
136
- data: data.response,
137
- messageId: data.messageId
138
- };
139
- }
140
- else {
141
- return { success: false, error: '文件列表获取失败' };
142
- }
143
- }
144
- catch (e) {
145
- return { success: false, error: e.message };
146
- }
147
- }
148
- // 工具调用入口
149
- export async function executeP2PTool(request) {
150
- const { toolName, payload, targetDid } = request;
151
- if (!targetDid) {
152
- return { success: false, error: '未指定目标节点' };
153
- }
154
- switch (toolName) {
155
- case P2PToolType.FILE_TRANSFER:
156
- return transferFile(targetDid, payload.data);
157
- case P2PToolType.LOCAL_INFO:
158
- return queryLocalInfo(targetDid, payload.data);
159
- case P2PToolType.SYSTEM_INFO:
160
- return getSystemInfo(targetDid);
161
- case P2PToolType.FILE_LIST:
162
- return listFiles(targetDid, payload.data?.path || '/');
163
- default:
164
- return { success: false, error: `未知工具: ${toolName}` };
165
- }
166
- }
167
- // 本地系统信息获取 (用于响应来自远程的请求)
168
- export function getLocalSystemInfo() {
169
- const memUsage = process.memoryUsage();
170
- const cpuCores = require('os').cpus();
171
- return {
172
- platform: process.platform,
173
- arch: process.arch,
174
- nodeVersion: process.version,
175
- memory: {
176
- total: memUsage.heapTotal,
177
- free: memUsage.heapTotal - memUsage.heapUsed,
178
- used: memUsage.heapUsed
179
- },
180
- cpu: {
181
- cores: cpuCores.length,
182
- model: cpuCores[0]?.model || 'Unknown'
183
- },
184
- uptime: process.uptime()
185
- };
186
- }
187
- // 本地文件列表 (用于响应来自远程的请求)
188
- export function getLocalFileList(dirPath) {
189
- try {
190
- // Dynamic import for ESM compatibility
191
- const pathModule = require('path');
192
- const fs = require('fs');
193
- const fullPath = pathModule.resolve(dirPath);
194
- const files = fs.readdirSync(fullPath);
195
- const fileList = files.map((name) => {
196
- const fullFilePath = pathModule.join(fullPath, name);
197
- let stat;
198
- try {
199
- stat = fs.statSync(fullFilePath);
200
- }
201
- catch {
202
- return null;
203
- }
204
- return {
205
- name: name,
206
- size: stat.size,
207
- isDirectory: stat.isDirectory(),
208
- modified: stat.mtime.toISOString()
209
- };
210
- }).filter(Boolean);
211
- return {
212
- success: true,
213
- path: fullPath,
214
- files: fileList
215
- };
216
- }
217
- catch (e) {
218
- return {
219
- success: false,
220
- path: dirPath,
221
- error: e.message
222
- };
223
- }
224
- }
225
- // 导出工具名称列表
226
- export const P2P_TOOLS = [
227
- {
228
- name: P2PToolType.FILE_TRANSFER,
229
- description: '传输文件到远程节点',
230
- parameters: ['targetDid', 'fileInfo']
231
- },
232
- {
233
- name: P2PToolType.LOCAL_INFO,
234
- description: '查询远程节点本地信息',
235
- parameters: ['targetDid', 'query']
236
- },
237
- {
238
- name: P2PToolType.SYSTEM_INFO,
239
- description: '获取远程节点系统信息',
240
- parameters: ['targetDid']
241
- },
242
- {
243
- name: P2PToolType.FILE_LIST,
244
- description: '列出远程节点目录文件',
245
- parameters: ['targetDid', 'path']
246
- }
247
- ];
248
- console.log('[P2P Tools] 工具模块已加载');
@@ -1,103 +0,0 @@
1
- /**
2
- * input-validator — web 接口输入验证 (v0.2.5)
3
- *
4
- * 2026-07-01: 抽到独立模块, claude code / 前端都能 import 验证.
5
- * - 后端用: POST /api/validate-input 调 validate()
6
- * - 前端用: 实时 UI 反馈 (发送前预校验, 不阻塞)
7
- *
8
- * 验证规则 (bolloon web 当前业务):
9
- * - text 非空 (trim 后)
10
- * - text 长度 <= MAX_TEXT_LENGTH
11
- * - text 不包含 NUL / 不可打印控制字符
12
- * - channelId 非空
13
- * - channelName (新建频道) 长度 <= MAX_NAME_LENGTH
14
- * - 不含 SQL/XSS payload 触发 (sanitize-only: 不是阻止, 是 warn)
15
- *
16
- * 设计: 纯函数 + 返回结构化 ValidationResult.
17
- * { ok: true, reason?, severity? }
18
- * 严重等级: 'info' | 'warn' | 'block'
19
- */
20
- export const MAX_TEXT_LENGTH = 16_000; // 大约 4K tokens, 单条 user 消息够用
21
- export const MAX_NAME_LENGTH = 200; // channel name 上限
22
- export const MAX_AGENT_ID_LENGTH = 200;
23
- /** 校验单条 /message 请求 (text + channelId) */
24
- export function validateMessageInput(input) {
25
- // 1. channelId
26
- if (typeof input.channelId !== 'string' || input.channelId.trim() === '') {
27
- return { ok: false, severity: 'block', reason: 'channelId 必填' };
28
- }
29
- if (input.channelId.length > 256) {
30
- return { ok: false, severity: 'block', reason: `channelId 长度超过 256 字符 (${input.channelId.length})` };
31
- }
32
- // 2. text
33
- if (typeof input.text !== 'string') {
34
- return { ok: false, severity: 'block', reason: 'text 必填且必须是字符串' };
35
- }
36
- const trimmed = input.text.trim();
37
- if (trimmed === '') {
38
- return { ok: false, severity: 'block', reason: 'text 不能为空 (trim 后)' };
39
- }
40
- if (trimmed.length > MAX_TEXT_LENGTH) {
41
- return {
42
- ok: false,
43
- severity: 'block',
44
- reason: `text 长度 ${trimmed.length} 超过最大 ${MAX_TEXT_LENGTH} 字符`,
45
- };
46
- }
47
- // 3. 控制字符检测 — 拒绝 NUL + 不可打印 char (< 0x20 除了 \n \r \t)
48
- // eslint-disable-next-line no-control-regex
49
- const controlCharRe = /[\x00-\x08\x0B-\x0C\x0E-\x1F]/g;
50
- const controlMatches = trimmed.match(controlCharRe);
51
- if (controlMatches && controlMatches.length > 0) {
52
- return {
53
- ok: false,
54
- severity: 'block',
55
- reason: `text 含 ${controlMatches.length} 个不可打印控制字符`,
56
- };
57
- }
58
- // 4. 通用安全 check — 大段 HTML/JS 注入 (sanitize 是另一层, 这里只 warn)
59
- const htmlRe = /<\/?[a-z][\s\S]*>/i;
60
- if (htmlRe.test(trimmed) && trimmed.length > 500) {
61
- return {
62
- ok: true,
63
- severity: 'warn',
64
- reason: 'text 包含 HTML 标签 (>500 字符), 确认发送前预览',
65
- cleaned: trimmed,
66
- };
67
- }
68
- return { ok: true, severity: 'info', cleaned: trimmed };
69
- }
70
- /** 校验 channel 创建输入 */
71
- export function validateChannelInput(input) {
72
- if (typeof input.name !== 'string' || input.name.trim() === '') {
73
- return { ok: false, severity: 'block', reason: 'name 必填' };
74
- }
75
- const trimmedName = input.name.trim();
76
- if (trimmedName.length > MAX_NAME_LENGTH) {
77
- return {
78
- ok: false,
79
- severity: 'block',
80
- reason: `name 长度 ${trimmedName.length} 超过最大 ${MAX_NAME_LENGTH}`,
81
- };
82
- }
83
- if (typeof input.agentId === 'string' && input.agentId.length > MAX_AGENT_ID_LENGTH) {
84
- return {
85
- ok: false,
86
- severity: 'block',
87
- reason: `agentId 长度 ${input.agentId.length} 超过最大 ${MAX_AGENT_ID_LENGTH}`,
88
- };
89
- }
90
- return { ok: true, severity: 'info', cleaned: trimmedName };
91
- }
92
- const BOOT_TIME = Date.now();
93
- export function healthCheck(version) {
94
- return {
95
- ok: true,
96
- version,
97
- uptime_sec: Math.floor((Date.now() - BOOT_TIME) / 1000),
98
- validators_loaded: [
99
- 'validateMessageInput',
100
- 'validateChannelInput',
101
- ],
102
- };
103
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * 通用名兜底. fallback 默认 '(未命名)'. 中文场景.
3
- */
4
- export function safeChannelName(input, fallback) {
5
- return safeNameInternal(input, fallback ?? '(未命名)', ['undefined', 'null', 'NaN']);
6
- }
7
- /**
8
- * 英文场景兜底, 默认 'Unknown'.
9
- */
10
- export function safePeerName(input, fallback) {
11
- return safeNameInternal(input, fallback ?? 'Unknown', ['undefined', 'null', 'NaN']);
12
- }
13
- /**
14
- * 兜底任意字段, 由 caller 指定默认 + 无效字面量集合.
15
- */
16
- export function safeName(input, fallback, invalidLiterals = ['undefined', 'null', 'NaN']) {
17
- return safeNameInternal(input, fallback, invalidLiterals);
18
- }
19
- function safeNameInternal(input, fallback, invalidLiterals) {
20
- if (input === undefined || input === null)
21
- return fallback;
22
- if (typeof input === 'number' && Number.isNaN(input))
23
- return fallback;
24
- const s = String(input).trim();
25
- if (!s)
26
- return fallback;
27
- for (const lit of invalidLiterals) {
28
- if (s === lit)
29
- return fallback;
30
- }
31
- return s;
32
- }