@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.
Files changed (341) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +38 -30
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +49 -0
  5. package/config/signer-policies/agent.json.template +32 -0
  6. package/config/signer-policies/mining.json.template +69 -0
  7. package/config/signer-policies/network.json.template +5 -0
  8. package/config/signer-policies/vault.json.template +70 -0
  9. package/config/signer-protocol-v2.json +76 -0
  10. package/config/typescript-noemit-baseline.json +680 -0
  11. package/dist/agents/auth-profiles/store.js +267 -31
  12. package/dist/agents/bash-tools.exec.js +10 -4
  13. package/dist/agents/current-model-catalog.js +3 -3
  14. package/dist/agents/memory-search.js +7 -1
  15. package/dist/agents/model-catalog-access.js +1 -2
  16. package/dist/agents/model-catalog-snapshot.js +1 -1
  17. package/dist/agents/model-catalog-source.js +1 -1
  18. package/dist/agents/model-metadata.js +1 -1
  19. package/dist/agents/model-selection.js +2 -28
  20. package/dist/agents/models-config.providers.js +6 -6
  21. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  22. package/dist/agents/pi-embedded-runner/model.js +1 -1
  23. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  24. package/dist/agents/pi-embedded-runner/run.js +2 -0
  25. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  26. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  27. package/dist/agents/pi-tools.js +2 -1
  28. package/dist/agents/sandbox/config.js +1 -1
  29. package/dist/agents/sandbox/context.js +27 -2
  30. package/dist/agents/skills/env-overrides.js +38 -28
  31. package/dist/agents/skills/trust.js +93 -0
  32. package/dist/agents/skills/workspace.js +128 -0
  33. package/dist/agents/skills-clawhub.js +36 -11
  34. package/dist/agents/skills-marketplace-scan.js +49 -0
  35. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  36. package/dist/agents/tools/mining-tool.js +1 -1
  37. package/dist/agents/tools/session-status-tool.js +1 -1
  38. package/dist/agents/tools/wallet-action-tool.js +172 -36
  39. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  40. package/dist/agents/tools/wallet-tool.js +7 -11
  41. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  42. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  43. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  44. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  45. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  46. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  47. package/dist/auto-reply/reply/model-selection.js +7 -4
  48. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  49. package/dist/brand.js +1 -1
  50. package/dist/build-info.json +3 -3
  51. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  52. package/dist/channel-web.js +2 -2
  53. package/dist/cli/gateway-cli/run.js +8 -0
  54. package/dist/cli/program/command-registry.js +1 -1
  55. package/dist/cli/program/register.onboard.js +2 -3
  56. package/dist/cli/program/register.wallet.js +16 -123
  57. package/dist/cli/providers-cli.js +1 -1
  58. package/dist/cli/sat-cli.js +129 -2
  59. package/dist/cli/update-cli/update-command.js +260 -11
  60. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  61. package/dist/commands/doctor-config-flow.js +1 -1
  62. package/dist/commands/doctor-legacy-config.js +2 -13
  63. package/dist/commands/model-picker.js +6 -6
  64. package/dist/commands/models/auth.js +1 -1
  65. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  66. package/dist/commands/onboard-auth.credentials.js +32 -8
  67. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  68. package/dist/commands/onboard-non-interactive/local.js +5 -1
  69. package/dist/commands/wallet.js +568 -1911
  70. package/dist/config/config.js +2 -2
  71. package/dist/config/io.js +64 -2
  72. package/dist/config/schema.help.js +8 -7
  73. package/dist/config/schema.labels.js +5 -4
  74. package/dist/config/zod-schema.agent-runtime.js +1 -0
  75. package/dist/config/zod-schema.js +5 -0
  76. package/dist/control-ui/assets/{app-DLil9VO1.js → app-bR-fO5ty.js} +1511 -1555
  77. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  78. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  79. package/dist/control-ui/assets/{index-DdE_NIXo.js → index-ckCxHwjy.js} +3 -3
  80. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  81. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  82. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  83. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  84. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/control-ui/version.json +1 -1
  87. package/dist/daemon/systemd-system.js +56 -50
  88. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  89. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  90. package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
  91. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  92. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  93. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  94. package/dist/federation/auto-connect.js +98 -8
  95. package/dist/federation/marketplace-capability-adapter.js +33 -7
  96. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  97. package/dist/federation/marketplace-delivery.js +351 -215
  98. package/dist/federation/marketplace-direct-payment.js +272 -141
  99. package/dist/federation/marketplace-escrow.js +607 -249
  100. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  101. package/dist/federation/offers.js +9 -7
  102. package/dist/federation/peer-auth-v2.js +529 -0
  103. package/dist/gateway/a2a-http.js +425 -96
  104. package/dist/gateway/a2a-settlement.js +259 -153
  105. package/dist/gateway/a2a-task-store.js +524 -0
  106. package/dist/gateway/auth.js +38 -2
  107. package/dist/gateway/config-reload.js +46 -33
  108. package/dist/gateway/durable-capacity.js +31 -0
  109. package/dist/gateway/federation-http.js +540 -135
  110. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  111. package/dist/gateway/federation-marketplace.js +535 -230
  112. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  113. package/dist/gateway/security-path.js +1 -1
  114. package/dist/gateway/server-http.js +1084 -1205
  115. package/dist/gateway/server-methods/models.js +1 -1
  116. package/dist/gateway/server-methods/secrets.js +40 -0
  117. package/dist/gateway/server-methods.js +1 -2
  118. package/dist/gateway/server-reload-handlers.js +196 -66
  119. package/dist/gateway/server-runtime-config.js +1 -1
  120. package/dist/gateway/server-secrets-runtime.js +288 -0
  121. package/dist/gateway/server.impl.js +73 -42
  122. package/dist/gateway/sessions-patch.js +3 -5
  123. package/dist/index.js +4 -2
  124. package/dist/infra/fasedhub.js +64 -1
  125. package/dist/infra/local-source-paired-update.js +538 -0
  126. package/dist/infra/restart.js +41 -10
  127. package/dist/infra/update-runner.js +96 -0
  128. package/dist/light-update-status.js +11 -11
  129. package/dist/memory/backend-config.js +2 -1
  130. package/dist/memory/session-files.js +16 -2
  131. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  132. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  133. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  134. package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-BYxAt775.js} +27 -27
  135. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  136. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  137. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  138. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  139. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  140. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  141. package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DIRHG2gJ.js} +1 -1
  142. package/dist/plugin-sdk/command-status.d.ts +2 -2
  143. package/dist/plugin-sdk/command-status.js +27 -27
  144. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  145. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  146. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  147. package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-BOT7kHb6.js} +6779 -3696
  148. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  149. package/dist/plugin-sdk/discord.d.ts +6 -6
  150. package/dist/plugin-sdk/discord.js +19 -19
  151. package/dist/plugin-sdk/file-lock.js +35 -4
  152. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  153. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  154. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  155. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  156. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  157. package/dist/plugin-sdk/index.d.ts +21 -39
  158. package/dist/plugin-sdk/index.js +29 -29
  159. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  160. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  161. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  162. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  163. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  164. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  165. package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-BCFDaqJ-.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-BgbjRiPM.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DFf87SMM.js} +27 -27
  168. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  169. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  170. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  171. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  172. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  173. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  174. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  175. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  176. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  177. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  178. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  179. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  180. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  181. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  182. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  183. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  184. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  185. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  186. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  187. package/dist/plugin-sdk/sat-runtime.js +29 -29
  188. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  189. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  190. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  191. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  192. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  193. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  194. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  195. package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BUTt8cxK.js} +39 -39
  196. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  197. package/dist/plugin-sdk/slack.d.ts +6 -6
  198. package/dist/plugin-sdk/slack.js +9 -9
  199. package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-D0wHVqjt.js} +3 -3
  200. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  201. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  202. package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-CC_qN4v0.js} +30 -30
  203. package/dist/plugin-sdk/telegram.d.ts +6 -6
  204. package/dist/plugin-sdk/telegram.js +8 -8
  205. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  206. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  207. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-C3avNytw.d.ts} +3 -4
  209. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  210. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-DWfbSAaM.d.ts} +2 -2
  211. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  212. package/dist/plugin-sdk/{web-CInY-lCv.js → web-BXsJ1vqe.js} +32 -32
  213. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  214. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  215. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  216. package/dist/plugin-sdk/whatsapp.js +12 -12
  217. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  218. package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
  219. package/dist/providers/refresh.js +1 -1
  220. package/dist/providers/registry.js +1 -1
  221. package/dist/secrets/apply.js +1 -1
  222. package/dist/secrets/runtime.js +1 -1
  223. package/dist/wallet/external-submission-ledger.js +376 -0
  224. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  225. package/dist/wallet/local-socket-signer-archive.js +30 -0
  226. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  227. package/dist/wallet/local-socket-signer-policy.js +166 -0
  228. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  229. package/dist/wallet/native-signer-wallet-id.js +25 -0
  230. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  231. package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
  232. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  233. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  234. package/dist/wallet/signer-network-admin.js +184 -0
  235. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  236. package/dist/wallet/solana-bond-signing.js +157 -69
  237. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  238. package/dist/wallet/solana-swap.js +520 -64
  239. package/dist/wallet/solana-transaction-inspection.js +106 -4
  240. package/dist/wallet/solana-trigger.js +658 -320
  241. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  242. package/dist/wallet/wallet-approval-auth.js +17 -28
  243. package/dist/wallet/wallet-atomic-state.js +53 -0
  244. package/dist/wallet/wallet-canary.js +0 -1
  245. package/dist/wallet/wallet-inbound-events.js +16 -11
  246. package/dist/wallet/wallet-policy-simulation.js +1 -1
  247. package/dist/wallet/wallet-policy.js +90 -36
  248. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  249. package/dist/wallet/wallet-provider-registry.js +57 -44
  250. package/dist/wallet/wallet-provider-resolver.js +62 -63
  251. package/dist/wallet/wallet-runtime-config.js +28 -41
  252. package/dist/wallet/wallet-secrets-store.js +22 -0
  253. package/dist/wallet/wallet-send-approvals.js +1891 -589
  254. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  255. package/dist/wallet/wallet-settlement-links.js +14 -13
  256. package/dist/wallet/wallet-standard-review.js +353 -0
  257. package/dist/wallet/wallet-status.js +0 -9
  258. package/dist/wallet/wallet-task-ledger.js +16 -2
  259. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  260. package/dist/web/auto-reply/monitor.js +2 -2
  261. package/dist/wizard/host-security-capability.js +14 -23
  262. package/dist/wizard/onboarding.finalize.js +63 -184
  263. package/dist/wizard/onboarding.host-security.js +117 -1367
  264. package/dist/wizard/onboarding.js +172 -217
  265. package/dist/wizard/onboarding.wallet.js +232 -785
  266. package/extensions/acpx/package.json +1 -1
  267. package/extensions/bluebubbles/package.json +1 -1
  268. package/extensions/copilot-proxy/package.json +1 -1
  269. package/extensions/diagnostics-otel/package.json +1 -1
  270. package/extensions/fased-federation/package.json +1 -1
  271. package/extensions/google-gemini-cli-auth/package.json +1 -1
  272. package/extensions/imessage/package.json +1 -1
  273. package/extensions/irc/package.json +1 -1
  274. package/extensions/line/package.json +1 -1
  275. package/extensions/llm-task/package.json +1 -1
  276. package/extensions/lobster/package.json +1 -1
  277. package/extensions/matrix/CHANGELOG.md +12 -0
  278. package/extensions/matrix/package.json +1 -1
  279. package/extensions/mattermost/package.json +1 -1
  280. package/extensions/memory-core/package.json +2 -2
  281. package/extensions/memory-lancedb/package.json +1 -1
  282. package/extensions/minimax-portal-auth/package.json +1 -1
  283. package/extensions/msteams/CHANGELOG.md +12 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +12 -0
  287. package/extensions/nostr/package.json +1 -1
  288. package/extensions/open-prose/package.json +1 -1
  289. package/extensions/sat-mining/index.ts +498 -153
  290. package/extensions/sat-mining/package.json +1 -1
  291. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  292. package/extensions/sat-mining/src/audit-store.ts +50 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/config.ts +9 -0
  295. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  296. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  297. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  298. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  299. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  300. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  301. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  302. package/extensions/sat-mining/src/runtime.ts +14 -0
  303. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  304. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  305. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  306. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  307. package/extensions/signal/package.json +1 -1
  308. package/extensions/synology-chat/package.json +1 -1
  309. package/extensions/tlon/package.json +1 -1
  310. package/extensions/twitch/CHANGELOG.md +12 -0
  311. package/extensions/twitch/package.json +1 -1
  312. package/extensions/voice-call/CHANGELOG.md +12 -0
  313. package/extensions/voice-call/package.json +1 -1
  314. package/extensions/zalo/CHANGELOG.md +12 -0
  315. package/extensions/zalo/package.json +1 -1
  316. package/extensions/zalouser/CHANGELOG.md +12 -0
  317. package/extensions/zalouser/package.json +1 -1
  318. package/install.sh +4955 -0
  319. package/package.json +23 -5
  320. package/scripts/fased-host-updater.mjs +1421 -0
  321. package/scripts/fased-host-updaterctl.mjs +186 -0
  322. package/scripts/fased-managed-service.sh +36 -0
  323. package/scripts/fased-managed-updater.mjs +3065 -156
  324. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  325. package/scripts/fased-signer-network-hosting.sh +143 -0
  326. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  327. package/scripts/fased-signer-policy-hosting.sh +50 -0
  328. package/scripts/fased-signer-policy-local.sh +26 -0
  329. package/scripts/hosted-release-manifest.mjs +185 -0
  330. package/scripts/install-fased-signerd.sh +183 -108
  331. package/scripts/install-managed-runtime.mjs +212 -10
  332. package/scripts/managed-runtime-layout.mjs +75 -3
  333. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  334. package/scripts/start-managed.sh +169 -360
  335. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  336. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  337. package/dist/wallet/local-socket-signer-broker.js +0 -224
  338. package/dist/wallet/local-socket-signer-custody.js +0 -42
  339. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  340. package/dist/wallet/providers/privy-adapter.js +0 -80
  341. 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 { builtInTools, customTools } = splitSdkTools({
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: builtInTools,
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 allCustomTools = [...customTools, ...clientToolDefs];
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: builtInTools,
600
- customTools: allCustomTools,
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
- builtInTools: [],
8
- customTools: toToolDefinitions(tools)
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
  });
