@fased/fased 0.1.62 → 0.1.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +38 -30
- package/config/dependency-ownership.json +1 -1
- package/config/signer-policies/README.md +49 -0
- package/config/signer-policies/agent.json.template +32 -0
- package/config/signer-policies/mining.json.template +69 -0
- package/config/signer-policies/network.json.template +5 -0
- package/config/signer-policies/vault.json.template +70 -0
- package/config/signer-protocol-v2.json +76 -0
- package/config/typescript-noemit-baseline.json +680 -0
- package/dist/agents/auth-profiles/store.js +267 -31
- package/dist/agents/bash-tools.exec.js +10 -4
- package/dist/agents/current-model-catalog.js +3 -3
- package/dist/agents/memory-search.js +7 -1
- package/dist/agents/model-catalog-access.js +1 -2
- package/dist/agents/model-catalog-snapshot.js +1 -1
- package/dist/agents/model-catalog-source.js +1 -1
- package/dist/agents/model-metadata.js +1 -1
- package/dist/agents/model-selection.js +2 -28
- package/dist/agents/models-config.providers.js +6 -6
- package/dist/agents/pi-embedded-runner/compact.js +15 -7
- package/dist/agents/pi-embedded-runner/model.js +1 -1
- package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
- package/dist/agents/pi-embedded-runner/run.js +2 -0
- package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
- package/dist/agents/pi-tool-definition-adapter.js +16 -1
- package/dist/agents/pi-tools.js +2 -1
- package/dist/agents/sandbox/config.js +1 -1
- package/dist/agents/sandbox/context.js +27 -2
- package/dist/agents/skills/env-overrides.js +38 -28
- package/dist/agents/skills/trust.js +93 -0
- package/dist/agents/skills/workspace.js +128 -0
- package/dist/agents/skills-clawhub.js +36 -11
- package/dist/agents/skills-marketplace-scan.js +49 -0
- package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
- package/dist/agents/tools/mining-tool.js +1 -1
- package/dist/agents/tools/session-status-tool.js +1 -1
- package/dist/agents/tools/wallet-action-tool.js +172 -36
- package/dist/agents/tools/wallet-skill-policy.js +65 -23
- package/dist/agents/tools/wallet-tool.js +7 -11
- package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
- package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
- package/dist/auto-reply/reply/directive-handling.model.js +2 -1
- package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
- package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
- package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
- package/dist/auto-reply/reply/model-selection.js +7 -4
- package/dist/auto-reply/reply/session-reset-model.js +4 -4
- package/dist/brand.js +1 -1
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/channel-web.js +2 -2
- package/dist/cli/gateway-cli/run.js +8 -0
- package/dist/cli/program/command-registry.js +1 -1
- package/dist/cli/program/register.onboard.js +2 -3
- package/dist/cli/program/register.wallet.js +16 -123
- package/dist/cli/providers-cli.js +1 -1
- package/dist/cli/sat-cli.js +129 -2
- package/dist/cli/update-cli/update-command.js +260 -11
- package/dist/commands/auth-choice.apply.api-providers.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-legacy-config.js +2 -13
- package/dist/commands/model-picker.js +6 -6
- package/dist/commands/models/auth.js +1 -1
- package/dist/commands/onboard-auth.config-gateways.js +1 -1
- package/dist/commands/onboard-auth.credentials.js +32 -8
- package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
- package/dist/commands/onboard-non-interactive/local.js +5 -1
- package/dist/commands/wallet.js +568 -1911
- package/dist/config/config.js +2 -2
- package/dist/config/io.js +64 -2
- package/dist/config/schema.help.js +8 -7
- package/dist/config/schema.labels.js +5 -4
- package/dist/config/zod-schema.agent-runtime.js +1 -0
- package/dist/config/zod-schema.js +5 -0
- package/dist/control-ui/assets/{app-DLil9VO1.js → app-bR-fO5ty.js} +1511 -1555
- package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
- package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
- package/dist/control-ui/assets/{index-DdE_NIXo.js → index-ckCxHwjy.js} +3 -3
- package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
- package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
- package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
- package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
- package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
- package/dist/control-ui/index.html +1 -1
- package/dist/control-ui/version.json +1 -1
- package/dist/daemon/systemd-system.js +56 -50
- package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
- package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
- package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
- package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
- package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
- package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
- package/dist/federation/auto-connect.js +98 -8
- package/dist/federation/marketplace-capability-adapter.js +33 -7
- package/dist/federation/marketplace-delivery-outbox.js +196 -0
- package/dist/federation/marketplace-delivery.js +351 -215
- package/dist/federation/marketplace-direct-payment.js +272 -141
- package/dist/federation/marketplace-escrow.js +607 -249
- package/dist/federation/marketplace-settlement-ledger.js +352 -0
- package/dist/federation/offers.js +9 -7
- package/dist/federation/peer-auth-v2.js +529 -0
- package/dist/gateway/a2a-http.js +425 -96
- package/dist/gateway/a2a-settlement.js +259 -153
- package/dist/gateway/a2a-task-store.js +524 -0
- package/dist/gateway/auth.js +38 -2
- package/dist/gateway/config-reload.js +46 -33
- package/dist/gateway/durable-capacity.js +31 -0
- package/dist/gateway/federation-http.js +540 -135
- package/dist/gateway/federation-marketplace-run-store.js +397 -0
- package/dist/gateway/federation-marketplace.js +535 -230
- package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
- package/dist/gateway/security-path.js +1 -1
- package/dist/gateway/server-http.js +1084 -1205
- package/dist/gateway/server-methods/models.js +1 -1
- package/dist/gateway/server-methods/secrets.js +40 -0
- package/dist/gateway/server-methods.js +1 -2
- package/dist/gateway/server-reload-handlers.js +196 -66
- package/dist/gateway/server-runtime-config.js +1 -1
- package/dist/gateway/server-secrets-runtime.js +288 -0
- package/dist/gateway/server.impl.js +73 -42
- package/dist/gateway/sessions-patch.js +3 -5
- package/dist/index.js +4 -2
- package/dist/infra/fasedhub.js +64 -1
- package/dist/infra/local-source-paired-update.js +538 -0
- package/dist/infra/restart.js +41 -10
- package/dist/infra/update-runner.js +96 -0
- package/dist/light-update-status.js +11 -11
- package/dist/memory/backend-config.js +2 -1
- package/dist/memory/session-files.js +16 -2
- package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
- package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
- package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-BYxAt775.js} +27 -27
- package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
- package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
- package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
- package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
- package/dist/plugin-sdk/channel-plugin-common.js +4 -4
- package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
- package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DIRHG2gJ.js} +1 -1
- package/dist/plugin-sdk/command-status.d.ts +2 -2
- package/dist/plugin-sdk/command-status.js +27 -27
- package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
- package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
- package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
- package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-BOT7kHb6.js} +6779 -3696
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/discord.d.ts +6 -6
- package/dist/plugin-sdk/discord.js +19 -19
- package/dist/plugin-sdk/file-lock.js +35 -4
- package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
- package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
- package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
- package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
- package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
- package/dist/plugin-sdk/index.d.ts +21 -39
- package/dist/plugin-sdk/index.js +29 -29
- package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
- package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
- package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
- package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
- package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
- package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
- package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-BCFDaqJ-.js} +31 -31
- package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-BgbjRiPM.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DFf87SMM.js} +27 -27
- package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
- package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
- package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
- package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
- package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
- package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
- package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
- package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
- package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
- package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
- package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
- package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
- package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
- package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
- package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
- package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
- package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
- package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
- package/dist/plugin-sdk/sat-runtime.js +29 -29
- package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
- package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
- package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
- package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
- package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
- package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
- package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
- package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BUTt8cxK.js} +39 -39
- package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
- package/dist/plugin-sdk/slack.d.ts +6 -6
- package/dist/plugin-sdk/slack.js +9 -9
- package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-D0wHVqjt.js} +3 -3
- package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
- package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
- package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-CC_qN4v0.js} +30 -30
- package/dist/plugin-sdk/telegram.d.ts +6 -6
- package/dist/plugin-sdk/telegram.js +8 -8
- package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
- package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
- package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
- package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-C3avNytw.d.ts} +3 -4
- package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
- package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-DWfbSAaM.d.ts} +2 -2
- package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
- package/dist/plugin-sdk/{web-CInY-lCv.js → web-BXsJ1vqe.js} +32 -32
- package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
- package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
- package/dist/plugin-sdk/whatsapp.d.ts +13 -13
- package/dist/plugin-sdk/whatsapp.js +12 -12
- package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
- package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
- package/dist/providers/refresh.js +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/secrets/apply.js +1 -1
- package/dist/secrets/runtime.js +1 -1
- package/dist/wallet/external-submission-ledger.js +376 -0
- package/dist/wallet/legacy-embedded-keystore.js +40 -0
- package/dist/wallet/local-socket-signer-archive.js +30 -0
- package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
- package/dist/wallet/local-socket-signer-policy.js +166 -0
- package/dist/wallet/local-socket-signer-protocol.js +561 -118
- package/dist/wallet/native-signer-wallet-id.js +25 -0
- package/dist/wallet/providers/alchemy-adapter.js +3 -0
- package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
- package/dist/wallet/providers/turnkey-adapter.js +292 -34
- package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
- package/dist/wallet/signer-network-admin.js +184 -0
- package/dist/wallet/signer-protocol-v2.generated.js +90 -0
- package/dist/wallet/solana-bond-signing.js +157 -69
- package/dist/wallet/solana-reviewed-transaction.js +375 -0
- package/dist/wallet/solana-swap.js +520 -64
- package/dist/wallet/solana-transaction-inspection.js +106 -4
- package/dist/wallet/solana-trigger.js +658 -320
- package/dist/wallet/turnkey-reviewed-state.js +370 -0
- package/dist/wallet/wallet-approval-auth.js +17 -28
- package/dist/wallet/wallet-atomic-state.js +53 -0
- package/dist/wallet/wallet-canary.js +0 -1
- package/dist/wallet/wallet-inbound-events.js +16 -11
- package/dist/wallet/wallet-policy-simulation.js +1 -1
- package/dist/wallet/wallet-policy.js +90 -36
- package/dist/wallet/wallet-provider-capabilities.js +28 -4
- package/dist/wallet/wallet-provider-registry.js +57 -44
- package/dist/wallet/wallet-provider-resolver.js +62 -63
- package/dist/wallet/wallet-runtime-config.js +28 -41
- package/dist/wallet/wallet-secrets-store.js +22 -0
- package/dist/wallet/wallet-send-approvals.js +1891 -589
- package/dist/wallet/wallet-send-execution-ledger.js +292 -0
- package/dist/wallet/wallet-settlement-links.js +14 -13
- package/dist/wallet/wallet-standard-review.js +353 -0
- package/dist/wallet/wallet-status.js +0 -9
- package/dist/wallet/wallet-task-ledger.js +16 -2
- package/dist/web/auto-reply/heartbeat-runner.js +1 -1
- package/dist/web/auto-reply/monitor.js +2 -2
- package/dist/wizard/host-security-capability.js +14 -23
- package/dist/wizard/onboarding.finalize.js +63 -184
- package/dist/wizard/onboarding.host-security.js +117 -1367
- package/dist/wizard/onboarding.js +172 -217
- package/dist/wizard/onboarding.wallet.js +232 -785
- package/extensions/acpx/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/fased-federation/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +12 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +2 -2
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +12 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +12 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/sat-mining/index.ts +498 -153
- package/extensions/sat-mining/package.json +1 -1
- package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
- package/extensions/sat-mining/src/audit-store.ts +50 -5
- package/extensions/sat-mining/src/claim-service.ts +85 -14
- package/extensions/sat-mining/src/config.ts +9 -0
- package/extensions/sat-mining/src/cycle-progress.ts +16 -8
- package/extensions/sat-mining/src/epoch-service.ts +9 -5
- package/extensions/sat-mining/src/gateway-runner.ts +21 -1
- package/extensions/sat-mining/src/protocol-contract.ts +45 -1
- package/extensions/sat-mining/src/recovery-service.ts +312 -0
- package/extensions/sat-mining/src/round-watcher.ts +391 -81
- package/extensions/sat-mining/src/rpc-read.ts +330 -89
- package/extensions/sat-mining/src/runtime.ts +14 -0
- package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
- package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
- package/extensions/sat-mining/src/solana-submit.ts +1199 -428
- package/extensions/sat-mining/src/submission-ledger.ts +433 -0
- package/extensions/signal/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +12 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +12 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +12 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +12 -0
- package/extensions/zalouser/package.json +1 -1
- package/install.sh +4955 -0
- package/package.json +23 -5
- package/scripts/fased-host-updater.mjs +1421 -0
- package/scripts/fased-host-updaterctl.mjs +186 -0
- package/scripts/fased-managed-service.sh +36 -0
- package/scripts/fased-managed-updater.mjs +3065 -156
- package/scripts/fased-signer-enroll-hosting.sh +275 -0
- package/scripts/fased-signer-network-hosting.sh +143 -0
- package/scripts/fased-signer-owner-policy.mjs +1430 -0
- package/scripts/fased-signer-policy-hosting.sh +50 -0
- package/scripts/fased-signer-policy-local.sh +26 -0
- package/scripts/hosted-release-manifest.mjs +185 -0
- package/scripts/install-fased-signerd.sh +183 -108
- package/scripts/install-managed-runtime.mjs +212 -10
- package/scripts/managed-runtime-layout.mjs +75 -3
- package/scripts/migrate-hosted-signer-v2.mjs +58 -0
- package/scripts/start-managed.sh +169 -360
- package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
- package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
- package/dist/wallet/local-socket-signer-broker.js +0 -224
- package/dist/wallet/local-socket-signer-custody.js +0 -42
- package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
- package/dist/wallet/providers/privy-adapter.js +0 -80
- package/dist/wallet/wallet-custody.js +0 -1836
|
@@ -19,6 +19,7 @@ import { enqueueCommandInLane } from "../../process/command-queue.js";
|
|
|
19
19
|
import { resolveSignalReactionLevel } from "../../signal/reaction-level.js";
|
|
20
20
|
import { resolveTelegramInlineButtonsScope } from "../../telegram/inline-buttons.js";
|
|
21
21
|
import { resolveTelegramReactionLevel } from "../../telegram/reaction-level.js";
|
|
22
|
+
import { marketplaceSkillIdsFromEntries, marketplaceSkillIdsFromSnapshot } from "../skills/trust.js";
|
|
22
23
|
import { formatUserTime, resolveUserTimeFormat, resolveUserTimezone } from "../date-time.js";
|
|
23
24
|
import { buildModelAliasLines } from "../model-alias-lines.js";
|
|
24
25
|
import { resolveModelForExecution } from "./model.js";
|
|
@@ -29,13 +30,13 @@ import { listChannelSupportedActions, resolveChannelMessageToolHints } from "../
|
|
|
29
30
|
import { resolveFasedAgentDocsPath } from "../docs-path.js";
|
|
30
31
|
import { createPreparedEmbeddedPiSettingsManager } from "../pi-project-settings.js";
|
|
31
32
|
import { detectRuntimeShell } from "../shell-utils.js";
|
|
33
|
+
import { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot } from "../skills/env-overrides.js";
|
|
32
34
|
import { createFasedAgentCodingTools } from "../pi-tools.js";
|
|
33
35
|
import { registerProviderStreamForModel } from "../provider-stream.js";
|
|
34
36
|
import { repairSessionFileIfNeeded } from "../session-file-repair.js";
|
|
35
37
|
import { log } from "./logger.js";
|
|
36
38
|
import { sanitizeToolUseResultPairing } from "../session-transcript-repair.js";
|
|
37
39
|
import { guardSessionManager } from "../session-tool-result-guard-wrapper.js";
|
|
38
|
-
import { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot } from "../skills/env-overrides.js";
|
|
39
40
|
import { loadWorkspaceSkillEntries, resolveSkillsPromptForRun } from "../skills/workspace.js";
|
|
40
41
|
import "../skills.js";
|
|
41
42
|
import { resolveTranscriptPolicy } from "../transcript-policy.js";
|
|
@@ -205,10 +206,14 @@ async function compactEmbeddedPiSessionDirect(params) {
|
|
|
205
206
|
}
|
|
206
207
|
await fs.mkdir(resolvedWorkspace, { recursive: true });
|
|
207
208
|
const sandboxSessionKey = params.sessionKey?.trim() || params.sessionId;
|
|
209
|
+
const sourceSkillEntries = params.skillsSnapshot ? [] : loadWorkspaceSkillEntries(resolvedWorkspace, { config: params.config });
|
|
210
|
+
const marketplaceSkillIds = params.skillsSnapshot ? marketplaceSkillIdsFromSnapshot(params.skillsSnapshot) : marketplaceSkillIdsFromEntries(sourceSkillEntries);
|
|
211
|
+
const hasUntrustedSkillContent = marketplaceSkillIds.length > 0;
|
|
208
212
|
const sandbox = await resolveSandboxContext({
|
|
209
213
|
config: params.config,
|
|
210
214
|
sessionKey: sandboxSessionKey,
|
|
211
|
-
workspaceDir: resolvedWorkspace
|
|
215
|
+
workspaceDir: resolvedWorkspace,
|
|
216
|
+
forceUntrustedIsolation: hasUntrustedSkillContent
|
|
212
217
|
});
|
|
213
218
|
const effectiveWorkspace = sandbox?.enabled ? sandbox.workspaceAccess === "rw" ? resolvedWorkspace : sandbox.workspaceDir : resolvedWorkspace;
|
|
214
219
|
await fs.mkdir(effectiveWorkspace, { recursive: true });
|
|
@@ -224,10 +229,12 @@ async function compactEmbeddedPiSessionDirect(params) {
|
|
|
224
229
|
const skillEntries = shouldLoadSkillEntries ? loadWorkspaceSkillEntries(effectiveWorkspace) : [];
|
|
225
230
|
restoreSkillEnv = params.skillsSnapshot ? applySkillEnvOverridesFromSnapshot({
|
|
226
231
|
snapshot: params.skillsSnapshot,
|
|
227
|
-
config: params.config
|
|
232
|
+
config: params.config,
|
|
233
|
+
excludeMarketplace: true
|
|
228
234
|
}) : applySkillEnvOverrides({
|
|
229
235
|
skills: skillEntries ?? [],
|
|
230
|
-
config: params.config
|
|
236
|
+
config: params.config,
|
|
237
|
+
excludeMarketplace: true
|
|
231
238
|
});
|
|
232
239
|
const skillsPrompt = resolveSkillsPromptForRun({
|
|
233
240
|
skillsSnapshot: params.skillsSnapshot,
|
|
@@ -265,7 +272,8 @@ async function compactEmbeddedPiSessionDirect(params) {
|
|
|
265
272
|
modelProvider: model.provider,
|
|
266
273
|
modelId,
|
|
267
274
|
modelContextWindowTokens: model.contextWindow,
|
|
268
|
-
modelAuthMode: resolveModelAuthMode(model.provider, params.config)
|
|
275
|
+
modelAuthMode: resolveModelAuthMode(model.provider, params.config),
|
|
276
|
+
untrustedSkillContent: hasUntrustedSkillContent
|
|
269
277
|
});
|
|
270
278
|
const tools = sanitizeToolsForGoogle({
|
|
271
279
|
tools: toolsRaw,
|
|
@@ -433,7 +441,7 @@ async function compactEmbeddedPiSessionDirect(params) {
|
|
|
433
441
|
});
|
|
434
442
|
await resourceLoader.reload();
|
|
435
443
|
}
|
|
436
|
-
const {
|
|
444
|
+
const { activeToolNames, customTools } = splitSdkTools({
|
|
437
445
|
tools,
|
|
438
446
|
sandboxEnabled: !!sandbox?.enabled
|
|
439
447
|
});
|
|
@@ -452,7 +460,7 @@ async function compactEmbeddedPiSessionDirect(params) {
|
|
|
452
460
|
modelRegistry,
|
|
453
461
|
model,
|
|
454
462
|
thinkingLevel: mapThinkingLevel(params.thinkLevel),
|
|
455
|
-
tools:
|
|
463
|
+
tools: activeToolNames,
|
|
456
464
|
customTools,
|
|
457
465
|
sessionManager,
|
|
458
466
|
settingsManager,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { isOpenAISignInRuntimeModelSupported } from "../../providers/registry.js";
|
|
2
1
|
import { DEFAULT_CONTEXT_TOKENS } from "../defaults.js";
|
|
3
2
|
import { isPrivateNetworkBaseUrl } from "../../utils/private-network-url.js";
|
|
4
3
|
import { resolveFasedAgentAgentDir } from "../agent-paths.js";
|
|
5
4
|
import { ensureAuthProfileStore } from "../auth-profiles/store.js";
|
|
6
5
|
import "../auth-profiles.js";
|
|
6
|
+
import { isOpenAISignInRuntimeModelSupported } from "../../providers/registry.js";
|
|
7
7
|
import { normalizeProviderId } from "../model-selection.js";
|
|
8
8
|
import { discoverAuthStorage, discoverModels } from "../pi-model-discovery.js";
|
|
9
9
|
import { resolveAuthenticatedModelCatalog } from "../authenticated-model-catalog.js";
|
|
@@ -20,6 +20,7 @@ import { resolveTelegramInlineButtonsScope } from "../../../telegram/inline-butt
|
|
|
20
20
|
import { resolveTelegramReactionLevel } from "../../../telegram/reaction-level.js";
|
|
21
21
|
import { MAX_IMAGE_BYTES } from "../../../media/constants.js";
|
|
22
22
|
import { resolveImageSanitizationLimits } from "../../image-sanitization.js";
|
|
23
|
+
import { marketplaceSkillIdsFromEntries, marketplaceSkillIdsFromSnapshot } from "../../skills/trust.js";
|
|
23
24
|
import { buildModelAliasLines } from "../../model-alias-lines.js";
|
|
24
25
|
import "../model.js";
|
|
25
26
|
import { buildTtsSystemPromptHint } from "../../../tts/tts.js";
|
|
@@ -29,6 +30,7 @@ import { listChannelSupportedActions, resolveChannelMessageToolHints } from "../
|
|
|
29
30
|
import { resolveFasedAgentDocsPath } from "../../docs-path.js";
|
|
30
31
|
import { createPreparedEmbeddedPiSettingsManager } from "../../pi-project-settings.js";
|
|
31
32
|
import { detectRuntimeShell } from "../../shell-utils.js";
|
|
33
|
+
import { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot } from "../../skills/env-overrides.js";
|
|
32
34
|
import { isTimeoutError } from "../../failover-error.js";
|
|
33
35
|
import { resolveSandboxRuntimeStatus } from "../../sandbox/runtime-status.js";
|
|
34
36
|
import { resolveEffectiveToolFsWorkspaceOnly } from "../../tool-fs-policy.js";
|
|
@@ -39,7 +41,6 @@ import { log } from "../logger.js";
|
|
|
39
41
|
import { sanitizeToolCallIdsForCloudCodeAssist } from "../../tool-call-id.js";
|
|
40
42
|
import { sanitizeToolUseResultPairing } from "../../session-transcript-repair.js";
|
|
41
43
|
import { guardSessionManager } from "../../session-tool-result-guard-wrapper.js";
|
|
42
|
-
import { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot } from "../../skills/env-overrides.js";
|
|
43
44
|
import { loadWorkspaceSkillEntries, resolveSkillsPromptForRun } from "../../skills/workspace.js";
|
|
44
45
|
import "../../skills.js";
|
|
45
46
|
import { resolveTranscriptPolicy } from "../../transcript-policy.js";
|
|
@@ -245,10 +246,17 @@ async function runEmbeddedAttempt(params) {
|
|
|
245
246
|
log.debug(`embedded run start: runId=${params.runId} sessionId=${params.sessionId} provider=${params.provider} model=${params.modelId} thinking=${params.thinkLevel} messageChannel=${params.messageChannel ?? params.messageProvider ?? "unknown"}`);
|
|
246
247
|
await fs.mkdir(resolvedWorkspace, { recursive: true });
|
|
247
248
|
const sandboxSessionKey = params.sessionKey?.trim() || params.sessionId;
|
|
249
|
+
const sourceSkillEntries = params.skillsSnapshot ? [] : loadWorkspaceSkillEntries(resolvedWorkspace, {
|
|
250
|
+
config: params.config,
|
|
251
|
+
agentId: params.agentId
|
|
252
|
+
});
|
|
253
|
+
const marketplaceSkillIds = params.skillsSnapshot ? marketplaceSkillIdsFromSnapshot(params.skillsSnapshot) : marketplaceSkillIdsFromEntries(sourceSkillEntries);
|
|
254
|
+
const hasUntrustedSkillContent = marketplaceSkillIds.length > 0;
|
|
248
255
|
const sandbox = await resolveSandboxContext({
|
|
249
256
|
config: params.config,
|
|
250
257
|
sessionKey: sandboxSessionKey,
|
|
251
|
-
workspaceDir: resolvedWorkspace
|
|
258
|
+
workspaceDir: resolvedWorkspace,
|
|
259
|
+
forceUntrustedIsolation: hasUntrustedSkillContent
|
|
252
260
|
});
|
|
253
261
|
const effectiveWorkspace = sandbox?.enabled ? sandbox.workspaceAccess === "rw" ? resolvedWorkspace : sandbox.workspaceDir : resolvedWorkspace;
|
|
254
262
|
await fs.mkdir(effectiveWorkspace, { recursive: true });
|
|
@@ -260,10 +268,12 @@ async function runEmbeddedAttempt(params) {
|
|
|
260
268
|
const skillEntries = shouldLoadSkillEntries ? loadWorkspaceSkillEntries(effectiveWorkspace) : [];
|
|
261
269
|
restoreSkillEnv = params.skillsSnapshot ? applySkillEnvOverridesFromSnapshot({
|
|
262
270
|
snapshot: params.skillsSnapshot,
|
|
263
|
-
config: params.config
|
|
271
|
+
config: params.config,
|
|
272
|
+
excludeMarketplace: true
|
|
264
273
|
}) : applySkillEnvOverrides({
|
|
265
274
|
skills: skillEntries ?? [],
|
|
266
|
-
config: params.config
|
|
275
|
+
config: params.config,
|
|
276
|
+
excludeMarketplace: true
|
|
267
277
|
});
|
|
268
278
|
const skillsPrompt = resolveSkillsPromptForRun({
|
|
269
279
|
skillsSnapshot: params.skillsSnapshot,
|
|
@@ -333,9 +343,10 @@ async function runEmbeddedAttempt(params) {
|
|
|
333
343
|
modelHasVision,
|
|
334
344
|
requireExplicitMessageTarget: params.requireExplicitMessageTarget ?? isSubagentSessionKey(params.sessionKey),
|
|
335
345
|
disableMessageTool: params.disableMessageTool,
|
|
336
|
-
disabledToolNames: params.disabledToolNames
|
|
346
|
+
disabledToolNames: params.disabledToolNames,
|
|
347
|
+
untrustedSkillContent: hasUntrustedSkillContent
|
|
337
348
|
});
|
|
338
|
-
if (!toolsDisabled) {
|
|
349
|
+
if (!toolsDisabled && !hasUntrustedSkillContent) {
|
|
339
350
|
bundleMcpRuntime = await createBundleMcpToolRuntime({
|
|
340
351
|
workspaceDir: effectiveWorkspace,
|
|
341
352
|
cfg: params.config,
|
|
@@ -561,10 +572,6 @@ async function runEmbeddedAttempt(params) {
|
|
|
561
572
|
await resourceLoader.reload();
|
|
562
573
|
}
|
|
563
574
|
const hookRunner = getGlobalHookRunner();
|
|
564
|
-
const { builtInTools, customTools } = splitSdkTools({
|
|
565
|
-
tools,
|
|
566
|
-
sandboxEnabled: !!sandbox?.enabled
|
|
567
|
-
});
|
|
568
575
|
let clientToolCallDetected = null;
|
|
569
576
|
const clientToolLoopDetection = resolveToolLoopDetectionConfig({
|
|
570
577
|
cfg: params.config,
|
|
@@ -580,7 +587,11 @@ async function runEmbeddedAttempt(params) {
|
|
|
580
587
|
sessionKey: params.sessionKey,
|
|
581
588
|
loopDetection: clientToolLoopDetection
|
|
582
589
|
}) : [];
|
|
583
|
-
const
|
|
590
|
+
const { activeToolNames, customTools } = splitSdkTools({
|
|
591
|
+
tools,
|
|
592
|
+
clientTools: clientToolDefs,
|
|
593
|
+
sandboxEnabled: !!sandbox?.enabled
|
|
594
|
+
});
|
|
584
595
|
if (params.model.api === "ollama") {
|
|
585
596
|
registerProviderStreamForModel({
|
|
586
597
|
model: params.model,
|
|
@@ -596,8 +607,8 @@ async function runEmbeddedAttempt(params) {
|
|
|
596
607
|
modelRegistry: params.modelRegistry,
|
|
597
608
|
model: params.model,
|
|
598
609
|
thinkingLevel: mapThinkingLevel(params.thinkLevel),
|
|
599
|
-
tools:
|
|
600
|
-
customTools
|
|
610
|
+
tools: activeToolNames,
|
|
611
|
+
customTools,
|
|
601
612
|
sessionManager,
|
|
602
613
|
settingsManager,
|
|
603
614
|
resourceLoader
|
|
@@ -460,7 +460,9 @@ async function runEmbeddedPiAgent(params) {
|
|
|
460
460
|
skillsSnapshot: params.skillsSnapshot,
|
|
461
461
|
prompt,
|
|
462
462
|
images: params.images,
|
|
463
|
+
clientTools: params.clientTools,
|
|
463
464
|
disableTools: params.disableTools,
|
|
465
|
+
disabledToolNames: params.disabledToolNames,
|
|
464
466
|
provider,
|
|
465
467
|
modelId,
|
|
466
468
|
model,
|
|
@@ -1,11 +1,49 @@
|
|
|
1
|
+
import { isKnownCoreToolId } from "../tool-catalog.js";
|
|
2
|
+
import { normalizeToolName } from "../tool-policy-shared.js";
|
|
3
|
+
import "../tool-policy.js";
|
|
1
4
|
import { toToolDefinitions } from "../pi-tool-definition-adapter.js";
|
|
2
5
|
|
|
3
6
|
//#region src/agents/pi-embedded-runner/tool-split.ts
|
|
7
|
+
const SDK_BUILT_IN_TOOL_NAMES = new Set([
|
|
8
|
+
"read",
|
|
9
|
+
"bash",
|
|
10
|
+
"edit",
|
|
11
|
+
"write",
|
|
12
|
+
"grep",
|
|
13
|
+
"find",
|
|
14
|
+
"ls"
|
|
15
|
+
].map(normalizeToolName));
|
|
16
|
+
function validateClientToolDefinitions(params) {
|
|
17
|
+
const fasedToolNames = new Set(params.fasedTools.map((tool) => normalizeToolName(tool.name)));
|
|
18
|
+
const clientToolNames = new Set();
|
|
19
|
+
for (const tool of params.clientTools) {
|
|
20
|
+
const name = tool.name;
|
|
21
|
+
const trimmedName = name.trim();
|
|
22
|
+
if (!trimmedName || trimmedName !== name) {
|
|
23
|
+
throw new Error("Client tool names must be non-empty and must not contain outer whitespace");
|
|
24
|
+
}
|
|
25
|
+
const normalizedName = normalizeToolName(name);
|
|
26
|
+
if (SDK_BUILT_IN_TOOL_NAMES.has(normalizedName) || isKnownCoreToolId(normalizedName) || fasedToolNames.has(normalizedName)) {
|
|
27
|
+
throw new Error(`Client tool name "${name}" is reserved by Fased`);
|
|
28
|
+
}
|
|
29
|
+
if (clientToolNames.has(normalizedName)) {
|
|
30
|
+
throw new Error(`Duplicate client tool name: "${name}"`);
|
|
31
|
+
}
|
|
32
|
+
clientToolNames.add(normalizedName);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
4
35
|
function splitSdkTools(options) {
|
|
5
36
|
const { tools } = options;
|
|
37
|
+
const fasedTools = toToolDefinitions(tools);
|
|
38
|
+
const clientTools = options.clientTools ?? [];
|
|
39
|
+
validateClientToolDefinitions({
|
|
40
|
+
fasedTools,
|
|
41
|
+
clientTools
|
|
42
|
+
});
|
|
43
|
+
const customTools = [...fasedTools, ...clientTools];
|
|
6
44
|
return {
|
|
7
|
-
|
|
8
|
-
customTools
|
|
45
|
+
activeToolNames: customTools.map((tool) => tool.name),
|
|
46
|
+
customTools
|
|
9
47
|
};
|
|
10
48
|
}
|
|
11
49
|
|
|
@@ -41,6 +41,20 @@ function stringifyToolPayload(payload) {
|
|
|
41
41
|
} catch {}
|
|
42
42
|
return String(payload);
|
|
43
43
|
}
|
|
44
|
+
function normalizeClientToolParams(params) {
|
|
45
|
+
if (isPlainObject(params)) {
|
|
46
|
+
return params;
|
|
47
|
+
}
|
|
48
|
+
if (typeof params !== "string") {
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(params.trim());
|
|
53
|
+
return isPlainObject(parsed) ? parsed : {};
|
|
54
|
+
} catch {
|
|
55
|
+
return {};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
44
58
|
function normalizeToolExecutionResult(params) {
|
|
45
59
|
const { toolName, result } = params;
|
|
46
60
|
if (result && typeof result === "object") {
|
|
@@ -185,9 +199,10 @@ function toClientToolDefinitions(tools, onClientToolCall, hookContext) {
|
|
|
185
199
|
parameters: func.parameters,
|
|
186
200
|
execute: async (...args) => {
|
|
187
201
|
const { toolCallId, params } = splitToolExecuteArgs(args);
|
|
202
|
+
const normalizedParams = normalizeClientToolParams(params);
|
|
188
203
|
const outcome = await runBeforeToolCallHook({
|
|
189
204
|
toolName: func.name,
|
|
190
|
-
params,
|
|
205
|
+
params: normalizedParams,
|
|
191
206
|
toolCallId,
|
|
192
207
|
ctx: hookContext
|
|
193
208
|
});
|
package/dist/agents/pi-tools.js
CHANGED
|
@@ -332,7 +332,8 @@ function createFasedAgentCodingTools(options) {
|
|
|
332
332
|
senderIsOwner: options?.senderIsOwner
|
|
333
333
|
})
|
|
334
334
|
];
|
|
335
|
-
const
|
|
335
|
+
const provenanceSafeTools = options?.untrustedSkillContent ? tools.filter((tool) => tool.name === "read") : tools;
|
|
336
|
+
const toolsForMessageProvider = applyMessageProviderToolPolicy(provenanceSafeTools, options?.messageProvider);
|
|
336
337
|
const senderIsOwner = options?.senderIsOwner === true;
|
|
337
338
|
const toolsByAuthorization = applyOwnerOnlyToolPolicy(toolsForMessageProvider, senderIsOwner);
|
|
338
339
|
const subagentFiltered = applyToolPolicyPipeline({
|
|
@@ -34,7 +34,7 @@ function resolveSandboxScope(params) {
|
|
|
34
34
|
if (typeof params.perSession === "boolean") {
|
|
35
35
|
return params.perSession ? "session" : "shared";
|
|
36
36
|
}
|
|
37
|
-
return "
|
|
37
|
+
return "session";
|
|
38
38
|
}
|
|
39
39
|
function resolveSandboxDockerConfig(params) {
|
|
40
40
|
const agentDocker = params.scope === "shared" ? undefined : params.agentDocker;
|
|
@@ -80,10 +80,35 @@ function resolveSandboxSession(params) {
|
|
|
80
80
|
cfg: params.config,
|
|
81
81
|
sessionKey: rawSessionKey
|
|
82
82
|
});
|
|
83
|
-
if (!runtime.sandboxed) {
|
|
83
|
+
if (!runtime.sandboxed && !params.forceUntrustedIsolation) {
|
|
84
84
|
return null;
|
|
85
85
|
}
|
|
86
|
-
const
|
|
86
|
+
const resolvedConfig = resolveSandboxConfigForAgent(params.config, runtime.agentId);
|
|
87
|
+
const cfg = params.forceUntrustedIsolation ? {
|
|
88
|
+
...resolvedConfig,
|
|
89
|
+
mode: "all",
|
|
90
|
+
scope: "session",
|
|
91
|
+
workspaceAccess: "none",
|
|
92
|
+
docker: {
|
|
93
|
+
...resolvedConfig.docker,
|
|
94
|
+
readOnlyRoot: true,
|
|
95
|
+
network: "none",
|
|
96
|
+
capDrop: ["ALL"],
|
|
97
|
+
binds: undefined,
|
|
98
|
+
dangerouslyAllowReservedContainerTargets: false,
|
|
99
|
+
dangerouslyAllowExternalBindSources: false,
|
|
100
|
+
dangerouslyAllowContainerNamespaceJoin: false
|
|
101
|
+
},
|
|
102
|
+
browser: {
|
|
103
|
+
...resolvedConfig.browser,
|
|
104
|
+
enabled: false,
|
|
105
|
+
allowHostControl: false
|
|
106
|
+
},
|
|
107
|
+
tools: {
|
|
108
|
+
allow: ["read"],
|
|
109
|
+
deny: []
|
|
110
|
+
}
|
|
111
|
+
} : resolvedConfig;
|
|
87
112
|
return {
|
|
88
113
|
rawSessionKey,
|
|
89
114
|
runtime,
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { createSubsystemLogger } from "../../logging/subsystem.js";
|
|
2
2
|
import { isDangerousHostEnvVarName } from "../../infra/host-env-security.js";
|
|
3
|
+
import { getRuntimeConfigSnapshot } from "../../config/io.js";
|
|
4
|
+
import "../../config/config.js";
|
|
5
|
+
import { isMarketplaceSkillDir } from "./trust.js";
|
|
6
|
+
import { sanitizeEnvVars, validateEnvVarValue } from "../sandbox/sanitize-env-vars.js";
|
|
3
7
|
import { resolveSkillKey } from "./frontmatter.js";
|
|
4
8
|
import { resolveSkillConfig } from "./config.js";
|
|
5
|
-
import {
|
|
9
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
10
|
|
|
7
11
|
//#region src/agents/skills/env-overrides.ts
|
|
8
12
|
const log = createSubsystemLogger("env-overrides");
|
|
9
|
-
const
|
|
13
|
+
const skillEnvStorage = new AsyncLocalStorage();
|
|
10
14
|
function getActiveSkillEnvKeys() {
|
|
11
|
-
return
|
|
15
|
+
return new Set(Object.keys(skillEnvStorage.getStore() ?? {}));
|
|
16
|
+
}
|
|
17
|
+
/** Trusted, invocation-scoped env consumed by exec without mutating process.env. */
|
|
18
|
+
function getActiveSkillEnvOverrides() {
|
|
19
|
+
return skillEnvStorage.getStore() ?? {};
|
|
12
20
|
}
|
|
13
21
|
const SKILL_ALWAYS_BLOCKED_ENV_PATTERNS = [/^OPENSSL_CONF$/i];
|
|
14
22
|
function matchesAnyPattern(value, patterns) {
|
|
@@ -62,7 +70,7 @@ function sanitizeSkillEnvOverrides(params) {
|
|
|
62
70
|
};
|
|
63
71
|
}
|
|
64
72
|
function applySkillConfigEnvOverrides(params) {
|
|
65
|
-
const {
|
|
73
|
+
const { overrides, skillConfig, primaryEnv, requiredEnv, skillKey } = params;
|
|
66
74
|
const allowedSensitiveKeys = new Set();
|
|
67
75
|
const normalizedPrimaryEnv = primaryEnv?.trim();
|
|
68
76
|
if (normalizedPrimaryEnv) {
|
|
@@ -104,66 +112,68 @@ function applySkillConfigEnvOverrides(params) {
|
|
|
104
112
|
if (process.env[envKey]) {
|
|
105
113
|
continue;
|
|
106
114
|
}
|
|
107
|
-
|
|
108
|
-
key: envKey,
|
|
109
|
-
prev: process.env[envKey]
|
|
110
|
-
});
|
|
111
|
-
process.env[envKey] = envValue;
|
|
112
|
-
activeSkillEnvKeys.add(envKey);
|
|
115
|
+
overrides[envKey] = envValue;
|
|
113
116
|
}
|
|
114
117
|
}
|
|
115
|
-
function
|
|
118
|
+
function activateSkillEnv(overrides) {
|
|
119
|
+
const previous = skillEnvStorage.getStore();
|
|
120
|
+
skillEnvStorage.enterWith(Object.freeze({
|
|
121
|
+
...previous ?? {},
|
|
122
|
+
...overrides
|
|
123
|
+
}));
|
|
116
124
|
return () => {
|
|
117
|
-
|
|
118
|
-
if (update.prev === undefined) {
|
|
119
|
-
delete process.env[update.key];
|
|
120
|
-
} else {
|
|
121
|
-
process.env[update.key] = update.prev;
|
|
122
|
-
}
|
|
123
|
-
activeSkillEnvKeys.delete(update.key);
|
|
124
|
-
}
|
|
125
|
+
skillEnvStorage.enterWith(previous ?? Object.freeze({}));
|
|
125
126
|
};
|
|
126
127
|
}
|
|
127
128
|
function applySkillEnvOverrides(params) {
|
|
128
|
-
const
|
|
129
|
-
const
|
|
129
|
+
const skills = params.skills;
|
|
130
|
+
const config = getRuntimeConfigSnapshot() ?? params.config;
|
|
131
|
+
const overrides = {};
|
|
130
132
|
for (const entry of skills) {
|
|
133
|
+
if (params.excludeMarketplace !== false && isMarketplaceSkillDir(entry.skill.baseDir)) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
131
136
|
const skillKey = resolveSkillKey(entry.skill, entry);
|
|
132
137
|
const skillConfig = resolveSkillConfig(config, skillKey);
|
|
133
138
|
if (!skillConfig) {
|
|
134
139
|
continue;
|
|
135
140
|
}
|
|
136
141
|
applySkillConfigEnvOverrides({
|
|
137
|
-
|
|
142
|
+
overrides,
|
|
138
143
|
skillConfig,
|
|
139
144
|
primaryEnv: entry.metadata?.primaryEnv,
|
|
140
145
|
requiredEnv: entry.metadata?.requires?.env,
|
|
141
146
|
skillKey
|
|
142
147
|
});
|
|
143
148
|
}
|
|
144
|
-
return
|
|
149
|
+
return activateSkillEnv(overrides);
|
|
145
150
|
}
|
|
146
151
|
function applySkillEnvOverridesFromSnapshot(params) {
|
|
147
|
-
const
|
|
152
|
+
const snapshot = params.snapshot;
|
|
153
|
+
const config = getRuntimeConfigSnapshot() ?? params.config;
|
|
148
154
|
if (!snapshot) {
|
|
149
155
|
return () => {};
|
|
150
156
|
}
|
|
151
|
-
const
|
|
157
|
+
const overrides = {};
|
|
158
|
+
const marketplaceSkills = new Set(params.excludeMarketplace === false ? [] : snapshot.marketplaceSkillIds ?? []);
|
|
152
159
|
for (const skill of snapshot.skills) {
|
|
160
|
+
if (marketplaceSkills.has(skill.name)) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
153
163
|
const skillConfig = resolveSkillConfig(config, skill.name);
|
|
154
164
|
if (!skillConfig) {
|
|
155
165
|
continue;
|
|
156
166
|
}
|
|
157
167
|
applySkillConfigEnvOverrides({
|
|
158
|
-
|
|
168
|
+
overrides,
|
|
159
169
|
skillConfig,
|
|
160
170
|
primaryEnv: skill.primaryEnv,
|
|
161
171
|
requiredEnv: skill.requiredEnv,
|
|
162
172
|
skillKey: skill.name
|
|
163
173
|
});
|
|
164
174
|
}
|
|
165
|
-
return
|
|
175
|
+
return activateSkillEnv(overrides);
|
|
166
176
|
}
|
|
167
177
|
|
|
168
178
|
//#endregion
|
|
169
|
-
export { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot };
|
|
179
|
+
export { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot, getActiveSkillEnvOverrides };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import syncFs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
|
|
5
|
+
//#region src/agents/skills/trust.ts
|
|
6
|
+
const MARKETPLACE_ORIGIN_DIRS = [".clawhub", ".clawdhub"];
|
|
7
|
+
function hasMarketplaceOriginMarker(root) {
|
|
8
|
+
return MARKETPLACE_ORIGIN_DIRS.some((dir) => syncFs.existsSync(path.join(root, dir, "origin.json")));
|
|
9
|
+
}
|
|
10
|
+
function isTrackedMarketplaceSkill(root) {
|
|
11
|
+
const skillsDir = path.dirname(root);
|
|
12
|
+
if (path.basename(skillsDir) !== "skills") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const slug = path.basename(root);
|
|
16
|
+
const workspaceDir = path.dirname(skillsDir);
|
|
17
|
+
for (const directory of MARKETPLACE_ORIGIN_DIRS) {
|
|
18
|
+
try {
|
|
19
|
+
const lock = JSON.parse(syncFs.readFileSync(path.join(workspaceDir, directory, "lock.json"), "utf8"));
|
|
20
|
+
if (lock.version === 1 && lock.skills?.[slug]) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
} catch {}
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
function computeSkillContentSha256Sync(skillDir) {
|
|
28
|
+
try {
|
|
29
|
+
const digest = createHash("sha256");
|
|
30
|
+
const queue = [path.resolve(skillDir)];
|
|
31
|
+
while (queue.length > 0) {
|
|
32
|
+
const current = queue.shift();
|
|
33
|
+
if (!current) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const entries = syncFs.readdirSync(current, { withFileTypes: true }).toSorted((left, right) => left.name.localeCompare(right.name));
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
if (entry.name.startsWith(".")) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const fullPath = path.join(current, entry.name);
|
|
42
|
+
if (entry.isDirectory() && !entry.isSymbolicLink()) {
|
|
43
|
+
queue.push(fullPath);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!entry.isFile() || entry.isSymbolicLink()) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
digest.update(path.relative(skillDir, fullPath).split(path.sep).join("/"));
|
|
50
|
+
digest.update("\n");
|
|
51
|
+
digest.update(syncFs.readFileSync(fullPath));
|
|
52
|
+
digest.update("\n");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return digest.digest("hex");
|
|
56
|
+
} catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function marketplaceSkillProvenanceMatchesContent(skillDir) {
|
|
61
|
+
const root = skillDir.trim();
|
|
62
|
+
if (!root) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
for (const directory of MARKETPLACE_ORIGIN_DIRS) {
|
|
66
|
+
try {
|
|
67
|
+
const origin = JSON.parse(syncFs.readFileSync(path.join(root, directory, "origin.json"), "utf8"));
|
|
68
|
+
if (origin.version === 1 && origin.archiveIntegrityVerified === true && typeof origin.archiveSha256 === "string" && /^[a-f0-9]{64}$/u.test(origin.archiveSha256) && typeof origin.contentSha256 === "string" && /^[a-f0-9]{64}$/u.test(origin.contentSha256) && computeSkillContentSha256Sync(root) === origin.contentSha256) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
} catch {}
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
function isMarketplaceSkillDir(skillDir) {
|
|
76
|
+
const root = skillDir.trim();
|
|
77
|
+
return Boolean(root && (hasMarketplaceOriginMarker(root) || isTrackedMarketplaceSkill(root)));
|
|
78
|
+
}
|
|
79
|
+
function marketplaceSkillIdsFromEntries(entries) {
|
|
80
|
+
return [...new Set(entries.filter((entry) => isMarketplaceSkillDir(entry.skill.baseDir)).map((entry) => entry.skill.name.trim()).filter(Boolean))].toSorted();
|
|
81
|
+
}
|
|
82
|
+
function marketplaceSkillIdsFromSnapshot(snapshot) {
|
|
83
|
+
if (!snapshot) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
if (snapshot.marketplaceSkillIds) {
|
|
87
|
+
return [...new Set(snapshot.marketplaceSkillIds.map((id) => id.trim()).filter(Boolean))].toSorted();
|
|
88
|
+
}
|
|
89
|
+
return [...new Set((snapshot.resolvedSkills ?? []).filter((skill) => isMarketplaceSkillDir(skill.baseDir)).map((skill) => skill.name.trim()).filter(Boolean))].toSorted();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
//#endregion
|
|
93
|
+
export { isMarketplaceSkillDir, marketplaceSkillIdsFromEntries, marketplaceSkillIdsFromSnapshot, marketplaceSkillProvenanceMatchesContent };
|