@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
package/dist/infra/path-env.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { isTruthyEnvValue } from "./env.js";
|
|
2
2
|
import { resolveBrewPathDirs } from "./brew.js";
|
|
3
|
-
import
|
|
3
|
+
import syncFs from "node:fs";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
|
|
7
7
|
//#region src/infra/path-env.ts
|
|
8
8
|
function isExecutable(filePath) {
|
|
9
9
|
try {
|
|
10
|
-
|
|
10
|
+
syncFs.accessSync(filePath, syncFs.constants.X_OK);
|
|
11
11
|
return true;
|
|
12
12
|
} catch {
|
|
13
13
|
return false;
|
|
@@ -15,7 +15,7 @@ function isExecutable(filePath) {
|
|
|
15
15
|
}
|
|
16
16
|
function isDirectory(dirPath) {
|
|
17
17
|
try {
|
|
18
|
-
return
|
|
18
|
+
return syncFs.statSync(dirPath).isDirectory();
|
|
19
19
|
} catch {
|
|
20
20
|
return false;
|
|
21
21
|
}
|
package/dist/infra/ports-lsof.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import fs
|
|
1
|
+
import syncFs from "node:fs";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
3
|
|
|
4
4
|
//#region src/infra/ports-lsof.ts
|
|
5
5
|
const LSOF_CANDIDATES = process.platform === "darwin" ? ["/usr/sbin/lsof", "/usr/bin/lsof"] : ["/usr/bin/lsof", "/usr/sbin/lsof"];
|
|
6
6
|
async function canExecute(path) {
|
|
7
7
|
try {
|
|
8
|
-
await fs
|
|
8
|
+
await fs.access(path, syncFs.constants.X_OK);
|
|
9
9
|
return true;
|
|
10
10
|
} catch {
|
|
11
11
|
return false;
|
|
@@ -22,7 +22,7 @@ async function resolveLsofCommand() {
|
|
|
22
22
|
function resolveLsofCommandSync() {
|
|
23
23
|
for (const candidate of LSOF_CANDIDATES) {
|
|
24
24
|
try {
|
|
25
|
-
|
|
25
|
+
syncFs.accessSync(candidate, syncFs.constants.X_OK);
|
|
26
26
|
return candidate;
|
|
27
27
|
} catch {}
|
|
28
28
|
}
|
|
@@ -9,7 +9,7 @@ import { resolveAuthProfileOrder } from "../agents/auth-profiles/order.js";
|
|
|
9
9
|
import "../agents/auth-profiles.js";
|
|
10
10
|
import { getCustomProviderApiKey } from "../agents/model-auth.js";
|
|
11
11
|
import { normalizeProviderId } from "../agents/model-selection.js";
|
|
12
|
-
import
|
|
12
|
+
import syncFs from "node:fs";
|
|
13
13
|
import os from "node:os";
|
|
14
14
|
import path from "node:path";
|
|
15
15
|
|
|
@@ -43,10 +43,10 @@ function resolveZaiApiKey() {
|
|
|
43
43
|
}
|
|
44
44
|
try {
|
|
45
45
|
const authPath = path.join(resolveRequiredHomeDir(process.env, os.homedir), ".pi", "agent", "auth.json");
|
|
46
|
-
if (!
|
|
46
|
+
if (!syncFs.existsSync(authPath)) {
|
|
47
47
|
return undefined;
|
|
48
48
|
}
|
|
49
|
-
const data = JSON.parse(
|
|
49
|
+
const data = JSON.parse(syncFs.readFileSync(authPath, "utf-8"));
|
|
50
50
|
return data["z-ai"]?.access || data.zai?.access;
|
|
51
51
|
} catch {
|
|
52
52
|
return undefined;
|
package/dist/infra/restart.js
CHANGED
|
@@ -151,44 +151,75 @@ function deferGatewayRestartUntilIdle(opts) {
|
|
|
151
151
|
const pollMs = Math.max(10, Math.floor(pollMsRaw));
|
|
152
152
|
const maxWaitMsRaw = opts.maxWaitMs ?? DEFAULT_DEFERRAL_MAX_WAIT_MS;
|
|
153
153
|
const maxWaitMs = Math.max(pollMs, Math.floor(maxWaitMsRaw));
|
|
154
|
-
let
|
|
154
|
+
let pendingPoll = null;
|
|
155
|
+
let pending = false;
|
|
156
|
+
const handle = {
|
|
157
|
+
cancel: () => {
|
|
158
|
+
if (!pending || !pendingPoll) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
clearInterval(pendingPoll);
|
|
162
|
+
pendingPoll = null;
|
|
163
|
+
pending = false;
|
|
164
|
+
return true;
|
|
165
|
+
},
|
|
166
|
+
isPending: () => pending
|
|
167
|
+
};
|
|
168
|
+
let pendingCount;
|
|
155
169
|
try {
|
|
156
|
-
|
|
170
|
+
pendingCount = opts.getPendingCount();
|
|
157
171
|
} catch (err) {
|
|
158
172
|
opts.hooks?.onCheckError?.(err);
|
|
159
173
|
emitGatewayRestart();
|
|
160
|
-
return;
|
|
174
|
+
return handle;
|
|
161
175
|
}
|
|
162
|
-
if (
|
|
176
|
+
if (pendingCount <= 0) {
|
|
163
177
|
opts.hooks?.onReady?.();
|
|
164
178
|
emitGatewayRestart();
|
|
165
|
-
return;
|
|
179
|
+
return handle;
|
|
166
180
|
}
|
|
167
|
-
opts.hooks?.onDeferring?.(
|
|
181
|
+
opts.hooks?.onDeferring?.(pendingCount);
|
|
168
182
|
const startedAt = Date.now();
|
|
169
|
-
|
|
183
|
+
pending = true;
|
|
184
|
+
pendingPoll = setInterval(() => {
|
|
170
185
|
let current;
|
|
171
186
|
try {
|
|
172
187
|
current = opts.getPendingCount();
|
|
173
188
|
} catch (err) {
|
|
174
|
-
|
|
189
|
+
if (!pending) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
pending = false;
|
|
193
|
+
if (pendingPoll) {
|
|
194
|
+
clearInterval(pendingPoll);
|
|
195
|
+
pendingPoll = null;
|
|
196
|
+
}
|
|
175
197
|
opts.hooks?.onCheckError?.(err);
|
|
176
198
|
emitGatewayRestart();
|
|
177
199
|
return;
|
|
178
200
|
}
|
|
179
201
|
if (current <= 0) {
|
|
180
|
-
|
|
202
|
+
pending = false;
|
|
203
|
+
if (pendingPoll) {
|
|
204
|
+
clearInterval(pendingPoll);
|
|
205
|
+
pendingPoll = null;
|
|
206
|
+
}
|
|
181
207
|
opts.hooks?.onReady?.();
|
|
182
208
|
emitGatewayRestart();
|
|
183
209
|
return;
|
|
184
210
|
}
|
|
185
211
|
const elapsedMs = Date.now() - startedAt;
|
|
186
212
|
if (elapsedMs >= maxWaitMs) {
|
|
187
|
-
|
|
213
|
+
pending = false;
|
|
214
|
+
if (pendingPoll) {
|
|
215
|
+
clearInterval(pendingPoll);
|
|
216
|
+
pendingPoll = null;
|
|
217
|
+
}
|
|
188
218
|
opts.hooks?.onTimeout?.(current, elapsedMs);
|
|
189
219
|
emitGatewayRestart();
|
|
190
220
|
}
|
|
191
221
|
}, pollMs);
|
|
222
|
+
return handle;
|
|
192
223
|
}
|
|
193
224
|
function formatSpawnDetail(result) {
|
|
194
225
|
const clean = (value) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sameFileIdentity as sameFileIdentity$1 } from "./file-identity.js";
|
|
2
|
-
import
|
|
2
|
+
import syncFs from "node:fs";
|
|
3
3
|
|
|
4
4
|
//#region src/infra/safe-open-sync.ts
|
|
5
5
|
function isExpectedPathError(error) {
|
|
@@ -10,7 +10,7 @@ function sameFileIdentity(left, right) {
|
|
|
10
10
|
return sameFileIdentity$1(left, right);
|
|
11
11
|
}
|
|
12
12
|
function openVerifiedFileSync(params) {
|
|
13
|
-
const ioFs = params.ioFs ??
|
|
13
|
+
const ioFs = params.ioFs ?? syncFs;
|
|
14
14
|
const openReadFlags = ioFs.constants.O_RDONLY | (typeof ioFs.constants.O_NOFOLLOW === "number" ? ioFs.constants.O_NOFOLLOW : 0);
|
|
15
15
|
let fd = null;
|
|
16
16
|
try {
|
|
@@ -4,7 +4,7 @@ import { stripInboundMetadata } from "../auto-reply/reply/strip-inbound-meta.js"
|
|
|
4
4
|
import { stripEnvelope, stripMessageIdHints } from "../shared/chat-envelope.js";
|
|
5
5
|
import { normalizeUsage } from "../agents/usage.js";
|
|
6
6
|
import { estimateUsageCost, resolveModelCostConfig } from "../utils/usage-format.js";
|
|
7
|
-
import
|
|
7
|
+
import syncFs from "node:fs";
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
import readline from "node:readline";
|
|
10
10
|
|
|
@@ -145,7 +145,7 @@ const applyCostTotal = (totals, costTotal) => {
|
|
|
145
145
|
totals.totalCost += costTotal;
|
|
146
146
|
};
|
|
147
147
|
async function* readJsonlRecords(filePath) {
|
|
148
|
-
const fileStream =
|
|
148
|
+
const fileStream = syncFs.createReadStream(filePath, { encoding: "utf-8" });
|
|
149
149
|
const rl = readline.createInterface({
|
|
150
150
|
input: fileStream,
|
|
151
151
|
crlfDelay: Infinity
|
|
@@ -225,10 +225,10 @@ async function loadCostUsageSummary(params) {
|
|
|
225
225
|
const dailyMap = new Map();
|
|
226
226
|
const totals = emptyTotals();
|
|
227
227
|
const sessionsDir = resolveSessionTranscriptsDirForAgent(params?.agentId);
|
|
228
|
-
const entries = await
|
|
228
|
+
const entries = await syncFs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
|
|
229
229
|
const files = (await Promise.all(entries.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl")).map(async (entry) => {
|
|
230
230
|
const filePath = path.join(sessionsDir, entry.name);
|
|
231
|
-
const stats = await
|
|
231
|
+
const stats = await syncFs.promises.stat(filePath).catch(() => null);
|
|
232
232
|
if (!stats) {
|
|
233
233
|
return null;
|
|
234
234
|
}
|
|
@@ -279,14 +279,14 @@ async function loadCostUsageSummary(params) {
|
|
|
279
279
|
*/
|
|
280
280
|
async function discoverAllSessions(params) {
|
|
281
281
|
const sessionsDir = resolveSessionTranscriptsDirForAgent(params?.agentId);
|
|
282
|
-
const entries = await
|
|
282
|
+
const entries = await syncFs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
|
|
283
283
|
const discovered = [];
|
|
284
284
|
for (const entry of entries) {
|
|
285
285
|
if (!entry.isFile() || !entry.name.endsWith(".jsonl")) {
|
|
286
286
|
continue;
|
|
287
287
|
}
|
|
288
288
|
const filePath = path.join(sessionsDir, entry.name);
|
|
289
|
-
const stats = await
|
|
289
|
+
const stats = await syncFs.promises.stat(filePath).catch(() => null);
|
|
290
290
|
if (!stats) {
|
|
291
291
|
continue;
|
|
292
292
|
}
|
|
@@ -330,7 +330,7 @@ async function discoverAllSessions(params) {
|
|
|
330
330
|
}
|
|
331
331
|
async function loadSessionCostSummary(params) {
|
|
332
332
|
const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
|
|
333
|
-
if (!sessionFile || !
|
|
333
|
+
if (!sessionFile || !syncFs.existsSync(sessionFile)) {
|
|
334
334
|
return null;
|
|
335
335
|
}
|
|
336
336
|
const totals = emptyTotals();
|
|
@@ -547,7 +547,7 @@ async function loadSessionCostSummary(params) {
|
|
|
547
547
|
}
|
|
548
548
|
async function loadSessionUsageTimeSeries(params) {
|
|
549
549
|
const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
|
|
550
|
-
if (!sessionFile || !
|
|
550
|
+
if (!sessionFile || !syncFs.existsSync(sessionFile)) {
|
|
551
551
|
return null;
|
|
552
552
|
}
|
|
553
553
|
const points = [];
|
|
@@ -635,7 +635,7 @@ async function loadSessionUsageTimeSeries(params) {
|
|
|
635
635
|
}
|
|
636
636
|
async function loadSessionLogs(params) {
|
|
637
637
|
const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
|
|
638
|
-
if (!sessionFile || !
|
|
638
|
+
if (!sessionFile || !syncFs.existsSync(sessionFile)) {
|
|
639
639
|
return null;
|
|
640
640
|
}
|
|
641
641
|
const logs = [];
|
package/dist/infra/shell-env.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { sanitizeHostExecEnv } from "./host-env-security.js";
|
|
2
2
|
import { isTruthyEnvValue } from "./env.js";
|
|
3
|
-
import
|
|
3
|
+
import syncFs from "node:fs";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { execFileSync } from "node:child_process";
|
|
@@ -34,7 +34,7 @@ function readEtcShells() {
|
|
|
34
34
|
return cachedEtcShells;
|
|
35
35
|
}
|
|
36
36
|
try {
|
|
37
|
-
const raw =
|
|
37
|
+
const raw = syncFs.readFileSync("/etc/shells", "utf8");
|
|
38
38
|
const entries = raw.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#") && path.isAbsolute(line));
|
|
39
39
|
cachedEtcShells = new Set(entries);
|
|
40
40
|
} catch {
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import
|
|
1
|
+
import syncFs from "node:fs";
|
|
2
2
|
import JSON5 from "json5";
|
|
3
3
|
|
|
4
4
|
//#region src/infra/state-migrations.fs.ts
|
|
5
5
|
function safeReadDir(dir) {
|
|
6
6
|
try {
|
|
7
|
-
return
|
|
7
|
+
return syncFs.readdirSync(dir, { withFileTypes: true });
|
|
8
8
|
} catch {
|
|
9
9
|
return [];
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
function existsDir(dir) {
|
|
13
13
|
try {
|
|
14
|
-
return
|
|
14
|
+
return syncFs.existsSync(dir) && syncFs.statSync(dir).isDirectory();
|
|
15
15
|
} catch {
|
|
16
16
|
return false;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
function ensureDir(dir) {
|
|
20
|
-
|
|
20
|
+
syncFs.mkdirSync(dir, { recursive: true });
|
|
21
21
|
}
|
|
22
22
|
function fileExists(p) {
|
|
23
23
|
try {
|
|
24
|
-
return
|
|
24
|
+
return syncFs.existsSync(p) && syncFs.statSync(p).isFile();
|
|
25
25
|
} catch {
|
|
26
26
|
return false;
|
|
27
27
|
}
|
|
@@ -37,7 +37,7 @@ function isLegacyWhatsAppAuthFile(name) {
|
|
|
37
37
|
}
|
|
38
38
|
function readSessionStoreJson5(storePath) {
|
|
39
39
|
try {
|
|
40
|
-
const raw =
|
|
40
|
+
const raw = syncFs.readFileSync(storePath, "utf-8");
|
|
41
41
|
const parsed = JSON5.parse(raw);
|
|
42
42
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
43
43
|
return {
|
|
@@ -8,7 +8,7 @@ import { canonicalizeMainSessionAlias } from "../config/sessions/main-session.js
|
|
|
8
8
|
import { saveSessionStore } from "../config/sessions/store.js";
|
|
9
9
|
import "../config/sessions.js";
|
|
10
10
|
import { ensureDir, existsDir, fileExists, isLegacyWhatsAppAuthFile, readSessionStoreJson5, safeReadDir } from "./state-migrations.fs.js";
|
|
11
|
-
import
|
|
11
|
+
import syncFs from "node:fs";
|
|
12
12
|
import os from "node:os";
|
|
13
13
|
import path from "node:path";
|
|
14
14
|
|
|
@@ -241,7 +241,7 @@ function removeDirIfEmpty(dir) {
|
|
|
241
241
|
return;
|
|
242
242
|
}
|
|
243
243
|
try {
|
|
244
|
-
|
|
244
|
+
syncFs.rmdirSync(dir);
|
|
245
245
|
} catch {}
|
|
246
246
|
}
|
|
247
247
|
function resetAutoMigrateLegacyStateForTest() {
|
|
@@ -255,7 +255,7 @@ function resetAutoMigrateLegacyStateDirForTest() {
|
|
|
255
255
|
}
|
|
256
256
|
function resolveSymlinkTarget(linkPath) {
|
|
257
257
|
try {
|
|
258
|
-
const target =
|
|
258
|
+
const target = syncFs.readlinkSync(linkPath);
|
|
259
259
|
return path.resolve(path.dirname(linkPath), target);
|
|
260
260
|
} catch {
|
|
261
261
|
return null;
|
|
@@ -266,7 +266,7 @@ function formatStateDirMigration(legacyDir, targetDir) {
|
|
|
266
266
|
}
|
|
267
267
|
function isDirPath(filePath) {
|
|
268
268
|
try {
|
|
269
|
-
return
|
|
269
|
+
return syncFs.statSync(filePath).isDirectory();
|
|
270
270
|
} catch {
|
|
271
271
|
return false;
|
|
272
272
|
}
|
|
@@ -274,7 +274,7 @@ function isDirPath(filePath) {
|
|
|
274
274
|
function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
|
|
275
275
|
let entries;
|
|
276
276
|
try {
|
|
277
|
-
entries =
|
|
277
|
+
entries = syncFs.readdirSync(currentDir, { withFileTypes: true });
|
|
278
278
|
} catch {
|
|
279
279
|
return false;
|
|
280
280
|
}
|
|
@@ -285,7 +285,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
|
|
|
285
285
|
const entryPath = path.join(currentDir, entry.name);
|
|
286
286
|
let stat;
|
|
287
287
|
try {
|
|
288
|
-
stat =
|
|
288
|
+
stat = syncFs.lstatSync(entryPath);
|
|
289
289
|
} catch {
|
|
290
290
|
return false;
|
|
291
291
|
}
|
|
@@ -296,7 +296,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
|
|
|
296
296
|
}
|
|
297
297
|
let resolvedRealTarget;
|
|
298
298
|
try {
|
|
299
|
-
resolvedRealTarget =
|
|
299
|
+
resolvedRealTarget = syncFs.realpathSync(resolvedTarget);
|
|
300
300
|
} catch {
|
|
301
301
|
return false;
|
|
302
302
|
}
|
|
@@ -318,7 +318,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
|
|
|
318
318
|
function isLegacyDirSymlinkMirror(legacyDir, targetDir) {
|
|
319
319
|
let realTargetDir;
|
|
320
320
|
try {
|
|
321
|
-
realTargetDir =
|
|
321
|
+
realTargetDir = syncFs.realpathSync(targetDir);
|
|
322
322
|
} catch {
|
|
323
323
|
return false;
|
|
324
324
|
}
|
|
@@ -348,7 +348,7 @@ async function autoMigrateLegacyStateDir(params) {
|
|
|
348
348
|
const legacyDirs = resolveLegacyStateDirs(homedir);
|
|
349
349
|
let legacyDir = legacyDirs.find((dir) => {
|
|
350
350
|
try {
|
|
351
|
-
return
|
|
351
|
+
return syncFs.existsSync(dir);
|
|
352
352
|
} catch {
|
|
353
353
|
return false;
|
|
354
354
|
}
|
|
@@ -357,7 +357,7 @@ async function autoMigrateLegacyStateDir(params) {
|
|
|
357
357
|
const changes = [];
|
|
358
358
|
let legacyStat = null;
|
|
359
359
|
try {
|
|
360
|
-
legacyStat = legacyDir ?
|
|
360
|
+
legacyStat = legacyDir ? syncFs.lstatSync(legacyDir) : null;
|
|
361
361
|
} catch {
|
|
362
362
|
legacyStat = null;
|
|
363
363
|
}
|
|
@@ -401,7 +401,7 @@ async function autoMigrateLegacyStateDir(params) {
|
|
|
401
401
|
if (legacyDirs.some((dir) => path.resolve(dir) === path.resolve(legacyTarget))) {
|
|
402
402
|
legacyDir = legacyTarget;
|
|
403
403
|
try {
|
|
404
|
-
legacyStat =
|
|
404
|
+
legacyStat = syncFs.lstatSync(legacyDir);
|
|
405
405
|
} catch {
|
|
406
406
|
legacyStat = null;
|
|
407
407
|
}
|
|
@@ -464,7 +464,7 @@ async function autoMigrateLegacyStateDir(params) {
|
|
|
464
464
|
if (!legacyDir) {
|
|
465
465
|
throw new Error("Legacy state dir not found");
|
|
466
466
|
}
|
|
467
|
-
|
|
467
|
+
syncFs.renameSync(legacyDir, targetDir);
|
|
468
468
|
} catch (err) {
|
|
469
469
|
warnings.push(`Failed to move legacy state dir (${legacyDir ?? "unknown"} → ${targetDir}): ${String(err)}`);
|
|
470
470
|
return {
|
|
@@ -478,7 +478,7 @@ async function autoMigrateLegacyStateDir(params) {
|
|
|
478
478
|
if (!legacyDir) {
|
|
479
479
|
throw new Error("Legacy state dir not found");
|
|
480
480
|
}
|
|
481
|
-
|
|
481
|
+
syncFs.symlinkSync(targetDir, legacyDir, "dir");
|
|
482
482
|
changes.push(formatStateDirMigration(legacyDir, targetDir));
|
|
483
483
|
} catch (err) {
|
|
484
484
|
try {
|
|
@@ -486,7 +486,7 @@ async function autoMigrateLegacyStateDir(params) {
|
|
|
486
486
|
if (!legacyDir) {
|
|
487
487
|
throw new Error("Legacy state dir not found", { cause: err });
|
|
488
488
|
}
|
|
489
|
-
|
|
489
|
+
syncFs.symlinkSync(targetDir, legacyDir, "junction");
|
|
490
490
|
changes.push(formatStateDirMigration(legacyDir, targetDir));
|
|
491
491
|
} else {
|
|
492
492
|
throw err;
|
|
@@ -496,7 +496,7 @@ async function autoMigrateLegacyStateDir(params) {
|
|
|
496
496
|
if (!legacyDir) {
|
|
497
497
|
throw new Error("Legacy state dir not found", { cause: fallbackErr });
|
|
498
498
|
}
|
|
499
|
-
|
|
499
|
+
syncFs.renameSync(targetDir, legacyDir);
|
|
500
500
|
warnings.push(`State dir migration rolled back (failed to link legacy path): ${String(fallbackErr)}`);
|
|
501
501
|
return {
|
|
502
502
|
migrated: false,
|
|
@@ -682,7 +682,7 @@ async function migrateLegacySessions(detected, now) {
|
|
|
682
682
|
continue;
|
|
683
683
|
}
|
|
684
684
|
try {
|
|
685
|
-
|
|
685
|
+
syncFs.renameSync(from, to);
|
|
686
686
|
changes.push(`Moved ${entry.name} → agents/${detected.targetAgentId}/sessions`);
|
|
687
687
|
} catch (err) {
|
|
688
688
|
warnings.push(`Failed moving ${from}: ${String(err)}`);
|
|
@@ -691,7 +691,7 @@ async function migrateLegacySessions(detected, now) {
|
|
|
691
691
|
if (legacyParsed.ok) {
|
|
692
692
|
try {
|
|
693
693
|
if (fileExists(detected.sessions.legacyStorePath)) {
|
|
694
|
-
|
|
694
|
+
syncFs.rmSync(detected.sessions.legacyStorePath, { force: true });
|
|
695
695
|
}
|
|
696
696
|
} catch {}
|
|
697
697
|
}
|
|
@@ -700,7 +700,7 @@ async function migrateLegacySessions(detected, now) {
|
|
|
700
700
|
if (legacyLeft.length > 0) {
|
|
701
701
|
const backupDir = `${detected.sessions.legacyDir}.legacy-${now()}`;
|
|
702
702
|
try {
|
|
703
|
-
|
|
703
|
+
syncFs.renameSync(detected.sessions.legacyDir, backupDir);
|
|
704
704
|
warnings.push(`Left legacy sessions at ${backupDir}`);
|
|
705
705
|
} catch {}
|
|
706
706
|
}
|
|
@@ -723,11 +723,11 @@ async function migrateLegacyAgentDir(detected, now) {
|
|
|
723
723
|
for (const entry of entries) {
|
|
724
724
|
const from = path.join(detected.agentDir.legacyDir, entry.name);
|
|
725
725
|
const to = path.join(detected.agentDir.targetDir, entry.name);
|
|
726
|
-
if (
|
|
726
|
+
if (syncFs.existsSync(to)) {
|
|
727
727
|
continue;
|
|
728
728
|
}
|
|
729
729
|
try {
|
|
730
|
-
|
|
730
|
+
syncFs.renameSync(from, to);
|
|
731
731
|
changes.push(`Moved agent file ${entry.name} → agents/${detected.targetAgentId}/agent`);
|
|
732
732
|
} catch (err) {
|
|
733
733
|
warnings.push(`Failed moving ${from}: ${String(err)}`);
|
|
@@ -737,7 +737,7 @@ async function migrateLegacyAgentDir(detected, now) {
|
|
|
737
737
|
if (!emptyDirOrMissing(detected.agentDir.legacyDir)) {
|
|
738
738
|
const backupDir = path.join(detected.stateDir, "agents", detected.targetAgentId, `agent.legacy-${now()}`);
|
|
739
739
|
try {
|
|
740
|
-
|
|
740
|
+
syncFs.renameSync(detected.agentDir.legacyDir, backupDir);
|
|
741
741
|
warnings.push(`Left legacy agent dir at ${backupDir}`);
|
|
742
742
|
} catch (err) {
|
|
743
743
|
warnings.push(`Failed relocating legacy agent dir: ${String(err)}`);
|
|
@@ -775,7 +775,7 @@ async function migrateLegacyWhatsAppAuth(detected) {
|
|
|
775
775
|
continue;
|
|
776
776
|
}
|
|
777
777
|
try {
|
|
778
|
-
|
|
778
|
+
syncFs.renameSync(from, to);
|
|
779
779
|
changes.push(`Moved WhatsApp auth ${entry.name} → whatsapp/default`);
|
|
780
780
|
} catch (err) {
|
|
781
781
|
warnings.push(`Failed moving ${from}: ${String(err)}`);
|
|
@@ -799,7 +799,7 @@ async function migrateLegacyTelegramPairingAllowFrom(detected) {
|
|
|
799
799
|
const targetPath = detected.pairingAllowFrom.targetTelegramPath;
|
|
800
800
|
try {
|
|
801
801
|
ensureDir(path.dirname(targetPath));
|
|
802
|
-
|
|
802
|
+
syncFs.copyFileSync(legacyPath, targetPath);
|
|
803
803
|
changes.push(`Copied Telegram pairing allowFrom → ${targetPath}`);
|
|
804
804
|
} catch (err) {
|
|
805
805
|
warnings.push(`Failed migrating Telegram pairing allowFrom (${legacyPath}): ${String(err)}`);
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import
|
|
1
|
+
import syncFs from "node:fs";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
|
|
5
5
|
//#region src/infra/tmp-fased-dir.ts
|
|
6
6
|
const POSIX_FASED_TMP_DIR = "/tmp/fased";
|
|
7
|
-
const TMP_DIR_ACCESS_MODE =
|
|
7
|
+
const TMP_DIR_ACCESS_MODE = syncFs.constants.W_OK | syncFs.constants.X_OK;
|
|
8
8
|
function isNodeErrorWithCode(err, code) {
|
|
9
9
|
return typeof err === "object" && err !== null && "code" in err && err.code === code;
|
|
10
10
|
}
|
|
11
11
|
function resolvePreferredFasedAgentTmpDir(options = {}) {
|
|
12
|
-
const accessSync = options.accessSync ??
|
|
13
|
-
const chmodSync = options.chmodSync ??
|
|
14
|
-
const lstatSync = options.lstatSync ??
|
|
15
|
-
const mkdirSync = options.mkdirSync ??
|
|
12
|
+
const accessSync = options.accessSync ?? syncFs.accessSync;
|
|
13
|
+
const chmodSync = options.chmodSync ?? syncFs.chmodSync;
|
|
14
|
+
const lstatSync = options.lstatSync ?? syncFs.lstatSync;
|
|
15
|
+
const mkdirSync = options.mkdirSync ?? syncFs.mkdirSync;
|
|
16
16
|
const warn = options.warn ?? ((message) => console.warn(message));
|
|
17
17
|
const getuid = options.getuid ?? (() => {
|
|
18
18
|
try {
|
|
@@ -47,6 +47,78 @@ const DEFAULT_PACKAGE_NAME = "@fased/fased";
|
|
|
47
47
|
const LEGACY_PACKAGE_NAME = "fased";
|
|
48
48
|
const CORE_PACKAGE_NAMES = new Set([LEGACY_PACKAGE_NAME, DEFAULT_PACKAGE_NAME]);
|
|
49
49
|
const DEV_PREFLIGHT_LINT_OPT_IN_ENV = "FASED_UPDATE_PREFLIGHT_LINT";
|
|
50
|
+
const SOURCE_RELEASE_REPOSITORY = "fased-ai/fased";
|
|
51
|
+
const SOURCE_RELEASE_WORKFLOW = "fased-ai/fased/.github/workflows/hosted-runtime-release.yml";
|
|
52
|
+
async function verifyAttestedSourceRelease(params) {
|
|
53
|
+
const startedAt = Date.now();
|
|
54
|
+
const version = params.tag.replace(/^v/u, "");
|
|
55
|
+
const command = `verify attested source ${params.tag} at ${params.tagCommit}`;
|
|
56
|
+
const cwd = process.cwd();
|
|
57
|
+
const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "fased-source-attestation-"));
|
|
58
|
+
try {
|
|
59
|
+
const base = (params.baseUrl?.trim().replace(/\/+$/u, "") || "https://github.com/fased-ai/fased/releases/download") + `/${params.tag}`;
|
|
60
|
+
const manifestPath = path.join(tempRoot, "fased-hosted-release-v2.json");
|
|
61
|
+
const bundlePath = `${manifestPath}.attestation.json`;
|
|
62
|
+
for (const [name, destination] of [["fased-hosted-release-v2.json", manifestPath], ["fased-hosted-release-v2.json.attestation.json", bundlePath]]) {
|
|
63
|
+
const response = await params.fetchImpl(`${base}/${name}`, { redirect: "follow" });
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
throw new Error(`release identity asset ${name} is unavailable (${response.status})`);
|
|
66
|
+
}
|
|
67
|
+
await fs.writeFile(destination, new Uint8Array(await response.arrayBuffer()), { mode: 384 });
|
|
68
|
+
}
|
|
69
|
+
const verification = await params.runCommand([
|
|
70
|
+
"gh",
|
|
71
|
+
"attestation",
|
|
72
|
+
"verify",
|
|
73
|
+
manifestPath,
|
|
74
|
+
"--repo",
|
|
75
|
+
SOURCE_RELEASE_REPOSITORY,
|
|
76
|
+
"--bundle",
|
|
77
|
+
bundlePath,
|
|
78
|
+
"--signer-workflow",
|
|
79
|
+
SOURCE_RELEASE_WORKFLOW,
|
|
80
|
+
"--source-ref",
|
|
81
|
+
`refs/tags/${params.tag}`,
|
|
82
|
+
"--deny-self-hosted-runners"
|
|
83
|
+
], {
|
|
84
|
+
cwd: tempRoot,
|
|
85
|
+
timeoutMs: params.timeoutMs,
|
|
86
|
+
env: {
|
|
87
|
+
...process.env,
|
|
88
|
+
GH_PROMPT_DISABLED: "1"
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
if (verification.code !== 0) {
|
|
92
|
+
throw new Error(verification.stderr.trim() || "GitHub attestation verification failed");
|
|
93
|
+
}
|
|
94
|
+
const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
|
|
95
|
+
if (manifest.schemaVersion !== 2 || manifest.release?.version !== version || manifest.release?.tag !== params.tag || manifest.release?.commit !== params.tagCommit || !/^[a-f0-9]{40}$/u.test(String(manifest.release?.commit ?? "")) || manifest.signer?.release?.version !== version || manifest.signer?.release?.commit !== params.tagCommit || manifest.signer?.release?.development !== false) {
|
|
96
|
+
throw new Error("attested release does not bind the exact source tag, commit, and signer");
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
name: "source release attestation",
|
|
100
|
+
command,
|
|
101
|
+
cwd,
|
|
102
|
+
durationMs: Date.now() - startedAt,
|
|
103
|
+
exitCode: 0,
|
|
104
|
+
stdoutTail: `${params.tag} -> ${params.tagCommit}`
|
|
105
|
+
};
|
|
106
|
+
} catch (error) {
|
|
107
|
+
return {
|
|
108
|
+
name: "source release attestation",
|
|
109
|
+
command,
|
|
110
|
+
cwd,
|
|
111
|
+
durationMs: Date.now() - startedAt,
|
|
112
|
+
exitCode: 1,
|
|
113
|
+
stderrTail: String(error)
|
|
114
|
+
};
|
|
115
|
+
} finally {
|
|
116
|
+
await fs.rm(tempRoot, {
|
|
117
|
+
recursive: true,
|
|
118
|
+
force: true
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
50
122
|
function normalizeDir(value) {
|
|
51
123
|
if (!value) {
|
|
52
124
|
return null;
|
|
@@ -1472,6 +1544,30 @@ async function runGatewayUpdate(opts = {}) {
|
|
|
1472
1544
|
durationMs: Date.now() - startedAt
|
|
1473
1545
|
};
|
|
1474
1546
|
}
|
|
1547
|
+
const tagCommitStep = await runStep(step(`git rev-parse ${tag}^{commit}`, [
|
|
1548
|
+
"git",
|
|
1549
|
+
"-C",
|
|
1550
|
+
gitRoot,
|
|
1551
|
+
"rev-parse",
|
|
1552
|
+
`${tag}^{commit}`
|
|
1553
|
+
], gitRoot));
|
|
1554
|
+
steps.push(tagCommitStep);
|
|
1555
|
+
const tagCommit = tagCommitStep.stdoutTail?.trim() ?? "";
|
|
1556
|
+
if (tagCommitStep.exitCode !== 0 || !/^[a-f0-9]{40}$/u.test(tagCommit)) {
|
|
1557
|
+
return buildGitErrorResult("release-tag-identity-failed");
|
|
1558
|
+
}
|
|
1559
|
+
const attestationStep = await verifyAttestedSourceRelease({
|
|
1560
|
+
tag,
|
|
1561
|
+
tagCommit,
|
|
1562
|
+
timeoutMs,
|
|
1563
|
+
runCommand,
|
|
1564
|
+
fetchImpl: opts.hostedReleaseFetch ?? fetch,
|
|
1565
|
+
baseUrl: opts.hostedReleaseBaseUrl
|
|
1566
|
+
});
|
|
1567
|
+
steps.push(attestationStep);
|
|
1568
|
+
if (attestationStep.exitCode !== 0) {
|
|
1569
|
+
return buildGitErrorResult("source-release-attestation-failed");
|
|
1570
|
+
}
|
|
1475
1571
|
const failure = await runGitCheckoutOrFail(`git checkout ${tag}`, [
|
|
1476
1572
|
"git",
|
|
1477
1573
|
"-C",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CONFIG_DIR, ensureDir } from "../utils.js";
|
|
2
|
-
import
|
|
2
|
+
import syncFs from "node:fs";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
|
|
@@ -126,7 +126,7 @@ async function writeWideAreaGatewayZone(opts) {
|
|
|
126
126
|
await ensureDir(path.dirname(zonePath));
|
|
127
127
|
const existing = (() => {
|
|
128
128
|
try {
|
|
129
|
-
return
|
|
129
|
+
return syncFs.readFileSync(zonePath, "utf-8");
|
|
130
130
|
} catch {
|
|
131
131
|
return null;
|
|
132
132
|
}
|
|
@@ -149,7 +149,7 @@ async function writeWideAreaGatewayZone(opts) {
|
|
|
149
149
|
...opts,
|
|
150
150
|
serial
|
|
151
151
|
});
|
|
152
|
-
|
|
152
|
+
syncFs.writeFileSync(zonePath, next, "utf-8");
|
|
153
153
|
return {
|
|
154
154
|
zonePath,
|
|
155
155
|
changed: true
|