@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
|
@@ -7,10 +7,11 @@ import { ensureAuthProfileStore } from "../agents/auth-profiles/store.js";
|
|
|
7
7
|
import { readConfigFileSnapshot, writeConfigFile } from "../config/io.js";
|
|
8
8
|
import "../config/config.js";
|
|
9
9
|
import "../agents/auth-profiles.js";
|
|
10
|
-
import { ensureWalletStateDir,
|
|
10
|
+
import { ensureWalletStateDir, resolveLocalSignerControlSocketPath, resolveLocalSignerMaterialRootDir, resolveLocalSignerSocketPath } from "../wallet/wallet-runtime-config.js";
|
|
11
11
|
import { checkNamedWalletDeletionSafety, deleteNamedWallet, readWalletProviderRegistry, resolveWalletUserRole, setDefaultWallet, setNamedWalletRole, upsertNamedWallet } from "../wallet/wallet-provider-registry.js";
|
|
12
12
|
import { DEFAULT_WORKSPACE, applyWizardMetadata, ensureWorkspaceAndSessions, handleOnboardingRepair, printWizardHeader, probeGatewayReachable, summarizeExistingConfig } from "../commands/onboard-helpers.js";
|
|
13
|
-
import {
|
|
13
|
+
import { configureSignerOwnedWalletNetwork } from "../wallet/signer-network-admin.js";
|
|
14
|
+
import { configureWalletForOnboarding, installSignerdBinary, resolveSignerdBinaryPath, restartLocalSocketSigner } from "./onboarding.wallet.js";
|
|
14
15
|
import { collectWalletSignerDoctorReport, walletSetupCommand } from "../commands/wallet.js";
|
|
15
16
|
import { promptAuthChoiceGrouped } from "../commands/auth-choice-prompt.js";
|
|
16
17
|
import { applyPrimaryModel, resolveAuthenticatedDefaultModel } from "../commands/model-picker.js";
|
|
@@ -25,6 +26,7 @@ import { promptCustomApiConfig } from "../commands/onboard-custom.js";
|
|
|
25
26
|
import { setupInternalHooks } from "../commands/onboard-hooks.js";
|
|
26
27
|
import { promptRemoteGatewayConfig } from "../commands/onboard-remote.js";
|
|
27
28
|
import { setupSkills } from "../commands/onboard-skills.js";
|
|
29
|
+
import { lockSignerOwnedWalletForArchive } from "../wallet/local-socket-signer-archive.js";
|
|
28
30
|
import { isHostedSecurityCapableSession } from "./host-security-capability.js";
|
|
29
31
|
import { noteBullet, noteCommand, noteHeading, noteLabel, noteStep, noteSuccess, noteWarn } from "./onboarding-note-format.js";
|
|
30
32
|
import { configureFederationForOnboarding } from "./onboarding.federation.js";
|
|
@@ -93,20 +95,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
93
95
|
}
|
|
94
96
|
return "FASED_WALLET_SOLANA_RPC_URL";
|
|
95
97
|
};
|
|
96
|
-
const
|
|
98
|
+
const fallbackRpcEnvKeyFor = (walletId) => {
|
|
97
99
|
const suffix = walletIdEnvSuffix(walletId);
|
|
98
|
-
|
|
99
|
-
return `FASED_WALLET_SOLANA_KEYSTORE_PATH__${suffix}`;
|
|
100
|
-
}
|
|
101
|
-
return "FASED_WALLET_SOLANA_KEYSTORE_PATH";
|
|
102
|
-
};
|
|
103
|
-
const defaultKeystorePathFor = (_chain, walletId) => {
|
|
104
|
-
const normalized = String(walletId ?? "").trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
105
|
-
const walletDir = ensureWalletStateDir(process.env).rootDir;
|
|
106
|
-
if (!normalized || normalized === "default") {
|
|
107
|
-
return path.join(walletDir, "keystore-solana.v1.enc");
|
|
108
|
-
}
|
|
109
|
-
return path.join(walletDir, `keystore-solana-${normalized}.v1.enc`);
|
|
100
|
+
return suffix ? `FASED_WALLET_SOLANA_WRITE_RPC_FALLBACK_URL__${suffix}` : "FASED_WALLET_SOLANA_WRITE_RPC_FALLBACK_URL";
|
|
110
101
|
};
|
|
111
102
|
const setConfigEnvVar = (cfg, key, value) => {
|
|
112
103
|
const vars = { ...cfg.env?.vars };
|
|
@@ -124,29 +115,26 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
124
115
|
};
|
|
125
116
|
};
|
|
126
117
|
const applyHostedLocalSignerDefaults = (cfg) => {
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
118
|
+
const appSocket = "/run/fased-signerd/app.sock";
|
|
119
|
+
const signerOwnedKeys = [
|
|
120
|
+
"FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET",
|
|
121
|
+
"FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET",
|
|
122
|
+
"FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER",
|
|
123
|
+
"FASED_WALLET_LOCAL_SIGNER_BIN",
|
|
124
|
+
"FASED_WALLET_SIGNER_STATE_DIR",
|
|
125
|
+
"FASED_WALLET_LOCAL_SIGNER_STATE_DB",
|
|
126
|
+
"FASED_WALLET_LOCAL_SIGNER_MASTER_KEY",
|
|
127
|
+
"FASED_WALLET_PASSPHRASE_FILE",
|
|
128
|
+
"FASED_WALLET_WEBAUTHN_RP_ID",
|
|
129
|
+
"FASED_WALLET_WEBAUTHN_ORIGINS"
|
|
130
|
+
];
|
|
140
131
|
let next = cfg;
|
|
141
|
-
for (const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
process.env[key] = existing;
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
process.env[key] = value;
|
|
148
|
-
next = setConfigEnvVar(next, key, value);
|
|
132
|
+
for (const key of signerOwnedKeys) {
|
|
133
|
+
delete process.env[key];
|
|
134
|
+
next = setConfigEnvVar(next, key, undefined);
|
|
149
135
|
}
|
|
136
|
+
process.env.FASED_WALLET_LOCAL_SIGNER_SOCKET = appSocket;
|
|
137
|
+
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_SOCKET", appSocket);
|
|
150
138
|
return next;
|
|
151
139
|
};
|
|
152
140
|
const syncLocalSignerRuntimeEnvIntoConfig = (cfg) => {
|
|
@@ -157,14 +145,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
157
145
|
const signerSocketPath = resolveLocalSignerSocketPath(process.env);
|
|
158
146
|
process.env.FASED_WALLET_LOCAL_SIGNER_SOCKET = signerSocketPath;
|
|
159
147
|
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_SOCKET", signerSocketPath);
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
process.env.FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET = backendSocketPath;
|
|
163
|
-
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET", backendSocketPath);
|
|
164
|
-
} else {
|
|
165
|
-
delete process.env.FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET;
|
|
166
|
-
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET", undefined);
|
|
167
|
-
}
|
|
148
|
+
delete process.env.FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET;
|
|
149
|
+
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET", undefined);
|
|
168
150
|
const signerStateDir = resolveLocalSignerMaterialRootDir(process.env);
|
|
169
151
|
if (signerStateDir !== ensureWalletStateDir(process.env).rootDir) {
|
|
170
152
|
process.env.FASED_WALLET_SIGNER_STATE_DIR = signerStateDir;
|
|
@@ -173,14 +155,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
173
155
|
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
174
156
|
next = setConfigEnvVar(next, "FASED_WALLET_SIGNER_STATE_DIR", undefined);
|
|
175
157
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
process.env.FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER = signerRunAsUser;
|
|
179
|
-
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER", signerRunAsUser);
|
|
180
|
-
} else {
|
|
181
|
-
delete process.env.FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER;
|
|
182
|
-
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER", undefined);
|
|
183
|
-
}
|
|
158
|
+
delete process.env.FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER;
|
|
159
|
+
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER", undefined);
|
|
184
160
|
const signerBinPath = String(process.env.FASED_WALLET_LOCAL_SIGNER_BIN ?? "").trim();
|
|
185
161
|
if (signerBinPath) {
|
|
186
162
|
next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BIN", signerBinPath);
|
|
@@ -191,24 +167,21 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
191
167
|
return next;
|
|
192
168
|
};
|
|
193
169
|
const jupiterApiKeyEnvKey = "FASED_JUPITER_API_KEY";
|
|
194
|
-
const
|
|
195
|
-
const
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
const existingKey = readJupiterLimitOrderApiKey();
|
|
170
|
+
const legacyJupiterTriggerApiBaseUrlEnvKey = "FASED_JUPITER_TRIGGER_API_BASE_URL";
|
|
171
|
+
const readJupiterSwapApiKey = () => String(process.env[jupiterApiKeyEnvKey] ?? nextConfig.env?.vars?.[jupiterApiKeyEnvKey] ?? process.env.JUPITER_API_KEY ?? nextConfig.env?.vars?.JUPITER_API_KEY ?? "").trim();
|
|
172
|
+
const promptAndStoreJupiterSwapApi = async () => {
|
|
173
|
+
const existingKey = readJupiterSwapApiKey();
|
|
199
174
|
const enable = await prompter.confirm({
|
|
200
|
-
message: existingKey ? "Keep Jupiter
|
|
175
|
+
message: existingKey ? "Keep Gateway Jupiter Swap API access enabled?" : "Enable Gateway Jupiter Swap API access? Trigger credentials remain signer-owned.",
|
|
201
176
|
initialValue: Boolean(existingKey)
|
|
202
177
|
});
|
|
203
178
|
if (!enable) {
|
|
204
179
|
nextConfig = setConfigEnvVar(nextConfig, jupiterApiKeyEnvKey, undefined);
|
|
205
|
-
nextConfig = setConfigEnvVar(nextConfig, jupiterTriggerApiBaseUrlEnvKey, undefined);
|
|
206
180
|
delete process.env[jupiterApiKeyEnvKey];
|
|
207
|
-
|
|
208
|
-
await prompter.note("Jupiter wallet-action support disabled. Other approved wallet actions still use the normal wallet flow.", "Wallet actions");
|
|
181
|
+
await prompter.note("Gateway Jupiter Swap API access disabled. Native signer Trigger configuration is unchanged.", "Jupiter swaps");
|
|
209
182
|
return false;
|
|
210
183
|
}
|
|
211
|
-
const keyPrompt = existingKey ? "Jupiter API key (blank keeps current)" : "Jupiter API key";
|
|
184
|
+
const keyPrompt = existingKey ? "Jupiter Swap API key (blank keeps current)" : "Jupiter Swap API key";
|
|
212
185
|
const keyInput = (typeof prompter.secret === "function" ? await prompter.secret({
|
|
213
186
|
message: keyPrompt,
|
|
214
187
|
validate: (value) => value.trim() || existingKey ? undefined : "Jupiter API key is required"
|
|
@@ -218,21 +191,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
218
191
|
})).trim();
|
|
219
192
|
const effectiveKey = keyInput || existingKey;
|
|
220
193
|
if (!effectiveKey) {
|
|
221
|
-
throw new Error("Jupiter API key is required to enable
|
|
194
|
+
throw new Error("Jupiter API key is required to enable Gateway swap crafting.");
|
|
222
195
|
}
|
|
223
196
|
nextConfig = setConfigEnvVar(nextConfig, jupiterApiKeyEnvKey, effectiveKey);
|
|
224
197
|
process.env[jupiterApiKeyEnvKey] = effectiveKey;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
})).trim();
|
|
231
|
-
const effectiveBaseUrl = baseUrlInput || existingBaseUrl;
|
|
232
|
-
nextConfig = setConfigEnvVar(nextConfig, jupiterTriggerApiBaseUrlEnvKey, effectiveBaseUrl);
|
|
233
|
-
process.env[jupiterTriggerApiBaseUrlEnvKey] = effectiveBaseUrl;
|
|
234
|
-
}
|
|
235
|
-
await prompter.note(["Jupiter wallet-action support enabled for Agent wallet actions.", `${jupiterApiKeyEnvKey} is stored in local config env vars and is never printed in chat.`].join("\n"), "Wallet actions");
|
|
198
|
+
await prompter.note([
|
|
199
|
+
"Gateway Jupiter Swap API access enabled for Agent wallet swap crafting.",
|
|
200
|
+
`${jupiterApiKeyEnvKey} is stored in Gateway config for swaps only and is never printed in chat.`,
|
|
201
|
+
"Jupiter Trigger credentials and production routing stay inside fased-signerd."
|
|
202
|
+
].join("\n"), "Jupiter swaps");
|
|
236
203
|
return true;
|
|
237
204
|
};
|
|
238
205
|
const promptAndStoreWalletRpcUrl = async (params) => {
|
|
@@ -639,16 +606,25 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
639
606
|
}
|
|
640
607
|
const interactiveHostProfileInitialValue = !hostSecurityCapable && requestedHostProfile === "hosting" ? "local" : requestedHostProfile || "local";
|
|
641
608
|
const explicitHostProfileRequested = requestedHostProfile !== undefined;
|
|
642
|
-
const hostedProfileUnavailableNote = [
|
|
609
|
+
const hostedProfileUnavailableNote = [
|
|
610
|
+
"This session cannot run hosting security setup.",
|
|
611
|
+
"Start from the provider root console with the exact tagged, attested Hosting command and --release vX.Y.Z.",
|
|
612
|
+
"Never run the app-owned checkout with sudo or as root."
|
|
613
|
+
].join("\n");
|
|
614
|
+
if (opts.mode !== "remote" && !requestedHostProfile) {
|
|
615
|
+
await prompter.note(["Local runs under your current OS account and does no VPS SSH/firewall hardening.", "Hosting uses the verified root bootstrap for an independent signer service, private Tailscale access and hosted SSH/firewall hardening."].join("\n"), "Setup map");
|
|
616
|
+
}
|
|
643
617
|
const hostProfile = opts.mode === "remote" ? "local" : requestedHostProfile ? requestedHostProfile : await (async () => {
|
|
644
618
|
const selected = await prompter.select({
|
|
645
619
|
message: "Host setup profile",
|
|
646
620
|
options: [{
|
|
647
621
|
value: "local",
|
|
648
|
-
label: "Local"
|
|
622
|
+
label: "Local",
|
|
623
|
+
hint: "Current machine and account; no VPS hardening."
|
|
649
624
|
}, {
|
|
650
625
|
value: "hosting",
|
|
651
|
-
label: "Hosting"
|
|
626
|
+
label: "Hosting",
|
|
627
|
+
hint: "Verified root bootstrap; Tailscale required."
|
|
652
628
|
}],
|
|
653
629
|
initialValue: interactiveHostProfileInitialValue
|
|
654
630
|
});
|
|
@@ -787,6 +763,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
787
763
|
}));
|
|
788
764
|
const workspaceDir = resolveUserPath(workspaceInput.trim() || DEFAULT_WORKSPACE);
|
|
789
765
|
let nextConfig = applyOnboardingLocalWorkspaceConfig(baseConfig, workspaceDir);
|
|
766
|
+
nextConfig = setConfigEnvVar(nextConfig, legacyJupiterTriggerApiBaseUrlEnvKey, undefined);
|
|
767
|
+
delete process.env[legacyJupiterTriggerApiBaseUrlEnvKey];
|
|
790
768
|
nextConfig = normalizeHostedWalletPaths(nextConfig, process.env);
|
|
791
769
|
const authChoice = opts.authChoice;
|
|
792
770
|
if (authChoice === "custom-api-key") {
|
|
@@ -846,6 +824,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
846
824
|
const hostingMode = hostProfile === "hosting";
|
|
847
825
|
if (hostingMode) {
|
|
848
826
|
nextConfig = applyHostedLocalSignerDefaults(nextConfig);
|
|
827
|
+
} else if (!String(process.env.FASED_WALLET_WEBAUTHN_RP_ID ?? "").trim() && !String(process.env.FASED_WALLET_WEBAUTHN_ORIGINS ?? "").trim()) {
|
|
828
|
+
process.env.FASED_WALLET_WEBAUTHN_RP_ID = "localhost";
|
|
829
|
+
process.env.FASED_WALLET_WEBAUTHN_ORIGINS = `http://localhost:${settings.port}`;
|
|
849
830
|
}
|
|
850
831
|
const buildNativeSignerFromSource = String(process.env.FASED_BUILD_NATIVE_SIGNER_FROM_SOURCE ?? "").trim() === "1";
|
|
851
832
|
const skipNativeSignerBuild = String(process.env.FASED_SKIP_NATIVE_SIGNER_BUILD ?? "").trim() === "1";
|
|
@@ -882,7 +863,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
882
863
|
nextConfig,
|
|
883
864
|
prompter
|
|
884
865
|
});
|
|
885
|
-
nextConfig = syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
|
|
866
|
+
nextConfig = hostingMode ? applyHostedLocalSignerDefaults(nextConfig) : syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
|
|
886
867
|
let onboardingWalletSecurityFocus = null;
|
|
887
868
|
const offerHostedWalletSetup = hostingMode && flow === "quickstart" && nextConfig.wallet?.runtime?.enabled !== true;
|
|
888
869
|
if (nextConfig.wallet?.runtime?.enabled || offerHostedWalletSetup) {
|
|
@@ -906,9 +887,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
906
887
|
label: "Manage wallet"
|
|
907
888
|
},
|
|
908
889
|
{
|
|
909
|
-
value: "
|
|
910
|
-
label: "
|
|
911
|
-
hint:
|
|
890
|
+
value: "jupiter-swaps",
|
|
891
|
+
label: "Jupiter swaps",
|
|
892
|
+
hint: readJupiterSwapApiKey() ? "Gateway swap key configured" : "Optional API key for Gateway swap crafting; Trigger is signer-owned"
|
|
912
893
|
},
|
|
913
894
|
{
|
|
914
895
|
value: "skip",
|
|
@@ -921,8 +902,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
921
902
|
if (setupMode === "skip") {
|
|
922
903
|
break;
|
|
923
904
|
}
|
|
924
|
-
if (setupMode === "
|
|
925
|
-
await
|
|
905
|
+
if (setupMode === "jupiter-swaps") {
|
|
906
|
+
await promptAndStoreJupiterSwapApi();
|
|
926
907
|
addAnotherWallet = await prompter.confirm({
|
|
927
908
|
message: "Run another wallet setup action?",
|
|
928
909
|
initialValue: false
|
|
@@ -931,7 +912,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
931
912
|
}
|
|
932
913
|
if (setupMode === "manage-self-hosted") {
|
|
933
914
|
const registry = readWalletProviderRegistry(process.env);
|
|
934
|
-
const managedWallets = registry.wallets.filter((wallet) => wallet.providerId === "local-socket-signer" || wallet.
|
|
915
|
+
const managedWallets = registry.wallets.filter((wallet) => wallet.providerId === "local-socket-signer" || wallet.metadata?.selfHosted === true && wallet.providerId !== "embedded-keystore");
|
|
935
916
|
if (managedWallets.length === 0) {
|
|
936
917
|
await prompter.note("No wallets are registered yet. Create or import one first.", "Wallet setup");
|
|
937
918
|
addAnotherWallet = await prompter.confirm({
|
|
@@ -960,8 +941,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
960
941
|
const currentMiningWalletId = satMiningAttachment.walletId ?? "";
|
|
961
942
|
const currentBondWalletId = federationBondWalletId ?? "";
|
|
962
943
|
const configuredSolanaRpcUrl = (nextConfig.env?.vars?.[rpcEnvKeyFor("solana", walletId)] ?? "").trim() || String(process.env[rpcEnvKeyFor("solana", walletId)] ?? "").trim();
|
|
963
|
-
const
|
|
964
|
-
const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || configuredSolanaKeystore);
|
|
944
|
+
const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || targetWallet.providerId === "local-socket-signer");
|
|
965
945
|
const targetWalletPurpose = resolveWalletUserRole(targetWallet);
|
|
966
946
|
const manageAction = await prompter.select({
|
|
967
947
|
message: "Wallet action",
|
|
@@ -969,7 +949,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
969
949
|
...supportsSolanaWallet ? [{
|
|
970
950
|
value: "configure-solana-rpc",
|
|
971
951
|
label: configuredSolanaRpcUrl ? "Update Solana RPC" : "Add Solana RPC",
|
|
972
|
-
hint: configuredSolanaRpcUrl ?
|
|
952
|
+
hint: configuredSolanaRpcUrl ? "Signer-owned RPC is configured; replace it without displaying credentials." : "Restore the per-wallet Solana RPC used for balances, readiness, and SAT mining."
|
|
973
953
|
}] : [],
|
|
974
954
|
...supportsSolanaWallet && currentBondWalletId === walletId ? [{
|
|
975
955
|
value: "detach-federation-bond",
|
|
@@ -981,9 +961,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
981
961
|
hint: currentBondWalletId && currentBondWalletId !== walletId ? `Current bond Vault: ${currentBondWalletId}` : "Use this Vault wallet for longer-lived SAT bond authority."
|
|
982
962
|
}] : [],
|
|
983
963
|
{
|
|
984
|
-
value: "
|
|
985
|
-
label: "
|
|
986
|
-
hint: "
|
|
964
|
+
value: "archive",
|
|
965
|
+
label: "Archive/remove from Fased",
|
|
966
|
+
hint: "Disable signer use first, then remove this wallet registration."
|
|
987
967
|
},
|
|
988
968
|
{
|
|
989
969
|
value: "cancel",
|
|
@@ -1010,8 +990,27 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1010
990
|
walletName: targetWallet.name,
|
|
1011
991
|
currentValue: configuredSolanaRpcUrl
|
|
1012
992
|
});
|
|
1013
|
-
|
|
1014
|
-
|
|
993
|
+
let signerNetworkVersion;
|
|
994
|
+
let signerNetworkRootCommand;
|
|
995
|
+
if (targetWallet.providerId === "local-socket-signer") {
|
|
996
|
+
const effectiveEnv = {
|
|
997
|
+
...process.env,
|
|
998
|
+
...nextConfig.env?.vars,
|
|
999
|
+
FASED_HOST_PROFILE: hostProfile
|
|
1000
|
+
};
|
|
1001
|
+
const network = configureSignerOwnedWalletNetwork({
|
|
1002
|
+
walletId,
|
|
1003
|
+
primaryRpcUrl: effectiveSolanaRpcUrl,
|
|
1004
|
+
fallbackRpcUrl: String(effectiveEnv[fallbackRpcEnvKeyFor(walletId)] ?? "").trim() || undefined,
|
|
1005
|
+
env: effectiveEnv,
|
|
1006
|
+
signerBinPath: hostProfile === "hosting" ? undefined : resolveSignerdBinaryPath(effectiveEnv)
|
|
1007
|
+
});
|
|
1008
|
+
signerNetworkVersion = network.version;
|
|
1009
|
+
signerNetworkRootCommand = network.rootCommand;
|
|
1010
|
+
} else {
|
|
1011
|
+
await restartLocalSocketSigner(ensureWalletStateDir(process.env).rootDir);
|
|
1012
|
+
}
|
|
1013
|
+
await prompter.note([`Updated the app-side Solana RPC setting for ${targetWallet.name} (${walletId})${signerNetworkVersion ? `; signer network version ${signerNetworkVersion} is ready` : "."}`, ...signerNetworkRootCommand ? ["The hosted signer was not changed because the app has no root channel. Activate the RPC from a root-owned file:", signerNetworkRootCommand] : []].join("\n"), "Wallet setup");
|
|
1015
1014
|
addAnotherWallet = await prompter.confirm({
|
|
1016
1015
|
message: "Run another wallet setup action?",
|
|
1017
1016
|
initialValue: false
|
|
@@ -1063,51 +1062,62 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1063
1062
|
});
|
|
1064
1063
|
continue;
|
|
1065
1064
|
}
|
|
1065
|
+
const archiveEnv = {
|
|
1066
|
+
...process.env,
|
|
1067
|
+
...nextConfig.env?.vars,
|
|
1068
|
+
FASED_HOST_PROFILE: hostProfile
|
|
1069
|
+
};
|
|
1066
1070
|
const deletionSafety = checkNamedWalletDeletionSafety({
|
|
1067
1071
|
walletId: targetWallet.id,
|
|
1068
|
-
env:
|
|
1072
|
+
env: archiveEnv
|
|
1069
1073
|
});
|
|
1070
1074
|
if (!deletionSafety.ok) {
|
|
1071
|
-
await prompter.note(deletionSafety.message, "
|
|
1075
|
+
await prompter.note(deletionSafety.message, "Archive blocked");
|
|
1072
1076
|
addAnotherWallet = await prompter.confirm({
|
|
1073
1077
|
message: "Run another wallet setup action?",
|
|
1074
1078
|
initialValue: false
|
|
1075
1079
|
});
|
|
1076
1080
|
continue;
|
|
1077
1081
|
}
|
|
1078
|
-
const
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
"
|
|
1082
|
+
const signerOwned = targetWallet.providerId === "local-socket-signer";
|
|
1083
|
+
const archiveWarnings = [
|
|
1084
|
+
`This removes the Fased registration for ${targetWallet.name} (${targetWallet.id}); it does not transfer funds or erase provider custody.`,
|
|
1085
|
+
signerOwned ? "Before removal, Fased must durably replace the native signer policy with deny-all. The encrypted signer-owned key remains archived in signer storage for host-administrator recovery." : "The external provider or hardware wallet keeps its key; remove it there separately only if you intend to destroy that custody relationship.",
|
|
1086
|
+
"Move funds out or verify your recovery procedure, and clear active Mining/Fased Network use before archiving."
|
|
1082
1087
|
];
|
|
1083
1088
|
if (currentMiningWalletId === targetWallet.id || targetWalletPurpose === "mining") {
|
|
1084
|
-
|
|
1089
|
+
archiveWarnings.push("For @wallet:mining, stop mining first; move SAT/SOL out or verify recovery; then archive and re-register the singleton Mining wallet if needed.");
|
|
1085
1090
|
}
|
|
1086
|
-
|
|
1087
|
-
await prompter.note(
|
|
1091
|
+
archiveWarnings.push("If balances cannot be checked from this terminal, treat the balance as unknown and verify it from the Wallet or Mining page first.", "Use repair for auth/session recovery only; wallet archive is always per-wallet.");
|
|
1092
|
+
await prompter.note(archiveWarnings.join("\n"), "Archive wallet");
|
|
1088
1093
|
const typedWalletId = await prompter.text({
|
|
1089
|
-
message: `Type wallet id "${targetWallet.id}" to
|
|
1094
|
+
message: `Type wallet id "${targetWallet.id}" to archive/remove this wallet from Fased`,
|
|
1090
1095
|
validate: (value) => value.trim() === targetWallet.id ? undefined : `Type ${targetWallet.id}`
|
|
1091
1096
|
});
|
|
1092
1097
|
if (typedWalletId.trim() === targetWallet.id) {
|
|
1093
1098
|
const walletId = targetWallet.id;
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
const configuredPaths = keystoreKeys.map((key) => (nextConfig.env?.vars?.[key] ?? "").trim() || String(process.env[key] ?? "").trim()).filter(Boolean);
|
|
1097
|
-
for (const file of new Set([...configuredPaths, ...defaultKeystorePaths])) {
|
|
1099
|
+
let archivedSignerPolicy;
|
|
1100
|
+
if (signerOwned) {
|
|
1098
1101
|
try {
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1102
|
+
archivedSignerPolicy = await lockSignerOwnedWalletForArchive({
|
|
1103
|
+
wallet: targetWallet,
|
|
1104
|
+
socketPath: resolveLocalSignerSocketPath(archiveEnv)
|
|
1105
|
+
});
|
|
1106
|
+
} catch (error) {
|
|
1107
|
+
await prompter.note([
|
|
1108
|
+
"The native signer did not durably acknowledge deny-all, so no Fased registration or attachment was removed.",
|
|
1109
|
+
`Detail: ${error instanceof Error ? error.message : String(error)}`,
|
|
1110
|
+
"Repair the signer and retry the archive operation."
|
|
1111
|
+
].join("\n"), "Archive blocked");
|
|
1112
|
+
addAnotherWallet = await prompter.confirm({
|
|
1113
|
+
message: "Run another wallet setup action?",
|
|
1114
|
+
initialValue: false
|
|
1115
|
+
});
|
|
1116
|
+
continue;
|
|
1117
|
+
}
|
|
1107
1118
|
}
|
|
1108
1119
|
for (const key of [rpcEnvKeyFor("solana", walletId)]) {
|
|
1109
1120
|
nextConfig = setConfigEnvVar(nextConfig, key, undefined);
|
|
1110
|
-
delete process.env[key];
|
|
1111
1121
|
}
|
|
1112
1122
|
if (satMiningAttachment.walletId === walletId) {
|
|
1113
1123
|
satMiningAttachment = {};
|
|
@@ -1117,14 +1127,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1117
1127
|
federationBondWalletId = undefined;
|
|
1118
1128
|
nextConfig = clearFederationBondWallet(nextConfig);
|
|
1119
1129
|
}
|
|
1130
|
+
await writeConfigFile(nextConfig);
|
|
1120
1131
|
deleteNamedWallet({
|
|
1121
1132
|
walletId,
|
|
1122
|
-
env:
|
|
1133
|
+
env: archiveEnv
|
|
1123
1134
|
});
|
|
1124
|
-
|
|
1125
|
-
await prompter.note(`
|
|
1135
|
+
delete process.env[rpcEnvKeyFor("solana", walletId)];
|
|
1136
|
+
await prompter.note(archivedSignerPolicy ? `Archived ${targetWallet.name} (${walletId}) from Fased. Native signer wallet ${archivedSignerPolicy.walletId} remains encrypted and locked by deny-all policy version ${archivedSignerPolicy.version}.` : `Removed ${targetWallet.name} (${walletId}) from Fased. Its external custody was not erased.`, "Wallet setup");
|
|
1126
1137
|
} else {
|
|
1127
|
-
await prompter.note("Wallet
|
|
1138
|
+
await prompter.note("Wallet archive cancelled.", "Wallet setup");
|
|
1128
1139
|
}
|
|
1129
1140
|
addAnotherWallet = await prompter.confirm({
|
|
1130
1141
|
message: "Run another wallet setup action?",
|
|
@@ -1188,21 +1199,39 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1188
1199
|
continue;
|
|
1189
1200
|
}
|
|
1190
1201
|
}
|
|
1191
|
-
const mode =
|
|
1202
|
+
const mode = "local-signer-create";
|
|
1192
1203
|
const walletIdentity = await resolveWalletIdentityForOnboarding({
|
|
1193
1204
|
flow,
|
|
1194
1205
|
purpose: walletPurpose
|
|
1195
1206
|
});
|
|
1196
1207
|
const walletName = walletIdentity.walletName;
|
|
1197
1208
|
const walletId = walletIdentity.walletId || undefined;
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1209
|
+
if (selfHostedAction === "import") {
|
|
1210
|
+
const effectiveWalletId = walletId ?? walletPurpose;
|
|
1211
|
+
const hosting = hostProfile === "hosting";
|
|
1212
|
+
const signerBin = hosting ? "/opt/fased/signer/fased-signerd" : resolveSignerdBinaryPath();
|
|
1213
|
+
const controlSocket = hosting ? "/run/fased-signerd/control.sock" : resolveLocalSignerControlSocketPath(process.env);
|
|
1214
|
+
const signerImportCommand = [
|
|
1215
|
+
shellQuote(signerBin),
|
|
1216
|
+
"admin wallet import",
|
|
1217
|
+
`--control-socket ${shellQuote(controlSocket)}`,
|
|
1218
|
+
`--wallet-id ${shellQuote(effectiveWalletId)}`,
|
|
1219
|
+
`--locked-role ${shellQuote(walletPurpose)}`,
|
|
1220
|
+
`< ${shellQuote("/absolute/path/to/solana-keypair.json")}`
|
|
1221
|
+
].join(" ");
|
|
1222
|
+
const command = hosting ? `/usr/sbin/runuser -u fased-signer -- /usr/bin/env HOME=/var/lib/fased-signerd ${signerImportCommand}` : signerImportCommand;
|
|
1223
|
+
await prompter.note([
|
|
1224
|
+
"The normal Gateway and Node wizard paths do not accept plaintext wallet keys. Local same-user isolation is not a hard compromise boundary; Hosting isolates the signer account.",
|
|
1225
|
+
hosting ? "Open the VPS provider root console and run this root-administrator command. Do not run it from the app shell and do not grant app sudo:" : "Run this from an authenticated terminal on the signer host:",
|
|
1226
|
+
command,
|
|
1227
|
+
"Then rerun wallet setup and choose Manage wallet to register/verify the returned public address."
|
|
1228
|
+
].join("\n"), "Native signer import");
|
|
1229
|
+
addAnotherWallet = await prompter.confirm({
|
|
1230
|
+
message: "Run another wallet setup action?",
|
|
1231
|
+
initialValue: false
|
|
1232
|
+
});
|
|
1233
|
+
continue;
|
|
1234
|
+
}
|
|
1206
1235
|
const rpcKey = rpcEnvKeyFor(chain, walletId);
|
|
1207
1236
|
const currentRpcValue = (nextConfig.env?.vars?.[rpcKey] ?? "").trim() || String(process.env[rpcKey] ?? "").trim();
|
|
1208
1237
|
const rpcUrlInput = (await prompter.text({
|
|
@@ -1217,37 +1246,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1217
1246
|
nextConfig = setConfigEnvVar(nextConfig, rpcKey, effectiveRpcUrl);
|
|
1218
1247
|
process.env[rpcKey] = effectiveRpcUrl;
|
|
1219
1248
|
try {
|
|
1220
|
-
let moveToSignerDir = false;
|
|
1221
|
-
if (isolatedTargetKeystorePath && syncFs.existsSync(isolatedTargetKeystorePath)) {
|
|
1222
|
-
moveToSignerDir = await prompter.confirm({
|
|
1223
|
-
message: "Signer keystore already exists. Overwrite it?",
|
|
1224
|
-
initialValue: false
|
|
1225
|
-
});
|
|
1226
|
-
if (!moveToSignerDir) {
|
|
1227
|
-
throw new Error(`Keystore already exists: ${isolatedTargetKeystorePath}`);
|
|
1228
|
-
}
|
|
1229
|
-
}
|
|
1230
|
-
const prevSignerStateDir = process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1231
|
-
const prevPassphraseFile = process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1232
1249
|
if (mode === "local-signer-create") {
|
|
1233
|
-
const showPrivateKeyOnce = await prompter.confirm({
|
|
1234
|
-
message: "Show generated private key once for offline backup?",
|
|
1235
|
-
initialValue: false
|
|
1236
|
-
});
|
|
1237
|
-
const confirmPrivateKeyPrint = showPrivateKeyOnce ? "SHOW PRIVATE KEY" : undefined;
|
|
1238
1250
|
try {
|
|
1239
|
-
if (isolatedSignerRunAsUser) {
|
|
1240
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1241
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1242
|
-
}
|
|
1243
1251
|
await walletSetupCommand(runtime, {
|
|
1244
1252
|
mode,
|
|
1245
1253
|
chain,
|
|
1246
1254
|
walletId,
|
|
1247
1255
|
walletName,
|
|
1248
1256
|
rpcUrl: effectiveRpcUrl,
|
|
1249
|
-
|
|
1250
|
-
confirmPrivateKeyPrint,
|
|
1257
|
+
force: true,
|
|
1251
1258
|
noDoctor: true,
|
|
1252
1259
|
noSignerHints: true,
|
|
1253
1260
|
nonInteractive: true
|
|
@@ -1262,15 +1269,12 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1262
1269
|
if (!overwrite) {
|
|
1263
1270
|
throw err;
|
|
1264
1271
|
}
|
|
1265
|
-
moveToSignerDir = true;
|
|
1266
1272
|
await walletSetupCommand(runtime, {
|
|
1267
1273
|
mode,
|
|
1268
1274
|
chain,
|
|
1269
1275
|
walletId,
|
|
1270
1276
|
walletName,
|
|
1271
1277
|
rpcUrl: effectiveRpcUrl,
|
|
1272
|
-
showPrivateKeyOnce,
|
|
1273
|
-
confirmPrivateKeyPrint,
|
|
1274
1278
|
force: true,
|
|
1275
1279
|
noDoctor: true,
|
|
1276
1280
|
noSignerHints: true,
|
|
@@ -1279,68 +1283,18 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1279
1283
|
} else {
|
|
1280
1284
|
throw err;
|
|
1281
1285
|
}
|
|
1282
|
-
} finally {
|
|
1283
|
-
if (isolatedSignerRunAsUser) {
|
|
1284
|
-
if (prevSignerStateDir == null) {
|
|
1285
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1286
|
-
} else {
|
|
1287
|
-
process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
|
|
1288
|
-
}
|
|
1289
|
-
if (prevPassphraseFile == null) {
|
|
1290
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1291
|
-
} else {
|
|
1292
|
-
process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
|
|
1293
|
-
}
|
|
1294
|
-
}
|
|
1295
1286
|
}
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
if (isolatedSignerRunAsUser) {
|
|
1306
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1307
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1308
|
-
}
|
|
1309
|
-
await walletSetupCommand(runtime, {
|
|
1310
|
-
mode: "local-signer-import",
|
|
1311
|
-
chain,
|
|
1312
|
-
walletId,
|
|
1313
|
-
walletName,
|
|
1314
|
-
privateKey: keyInput.trim(),
|
|
1315
|
-
rpcUrl: effectiveRpcUrl,
|
|
1316
|
-
noDoctor: true,
|
|
1317
|
-
noSignerHints: true,
|
|
1318
|
-
nonInteractive: true
|
|
1319
|
-
});
|
|
1320
|
-
} finally {
|
|
1321
|
-
if (isolatedSignerRunAsUser) {
|
|
1322
|
-
if (prevSignerStateDir == null) {
|
|
1323
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1324
|
-
} else {
|
|
1325
|
-
process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
|
|
1326
|
-
}
|
|
1327
|
-
if (prevPassphraseFile == null) {
|
|
1328
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1329
|
-
} else {
|
|
1330
|
-
process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1287
|
+
if (hostProfile === "hosting") {
|
|
1288
|
+
const nativeWalletId = (walletId ?? walletPurpose).trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
|
|
1289
|
+
await prompter.note([
|
|
1290
|
+
"The wallet key was created inside the root-managed signer with deny-all policy.",
|
|
1291
|
+
"The Gateway has no sudo or root control socket, so RPC activation is a separate host-administrator step.",
|
|
1292
|
+
"From a provider/root console, copy the installed network template to a root-owned mode-0600 file, set the exact RPC URLs, then run:",
|
|
1293
|
+
`/usr/local/sbin/fased-signer-network --wallet-id ${nativeWalletId} --network-file /root/fased-network.json`,
|
|
1294
|
+
"Signing stays disabled until network activation, owner enrollment, and an explicit positive-cap policy all succeed."
|
|
1295
|
+
].join("\n"), "Hosted wallet owner handoff");
|
|
1333
1296
|
}
|
|
1334
1297
|
}
|
|
1335
|
-
let configuredKeystorePath = effectiveKeystorePath;
|
|
1336
|
-
if (isolatedSignerRunAsUser) {
|
|
1337
|
-
configuredKeystorePath = migrateLocalSignerKeystoreToMaterialDir({
|
|
1338
|
-
keystorePath: effectiveKeystorePath,
|
|
1339
|
-
force: moveToSignerDir
|
|
1340
|
-
});
|
|
1341
|
-
nextConfig = setConfigEnvVar(nextConfig, keystoreKey, configuredKeystorePath);
|
|
1342
|
-
process.env[keystoreKey] = configuredKeystorePath;
|
|
1343
|
-
}
|
|
1344
1298
|
walletCeremonyEvents.push({
|
|
1345
1299
|
mode,
|
|
1346
1300
|
chain,
|
|
@@ -1390,9 +1344,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1390
1344
|
});
|
|
1391
1345
|
}
|
|
1392
1346
|
if (walletId) {
|
|
1393
|
-
onboardingWalletSecurityFocus =
|
|
1347
|
+
onboardingWalletSecurityFocus = {
|
|
1394
1348
|
walletId,
|
|
1395
|
-
role:
|
|
1349
|
+
role: walletPurpose
|
|
1396
1350
|
};
|
|
1397
1351
|
}
|
|
1398
1352
|
if (chain === "solana" && walletId) {
|
|
@@ -1421,7 +1375,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1421
1375
|
await prompter.note([
|
|
1422
1376
|
noteHeading("Mining wallet"),
|
|
1423
1377
|
noteBullet(`${walletName} (${walletId})`),
|
|
1424
|
-
noteBullet("
|
|
1378
|
+
noteBullet("Receive-only until the signer network and an owner-reviewed Mining policy are acknowledged."),
|
|
1379
|
+
noteBullet("Open Wallet > Policy after onboarding; fund and start workers only after it reports acknowledged.")
|
|
1425
1380
|
].join("\n"), "Mining");
|
|
1426
1381
|
} else if (currentMiningWalletId && currentMiningWalletId !== walletId) {
|
|
1427
1382
|
await prompter.note([noteHeading("Mining wallet"), noteBullet(`Keeping existing: ${currentMiningWalletId}`)].join("\n"), "Mining");
|
|
@@ -1470,7 +1425,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1470
1425
|
walletId: federationBondWalletId,
|
|
1471
1426
|
walletName: readWalletProviderRegistry(process.env).wallets.find((wallet) => wallet.id === federationBondWalletId)?.name
|
|
1472
1427
|
}) : "not assigned"}`),
|
|
1473
|
-
noteBullet(`Jupiter
|
|
1428
|
+
noteBullet(`Gateway Jupiter swaps: ${readJupiterSwapApiKey() ? "configured" : "not configured"}; Trigger: signer-owned configuration`)
|
|
1474
1429
|
];
|
|
1475
1430
|
const rpcKeys = Array.from(new Set(walletCeremonyEvents.map((evt) => evt.rpcEnvKey).filter((key) => Boolean(key))));
|
|
1476
1431
|
if (rpcKeys.length > 0) {
|