@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
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
import fsp from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { pathToFileURL } from "node:url";
|
|
5
|
+
import {
|
|
6
|
+
authorizePreactivatedHostedGateway,
|
|
7
|
+
beginPreactivatedHostedTransaction,
|
|
8
|
+
} from "./fased-managed-updater.mjs";
|
|
5
9
|
import {
|
|
6
10
|
assertManagedRuntime,
|
|
7
11
|
atomicSymlink,
|
|
@@ -10,12 +14,26 @@ import {
|
|
|
10
14
|
copyExecutable,
|
|
11
15
|
normalizeManagedProfile,
|
|
12
16
|
readHostedRuntimeMetadata,
|
|
17
|
+
readHostedReleaseBinding,
|
|
13
18
|
readManagedInstallManifest,
|
|
14
19
|
readPackageVersion,
|
|
15
20
|
resolveLinkTarget,
|
|
16
21
|
resolveManagedRuntimePaths,
|
|
17
22
|
} from "./managed-runtime-layout.mjs";
|
|
18
23
|
|
|
24
|
+
const DEFAULT_HOST_TRANSACTION_TIMEOUT_MS = 2 * 60_000;
|
|
25
|
+
const HOST_TRANSACTION_ID_PATTERN =
|
|
26
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
27
|
+
|
|
28
|
+
function signerReleaseIdentitiesEqual(left, right) {
|
|
29
|
+
return (
|
|
30
|
+
left?.version === right?.version &&
|
|
31
|
+
left?.commit === right?.commit &&
|
|
32
|
+
left?.buildInputDigest === right?.buildInputDigest &&
|
|
33
|
+
left?.development === right?.development
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
19
37
|
function parseArgs(argv) {
|
|
20
38
|
const rollback = argv[0] === "--rollback";
|
|
21
39
|
const tokens = rollback ? argv.slice(1) : argv;
|
|
@@ -44,9 +62,48 @@ function parseArgs(argv) {
|
|
|
44
62
|
stateDir: path.resolve(stateDir),
|
|
45
63
|
prefix: path.resolve(prefix),
|
|
46
64
|
profile: normalizeManagedProfile(values.get("--profile")),
|
|
65
|
+
hostTransactionId: values.get("--host-transaction-id")?.trim() || null,
|
|
66
|
+
hostTransactionVersion: values.get("--host-transaction-version")?.trim() || null,
|
|
47
67
|
};
|
|
48
68
|
}
|
|
49
69
|
|
|
70
|
+
function resolveHostTransaction(params, { previousManifest, previousRoot, version }) {
|
|
71
|
+
const transactionId = String(params.hostTransactionId || "").trim();
|
|
72
|
+
const transactionVersion = String(params.hostTransactionVersion || "").trim();
|
|
73
|
+
if (Boolean(transactionId) !== Boolean(transactionVersion)) {
|
|
74
|
+
throw new Error(
|
|
75
|
+
"--host-transaction-id and --host-transaction-version must be provided together",
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
if (!transactionId) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (!HOST_TRANSACTION_ID_PATTERN.test(transactionId)) {
|
|
82
|
+
throw new Error("--host-transaction-id must be a UUID v4");
|
|
83
|
+
}
|
|
84
|
+
if (normalizeManagedProfile(params.profile) !== "hosting") {
|
|
85
|
+
throw new Error("A host update transaction can only activate a hosting runtime.");
|
|
86
|
+
}
|
|
87
|
+
if (transactionVersion !== version) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
`Host transaction version ${transactionVersion} does not match runtime ${version}.`,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// A fresh hosting install has no application release to roll back. Its root
|
|
94
|
+
// installer owns the signer transaction and commits it after the first
|
|
95
|
+
// Gateway health check. Existing hosting installs coordinate both sides here.
|
|
96
|
+
if (!previousRoot || previousManifest?.profile !== "hosting") {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
if (previousManifest.runtime?.activeVersion !== params.previousVersion) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
"The active hosting manifest does not match the runtime selected for transactional repair.",
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
return { transactionId, transactionVersion };
|
|
105
|
+
}
|
|
106
|
+
|
|
50
107
|
async function pathExists(target) {
|
|
51
108
|
try {
|
|
52
109
|
await fsp.lstat(target);
|
|
@@ -56,6 +113,29 @@ async function pathExists(target) {
|
|
|
56
113
|
}
|
|
57
114
|
}
|
|
58
115
|
|
|
116
|
+
async function fsyncTree(rootPath) {
|
|
117
|
+
const directories = [];
|
|
118
|
+
const pending = [rootPath];
|
|
119
|
+
while (pending.length > 0) {
|
|
120
|
+
const current = pending.pop();
|
|
121
|
+
directories.push(current);
|
|
122
|
+
const directory = await fsp.opendir(current);
|
|
123
|
+
for await (const entry of directory) {
|
|
124
|
+
const entryPath = path.join(current, entry.name);
|
|
125
|
+
if (entry.isDirectory()) {
|
|
126
|
+
pending.push(entryPath);
|
|
127
|
+
} else if (entry.isFile()) {
|
|
128
|
+
const handle = await fsp.open(entryPath, "r");
|
|
129
|
+
await handle.sync().finally(() => handle.close());
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (const directoryPath of directories.toReversed()) {
|
|
134
|
+
const handle = await fsp.open(directoryPath, "r");
|
|
135
|
+
await handle.sync().finally(() => handle.close());
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
59
139
|
async function moveDirectory(source, destination) {
|
|
60
140
|
try {
|
|
61
141
|
await fsp.rename(source, destination);
|
|
@@ -95,7 +175,7 @@ async function replaceWithSymlink(target, linkPath) {
|
|
|
95
175
|
return backupPath;
|
|
96
176
|
}
|
|
97
177
|
|
|
98
|
-
async function installStableFiles(paths, releaseRoot) {
|
|
178
|
+
async function installStableFiles(paths, releaseRoot, durable = false) {
|
|
99
179
|
const scriptDir = path.join(releaseRoot, "scripts");
|
|
100
180
|
await copyExecutable(path.join(scriptDir, "fased-managed-launcher.sh"), paths.launcherPath);
|
|
101
181
|
await copyExecutable(path.join(scriptDir, "fased-managed-service.sh"), paths.serviceLauncherPath);
|
|
@@ -104,18 +184,55 @@ async function installStableFiles(paths, releaseRoot) {
|
|
|
104
184
|
path.join(scriptDir, "managed-runtime-layout.mjs"),
|
|
105
185
|
path.join(paths.updaterDir, "managed-runtime-layout.mjs"),
|
|
106
186
|
);
|
|
187
|
+
await copyExecutable(
|
|
188
|
+
path.join(scriptDir, "hosted-release-manifest.mjs"),
|
|
189
|
+
path.join(paths.updaterDir, "hosted-release-manifest.mjs"),
|
|
190
|
+
);
|
|
107
191
|
await fsp.mkdir(path.dirname(paths.prefixLauncherPath), { recursive: true });
|
|
108
192
|
const launcherBackup = await replaceWithSymlink(paths.launcherPath, paths.prefixLauncherPath);
|
|
109
193
|
if (launcherBackup) {
|
|
110
194
|
await fsp.rm(launcherBackup, { recursive: true, force: true });
|
|
111
195
|
}
|
|
196
|
+
if (!durable) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const stablePaths = [
|
|
200
|
+
paths.launcherPath,
|
|
201
|
+
paths.serviceLauncherPath,
|
|
202
|
+
paths.updaterPath,
|
|
203
|
+
path.join(paths.updaterDir, "managed-runtime-layout.mjs"),
|
|
204
|
+
path.join(paths.updaterDir, "hosted-release-manifest.mjs"),
|
|
205
|
+
];
|
|
206
|
+
for (const stablePath of stablePaths) {
|
|
207
|
+
const handle = await fsp.open(stablePath, "r");
|
|
208
|
+
await handle.sync().finally(() => handle.close());
|
|
209
|
+
}
|
|
210
|
+
for (const directoryPath of new Set(stablePaths.map((value) => path.dirname(value)))) {
|
|
211
|
+
const handle = await fsp.open(directoryPath, "r");
|
|
212
|
+
await handle.sync().finally(() => handle.close());
|
|
213
|
+
}
|
|
112
214
|
}
|
|
113
215
|
|
|
114
|
-
export async function installManagedRuntime(params) {
|
|
216
|
+
export async function installManagedRuntime(params, dependencyOverrides = {}) {
|
|
217
|
+
const dependencies = {
|
|
218
|
+
authorizePreactivatedHostedGateway,
|
|
219
|
+
beginPreactivatedHostedTransaction,
|
|
220
|
+
...dependencyOverrides,
|
|
221
|
+
};
|
|
115
222
|
const paths = resolveManagedRuntimePaths(params);
|
|
116
223
|
const existingManifest = readManagedInstallManifest(paths.manifestPath);
|
|
117
224
|
const version = await assertManagedRuntime(params.packageRoot);
|
|
118
225
|
const metadata = await readHostedRuntimeMetadata(params.packageRoot);
|
|
226
|
+
const hostedRelease = await readHostedReleaseBinding(params.packageRoot, metadata, version);
|
|
227
|
+
if (
|
|
228
|
+
normalizeManagedProfile(params.profile) === "hosting" &&
|
|
229
|
+
params.hostTransactionId &&
|
|
230
|
+
!hostedRelease
|
|
231
|
+
) {
|
|
232
|
+
throw new Error(
|
|
233
|
+
"Maintained Hosting requires an attested unified app and signer release manifest.",
|
|
234
|
+
);
|
|
235
|
+
}
|
|
119
236
|
let previousRoot = await resolveLinkTarget(paths.currentLink);
|
|
120
237
|
let previousVersion = previousRoot ? await readPackageVersion(previousRoot) : null;
|
|
121
238
|
let releaseRoot = path.join(paths.releasesDir, version);
|
|
@@ -161,30 +278,111 @@ export async function installManagedRuntime(params) {
|
|
|
161
278
|
}
|
|
162
279
|
}
|
|
163
280
|
|
|
281
|
+
const previousManifest =
|
|
282
|
+
existingManifest ||
|
|
283
|
+
(previousRoot && previousVersion
|
|
284
|
+
? buildManagedInstallManifest({
|
|
285
|
+
paths,
|
|
286
|
+
profile: params.profile,
|
|
287
|
+
version: previousVersion,
|
|
288
|
+
previousVersion: null,
|
|
289
|
+
})
|
|
290
|
+
: null);
|
|
291
|
+
const hostTransaction = resolveHostTransaction(
|
|
292
|
+
{ ...params, previousVersion },
|
|
293
|
+
{ previousManifest, previousRoot, version },
|
|
294
|
+
);
|
|
295
|
+
if (params.hostTransactionId) {
|
|
296
|
+
await fsyncTree(releaseRoot);
|
|
297
|
+
const nodeModulesPath = path.join(releaseRoot, "node_modules");
|
|
298
|
+
const nodeModulesRoot = await fsp.realpath(nodeModulesPath).catch(() => null);
|
|
299
|
+
if (nodeModulesRoot && !nodeModulesRoot.startsWith(`${path.resolve(releaseRoot)}${path.sep}`)) {
|
|
300
|
+
const dependencyRoot = path.dirname(nodeModulesRoot);
|
|
301
|
+
const durabilityMarker = path.join(dependencyRoot, ".fased-durable-v1");
|
|
302
|
+
try {
|
|
303
|
+
await fsp.access(durabilityMarker);
|
|
304
|
+
} catch {
|
|
305
|
+
await fsyncTree(nodeModulesRoot);
|
|
306
|
+
await fsp.writeFile(durabilityMarker, "durable-v1\n", { mode: 0o600 });
|
|
307
|
+
const markerHandle = await fsp.open(durabilityMarker, "r");
|
|
308
|
+
await markerHandle.sync().finally(() => markerHandle.close());
|
|
309
|
+
const dependencyParent = await fsp.open(dependencyRoot, "r");
|
|
310
|
+
await dependencyParent.sync().finally(() => dependencyParent.close());
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
const releasesHandle = await fsp.open(paths.releasesDir, "r");
|
|
314
|
+
await releasesHandle.sync().finally(() => releasesHandle.close());
|
|
315
|
+
}
|
|
316
|
+
|
|
164
317
|
if (previousRoot && path.resolve(previousRoot) !== path.resolve(releaseRoot)) {
|
|
165
318
|
await atomicSymlink(previousRoot, paths.previousLink);
|
|
166
319
|
}
|
|
167
|
-
await atomicSymlink(releaseRoot, paths.currentLink);
|
|
168
|
-
|
|
169
|
-
const compatibilityBackup = await replaceWithSymlink(
|
|
170
|
-
paths.currentLink,
|
|
171
|
-
paths.compatibilityPackageRoot,
|
|
172
|
-
);
|
|
173
|
-
await installStableFiles(paths, releaseRoot);
|
|
174
320
|
|
|
175
321
|
const manifest = buildManagedInstallManifest({
|
|
176
322
|
paths,
|
|
177
323
|
profile: params.profile,
|
|
178
324
|
version,
|
|
179
325
|
dependencyHash: metadata?.dependencyHash,
|
|
326
|
+
hostedRelease,
|
|
180
327
|
previousVersion: previousVersion || null,
|
|
181
328
|
});
|
|
329
|
+
if (hostTransaction) {
|
|
330
|
+
await dependencies.beginPreactivatedHostedTransaction({
|
|
331
|
+
paths,
|
|
332
|
+
transactionId: hostTransaction.transactionId,
|
|
333
|
+
targetVersion: hostTransaction.transactionVersion,
|
|
334
|
+
previousVersion,
|
|
335
|
+
targetRoot: releaseRoot,
|
|
336
|
+
previousRoot,
|
|
337
|
+
nextManifest: manifest,
|
|
338
|
+
previousManifest,
|
|
339
|
+
timeoutMs: params.timeoutMs || DEFAULT_HOST_TRANSACTION_TIMEOUT_MS,
|
|
340
|
+
});
|
|
341
|
+
await fsp.chmod(paths.stateDir, 0o700).catch(() => undefined);
|
|
342
|
+
return { manifest, paths, releaseRoot, hostTransaction: true };
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
await atomicSymlink(releaseRoot, paths.currentLink);
|
|
346
|
+
const compatibilityBackup = await replaceWithSymlink(
|
|
347
|
+
paths.currentLink,
|
|
348
|
+
paths.compatibilityPackageRoot,
|
|
349
|
+
);
|
|
350
|
+
await installStableFiles(paths, releaseRoot, Boolean(params.hostTransactionId));
|
|
182
351
|
await atomicWriteJson(paths.manifestPath, manifest, 0o600);
|
|
352
|
+
if (params.hostTransactionId) {
|
|
353
|
+
const identityManifestHandle = await fsp.open(paths.manifestPath, "r");
|
|
354
|
+
await identityManifestHandle.sync().finally(() => identityManifestHandle.close());
|
|
355
|
+
for (const directoryPath of new Set([
|
|
356
|
+
paths.stateDir,
|
|
357
|
+
paths.runtimeDir,
|
|
358
|
+
path.dirname(paths.compatibilityPackageRoot),
|
|
359
|
+
])) {
|
|
360
|
+
const handle = await fsp.open(directoryPath, "r");
|
|
361
|
+
await handle.sync().finally(() => handle.close());
|
|
362
|
+
}
|
|
363
|
+
const authorization = await dependencies.authorizePreactivatedHostedGateway({
|
|
364
|
+
transactionId: params.hostTransactionId,
|
|
365
|
+
targetVersion: params.hostTransactionVersion,
|
|
366
|
+
timeoutMs: params.timeoutMs || DEFAULT_HOST_TRANSACTION_TIMEOUT_MS,
|
|
367
|
+
});
|
|
368
|
+
if (
|
|
369
|
+
!authorization?.release ||
|
|
370
|
+
!signerReleaseIdentitiesEqual(authorization.release, hostedRelease?.signer)
|
|
371
|
+
) {
|
|
372
|
+
throw new Error(
|
|
373
|
+
"root signer updater did not return the exact signer identity from the unified release manifest",
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
manifest.signer = { release: authorization.release };
|
|
377
|
+
await atomicWriteJson(paths.manifestPath, manifest, 0o600);
|
|
378
|
+
const manifestHandle = await fsp.open(paths.manifestPath, "r");
|
|
379
|
+
await manifestHandle.sync().finally(() => manifestHandle.close());
|
|
380
|
+
}
|
|
183
381
|
await fsp.chmod(paths.stateDir, 0o700).catch(() => undefined);
|
|
184
382
|
if (compatibilityBackup) {
|
|
185
383
|
await fsp.rm(compatibilityBackup, { recursive: true, force: true });
|
|
186
384
|
}
|
|
187
|
-
return { manifest, paths, releaseRoot };
|
|
385
|
+
return { manifest, paths, releaseRoot, hostTransaction: false };
|
|
188
386
|
}
|
|
189
387
|
|
|
190
388
|
export async function rollbackManagedRuntime(params) {
|
|
@@ -201,6 +399,7 @@ export async function rollbackManagedRuntime(params) {
|
|
|
201
399
|
const previousVersion = await assertManagedRuntime(previousRoot);
|
|
202
400
|
const currentVersion = await readPackageVersion(currentRoot);
|
|
203
401
|
const metadata = await readHostedRuntimeMetadata(previousRoot);
|
|
402
|
+
const hostedRelease = await readHostedReleaseBinding(previousRoot, metadata, previousVersion);
|
|
204
403
|
|
|
205
404
|
await atomicSymlink(currentRoot, paths.previousLink);
|
|
206
405
|
await atomicSymlink(previousRoot, paths.currentLink);
|
|
@@ -211,6 +410,7 @@ export async function rollbackManagedRuntime(params) {
|
|
|
211
410
|
profile: manifest.profile,
|
|
212
411
|
version: previousVersion,
|
|
213
412
|
dependencyHash: metadata?.dependencyHash,
|
|
413
|
+
hostedRelease,
|
|
214
414
|
previousVersion: currentVersion,
|
|
215
415
|
});
|
|
216
416
|
await atomicWriteJson(paths.manifestPath, previousManifest, 0o600);
|
|
@@ -233,6 +433,8 @@ if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.ar
|
|
|
233
433
|
}
|
|
234
434
|
|
|
235
435
|
export const __testing = {
|
|
436
|
+
parseArgs,
|
|
437
|
+
resolveHostTransaction,
|
|
236
438
|
installStableFiles,
|
|
237
439
|
moveDirectory,
|
|
238
440
|
replaceWithSymlink,
|
|
@@ -2,8 +2,9 @@ import fs from "node:fs";
|
|
|
2
2
|
import fsp from "node:fs/promises";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import { readHostedReleaseManifestV2 } from "./hosted-release-manifest.mjs";
|
|
5
6
|
|
|
6
|
-
export const MANAGED_INSTALL_SCHEMA_VERSION =
|
|
7
|
+
export const MANAGED_INSTALL_SCHEMA_VERSION = 2;
|
|
7
8
|
|
|
8
9
|
export function resolveManagedStateDir(env = process.env, homedir = os.homedir) {
|
|
9
10
|
return path.resolve(
|
|
@@ -51,7 +52,7 @@ export function normalizeManagedProfile(value) {
|
|
|
51
52
|
export function readManagedInstallManifest(manifestPath) {
|
|
52
53
|
try {
|
|
53
54
|
const parsed = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
|
|
54
|
-
if (parsed?.schemaVersion !== MANAGED_INSTALL_SCHEMA_VERSION) {
|
|
55
|
+
if (parsed?.schemaVersion !== 1 && parsed?.schemaVersion !== MANAGED_INSTALL_SCHEMA_VERSION) {
|
|
55
56
|
return null;
|
|
56
57
|
}
|
|
57
58
|
if (!parsed.runtime || typeof parsed.runtime.activeVersion !== "string") {
|
|
@@ -79,7 +80,13 @@ export async function readHostedRuntimeMetadata(packageRoot) {
|
|
|
79
80
|
const parsed = JSON.parse(
|
|
80
81
|
await fsp.readFile(path.join(packageRoot, ".fased-hosted-runtime.json"), "utf8"),
|
|
81
82
|
);
|
|
82
|
-
if (
|
|
83
|
+
if (
|
|
84
|
+
!new Set([1, 2]).has(parsed?.schemaVersion) ||
|
|
85
|
+
!/^[a-f0-9]{64}$/.test(parsed.dependencyHash || "") ||
|
|
86
|
+
(parsed.schemaVersion === 2 &&
|
|
87
|
+
(!/^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(parsed.version || "") ||
|
|
88
|
+
!/^[a-f0-9]{40}$/.test(parsed.commit || "")))
|
|
89
|
+
) {
|
|
83
90
|
return null;
|
|
84
91
|
}
|
|
85
92
|
return parsed;
|
|
@@ -88,6 +95,45 @@ export async function readHostedRuntimeMetadata(packageRoot) {
|
|
|
88
95
|
}
|
|
89
96
|
}
|
|
90
97
|
|
|
98
|
+
export async function readHostedReleaseBinding(packageRoot, metadata, expectedVersion) {
|
|
99
|
+
const releasePath = path.join(packageRoot, ".fased-hosted-release-v2.json");
|
|
100
|
+
let release;
|
|
101
|
+
try {
|
|
102
|
+
release = await readHostedReleaseManifestV2(releasePath, { version: expectedVersion });
|
|
103
|
+
} catch (error) {
|
|
104
|
+
if (error?.code === "ENOENT" && metadata?.schemaVersion !== 2) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
const architecture = process.arch === "x64" ? "x64" : process.arch === "arm64" ? "arm64" : null;
|
|
110
|
+
if (!architecture) {
|
|
111
|
+
throw new Error(`Managed Hosting release has no Linux artifact for ${process.arch}.`);
|
|
112
|
+
}
|
|
113
|
+
const app = release.manifest.application.linux[architecture];
|
|
114
|
+
if (
|
|
115
|
+
metadata?.schemaVersion !== 2 ||
|
|
116
|
+
metadata.version !== expectedVersion ||
|
|
117
|
+
metadata.commit !== release.manifest.release.commit ||
|
|
118
|
+
metadata.dependencyHash !== app.dependencies.dependencyHash
|
|
119
|
+
) {
|
|
120
|
+
throw new Error("Managed Hosting app metadata does not match its attested release manifest.");
|
|
121
|
+
}
|
|
122
|
+
return Object.freeze({
|
|
123
|
+
manifestDigest: release.digest,
|
|
124
|
+
version: release.manifest.release.version,
|
|
125
|
+
commit: release.manifest.release.commit,
|
|
126
|
+
appArtifact: app.artifact.asset,
|
|
127
|
+
appArtifactDigest: `sha256:${app.artifact.sha256}`,
|
|
128
|
+
dependencyArtifact: app.dependencies.asset,
|
|
129
|
+
dependencyArtifactDigest: `sha256:${app.dependencies.sha256}`,
|
|
130
|
+
dependencyHash: app.dependencies.dependencyHash,
|
|
131
|
+
signer: release.manifest.signer.release,
|
|
132
|
+
capabilities: release.manifest.signer.capabilities,
|
|
133
|
+
capabilitiesDigest: release.manifest.signer.capabilitiesDigest,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
91
137
|
export async function assertManagedRuntime(packageRoot, expectedVersion) {
|
|
92
138
|
const version = await readPackageVersion(packageRoot);
|
|
93
139
|
if (!version || (expectedVersion && version !== expectedVersion)) {
|
|
@@ -152,6 +198,7 @@ export function buildManagedInstallManifest({
|
|
|
152
198
|
profile,
|
|
153
199
|
version,
|
|
154
200
|
dependencyHash,
|
|
201
|
+
hostedRelease,
|
|
155
202
|
previousVersion,
|
|
156
203
|
source = "managed-artifact",
|
|
157
204
|
}) {
|
|
@@ -169,6 +216,10 @@ export function buildManagedInstallManifest({
|
|
|
169
216
|
previousLink: paths.previousLink,
|
|
170
217
|
releasesDir: paths.releasesDir,
|
|
171
218
|
dependencyHash: dependencyHash || null,
|
|
219
|
+
releaseManifestDigest: hostedRelease?.manifestDigest || null,
|
|
220
|
+
appCommit: hostedRelease?.commit || null,
|
|
221
|
+
appArtifact: hostedRelease?.appArtifact || null,
|
|
222
|
+
appArtifactDigest: hostedRelease?.appArtifactDigest || null,
|
|
172
223
|
},
|
|
173
224
|
package: {
|
|
174
225
|
prefix: paths.prefix,
|
|
@@ -183,6 +234,27 @@ export function buildManagedInstallManifest({
|
|
|
183
234
|
version,
|
|
184
235
|
path: paths.updaterPath,
|
|
185
236
|
},
|
|
237
|
+
release: hostedRelease
|
|
238
|
+
? {
|
|
239
|
+
version: hostedRelease.version,
|
|
240
|
+
commit: hostedRelease.commit,
|
|
241
|
+
manifestDigest: hostedRelease.manifestDigest,
|
|
242
|
+
application: {
|
|
243
|
+
artifact: hostedRelease.appArtifact,
|
|
244
|
+
digest: hostedRelease.appArtifactDigest,
|
|
245
|
+
dependencies: {
|
|
246
|
+
artifact: hostedRelease.dependencyArtifact,
|
|
247
|
+
digest: hostedRelease.dependencyArtifactDigest,
|
|
248
|
+
dependencyHash: hostedRelease.dependencyHash,
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
signer: {
|
|
252
|
+
release: hostedRelease.signer,
|
|
253
|
+
capabilities: hostedRelease.capabilities,
|
|
254
|
+
capabilitiesDigest: hostedRelease.capabilitiesDigest,
|
|
255
|
+
},
|
|
256
|
+
}
|
|
257
|
+
: null,
|
|
186
258
|
updatedAt: new Date().toISOString(),
|
|
187
259
|
};
|
|
188
260
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
|
|
6
|
+
const SIGNER_BINARY = "/opt/fased/signer/fased-signerd";
|
|
7
|
+
const FIXED_ARGS = [
|
|
8
|
+
"admin",
|
|
9
|
+
"migration",
|
|
10
|
+
"hosted-v1",
|
|
11
|
+
"--control-socket",
|
|
12
|
+
"/run/fased-signerd/control.sock",
|
|
13
|
+
"--policy-file",
|
|
14
|
+
"/etc/fased/signer-migration-policies.json",
|
|
15
|
+
"--app-home",
|
|
16
|
+
"/home/app",
|
|
17
|
+
"--legacy-signer-home",
|
|
18
|
+
"/home/fased-signer",
|
|
19
|
+
"--state-dir",
|
|
20
|
+
"/var/lib/fased-signerd",
|
|
21
|
+
"--marker-file",
|
|
22
|
+
"/var/lib/fased-host-updater/signer-v1-migration.pending",
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
function fail(message) {
|
|
26
|
+
throw new Error(message);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function resolvePhase(argv = process.argv) {
|
|
30
|
+
if (argv.length !== 3 || !new Set(["prepare", "commit"]).has(argv[2])) {
|
|
31
|
+
fail("usage: migrate-hosted-signer-v2.mjs {prepare|commit}");
|
|
32
|
+
}
|
|
33
|
+
return argv[2];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function run(phase) {
|
|
37
|
+
const child = spawnSync(SIGNER_BINARY, [...FIXED_ARGS, "--phase", phase], {
|
|
38
|
+
env: {
|
|
39
|
+
HOME: "/var/lib/fased-host-updater",
|
|
40
|
+
LANG: "C",
|
|
41
|
+
LC_ALL: "C",
|
|
42
|
+
PATH: "/usr/sbin:/usr/bin:/sbin:/bin",
|
|
43
|
+
},
|
|
44
|
+
stdio: "inherit",
|
|
45
|
+
});
|
|
46
|
+
if (child.error) {
|
|
47
|
+
fail("the verified native signer migration command could not be started");
|
|
48
|
+
}
|
|
49
|
+
if (child.status !== 0) {
|
|
50
|
+
process.exitCode = child.status ?? 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
55
|
+
run(resolvePhase());
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const __testing = { FIXED_ARGS, SIGNER_BINARY, resolvePhase };
|