@@ -332,7 +332,8 @@ function createFasedAgentCodingTools(options) {
332
332
  senderIsOwner: options?.senderIsOwner
333
333
  })
334
334
  ];
335
- const toolsForMessageProvider = applyMessageProviderToolPolicy(tools, options?.messageProvider);
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 "agent";
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 cfg = resolveSandboxConfigForAgent(params.config, runtime.agentId);
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 { sanitizeEnvVars, validateEnvVarValue } from "../sandbox/sanitize-env-vars.js";
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 activeSkillEnvKeys = new Set();
13
+ const skillEnvStorage = new AsyncLocalStorage();
10
14
  function getActiveSkillEnvKeys() {
11
- return activeSkillEnvKeys;
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 { updates, skillConfig, primaryEnv, requiredEnv, skillKey } = params;
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
- updates.push({
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 createEnvReverter(updates) {
118
+ function activateSkillEnv(overrides) {
119
+ const previous = skillEnvStorage.getStore();
120
+ skillEnvStorage.enterWith(Object.freeze({
121
+ ...previous ?? {},
122
+ ...overrides
123
+ }));
116
124
  return () => {
117
- for (const update of updates) {
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 { skills, config } = params;
129
- const updates = [];
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
- updates,
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 createEnvReverter(updates);
149
+ return activateSkillEnv(overrides);
145
150
  }
146
151
  function applySkillEnvOverridesFromSnapshot(params) {
147
- const { snapshot, config } = params;
152
+ const snapshot = params.snapshot;
153
+ const config = getRuntimeConfigSnapshot() ?? params.config;
148
154
  if (!snapshot) {
149
155
  return () => {};
150
156
  }
151
- const updates = [];
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
- updates,
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 createEnvReverter(updates);
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 };