@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
package/scripts/start-managed.sh
CHANGED
|
@@ -105,6 +105,7 @@ if [[ "${FASED_MANAGED_INTERNAL:-0}" != "1" ]]; then
|
|
|
105
105
|
fi
|
|
106
106
|
|
|
107
107
|
set -euo pipefail
|
|
108
|
+
umask 077
|
|
108
109
|
|
|
109
110
|
NODE_BIN="$(resolve_node_bin || true)"
|
|
110
111
|
if [[ -z "$NODE_BIN" ]]; then
|
|
@@ -187,12 +188,53 @@ mask_secret() {
|
|
|
187
188
|
local raw="$1"
|
|
188
189
|
local n=${#raw}
|
|
189
190
|
if [[ $n -le 10 ]]; then
|
|
190
|
-
printf "%s" "
|
|
191
|
+
printf "%s" "[redacted]"
|
|
191
192
|
return
|
|
192
193
|
fi
|
|
193
194
|
printf "%s...%s" "${raw:0:6}" "${raw: -4}"
|
|
194
195
|
}
|
|
195
196
|
|
|
197
|
+
read_private_zrok_reservation() {
|
|
198
|
+
local file="$1"
|
|
199
|
+
local owner="" mode="" links="" size=""
|
|
200
|
+
[[ -f "$file" && ! -L "$file" ]] || return 1
|
|
201
|
+
read -r owner mode links size <<<"$(stat -c '%u %a %h %s' "$file" 2>/dev/null || true)"
|
|
202
|
+
[[ "$mode" =~ ^[0-7]{3,4}$ ]] || return 1
|
|
203
|
+
[[ "$owner" == "$(id -u)" && "$links" == "1" && "$size" =~ ^[0-9]+$ && \
|
|
204
|
+
"$size" -gt 0 && "$size" -le 4096 ]] || return 1
|
|
205
|
+
chmod 0600 "$file"
|
|
206
|
+
local token=""
|
|
207
|
+
IFS= read -r token <"$file" || true
|
|
208
|
+
[[ -n "$token" ]] || return 1
|
|
209
|
+
printf '%s' "$token"
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
write_private_zrok_reservation() {
|
|
213
|
+
local file="$1"
|
|
214
|
+
local token="$2"
|
|
215
|
+
local temp_file=""
|
|
216
|
+
[[ -n "$token" ]] || return 1
|
|
217
|
+
mkdir -p "$(dirname "$file")"
|
|
218
|
+
chmod 0700 "$(dirname "$file")" 2>/dev/null || true
|
|
219
|
+
temp_file="$(mktemp "${file}.tmp.XXXXXXXX")"
|
|
220
|
+
trap 'rm -f -- "${temp_file:-}"' RETURN
|
|
221
|
+
printf '%s\n' "$token" >"$temp_file"
|
|
222
|
+
chmod 0600 "$temp_file"
|
|
223
|
+
mv -f -- "$temp_file" "$file"
|
|
224
|
+
temp_file=""
|
|
225
|
+
chmod 0600 "$file"
|
|
226
|
+
trap - RETURN
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
filter_zrok_runtime_output() {
|
|
230
|
+
local line=""
|
|
231
|
+
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
232
|
+
if [[ "$line" == *"issuedAt of token is in the future"* ]]; then
|
|
233
|
+
printf '%s\n' '[zrok] clock-skew-auth-failure'
|
|
234
|
+
fi
|
|
235
|
+
done
|
|
236
|
+
}
|
|
237
|
+
|
|
196
238
|
is_gateway_listener_ready() {
|
|
197
239
|
(echo >"/dev/tcp/127.0.0.1/${FASED_GATEWAY_PORT}") >/dev/null 2>&1
|
|
198
240
|
}
|
|
@@ -206,21 +248,6 @@ abs_int() {
|
|
|
206
248
|
printf '%s\n' "$value"
|
|
207
249
|
}
|
|
208
250
|
|
|
209
|
-
can_run_privileged_time_sync_command() {
|
|
210
|
-
if [[ "$(id -u)" -eq 0 ]]; then
|
|
211
|
-
return 0
|
|
212
|
-
fi
|
|
213
|
-
command -v sudo >/dev/null 2>&1 && sudo -n true >/dev/null 2>&1
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
run_privileged_time_sync_command() {
|
|
217
|
-
if [[ "$(id -u)" -eq 0 ]]; then
|
|
218
|
-
"$@"
|
|
219
|
-
return $?
|
|
220
|
-
fi
|
|
221
|
-
sudo -n "$@"
|
|
222
|
-
}
|
|
223
|
-
|
|
224
251
|
fetch_remote_epoch_from_http_date() {
|
|
225
252
|
local url="$1"
|
|
226
253
|
local date_header=""
|
|
@@ -261,21 +288,13 @@ measure_managed_clock_skew_seconds() {
|
|
|
261
288
|
}
|
|
262
289
|
|
|
263
290
|
zrok_log_indicates_clock_skew() {
|
|
264
|
-
tail -n 80 "$ZROK_RUNTIME_LOG" 2>/dev/null | grep -Fqi "
|
|
291
|
+
tail -n 80 "$ZROK_RUNTIME_LOG" 2>/dev/null | grep -Fqi "[zrok] clock-skew-auth-failure"
|
|
265
292
|
}
|
|
266
293
|
|
|
267
294
|
attempt_managed_clock_sync_repair() {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
echo "[tunnel] Attempting automatic host clock sync repair..."
|
|
272
|
-
run_privileged_time_sync_command timedatectl set-ntp true >/dev/null 2>&1 || true
|
|
273
|
-
run_privileged_time_sync_command systemctl restart systemd-timesyncd >/dev/null 2>&1 || \
|
|
274
|
-
run_privileged_time_sync_command systemctl restart chronyd >/dev/null 2>&1 || true
|
|
275
|
-
if command -v chronyc >/dev/null 2>&1; then
|
|
276
|
-
run_privileged_time_sync_command chronyc -a makestep >/dev/null 2>&1 || true
|
|
277
|
-
fi
|
|
278
|
-
sleep 2
|
|
295
|
+
# Host time synchronization is installed during root bootstrap. The running
|
|
296
|
+
# Gateway intentionally has no privilege path for changing the host clock.
|
|
297
|
+
return 1
|
|
279
298
|
}
|
|
280
299
|
|
|
281
300
|
ensure_managed_clock_sync() {
|
|
@@ -293,7 +312,7 @@ ensure_managed_clock_sync() {
|
|
|
293
312
|
|
|
294
313
|
echo "[tunnel] WARNING: Host clock skew detected (${skew_seconds}s versus public control plane)."
|
|
295
314
|
if ! attempt_managed_clock_sync_repair; then
|
|
296
|
-
echo "[tunnel] WARNING:
|
|
315
|
+
echo "[tunnel] WARNING: Repair only from the provider root console using the exact tagged, attested Hosting release; never run the app checkout with sudo."
|
|
297
316
|
return 1
|
|
298
317
|
fi
|
|
299
318
|
|
|
@@ -315,7 +334,8 @@ start_initial_zrok_share() {
|
|
|
315
334
|
|
|
316
335
|
while (( attempt <= attempts )); do
|
|
317
336
|
echo "[tunnel] Starting tunnel for ${slug} (attempt ${attempt}/${attempts})..."
|
|
318
|
-
"$ZROK_BIN" share reserved "$RES_TOKEN" --headless
|
|
337
|
+
"$ZROK_BIN" share reserved "$RES_TOKEN" --headless 2>&1 \
|
|
338
|
+
| filter_zrok_runtime_output >>"$ZROK_RUNTIME_LOG" &
|
|
319
339
|
ZROK_PID=$!
|
|
320
340
|
echo "$ZROK_PID" > "$FASED_CONFIG_DIR/.zrok-pid"
|
|
321
341
|
sleep 5
|
|
@@ -349,8 +369,7 @@ start_initial_zrok_share() {
|
|
|
349
369
|
|
|
350
370
|
echo "[tunnel] WARNING: zrok share died during startup."
|
|
351
371
|
if [[ "$VERBOSE_STARTUP" != "1" ]]; then
|
|
352
|
-
echo "[debug]
|
|
353
|
-
tail -n 40 "$ZROK_RUNTIME_LOG" || true
|
|
372
|
+
echo "[debug] zrok output was reduced to non-secret diagnostics in $ZROK_RUNTIME_LOG"
|
|
354
373
|
fi
|
|
355
374
|
if zrok_log_indicates_clock_skew; then
|
|
356
375
|
echo "[tunnel] Detected zrok auth failure caused by host clock skew."
|
|
@@ -454,6 +473,7 @@ mkdir -p "$FASED_CONFIG_DIR"
|
|
|
454
473
|
mkdir -p "$LOG_DIR"
|
|
455
474
|
: > "$ZROK_RUNTIME_LOG"
|
|
456
475
|
: > "$WALLET_SETUP_LOG"
|
|
476
|
+
chmod 0600 "$ZROK_RUNTIME_LOG" "$WALLET_SETUP_LOG"
|
|
457
477
|
SERVICE_GATEWAY_TOKEN="${FASED_GATEWAY_TOKEN:-}"
|
|
458
478
|
if [ ! -f "$GW_TOKEN_PATH" ]; then
|
|
459
479
|
if [[ -n "$SERVICE_GATEWAY_TOKEN" ]]; then
|
|
@@ -480,15 +500,11 @@ start_gateway_if_needed
|
|
|
480
500
|
# 0a. Start local key signer daemon (fased-signerd) if available
|
|
481
501
|
SIGNERD_BIN="${FASED_CONFIG_DIR}/bin/fased-signerd"
|
|
482
502
|
SIGNERD_SOCKET="${FASED_CONFIG_DIR}/wallet/local-signer.sock"
|
|
483
|
-
SIGNERD_BACKEND_SOCKET="$SIGNERD_SOCKET"
|
|
484
503
|
SIGNERD_MATERIAL_DIR="${FASED_CONFIG_DIR}/wallet"
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
504
|
+
SIGNERD_CONTROL_SOCKET="${SIGNERD_MATERIAL_DIR}/local-signer-control.sock"
|
|
505
|
+
SIGNERD_STATE_DB="${SIGNERD_MATERIAL_DIR}/signerd-v2.db"
|
|
506
|
+
SIGNERD_MASTER_KEY="${SIGNERD_MATERIAL_DIR}/signerd-v2.master.key"
|
|
488
507
|
SIGNERD_LOG="${LOG_DIR}/fased-signerd.log"
|
|
489
|
-
SIGNERD_BROKER_LOG="${LOG_DIR}/local-signer-broker.log"
|
|
490
|
-
SIGNER_MAINTENANCE_HELPER="/usr/local/sbin/fased-signer-maintenance"
|
|
491
|
-
SIGNER_ISOLATION_HELPER="/usr/local/sbin/fased-signer-isolation"
|
|
492
508
|
CONFIG_JSON="${FASED_CONFIG_DIR}/fased.json"
|
|
493
509
|
SIGNERD_ENV_FILE="${FASED_CONFIG_DIR}/wallet/signer.env"
|
|
494
510
|
WALLET_REGISTRY_JSON="${FASED_CONFIG_DIR}/wallet/provider-registry.v1.json"
|
|
@@ -513,13 +529,13 @@ load_wallet_signer_env_from_config() {
|
|
|
513
529
|
[[ "$line" == *=* ]] || continue
|
|
514
530
|
local key="${line%%=*}"
|
|
515
531
|
local value="${line#*=}"
|
|
516
|
-
if [[ "$key" =~ ^
|
|
532
|
+
if [[ "$key" =~ ^FASED_WALLET_SOLANA_RPC_URL(__[A-Za-z0-9_-]+)?$ ]] \
|
|
517
533
|
|| [[ "$key" == "FASED_WALLET_CHAINS" ]] \
|
|
518
|
-
|| [[ "$key" == "FASED_WALLET_PASSPHRASE_FILE" ]] \
|
|
519
534
|
|| [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_SOCKET" ]] \
|
|
520
|
-
|| [[ "$key" == "
|
|
535
|
+
|| [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET" ]] \
|
|
536
|
+
|| [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_STATE_DB" ]] \
|
|
537
|
+
|| [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_MASTER_KEY" ]] \
|
|
521
538
|
|| [[ "$key" == "FASED_WALLET_SIGNER_STATE_DIR" ]] \
|
|
522
|
-
|| [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" ]] \
|
|
523
539
|
|| [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_BIN" ]] \
|
|
524
540
|
|| [[ "$key" =~ ^FASED_WALLET_LOCAL_SIGNER_(ROLE|DIRECT_SIGNING|CAPS_ENABLED|SOLANA_MAX_PER_TX|SOLANA_MAX_DAILY|SOLANA_ALLOW_PROGRAMS)(__[A-Za-z0-9_-]+)?$ ]]; then
|
|
525
541
|
export "$key=$value"
|
|
@@ -530,13 +546,13 @@ load_wallet_signer_env_from_config() {
|
|
|
530
546
|
| to_entries[]
|
|
531
547
|
| select(
|
|
532
548
|
.key
|
|
533
|
-
| test("^
|
|
549
|
+
| test("^FASED_WALLET_SOLANA_RPC_URL(__[A-Za-z0-9_-]+)?$")
|
|
534
550
|
or . == "FASED_WALLET_CHAINS"
|
|
535
|
-
or . == "FASED_WALLET_PASSPHRASE_FILE"
|
|
536
551
|
or . == "FASED_WALLET_LOCAL_SIGNER_SOCKET"
|
|
537
|
-
or . == "
|
|
552
|
+
or . == "FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET"
|
|
553
|
+
or . == "FASED_WALLET_LOCAL_SIGNER_STATE_DB"
|
|
554
|
+
or . == "FASED_WALLET_LOCAL_SIGNER_MASTER_KEY"
|
|
538
555
|
or . == "FASED_WALLET_SIGNER_STATE_DIR"
|
|
539
|
-
or . == "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER"
|
|
540
556
|
or . == "FASED_WALLET_LOCAL_SIGNER_BIN"
|
|
541
557
|
or test("^FASED_WALLET_LOCAL_SIGNER_(ROLE|DIRECT_SIGNING|CAPS_ENABLED|SOLANA_MAX_PER_TX|SOLANA_MAX_DAILY|SOLANA_ALLOW_PROGRAMS)(__[A-Za-z0-9_-]+)?$")
|
|
542
558
|
)
|
|
@@ -551,100 +567,32 @@ load_wallet_signer_env_file() {
|
|
|
551
567
|
fi
|
|
552
568
|
|
|
553
569
|
set -a
|
|
554
|
-
# signer.env
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
has_scoped_wallet_env_value() {
|
|
560
|
-
local prefix="$1"
|
|
561
|
-
local name=""
|
|
562
|
-
while IFS= read -r name; do
|
|
563
|
-
[[ -n "$name" ]] || continue
|
|
564
|
-
if [[ -n "${!name:-}" ]]; then
|
|
565
|
-
return 0
|
|
566
|
-
fi
|
|
567
|
-
done < <(compgen -A variable "${prefix}__" || true)
|
|
568
|
-
return 1
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
normalize_wallet_env_suffix() {
|
|
572
|
-
local raw="${1:-}"
|
|
573
|
-
printf '%s' "$raw" \
|
|
574
|
-
| tr '[:upper:]' '[:lower:]' \
|
|
575
|
-
| sed -E 's/[^a-z0-9]+/_/g; s/^_+//; s/_+$//'
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
normalize_wallet_filename_id() {
|
|
579
|
-
local raw="${1:-}"
|
|
580
|
-
printf '%s' "$raw" \
|
|
581
|
-
| tr '[:upper:]' '[:lower:]' \
|
|
582
|
-
| sed -E 's/[^a-z0-9_-]+/-/g; s/^-+//; s/-+$//'
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
hydrate_scoped_wallet_keystore_env_from_registry() {
|
|
586
|
-
local material_dir="$1"
|
|
587
|
-
if [[ ! -f "$WALLET_REGISTRY_JSON" ]] || ! command -v jq >/dev/null 2>&1; then
|
|
588
|
-
return 0
|
|
589
|
-
fi
|
|
590
|
-
|
|
591
|
-
while IFS=$'\t' read -r wallet_id provider_id; do
|
|
592
|
-
[[ -n "$wallet_id" ]] || continue
|
|
593
|
-
if [[ "$provider_id" != "local-socket-signer" && "$provider_id" != "embedded-keystore" ]]; then
|
|
594
|
-
continue
|
|
595
|
-
fi
|
|
596
|
-
local env_suffix
|
|
597
|
-
local file_suffix
|
|
598
|
-
env_suffix="$(normalize_wallet_env_suffix "$wallet_id")"
|
|
599
|
-
file_suffix="$(normalize_wallet_filename_id "$wallet_id")"
|
|
600
|
-
[[ -n "$env_suffix" && -n "$file_suffix" ]] || continue
|
|
601
|
-
|
|
602
|
-
local sol_key="FASED_WALLET_SOLANA_KEYSTORE_PATH__${env_suffix^^}"
|
|
603
|
-
if [[ -z "${!sol_key:-}" ]]; then
|
|
604
|
-
local sol_candidate="${material_dir}/keystore-solana-${file_suffix}.v1.enc"
|
|
605
|
-
if [[ -f "$sol_candidate" ]]; then
|
|
606
|
-
export "$sol_key=$sol_candidate"
|
|
607
|
-
fi
|
|
608
|
-
fi
|
|
609
|
-
|
|
610
|
-
local evm_key="FASED_WALLET_EVM_KEYSTORE_PATH__${env_suffix^^}"
|
|
611
|
-
if [[ -z "${!evm_key:-}" ]]; then
|
|
612
|
-
local evm_candidate="${material_dir}/keystore-evm-${file_suffix}.v1.enc"
|
|
613
|
-
if [[ -f "$evm_candidate" ]]; then
|
|
614
|
-
export "$evm_key=$evm_candidate"
|
|
615
|
-
fi
|
|
616
|
-
fi
|
|
617
|
-
done < <(
|
|
618
|
-
jq -r '
|
|
619
|
-
(.wallets // [])
|
|
620
|
-
| .[]
|
|
621
|
-
| select(.id != null and .providerId != null)
|
|
622
|
-
| "\(.id|tostring)\t\(.providerId|tostring)"
|
|
623
|
-
' "$WALLET_REGISTRY_JSON" 2>/dev/null || true
|
|
570
|
+
# Older signer.env files may contain Node-era key/passphrase variables. Import only
|
|
571
|
+
# the non-custody settings required by the native signer, never every wallet variable.
|
|
572
|
+
source <(
|
|
573
|
+
grep -E '^export FASED_WALLET_(SOLANA_RPC_URL(__[A-Za-z0-9_-]+)?|CHAINS|SIGNER_STATE_DIR|WEBAUTHN_(RP_ID|ORIGINS)|LOCAL_SIGNER_(SOCKET|CONTROL_SOCKET|STATE_DB|MASTER_KEY|BIN|ROLE|DIRECT_SIGNING|CAPS_ENABLED|SOLANA_MAX_PER_TX|SOLANA_MAX_DAILY|SOLANA_ALLOW_PROGRAMS)(__[A-Za-z0-9_-]+)?)=' "$SIGNERD_ENV_FILE" || true
|
|
624
574
|
)
|
|
575
|
+
set +a
|
|
625
576
|
}
|
|
626
577
|
|
|
627
|
-
|
|
628
|
-
local
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
fi
|
|
646
|
-
|
|
647
|
-
printf '%s\n' "$default_path"
|
|
578
|
+
clear_legacy_wallet_key_env() {
|
|
579
|
+
local key
|
|
580
|
+
while IFS= read -r key; do
|
|
581
|
+
case "$key" in
|
|
582
|
+
FASED_WALLET_KEYSTORE_PATH|FASED_WALLET_KEYSTORE_PATH__*|\
|
|
583
|
+
FASED_WALLET_SOLANA_KEYSTORE_PATH|FASED_WALLET_SOLANA_KEYSTORE_PATH__*|\
|
|
584
|
+
FASED_WALLET_EVM_KEYSTORE_PATH|FASED_WALLET_EVM_KEYSTORE_PATH__*|\
|
|
585
|
+
FASED_WALLET_PASSPHRASE|FASED_WALLET_PASSPHRASE__*|\
|
|
586
|
+
FASED_WALLET_PASSPHRASE_FILE|FASED_WALLET_PASSPHRASE_FILE__*|\
|
|
587
|
+
FASED_WALLET_PRIVATE_KEY|FASED_WALLET_PRIVATE_KEY__*|\
|
|
588
|
+
FASED_WALLET_SECRET_KEY|FASED_WALLET_SECRET_KEY__*|\
|
|
589
|
+
FASED_WALLET_KEYPAIR|FASED_WALLET_KEYPAIR__*|\
|
|
590
|
+
FASED_WALLET_MNEMONIC|FASED_WALLET_MNEMONIC__*|\
|
|
591
|
+
FASED_WALLET_SEED|FASED_WALLET_SEED__*)
|
|
592
|
+
unset "$key"
|
|
593
|
+
;;
|
|
594
|
+
esac
|
|
595
|
+
done < <(compgen -A variable | grep -E '^FASED_WALLET_' || true)
|
|
648
596
|
}
|
|
649
597
|
|
|
650
598
|
resolve_wallet_chains_from_config() {
|
|
@@ -693,34 +641,18 @@ registry_has_local_signer_wallet() {
|
|
|
693
641
|
' "$WALLET_REGISTRY_JSON" >/dev/null 2>&1
|
|
694
642
|
}
|
|
695
643
|
|
|
696
|
-
has_local_signer_keystore_material() {
|
|
697
|
-
if [[ -n "${FASED_WALLET_SOLANA_KEYSTORE_PATH:-}" ]] || has_scoped_wallet_env_value "FASED_WALLET_SOLANA_KEYSTORE_PATH"; then
|
|
698
|
-
return 0
|
|
699
|
-
fi
|
|
700
|
-
local candidate
|
|
701
|
-
for candidate in "$SIGNERD_MATERIAL_DIR"/keystore-solana*.v1.enc "$SIGNERD_MATERIAL_DIR"/keystore-evm*.v1.enc; do
|
|
702
|
-
[[ -f "$candidate" ]] && return 0
|
|
703
|
-
done
|
|
704
|
-
return 1
|
|
705
|
-
}
|
|
706
|
-
|
|
707
644
|
should_start_signerd() {
|
|
708
|
-
registry_has_local_signer_wallet
|
|
645
|
+
registry_has_local_signer_wallet
|
|
709
646
|
}
|
|
710
647
|
|
|
711
648
|
collect_existing_signerd_pids() {
|
|
712
|
-
local pid_file
|
|
713
|
-
pid_file="$(resolve_local_signer_sidecar_path "$
|
|
714
|
-
app_pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
|
|
649
|
+
local pid_file
|
|
650
|
+
pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
|
|
715
651
|
{
|
|
716
652
|
if [[ -f "$pid_file" ]]; then
|
|
717
653
|
cat "$pid_file" 2>/dev/null || true
|
|
718
654
|
fi
|
|
719
|
-
if [[ "$app_pid_file" != "$pid_file" && -f "$app_pid_file" ]]; then
|
|
720
|
-
cat "$app_pid_file" 2>/dev/null || true
|
|
721
|
-
fi
|
|
722
655
|
pgrep -f "$SIGNERD_BIN" 2>/dev/null || true
|
|
723
|
-
pgrep -f "wallet signer broker" 2>/dev/null || true
|
|
724
656
|
} | awk '/^[0-9]+$/ { if (!seen[$1]++) print $1 }'
|
|
725
657
|
}
|
|
726
658
|
|
|
@@ -737,16 +669,8 @@ dump_existing_signerd_processes() {
|
|
|
737
669
|
}
|
|
738
670
|
|
|
739
671
|
stop_existing_signerd() {
|
|
740
|
-
local pid_file
|
|
741
|
-
pid_file="$(resolve_local_signer_sidecar_path "$
|
|
742
|
-
app_pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
|
|
743
|
-
if signer_isolation_helper_available; then
|
|
744
|
-
run_signer_isolation_helper stop "$SIGNERD_BACKEND_SOCKET" "$pid_file" >/dev/null 2>&1 || true
|
|
745
|
-
if [[ "$SIGNERD_SOCKET" != "$SIGNERD_BACKEND_SOCKET" ]]; then
|
|
746
|
-
run_signer_isolation_helper stop "$SIGNERD_SOCKET" "$app_pid_file" >/dev/null 2>&1 || true
|
|
747
|
-
fi
|
|
748
|
-
return 0
|
|
749
|
-
fi
|
|
672
|
+
local pid_file
|
|
673
|
+
pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
|
|
750
674
|
local pid=""
|
|
751
675
|
while IFS= read -r pid; do
|
|
752
676
|
[[ "$pid" =~ ^[0-9]+$ ]] || continue
|
|
@@ -757,7 +681,7 @@ stop_existing_signerd() {
|
|
|
757
681
|
[[ "$pid" =~ ^[0-9]+$ ]] || continue
|
|
758
682
|
kill -9 "$pid" >/dev/null 2>&1 || true
|
|
759
683
|
done < <(collect_existing_signerd_pids)
|
|
760
|
-
rm -f "$SIGNERD_SOCKET" "$
|
|
684
|
+
rm -f "$SIGNERD_SOCKET" "$SIGNERD_CONTROL_SOCKET" "$pid_file"
|
|
761
685
|
}
|
|
762
686
|
|
|
763
687
|
wait_for_signerd_ready() {
|
|
@@ -766,7 +690,7 @@ wait_for_signerd_ready() {
|
|
|
766
690
|
while true; do
|
|
767
691
|
local active_count
|
|
768
692
|
active_count="$(count_existing_signerd_pids)"
|
|
769
|
-
if [[ "$active_count" == "1" && -S "$
|
|
693
|
+
if [[ "$active_count" == "1" && -S "$SIGNERD_SOCKET" && -S "$SIGNERD_CONTROL_SOCKET" ]]; then
|
|
770
694
|
return 0
|
|
771
695
|
fi
|
|
772
696
|
if [[ "$active_count" -gt 1 ]]; then
|
|
@@ -785,194 +709,70 @@ wait_for_signerd_ready() {
|
|
|
785
709
|
done
|
|
786
710
|
}
|
|
787
711
|
|
|
788
|
-
wait_for_signer_broker_ready() {
|
|
789
|
-
local retries="$1"
|
|
790
|
-
local count=0
|
|
791
|
-
while true; do
|
|
792
|
-
if [[ -S "$SIGNERD_SOCKET" ]]; then
|
|
793
|
-
return 0
|
|
794
|
-
fi
|
|
795
|
-
sleep 1
|
|
796
|
-
count=$((count + 1))
|
|
797
|
-
if [[ $count -ge $retries ]]; then
|
|
798
|
-
echo "[signerd] ERROR: signer broker did not create app socket within ${retries}s."
|
|
799
|
-
tail -n 40 "$SIGNERD_BROKER_LOG" 2>/dev/null || true
|
|
800
|
-
return 1
|
|
801
|
-
fi
|
|
802
|
-
done
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
collect_wallet_env_args() {
|
|
806
|
-
local key value
|
|
807
|
-
while IFS='=' read -r key value; do
|
|
808
|
-
[[ "$key" == FASED_WALLET_* ]] || continue
|
|
809
|
-
printf '%s=%s\0' "$key" "$value"
|
|
810
|
-
done < <(env)
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
current_app_user() {
|
|
814
|
-
id -un 2>/dev/null || printf '%s\n' "${USER:-app}"
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
signer_isolation_helper_available() {
|
|
818
|
-
[[ -n "${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-}" ]] || return 1
|
|
819
|
-
[[ -x "$SIGNER_MAINTENANCE_HELPER" || -x "$SIGNER_ISOLATION_HELPER" ]] || return 1
|
|
820
|
-
command -v sudo >/dev/null 2>&1 || return 1
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
run_signer_isolation_helper() {
|
|
824
|
-
if [[ -x "$SIGNER_MAINTENANCE_HELPER" ]]; then
|
|
825
|
-
sudo -n -E "$SIGNER_MAINTENANCE_HELPER" "$@"
|
|
826
|
-
else
|
|
827
|
-
local app_user
|
|
828
|
-
app_user="$(current_app_user)"
|
|
829
|
-
sudo -n -E "$SIGNER_ISOLATION_HELPER" "$app_user" "$FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" "$@"
|
|
830
|
-
fi
|
|
831
|
-
}
|
|
832
|
-
|
|
833
712
|
start_signerd_process() {
|
|
834
713
|
local pid_file audit_log
|
|
835
|
-
pid_file="$(resolve_local_signer_sidecar_path "$
|
|
836
|
-
audit_log="$(resolve_local_signer_sidecar_path "$
|
|
837
|
-
if [[ -n "${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-}" ]]; then
|
|
838
|
-
if signer_isolation_helper_available; then
|
|
839
|
-
run_signer_isolation_helper start-signerd \
|
|
840
|
-
"$SIGNERD_BIN" \
|
|
841
|
-
"$SIGNERD_BACKEND_SOCKET" \
|
|
842
|
-
"$pid_file" \
|
|
843
|
-
"$audit_log" \
|
|
844
|
-
>>"$SIGNERD_LOG" 2>&1 &
|
|
845
|
-
return 0
|
|
846
|
-
fi
|
|
847
|
-
if ! command -v sudo >/dev/null 2>&1; then
|
|
848
|
-
return 1
|
|
849
|
-
fi
|
|
850
|
-
local env_args=()
|
|
851
|
-
while IFS= read -r -d '' env_arg; do
|
|
852
|
-
env_args+=("$env_arg")
|
|
853
|
-
done < <(collect_wallet_env_args)
|
|
854
|
-
sudo -n -u "$FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" -H env "${env_args[@]}" \
|
|
855
|
-
"$SIGNERD_BIN" \
|
|
856
|
-
-socket "$SIGNERD_BACKEND_SOCKET" \
|
|
857
|
-
-pid-file "$pid_file" \
|
|
858
|
-
-audit-log "$audit_log" \
|
|
859
|
-
>>"$SIGNERD_LOG" 2>&1 &
|
|
860
|
-
return 0
|
|
861
|
-
fi
|
|
714
|
+
pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
|
|
715
|
+
audit_log="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")"
|
|
862
716
|
"$SIGNERD_BIN" \
|
|
863
|
-
-socket "$
|
|
717
|
+
-socket "$SIGNERD_SOCKET" \
|
|
718
|
+
-control-socket "$SIGNERD_CONTROL_SOCKET" \
|
|
719
|
+
-state-db "$SIGNERD_STATE_DB" \
|
|
720
|
+
-master-key "$SIGNERD_MASTER_KEY" \
|
|
864
721
|
-pid-file "$pid_file" \
|
|
865
722
|
-audit-log "$audit_log" \
|
|
866
723
|
>>"$SIGNERD_LOG" 2>&1 &
|
|
867
724
|
}
|
|
868
725
|
|
|
869
|
-
start_signer_broker_process() {
|
|
870
|
-
if [[ "$SIGNERD_SOCKET" == "$SIGNERD_BACKEND_SOCKET" ]]; then
|
|
871
|
-
return 0
|
|
872
|
-
fi
|
|
873
|
-
local gateway_entry
|
|
874
|
-
gateway_entry="$(resolve_gateway_cli_entry || true)"
|
|
875
|
-
if [[ -z "$gateway_entry" ]]; then
|
|
876
|
-
echo "[signerd] ERROR: signer broker CLI unavailable under $FASED_ROOT/dist"
|
|
877
|
-
return 1
|
|
878
|
-
fi
|
|
879
|
-
if [[ -n "${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-}" ]]; then
|
|
880
|
-
if signer_isolation_helper_available; then
|
|
881
|
-
run_signer_isolation_helper start-broker \
|
|
882
|
-
"$NODE_BIN" \
|
|
883
|
-
"$gateway_entry" \
|
|
884
|
-
"$SIGNERD_SOCKET" \
|
|
885
|
-
"$SIGNERD_BACKEND_SOCKET" \
|
|
886
|
-
"$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" \
|
|
887
|
-
"$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")" \
|
|
888
|
-
>>"$SIGNERD_BROKER_LOG" 2>&1 &
|
|
889
|
-
return 0
|
|
890
|
-
fi
|
|
891
|
-
if ! command -v sudo >/dev/null 2>&1; then
|
|
892
|
-
return 1
|
|
893
|
-
fi
|
|
894
|
-
local env_args=()
|
|
895
|
-
while IFS= read -r -d '' env_arg; do
|
|
896
|
-
env_args+=("$env_arg")
|
|
897
|
-
done < <(collect_wallet_env_args)
|
|
898
|
-
sudo -n -u "$FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" -H env "${env_args[@]}" \
|
|
899
|
-
"$NODE_BIN" "$gateway_entry" wallet signer broker \
|
|
900
|
-
--socket "$SIGNERD_SOCKET" \
|
|
901
|
-
--backend-socket "$SIGNERD_BACKEND_SOCKET" \
|
|
902
|
-
--pid-file "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" \
|
|
903
|
-
--audit-log "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")" \
|
|
904
|
-
>>"$SIGNERD_BROKER_LOG" 2>&1 &
|
|
905
|
-
return 0
|
|
906
|
-
fi
|
|
907
|
-
"$NODE_BIN" "$gateway_entry" wallet signer broker \
|
|
908
|
-
--socket "$SIGNERD_SOCKET" \
|
|
909
|
-
--backend-socket "$SIGNERD_BACKEND_SOCKET" \
|
|
910
|
-
--pid-file "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" \
|
|
911
|
-
--audit-log "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")" \
|
|
912
|
-
>>"$SIGNERD_BROKER_LOG" 2>&1 &
|
|
913
|
-
}
|
|
914
|
-
|
|
915
726
|
load_wallet_signer_env_from_config
|
|
916
727
|
load_wallet_signer_env_file
|
|
728
|
+
clear_legacy_wallet_key_env
|
|
917
729
|
SIGNERD_BIN="${FASED_WALLET_LOCAL_SIGNER_BIN:-$SIGNERD_BIN}"
|
|
918
730
|
SIGNERD_MATERIAL_DIR="${FASED_WALLET_SIGNER_STATE_DIR:-$SIGNERD_MATERIAL_DIR}"
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
if
|
|
731
|
+
SIGNERD_CONTROL_SOCKET="${FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET:-$SIGNERD_MATERIAL_DIR/local-signer-control.sock}"
|
|
732
|
+
SIGNERD_STATE_DB="${FASED_WALLET_LOCAL_SIGNER_STATE_DB:-$SIGNERD_MATERIAL_DIR/signerd-v2.db}"
|
|
733
|
+
SIGNERD_MASTER_KEY="${FASED_WALLET_LOCAL_SIGNER_MASTER_KEY:-$SIGNERD_MATERIAL_DIR/signerd-v2.master.key}"
|
|
734
|
+
HOSTED_ROOT_SIGNER=0
|
|
735
|
+
if [[ "${FASED_HOST_PROFILE:-}" == "hosting" ]]; then
|
|
736
|
+
HOSTED_ROOT_SIGNER=1
|
|
737
|
+
SIGNERD_SOCKET="/run/fased-signerd/app.sock"
|
|
738
|
+
export FASED_WALLET_LOCAL_SIGNER_SOCKET="$SIGNERD_SOCKET"
|
|
739
|
+
unset FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET
|
|
740
|
+
unset FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER
|
|
741
|
+
if [[ -S "$SIGNERD_SOCKET" ]]; then
|
|
742
|
+
SIGNERD_STARTUP_MODE="external"
|
|
743
|
+
echo "==> Using root-managed fased-signerd service (socket: $SIGNERD_SOCKET)"
|
|
744
|
+
else
|
|
745
|
+
mark_signerd_degraded "root-managed fased-signerd socket is unavailable. Repair only from the provider root console using the exact tagged, attested Hosting release; never run the app checkout with sudo."
|
|
746
|
+
fi
|
|
747
|
+
elif should_start_signerd; then
|
|
924
748
|
SIGNERD_STARTUP_MODE="healthy"
|
|
925
749
|
SIGNERD_SOCKET="${FASED_WALLET_LOCAL_SIGNER_SOCKET:-$SIGNERD_SOCKET}"
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
SIGNERD_SOL_KEYSTORE="$(resolve_signerd_keystore_export "${FASED_WALLET_SOLANA_KEYSTORE_PATH:-}" "FASED_WALLET_SOLANA_KEYSTORE_PATH" "$SIGNERD_MATERIAL_DIR/keystore-solana.v1.enc")"
|
|
929
|
-
SIGNERD_PASSPHRASE="${FASED_WALLET_PASSPHRASE:-}"
|
|
930
|
-
SIGNERD_PASSPHRASE_FILE="${FASED_WALLET_PASSPHRASE_FILE:-}"
|
|
750
|
+
unset FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET
|
|
751
|
+
unset FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER
|
|
931
752
|
SIGNERD_CHAINS="${FASED_WALLET_CHAINS:-$(resolve_wallet_chains_from_config)}"
|
|
932
753
|
export FASED_WALLET_LOCAL_SIGNER_SOCKET="$SIGNERD_SOCKET"
|
|
933
|
-
export FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET="$SIGNERD_BACKEND_SOCKET"
|
|
934
754
|
export FASED_WALLET_SIGNER_STATE_DIR="$SIGNERD_MATERIAL_DIR"
|
|
935
755
|
export FASED_WALLET_CHAINS="${SIGNERD_CHAINS:-evm,solana}"
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
fi
|
|
941
|
-
if [[ -n "$SIGNERD_SOL_KEYSTORE" ]]; then
|
|
942
|
-
export FASED_WALLET_SOLANA_KEYSTORE_PATH="$SIGNERD_SOL_KEYSTORE"
|
|
943
|
-
else
|
|
944
|
-
unset FASED_WALLET_SOLANA_KEYSTORE_PATH
|
|
945
|
-
fi
|
|
946
|
-
if [[ -n "$SIGNERD_PASSPHRASE" ]]; then
|
|
947
|
-
export FASED_WALLET_PASSPHRASE="$SIGNERD_PASSPHRASE"
|
|
948
|
-
unset FASED_WALLET_PASSPHRASE_FILE
|
|
949
|
-
else
|
|
950
|
-
SIGNERD_PASSPHRASE_FILE="${SIGNERD_PASSPHRASE_FILE:-$SIGNERD_MATERIAL_DIR/passphrase}"
|
|
951
|
-
export FASED_WALLET_PASSPHRASE_FILE="$SIGNERD_PASSPHRASE_FILE"
|
|
952
|
-
unset FASED_WALLET_PASSPHRASE
|
|
953
|
-
fi
|
|
756
|
+
unset FASED_WALLET_SOLANA_KEYSTORE_PATH
|
|
757
|
+
unset FASED_WALLET_EVM_KEYSTORE_PATH
|
|
758
|
+
unset FASED_WALLET_PASSPHRASE
|
|
759
|
+
unset FASED_WALLET_PASSPHRASE_FILE
|
|
954
760
|
if [[ -f "$SIGNERD_BIN" ]]; then
|
|
955
|
-
if [[ -S "$SIGNERD_SOCKET" ]] || [[ -
|
|
761
|
+
if [[ -S "$SIGNERD_SOCKET" ]] || [[ -f "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" ]] || [[ "$(count_existing_signerd_pids)" -gt 0 ]]; then
|
|
956
762
|
echo "==> Restarting fased-signerd to apply current wallet chain/runtime config..."
|
|
957
763
|
stop_existing_signerd
|
|
958
764
|
fi
|
|
959
765
|
echo "==> Starting fased-signerd (Go key signer)..."
|
|
960
766
|
mkdir -p "$LOG_DIR"
|
|
961
|
-
mkdir -p "$(dirname "$SIGNERD_LOG")"
|
|
767
|
+
mkdir -p "$(dirname "$SIGNERD_LOG")" 2>/dev/null || true
|
|
962
768
|
if start_signerd_process; then
|
|
963
769
|
SIGNERD_PID=$!
|
|
964
770
|
else
|
|
965
|
-
mark_signerd_degraded "failed to start
|
|
771
|
+
mark_signerd_degraded "failed to start fased-signerd as the current Local user. Check $SIGNERD_LOG"
|
|
966
772
|
SIGNERD_PID=""
|
|
967
773
|
fi
|
|
968
774
|
if [[ -n "$SIGNERD_PID" ]] && wait_for_signerd_ready "$SIGNERD_READY_TIMEOUT_SECONDS"; then
|
|
969
|
-
|
|
970
|
-
mark_signerd_degraded "fased-signerd started but signer broker failed. Check $SIGNERD_BROKER_LOG"
|
|
971
|
-
elif wait_for_signer_broker_ready "$SIGNERD_READY_TIMEOUT_SECONDS"; then
|
|
972
|
-
echo "==> fased-signerd started (PID=$SIGNERD_PID, socket: $SIGNERD_BACKEND_SOCKET)"
|
|
973
|
-
else
|
|
974
|
-
mark_signerd_degraded "fased-signerd broker did not become ready. Check $SIGNERD_BROKER_LOG"
|
|
975
|
-
fi
|
|
775
|
+
echo "==> fased-signerd started (PID=$SIGNERD_PID, socket: $SIGNERD_SOCKET)"
|
|
976
776
|
else
|
|
977
777
|
mark_signerd_degraded "fased-signerd did not create socket. Check $SIGNERD_LOG"
|
|
978
778
|
fi
|
|
@@ -1024,9 +824,11 @@ start_health_monitor() {
|
|
|
1024
824
|
ensure_managed_clock_sync || true
|
|
1025
825
|
fi
|
|
1026
826
|
if [[ -n "$RES_TOKEN" ]]; then
|
|
1027
|
-
"$ZROK_BIN" share reserved "$RES_TOKEN" --headless
|
|
827
|
+
"$ZROK_BIN" share reserved "$RES_TOKEN" --headless 2>&1 \
|
|
828
|
+
| filter_zrok_runtime_output >>"$ZROK_RUNTIME_LOG" &
|
|
1028
829
|
else
|
|
1029
|
-
"$ZROK_BIN" share public "http://127.0.0.1:${FASED_GATEWAY_PORT}" --unique-name "$SLUG"
|
|
830
|
+
"$ZROK_BIN" share public "http://127.0.0.1:${FASED_GATEWAY_PORT}" --unique-name "$SLUG" 2>&1 \
|
|
831
|
+
| filter_zrok_runtime_output >>"$ZROK_RUNTIME_LOG" &
|
|
1030
832
|
fi
|
|
1031
833
|
pid=$!
|
|
1032
834
|
echo "$pid" > "$FASED_CONFIG_DIR/.zrok-pid"
|
|
@@ -1217,8 +1019,12 @@ echo "[tunnel] Target Slug: $SLUG"
|
|
|
1217
1019
|
RES_FILE="$FASED_CONFIG_DIR/${SLUG}.zrok-reservation"
|
|
1218
1020
|
RES_TOKEN=""
|
|
1219
1021
|
if [[ -f "$RES_FILE" ]]; then
|
|
1220
|
-
RES_TOKEN
|
|
1221
|
-
|
|
1022
|
+
RES_TOKEN="$(read_private_zrok_reservation "$RES_FILE" || true)"
|
|
1023
|
+
if [[ -n "$RES_TOKEN" ]]; then
|
|
1024
|
+
echo "[tunnel] Found a private cached reservation (token hidden)."
|
|
1025
|
+
else
|
|
1026
|
+
echo "[tunnel] Ignoring an unsafe or unreadable cached reservation file."
|
|
1027
|
+
fi
|
|
1222
1028
|
fi
|
|
1223
1029
|
|
|
1224
1030
|
# Recovery when exact slug file is missing: use the only reservation token in config dir.
|
|
@@ -1226,14 +1032,16 @@ if [[ -z "$RES_TOKEN" ]]; then
|
|
|
1226
1032
|
mapfile -t RES_FILES < <(ls "$FASED_CONFIG_DIR"/*.zrok-reservation 2>/dev/null || true)
|
|
1227
1033
|
if [[ ${#RES_FILES[@]} -eq 1 ]]; then
|
|
1228
1034
|
RES_FILE="${RES_FILES[0]}"
|
|
1229
|
-
RES_TOKEN
|
|
1035
|
+
RES_TOKEN="$(read_private_zrok_reservation "$RES_FILE" || true)"
|
|
1230
1036
|
RECOVERED_BASENAME=$(basename "$RES_FILE")
|
|
1231
1037
|
RECOVERED_SLUG="${RECOVERED_BASENAME%.zrok-reservation}"
|
|
1232
1038
|
if [[ -n "$RECOVERED_SLUG" ]]; then
|
|
1233
1039
|
SLUG="$RECOVERED_SLUG"
|
|
1234
1040
|
echo "[tunnel] Recovered slug from cached reservation filename: $SLUG"
|
|
1235
1041
|
fi
|
|
1236
|
-
|
|
1042
|
+
if [[ -n "$RES_TOKEN" ]]; then
|
|
1043
|
+
echo "[tunnel] Recovered a private cached reservation (token hidden)."
|
|
1044
|
+
fi
|
|
1237
1045
|
fi
|
|
1238
1046
|
fi
|
|
1239
1047
|
|
|
@@ -1274,7 +1082,7 @@ if [[ "$MANAGED_TUNNEL_DISABLED" != "1" && "$ZROK_TOKEN" != "null" && -n "$ZROK_
|
|
|
1274
1082
|
# zrok enable (idempotent-ish, or just try)
|
|
1275
1083
|
# Remove --force as it's not supported in v1.1+
|
|
1276
1084
|
# We ignore error if already enabled, but capture output to be safe
|
|
1277
|
-
"$ZROK_BIN" enable "$ZROK_TOKEN" --description "fased-agent"
|
|
1085
|
+
"$ZROK_BIN" enable "$ZROK_TOKEN" --description "fased-agent" >/dev/null 2>&1 || true
|
|
1278
1086
|
|
|
1279
1087
|
# If no token, check if we already reserved it (recovery from lost file)
|
|
1280
1088
|
if [[ -z "$RES_TOKEN" ]]; then
|
|
@@ -1283,9 +1091,10 @@ if [[ "$MANAGED_TUNNEL_DISABLED" != "1" && "$ZROK_TOKEN" != "null" && -n "$ZROK_
|
|
|
1283
1091
|
EXISTING_TOKEN=$(echo "$OVERVIEW_JSON" | jq -r --arg SLUG "$SLUG" '(.shares // [])[] | select(.frontendEndpoints[] | contains($SLUG)) | .token' 2>/dev/null | head -n 1 || true)
|
|
1284
1092
|
|
|
1285
1093
|
if [[ -n "$EXISTING_TOKEN" ]]; then
|
|
1286
|
-
echo "[tunnel] Recovered existing token
|
|
1094
|
+
echo "[tunnel] Recovered an existing reservation (token hidden)."
|
|
1287
1095
|
RES_TOKEN="$EXISTING_TOKEN"
|
|
1288
|
-
|
|
1096
|
+
write_private_zrok_reservation "$RES_FILE" "$RES_TOKEN"
|
|
1097
|
+
unset EXISTING_TOKEN OVERVIEW_JSON
|
|
1289
1098
|
fi
|
|
1290
1099
|
fi
|
|
1291
1100
|
|
|
@@ -1293,25 +1102,27 @@ if [[ "$MANAGED_TUNNEL_DISABLED" != "1" && "$ZROK_TOKEN" != "null" && -n "$ZROK_
|
|
|
1293
1102
|
if [[ -z "$RES_TOKEN" ]]; then
|
|
1294
1103
|
echo "[tunnel] Reserving public share..."
|
|
1295
1104
|
# Use --json-output to parse output reliably; separate stderr
|
|
1296
|
-
|
|
1105
|
+
ZROK_RESERVE_ARGS=(--unique-name "$SLUG" --backend-mode proxy --json-output)
|
|
1297
1106
|
|
|
1298
1107
|
# Capture logic: stdout to variable, stderr to temp file
|
|
1299
|
-
ZROK_LOG="
|
|
1300
|
-
|
|
1108
|
+
ZROK_LOG="$(mktemp "$FASED_CONFIG_DIR/.zrok-reserve.XXXXXXXX")"
|
|
1109
|
+
chmod 0600 "$ZROK_LOG"
|
|
1110
|
+
OUT=""
|
|
1301
1111
|
|
|
1302
|
-
if OUT=$("$ZROK_BIN" reserve public "http://127.0.0.1:${FASED_GATEWAY_PORT}" $
|
|
1112
|
+
if OUT=$("$ZROK_BIN" reserve public "http://127.0.0.1:${FASED_GATEWAY_PORT}" "${ZROK_RESERVE_ARGS[@]}" 2> "$ZROK_LOG"); then
|
|
1303
1113
|
RES_TOKEN=$(echo "$OUT" | jq -r '.token // empty')
|
|
1304
1114
|
else
|
|
1305
|
-
echo "[tunnel]
|
|
1306
|
-
cat "$ZROK_LOG"
|
|
1115
|
+
echo "[tunnel] Reservation request failed; provider output was suppressed because it may contain credentials."
|
|
1307
1116
|
fi
|
|
1117
|
+
rm -f -- "$ZROK_LOG"
|
|
1118
|
+
unset ZROK_LOG ZROK_RESERVE_ARGS OUT
|
|
1308
1119
|
|
|
1309
1120
|
if [[ -z "$RES_TOKEN" ]]; then
|
|
1310
|
-
echo "[tunnel] Reservation failed or already reserved
|
|
1121
|
+
echo "[tunnel] Reservation failed or was already reserved; secret-bearing output was not logged."
|
|
1311
1122
|
disable_managed_tunnel "Could not establish reserved tunnel for '$SLUG'."
|
|
1312
1123
|
else
|
|
1313
|
-
|
|
1314
|
-
echo "[tunnel] Reserved
|
|
1124
|
+
write_private_zrok_reservation "$RES_FILE" "$RES_TOKEN"
|
|
1125
|
+
echo "[tunnel] Reserved a private share (token hidden)."
|
|
1315
1126
|
fi
|
|
1316
1127
|
fi
|
|
1317
1128
|
|
|
@@ -1439,13 +1250,11 @@ TAILSCALE_ADMIN_URL="N/A"
|
|
|
1439
1250
|
TAILSCALE_SSH_CMD="N/A"
|
|
1440
1251
|
TAILSCALE_SERVE_READY=0
|
|
1441
1252
|
if command -v tailscale >/dev/null 2>&1; then
|
|
1442
|
-
if [[ "${FASED_TAILSCALE_AUTO_SERVE:-1}" == "1" ]]; then
|
|
1253
|
+
if [[ "${FASED_TAILSCALE_AUTO_SERVE:-1}" == "1" && "${FASED_HOST_PROFILE:-}" != "hosting" ]]; then
|
|
1443
1254
|
tailscale serve --bg "http://127.0.0.1:${FASED_GATEWAY_PORT}" >/dev/null 2>&1 || \
|
|
1444
|
-
printf '%s\n' "${FASED_GATEWAY_PORT}" | sudo -n /usr/local/sbin/fased-host-maintenance tailscale-serve >/dev/null 2>&1 || \
|
|
1445
1255
|
tailscale serve https / "http://127.0.0.1:${FASED_GATEWAY_PORT}" >/dev/null 2>&1 || true
|
|
1446
1256
|
fi
|
|
1447
|
-
if tailscale serve status 2>/dev/null | grep -q "127.0.0.1:${FASED_GATEWAY_PORT}"
|
|
1448
|
-
sudo -n /usr/local/sbin/fased-host-maintenance tailscale-serve-status 2>/dev/null | grep -q "127.0.0.1:${FASED_GATEWAY_PORT}"; then
|
|
1257
|
+
if tailscale serve status 2>/dev/null | grep -q "127.0.0.1:${FASED_GATEWAY_PORT}"; then
|
|
1449
1258
|
TAILSCALE_SERVE_READY=1
|
|
1450
1259
|
fi
|
|
1451
1260
|
if command -v jq >/dev/null 2>&1; then
|
|
@@ -1465,22 +1274,20 @@ FED_TOKEN_ID="N/A"
|
|
|
1465
1274
|
FED_EXPIRES_AT="N/A"
|
|
1466
1275
|
FED_AGENT_SLUG="N/A"
|
|
1467
1276
|
FED_PUBLIC_URL="N/A"
|
|
1468
|
-
|
|
1277
|
+
FED_ZROK_CREDENTIAL_STATE="not present"
|
|
1469
1278
|
if command -v jq >/dev/null 2>&1; then
|
|
1470
1279
|
FED_HANDLE=$(jq -r '.handle // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
|
|
1471
1280
|
FED_TOKEN_ID=$(jq -r '.tokenId // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
|
|
1472
1281
|
FED_EXPIRES_AT=$(jq -r '.expiresAt // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
|
|
1473
1282
|
FED_AGENT_SLUG=$(jq -r '.agentSlug // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
|
|
1474
1283
|
FED_PUBLIC_URL=$(jq -r '.publicUrl // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
if [[ -n "$FED_ZROK_TOKEN" ]]; then
|
|
1479
|
-
FED_ZROK_TOKEN_MASKED=$(mask_secret "$FED_ZROK_TOKEN")
|
|
1284
|
+
if jq -e '.zrokToken | type == "string" and length > 0' "$TOKEN_PATH" >/dev/null 2>&1; then
|
|
1285
|
+
FED_ZROK_CREDENTIAL_STATE="present (hidden)"
|
|
1286
|
+
fi
|
|
1480
1287
|
fi
|
|
1481
|
-
|
|
1288
|
+
RES_TOKEN_STATE="not present"
|
|
1482
1289
|
if [[ -n "${RES_TOKEN:-}" ]]; then
|
|
1483
|
-
|
|
1290
|
+
RES_TOKEN_STATE="present (hidden)"
|
|
1484
1291
|
fi
|
|
1485
1292
|
GATEWAY_TOKEN_MASKED=$(mask_secret "$(tr -d '\n' < "$GW_TOKEN_PATH")")
|
|
1486
1293
|
|
|
@@ -1497,11 +1304,11 @@ echo " Token ID: $FED_TOKEN_ID"
|
|
|
1497
1304
|
echo " Expires At: $FED_EXPIRES_AT"
|
|
1498
1305
|
echo " Agent Slug: $FED_AGENT_SLUG"
|
|
1499
1306
|
echo " Public URL (token): $FED_PUBLIC_URL"
|
|
1500
|
-
echo "
|
|
1307
|
+
echo " zrok credential: $FED_ZROK_CREDENTIAL_STATE"
|
|
1501
1308
|
echo "Federation/A2A Tunnel (zrok)"
|
|
1502
1309
|
echo " PID: ${ZROK_PID:-N/A}"
|
|
1503
1310
|
echo " Slug: ${SLUG:-N/A}"
|
|
1504
|
-
echo " Reservation
|
|
1311
|
+
echo " Reservation: $RES_TOKEN_STATE"
|
|
1505
1312
|
echo " Public URL (A2A): $FINAL_URL"
|
|
1506
1313
|
echo " Runtime log: $ZROK_RUNTIME_LOG"
|
|
1507
1314
|
if [[ "$MANAGED_TUNNEL_DISABLED" == "1" ]]; then
|
|
@@ -1583,7 +1390,9 @@ cleanup_managed_runtime() {
|
|
|
1583
1390
|
kill "$ZROK_MONITOR_PID" 2>/dev/null || true
|
|
1584
1391
|
fi
|
|
1585
1392
|
rm -f "$FASED_CONFIG_DIR/.zrok-pid" "$ZROK_MONITOR_PID_FILE" 2>/dev/null || true
|
|
1586
|
-
|
|
1393
|
+
if [[ "${HOSTED_ROOT_SIGNER:-0}" != "1" ]]; then
|
|
1394
|
+
stop_existing_signerd >/dev/null 2>&1 || true
|
|
1395
|
+
fi
|
|
1587
1396
|
force_stop_local_gateway
|
|
1588
1397
|
}
|
|
1589
1398
|
|