@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,118 +1,118 @@
|
|
|
1
|
-
// Real-wallet helpers (viem-backed), exposed as window.WalletViem for client.js.
|
|
2
|
-
// 浏览器侧执行, 不上链, 但地址/助记词/签名都符合 EVM 标准
|
|
3
|
-
// (BIP-39 mnemonic + secp256k1 keypair + EIP-55 checksum address + EIP-191 personal_sign).
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
generateMnemonic,
|
|
7
|
-
mnemonicToAccount,
|
|
8
|
-
privateKeyToAccount,
|
|
9
|
-
english,
|
|
10
|
-
} from 'https://esm.sh/viem@2.52.0/accounts';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* 生成一个全新的 EVM 钱包: 12 词助记词 + 派生账户 (BIP-44, m/44'/60'/0'/0/0)
|
|
14
|
-
* 返回: { mnemonic, address, privateKey }
|
|
15
|
-
* - mnemonic: 12 词英文助记词
|
|
16
|
-
* - address: EIP-55 checksum 后的 0x 开头地址
|
|
17
|
-
* - privateKey: 0x 开头的 32 字节私钥
|
|
18
|
-
*/
|
|
19
|
-
export function generateEVMWallet() {
|
|
20
|
-
const mnemonic = generateMnemonic(english, 128); // 128 bits = 12 words
|
|
21
|
-
const account = mnemonicToAccount(mnemonic, { accountIndex: 0 });
|
|
22
|
-
return {
|
|
23
|
-
mnemonic,
|
|
24
|
-
address: account.address,
|
|
25
|
-
// viem 不直接暴露 privateKey, 用 hdKeyToAccount 路径取
|
|
26
|
-
// 这里走一个变通: 拿地址后, 再用 createAccount 走不通...
|
|
27
|
-
// 实际: account.source 包含 HDKey, 我们让它返回 privateKey 字段
|
|
28
|
-
// 简化: 直接调一个 helper
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* 通过私钥恢复账户: 用于"导入已有钱包"流程
|
|
34
|
-
*/
|
|
35
|
-
export function importEVMWallet(privateKeyHex) {
|
|
36
|
-
const normalized = privateKeyHex.startsWith('0x') ? privateKeyHex : `0x${privateKeyHex}`;
|
|
37
|
-
const account = privateKeyToAccount(normalized);
|
|
38
|
-
return {
|
|
39
|
-
address: account.address,
|
|
40
|
-
privateKey: normalized,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 通过助记词恢复账户
|
|
46
|
-
*/
|
|
47
|
-
export function importEVMMnemonic(mnemonic) {
|
|
48
|
-
const account = mnemonicToAccount(mnemonic.trim(), { accountIndex: 0 });
|
|
49
|
-
return {
|
|
50
|
-
mnemonic: mnemonic.trim(),
|
|
51
|
-
address: account.address,
|
|
52
|
-
privateKey: extractPrivateKey(account),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 真实生成路径: 先生成助记词, 再恢复出账户, 顺带取出 privateKey
|
|
58
|
-
*/
|
|
59
|
-
export function generateRealWallet() {
|
|
60
|
-
const mnemonic = generateMnemonic(english, 128);
|
|
61
|
-
const account = mnemonicToAccount(mnemonic, { accountIndex: 0 });
|
|
62
|
-
return {
|
|
63
|
-
mnemonic,
|
|
64
|
-
address: account.address,
|
|
65
|
-
privateKey: extractPrivateKey(account),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* 对 channel DID 进行 EIP-191 personal_sign 签名, 证明钱包所有权
|
|
71
|
-
* 返回 { address, signature, message, did }
|
|
72
|
-
* - message: 实际签名的原文, 服务端需用 recoverMessage 校验
|
|
73
|
-
* - signature: 0x 开头 65 字节签名 (r||s||v)
|
|
74
|
-
*/
|
|
75
|
-
export async function signDIDChallenge(privateKeyHex, did, channelId) {
|
|
76
|
-
const normalized = privateKeyHex.startsWith('0x') ? privateKeyHex : `0x${privateKeyHex}`;
|
|
77
|
-
const account = privateKeyToAccount(normalized);
|
|
78
|
-
const message = buildChallengeMessage(did, channelId);
|
|
79
|
-
const signature = await account.signMessage({ message });
|
|
80
|
-
return {
|
|
81
|
-
address: account.address,
|
|
82
|
-
signature,
|
|
83
|
-
message,
|
|
84
|
-
did,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function buildChallengeMessage(did, channelId) {
|
|
89
|
-
return [
|
|
90
|
-
'Bolloon Agent Wallet Binding',
|
|
91
|
-
`Channel ID: ${channelId}`,
|
|
92
|
-
`Agent DID: ${did}`,
|
|
93
|
-
`Issued At: ${new Date().toISOString()}`,
|
|
94
|
-
].join('\n');
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// 从 viem HDKey 账户里取出 privateKey (Uint8Array) 转成 0x 开头 hex
|
|
98
|
-
function extractPrivateKey(account) {
|
|
99
|
-
const hdKey = account.getHdKey ? account.getHdKey() : null;
|
|
100
|
-
if (!hdKey || !hdKey.privateKey) {
|
|
101
|
-
throw new Error('无法从助记词派生私钥');
|
|
102
|
-
}
|
|
103
|
-
return '0x' + Array.from(hdKey.privateKey, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const api = {
|
|
107
|
-
generateRealWallet,
|
|
108
|
-
importEVMWallet,
|
|
109
|
-
importEVMMnemonic,
|
|
110
|
-
signDIDChallenge,
|
|
111
|
-
buildChallengeMessage,
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
if (typeof window !== 'undefined') {
|
|
115
|
-
window.WalletViem = api;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export default api;
|
|
1
|
+
// Real-wallet helpers (viem-backed), exposed as window.WalletViem for client.js.
|
|
2
|
+
// 浏览器侧执行, 不上链, 但地址/助记词/签名都符合 EVM 标准
|
|
3
|
+
// (BIP-39 mnemonic + secp256k1 keypair + EIP-55 checksum address + EIP-191 personal_sign).
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
generateMnemonic,
|
|
7
|
+
mnemonicToAccount,
|
|
8
|
+
privateKeyToAccount,
|
|
9
|
+
english,
|
|
10
|
+
} from 'https://esm.sh/viem@2.52.0/accounts';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 生成一个全新的 EVM 钱包: 12 词助记词 + 派生账户 (BIP-44, m/44'/60'/0'/0/0)
|
|
14
|
+
* 返回: { mnemonic, address, privateKey }
|
|
15
|
+
* - mnemonic: 12 词英文助记词
|
|
16
|
+
* - address: EIP-55 checksum 后的 0x 开头地址
|
|
17
|
+
* - privateKey: 0x 开头的 32 字节私钥
|
|
18
|
+
*/
|
|
19
|
+
export function generateEVMWallet() {
|
|
20
|
+
const mnemonic = generateMnemonic(english, 128); // 128 bits = 12 words
|
|
21
|
+
const account = mnemonicToAccount(mnemonic, { accountIndex: 0 });
|
|
22
|
+
return {
|
|
23
|
+
mnemonic,
|
|
24
|
+
address: account.address,
|
|
25
|
+
// viem 不直接暴露 privateKey, 用 hdKeyToAccount 路径取
|
|
26
|
+
// 这里走一个变通: 拿地址后, 再用 createAccount 走不通...
|
|
27
|
+
// 实际: account.source 包含 HDKey, 我们让它返回 privateKey 字段
|
|
28
|
+
// 简化: 直接调一个 helper
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 通过私钥恢复账户: 用于"导入已有钱包"流程
|
|
34
|
+
*/
|
|
35
|
+
export function importEVMWallet(privateKeyHex) {
|
|
36
|
+
const normalized = privateKeyHex.startsWith('0x') ? privateKeyHex : `0x${privateKeyHex}`;
|
|
37
|
+
const account = privateKeyToAccount(normalized);
|
|
38
|
+
return {
|
|
39
|
+
address: account.address,
|
|
40
|
+
privateKey: normalized,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 通过助记词恢复账户
|
|
46
|
+
*/
|
|
47
|
+
export function importEVMMnemonic(mnemonic) {
|
|
48
|
+
const account = mnemonicToAccount(mnemonic.trim(), { accountIndex: 0 });
|
|
49
|
+
return {
|
|
50
|
+
mnemonic: mnemonic.trim(),
|
|
51
|
+
address: account.address,
|
|
52
|
+
privateKey: extractPrivateKey(account),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 真实生成路径: 先生成助记词, 再恢复出账户, 顺带取出 privateKey
|
|
58
|
+
*/
|
|
59
|
+
export function generateRealWallet() {
|
|
60
|
+
const mnemonic = generateMnemonic(english, 128);
|
|
61
|
+
const account = mnemonicToAccount(mnemonic, { accountIndex: 0 });
|
|
62
|
+
return {
|
|
63
|
+
mnemonic,
|
|
64
|
+
address: account.address,
|
|
65
|
+
privateKey: extractPrivateKey(account),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 对 channel DID 进行 EIP-191 personal_sign 签名, 证明钱包所有权
|
|
71
|
+
* 返回 { address, signature, message, did }
|
|
72
|
+
* - message: 实际签名的原文, 服务端需用 recoverMessage 校验
|
|
73
|
+
* - signature: 0x 开头 65 字节签名 (r||s||v)
|
|
74
|
+
*/
|
|
75
|
+
export async function signDIDChallenge(privateKeyHex, did, channelId) {
|
|
76
|
+
const normalized = privateKeyHex.startsWith('0x') ? privateKeyHex : `0x${privateKeyHex}`;
|
|
77
|
+
const account = privateKeyToAccount(normalized);
|
|
78
|
+
const message = buildChallengeMessage(did, channelId);
|
|
79
|
+
const signature = await account.signMessage({ message });
|
|
80
|
+
return {
|
|
81
|
+
address: account.address,
|
|
82
|
+
signature,
|
|
83
|
+
message,
|
|
84
|
+
did,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function buildChallengeMessage(did, channelId) {
|
|
89
|
+
return [
|
|
90
|
+
'Bolloon Agent Wallet Binding',
|
|
91
|
+
`Channel ID: ${channelId}`,
|
|
92
|
+
`Agent DID: ${did}`,
|
|
93
|
+
`Issued At: ${new Date().toISOString()}`,
|
|
94
|
+
].join('\n');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 从 viem HDKey 账户里取出 privateKey (Uint8Array) 转成 0x 开头 hex
|
|
98
|
+
function extractPrivateKey(account) {
|
|
99
|
+
const hdKey = account.getHdKey ? account.getHdKey() : null;
|
|
100
|
+
if (!hdKey || !hdKey.privateKey) {
|
|
101
|
+
throw new Error('无法从助记词派生私钥');
|
|
102
|
+
}
|
|
103
|
+
return '0x' + Array.from(hdKey.privateKey, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const api = {
|
|
107
|
+
generateRealWallet,
|
|
108
|
+
importEVMWallet,
|
|
109
|
+
importEVMMnemonic,
|
|
110
|
+
signDIDChallenge,
|
|
111
|
+
buildChallengeMessage,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
if (typeof window !== 'undefined') {
|
|
115
|
+
window.WalletViem = api;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default api;
|