@fased/fased 0.1.62 → 0.1.65
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 +48 -0
- package/README.md +44 -29
- package/config/dependency-ownership.json +1 -1
- package/config/signer-policies/README.md +58 -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 +78 -0
- package/config/typescript-noemit-baseline.json +680 -0
- package/dist/agents/auth-profiles/store.js +267 -31
- package/dist/agents/bash-tools.exec.js +10 -4
- package/dist/agents/current-model-catalog.js +3 -3
- package/dist/agents/memory-search.js +7 -1
- package/dist/agents/model-catalog-access.js +1 -2
- package/dist/agents/model-catalog-snapshot.js +1 -1
- package/dist/agents/model-catalog-source.js +1 -1
- package/dist/agents/model-metadata.js +1 -1
- package/dist/agents/model-selection.js +2 -28
- package/dist/agents/models-config.providers.js +6 -6
- package/dist/agents/pi-embedded-runner/compact.js +15 -7
- package/dist/agents/pi-embedded-runner/model.js +1 -1
- package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
- package/dist/agents/pi-embedded-runner/run.js +2 -0
- package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
- package/dist/agents/pi-tool-definition-adapter.js +16 -1
- package/dist/agents/pi-tools.js +2 -1
- package/dist/agents/sandbox/config.js +1 -1
- package/dist/agents/sandbox/context.js +27 -2
- package/dist/agents/skills/env-overrides.js +38 -28
- package/dist/agents/skills/trust.js +93 -0
- package/dist/agents/skills/workspace.js +128 -0
- package/dist/agents/skills-clawhub.js +36 -11
- package/dist/agents/skills-marketplace-scan.js +49 -0
- package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
- package/dist/agents/tools/mining-tool.js +1 -1
- package/dist/agents/tools/session-status-tool.js +1 -1
- package/dist/agents/tools/wallet-action-tool.js +172 -36
- package/dist/agents/tools/wallet-skill-policy.js +65 -23
- package/dist/agents/tools/wallet-tool.js +7 -11
- package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
- package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
- package/dist/auto-reply/reply/directive-handling.model.js +2 -1
- package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
- package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
- package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
- package/dist/auto-reply/reply/model-selection.js +7 -4
- package/dist/auto-reply/reply/session-reset-model.js +4 -4
- package/dist/brand.js +1 -1
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/channel-web.js +2 -2
- package/dist/cli/gateway-cli/run.js +8 -0
- package/dist/cli/program/command-registry.js +1 -1
- package/dist/cli/program/register.onboard.js +2 -3
- package/dist/cli/program/register.wallet.js +16 -123
- package/dist/cli/providers-cli.js +1 -1
- package/dist/cli/sat-cli.js +129 -2
- package/dist/cli/update-cli/update-command.js +260 -11
- package/dist/commands/auth-choice.apply.api-providers.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-legacy-config.js +2 -13
- package/dist/commands/model-picker.js +6 -6
- package/dist/commands/models/auth.js +1 -1
- package/dist/commands/onboard-auth.config-gateways.js +1 -1
- package/dist/commands/onboard-auth.credentials.js +32 -8
- package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
- package/dist/commands/onboard-non-interactive/local.js +5 -1
- package/dist/commands/wallet.js +568 -1911
- package/dist/config/config.js +2 -2
- package/dist/config/io.js +64 -2
- package/dist/config/schema.help.js +8 -7
- package/dist/config/schema.labels.js +5 -4
- package/dist/config/zod-schema.agent-runtime.js +1 -0
- package/dist/config/zod-schema.js +5 -0
- package/dist/control-ui/assets/{app-DLil9VO1.js → app-MaQnPa5G.js} +1511 -1555
- package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
- package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
- package/dist/control-ui/assets/{index-DdE_NIXo.js → index-D4YMr1fA.js} +3 -3
- package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
- package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-qMYs4aD-.js} +70 -50
- package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
- package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
- package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
- package/dist/control-ui/index.html +1 -1
- package/dist/control-ui/version.json +1 -1
- package/dist/daemon/systemd-system.js +56 -50
- package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
- package/dist/extensions/sat-mining/src/rpc-read.js +291 -84
- package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
- package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
- package/dist/extensions/sat-mining/src/solana-submit.js +1274 -390
- package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
- package/dist/federation/auto-connect.js +98 -8
- package/dist/federation/marketplace-capability-adapter.js +33 -7
- package/dist/federation/marketplace-delivery-outbox.js +196 -0
- package/dist/federation/marketplace-delivery.js +351 -215
- package/dist/federation/marketplace-direct-payment.js +272 -141
- package/dist/federation/marketplace-escrow.js +607 -249
- package/dist/federation/marketplace-settlement-ledger.js +352 -0
- package/dist/federation/offers.js +9 -7
- package/dist/federation/peer-auth-v2.js +529 -0
- package/dist/gateway/a2a-http.js +425 -96
- package/dist/gateway/a2a-settlement.js +259 -153
- package/dist/gateway/a2a-task-store.js +524 -0
- package/dist/gateway/auth.js +38 -2
- package/dist/gateway/config-reload.js +46 -33
- package/dist/gateway/durable-capacity.js +31 -0
- package/dist/gateway/federation-http.js +540 -135
- package/dist/gateway/federation-marketplace-run-store.js +397 -0
- package/dist/gateway/federation-marketplace.js +535 -230
- package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
- package/dist/gateway/security-path.js +1 -1
- package/dist/gateway/server-http.js +1084 -1205
- package/dist/gateway/server-methods/models.js +1 -1
- package/dist/gateway/server-methods/secrets.js +40 -0
- package/dist/gateway/server-methods.js +1 -2
- package/dist/gateway/server-reload-handlers.js +196 -66
- package/dist/gateway/server-runtime-config.js +1 -1
- package/dist/gateway/server-secrets-runtime.js +288 -0
- package/dist/gateway/server.impl.js +73 -42
- package/dist/gateway/sessions-patch.js +3 -5
- package/dist/index.js +4 -2
- package/dist/infra/fasedhub.js +64 -1
- package/dist/infra/local-source-paired-update.js +538 -0
- package/dist/infra/restart.js +41 -10
- package/dist/infra/update-runner.js +96 -0
- package/dist/light-update-status.js +11 -11
- package/dist/memory/backend-config.js +2 -1
- package/dist/memory/session-files.js +16 -2
- package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
- package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
- package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-I4IngVlJ.js} +27 -27
- package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
- package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
- package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
- package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
- package/dist/plugin-sdk/channel-plugin-common.js +4 -4
- package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
- package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DLQ6_lLK.js} +1 -1
- package/dist/plugin-sdk/command-status.d.ts +2 -2
- package/dist/plugin-sdk/command-status.js +27 -27
- package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
- package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
- package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
- package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-D_8FVI1C.js} +6798 -3695
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/discord.d.ts +6 -6
- package/dist/plugin-sdk/discord.js +19 -19
- package/dist/plugin-sdk/file-lock.js +35 -4
- package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
- package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
- package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
- package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
- package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
- package/dist/plugin-sdk/index.d.ts +21 -39
- package/dist/plugin-sdk/index.js +29 -29
- package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
- package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
- package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
- package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
- package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
- package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
- package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-B4KF4Kpo.js} +31 -31
- package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-Bb6x1KAG.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DCTO8JkL.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-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
- package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-DHPDFZbC.d.ts} +2 -2
- 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 +565 -309
- package/dist/plugin-sdk/sat-runtime.js +29 -29
- package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
- package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
- package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
- package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
- package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
- package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
- package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
- package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BHmvqgjH.js} +39 -39
- package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
- package/dist/plugin-sdk/slack.d.ts +6 -6
- package/dist/plugin-sdk/slack.js +9 -9
- package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-By5AcorL.js} +3 -3
- package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
- package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
- package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-DGnBz1YT.js} +30 -30
- package/dist/plugin-sdk/telegram.d.ts +6 -6
- package/dist/plugin-sdk/telegram.js +8 -8
- package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
- package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
- package/dist/plugin-sdk/tmp-fased-dir-EJGTmL1Q.d.ts +486 -0
- package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-BdwdFCD6.d.ts} +2 -3
- package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-BrCpYMxn.d.ts} +2 -2
- package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
- package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
- package/dist/plugin-sdk/{web-CInY-lCv.js → web-DUJwrTYs.js} +32 -32
- package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
- package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
- package/dist/plugin-sdk/whatsapp.d.ts +13 -13
- package/dist/plugin-sdk/whatsapp.js +12 -12
- package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
- package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
- package/dist/providers/refresh.js +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/secrets/apply.js +1 -1
- package/dist/secrets/runtime.js +1 -1
- package/dist/wallet/external-submission-ledger.js +376 -0
- package/dist/wallet/legacy-embedded-keystore.js +40 -0
- package/dist/wallet/local-socket-signer-archive.js +30 -0
- package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
- package/dist/wallet/local-socket-signer-policy.js +166 -0
- package/dist/wallet/local-socket-signer-protocol.js +578 -117
- package/dist/wallet/native-signer-wallet-id.js +25 -0
- package/dist/wallet/providers/alchemy-adapter.js +3 -0
- package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
- package/dist/wallet/providers/turnkey-adapter.js +292 -34
- package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
- package/dist/wallet/signer-network-admin.js +184 -0
- package/dist/wallet/signer-protocol-v2.generated.js +92 -0
- package/dist/wallet/solana-bond-signing.js +157 -69
- package/dist/wallet/solana-reviewed-transaction.js +375 -0
- package/dist/wallet/solana-swap.js +520 -64
- package/dist/wallet/solana-transaction-inspection.js +106 -4
- package/dist/wallet/solana-trigger.js +658 -320
- package/dist/wallet/turnkey-reviewed-state.js +370 -0
- package/dist/wallet/wallet-approval-auth.js +17 -28
- package/dist/wallet/wallet-atomic-state.js +53 -0
- package/dist/wallet/wallet-canary.js +0 -1
- package/dist/wallet/wallet-inbound-events.js +16 -11
- package/dist/wallet/wallet-policy-simulation.js +1 -1
- package/dist/wallet/wallet-policy.js +93 -37
- package/dist/wallet/wallet-provider-capabilities.js +28 -4
- package/dist/wallet/wallet-provider-registry.js +57 -44
- package/dist/wallet/wallet-provider-resolver.js +62 -63
- package/dist/wallet/wallet-runtime-config.js +28 -41
- package/dist/wallet/wallet-secrets-store.js +22 -0
- package/dist/wallet/wallet-send-approvals.js +1891 -589
- package/dist/wallet/wallet-send-execution-ledger.js +292 -0
- package/dist/wallet/wallet-settlement-links.js +14 -13
- package/dist/wallet/wallet-standard-review.js +353 -0
- package/dist/wallet/wallet-status.js +0 -9
- package/dist/wallet/wallet-task-ledger.js +16 -2
- package/dist/web/auto-reply/heartbeat-runner.js +1 -1
- package/dist/web/auto-reply/monitor.js +2 -2
- package/dist/wizard/host-security-capability.js +14 -23
- package/dist/wizard/onboarding.finalize.js +63 -184
- package/dist/wizard/onboarding.host-security.js +117 -1367
- package/dist/wizard/onboarding.js +172 -217
- package/dist/wizard/onboarding.wallet.js +232 -785
- package/extensions/acpx/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/fased-federation/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +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 +587 -154
- 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 +91 -5
- package/extensions/sat-mining/src/claim-service.ts +85 -14
- package/extensions/sat-mining/src/client.ts +13 -0
- 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 +431 -106
- package/extensions/sat-mining/src/runtime.ts +16 -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 +1544 -436
- package/extensions/sat-mining/src/submission-ledger.ts +434 -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 +4951 -0
- package/package.json +23 -5
- package/scripts/fased-host-updater.mjs +1421 -0
- package/scripts/fased-host-updaterctl.mjs +186 -0
- package/scripts/fased-managed-service.sh +36 -0
- package/scripts/fased-managed-updater.mjs +3065 -156
- package/scripts/fased-signer-enroll-hosting.sh +275 -0
- package/scripts/fased-signer-network-hosting.sh +143 -0
- package/scripts/fased-signer-owner-policy.mjs +1442 -0
- package/scripts/fased-signer-policy-hosting.sh +50 -0
- package/scripts/fased-signer-policy-local.sh +26 -0
- package/scripts/hosted-release-manifest.mjs +185 -0
- package/scripts/install-fased-signerd.sh +183 -108
- package/scripts/install-managed-runtime.mjs +212 -10
- package/scripts/managed-runtime-layout.mjs +75 -3
- package/scripts/migrate-hosted-signer-v2.mjs +58 -0
- package/scripts/start-managed.sh +173 -360
- package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
- package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
- package/dist/wallet/local-socket-signer-broker.js +0 -224
- package/dist/wallet/local-socket-signer-custody.js +0 -42
- package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
- package/dist/wallet/providers/privy-adapter.js +0 -80
- package/dist/wallet/wallet-custody.js +0 -1836
|
@@ -17,7 +17,8 @@ import { startDiagnosticHeartbeat, stopDiagnosticHeartbeat } from "../logging/di
|
|
|
17
17
|
import { getTotalQueueSize } from "../process/command-queue.js";
|
|
18
18
|
import { clearAgentRunContext, onAgentEvent } from "../infra/agent-events.js";
|
|
19
19
|
import { initSubagentRegistry } from "../agents/subagent-registry.js";
|
|
20
|
-
import {
|
|
20
|
+
import { resolveWalletRuntimeConfig } from "../wallet/wallet-runtime-config.js";
|
|
21
|
+
import { readWalletProviderRegistry } from "../wallet/wallet-provider-registry.js";
|
|
21
22
|
import { createWalletProviderAdapter, resolveWalletProviderId } from "../wallet/wallet-provider-resolver.js";
|
|
22
23
|
import { getTotalPendingReplies } from "../auto-reply/reply/dispatcher-registry.js";
|
|
23
24
|
import { applyPluginAutoEnable } from "../config/plugin-auto-enable.js";
|
|
@@ -38,6 +39,7 @@ import { createDefaultDeps } from "../cli/deps.js";
|
|
|
38
39
|
import { ensureFasedAgentCliOnPath } from "../infra/path-env.js";
|
|
39
40
|
import { createExecApprovalForwarder } from "../infra/exec-approval-forwarder.js";
|
|
40
41
|
import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
|
|
42
|
+
import { clearSecretsRuntimeSnapshot } from "../secrets/runtime.js";
|
|
41
43
|
import { runOnboardingWizard } from "../wizard/onboarding.js";
|
|
42
44
|
import { startGatewayConfigReloader } from "./config-reload.js";
|
|
43
45
|
import { ExecApprovalManager } from "./exec-approval-manager.js";
|
|
@@ -54,6 +56,8 @@ import { startGatewayMaintenanceTimers } from "./server-maintenance.js";
|
|
|
54
56
|
import { GATEWAY_EVENTS, listGatewayMethods } from "./server-methods-list.js";
|
|
55
57
|
import { coreGatewayHandlers } from "./server-methods.js";
|
|
56
58
|
import { createExecApprovalHandlers } from "./server-methods/exec-approval.js";
|
|
59
|
+
import { createGatewaySecretsRuntimeController, sanitizeGatewaySecretsRuntimeError } from "./server-secrets-runtime.js";
|
|
60
|
+
import { createSecretsHandlers } from "./server-methods/secrets.js";
|
|
57
61
|
import { hasConnectedMobileNode } from "./server-mobile-nodes.js";
|
|
58
62
|
import { createNodeSubscriptionManager } from "./server-node-subscriptions.js";
|
|
59
63
|
import { loadGatewayPlugins } from "./server-plugins.js";
|
|
@@ -68,7 +72,6 @@ import { createWizardSessionTracker } from "./server-wizard-sessions.js";
|
|
|
68
72
|
import { attachGatewayWsHandlers } from "./server-ws-runtime.js";
|
|
69
73
|
import { loadGatewayTlsRuntime } from "./server/tls.js";
|
|
70
74
|
import { createSessionEventSubscriberRegistry, createSessionMessageSubscriberRegistry } from "./session-event-subscribers.js";
|
|
71
|
-
import syncFs from "node:fs";
|
|
72
75
|
import path from "node:path";
|
|
73
76
|
|
|
74
77
|
//#region src/gateway/server.impl.ts
|
|
@@ -88,25 +91,6 @@ const logWsControl = log.child("ws");
|
|
|
88
91
|
const gatewayRuntime = runtimeForLogger(log);
|
|
89
92
|
const canvasRuntime = runtimeForLogger(logCanvas);
|
|
90
93
|
const LOCAL_SIGNER_STARTUP_RECOVERY_TIMEOUT_MS = 2e3;
|
|
91
|
-
function hasConfiguredLocalSignerKeystoreMaterial(env) {
|
|
92
|
-
for (const [key, rawValue] of Object.entries(env)) {
|
|
93
|
-
if (typeof rawValue !== "string" || rawValue.trim().length === 0) {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (key === "FASED_WALLET_SOLANA_KEYSTORE_PATH" || key.startsWith("FASED_WALLET_SOLANA_KEYSTORE_PATH__")) {
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
const materialDir = resolveLocalSignerMaterialRootDir(env);
|
|
102
|
-
if (!syncFs.existsSync(materialDir)) {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
return syncFs.readdirSync(materialDir, { withFileTypes: true }).some((entry) => entry.isFile() && /^keystore-solana(?:-.+)?\.v1\.enc$/i.test(entry.name));
|
|
106
|
-
} catch {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
94
|
async function ensureLocalSignerReadyAtGatewayStart(cfg) {
|
|
111
95
|
const effectiveEnv = {
|
|
112
96
|
...process.env,
|
|
@@ -116,8 +100,8 @@ async function ensureLocalSignerReadyAtGatewayStart(cfg) {
|
|
|
116
100
|
if (providerId !== "local-socket-signer") {
|
|
117
101
|
return;
|
|
118
102
|
}
|
|
119
|
-
if (!
|
|
120
|
-
log.debug("local signer startup check skipped: no
|
|
103
|
+
if (!readWalletProviderRegistry(effectiveEnv).wallets.some((wallet) => wallet.providerId === "local-socket-signer")) {
|
|
104
|
+
log.debug("local signer startup check skipped: no signer-owned wallet is registered");
|
|
121
105
|
return;
|
|
122
106
|
}
|
|
123
107
|
const wallet = resolveWalletRuntimeConfig(cfg, effectiveEnv);
|
|
@@ -152,6 +136,14 @@ async function ensureLocalSignerReadyAtGatewayStart(cfg) {
|
|
|
152
136
|
}
|
|
153
137
|
}
|
|
154
138
|
async function startGatewayServer(port = 18789, opts = {}) {
|
|
139
|
+
try {
|
|
140
|
+
return await startGatewayServerInternal(port, opts);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
clearSecretsRuntimeSnapshot();
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function startGatewayServerInternal(port, opts) {
|
|
155
147
|
const minimalTestGateway = process.env.VITEST === "1" && process.env.FASED_TEST_MINIMAL_GATEWAY === "1";
|
|
156
148
|
process.env.FASED_GATEWAY_PORT = String(port);
|
|
157
149
|
logAcceptedEnvOption({
|
|
@@ -197,6 +189,19 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
197
189
|
log.warn(`gateway: failed to persist plugin auto-enable changes: ${String(err)}`);
|
|
198
190
|
}
|
|
199
191
|
}
|
|
192
|
+
configSnapshot = await startupTrace.measure("config.secrets-source", () => readConfigFileSnapshot());
|
|
193
|
+
if (configSnapshot.exists && !configSnapshot.valid) {
|
|
194
|
+
const issues = configSnapshot.issues.map((issue) => `${issue.path || "<root>"}: ${issue.message}`).join("\n");
|
|
195
|
+
throw new Error(`Invalid config at ${configSnapshot.path}.\n${issues || "Unknown validation issue."}\nRun "${formatCliCommand("fased doctor")}" to repair, then retry.`);
|
|
196
|
+
}
|
|
197
|
+
const secretsRuntime = createGatewaySecretsRuntimeController({
|
|
198
|
+
readConfigSnapshot: readConfigFileSnapshot,
|
|
199
|
+
log: logReload
|
|
200
|
+
});
|
|
201
|
+
const startupSecretsSnapshot = await startupTrace.measure("secrets.activate", () => secretsRuntime.activateStartup(configSnapshot)).catch((error) => {
|
|
202
|
+
const safe = sanitizeGatewaySecretsRuntimeError(error);
|
|
203
|
+
throw new Error(`Startup failed: required secrets are unavailable (${safe.code}). ${safe.message}`);
|
|
204
|
+
});
|
|
200
205
|
const cfgAtStart = startupTrace.measureSync("config.load", () => loadConfig());
|
|
201
206
|
const diagnosticsEnabled = isDiagnosticsEnabled(cfgAtStart);
|
|
202
207
|
if (diagnosticsEnabled) {
|
|
@@ -534,6 +539,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
534
539
|
const execApprovalForwarder = createExecApprovalForwarder();
|
|
535
540
|
const execApprovalHandlers = createExecApprovalHandlers(execApprovalManager, { forwarder: execApprovalForwarder });
|
|
536
541
|
Object.assign(extraGatewayHandlers, execApprovalHandlers);
|
|
542
|
+
Object.assign(extraGatewayHandlers, createSecretsHandlers({ reloadSecrets: secretsRuntime.reloadFromConfig }));
|
|
537
543
|
const canvasHostServerPort = canvasHostServer?.port;
|
|
538
544
|
startupTrace.measureSync("ws.attach", () => {
|
|
539
545
|
attachGatewayWsHandlers({
|
|
@@ -653,7 +659,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
653
659
|
}
|
|
654
660
|
}
|
|
655
661
|
const configReloader = minimalTestGateway ? { stop: async () => {} } : startupTrace.measureSync("config-reload.start", () => {
|
|
656
|
-
const {
|
|
662
|
+
const { cancelPendingGatewayRestart, createHotReloadTransaction, requestGatewayRestart } = createGatewayReloadHandlers({
|
|
657
663
|
deps,
|
|
658
664
|
broadcast,
|
|
659
665
|
getState: () => ({
|
|
@@ -679,10 +685,29 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
679
685
|
logReload
|
|
680
686
|
});
|
|
681
687
|
return startGatewayConfigReloader({
|
|
682
|
-
initialConfig:
|
|
688
|
+
initialConfig: startupSecretsSnapshot.sourceConfig,
|
|
683
689
|
readSnapshot: readConfigFileSnapshot,
|
|
684
|
-
|
|
685
|
-
|
|
690
|
+
onSourceRevision: () => {
|
|
691
|
+
cancelPendingGatewayRestart();
|
|
692
|
+
},
|
|
693
|
+
onStop: () => {
|
|
694
|
+
cancelPendingGatewayRestart();
|
|
695
|
+
},
|
|
696
|
+
onHotReload: async (plan, _nextConfig, snapshot) => {
|
|
697
|
+
const transaction = createHotReloadTransaction(plan);
|
|
698
|
+
await secretsRuntime.activateHotReload(snapshot, {
|
|
699
|
+
apply: async (preparedConfig) => {
|
|
700
|
+
await transaction.apply(preparedConfig);
|
|
701
|
+
},
|
|
702
|
+
rollback: async (previousConfig) => {
|
|
703
|
+
await transaction.rollback(previousConfig);
|
|
704
|
+
}
|
|
705
|
+
});
|
|
706
|
+
},
|
|
707
|
+
onRestart: async (plan, nextConfig, snapshot) => {
|
|
708
|
+
await secretsRuntime.validateRestart(snapshot);
|
|
709
|
+
requestGatewayRestart(plan, nextConfig);
|
|
710
|
+
},
|
|
686
711
|
log: {
|
|
687
712
|
info: (msg) => logReload.info(msg),
|
|
688
713
|
warn: (msg) => logReload.warn(msg),
|
|
@@ -722,22 +747,28 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
722
747
|
}]
|
|
723
748
|
});
|
|
724
749
|
return { close: async (opts) => {
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
750
|
+
try {
|
|
751
|
+
await runGlobalGatewayStopSafely({
|
|
752
|
+
event: { reason: opts?.reason ?? "gateway stopping" },
|
|
753
|
+
ctx: { port },
|
|
754
|
+
onError: (err) => log.warn(`gateway_stop hook failed: ${String(err)}`)
|
|
755
|
+
});
|
|
756
|
+
await configReloader.stop().catch(() => {});
|
|
757
|
+
await secretsRuntime.shutdown();
|
|
758
|
+
if (diagnosticsEnabled) {
|
|
759
|
+
stopDiagnosticHeartbeat();
|
|
760
|
+
stopDiagnosticStabilityRecorder();
|
|
761
|
+
}
|
|
762
|
+
if (skillsRefreshTimer) {
|
|
763
|
+
clearTimeout(skillsRefreshTimer);
|
|
764
|
+
skillsRefreshTimer = null;
|
|
765
|
+
}
|
|
766
|
+
skillsChangeUnsub();
|
|
767
|
+
authRateLimiter?.dispose();
|
|
768
|
+
await close(opts);
|
|
769
|
+
} finally {
|
|
770
|
+
await secretsRuntime.shutdown();
|
|
737
771
|
}
|
|
738
|
-
skillsChangeUnsub();
|
|
739
|
-
authRateLimiter?.dispose();
|
|
740
|
-
await close(opts);
|
|
741
772
|
} };
|
|
742
773
|
}
|
|
743
774
|
|
|
@@ -3,8 +3,7 @@ import { normalizeElevatedLevel, normalizeReasoningLevel, normalizeUsageDisplay
|
|
|
3
3
|
import { isSubagentSessionKey, parseAgentSessionKey } from "../sessions/session-key-utils.js";
|
|
4
4
|
import { normalizeAgentId } from "../routing/session-key.js";
|
|
5
5
|
import { resolveDefaultAgentId } from "../agents/agent-scope.js";
|
|
6
|
-
import {
|
|
7
|
-
import { modelKey, resolveAllowedModelRef, resolveDefaultModelForAgent, resolveSubagentConfiguredModelSelection } from "../agents/model-selection.js";
|
|
6
|
+
import { normalizeProviderId, resolveAllowedModelRef, resolveDefaultModelForAgent, resolveSubagentConfiguredModelSelection } from "../agents/model-selection.js";
|
|
8
7
|
import { parseSessionLabel } from "../sessions/session-label.js";
|
|
9
8
|
import { ErrorCodes, errorShape } from "./protocol/schema/error-codes.js";
|
|
10
9
|
import "./protocol/index.js";
|
|
@@ -272,13 +271,12 @@ async function applySessionsPatchToStore(params) {
|
|
|
272
271
|
catalog,
|
|
273
272
|
raw: trimmed,
|
|
274
273
|
defaultProvider: resolvedDefault.provider,
|
|
275
|
-
defaultModel: subagentModelHint ?? resolvedDefault.model
|
|
276
|
-
additionalAllowedProviders: params.additionalAllowedModelProviders
|
|
274
|
+
defaultModel: subagentModelHint ?? resolvedDefault.model
|
|
277
275
|
});
|
|
278
276
|
if ("error" in resolved) {
|
|
279
277
|
return invalid(resolved.error);
|
|
280
278
|
}
|
|
281
|
-
if (params.additionalAllowedModelProviders && !
|
|
279
|
+
if (params.additionalAllowedModelProviders && !new Set([...params.additionalAllowedModelProviders].map((provider) => normalizeProviderId(provider)).filter(Boolean)).has(normalizeProviderId(resolved.ref.provider))) {
|
|
282
280
|
return invalid(`Model "${resolved.key}" is not available for signed-in providers.`);
|
|
283
281
|
}
|
|
284
282
|
const isDefault = resolved.ref.provider === resolvedDefault.provider && resolved.ref.model === resolvedDefault.model;
|
package/dist/index.js
CHANGED
|
@@ -22,8 +22,6 @@ import { createDefaultDeps } from "./cli/deps.js";
|
|
|
22
22
|
import { getReplyFromConfig } from "./auto-reply/reply/get-reply.js";
|
|
23
23
|
import "./auto-reply/reply.js";
|
|
24
24
|
import { waitForever } from "./cli/wait.js";
|
|
25
|
-
import { monitorWebChannel } from "./web/auto-reply/monitor.js";
|
|
26
|
-
import "./channel-web.js";
|
|
27
25
|
import { isMainModule } from "./infra/is-main.js";
|
|
28
26
|
import { ensureFasedAgentCliOnPath } from "./infra/path-env.js";
|
|
29
27
|
import { buildProgram } from "./cli/program/build-program.js";
|
|
@@ -38,6 +36,10 @@ ensureFasedAgentCliOnPath();
|
|
|
38
36
|
enableConsoleCapture();
|
|
39
37
|
assertSupportedRuntime();
|
|
40
38
|
const program = buildProgram();
|
|
39
|
+
const monitorWebChannel = async (...args) => {
|
|
40
|
+
const channelWeb = await import("./channel-web.js");
|
|
41
|
+
return await channelWeb.monitorWebChannel(...args);
|
|
42
|
+
};
|
|
41
43
|
const isMain = isMainModule({ currentFile: fileURLToPath(import.meta.url) });
|
|
42
44
|
if (isMain) {
|
|
43
45
|
installUnhandledRejectionHandler();
|
package/dist/infra/fasedhub.js
CHANGED
|
@@ -7,6 +7,7 @@ import { createHash } from "node:crypto";
|
|
|
7
7
|
//#region src/infra/fasedhub.ts
|
|
8
8
|
const DEFAULT_CLAWHUB_REGISTRY = "https://clawhub.com";
|
|
9
9
|
const DEFAULT_FETCH_TIMEOUT_MS = 3e4;
|
|
10
|
+
const MAX_SKILL_ARCHIVE_BYTES = 25 * 1024 * 1024;
|
|
10
11
|
var FasedHubRequestError = class extends Error {
|
|
11
12
|
constructor(params) {
|
|
12
13
|
super(`ClawHub ${params.path} failed (${params.status}): ${params.body}`);
|
|
@@ -123,6 +124,61 @@ function formatSha256Integrity(bytes) {
|
|
|
123
124
|
const digest = createHash("sha256").update(bytes).digest("base64");
|
|
124
125
|
return `sha256-${digest}`;
|
|
125
126
|
}
|
|
127
|
+
function normalizeExpectedSha256(value) {
|
|
128
|
+
const normalized = value?.trim().toLowerCase();
|
|
129
|
+
return normalized && /^[a-f0-9]{64}$/u.test(normalized) ? normalized : undefined;
|
|
130
|
+
}
|
|
131
|
+
function sha256HexFromIntegrity(value) {
|
|
132
|
+
const normalized = value?.trim();
|
|
133
|
+
if (!normalized?.startsWith("sha256-")) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const digest = Buffer.from(normalized.slice("sha256-".length), "base64");
|
|
138
|
+
return digest.length === 32 ? digest.toString("hex") : undefined;
|
|
139
|
+
} catch {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function readBoundedResponseBytes(response, maxBytes) {
|
|
144
|
+
const declaredLength = Number(response.headers.get("content-length"));
|
|
145
|
+
if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {
|
|
146
|
+
throw new Error(`ClawHub skill archive exceeds the ${maxBytes}-byte download limit`);
|
|
147
|
+
}
|
|
148
|
+
if (!response.body) {
|
|
149
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
150
|
+
if (bytes.byteLength > maxBytes) {
|
|
151
|
+
throw new Error(`ClawHub skill archive exceeds the ${maxBytes}-byte download limit`);
|
|
152
|
+
}
|
|
153
|
+
return bytes;
|
|
154
|
+
}
|
|
155
|
+
const chunks = [];
|
|
156
|
+
const reader = response.body.getReader();
|
|
157
|
+
let total = 0;
|
|
158
|
+
try {
|
|
159
|
+
while (true) {
|
|
160
|
+
const { done, value } = await reader.read();
|
|
161
|
+
if (done) {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
total += value.byteLength;
|
|
165
|
+
if (total > maxBytes) {
|
|
166
|
+
await reader.cancel();
|
|
167
|
+
throw new Error(`ClawHub skill archive exceeds the ${maxBytes}-byte download limit`);
|
|
168
|
+
}
|
|
169
|
+
chunks.push(value);
|
|
170
|
+
}
|
|
171
|
+
} finally {
|
|
172
|
+
reader.releaseLock();
|
|
173
|
+
}
|
|
174
|
+
const bytes = new Uint8Array(total);
|
|
175
|
+
let offset = 0;
|
|
176
|
+
for (const chunk of chunks) {
|
|
177
|
+
bytes.set(chunk, offset);
|
|
178
|
+
offset += chunk.byteLength;
|
|
179
|
+
}
|
|
180
|
+
return bytes;
|
|
181
|
+
}
|
|
126
182
|
function sanitizeTempFileName(fileName) {
|
|
127
183
|
const base = path.basename(fileName).replace(/[^a-zA-Z0-9._-]+/g, "-");
|
|
128
184
|
const normalized = base.replace(/^-+|-+$/g, "");
|
|
@@ -193,7 +249,12 @@ async function downloadFasedHubSkillArchive(params) {
|
|
|
193
249
|
body: await readErrorBody(response)
|
|
194
250
|
});
|
|
195
251
|
}
|
|
196
|
-
const bytes =
|
|
252
|
+
const bytes = await readBoundedResponseBytes(response, MAX_SKILL_ARCHIVE_BYTES);
|
|
253
|
+
const sha256 = createHash("sha256").update(bytes).digest("hex");
|
|
254
|
+
const expectedSha256 = normalizeExpectedSha256(params.expectedSha256) ?? sha256HexFromIntegrity(params.expectedIntegrity);
|
|
255
|
+
if (expectedSha256 && expectedSha256 !== sha256) {
|
|
256
|
+
throw new Error(`ClawHub skill archive digest mismatch: expected ${expectedSha256}, received ${sha256}`);
|
|
257
|
+
}
|
|
197
258
|
const target = await createTempDownloadTarget({
|
|
198
259
|
prefix: "clawhub-skill",
|
|
199
260
|
fileName: `${params.slug}.zip`
|
|
@@ -202,6 +263,8 @@ async function downloadFasedHubSkillArchive(params) {
|
|
|
202
263
|
return {
|
|
203
264
|
archivePath: target.path,
|
|
204
265
|
integrity: formatSha256Integrity(bytes),
|
|
266
|
+
sha256,
|
|
267
|
+
integrityVerified: Boolean(expectedSha256),
|
|
205
268
|
cleanup: target.cleanup
|
|
206
269
|
};
|
|
207
270
|
}
|