@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
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { resolveMainSessionKeyFromConfig } from "../config/sessions/main-session.js";
|
|
2
|
+
import "../config/sessions.js";
|
|
3
|
+
import { enqueueSystemEvent } from "../infra/system-events.js";
|
|
4
|
+
import { activateSecretsRuntimeSnapshot, clearSecretsRuntimeSnapshot, getActiveSecretsRuntimeSnapshot, prepareSecretsRuntimeSnapshot } from "../secrets/runtime.js";
|
|
5
|
+
import { buildGatewayReloadPlan, diffConfigPaths, resolveGatewayReloadSettings } from "./config-reload.js";
|
|
6
|
+
import { isDeepStrictEqual } from "node:util";
|
|
7
|
+
|
|
8
|
+
//#region src/gateway/server-secrets-runtime.ts
|
|
9
|
+
var GatewaySecretsRuntimeError = class extends Error {
|
|
10
|
+
constructor(code, message, options) {
|
|
11
|
+
super(message, options);
|
|
12
|
+
this.name = "GatewaySecretsRuntimeError";
|
|
13
|
+
this.code = code;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
function sanitizeGatewaySecretsRuntimeError(error) {
|
|
17
|
+
if (error instanceof GatewaySecretsRuntimeError) {
|
|
18
|
+
return {
|
|
19
|
+
code: error.code,
|
|
20
|
+
message: error.message
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
code: "SECRETS_RELOAD_FAILED",
|
|
25
|
+
message: "Secret reload failed without changing the active runtime snapshot. Run `fased secrets audit --check` for local diagnostics."
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function runtimeError(code, message, cause) {
|
|
29
|
+
return new GatewaySecretsRuntimeError(code, message, cause === undefined ? undefined : { cause });
|
|
30
|
+
}
|
|
31
|
+
function normalizeRuntimeError(error, fallbackCode, fallbackMessage) {
|
|
32
|
+
return error instanceof GatewaySecretsRuntimeError ? error : runtimeError(fallbackCode, fallbackMessage, error);
|
|
33
|
+
}
|
|
34
|
+
function invalidSnapshotError(snapshot) {
|
|
35
|
+
const paths = [...new Set(snapshot.issues.map((issue) => issue.path.trim() || "<root>"))].slice(0, 8);
|
|
36
|
+
const suffix = paths.length > 0 ? ` Invalid paths: ${paths.join(", ")}.` : "";
|
|
37
|
+
return runtimeError("SECRETS_CONFIG_INVALID", `Secret reload refused an invalid Gateway config.${suffix} Run \`fased doctor\` locally before retrying.`);
|
|
38
|
+
}
|
|
39
|
+
function missingSnapshotError() {
|
|
40
|
+
return runtimeError("SECRETS_CONFIG_MISSING", "Secret reload refused to replace the active snapshot because the Gateway config file is missing.");
|
|
41
|
+
}
|
|
42
|
+
function staleSourceError() {
|
|
43
|
+
return runtimeError("SECRETS_SOURCE_STALE", "Secret reload discarded a stale config revision; retry after the current config change finishes.");
|
|
44
|
+
}
|
|
45
|
+
function cloneConfig(config) {
|
|
46
|
+
return structuredClone(config);
|
|
47
|
+
}
|
|
48
|
+
function sameSourceSnapshot(left, right) {
|
|
49
|
+
if (left.exists !== right.exists || left.valid !== right.valid) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (left.hash && right.hash) {
|
|
53
|
+
return left.hash === right.hash;
|
|
54
|
+
}
|
|
55
|
+
return isDeepStrictEqual(left.config, right.config);
|
|
56
|
+
}
|
|
57
|
+
function planNeedsHotApply(plan) {
|
|
58
|
+
return plan.hotReasons.length > 0 || plan.reloadHooks || plan.restartGmailWatcher || plan.restartBrowserControl || plan.restartCron || plan.restartHeartbeat || plan.restartChannels.size > 0;
|
|
59
|
+
}
|
|
60
|
+
function assertManualSourceChangeAllowed(params) {
|
|
61
|
+
const changedPaths = diffConfigPaths(params.previous, params.next);
|
|
62
|
+
if (changedPaths.length === 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const plan = buildGatewayReloadPlan(changedPaths);
|
|
66
|
+
const settings = resolveGatewayReloadSettings(params.next);
|
|
67
|
+
if (settings.mode === "restart" || plan.restartGateway) {
|
|
68
|
+
throw runtimeError("SECRETS_SOURCE_RESTART_REQUIRED", "Secret reload refused config changes that require a Gateway restart. Let the config reloader restart the Gateway, then retry.");
|
|
69
|
+
}
|
|
70
|
+
if (planNeedsHotApply(plan)) {
|
|
71
|
+
throw runtimeError("SECRETS_SOURCE_HOT_RELOAD_REQUIRED", "Secret reload refused config changes that require live component reconfiguration. Let the config reloader apply them, then retry.");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function createGatewaySecretsRuntimeController(params) {
|
|
75
|
+
const prepareSnapshot = params.prepareSnapshot ?? prepareSecretsRuntimeSnapshot;
|
|
76
|
+
const activateSnapshot = params.activateSnapshot ?? activateSecretsRuntimeSnapshot;
|
|
77
|
+
const getActiveSnapshot = params.getActiveSnapshot ?? getActiveSecretsRuntimeSnapshot;
|
|
78
|
+
const clearSnapshot = params.clearSnapshot ?? clearSecretsRuntimeSnapshot;
|
|
79
|
+
let activeSourceConfig = null;
|
|
80
|
+
let degraded = false;
|
|
81
|
+
let closed = false;
|
|
82
|
+
let latestGeneration = 0;
|
|
83
|
+
let operationTail = Promise.resolve();
|
|
84
|
+
let shutdownPromise = null;
|
|
85
|
+
const runExclusive = (operation) => {
|
|
86
|
+
const result = operationTail.then(operation, operation);
|
|
87
|
+
operationTail = result.then(() => undefined, () => undefined);
|
|
88
|
+
return result;
|
|
89
|
+
};
|
|
90
|
+
const runTracked = (operation) => {
|
|
91
|
+
const generation = ++latestGeneration;
|
|
92
|
+
return runExclusive(async () => await operation(generation));
|
|
93
|
+
};
|
|
94
|
+
const assertCurrent = (generation) => {
|
|
95
|
+
if (closed) {
|
|
96
|
+
throw runtimeError("SECRETS_RUNTIME_CLOSED", "Secret reload was cancelled because the Gateway is shutting down.");
|
|
97
|
+
}
|
|
98
|
+
if (generation !== latestGeneration) {
|
|
99
|
+
throw staleSourceError();
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const emitTransition = (code) => {
|
|
103
|
+
if (params.emitTransition) {
|
|
104
|
+
params.emitTransition(code);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const text = code === "SECRETS_RELOADER_DEGRADED" ? `[${code}] Secret reload failed; the Gateway kept its last-known-good runtime snapshot.` : `[${code}] Secret references recovered and the Gateway activated a new runtime snapshot.`;
|
|
108
|
+
enqueueSystemEvent(text, {
|
|
109
|
+
sessionKey: resolveMainSessionKeyFromConfig(),
|
|
110
|
+
contextKey: "gateway-secrets-runtime",
|
|
111
|
+
trusted: true
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
const recordReloadFailure = (error) => {
|
|
115
|
+
const safe = sanitizeGatewaySecretsRuntimeError(error);
|
|
116
|
+
params.log.warn(`[SECRETS_RELOADER_DEGRADED] secret reload failed; keeping last-known-good runtime snapshot (${safe.code}): ${safe.message}`);
|
|
117
|
+
if (degraded || closed) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
degraded = true;
|
|
121
|
+
emitTransition("SECRETS_RELOADER_DEGRADED");
|
|
122
|
+
};
|
|
123
|
+
const recordReloadSuccess = () => {
|
|
124
|
+
if (!degraded) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
degraded = false;
|
|
128
|
+
params.log.info("[SECRETS_RELOADER_RECOVERED] secret runtime snapshot recovered");
|
|
129
|
+
emitTransition("SECRETS_RELOADER_RECOVERED");
|
|
130
|
+
};
|
|
131
|
+
const logWarnings = (prepared) => {
|
|
132
|
+
for (const warning of prepared.warnings) {
|
|
133
|
+
params.log.warn(`[${warning.code}] ${warning.message}`);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const prepareSafely = async (config) => {
|
|
137
|
+
try {
|
|
138
|
+
return await prepareSnapshot({ config });
|
|
139
|
+
} catch (error) {
|
|
140
|
+
throw normalizeRuntimeError(error, "SECRETS_RESOLUTION_FAILED", "One or more required secret references could not be resolved. Run `fased secrets audit --check` locally before retrying.");
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const requireReloadableSnapshot = (snapshot) => {
|
|
144
|
+
if (!snapshot.exists) {
|
|
145
|
+
throw missingSnapshotError();
|
|
146
|
+
}
|
|
147
|
+
if (!snapshot.valid) {
|
|
148
|
+
throw invalidSnapshotError(snapshot);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const assertSnapshotStillCurrent = async (expected) => {
|
|
152
|
+
const current = await params.readConfigSnapshot();
|
|
153
|
+
requireReloadableSnapshot(current);
|
|
154
|
+
if (!sameSourceSnapshot(expected, current)) {
|
|
155
|
+
throw staleSourceError();
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const restoreSnapshot = (previous) => {
|
|
159
|
+
try {
|
|
160
|
+
if (previous) {
|
|
161
|
+
activateSnapshot(previous);
|
|
162
|
+
} else {
|
|
163
|
+
clearSnapshot();
|
|
164
|
+
}
|
|
165
|
+
} catch {
|
|
166
|
+
clearSnapshot();
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
const activateStartup = (snapshot) => runTracked(async (generation) => {
|
|
170
|
+
if (!snapshot.valid) {
|
|
171
|
+
throw invalidSnapshotError(snapshot);
|
|
172
|
+
}
|
|
173
|
+
assertCurrent(generation);
|
|
174
|
+
const prepared = await prepareSafely(snapshot.config);
|
|
175
|
+
assertCurrent(generation);
|
|
176
|
+
activateSnapshot(prepared);
|
|
177
|
+
activeSourceConfig = cloneConfig(snapshot.config);
|
|
178
|
+
logWarnings(prepared);
|
|
179
|
+
return prepared;
|
|
180
|
+
});
|
|
181
|
+
const activateHotReload = (snapshot, transaction) => runTracked(async (generation) => {
|
|
182
|
+
try {
|
|
183
|
+
requireReloadableSnapshot(snapshot);
|
|
184
|
+
assertCurrent(generation);
|
|
185
|
+
await assertSnapshotStillCurrent(snapshot);
|
|
186
|
+
assertCurrent(generation);
|
|
187
|
+
const prepared = await prepareSafely(snapshot.config);
|
|
188
|
+
assertCurrent(generation);
|
|
189
|
+
await assertSnapshotStillCurrent(snapshot);
|
|
190
|
+
assertCurrent(generation);
|
|
191
|
+
const previous = getActiveSnapshot();
|
|
192
|
+
activateSnapshot(prepared);
|
|
193
|
+
try {
|
|
194
|
+
await transaction.apply(prepared.config);
|
|
195
|
+
assertCurrent(generation);
|
|
196
|
+
await assertSnapshotStillCurrent(snapshot);
|
|
197
|
+
assertCurrent(generation);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
restoreSnapshot(previous);
|
|
200
|
+
if (previous) {
|
|
201
|
+
try {
|
|
202
|
+
await transaction.rollback(previous.config);
|
|
203
|
+
} catch (rollbackError) {
|
|
204
|
+
throw runtimeError("SECRETS_HOT_APPLY_FAILED", "Gateway hot reload failed. The last-known-good secret snapshot was restored, but one or more live components could not be restored and remain stopped.", rollbackError);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
throw normalizeRuntimeError(error, "SECRETS_HOT_APPLY_FAILED", "Gateway hot reload failed; the last-known-good secret snapshot and live component state were restored.");
|
|
208
|
+
}
|
|
209
|
+
activeSourceConfig = cloneConfig(snapshot.config);
|
|
210
|
+
logWarnings(prepared);
|
|
211
|
+
recordReloadSuccess();
|
|
212
|
+
return prepared;
|
|
213
|
+
} catch (error) {
|
|
214
|
+
const safe = normalizeRuntimeError(error, "SECRETS_RELOAD_FAILED", "Secret reload failed without changing the active runtime snapshot.");
|
|
215
|
+
recordReloadFailure(safe);
|
|
216
|
+
throw safe;
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
const validateRestart = (snapshot) => runTracked(async (generation) => {
|
|
220
|
+
try {
|
|
221
|
+
requireReloadableSnapshot(snapshot);
|
|
222
|
+
assertCurrent(generation);
|
|
223
|
+
await assertSnapshotStillCurrent(snapshot);
|
|
224
|
+
assertCurrent(generation);
|
|
225
|
+
const prepared = await prepareSafely(snapshot.config);
|
|
226
|
+
assertCurrent(generation);
|
|
227
|
+
await assertSnapshotStillCurrent(snapshot);
|
|
228
|
+
assertCurrent(generation);
|
|
229
|
+
logWarnings(prepared);
|
|
230
|
+
return { warningCount: prepared.warnings.length };
|
|
231
|
+
} catch (error) {
|
|
232
|
+
const safe = normalizeRuntimeError(error, "SECRETS_RELOAD_FAILED", "Secret validation failed; the Gateway restart was not scheduled.");
|
|
233
|
+
recordReloadFailure(safe);
|
|
234
|
+
throw safe;
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
const reloadFromConfig = () => runTracked(async (generation) => {
|
|
238
|
+
try {
|
|
239
|
+
assertCurrent(generation);
|
|
240
|
+
const snapshot = await params.readConfigSnapshot();
|
|
241
|
+
requireReloadableSnapshot(snapshot);
|
|
242
|
+
if (!activeSourceConfig) {
|
|
243
|
+
throw runtimeError("SECRETS_RELOAD_FAILED", "Secret reload is unavailable before the startup snapshot is active.");
|
|
244
|
+
}
|
|
245
|
+
assertManualSourceChangeAllowed({
|
|
246
|
+
previous: activeSourceConfig,
|
|
247
|
+
next: snapshot.config
|
|
248
|
+
});
|
|
249
|
+
const prepared = await prepareSafely(snapshot.config);
|
|
250
|
+
assertCurrent(generation);
|
|
251
|
+
await assertSnapshotStillCurrent(snapshot);
|
|
252
|
+
assertCurrent(generation);
|
|
253
|
+
activateSnapshot(prepared);
|
|
254
|
+
activeSourceConfig = cloneConfig(snapshot.config);
|
|
255
|
+
logWarnings(prepared);
|
|
256
|
+
recordReloadSuccess();
|
|
257
|
+
return { warningCount: prepared.warnings.length };
|
|
258
|
+
} catch (error) {
|
|
259
|
+
const safe = normalizeRuntimeError(error, "SECRETS_RELOAD_FAILED", "Secret reload failed without changing the active runtime snapshot.");
|
|
260
|
+
recordReloadFailure(safe);
|
|
261
|
+
throw safe;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
const shutdown = () => {
|
|
265
|
+
if (shutdownPromise) {
|
|
266
|
+
return shutdownPromise;
|
|
267
|
+
}
|
|
268
|
+
closed = true;
|
|
269
|
+
latestGeneration += 1;
|
|
270
|
+
shutdownPromise = (async () => {
|
|
271
|
+
await operationTail;
|
|
272
|
+
activeSourceConfig = null;
|
|
273
|
+
degraded = false;
|
|
274
|
+
clearSnapshot();
|
|
275
|
+
})();
|
|
276
|
+
return shutdownPromise;
|
|
277
|
+
};
|
|
278
|
+
return {
|
|
279
|
+
activateStartup,
|
|
280
|
+
activateHotReload,
|
|
281
|
+
validateRestart,
|
|
282
|
+
reloadFromConfig,
|
|
283
|
+
shutdown
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
//#endregion
|
|
288
|
+
export { createGatewaySecretsRuntimeController, sanitizeGatewaySecretsRuntimeError };
|
|
@@ -17,7 +17,8 @@ import { startDiagnosticHeartbeat, stopDiagnosticHeartbeat } from "../logging/di
|
|
|
17
17
|
import { getTotalQueueSize } from "../process/command-queue.js";
|
|
18
18
|
import { clearAgentRunContext, onAgentEvent } from "../infra/agent-events.js";
|
|
19
19
|
import { initSubagentRegistry } from "../agents/subagent-registry.js";
|
|
20
|
-
import {
|
|
20
|
+
import { resolveWalletRuntimeConfig } from "../wallet/wallet-runtime-config.js";
|
|
21
|
+
import { readWalletProviderRegistry } from "../wallet/wallet-provider-registry.js";
|
|
21
22
|
import { createWalletProviderAdapter, resolveWalletProviderId } from "../wallet/wallet-provider-resolver.js";
|
|
22
23
|
import { getTotalPendingReplies } from "../auto-reply/reply/dispatcher-registry.js";
|
|
23
24
|
import { applyPluginAutoEnable } from "../config/plugin-auto-enable.js";
|
|
@@ -38,6 +39,7 @@ import { createDefaultDeps } from "../cli/deps.js";
|
|
|
38
39
|
import { ensureFasedAgentCliOnPath } from "../infra/path-env.js";
|
|
39
40
|
import { createExecApprovalForwarder } from "../infra/exec-approval-forwarder.js";
|
|
40
41
|
import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
|
|
42
|
+
import { clearSecretsRuntimeSnapshot } from "../secrets/runtime.js";
|
|
41
43
|
import { runOnboardingWizard } from "../wizard/onboarding.js";
|
|
42
44
|
import { startGatewayConfigReloader } from "./config-reload.js";
|
|
43
45
|
import { ExecApprovalManager } from "./exec-approval-manager.js";
|
|
@@ -54,6 +56,8 @@ import { startGatewayMaintenanceTimers } from "./server-maintenance.js";
|
|
|
54
56
|
import { GATEWAY_EVENTS, listGatewayMethods } from "./server-methods-list.js";
|
|
55
57
|
import { coreGatewayHandlers } from "./server-methods.js";
|
|
56
58
|
import { createExecApprovalHandlers } from "./server-methods/exec-approval.js";
|
|
59
|
+
import { createGatewaySecretsRuntimeController, sanitizeGatewaySecretsRuntimeError } from "./server-secrets-runtime.js";
|
|
60
|
+
import { createSecretsHandlers } from "./server-methods/secrets.js";
|
|
57
61
|
import { hasConnectedMobileNode } from "./server-mobile-nodes.js";
|
|
58
62
|
import { createNodeSubscriptionManager } from "./server-node-subscriptions.js";
|
|
59
63
|
import { loadGatewayPlugins } from "./server-plugins.js";
|
|
@@ -68,7 +72,6 @@ import { createWizardSessionTracker } from "./server-wizard-sessions.js";
|
|
|
68
72
|
import { attachGatewayWsHandlers } from "./server-ws-runtime.js";
|
|
69
73
|
import { loadGatewayTlsRuntime } from "./server/tls.js";
|
|
70
74
|
import { createSessionEventSubscriberRegistry, createSessionMessageSubscriberRegistry } from "./session-event-subscribers.js";
|
|
71
|
-
import fs from "node:fs";
|
|
72
75
|
import path from "node:path";
|
|
73
76
|
|
|
74
77
|
//#region src/gateway/server.impl.ts
|
|
@@ -88,25 +91,6 @@ const logWsControl = log.child("ws");
|
|
|
88
91
|
const gatewayRuntime = runtimeForLogger(log);
|
|
89
92
|
const canvasRuntime = runtimeForLogger(logCanvas);
|
|
90
93
|
const LOCAL_SIGNER_STARTUP_RECOVERY_TIMEOUT_MS = 2e3;
|
|
91
|
-
function hasConfiguredLocalSignerKeystoreMaterial(env) {
|
|
92
|
-
for (const [key, rawValue] of Object.entries(env)) {
|
|
93
|
-
if (typeof rawValue !== "string" || rawValue.trim().length === 0) {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (key === "FASED_WALLET_SOLANA_KEYSTORE_PATH" || key.startsWith("FASED_WALLET_SOLANA_KEYSTORE_PATH__")) {
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
const materialDir = resolveLocalSignerMaterialRootDir(env);
|
|
102
|
-
if (!fs.existsSync(materialDir)) {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
return fs.readdirSync(materialDir, { withFileTypes: true }).some((entry) => entry.isFile() && /^keystore-solana(?:-.+)?\.v1\.enc$/i.test(entry.name));
|
|
106
|
-
} catch {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
94
|
async function ensureLocalSignerReadyAtGatewayStart(cfg) {
|
|
111
95
|
const effectiveEnv = {
|
|
112
96
|
...process.env,
|
|
@@ -116,8 +100,8 @@ async function ensureLocalSignerReadyAtGatewayStart(cfg) {
|
|
|
116
100
|
if (providerId !== "local-socket-signer") {
|
|
117
101
|
return;
|
|
118
102
|
}
|
|
119
|
-
if (!
|
|
120
|
-
log.debug("local signer startup check skipped: no
|
|
103
|
+
if (!readWalletProviderRegistry(effectiveEnv).wallets.some((wallet) => wallet.providerId === "local-socket-signer")) {
|
|
104
|
+
log.debug("local signer startup check skipped: no signer-owned wallet is registered");
|
|
121
105
|
return;
|
|
122
106
|
}
|
|
123
107
|
const wallet = resolveWalletRuntimeConfig(cfg, effectiveEnv);
|
|
@@ -152,6 +136,14 @@ async function ensureLocalSignerReadyAtGatewayStart(cfg) {
|
|
|
152
136
|
}
|
|
153
137
|
}
|
|
154
138
|
async function startGatewayServer(port = 18789, opts = {}) {
|
|
139
|
+
try {
|
|
140
|
+
return await startGatewayServerInternal(port, opts);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
clearSecretsRuntimeSnapshot();
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function startGatewayServerInternal(port, opts) {
|
|
155
147
|
const minimalTestGateway = process.env.VITEST === "1" && process.env.FASED_TEST_MINIMAL_GATEWAY === "1";
|
|
156
148
|
process.env.FASED_GATEWAY_PORT = String(port);
|
|
157
149
|
logAcceptedEnvOption({
|
|
@@ -197,6 +189,19 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
197
189
|
log.warn(`gateway: failed to persist plugin auto-enable changes: ${String(err)}`);
|
|
198
190
|
}
|
|
199
191
|
}
|
|
192
|
+
configSnapshot = await startupTrace.measure("config.secrets-source", () => readConfigFileSnapshot());
|
|
193
|
+
if (configSnapshot.exists && !configSnapshot.valid) {
|
|
194
|
+
const issues = configSnapshot.issues.map((issue) => `${issue.path || "<root>"}: ${issue.message}`).join("\n");
|
|
195
|
+
throw new Error(`Invalid config at ${configSnapshot.path}.\n${issues || "Unknown validation issue."}\nRun "${formatCliCommand("fased doctor")}" to repair, then retry.`);
|
|
196
|
+
}
|
|
197
|
+
const secretsRuntime = createGatewaySecretsRuntimeController({
|
|
198
|
+
readConfigSnapshot: readConfigFileSnapshot,
|
|
199
|
+
log: logReload
|
|
200
|
+
});
|
|
201
|
+
const startupSecretsSnapshot = await startupTrace.measure("secrets.activate", () => secretsRuntime.activateStartup(configSnapshot)).catch((error) => {
|
|
202
|
+
const safe = sanitizeGatewaySecretsRuntimeError(error);
|
|
203
|
+
throw new Error(`Startup failed: required secrets are unavailable (${safe.code}). ${safe.message}`);
|
|
204
|
+
});
|
|
200
205
|
const cfgAtStart = startupTrace.measureSync("config.load", () => loadConfig());
|
|
201
206
|
const diagnosticsEnabled = isDiagnosticsEnabled(cfgAtStart);
|
|
202
207
|
if (diagnosticsEnabled) {
|
|
@@ -534,6 +539,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
534
539
|
const execApprovalForwarder = createExecApprovalForwarder();
|
|
535
540
|
const execApprovalHandlers = createExecApprovalHandlers(execApprovalManager, { forwarder: execApprovalForwarder });
|
|
536
541
|
Object.assign(extraGatewayHandlers, execApprovalHandlers);
|
|
542
|
+
Object.assign(extraGatewayHandlers, createSecretsHandlers({ reloadSecrets: secretsRuntime.reloadFromConfig }));
|
|
537
543
|
const canvasHostServerPort = canvasHostServer?.port;
|
|
538
544
|
startupTrace.measureSync("ws.attach", () => {
|
|
539
545
|
attachGatewayWsHandlers({
|
|
@@ -653,7 +659,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
653
659
|
}
|
|
654
660
|
}
|
|
655
661
|
const configReloader = minimalTestGateway ? { stop: async () => {} } : startupTrace.measureSync("config-reload.start", () => {
|
|
656
|
-
const {
|
|
662
|
+
const { cancelPendingGatewayRestart, createHotReloadTransaction, requestGatewayRestart } = createGatewayReloadHandlers({
|
|
657
663
|
deps,
|
|
658
664
|
broadcast,
|
|
659
665
|
getState: () => ({
|
|
@@ -679,10 +685,29 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
679
685
|
logReload
|
|
680
686
|
});
|
|
681
687
|
return startGatewayConfigReloader({
|
|
682
|
-
initialConfig:
|
|
688
|
+
initialConfig: startupSecretsSnapshot.sourceConfig,
|
|
683
689
|
readSnapshot: readConfigFileSnapshot,
|
|
684
|
-
|
|
685
|
-
|
|
690
|
+
onSourceRevision: () => {
|
|
691
|
+
cancelPendingGatewayRestart();
|
|
692
|
+
},
|
|
693
|
+
onStop: () => {
|
|
694
|
+
cancelPendingGatewayRestart();
|
|
695
|
+
},
|
|
696
|
+
onHotReload: async (plan, _nextConfig, snapshot) => {
|
|
697
|
+
const transaction = createHotReloadTransaction(plan);
|
|
698
|
+
await secretsRuntime.activateHotReload(snapshot, {
|
|
699
|
+
apply: async (preparedConfig) => {
|
|
700
|
+
await transaction.apply(preparedConfig);
|
|
701
|
+
},
|
|
702
|
+
rollback: async (previousConfig) => {
|
|
703
|
+
await transaction.rollback(previousConfig);
|
|
704
|
+
}
|
|
705
|
+
});
|
|
706
|
+
},
|
|
707
|
+
onRestart: async (plan, nextConfig, snapshot) => {
|
|
708
|
+
await secretsRuntime.validateRestart(snapshot);
|
|
709
|
+
requestGatewayRestart(plan, nextConfig);
|
|
710
|
+
},
|
|
686
711
|
log: {
|
|
687
712
|
info: (msg) => logReload.info(msg),
|
|
688
713
|
warn: (msg) => logReload.warn(msg),
|
|
@@ -722,22 +747,28 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
722
747
|
}]
|
|
723
748
|
});
|
|
724
749
|
return { close: async (opts) => {
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
750
|
+
try {
|
|
751
|
+
await runGlobalGatewayStopSafely({
|
|
752
|
+
event: { reason: opts?.reason ?? "gateway stopping" },
|
|
753
|
+
ctx: { port },
|
|
754
|
+
onError: (err) => log.warn(`gateway_stop hook failed: ${String(err)}`)
|
|
755
|
+
});
|
|
756
|
+
await configReloader.stop().catch(() => {});
|
|
757
|
+
await secretsRuntime.shutdown();
|
|
758
|
+
if (diagnosticsEnabled) {
|
|
759
|
+
stopDiagnosticHeartbeat();
|
|
760
|
+
stopDiagnosticStabilityRecorder();
|
|
761
|
+
}
|
|
762
|
+
if (skillsRefreshTimer) {
|
|
763
|
+
clearTimeout(skillsRefreshTimer);
|
|
764
|
+
skillsRefreshTimer = null;
|
|
765
|
+
}
|
|
766
|
+
skillsChangeUnsub();
|
|
767
|
+
authRateLimiter?.dispose();
|
|
768
|
+
await close(opts);
|
|
769
|
+
} finally {
|
|
770
|
+
await secretsRuntime.shutdown();
|
|
737
771
|
}
|
|
738
|
-
skillsChangeUnsub();
|
|
739
|
-
authRateLimiter?.dispose();
|
|
740
|
-
await close(opts);
|
|
741
772
|
} };
|
|
742
773
|
}
|
|
743
774
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isSessionCompactionCheckpointArtifactName } from "../config/sessions/artifacts.js";
|
|
2
2
|
import "../config/sessions.js";
|
|
3
|
-
import
|
|
3
|
+
import syncFs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
|
|
@@ -88,7 +88,7 @@ function deleteCheckpointSnapshotIfSafe(filePath, expectedDir) {
|
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
90
|
try {
|
|
91
|
-
|
|
91
|
+
syncFs.unlinkSync(resolved);
|
|
92
92
|
} catch {}
|
|
93
93
|
}
|
|
94
94
|
function cleanupSessionCompactionSnapshot(reference) {
|
|
@@ -105,7 +105,7 @@ function captureSessionCompactionSnapshot(params) {
|
|
|
105
105
|
const resolved = path.resolve(sessionFile);
|
|
106
106
|
let stat;
|
|
107
107
|
try {
|
|
108
|
-
stat =
|
|
108
|
+
stat = syncFs.statSync(resolved);
|
|
109
109
|
} catch {
|
|
110
110
|
return null;
|
|
111
111
|
}
|
|
@@ -123,7 +123,7 @@ function captureSessionCompactionSnapshot(params) {
|
|
|
123
123
|
const base = path.basename(resolved, ".jsonl");
|
|
124
124
|
const snapshotFile = path.join(dir, `${base}.checkpoint.${randomUUID()}.jsonl`);
|
|
125
125
|
try {
|
|
126
|
-
|
|
126
|
+
syncFs.copyFileSync(resolved, snapshotFile);
|
|
127
127
|
} catch {
|
|
128
128
|
return null;
|
|
129
129
|
}
|