@fased/fased 0.1.62 → 0.1.64
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/CHANGELOG.md +32 -0
- package/README.md +38 -30
- package/config/dependency-ownership.json +1 -1
- package/config/signer-policies/README.md +49 -0
- package/config/signer-policies/agent.json.template +32 -0
- package/config/signer-policies/mining.json.template +69 -0
- package/config/signer-policies/network.json.template +5 -0
- package/config/signer-policies/vault.json.template +70 -0
- package/config/signer-protocol-v2.json +76 -0
- package/config/typescript-noemit-baseline.json +680 -0
- package/dist/agents/auth-profiles/store.js +267 -31
- package/dist/agents/bash-tools.exec.js +10 -4
- package/dist/agents/current-model-catalog.js +3 -3
- package/dist/agents/memory-search.js +7 -1
- package/dist/agents/model-catalog-access.js +1 -2
- package/dist/agents/model-catalog-snapshot.js +1 -1
- package/dist/agents/model-catalog-source.js +1 -1
- package/dist/agents/model-metadata.js +1 -1
- package/dist/agents/model-selection.js +2 -28
- package/dist/agents/models-config.providers.js +6 -6
- package/dist/agents/pi-embedded-runner/compact.js +15 -7
- package/dist/agents/pi-embedded-runner/model.js +1 -1
- package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
- package/dist/agents/pi-embedded-runner/run.js +2 -0
- package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
- package/dist/agents/pi-tool-definition-adapter.js +16 -1
- package/dist/agents/pi-tools.js +2 -1
- package/dist/agents/sandbox/config.js +1 -1
- package/dist/agents/sandbox/context.js +27 -2
- package/dist/agents/skills/env-overrides.js +38 -28
- package/dist/agents/skills/trust.js +93 -0
- package/dist/agents/skills/workspace.js +128 -0
- package/dist/agents/skills-clawhub.js +36 -11
- package/dist/agents/skills-marketplace-scan.js +49 -0
- package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
- package/dist/agents/tools/mining-tool.js +1 -1
- package/dist/agents/tools/session-status-tool.js +1 -1
- package/dist/agents/tools/wallet-action-tool.js +172 -36
- package/dist/agents/tools/wallet-skill-policy.js +65 -23
- package/dist/agents/tools/wallet-tool.js +7 -11
- package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
- package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
- package/dist/auto-reply/reply/directive-handling.model.js +2 -1
- package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
- package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
- package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
- package/dist/auto-reply/reply/model-selection.js +7 -4
- package/dist/auto-reply/reply/session-reset-model.js +4 -4
- package/dist/brand.js +1 -1
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/channel-web.js +2 -2
- package/dist/cli/gateway-cli/run.js +8 -0
- package/dist/cli/program/command-registry.js +1 -1
- package/dist/cli/program/register.onboard.js +2 -3
- package/dist/cli/program/register.wallet.js +16 -123
- package/dist/cli/providers-cli.js +1 -1
- package/dist/cli/sat-cli.js +129 -2
- package/dist/cli/update-cli/update-command.js +260 -11
- package/dist/commands/auth-choice.apply.api-providers.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-legacy-config.js +2 -13
- package/dist/commands/model-picker.js +6 -6
- package/dist/commands/models/auth.js +1 -1
- package/dist/commands/onboard-auth.config-gateways.js +1 -1
- package/dist/commands/onboard-auth.credentials.js +32 -8
- package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
- package/dist/commands/onboard-non-interactive/local.js +5 -1
- package/dist/commands/wallet.js +568 -1911
- package/dist/config/config.js +2 -2
- package/dist/config/io.js +64 -2
- package/dist/config/schema.help.js +8 -7
- package/dist/config/schema.labels.js +5 -4
- package/dist/config/zod-schema.agent-runtime.js +1 -0
- package/dist/config/zod-schema.js +5 -0
- package/dist/control-ui/assets/{app-DLil9VO1.js → app-bR-fO5ty.js} +1511 -1555
- package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
- package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
- package/dist/control-ui/assets/{index-DdE_NIXo.js → index-ckCxHwjy.js} +3 -3
- package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
- package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
- package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
- package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
- package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
- package/dist/control-ui/index.html +1 -1
- package/dist/control-ui/version.json +1 -1
- package/dist/daemon/systemd-system.js +56 -50
- package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
- package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
- package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
- package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
- package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
- package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
- package/dist/federation/auto-connect.js +98 -8
- package/dist/federation/marketplace-capability-adapter.js +33 -7
- package/dist/federation/marketplace-delivery-outbox.js +196 -0
- package/dist/federation/marketplace-delivery.js +351 -215
- package/dist/federation/marketplace-direct-payment.js +272 -141
- package/dist/federation/marketplace-escrow.js +607 -249
- package/dist/federation/marketplace-settlement-ledger.js +352 -0
- package/dist/federation/offers.js +9 -7
- package/dist/federation/peer-auth-v2.js +529 -0
- package/dist/gateway/a2a-http.js +425 -96
- package/dist/gateway/a2a-settlement.js +259 -153
- package/dist/gateway/a2a-task-store.js +524 -0
- package/dist/gateway/auth.js +38 -2
- package/dist/gateway/config-reload.js +46 -33
- package/dist/gateway/durable-capacity.js +31 -0
- package/dist/gateway/federation-http.js +540 -135
- package/dist/gateway/federation-marketplace-run-store.js +397 -0
- package/dist/gateway/federation-marketplace.js +535 -230
- package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
- package/dist/gateway/security-path.js +1 -1
- package/dist/gateway/server-http.js +1084 -1205
- package/dist/gateway/server-methods/models.js +1 -1
- package/dist/gateway/server-methods/secrets.js +40 -0
- package/dist/gateway/server-methods.js +1 -2
- package/dist/gateway/server-reload-handlers.js +196 -66
- package/dist/gateway/server-runtime-config.js +1 -1
- package/dist/gateway/server-secrets-runtime.js +288 -0
- package/dist/gateway/server.impl.js +73 -42
- package/dist/gateway/sessions-patch.js +3 -5
- package/dist/index.js +4 -2
- package/dist/infra/fasedhub.js +64 -1
- package/dist/infra/local-source-paired-update.js +538 -0
- package/dist/infra/restart.js +41 -10
- package/dist/infra/update-runner.js +96 -0
- package/dist/light-update-status.js +11 -11
- package/dist/memory/backend-config.js +2 -1
- package/dist/memory/session-files.js +16 -2
- package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
- package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
- package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-BYxAt775.js} +27 -27
- package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
- package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
- package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
- package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
- package/dist/plugin-sdk/channel-plugin-common.js +4 -4
- package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
- package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DIRHG2gJ.js} +1 -1
- package/dist/plugin-sdk/command-status.d.ts +2 -2
- package/dist/plugin-sdk/command-status.js +27 -27
- package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
- package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
- package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
- package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-BOT7kHb6.js} +6779 -3696
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/discord.d.ts +6 -6
- package/dist/plugin-sdk/discord.js +19 -19
- package/dist/plugin-sdk/file-lock.js +35 -4
- package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
- package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
- package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
- package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
- package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
- package/dist/plugin-sdk/index.d.ts +21 -39
- package/dist/plugin-sdk/index.js +29 -29
- package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
- package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
- package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
- package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
- package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
- package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
- package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-BCFDaqJ-.js} +31 -31
- package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-BgbjRiPM.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DFf87SMM.js} +27 -27
- package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
- package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
- package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
- package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
- package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
- package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
- package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
- package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
- package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
- package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
- package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
- package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
- package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
- package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
- package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
- package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
- package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
- package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
- package/dist/plugin-sdk/sat-runtime.js +29 -29
- package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
- package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
- package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
- package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
- package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
- package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
- package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
- package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BUTt8cxK.js} +39 -39
- package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
- package/dist/plugin-sdk/slack.d.ts +6 -6
- package/dist/plugin-sdk/slack.js +9 -9
- package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-D0wHVqjt.js} +3 -3
- package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
- package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
- package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-CC_qN4v0.js} +30 -30
- package/dist/plugin-sdk/telegram.d.ts +6 -6
- package/dist/plugin-sdk/telegram.js +8 -8
- package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
- package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
- package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
- package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-C3avNytw.d.ts} +3 -4
- package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
- package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-DWfbSAaM.d.ts} +2 -2
- package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
- package/dist/plugin-sdk/{web-CInY-lCv.js → web-BXsJ1vqe.js} +32 -32
- package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
- package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
- package/dist/plugin-sdk/whatsapp.d.ts +13 -13
- package/dist/plugin-sdk/whatsapp.js +12 -12
- package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
- package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
- package/dist/providers/refresh.js +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/secrets/apply.js +1 -1
- package/dist/secrets/runtime.js +1 -1
- package/dist/wallet/external-submission-ledger.js +376 -0
- package/dist/wallet/legacy-embedded-keystore.js +40 -0
- package/dist/wallet/local-socket-signer-archive.js +30 -0
- package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
- package/dist/wallet/local-socket-signer-policy.js +166 -0
- package/dist/wallet/local-socket-signer-protocol.js +561 -118
- package/dist/wallet/native-signer-wallet-id.js +25 -0
- package/dist/wallet/providers/alchemy-adapter.js +3 -0
- package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
- package/dist/wallet/providers/turnkey-adapter.js +292 -34
- package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
- package/dist/wallet/signer-network-admin.js +184 -0
- package/dist/wallet/signer-protocol-v2.generated.js +90 -0
- package/dist/wallet/solana-bond-signing.js +157 -69
- package/dist/wallet/solana-reviewed-transaction.js +375 -0
- package/dist/wallet/solana-swap.js +520 -64
- package/dist/wallet/solana-transaction-inspection.js +106 -4
- package/dist/wallet/solana-trigger.js +658 -320
- package/dist/wallet/turnkey-reviewed-state.js +370 -0
- package/dist/wallet/wallet-approval-auth.js +17 -28
- package/dist/wallet/wallet-atomic-state.js +53 -0
- package/dist/wallet/wallet-canary.js +0 -1
- package/dist/wallet/wallet-inbound-events.js +16 -11
- package/dist/wallet/wallet-policy-simulation.js +1 -1
- package/dist/wallet/wallet-policy.js +90 -36
- package/dist/wallet/wallet-provider-capabilities.js +28 -4
- package/dist/wallet/wallet-provider-registry.js +57 -44
- package/dist/wallet/wallet-provider-resolver.js +62 -63
- package/dist/wallet/wallet-runtime-config.js +28 -41
- package/dist/wallet/wallet-secrets-store.js +22 -0
- package/dist/wallet/wallet-send-approvals.js +1891 -589
- package/dist/wallet/wallet-send-execution-ledger.js +292 -0
- package/dist/wallet/wallet-settlement-links.js +14 -13
- package/dist/wallet/wallet-standard-review.js +353 -0
- package/dist/wallet/wallet-status.js +0 -9
- package/dist/wallet/wallet-task-ledger.js +16 -2
- package/dist/web/auto-reply/heartbeat-runner.js +1 -1
- package/dist/web/auto-reply/monitor.js +2 -2
- package/dist/wizard/host-security-capability.js +14 -23
- package/dist/wizard/onboarding.finalize.js +63 -184
- package/dist/wizard/onboarding.host-security.js +117 -1367
- package/dist/wizard/onboarding.js +172 -217
- package/dist/wizard/onboarding.wallet.js +232 -785
- package/extensions/acpx/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/fased-federation/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +12 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +2 -2
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +12 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +12 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/sat-mining/index.ts +498 -153
- package/extensions/sat-mining/package.json +1 -1
- package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
- package/extensions/sat-mining/src/audit-store.ts +50 -5
- package/extensions/sat-mining/src/claim-service.ts +85 -14
- package/extensions/sat-mining/src/config.ts +9 -0
- package/extensions/sat-mining/src/cycle-progress.ts +16 -8
- package/extensions/sat-mining/src/epoch-service.ts +9 -5
- package/extensions/sat-mining/src/gateway-runner.ts +21 -1
- package/extensions/sat-mining/src/protocol-contract.ts +45 -1
- package/extensions/sat-mining/src/recovery-service.ts +312 -0
- package/extensions/sat-mining/src/round-watcher.ts +391 -81
- package/extensions/sat-mining/src/rpc-read.ts +330 -89
- package/extensions/sat-mining/src/runtime.ts +14 -0
- package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
- package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
- package/extensions/sat-mining/src/solana-submit.ts +1199 -428
- package/extensions/sat-mining/src/submission-ledger.ts +433 -0
- package/extensions/signal/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +12 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +12 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +12 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +12 -0
- package/extensions/zalouser/package.json +1 -1
- package/install.sh +4955 -0
- package/package.json +23 -5
- package/scripts/fased-host-updater.mjs +1421 -0
- package/scripts/fased-host-updaterctl.mjs +186 -0
- package/scripts/fased-managed-service.sh +36 -0
- package/scripts/fased-managed-updater.mjs +3065 -156
- package/scripts/fased-signer-enroll-hosting.sh +275 -0
- package/scripts/fased-signer-network-hosting.sh +143 -0
- package/scripts/fased-signer-owner-policy.mjs +1430 -0
- package/scripts/fased-signer-policy-hosting.sh +50 -0
- package/scripts/fased-signer-policy-local.sh +26 -0
- package/scripts/hosted-release-manifest.mjs +185 -0
- package/scripts/install-fased-signerd.sh +183 -108
- package/scripts/install-managed-runtime.mjs +212 -10
- package/scripts/managed-runtime-layout.mjs +75 -3
- package/scripts/migrate-hosted-signer-v2.mjs +58 -0
- package/scripts/start-managed.sh +169 -360
- package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
- package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
- package/dist/wallet/local-socket-signer-broker.js +0 -224
- package/dist/wallet/local-socket-signer-custody.js +0 -42
- package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
- package/dist/wallet/providers/privy-adapter.js +0 -80
- package/dist/wallet/wallet-custody.js +0 -1836
|
@@ -2,6 +2,7 @@ import { ensureWalletStateDir, resolveWalletRuntimeConfig } from "./wallet-runti
|
|
|
2
2
|
import { readWalletProviderRegistry, resolveWalletUserRole } from "./wallet-provider-registry.js";
|
|
3
3
|
import { assertValidSolanaAddress } from "./solana-address.js";
|
|
4
4
|
import { tryResolveSatRuntimeIds } from "../config/sat-runtime-ids.js";
|
|
5
|
+
import { serializeWalletState, writeWalletStateFileAtomically } from "./wallet-atomic-state.js";
|
|
5
6
|
import syncFs from "node:fs";
|
|
6
7
|
import path from "node:path";
|
|
7
8
|
|
|
@@ -44,11 +45,28 @@ function normalizeWalletUsageBucket(raw) {
|
|
|
44
45
|
return null;
|
|
45
46
|
}
|
|
46
47
|
const value = raw;
|
|
48
|
+
if (!isNonNegativeIntegerString(value.solanaSpent)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
if (!value.solanaTokenSpent || typeof value.solanaTokenSpent !== "object" || Array.isArray(value.solanaTokenSpent)) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const solanaTokenSpent = {};
|
|
55
|
+
for (const [mintRaw, spent] of Object.entries(value.solanaTokenSpent)) {
|
|
56
|
+
const mint = mintRaw.trim();
|
|
57
|
+
if (!mint || !isNonNegativeIntegerString(spent)) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
solanaTokenSpent[mint] = spent;
|
|
61
|
+
}
|
|
47
62
|
return {
|
|
48
|
-
solanaSpent:
|
|
49
|
-
solanaTokenSpent
|
|
63
|
+
solanaSpent: value.solanaSpent,
|
|
64
|
+
solanaTokenSpent
|
|
50
65
|
};
|
|
51
66
|
}
|
|
67
|
+
function isNonNegativeIntegerString(value) {
|
|
68
|
+
return typeof value === "string" && /^\d+$/.test(value);
|
|
69
|
+
}
|
|
52
70
|
function loadLedger(paths) {
|
|
53
71
|
const fallback = defaultWalletUsageLedger();
|
|
54
72
|
if (!syncFs.existsSync(paths.dailyUsagePath)) {
|
|
@@ -58,12 +76,15 @@ function loadLedger(paths) {
|
|
|
58
76
|
const raw = syncFs.readFileSync(paths.dailyUsagePath, "utf8");
|
|
59
77
|
const parsed = JSON.parse(raw);
|
|
60
78
|
if (parsed && parsed.version === 2 && typeof parsed.date === "string") {
|
|
61
|
-
|
|
79
|
+
if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
|
|
80
|
+
throw new Error("wallet usage ledger wallets must be an object");
|
|
81
|
+
}
|
|
82
|
+
const walletsRaw = parsed.wallets;
|
|
62
83
|
const wallets = {};
|
|
63
84
|
for (const [walletId, bucketRaw] of Object.entries(walletsRaw)) {
|
|
64
85
|
const bucket = normalizeWalletUsageBucket(bucketRaw);
|
|
65
86
|
if (!walletId.trim() || !bucket) {
|
|
66
|
-
|
|
87
|
+
throw new Error(`wallet usage ledger contains an invalid bucket for ${walletId || "?"}`);
|
|
67
88
|
}
|
|
68
89
|
wallets[walletId.trim()] = bucket;
|
|
69
90
|
}
|
|
@@ -73,24 +94,23 @@ function loadLedger(paths) {
|
|
|
73
94
|
wallets
|
|
74
95
|
};
|
|
75
96
|
}
|
|
76
|
-
if (parsed && parsed.version === 1) {
|
|
97
|
+
if (parsed && parsed.version === 1 && typeof parsed.date === "string" && isNonNegativeIntegerString(parsed.solanaSpent)) {
|
|
77
98
|
return {
|
|
78
99
|
version: 2,
|
|
79
|
-
date:
|
|
100
|
+
date: parsed.date,
|
|
80
101
|
wallets: { [LEDGER_LEGACY_GLOBAL_BUCKET_ID]: {
|
|
81
|
-
solanaSpent:
|
|
102
|
+
solanaSpent: parsed.solanaSpent,
|
|
82
103
|
solanaTokenSpent: {}
|
|
83
104
|
} }
|
|
84
105
|
};
|
|
85
106
|
}
|
|
86
|
-
|
|
87
|
-
|
|
107
|
+
throw new Error("wallet usage ledger has an unsupported shape");
|
|
108
|
+
} catch (error) {
|
|
109
|
+
throw new Error("wallet usage ledger is unreadable; refusing to reset spend counters", { cause: error });
|
|
110
|
+
}
|
|
88
111
|
}
|
|
89
112
|
function writeLedger(paths, ledger) {
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
syncFs.chmodSync(paths.dailyUsagePath, 384);
|
|
93
|
-
} catch {}
|
|
113
|
+
writeWalletStateFileAtomically(paths.dailyUsagePath, serializeWalletState(ledger));
|
|
94
114
|
}
|
|
95
115
|
function resolveWalletUsageBucket(ledger, walletId) {
|
|
96
116
|
const normalizedWalletId = walletId?.trim() || DEFAULT_EFFECTIVE_WALLET_ID;
|
|
@@ -294,7 +314,13 @@ function resolveWalletRoleForId(params) {
|
|
|
294
314
|
if (walletId && storedPurpose === "mining") {
|
|
295
315
|
return "mining";
|
|
296
316
|
}
|
|
297
|
-
if (walletId &&
|
|
317
|
+
if (walletId && storedPurpose === "vault") {
|
|
318
|
+
return "vault";
|
|
319
|
+
}
|
|
320
|
+
if (walletId && storedPurpose === "agent") {
|
|
321
|
+
return "agent";
|
|
322
|
+
}
|
|
323
|
+
if (walletId && registry.defaultWalletId && walletId === registry.defaultWalletId) {
|
|
298
324
|
return "agent";
|
|
299
325
|
}
|
|
300
326
|
return "vault";
|
|
@@ -351,14 +377,17 @@ function readWalletPolicyState(env = process.env) {
|
|
|
351
377
|
const raw = syncFs.readFileSync(statePath, "utf8");
|
|
352
378
|
const parsed = JSON.parse(raw);
|
|
353
379
|
if (parsed.version !== 1) {
|
|
354
|
-
|
|
380
|
+
throw new Error("wallet policy state version is unsupported");
|
|
355
381
|
}
|
|
356
|
-
|
|
382
|
+
if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
|
|
383
|
+
throw new Error("wallet policy wallets must be an object");
|
|
384
|
+
}
|
|
385
|
+
const walletsRaw = parsed.wallets;
|
|
357
386
|
const wallets = {};
|
|
358
387
|
for (const [walletId, recordRaw] of Object.entries(walletsRaw)) {
|
|
359
388
|
const record = normalizeStoredWalletPolicyRecord(recordRaw);
|
|
360
|
-
if (!walletId.trim() || !record) {
|
|
361
|
-
|
|
389
|
+
if (!walletId.trim() || !record || record.walletId !== walletId.trim()) {
|
|
390
|
+
throw new Error(`wallet policy contains an invalid record for ${walletId || "?"}`);
|
|
362
391
|
}
|
|
363
392
|
wallets[walletId.trim()] = record;
|
|
364
393
|
}
|
|
@@ -367,17 +396,14 @@ function readWalletPolicyState(env = process.env) {
|
|
|
367
396
|
updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : fallback.updatedAt,
|
|
368
397
|
wallets
|
|
369
398
|
};
|
|
370
|
-
} catch {
|
|
371
|
-
|
|
399
|
+
} catch (error) {
|
|
400
|
+
throw new Error("wallet policy state is unreadable; refusing to replace persisted policy", { cause: error });
|
|
372
401
|
}
|
|
373
402
|
}
|
|
374
403
|
function writeWalletPolicyState(state, env = process.env) {
|
|
375
404
|
const paths = ensureWalletStateDir(env);
|
|
376
405
|
const statePath = resolveWalletPolicyStatePath(paths);
|
|
377
|
-
|
|
378
|
-
try {
|
|
379
|
-
syncFs.chmodSync(statePath, 384);
|
|
380
|
-
} catch {}
|
|
406
|
+
writeWalletStateFileAtomically(statePath, serializeWalletState(state));
|
|
381
407
|
}
|
|
382
408
|
function buildResolvedPolicyFromDefaults(defaults) {
|
|
383
409
|
return {
|
|
@@ -573,7 +599,7 @@ function applyWalletPolicyConfig(params) {
|
|
|
573
599
|
const profile = resolveWalletRolePolicyProfile(role, env);
|
|
574
600
|
return cloneWalletConfigWithPolicy(params.config, buildResolvedPolicyFromDefaults(profile.defaults));
|
|
575
601
|
}
|
|
576
|
-
function
|
|
602
|
+
function prepareWalletPolicyConfigUpdate(params) {
|
|
577
603
|
const env = params.env ?? process.env;
|
|
578
604
|
const walletId = params.walletId.trim();
|
|
579
605
|
if (!walletId) {
|
|
@@ -623,20 +649,41 @@ function upsertWalletPolicyConfig(params) {
|
|
|
623
649
|
patch: params.patch.recurringTransfer,
|
|
624
650
|
role
|
|
625
651
|
}) : existingRecord?.recurringTransfer;
|
|
626
|
-
|
|
652
|
+
const preparedAt = nowIso();
|
|
653
|
+
const nextRecord = buildStoredPolicyRecord({
|
|
627
654
|
walletId,
|
|
628
655
|
role,
|
|
629
656
|
policy: nextPolicy,
|
|
630
|
-
recurringTransfer
|
|
657
|
+
recurringTransfer,
|
|
658
|
+
updatedAt: preparedAt
|
|
631
659
|
});
|
|
632
|
-
state.updatedAt = nowIso();
|
|
633
|
-
writeWalletPolicyState(state, env);
|
|
634
660
|
return {
|
|
635
661
|
walletId,
|
|
636
662
|
role,
|
|
637
|
-
config: cloneWalletConfigWithPolicy(base, nextPolicy)
|
|
663
|
+
config: cloneWalletConfigWithPolicy(base, nextPolicy),
|
|
664
|
+
expectedRecordJson: JSON.stringify(existingRecord ?? null),
|
|
665
|
+
nextRecord,
|
|
666
|
+
preparedAt
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
function commitWalletPolicyConfigUpdate(prepared, env = process.env) {
|
|
670
|
+
const state = readWalletPolicyState(env);
|
|
671
|
+
if (JSON.stringify(state.wallets[prepared.walletId] ?? null) !== prepared.expectedRecordJson) {
|
|
672
|
+
throw new Error("wallet policy changed concurrently; reload the acknowledged signer policy");
|
|
673
|
+
}
|
|
674
|
+
state.wallets[prepared.walletId] = prepared.nextRecord;
|
|
675
|
+
state.updatedAt = prepared.preparedAt;
|
|
676
|
+
writeWalletPolicyState(state, env);
|
|
677
|
+
return {
|
|
678
|
+
walletId: prepared.walletId,
|
|
679
|
+
role: prepared.role,
|
|
680
|
+
config: prepared.config
|
|
638
681
|
};
|
|
639
682
|
}
|
|
683
|
+
function upsertWalletPolicyConfig(params) {
|
|
684
|
+
const env = params.env ?? process.env;
|
|
685
|
+
return commitWalletPolicyConfigUpdate(prepareWalletPolicyConfigUpdate(params), env);
|
|
686
|
+
}
|
|
640
687
|
function resolveWalletRolePolicyProfile(role, env = process.env) {
|
|
641
688
|
switch (role) {
|
|
642
689
|
case "mining": return {
|
|
@@ -659,8 +706,8 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
|
|
|
659
706
|
label: "Agent",
|
|
660
707
|
summary: "Hot Agent wallet for reviewed payments, Fased Network payment evidence, and approved skill actions. Keep explicit caps and narrow token / contract routes.",
|
|
661
708
|
defaults: {
|
|
662
|
-
capsEnabled:
|
|
663
|
-
directSigning:
|
|
709
|
+
capsEnabled: true,
|
|
710
|
+
directSigning: false,
|
|
664
711
|
skillsEnabled: false,
|
|
665
712
|
solana: {
|
|
666
713
|
maxPerTx: DEFAULT_POLICY_CAPS.solana.maxPerTx,
|
|
@@ -673,9 +720,9 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
|
|
|
673
720
|
default: return {
|
|
674
721
|
role: "vault",
|
|
675
722
|
label: "Vault",
|
|
676
|
-
summary: "Manual-first Vault wallet for storage and federation bond assignment. No background agent execution by default;
|
|
723
|
+
summary: "Manual-first Vault wallet for storage and federation bond assignment. No background agent execution by default; reviewed sends require signer-owned WebAuthn authorization.",
|
|
677
724
|
defaults: {
|
|
678
|
-
capsEnabled:
|
|
725
|
+
capsEnabled: true,
|
|
679
726
|
directSigning: false,
|
|
680
727
|
skillsEnabled: false,
|
|
681
728
|
solana: {
|
|
@@ -769,7 +816,14 @@ function validateWalletTxPolicy(params) {
|
|
|
769
816
|
}
|
|
770
817
|
const capsEnabled = params.config.policy.capsEnabled;
|
|
771
818
|
const allowPrograms = params.config.policy.solana.allowPrograms;
|
|
772
|
-
if (params.program
|
|
819
|
+
if (params.program) {
|
|
820
|
+
if (allowPrograms.length === 0) {
|
|
821
|
+
return {
|
|
822
|
+
ok: false,
|
|
823
|
+
code: "wallet_program_allowlist_required",
|
|
824
|
+
message: "program execution requires an explicit non-empty allowlist"
|
|
825
|
+
};
|
|
826
|
+
}
|
|
773
827
|
const normalized = params.program.trim();
|
|
774
828
|
const allowed = allowPrograms.includes(normalized);
|
|
775
829
|
if (!allowed) {
|
|
@@ -962,4 +1016,4 @@ function resolveWalletRecurringTransferPolicy(params) {
|
|
|
962
1016
|
}
|
|
963
1017
|
|
|
964
1018
|
//#endregion
|
|
965
|
-
export { applyWalletPolicyConfig, checkWalletDailyCap, enforceWalletDailyCap, isWalletToolAllowed, resolveWalletPolicyConfig, resolveWalletRecurringTransferPolicy, resolveWalletRoleForId, resolveWalletRolePolicyProfile, upsertWalletPolicyConfig, validateWalletTxPolicy };
|
|
1019
|
+
export { applyWalletPolicyConfig, checkWalletDailyCap, commitWalletPolicyConfigUpdate, enforceWalletDailyCap, isWalletToolAllowed, prepareWalletPolicyConfigUpdate, resolveWalletPolicyConfig, resolveWalletRecurringTransferPolicy, resolveWalletRoleForId, resolveWalletRolePolicyProfile, upsertWalletPolicyConfig, validateWalletTxPolicy };
|
|
@@ -6,7 +6,12 @@ const FULL_CHAIN_OPS = {
|
|
|
6
6
|
send: true
|
|
7
7
|
};
|
|
8
8
|
const PROVIDER_CHAIN_OPERATION_PROFILES = {
|
|
9
|
-
"embedded-keystore": { solana: {
|
|
9
|
+
"embedded-keystore": { solana: {
|
|
10
|
+
receiveAddress: false,
|
|
11
|
+
getBalance: false,
|
|
12
|
+
prepare: false,
|
|
13
|
+
send: false
|
|
14
|
+
} },
|
|
10
15
|
"local-socket-signer": { solana: { ...FULL_CHAIN_OPS } },
|
|
11
16
|
alchemy: { solana: {
|
|
12
17
|
receiveAddress: true,
|
|
@@ -15,7 +20,18 @@ const PROVIDER_CHAIN_OPERATION_PROFILES = {
|
|
|
15
20
|
send: false
|
|
16
21
|
} },
|
|
17
22
|
turnkey: { solana: { ...FULL_CHAIN_OPS } },
|
|
18
|
-
privy: { solana: {
|
|
23
|
+
privy: { solana: {
|
|
24
|
+
receiveAddress: true,
|
|
25
|
+
getBalance: false,
|
|
26
|
+
prepare: false,
|
|
27
|
+
send: false
|
|
28
|
+
} },
|
|
29
|
+
"wallet-standard": { solana: {
|
|
30
|
+
receiveAddress: true,
|
|
31
|
+
getBalance: true,
|
|
32
|
+
prepare: false,
|
|
33
|
+
send: false
|
|
34
|
+
} }
|
|
19
35
|
};
|
|
20
36
|
const KNOWN_RPC_PROVIDER_PROFILES = {
|
|
21
37
|
alchemy: {
|
|
@@ -76,10 +92,12 @@ function resolveIntegrationMode(providerId) {
|
|
|
76
92
|
case "local-socket-signer":
|
|
77
93
|
case "alchemy":
|
|
78
94
|
case "turnkey":
|
|
95
|
+
case "wallet-standard":
|
|
79
96
|
case "privy": return "native";
|
|
80
97
|
}
|
|
81
98
|
}
|
|
82
99
|
function buildWalletProviderCapabilityMatrix(adapter) {
|
|
100
|
+
const signingLocation = adapter.capabilities.signingLocation ?? "unavailable";
|
|
83
101
|
const chains = { solana: emptyChainOps() };
|
|
84
102
|
const defaultChainFlags = {
|
|
85
103
|
receiveAddress: true,
|
|
@@ -105,8 +123,14 @@ function buildWalletProviderCapabilityMatrix(adapter) {
|
|
|
105
123
|
providerId: adapter.id,
|
|
106
124
|
supportedChains: [...adapter.capabilities.supportedChains],
|
|
107
125
|
integrationMode: resolveIntegrationMode(adapter.id),
|
|
126
|
+
signingLocation,
|
|
127
|
+
signing: {
|
|
128
|
+
transaction: adapter.capabilities.supportsSignTransaction === true,
|
|
129
|
+
message: adapter.capabilities.supportsSignMessage === true,
|
|
130
|
+
interactiveSend: signingLocation === "browser" && adapter.capabilities.supportsSignTransaction === true
|
|
131
|
+
},
|
|
108
132
|
operations: {
|
|
109
|
-
createWallet: adapter.capabilities.supportsCreateWallet,
|
|
133
|
+
createWallet: adapter.capabilities.supportsCreateWallet || adapter.id === "local-socket-signer",
|
|
110
134
|
receiveAddress: receiveAny,
|
|
111
135
|
getBalance: balanceAny,
|
|
112
136
|
prepare: prepareAny,
|
|
@@ -117,7 +141,7 @@ function buildWalletProviderCapabilityMatrix(adapter) {
|
|
|
117
141
|
resetKeys: adapter.capabilities.supportsResetKeys
|
|
118
142
|
},
|
|
119
143
|
chains,
|
|
120
|
-
requiresCredentials: adapter.id !== "
|
|
144
|
+
requiresCredentials: adapter.id !== "local-socket-signer" && adapter.id !== "wallet-standard",
|
|
121
145
|
requiresRpcSecret: false
|
|
122
146
|
};
|
|
123
147
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveStateDir } from "../config/paths.js";
|
|
2
|
+
import { throwLegacyEmbeddedKeystoreMigrationRequired } from "./legacy-embedded-keystore.js";
|
|
2
3
|
import { ensureWalletStateDir } from "./wallet-runtime-config.js";
|
|
3
4
|
import syncFs from "node:fs";
|
|
4
5
|
import path from "node:path";
|
|
@@ -8,10 +9,14 @@ import { randomBytes } from "node:crypto";
|
|
|
8
9
|
const REGISTRY_FILE_MODE = 384;
|
|
9
10
|
const PROVIDER_REGISTRY_FILENAME = "provider-registry.v1.json";
|
|
10
11
|
const WALLET_PROVIDER_IDS = [
|
|
11
|
-
"embedded-keystore",
|
|
12
12
|
"local-socket-signer",
|
|
13
13
|
"alchemy",
|
|
14
14
|
"turnkey",
|
|
15
|
+
"wallet-standard"
|
|
16
|
+
];
|
|
17
|
+
const WALLET_PROVIDER_REGISTRY_IDS = [
|
|
18
|
+
"embedded-keystore",
|
|
19
|
+
...WALLET_PROVIDER_IDS,
|
|
15
20
|
"privy"
|
|
16
21
|
];
|
|
17
22
|
function normalizeWalletUserRole(value) {
|
|
@@ -54,6 +59,7 @@ function normalizeProviderId(value) {
|
|
|
54
59
|
case "local-socket-signer":
|
|
55
60
|
case "alchemy":
|
|
56
61
|
case "turnkey":
|
|
62
|
+
case "wallet-standard":
|
|
57
63
|
case "privy": return raw;
|
|
58
64
|
default: return null;
|
|
59
65
|
}
|
|
@@ -238,34 +244,18 @@ function normalizeWalletEntry(raw) {
|
|
|
238
244
|
updatedAt
|
|
239
245
|
};
|
|
240
246
|
}
|
|
241
|
-
function isLegacySelfHostedWallet(wallet) {
|
|
242
|
-
if (wallet.providerId !== "embedded-keystore") {
|
|
243
|
-
return false;
|
|
244
|
-
}
|
|
245
|
-
const metadata = wallet.metadata && typeof wallet.metadata === "object" && !Array.isArray(wallet.metadata) ? wallet.metadata : undefined;
|
|
246
|
-
if (metadata?.selfHosted === true) {
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
if (/^solana-\d+$/i.test(wallet.id)) {
|
|
250
|
-
return true;
|
|
251
|
-
}
|
|
252
|
-
if (/^solana\s+\d+$/i.test(wallet.name)) {
|
|
253
|
-
return true;
|
|
254
|
-
}
|
|
255
|
-
return false;
|
|
256
|
-
}
|
|
257
247
|
function makeDefaultRegistry() {
|
|
258
248
|
const ts = nowIso();
|
|
259
249
|
return {
|
|
260
250
|
version: 1,
|
|
261
251
|
providers: {
|
|
262
252
|
"embedded-keystore": {
|
|
263
|
-
enabled:
|
|
253
|
+
enabled: false,
|
|
264
254
|
updatedAt: ts,
|
|
265
|
-
label: "
|
|
255
|
+
label: "Legacy embedded keystore (migration required)"
|
|
266
256
|
},
|
|
267
257
|
"local-socket-signer": {
|
|
268
|
-
enabled:
|
|
258
|
+
enabled: true,
|
|
269
259
|
updatedAt: ts,
|
|
270
260
|
label: "Local signer"
|
|
271
261
|
},
|
|
@@ -274,13 +264,19 @@ function makeDefaultRegistry() {
|
|
|
274
264
|
updatedAt: ts
|
|
275
265
|
},
|
|
276
266
|
turnkey: {
|
|
267
|
+
enabled: false,
|
|
268
|
+
updatedAt: ts,
|
|
269
|
+
label: "Turnkey (policy-managed)"
|
|
270
|
+
},
|
|
271
|
+
"wallet-standard": {
|
|
277
272
|
enabled: true,
|
|
278
273
|
updatedAt: ts,
|
|
279
|
-
label: "
|
|
274
|
+
label: "Wallet Standard (verify hardware on device)"
|
|
280
275
|
},
|
|
281
276
|
privy: {
|
|
282
|
-
enabled:
|
|
283
|
-
updatedAt: ts
|
|
277
|
+
enabled: false,
|
|
278
|
+
updatedAt: ts,
|
|
279
|
+
label: "Privy (integration unavailable)"
|
|
284
280
|
}
|
|
285
281
|
},
|
|
286
282
|
wallets: [],
|
|
@@ -299,8 +295,15 @@ function normalizeRegistry(raw) {
|
|
|
299
295
|
let changed = false;
|
|
300
296
|
const value = raw;
|
|
301
297
|
const providersRaw = value.providers && typeof value.providers === "object" && !Array.isArray(value.providers) ? value.providers : {};
|
|
302
|
-
const providers = {
|
|
303
|
-
|
|
298
|
+
const providers = {
|
|
299
|
+
"embedded-keystore": defaults.providers["embedded-keystore"],
|
|
300
|
+
"local-socket-signer": defaults.providers["local-socket-signer"],
|
|
301
|
+
alchemy: defaults.providers.alchemy,
|
|
302
|
+
turnkey: defaults.providers.turnkey,
|
|
303
|
+
"wallet-standard": defaults.providers["wallet-standard"],
|
|
304
|
+
privy: defaults.providers.privy
|
|
305
|
+
};
|
|
306
|
+
for (const providerId of WALLET_PROVIDER_REGISTRY_IDS) {
|
|
304
307
|
const entryRaw = providersRaw[providerId];
|
|
305
308
|
if (!entryRaw || typeof entryRaw !== "object" || Array.isArray(entryRaw)) {
|
|
306
309
|
continue;
|
|
@@ -309,8 +312,8 @@ function normalizeRegistry(raw) {
|
|
|
309
312
|
const enabled = Boolean(entry.enabled);
|
|
310
313
|
let label = typeof entry.label === "string" ? entry.label.trim() || undefined : undefined;
|
|
311
314
|
if (providerId === "embedded-keystore") {
|
|
312
|
-
if (!label || label === "Embedded keystore (default)" || label === "Self-hosted wallet") {
|
|
313
|
-
label = "
|
|
315
|
+
if (!label || label === "Embedded keystore (default)" || label === "Self-hosted wallet" || label === "Self-hosted") {
|
|
316
|
+
label = "Legacy embedded keystore (migration required)";
|
|
314
317
|
}
|
|
315
318
|
}
|
|
316
319
|
if (providerId === "local-socket-signer") {
|
|
@@ -325,23 +328,7 @@ function normalizeRegistry(raw) {
|
|
|
325
328
|
updatedAt
|
|
326
329
|
};
|
|
327
330
|
}
|
|
328
|
-
const wallets =
|
|
329
|
-
if (!isLegacySelfHostedWallet(wallet)) {
|
|
330
|
-
return wallet;
|
|
331
|
-
}
|
|
332
|
-
changed = true;
|
|
333
|
-
const metadata = wallet.metadata && typeof wallet.metadata === "object" && !Array.isArray(wallet.metadata) ? wallet.metadata : undefined;
|
|
334
|
-
return {
|
|
335
|
-
...wallet,
|
|
336
|
-
providerId: "local-socket-signer",
|
|
337
|
-
metadata: {
|
|
338
|
-
...metadata,
|
|
339
|
-
selfHosted: true,
|
|
340
|
-
migratedFromProviderId: metadata?.migratedFromProviderId ?? "embedded-keystore"
|
|
341
|
-
},
|
|
342
|
-
updatedAt: nowIso()
|
|
343
|
-
};
|
|
344
|
-
});
|
|
331
|
+
const wallets = Array.isArray(value.wallets) ? value.wallets.map(normalizeWalletEntry).filter((entry) => Boolean(entry)) : [];
|
|
345
332
|
if (wallets.some((wallet) => wallet.providerId === "local-socket-signer")) {
|
|
346
333
|
const current = providers["local-socket-signer"];
|
|
347
334
|
if (!current.enabled) {
|
|
@@ -413,6 +400,12 @@ function writeWalletProviderRegistry(registry, env = process.env) {
|
|
|
413
400
|
} catch {}
|
|
414
401
|
}
|
|
415
402
|
function setWalletProviderEnabled(params) {
|
|
403
|
+
if (params.providerId === "embedded-keystore" && params.enabled) {
|
|
404
|
+
throwLegacyEmbeddedKeystoreMigrationRequired("cannot enable retired wallet provider");
|
|
405
|
+
}
|
|
406
|
+
if (params.providerId === "privy" && params.enabled) {
|
|
407
|
+
throw new Error("Privy wallet creation and signing are unavailable; the provider stays disabled.");
|
|
408
|
+
}
|
|
416
409
|
const env = params.env ?? process.env;
|
|
417
410
|
const registry = readWalletProviderRegistry(env);
|
|
418
411
|
registry.providers[params.providerId] = {
|
|
@@ -428,6 +421,20 @@ function setWalletProvidersEnabled(params) {
|
|
|
428
421
|
const registry = readWalletProviderRegistry(env);
|
|
429
422
|
const enabledSet = new Set(params.enabledProviders);
|
|
430
423
|
const now = nowIso();
|
|
424
|
+
const legacy = registry.providers["embedded-keystore"];
|
|
425
|
+
registry.providers["embedded-keystore"] = {
|
|
426
|
+
...legacy,
|
|
427
|
+
enabled: false,
|
|
428
|
+
label: "Legacy embedded keystore (migration required)",
|
|
429
|
+
updatedAt: legacy.enabled ? now : legacy.updatedAt
|
|
430
|
+
};
|
|
431
|
+
const unavailablePrivy = registry.providers.privy;
|
|
432
|
+
registry.providers.privy = {
|
|
433
|
+
...unavailablePrivy,
|
|
434
|
+
enabled: false,
|
|
435
|
+
label: "Privy (integration unavailable)",
|
|
436
|
+
updatedAt: unavailablePrivy.enabled ? now : unavailablePrivy.updatedAt
|
|
437
|
+
};
|
|
431
438
|
for (const providerId of WALLET_PROVIDER_IDS) {
|
|
432
439
|
const current = registry.providers[providerId] ?? {
|
|
433
440
|
enabled: false,
|
|
@@ -444,6 +451,12 @@ function setWalletProvidersEnabled(params) {
|
|
|
444
451
|
return registry;
|
|
445
452
|
}
|
|
446
453
|
function upsertNamedWallet(params) {
|
|
454
|
+
if (params.providerId === "embedded-keystore") {
|
|
455
|
+
throwLegacyEmbeddedKeystoreMigrationRequired("cannot register a new legacy wallet");
|
|
456
|
+
}
|
|
457
|
+
if (params.providerId === "privy") {
|
|
458
|
+
throw new Error("Privy wallet creation and signing are unavailable; no wallet was registered.");
|
|
459
|
+
}
|
|
447
460
|
const env = params.env ?? process.env;
|
|
448
461
|
const registry = readWalletProviderRegistry(env);
|
|
449
462
|
const name = params.name.trim();
|