@fased/fased 0.1.61 → 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 +43 -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/acp/client.js +2 -2
- package/dist/acp/secret-file.js +2 -2
- package/dist/agents/agent-scope.js +2 -2
- package/dist/agents/apply-patch.js +8 -8
- package/dist/agents/auth-profiles/paths.js +2 -2
- package/dist/agents/auth-profiles/store.js +269 -33
- package/dist/agents/bash-tools.exec.js +10 -4
- package/dist/agents/bash-tools.shared.js +2 -2
- package/dist/agents/cli-credentials.js +4 -4
- package/dist/agents/current-model-catalog.js +3 -3
- package/dist/agents/docs-path.js +3 -3
- package/dist/agents/embedded-pi-mcp.js +4 -4
- package/dist/agents/identity-avatar.js +3 -3
- package/dist/agents/identity-file.js +2 -2
- 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/openai-codex-app-server.js +5 -5
- 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-embedded-subscribe.raw-stream.js +3 -3
- package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
- package/dist/agents/pi-model-discovery.js +6 -6
- package/dist/agents/pi-project-settings.js +3 -3
- 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/sandbox/fs-bridge.js +2 -2
- package/dist/agents/session-dirs.js +4 -4
- package/dist/agents/session-write-lock.js +13 -13
- package/dist/agents/shell-utils.js +5 -5
- package/dist/agents/skills/bundled-dir.js +4 -4
- package/dist/agents/skills/env-overrides.js +38 -28
- package/dist/agents/skills/local-loader.js +6 -6
- package/dist/agents/skills/plugin-skills.js +2 -2
- package/dist/agents/skills/trust.js +93 -0
- package/dist/agents/skills/workspace.js +141 -13
- package/dist/agents/skills-clawhub.js +36 -11
- package/dist/agents/skills-install-download.js +7 -7
- package/dist/agents/skills-install-plan.js +2 -2
- package/dist/agents/skills-install.js +2 -2
- package/dist/agents/skills-marketplace-scan.js +49 -0
- package/dist/agents/skills-status.js +2 -2
- package/dist/agents/subagent-depth.js +2 -2
- package/dist/agents/system-prompt-params.js +2 -2
- 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/agents/workspace.js +22 -22
- package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
- package/dist/auto-reply/reply/agent-runner.js +2 -2
- package/dist/auto-reply/reply/commands-export-session.js +7 -7
- 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/post-compaction-audit.js +3 -3
- package/dist/auto-reply/reply/post-compaction-context.js +3 -3
- package/dist/auto-reply/reply/session-reset-model.js +4 -4
- package/dist/auto-reply/reply/session.js +3 -3
- package/dist/auto-reply/skill-commands.js +3 -3
- package/dist/auto-reply/status.js +6 -6
- package/dist/brand.js +1 -1
- package/dist/browser/chrome.executables.js +3 -3
- package/dist/browser/chrome.js +3 -3
- package/dist/browser/chrome.profile-decoration.js +6 -6
- package/dist/browser/profiles-service.js +2 -2
- package/dist/browser/server-context.js +2 -2
- package/dist/browser/trash.js +4 -4
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/canvas-host/server.js +4 -4
- package/dist/capabilities/catalog.js +3 -3
- package/dist/channel-web.js +2 -2
- package/dist/channels/plugins/catalog.js +3 -3
- package/dist/cli/browser-cli-extension.js +6 -6
- package/dist/cli/command-format.js +2 -2
- package/dist/cli/cron-cli/register.cron-simple.js +2 -2
- package/dist/cli/dns-cli.js +9 -9
- package/dist/cli/gateway-cli/dev.js +5 -5
- package/dist/cli/gateway-cli/run.js +10 -2
- package/dist/cli/hooks-cli.js +5 -5
- package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
- package/dist/cli/memory-cli.js +7 -7
- package/dist/cli/nodes-media-utils.js +2 -2
- package/dist/cli/plugins-cli.js +2 -2
- 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/secrets-cli.js +3 -3
- package/dist/cli/update-cli/update-command.js +260 -11
- package/dist/cli/windows-argv.js +2 -2
- package/dist/commands/auth-choice.apply.api-providers.js +3 -3
- package/dist/commands/dashboard-link.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-install.js +5 -5
- package/dist/commands/doctor-legacy-config.js +2 -13
- package/dist/commands/doctor-memory-search.js +2 -2
- package/dist/commands/doctor-platform-notes.js +2 -2
- package/dist/commands/doctor-sandbox.js +2 -2
- package/dist/commands/doctor-state-integrity.js +23 -23
- package/dist/commands/doctor-workspace.js +3 -3
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/managed-up.js +2 -2
- 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 +35 -11
- 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/onboarding/plugin-install.js +2 -2
- package/dist/commands/sessions-cleanup.js +2 -2
- package/dist/commands/signal-install.js +6 -6
- package/dist/commands/status-all/channels.js +2 -2
- package/dist/commands/wallet.js +570 -1913
- package/dist/config/cache-utils.js +2 -2
- package/dist/config/config.js +2 -2
- package/dist/config/includes.js +5 -5
- package/dist/config/io.js +66 -4
- package/dist/config/paths.js +3 -3
- package/dist/config/sat-runtime-ids.js +3 -3
- package/dist/config/schema.help.js +8 -7
- package/dist/config/schema.labels.js +5 -4
- package/dist/config/sessions/disk-budget.js +6 -6
- package/dist/config/sessions/paths.js +2 -2
- package/dist/config/sessions/store.js +17 -17
- package/dist/config/sessions/transcript.js +4 -4
- package/dist/config/talk.js +2 -2
- package/dist/config/zod-schema.agent-runtime.js +1 -0
- package/dist/config/zod-schema.js +5 -0
- package/dist/control-ui/assets/{app-BXA4gPvN.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-D2QbJhVg.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/cron/service/store.js +2 -2
- package/dist/cron/store.js +6 -6
- package/dist/daemon/systemd-system.js +60 -54
- package/dist/discord/monitor/thread-bindings.state.js +2 -2
- 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 +14 -11
- 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/control-ui-boot-check.js +6 -6
- package/dist/gateway/control-ui-login.js +7 -7
- package/dist/gateway/control-ui.js +9 -9
- 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/hooks-mapping.js +4 -4
- package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
- package/dist/gateway/security-path.js +1 -1
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +1088 -1209
- package/dist/gateway/server-methods/chat.js +3 -3
- package/dist/gateway/server-methods/models.js +1 -1
- package/dist/gateway/server-methods/secrets.js +40 -0
- package/dist/gateway/server-methods/sessions.js +6 -6
- package/dist/gateway/server-methods/usage.js +2 -2
- 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/session-compaction-checkpoints.js +4 -4
- package/dist/gateway/session-utils.fs.js +24 -24
- package/dist/gateway/session-utils.js +6 -6
- package/dist/gateway/sessions-patch.js +3 -5
- package/dist/hooks/bundled-dir.js +4 -4
- package/dist/hooks/gmail-setup-utils.js +6 -6
- package/dist/hooks/import-url.js +2 -2
- package/dist/hooks/loader.js +4 -4
- package/dist/hooks/workspace.js +7 -7
- package/dist/index.js +4 -2
- package/dist/infra/archive.js +17 -17
- package/dist/infra/boundary-file-read.js +2 -2
- package/dist/infra/boundary-path.js +15 -15
- package/dist/infra/brew.js +2 -2
- package/dist/infra/control-ui-assets.js +14 -14
- package/dist/infra/device-auth-store.js +8 -8
- package/dist/infra/device-identity.js +8 -8
- package/dist/infra/dotenv.js +2 -2
- package/dist/infra/exec-approvals.js +8 -8
- package/dist/infra/exec-command-resolution.js +4 -4
- package/dist/infra/exec-safe-bin-trust.js +2 -2
- package/dist/infra/fased-root.js +5 -5
- package/dist/infra/fasedhub.js +64 -1
- package/dist/infra/fs-safe.js +14 -14
- package/dist/infra/gateway-lock.js +11 -11
- package/dist/infra/git-commit.js +5 -5
- package/dist/infra/git-root.js +4 -4
- package/dist/infra/hosted-runtime-artifact.js +3 -3
- package/dist/infra/is-main.js +2 -2
- package/dist/infra/json-file.js +7 -7
- package/dist/infra/local-source-paired-update.js +538 -0
- package/dist/infra/managed-runtime-bootstrap.js +6 -6
- package/dist/infra/outbound/delivery-queue.js +16 -16
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/ports-lsof.js +4 -4
- package/dist/infra/provider-usage.auth.js +3 -3
- package/dist/infra/restart.js +41 -10
- package/dist/infra/safe-open-sync.js +2 -2
- package/dist/infra/session-cost-usage.js +9 -9
- package/dist/infra/shell-env.js +2 -2
- package/dist/infra/state-migrations.fs.js +6 -6
- package/dist/infra/state-migrations.js +23 -23
- package/dist/infra/tmp-fased-dir.js +6 -6
- package/dist/infra/update-runner.js +96 -0
- package/dist/infra/widearea-dns.js +3 -3
- package/dist/infra/wsl.js +2 -2
- package/dist/light-update-status.js +11 -11
- package/dist/line/accounts.js +2 -2
- package/dist/line/download.js +2 -2
- package/dist/logging/config.js +3 -3
- package/dist/logging/logger.js +7 -7
- package/dist/managed/federation.js +3 -3
- package/dist/managed/tunnel.js +3 -3
- package/dist/media/store.js +13 -13
- package/dist/media-understanding/runner.js +3 -3
- package/dist/memory/backend-config.js +2 -1
- package/dist/memory/embeddings.js +2 -2
- package/dist/memory/internal.js +10 -10
- package/dist/memory/manager-sync-ops.js +7 -7
- package/dist/memory/repair-executor.js +17 -17
- package/dist/memory/session-files.js +16 -2
- package/dist/node-host/invoke-system-run-plan.js +8 -8
- package/dist/node-host/invoke.js +2 -2
- package/dist/node-host/runner.js +3 -3
- package/dist/pairing/pairing-store.js +3 -3
- 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-Bv0hUOWL.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-Bk--NU3E.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-CGW6J3Pv.js → config-schema-BOT7kHb6.js} +6779 -3696
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/discord.d.ts +5 -5
- 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 +9 -27
- package/dist/plugin-sdk/index.js +29 -29
- package/dist/plugin-sdk/json-store.js +6 -6
- 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-B9Cmt_Je.js → monitor-BCFDaqJ-.js} +31 -31
- package/dist/plugin-sdk/{monitor-B71iwAgC.js → monitor-BgbjRiPM.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-Du4GMmwo.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-BMkkS038.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-D_bbE6Yd.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 +5 -5
- package/dist/plugin-sdk/slack.js +9 -9
- package/dist/plugin-sdk/{sticker-cache-Dqo9nRhi.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-Cnag7JTH.js → telegram-actions-CC_qN4v0.js} +30 -30
- package/dist/plugin-sdk/telegram.d.ts +5 -5
- 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-CLIvQaVg.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-BYDL6dQj.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-BInKQkc4.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 +5 -5
- package/dist/plugin-sdk/whatsapp.js +12 -12
- package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
- package/dist/plugins/bundled-dir.js +3 -3
- package/dist/plugins/discovery.js +11 -11
- package/dist/plugins/loader.js +13 -13
- package/dist/plugins/manifest-registry.js +2 -2
- package/dist/plugins/manifest.js +4 -4
- package/dist/plugins/path-safety.js +3 -3
- package/dist/plugins/status-cache.js +9 -9
- package/dist/plugins/update.js +3 -3
- package/dist/plugins/web-search-install-catalog.js +3 -3
- package/dist/providers/refresh.js +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/secrets/apply.js +17 -17
- package/dist/secrets/audit.js +11 -11
- package/dist/secrets/runtime.js +1 -1
- package/dist/secrets/shared.js +9 -9
- package/dist/security/scan-paths.js +2 -2
- package/dist/shared/config-eval.js +2 -2
- package/dist/shared/pid-alive.js +2 -2
- package/dist/tasks/standing-orders.js +5 -5
- package/dist/tasks/task-flow-registry.js +5 -5
- package/dist/tasks/task-registry.js +5 -5
- package/dist/tasks/workflow-definitions.js +6 -6
- package/dist/telegram/token.js +5 -5
- package/dist/utils.js +5 -5
- 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 +382 -107
- 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 +20 -31
- package/dist/wallet/wallet-atomic-state.js +53 -0
- package/dist/wallet/wallet-audit-log.js +5 -5
- package/dist/wallet/wallet-canary.js +0 -1
- package/dist/wallet/wallet-inbound-events.js +19 -14
- package/dist/wallet/wallet-observability.js +5 -5
- package/dist/wallet/wallet-policy-simulation.js +1 -1
- package/dist/wallet/wallet-policy.js +95 -41
- package/dist/wallet/wallet-provider-capabilities.js +28 -4
- package/dist/wallet/wallet-provider-registry.js +64 -51
- package/dist/wallet/wallet-provider-resolver.js +62 -63
- package/dist/wallet/wallet-runtime-config.js +31 -44
- package/dist/wallet/wallet-secrets-store.js +44 -22
- package/dist/wallet/wallet-send-approvals.js +1894 -592
- package/dist/wallet/wallet-send-execution-ledger.js +292 -0
- package/dist/wallet/wallet-settlement-links.js +17 -16
- 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/accounts.js +3 -3
- package/dist/web/auth-store.js +18 -18
- package/dist/web/auto-reply/heartbeat-runner.js +1 -1
- package/dist/web/auto-reply/monitor.js +2 -2
- package/dist/web/session.js +4 -4
- package/dist/wizard/host-security-capability.js +15 -24
- package/dist/wizard/onboarding.finalize.js +63 -184
- package/dist/wizard/onboarding.host-security.js +118 -1368
- package/dist/wizard/onboarding.js +180 -242
- package/dist/wizard/onboarding.wallet.js +323 -829
- 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 +18 -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 +18 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +18 -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 +18 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +18 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +18 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +18 -0
- package/extensions/zalouser/package.json +1 -1
- package/install.sh +4955 -0
- package/package.json +24 -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 +217 -0
- 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-BdFQvrvw.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";
|
|
@@ -32,7 +34,7 @@ import { finalizeOnboardingWizard } from "./onboarding.finalize.js";
|
|
|
32
34
|
import { configureGatewayForOnboarding } from "./onboarding.gateway-config.js";
|
|
33
35
|
import { applyHostingSecurity } from "./onboarding.host-security.js";
|
|
34
36
|
import { normalizeHostedWalletPaths } from "./wallet-path-migration.js";
|
|
35
|
-
import
|
|
37
|
+
import syncFs from "node:fs";
|
|
36
38
|
import path from "node:path";
|
|
37
39
|
import { spawn, spawnSync } from "node:child_process";
|
|
38
40
|
|
|
@@ -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) => {
|
|
@@ -446,16 +413,10 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
446
413
|
};
|
|
447
414
|
const readAgentWalletSummary = () => readAgentDefaultWallet().walletId ? readAgentDefaultWallet() : readRoleWallet("agent");
|
|
448
415
|
const goModernEnough = () => {
|
|
449
|
-
const probe = spawnSync("bash", ["-lc", "if [ -n \"${FASED_GO_BIN:-}\" ] && [ -x \"$FASED_GO_BIN\" ]; then GOCMD=\"$FASED_GO_BIN\"; " + "elif [ -x /usr/local/go/bin/go ]; then GOCMD=/usr/local/go/bin/go; " + "elif command -v go >/dev/null 2>&1; then GOCMD=$(command -v go); " + "else exit 1; fi; " + "v=$($GOCMD version 2>/dev/null | awk '{print $3}' | sed 's/^go//'); " + "maj=$(echo \"$v\" | cut -d. -f1); min=$(echo \"$v\" | cut -d. -f2); " + "([ \"${maj:-0}\" -gt 1 ] || ([ \"${maj:-0}\" -eq 1 ] && [ \"${min:-0}\" -ge
|
|
416
|
+
const probe = spawnSync("bash", ["-lc", "if [ -n \"${FASED_GO_BIN:-}\" ] && [ -x \"$FASED_GO_BIN\" ]; then GOCMD=\"$FASED_GO_BIN\"; " + "elif [ -x /usr/local/go/bin/go ]; then GOCMD=/usr/local/go/bin/go; " + "elif command -v go >/dev/null 2>&1; then GOCMD=$(command -v go); " + "else exit 1; fi; " + "v=$($GOCMD version 2>/dev/null | awk '{print $3}' | sed 's/^go//'); " + "maj=$(echo \"$v\" | cut -d. -f1); min=$(echo \"$v\" | cut -d. -f2); patch=$(echo \"$v\" | cut -d. -f3 | sed \"s/[^0-9].*$//\"); " + "([ \"${maj:-0}\" -gt 1 ] || ([ \"${maj:-0}\" -eq 1 ] && ([ \"${min:-0}\" -gt 25 ] || ([ \"${min:-0}\" -eq 25 ] && [ \"${patch:-0}\" -ge 7 ]))))"], { stdio: "ignore" });
|
|
450
417
|
return probe.status === 0;
|
|
451
418
|
};
|
|
452
419
|
const shellQuote = (value) => `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
453
|
-
const hasExplicitSignerAssetSource = () => {
|
|
454
|
-
const baseUrl = String(process.env.FASED_LOCAL_SIGNER_BASE_URL ?? "").trim();
|
|
455
|
-
const version = String(process.env.FASED_LOCAL_SIGNER_VERSION ?? "").trim();
|
|
456
|
-
const latestTag = String(process.env.FASED_LOCAL_SIGNER_LATEST_TAG ?? "").trim();
|
|
457
|
-
return Boolean(baseUrl && !baseUrl.includes("github.com/fased-ai/fased/releases/download") || version && version !== "latest" || latestTag && latestTag !== "latest");
|
|
458
|
-
};
|
|
459
420
|
const runShell = async (command) => {
|
|
460
421
|
await new Promise((resolve, reject) => {
|
|
461
422
|
const proc = spawn("bash", ["-lc", command], {
|
|
@@ -490,11 +451,11 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
490
451
|
if (process.platform !== "linux" || !hasCommand("curl") || !hasCommand("tar")) {
|
|
491
452
|
return "unavailable";
|
|
492
453
|
}
|
|
493
|
-
const goVersion = String(process.env.FASED_GO_VERSION ?? "1.
|
|
454
|
+
const goVersion = String(process.env.FASED_GO_VERSION ?? "1.25.7").trim() || "1.25.7";
|
|
494
455
|
const stateRoot = String(process.env.FASED_STATE_DIR ?? "").trim() || path.join(String(process.env.HOME ?? "").trim() || process.cwd(), ".fased");
|
|
495
456
|
const installRoot = path.join(stateRoot, "toolchains", `go${goVersion}`);
|
|
496
457
|
const goBin = path.join(installRoot, "bin", "go");
|
|
497
|
-
if (
|
|
458
|
+
if (syncFs.existsSync(goBin)) {
|
|
498
459
|
process.env.FASED_GO_BIN = goBin;
|
|
499
460
|
return goModernEnough() ? "installed" : "unavailable";
|
|
500
461
|
}
|
|
@@ -527,7 +488,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
527
488
|
if (String(process.env.FASED_FORCE_NATIVE_SIGNER_BUILD ?? "").trim() === "1") {
|
|
528
489
|
return false;
|
|
529
490
|
}
|
|
530
|
-
return
|
|
491
|
+
return syncFs.existsSync(resolveSignerdBinaryPath(process.env));
|
|
531
492
|
};
|
|
532
493
|
const maybeInstallGoForOnboarding = async () => {
|
|
533
494
|
if (goModernEnough()) {
|
|
@@ -544,7 +505,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
544
505
|
return false;
|
|
545
506
|
}
|
|
546
507
|
const installNow = await prompter.confirm({
|
|
547
|
-
message: "Go >=1.
|
|
508
|
+
message: "Go >=1.25.7 is required for a source-built native signer. Install/update Go now?",
|
|
548
509
|
initialValue: true
|
|
549
510
|
});
|
|
550
511
|
if (!installNow) {
|
|
@@ -552,7 +513,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
552
513
|
}
|
|
553
514
|
const progress = prompter.progress("Installing Go toolchain…");
|
|
554
515
|
try {
|
|
555
|
-
await runShell("arch=$(dpkg --print-architecture 2>/dev/null || uname -m); " + "case \"$arch\" in amd64|x86_64) goarch=amd64 ;; arm64|aarch64) goarch=arm64 ;; *) echo \"Unsupported arch: $arch\"; exit 1 ;; esac; " + "goversion=${FASED_GO_VERSION:-1.
|
|
516
|
+
await runShell("arch=$(dpkg --print-architecture 2>/dev/null || uname -m); " + "case \"$arch\" in amd64|x86_64) goarch=amd64 ;; arm64|aarch64) goarch=arm64 ;; *) echo \"Unsupported arch: $arch\"; exit 1 ;; esac; " + "goversion=${FASED_GO_VERSION:-1.25.7}; " + "tmp=$(mktemp); " + "curl -fsSL \"https://go.dev/dl/go${goversion}.linux-${goarch}.tar.gz\" -o \"$tmp\"; " + "sudo rm -rf /usr/local/go; " + "sudo tar -C /usr/local -xzf \"$tmp\"; " + "rm -f \"$tmp\"; " + "sudo ln -sf /usr/local/go/bin/go /usr/local/bin/go");
|
|
556
517
|
progress.stop("Go toolchain ready.");
|
|
557
518
|
} catch (error) {
|
|
558
519
|
progress.stop("Go toolchain install failed.");
|
|
@@ -560,15 +521,6 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
560
521
|
}
|
|
561
522
|
return goModernEnough();
|
|
562
523
|
};
|
|
563
|
-
const prepareLocalSignerForOnboarding = async (params) => {
|
|
564
|
-
if (fs.existsSync(params.binPath) || String(process.env.FASED_SKIP_NATIVE_SIGNER_BUILD ?? "").trim() === "1" || hasExplicitSignerAssetSource()) {
|
|
565
|
-
return;
|
|
566
|
-
}
|
|
567
|
-
if (goModernEnough()) {
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
await installPrivateGoForOnboarding();
|
|
571
|
-
};
|
|
572
524
|
printWizardHeader(runtime);
|
|
573
525
|
await requireRiskAcknowledgement({
|
|
574
526
|
opts,
|
|
@@ -654,16 +606,25 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
654
606
|
}
|
|
655
607
|
const interactiveHostProfileInitialValue = !hostSecurityCapable && requestedHostProfile === "hosting" ? "local" : requestedHostProfile || "local";
|
|
656
608
|
const explicitHostProfileRequested = requestedHostProfile !== undefined;
|
|
657
|
-
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
|
+
}
|
|
658
617
|
const hostProfile = opts.mode === "remote" ? "local" : requestedHostProfile ? requestedHostProfile : await (async () => {
|
|
659
618
|
const selected = await prompter.select({
|
|
660
619
|
message: "Host setup profile",
|
|
661
620
|
options: [{
|
|
662
621
|
value: "local",
|
|
663
|
-
label: "Local"
|
|
622
|
+
label: "Local",
|
|
623
|
+
hint: "Current machine and account; no VPS hardening."
|
|
664
624
|
}, {
|
|
665
625
|
value: "hosting",
|
|
666
|
-
label: "Hosting"
|
|
626
|
+
label: "Hosting",
|
|
627
|
+
hint: "Verified root bootstrap; Tailscale required."
|
|
667
628
|
}],
|
|
668
629
|
initialValue: interactiveHostProfileInitialValue
|
|
669
630
|
});
|
|
@@ -802,6 +763,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
802
763
|
}));
|
|
803
764
|
const workspaceDir = resolveUserPath(workspaceInput.trim() || DEFAULT_WORKSPACE);
|
|
804
765
|
let nextConfig = applyOnboardingLocalWorkspaceConfig(baseConfig, workspaceDir);
|
|
766
|
+
nextConfig = setConfigEnvVar(nextConfig, legacyJupiterTriggerApiBaseUrlEnvKey, undefined);
|
|
767
|
+
delete process.env[legacyJupiterTriggerApiBaseUrlEnvKey];
|
|
805
768
|
nextConfig = normalizeHostedWalletPaths(nextConfig, process.env);
|
|
806
769
|
const authChoice = opts.authChoice;
|
|
807
770
|
if (authChoice === "custom-api-key") {
|
|
@@ -861,6 +824,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
861
824
|
const hostingMode = hostProfile === "hosting";
|
|
862
825
|
if (hostingMode) {
|
|
863
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}`;
|
|
864
830
|
}
|
|
865
831
|
const buildNativeSignerFromSource = String(process.env.FASED_BUILD_NATIVE_SIGNER_FROM_SOURCE ?? "").trim() === "1";
|
|
866
832
|
const skipNativeSignerBuild = String(process.env.FASED_SKIP_NATIVE_SIGNER_BUILD ?? "").trim() === "1";
|
|
@@ -874,7 +840,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
874
840
|
await prompter.note("Native signer already current.", "Native signer");
|
|
875
841
|
}
|
|
876
842
|
} else if (!await maybeInstallGoForOnboarding()) {
|
|
877
|
-
const detail = "Go >=1.
|
|
843
|
+
const detail = "Go >=1.25.7 is required for a source-built native signer.";
|
|
878
844
|
if (hostingMode && !opts.allowInsecure) {
|
|
879
845
|
throw new Error(`${detail} Install Go and rerun onboarding, or unset FASED_BUILD_NATIVE_SIGNER_FROM_SOURCE.`);
|
|
880
846
|
}
|
|
@@ -895,10 +861,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
895
861
|
flow,
|
|
896
862
|
hostProfile,
|
|
897
863
|
nextConfig,
|
|
898
|
-
prepareLocalSigner: prepareLocalSignerForOnboarding,
|
|
899
864
|
prompter
|
|
900
865
|
});
|
|
901
|
-
nextConfig = syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
|
|
866
|
+
nextConfig = hostingMode ? applyHostedLocalSignerDefaults(nextConfig) : syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
|
|
902
867
|
let onboardingWalletSecurityFocus = null;
|
|
903
868
|
const offerHostedWalletSetup = hostingMode && flow === "quickstart" && nextConfig.wallet?.runtime?.enabled !== true;
|
|
904
869
|
if (nextConfig.wallet?.runtime?.enabled || offerHostedWalletSetup) {
|
|
@@ -922,9 +887,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
922
887
|
label: "Manage wallet"
|
|
923
888
|
},
|
|
924
889
|
{
|
|
925
|
-
value: "
|
|
926
|
-
label: "
|
|
927
|
-
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"
|
|
928
893
|
},
|
|
929
894
|
{
|
|
930
895
|
value: "skip",
|
|
@@ -937,8 +902,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
937
902
|
if (setupMode === "skip") {
|
|
938
903
|
break;
|
|
939
904
|
}
|
|
940
|
-
if (setupMode === "
|
|
941
|
-
await
|
|
905
|
+
if (setupMode === "jupiter-swaps") {
|
|
906
|
+
await promptAndStoreJupiterSwapApi();
|
|
942
907
|
addAnotherWallet = await prompter.confirm({
|
|
943
908
|
message: "Run another wallet setup action?",
|
|
944
909
|
initialValue: false
|
|
@@ -947,7 +912,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
947
912
|
}
|
|
948
913
|
if (setupMode === "manage-self-hosted") {
|
|
949
914
|
const registry = readWalletProviderRegistry(process.env);
|
|
950
|
-
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");
|
|
951
916
|
if (managedWallets.length === 0) {
|
|
952
917
|
await prompter.note("No wallets are registered yet. Create or import one first.", "Wallet setup");
|
|
953
918
|
addAnotherWallet = await prompter.confirm({
|
|
@@ -976,8 +941,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
976
941
|
const currentMiningWalletId = satMiningAttachment.walletId ?? "";
|
|
977
942
|
const currentBondWalletId = federationBondWalletId ?? "";
|
|
978
943
|
const configuredSolanaRpcUrl = (nextConfig.env?.vars?.[rpcEnvKeyFor("solana", walletId)] ?? "").trim() || String(process.env[rpcEnvKeyFor("solana", walletId)] ?? "").trim();
|
|
979
|
-
const
|
|
980
|
-
const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || configuredSolanaKeystore);
|
|
944
|
+
const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || targetWallet.providerId === "local-socket-signer");
|
|
981
945
|
const targetWalletPurpose = resolveWalletUserRole(targetWallet);
|
|
982
946
|
const manageAction = await prompter.select({
|
|
983
947
|
message: "Wallet action",
|
|
@@ -985,7 +949,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
985
949
|
...supportsSolanaWallet ? [{
|
|
986
950
|
value: "configure-solana-rpc",
|
|
987
951
|
label: configuredSolanaRpcUrl ? "Update Solana RPC" : "Add Solana RPC",
|
|
988
|
-
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."
|
|
989
953
|
}] : [],
|
|
990
954
|
...supportsSolanaWallet && currentBondWalletId === walletId ? [{
|
|
991
955
|
value: "detach-federation-bond",
|
|
@@ -997,9 +961,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
997
961
|
hint: currentBondWalletId && currentBondWalletId !== walletId ? `Current bond Vault: ${currentBondWalletId}` : "Use this Vault wallet for longer-lived SAT bond authority."
|
|
998
962
|
}] : [],
|
|
999
963
|
{
|
|
1000
|
-
value: "
|
|
1001
|
-
label: "
|
|
1002
|
-
hint: "
|
|
964
|
+
value: "archive",
|
|
965
|
+
label: "Archive/remove from Fased",
|
|
966
|
+
hint: "Disable signer use first, then remove this wallet registration."
|
|
1003
967
|
},
|
|
1004
968
|
{
|
|
1005
969
|
value: "cancel",
|
|
@@ -1026,8 +990,27 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1026
990
|
walletName: targetWallet.name,
|
|
1027
991
|
currentValue: configuredSolanaRpcUrl
|
|
1028
992
|
});
|
|
1029
|
-
|
|
1030
|
-
|
|
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");
|
|
1031
1014
|
addAnotherWallet = await prompter.confirm({
|
|
1032
1015
|
message: "Run another wallet setup action?",
|
|
1033
1016
|
initialValue: false
|
|
@@ -1079,51 +1062,62 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1079
1062
|
});
|
|
1080
1063
|
continue;
|
|
1081
1064
|
}
|
|
1065
|
+
const archiveEnv = {
|
|
1066
|
+
...process.env,
|
|
1067
|
+
...nextConfig.env?.vars,
|
|
1068
|
+
FASED_HOST_PROFILE: hostProfile
|
|
1069
|
+
};
|
|
1082
1070
|
const deletionSafety = checkNamedWalletDeletionSafety({
|
|
1083
1071
|
walletId: targetWallet.id,
|
|
1084
|
-
env:
|
|
1072
|
+
env: archiveEnv
|
|
1085
1073
|
});
|
|
1086
1074
|
if (!deletionSafety.ok) {
|
|
1087
|
-
await prompter.note(deletionSafety.message, "
|
|
1075
|
+
await prompter.note(deletionSafety.message, "Archive blocked");
|
|
1088
1076
|
addAnotherWallet = await prompter.confirm({
|
|
1089
1077
|
message: "Run another wallet setup action?",
|
|
1090
1078
|
initialValue: false
|
|
1091
1079
|
});
|
|
1092
1080
|
continue;
|
|
1093
1081
|
}
|
|
1094
|
-
const
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
"
|
|
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."
|
|
1098
1087
|
];
|
|
1099
1088
|
if (currentMiningWalletId === targetWallet.id || targetWalletPurpose === "mining") {
|
|
1100
|
-
|
|
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.");
|
|
1101
1090
|
}
|
|
1102
|
-
|
|
1103
|
-
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");
|
|
1104
1093
|
const typedWalletId = await prompter.text({
|
|
1105
|
-
message: `Type wallet id "${targetWallet.id}" to
|
|
1094
|
+
message: `Type wallet id "${targetWallet.id}" to archive/remove this wallet from Fased`,
|
|
1106
1095
|
validate: (value) => value.trim() === targetWallet.id ? undefined : `Type ${targetWallet.id}`
|
|
1107
1096
|
});
|
|
1108
1097
|
if (typedWalletId.trim() === targetWallet.id) {
|
|
1109
1098
|
const walletId = targetWallet.id;
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
const configuredPaths = keystoreKeys.map((key) => (nextConfig.env?.vars?.[key] ?? "").trim() || String(process.env[key] ?? "").trim()).filter(Boolean);
|
|
1113
|
-
for (const file of new Set([...configuredPaths, ...defaultKeystorePaths])) {
|
|
1099
|
+
let archivedSignerPolicy;
|
|
1100
|
+
if (signerOwned) {
|
|
1114
1101
|
try {
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
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
|
+
}
|
|
1123
1118
|
}
|
|
1124
1119
|
for (const key of [rpcEnvKeyFor("solana", walletId)]) {
|
|
1125
1120
|
nextConfig = setConfigEnvVar(nextConfig, key, undefined);
|
|
1126
|
-
delete process.env[key];
|
|
1127
1121
|
}
|
|
1128
1122
|
if (satMiningAttachment.walletId === walletId) {
|
|
1129
1123
|
satMiningAttachment = {};
|
|
@@ -1133,14 +1127,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1133
1127
|
federationBondWalletId = undefined;
|
|
1134
1128
|
nextConfig = clearFederationBondWallet(nextConfig);
|
|
1135
1129
|
}
|
|
1130
|
+
await writeConfigFile(nextConfig);
|
|
1136
1131
|
deleteNamedWallet({
|
|
1137
1132
|
walletId,
|
|
1138
|
-
env:
|
|
1133
|
+
env: archiveEnv
|
|
1139
1134
|
});
|
|
1140
|
-
|
|
1141
|
-
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");
|
|
1142
1137
|
} else {
|
|
1143
|
-
await prompter.note("Wallet
|
|
1138
|
+
await prompter.note("Wallet archive cancelled.", "Wallet setup");
|
|
1144
1139
|
}
|
|
1145
1140
|
addAnotherWallet = await prompter.confirm({
|
|
1146
1141
|
message: "Run another wallet setup action?",
|
|
@@ -1157,7 +1152,6 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1157
1152
|
forceEnable: true,
|
|
1158
1153
|
hostProfile,
|
|
1159
1154
|
nextConfig,
|
|
1160
|
-
prepareLocalSigner: prepareLocalSignerForOnboarding,
|
|
1161
1155
|
prompter
|
|
1162
1156
|
});
|
|
1163
1157
|
nextConfig = syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
|
|
@@ -1205,21 +1199,39 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1205
1199
|
continue;
|
|
1206
1200
|
}
|
|
1207
1201
|
}
|
|
1208
|
-
const mode =
|
|
1202
|
+
const mode = "local-signer-create";
|
|
1209
1203
|
const walletIdentity = await resolveWalletIdentityForOnboarding({
|
|
1210
1204
|
flow,
|
|
1211
1205
|
purpose: walletPurpose
|
|
1212
1206
|
});
|
|
1213
1207
|
const walletName = walletIdentity.walletName;
|
|
1214
1208
|
const walletId = walletIdentity.walletId || undefined;
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
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
|
+
}
|
|
1223
1235
|
const rpcKey = rpcEnvKeyFor(chain, walletId);
|
|
1224
1236
|
const currentRpcValue = (nextConfig.env?.vars?.[rpcKey] ?? "").trim() || String(process.env[rpcKey] ?? "").trim();
|
|
1225
1237
|
const rpcUrlInput = (await prompter.text({
|
|
@@ -1234,37 +1246,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1234
1246
|
nextConfig = setConfigEnvVar(nextConfig, rpcKey, effectiveRpcUrl);
|
|
1235
1247
|
process.env[rpcKey] = effectiveRpcUrl;
|
|
1236
1248
|
try {
|
|
1237
|
-
let moveToSignerDir = false;
|
|
1238
|
-
if (isolatedTargetKeystorePath && fs.existsSync(isolatedTargetKeystorePath)) {
|
|
1239
|
-
moveToSignerDir = await prompter.confirm({
|
|
1240
|
-
message: "Signer keystore already exists. Overwrite it?",
|
|
1241
|
-
initialValue: false
|
|
1242
|
-
});
|
|
1243
|
-
if (!moveToSignerDir) {
|
|
1244
|
-
throw new Error(`Keystore already exists: ${isolatedTargetKeystorePath}`);
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
const prevSignerStateDir = process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1248
|
-
const prevPassphraseFile = process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1249
1249
|
if (mode === "local-signer-create") {
|
|
1250
|
-
const showPrivateKeyOnce = await prompter.confirm({
|
|
1251
|
-
message: "Show generated private key once for offline backup?",
|
|
1252
|
-
initialValue: false
|
|
1253
|
-
});
|
|
1254
|
-
const confirmPrivateKeyPrint = showPrivateKeyOnce ? "SHOW PRIVATE KEY" : undefined;
|
|
1255
1250
|
try {
|
|
1256
|
-
if (isolatedSignerRunAsUser) {
|
|
1257
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1258
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1259
|
-
}
|
|
1260
1251
|
await walletSetupCommand(runtime, {
|
|
1261
1252
|
mode,
|
|
1262
1253
|
chain,
|
|
1263
1254
|
walletId,
|
|
1264
1255
|
walletName,
|
|
1265
1256
|
rpcUrl: effectiveRpcUrl,
|
|
1266
|
-
|
|
1267
|
-
confirmPrivateKeyPrint,
|
|
1257
|
+
force: true,
|
|
1268
1258
|
noDoctor: true,
|
|
1269
1259
|
noSignerHints: true,
|
|
1270
1260
|
nonInteractive: true
|
|
@@ -1279,15 +1269,12 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1279
1269
|
if (!overwrite) {
|
|
1280
1270
|
throw err;
|
|
1281
1271
|
}
|
|
1282
|
-
moveToSignerDir = true;
|
|
1283
1272
|
await walletSetupCommand(runtime, {
|
|
1284
1273
|
mode,
|
|
1285
1274
|
chain,
|
|
1286
1275
|
walletId,
|
|
1287
1276
|
walletName,
|
|
1288
1277
|
rpcUrl: effectiveRpcUrl,
|
|
1289
|
-
showPrivateKeyOnce,
|
|
1290
|
-
confirmPrivateKeyPrint,
|
|
1291
1278
|
force: true,
|
|
1292
1279
|
noDoctor: true,
|
|
1293
1280
|
noSignerHints: true,
|
|
@@ -1296,68 +1283,18 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1296
1283
|
} else {
|
|
1297
1284
|
throw err;
|
|
1298
1285
|
}
|
|
1299
|
-
} finally {
|
|
1300
|
-
if (isolatedSignerRunAsUser) {
|
|
1301
|
-
if (prevSignerStateDir == null) {
|
|
1302
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1303
|
-
} else {
|
|
1304
|
-
process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
|
|
1305
|
-
}
|
|
1306
|
-
if (prevPassphraseFile == null) {
|
|
1307
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1308
|
-
} else {
|
|
1309
|
-
process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
1286
|
}
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
if (isolatedSignerRunAsUser) {
|
|
1323
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1324
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1325
|
-
}
|
|
1326
|
-
await walletSetupCommand(runtime, {
|
|
1327
|
-
mode: "local-signer-import",
|
|
1328
|
-
chain,
|
|
1329
|
-
walletId,
|
|
1330
|
-
walletName,
|
|
1331
|
-
privateKey: keyInput.trim(),
|
|
1332
|
-
rpcUrl: effectiveRpcUrl,
|
|
1333
|
-
noDoctor: true,
|
|
1334
|
-
noSignerHints: true,
|
|
1335
|
-
nonInteractive: true
|
|
1336
|
-
});
|
|
1337
|
-
} finally {
|
|
1338
|
-
if (isolatedSignerRunAsUser) {
|
|
1339
|
-
if (prevSignerStateDir == null) {
|
|
1340
|
-
delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
|
|
1341
|
-
} else {
|
|
1342
|
-
process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
|
|
1343
|
-
}
|
|
1344
|
-
if (prevPassphraseFile == null) {
|
|
1345
|
-
delete process.env.FASED_WALLET_PASSPHRASE_FILE;
|
|
1346
|
-
} else {
|
|
1347
|
-
process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
|
|
1348
|
-
}
|
|
1349
|
-
}
|
|
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");
|
|
1350
1296
|
}
|
|
1351
1297
|
}
|
|
1352
|
-
let configuredKeystorePath = effectiveKeystorePath;
|
|
1353
|
-
if (isolatedSignerRunAsUser) {
|
|
1354
|
-
configuredKeystorePath = migrateLocalSignerKeystoreToMaterialDir({
|
|
1355
|
-
keystorePath: effectiveKeystorePath,
|
|
1356
|
-
force: moveToSignerDir
|
|
1357
|
-
});
|
|
1358
|
-
nextConfig = setConfigEnvVar(nextConfig, keystoreKey, configuredKeystorePath);
|
|
1359
|
-
process.env[keystoreKey] = configuredKeystorePath;
|
|
1360
|
-
}
|
|
1361
1298
|
walletCeremonyEvents.push({
|
|
1362
1299
|
mode,
|
|
1363
1300
|
chain,
|
|
@@ -1407,9 +1344,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1407
1344
|
});
|
|
1408
1345
|
}
|
|
1409
1346
|
if (walletId) {
|
|
1410
|
-
onboardingWalletSecurityFocus =
|
|
1347
|
+
onboardingWalletSecurityFocus = {
|
|
1411
1348
|
walletId,
|
|
1412
|
-
role:
|
|
1349
|
+
role: walletPurpose
|
|
1413
1350
|
};
|
|
1414
1351
|
}
|
|
1415
1352
|
if (chain === "solana" && walletId) {
|
|
@@ -1438,7 +1375,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1438
1375
|
await prompter.note([
|
|
1439
1376
|
noteHeading("Mining wallet"),
|
|
1440
1377
|
noteBullet(`${walletName} (${walletId})`),
|
|
1441
|
-
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.")
|
|
1442
1380
|
].join("\n"), "Mining");
|
|
1443
1381
|
} else if (currentMiningWalletId && currentMiningWalletId !== walletId) {
|
|
1444
1382
|
await prompter.note([noteHeading("Mining wallet"), noteBullet(`Keeping existing: ${currentMiningWalletId}`)].join("\n"), "Mining");
|
|
@@ -1487,7 +1425,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
|
|
|
1487
1425
|
walletId: federationBondWalletId,
|
|
1488
1426
|
walletName: readWalletProviderRegistry(process.env).wallets.find((wallet) => wallet.id === federationBondWalletId)?.name
|
|
1489
1427
|
}) : "not assigned"}`),
|
|
1490
|
-
noteBullet(`Jupiter
|
|
1428
|
+
noteBullet(`Gateway Jupiter swaps: ${readJupiterSwapApiKey() ? "configured" : "not configured"}; Trigger: signer-owned configuration`)
|
|
1491
1429
|
];
|
|
1492
1430
|
const rpcKeys = Array.from(new Set(walletCeremonyEvents.map((evt) => evt.rpcEnvKey).filter((key) => Boolean(key))));
|
|
1493
1431
|
if (rpcKeys.length > 0) {
|