@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { applyMergePatch } from "../config/merge-patch.js";
|
|
2
2
|
import { applyPiCompactionSettingsFromConfig } from "./pi-settings.js";
|
|
3
|
-
import
|
|
3
|
+
import syncFs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { SettingsManager } from "@mariozechner/pi-coding-agent";
|
|
6
6
|
|
|
@@ -28,7 +28,7 @@ function buildEmbeddedPiSettingsSnapshot(params) {
|
|
|
28
28
|
}
|
|
29
29
|
function readJsonFile(filePath) {
|
|
30
30
|
try {
|
|
31
|
-
const raw =
|
|
31
|
+
const raw = syncFs.readFileSync(filePath, "utf8");
|
|
32
32
|
const parsed = JSON.parse(raw);
|
|
33
33
|
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
34
34
|
} catch {
|
|
@@ -49,7 +49,7 @@ function loadEnabledBundlePiSettingsSnapshot(params) {
|
|
|
49
49
|
const servers = mcp.mcpServers && typeof mcp.mcpServers === "object" && !Array.isArray(mcp.mcpServers) ? mcp.mcpServers : undefined;
|
|
50
50
|
if (servers) {
|
|
51
51
|
const resolvedServers = {};
|
|
52
|
-
const resolvedRoot =
|
|
52
|
+
const resolvedRoot = syncFs.realpathSync.native?.(pluginRoot) ?? syncFs.realpathSync(pluginRoot);
|
|
53
53
|
for (const [name, server] of Object.entries(servers)) {
|
|
54
54
|
if (!server || typeof server !== "object" || Array.isArray(server)) {
|
|
55
55
|
resolvedServers[name] = server;
|
|
@@ -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,
|
|
@@ -3,7 +3,7 @@ import { PATH_ALIAS_POLICIES } from "../../infra/path-alias-guards.js";
|
|
|
3
3
|
import { execDockerRaw } from "./docker.js";
|
|
4
4
|
import { isPathInsideContainerRoot, normalizeContainerPath } from "./path-utils.js";
|
|
5
5
|
import { buildSandboxFsMounts, resolveSandboxFsPathWithMounts } from "./fs-paths.js";
|
|
6
|
-
import
|
|
6
|
+
import syncFs from "node:fs";
|
|
7
7
|
|
|
8
8
|
//#region src/agents/sandbox/fs-bridge.ts
|
|
9
9
|
function createSandboxFsBridge(params) {
|
|
@@ -160,7 +160,7 @@ var SandboxFsBridgeImpl = class {
|
|
|
160
160
|
throw guarded.error instanceof Error ? guarded.error : new Error(`Sandbox boundary checks failed; cannot ${options.action}: ${target.containerPath}`);
|
|
161
161
|
}
|
|
162
162
|
} else {
|
|
163
|
-
|
|
163
|
+
syncFs.closeSync(guarded.fd);
|
|
164
164
|
}
|
|
165
165
|
const canonicalContainerPath = await this.resolveCanonicalContainerPath({
|
|
166
166
|
containerPath: target.containerPath,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import syncFs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import fs
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
4
|
|
|
5
5
|
//#region src/agents/session-dirs.ts
|
|
6
6
|
function mapAgentSessionDirs(agentsDir, entries) {
|
|
@@ -9,7 +9,7 @@ function mapAgentSessionDirs(agentsDir, entries) {
|
|
|
9
9
|
async function resolveAgentSessionDirsFromAgentsDir(agentsDir) {
|
|
10
10
|
let entries = [];
|
|
11
11
|
try {
|
|
12
|
-
entries = await fs
|
|
12
|
+
entries = await fs.readdir(agentsDir, { withFileTypes: true });
|
|
13
13
|
} catch (err) {
|
|
14
14
|
const code = err.code;
|
|
15
15
|
if (code === "ENOENT") {
|
|
@@ -22,7 +22,7 @@ async function resolveAgentSessionDirsFromAgentsDir(agentsDir) {
|
|
|
22
22
|
function resolveAgentSessionDirsFromAgentsDirSync(agentsDir) {
|
|
23
23
|
let entries = [];
|
|
24
24
|
try {
|
|
25
|
-
entries =
|
|
25
|
+
entries = syncFs.readdirSync(agentsDir, { withFileTypes: true });
|
|
26
26
|
} catch (err) {
|
|
27
27
|
const code = err.code;
|
|
28
28
|
if (code === "ENOENT") {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isPidAlive } from "../shared/pid-alive.js";
|
|
2
2
|
import { resolveProcessScopedMap } from "../shared/process-scoped-map.js";
|
|
3
|
-
import
|
|
3
|
+
import syncFs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import fs
|
|
5
|
+
import fs from "node:fs/promises";
|
|
6
6
|
|
|
7
7
|
//#region src/agents/session-write-lock.ts
|
|
8
8
|
const CLEANUP_SIGNALS = [
|
|
@@ -84,7 +84,7 @@ async function releaseHeldLock(normalizedSessionFile, held, opts = {}) {
|
|
|
84
84
|
await held.handle.close();
|
|
85
85
|
} catch {}
|
|
86
86
|
try {
|
|
87
|
-
await fs
|
|
87
|
+
await fs.rm(held.lockPath, { force: true });
|
|
88
88
|
} catch {}
|
|
89
89
|
})();
|
|
90
90
|
try {
|
|
@@ -106,7 +106,7 @@ function releaseAllLocksSync() {
|
|
|
106
106
|
}
|
|
107
107
|
} catch {}
|
|
108
108
|
try {
|
|
109
|
-
|
|
109
|
+
syncFs.rmSync(held.lockPath, { force: true });
|
|
110
110
|
} catch {}
|
|
111
111
|
HELD_LOCKS.delete(sessionFile);
|
|
112
112
|
}
|
|
@@ -175,7 +175,7 @@ function registerCleanupHandlers() {
|
|
|
175
175
|
}
|
|
176
176
|
async function readLockPayload(lockPath) {
|
|
177
177
|
try {
|
|
178
|
-
const raw = await fs
|
|
178
|
+
const raw = await fs.readFile(lockPath, "utf8");
|
|
179
179
|
const parsed = JSON.parse(raw);
|
|
180
180
|
const payload = {};
|
|
181
181
|
if (typeof parsed.pid === "number") {
|
|
@@ -226,7 +226,7 @@ async function shouldReclaimContendedLockFile(lockPath, details, staleMs, nowMs)
|
|
|
226
226
|
return true;
|
|
227
227
|
}
|
|
228
228
|
try {
|
|
229
|
-
const stat = await fs
|
|
229
|
+
const stat = await fs.stat(lockPath);
|
|
230
230
|
const ageMs = Math.max(0, nowMs - stat.mtimeMs);
|
|
231
231
|
return ageMs > staleMs;
|
|
232
232
|
} catch (error) {
|
|
@@ -241,7 +241,7 @@ async function cleanStaleLockFiles(params) {
|
|
|
241
241
|
const nowMs = params.nowMs ?? Date.now();
|
|
242
242
|
let entries = [];
|
|
243
243
|
try {
|
|
244
|
-
entries = await fs
|
|
244
|
+
entries = await fs.readdir(sessionsDir, { withFileTypes: true });
|
|
245
245
|
} catch (err) {
|
|
246
246
|
const code = err.code;
|
|
247
247
|
if (code === "ENOENT") {
|
|
@@ -265,7 +265,7 @@ async function cleanStaleLockFiles(params) {
|
|
|
265
265
|
removed: false
|
|
266
266
|
};
|
|
267
267
|
if (lockInfo.stale && removeStale) {
|
|
268
|
-
await fs
|
|
268
|
+
await fs.rm(lockPath, { force: true });
|
|
269
269
|
lockInfo.removed = true;
|
|
270
270
|
cleaned.push(lockInfo);
|
|
271
271
|
params.log?.warn?.(`removed stale session lock: ${lockPath} (${lockInfo.staleReasons.join(", ") || "unknown"})`);
|
|
@@ -284,10 +284,10 @@ async function acquireSessionWriteLock(params) {
|
|
|
284
284
|
const maxHoldMs = resolvePositiveMs(params.maxHoldMs, DEFAULT_MAX_HOLD_MS);
|
|
285
285
|
const sessionFile = path.resolve(params.sessionFile);
|
|
286
286
|
const sessionDir = path.dirname(sessionFile);
|
|
287
|
-
await fs
|
|
287
|
+
await fs.mkdir(sessionDir, { recursive: true });
|
|
288
288
|
let normalizedDir = sessionDir;
|
|
289
289
|
try {
|
|
290
|
-
normalizedDir = await fs
|
|
290
|
+
normalizedDir = await fs.realpath(sessionDir);
|
|
291
291
|
} catch {}
|
|
292
292
|
const normalizedSessionFile = path.join(normalizedDir, path.basename(sessionFile));
|
|
293
293
|
const lockPath = `${normalizedSessionFile}.lock`;
|
|
@@ -305,7 +305,7 @@ async function acquireSessionWriteLock(params) {
|
|
|
305
305
|
attempt += 1;
|
|
306
306
|
let handle = null;
|
|
307
307
|
try {
|
|
308
|
-
handle = await fs
|
|
308
|
+
handle = await fs.open(lockPath, "wx");
|
|
309
309
|
const createdAt = new Date().toISOString();
|
|
310
310
|
await handle.writeFile(JSON.stringify({
|
|
311
311
|
pid: process.pid,
|
|
@@ -328,7 +328,7 @@ async function acquireSessionWriteLock(params) {
|
|
|
328
328
|
await handle.close();
|
|
329
329
|
} catch {}
|
|
330
330
|
try {
|
|
331
|
-
await fs
|
|
331
|
+
await fs.rm(lockPath, { force: true });
|
|
332
332
|
} catch {}
|
|
333
333
|
}
|
|
334
334
|
const code = err.code;
|
|
@@ -339,7 +339,7 @@ async function acquireSessionWriteLock(params) {
|
|
|
339
339
|
const nowMs = Date.now();
|
|
340
340
|
const inspected = inspectLockPayload(payload, staleMs, nowMs);
|
|
341
341
|
if (await shouldReclaimContendedLockFile(lockPath, inspected, staleMs, nowMs)) {
|
|
342
|
-
await fs
|
|
342
|
+
await fs.rm(lockPath, { force: true });
|
|
343
343
|
continue;
|
|
344
344
|
}
|
|
345
345
|
const delay = Math.min(1e3, 50 * attempt);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import syncFs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
|
|
@@ -6,13 +6,13 @@ import { spawn } from "node:child_process";
|
|
|
6
6
|
function resolvePowerShellPath() {
|
|
7
7
|
const programFiles = process.env.ProgramFiles || process.env.PROGRAMFILES || "C:\\Program Files";
|
|
8
8
|
const pwsh7 = path.join(programFiles, "PowerShell", "7", "pwsh.exe");
|
|
9
|
-
if (
|
|
9
|
+
if (syncFs.existsSync(pwsh7)) {
|
|
10
10
|
return pwsh7;
|
|
11
11
|
}
|
|
12
12
|
const programW6432 = process.env.ProgramW6432;
|
|
13
13
|
if (programW6432 && programW6432 !== programFiles) {
|
|
14
14
|
const pwsh7Alt = path.join(programW6432, "PowerShell", "7", "pwsh.exe");
|
|
15
|
-
if (
|
|
15
|
+
if (syncFs.existsSync(pwsh7Alt)) {
|
|
16
16
|
return pwsh7Alt;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -23,7 +23,7 @@ function resolvePowerShellPath() {
|
|
|
23
23
|
const systemRoot = process.env.SystemRoot || process.env.WINDIR;
|
|
24
24
|
if (systemRoot) {
|
|
25
25
|
const candidate = path.join(systemRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
|
|
26
|
-
if (
|
|
26
|
+
if (syncFs.existsSync(candidate)) {
|
|
27
27
|
return candidate;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -73,7 +73,7 @@ function resolveShellFromPath(name) {
|
|
|
73
73
|
for (const entry of entries) {
|
|
74
74
|
const candidate = path.join(entry, name);
|
|
75
75
|
try {
|
|
76
|
-
|
|
76
|
+
syncFs.accessSync(candidate, syncFs.constants.X_OK);
|
|
77
77
|
return candidate;
|
|
78
78
|
} catch {}
|
|
79
79
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { resolveFasedAgentPackageRootSync } from "../../infra/fased-root.js";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
import
|
|
3
|
+
import syncFs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
|
|
6
6
|
//#region src/agents/skills/bundled-dir.ts
|
|
7
7
|
function looksLikeSkillsDir(dir) {
|
|
8
8
|
try {
|
|
9
|
-
const entries =
|
|
9
|
+
const entries = syncFs.readdirSync(dir, { withFileTypes: true });
|
|
10
10
|
for (const entry of entries) {
|
|
11
11
|
if (entry.name.startsWith(".")) {
|
|
12
12
|
continue;
|
|
@@ -16,7 +16,7 @@ function looksLikeSkillsDir(dir) {
|
|
|
16
16
|
return true;
|
|
17
17
|
}
|
|
18
18
|
if (entry.isDirectory()) {
|
|
19
|
-
if (
|
|
19
|
+
if (syncFs.existsSync(path.join(fullPath, "SKILL.md"))) {
|
|
20
20
|
return true;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -35,7 +35,7 @@ function resolveBundledSkillsDir(opts = {}) {
|
|
|
35
35
|
const execPath = opts.execPath ?? process.execPath;
|
|
36
36
|
const execDir = path.dirname(execPath);
|
|
37
37
|
const sibling = path.join(execDir, "skills");
|
|
38
|
-
if (
|
|
38
|
+
if (syncFs.existsSync(sibling)) {
|
|
39
39
|
return sibling;
|
|
40
40
|
}
|
|
41
41
|
} catch {}
|
|
@@ -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 };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { openVerifiedFileSync } from "../../infra/safe-open-sync.js";
|
|
2
2
|
import { parseFrontmatter, resolveSkillInvocationPolicy } from "./frontmatter.js";
|
|
3
3
|
import { createSyntheticSourceInfo } from "./skill-contract.js";
|
|
4
|
-
import
|
|
4
|
+
import syncFs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
|
|
7
7
|
//#region src/agents/skills/local-loader.ts
|
|
@@ -22,9 +22,9 @@ function readSkillFileSync(params) {
|
|
|
22
22
|
if (!isPathWithinRoot(params.rootRealPath, opened.path)) {
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
|
-
return
|
|
25
|
+
return syncFs.readFileSync(opened.fd, "utf8");
|
|
26
26
|
} finally {
|
|
27
|
-
|
|
27
|
+
syncFs.closeSync(opened.fd);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
function loadSingleSkillDirectory(params) {
|
|
@@ -69,7 +69,7 @@ function loadSingleSkillDirectory(params) {
|
|
|
69
69
|
}
|
|
70
70
|
function listCandidateSkillDirs(dir) {
|
|
71
71
|
try {
|
|
72
|
-
return
|
|
72
|
+
return syncFs.readdirSync(dir, { withFileTypes: true }).filter((entry) => entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules").map((entry) => path.join(dir, entry.name)).sort((left, right) => left.localeCompare(right));
|
|
73
73
|
} catch {
|
|
74
74
|
return [];
|
|
75
75
|
}
|
|
@@ -78,7 +78,7 @@ function loadSkillsFromDirSafe(params) {
|
|
|
78
78
|
const rootDir = path.resolve(params.dir);
|
|
79
79
|
let rootRealPath;
|
|
80
80
|
try {
|
|
81
|
-
rootRealPath =
|
|
81
|
+
rootRealPath = syncFs.realpathSync(rootDir);
|
|
82
82
|
} catch {
|
|
83
83
|
return { skills: [] };
|
|
84
84
|
}
|
|
@@ -102,7 +102,7 @@ function loadSkillsFromDirSafe(params) {
|
|
|
102
102
|
function readSkillFrontmatterSafe(params) {
|
|
103
103
|
let rootRealPath;
|
|
104
104
|
try {
|
|
105
|
-
rootRealPath =
|
|
105
|
+
rootRealPath = syncFs.realpathSync(path.resolve(params.rootDir));
|
|
106
106
|
} catch {
|
|
107
107
|
return null;
|
|
108
108
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createSubsystemLogger } from "../../logging/subsystem.js";
|
|
2
2
|
import { normalizePluginsConfig, resolveEffectiveEnableState, resolveMemorySlotDecision } from "../../plugins/config-state.js";
|
|
3
3
|
import { loadPluginManifestRegistry } from "../../plugins/manifest-registry.js";
|
|
4
|
-
import
|
|
4
|
+
import syncFs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
|
|
7
7
|
//#region src/agents/skills/plugin-skills.ts
|
|
@@ -58,7 +58,7 @@ function resolvePluginSkillDirs(params) {
|
|
|
58
58
|
continue;
|
|
59
59
|
}
|
|
60
60
|
const candidate = path.resolve(record.rootDir, trimmed);
|
|
61
|
-
if (!
|
|
61
|
+
if (!syncFs.existsSync(candidate)) {
|
|
62
62
|
log.warn(`plugin skill path not found (${record.id}): ${candidate}`);
|
|
63
63
|
continue;
|
|
64
64
|
}
|
|
@@ -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 };
|