@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.
- package/README.md +467 -467
- package/bin/bolloon-cli.cjs +183 -183
- package/bin/bolloon.cjs +0 -0
- package/bin/bolloon.js +157 -0
- package/dist/agents/agent-manifest-protocol.js +0 -52
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/pi-sdk.js +287 -1213
- package/dist/agents/shell-guard.js +2 -2
- package/dist/agents/workflow-pivot-loop.js +2 -81
- 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 -26
- package/dist/bollharness-integration/integration.js +0 -71
- package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
- package/dist/bollharness-integration/skill-adapter.js +127 -52
- package/dist/bootstrap/context-collector.js +3 -6
- package/dist/bootstrap/lifecycle-hooks.js +1 -15
- package/dist/cli-entry.js +35 -39
- package/dist/constraint-runtime/src/_archive_helper.js +9 -0
- package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
- package/dist/constraint-runtime/src/agent/index.js +1 -0
- package/dist/constraint-runtime/src/assistant/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
- package/dist/constraint-runtime/src/bridge/index.js +12 -0
- package/dist/constraint-runtime/src/buddy/index.js +12 -0
- package/dist/constraint-runtime/src/cli/index.js +12 -0
- package/dist/constraint-runtime/src/command_graph.js +10 -0
- package/dist/constraint-runtime/src/commands.js +60 -0
- package/dist/constraint-runtime/src/components/index.js +12 -0
- package/dist/constraint-runtime/src/constants/index.js +12 -0
- package/dist/constraint-runtime/src/constraint/budget.js +22 -0
- package/dist/constraint-runtime/src/constraint/index.js +2 -0
- package/dist/constraint-runtime/src/constraint/permission.js +20 -0
- package/dist/constraint-runtime/src/context.js +30 -0
- package/dist/constraint-runtime/src/coordinator/index.js +12 -0
- package/dist/constraint-runtime/src/cost_hook.js +4 -0
- package/dist/constraint-runtime/src/cost_tracker.js +8 -0
- package/dist/constraint-runtime/src/deferred_init.js +10 -0
- package/dist/constraint-runtime/src/direct_modes.js +6 -0
- package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
- package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
- package/dist/constraint-runtime/src/execution_registry.js +44 -0
- package/dist/constraint-runtime/src/history.js +9 -0
- package/dist/constraint-runtime/src/hooks/index.js +12 -0
- package/dist/constraint-runtime/src/index.js +26 -0
- package/dist/constraint-runtime/src/ink.js +4 -0
- package/dist/constraint-runtime/src/keybindings/index.js +12 -0
- package/dist/constraint-runtime/src/memdir/index.js +12 -0
- package/dist/constraint-runtime/src/migrations/index.js +12 -0
- package/dist/constraint-runtime/src/models.js +1 -0
- package/dist/constraint-runtime/src/moreright/index.js +12 -0
- package/dist/constraint-runtime/src/native_ts/index.js +12 -0
- package/dist/constraint-runtime/src/output_styles/index.js +12 -0
- package/dist/constraint-runtime/src/parity_audit.js +12 -0
- package/dist/constraint-runtime/src/plugins/index.js +12 -0
- package/dist/constraint-runtime/src/port_manifest.js +11 -0
- package/dist/constraint-runtime/src/prefetch.js +9 -0
- package/dist/constraint-runtime/src/query.js +1 -0
- package/dist/constraint-runtime/src/remote/index.js +12 -0
- package/dist/constraint-runtime/src/remote_runtime.js +9 -0
- package/dist/constraint-runtime/src/runtime/index.js +1 -0
- package/dist/constraint-runtime/src/runtime/session.js +35 -0
- package/dist/constraint-runtime/src/schemas/index.js +12 -0
- package/dist/constraint-runtime/src/screens/index.js +12 -0
- package/dist/constraint-runtime/src/server/index.js +12 -0
- package/dist/constraint-runtime/src/services/index.js +12 -0
- package/dist/constraint-runtime/src/session_store.js +22 -0
- package/dist/constraint-runtime/src/setup.js +30 -0
- package/dist/constraint-runtime/src/skills/index.js +1 -0
- package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
- package/dist/constraint-runtime/src/state/index.js +12 -0
- package/dist/constraint-runtime/src/system_init.js +20 -0
- package/dist/constraint-runtime/src/thinking/engine.js +42 -0
- package/dist/constraint-runtime/src/thinking/index.js +1 -0
- package/dist/constraint-runtime/src/tool_pool.js +8 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools.js +80 -0
- package/dist/constraint-runtime/src/transcript.js +19 -0
- package/dist/constraint-runtime/src/types/index.js +12 -0
- package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
- package/dist/constraint-runtime/src/utils/index.js +12 -0
- package/dist/constraint-runtime/src/vim/index.js +12 -0
- package/dist/constraint-runtime/src/voice/index.js +12 -0
- package/dist/constraint-runtime/tests/agent.test.js +16 -0
- package/dist/constraint-runtime/tests/constraint.test.js +41 -0
- package/dist/constraint-runtime/tests/skill.test.js +19 -0
- package/dist/constraint-runtime/tests/thinking.test.js +22 -0
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron-preload.js +1 -18
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js +168 -3
- package/dist/electron.js.map +1 -1
- package/dist/index.js +116 -136
- package/dist/llm/config-store.js +8 -24
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +85 -126
- 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-visitor.md +19 -19
- 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/hibs_reminders.md +15 -15
- package/dist/llm/system-prompt/layers/core/identity.md +37 -37
- 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/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/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/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/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 +0 -11
- 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/web/api-config.html +520 -520
- package/dist/web/client.js +2917 -3791
- package/dist/web/components/p2p/index.js +234 -276
- package/dist/web/components/wallet-viem.mjs +118 -118
- package/dist/web/index.html +374 -373
- package/dist/web/manifest.json +20 -20
- package/dist/web/server.js +23 -775
- package/dist/web/style.css +4737 -4737
- package/dist/web/ui/message-renderer.js +373 -451
- package/dist/web/ui/step-timeline.js +255 -351
- package/package.json +160 -160
- package/scripts/build-cli.js +215 -215
- package/scripts/build-web.ts +125 -125
- package/scripts/postinstall.js +152 -152
- package/bin/bolloon-daemon.sh +0 -207
- package/bin/ipfs +0 -0
- package/dist/agents/chat-segmenter.js +0 -298
- package/dist/agents/judgment-protocol.js +0 -479
- package/dist/agents/parse-tool-call.js +0 -304
- package/dist/agents/peer-manifest-loader.js +0 -210
- package/dist/agents/react-loop.js +0 -120
- package/dist/agents/session-store.js +0 -171
- package/dist/agents/tool-registry.js +0 -136
- package/dist/bootstrap/chat-archiver.js +0 -276
- package/dist/bootstrap/memory-compressor.js +0 -170
- package/dist/bootstrap/persona-loader.js +0 -94
- package/dist/electron/config.js +0 -16
- package/dist/electron/config.js.map +0 -1
- package/dist/electron/dialogs.js +0 -71
- package/dist/electron/dialogs.js.map +0 -1
- package/dist/electron/first-run.js +0 -129
- package/dist/electron/first-run.js.map +0 -1
- package/dist/electron/ipc.js +0 -16
- package/dist/electron/ipc.js.map +0 -1
- package/dist/electron/logger.js +0 -77
- package/dist/electron/logger.js.map +0 -1
- package/dist/electron/main.js +0 -60
- package/dist/electron/main.js.map +0 -1
- package/dist/electron/menu.js +0 -140
- package/dist/electron/menu.js.map +0 -1
- package/dist/electron/paths.js +0 -33
- package/dist/electron/paths.js.map +0 -1
- package/dist/electron/server.js +0 -74
- package/dist/electron/server.js.map +0 -1
- package/dist/electron/tray.js +0 -73
- package/dist/electron/tray.js.map +0 -1
- package/dist/electron/window.js +0 -69
- package/dist/electron/window.js.map +0 -1
- package/dist/network/local-inbox-bus.js +0 -73
- package/dist/network/p2p-outbox.js +0 -161
- package/dist/network/peer-fs.js +0 -420
- package/dist/network/peer-resource-bridge.js +0 -216
- package/dist/web/components/p2p/P2PModal.js +0 -188
- package/dist/web/components/p2p/p2p-modal.js +0 -664
- package/dist/web/components/p2p/p2p-tools.js +0 -248
- package/dist/web/input-validator.js +0 -103
- 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
|
-
}
|