@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.
Files changed (514) hide show
  1. package/CHANGELOG.md +43 -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/acp/client.js +2 -2
  12. package/dist/acp/secret-file.js +2 -2
  13. package/dist/agents/agent-scope.js +2 -2
  14. package/dist/agents/apply-patch.js +8 -8
  15. package/dist/agents/auth-profiles/paths.js +2 -2
  16. package/dist/agents/auth-profiles/store.js +269 -33
  17. package/dist/agents/bash-tools.exec.js +10 -4
  18. package/dist/agents/bash-tools.shared.js +2 -2
  19. package/dist/agents/cli-credentials.js +4 -4
  20. package/dist/agents/current-model-catalog.js +3 -3
  21. package/dist/agents/docs-path.js +3 -3
  22. package/dist/agents/embedded-pi-mcp.js +4 -4
  23. package/dist/agents/identity-avatar.js +3 -3
  24. package/dist/agents/identity-file.js +2 -2
  25. package/dist/agents/memory-search.js +7 -1
  26. package/dist/agents/model-catalog-access.js +1 -2
  27. package/dist/agents/model-catalog-snapshot.js +1 -1
  28. package/dist/agents/model-catalog-source.js +1 -1
  29. package/dist/agents/model-metadata.js +1 -1
  30. package/dist/agents/model-selection.js +2 -28
  31. package/dist/agents/models-config.providers.js +6 -6
  32. package/dist/agents/openai-codex-app-server.js +5 -5
  33. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  34. package/dist/agents/pi-embedded-runner/model.js +1 -1
  35. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  36. package/dist/agents/pi-embedded-runner/run.js +2 -0
  37. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  38. package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
  39. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
  40. package/dist/agents/pi-model-discovery.js +6 -6
  41. package/dist/agents/pi-project-settings.js +3 -3
  42. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  43. package/dist/agents/pi-tools.js +2 -1
  44. package/dist/agents/sandbox/config.js +1 -1
  45. package/dist/agents/sandbox/context.js +27 -2
  46. package/dist/agents/sandbox/fs-bridge.js +2 -2
  47. package/dist/agents/session-dirs.js +4 -4
  48. package/dist/agents/session-write-lock.js +13 -13
  49. package/dist/agents/shell-utils.js +5 -5
  50. package/dist/agents/skills/bundled-dir.js +4 -4
  51. package/dist/agents/skills/env-overrides.js +38 -28
  52. package/dist/agents/skills/local-loader.js +6 -6
  53. package/dist/agents/skills/plugin-skills.js +2 -2
  54. package/dist/agents/skills/trust.js +93 -0
  55. package/dist/agents/skills/workspace.js +141 -13
  56. package/dist/agents/skills-clawhub.js +36 -11
  57. package/dist/agents/skills-install-download.js +7 -7
  58. package/dist/agents/skills-install-plan.js +2 -2
  59. package/dist/agents/skills-install.js +2 -2
  60. package/dist/agents/skills-marketplace-scan.js +49 -0
  61. package/dist/agents/skills-status.js +2 -2
  62. package/dist/agents/subagent-depth.js +2 -2
  63. package/dist/agents/system-prompt-params.js +2 -2
  64. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  65. package/dist/agents/tools/mining-tool.js +1 -1
  66. package/dist/agents/tools/session-status-tool.js +1 -1
  67. package/dist/agents/tools/wallet-action-tool.js +172 -36
  68. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  69. package/dist/agents/tools/wallet-tool.js +7 -11
  70. package/dist/agents/workspace.js +22 -22
  71. package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
  72. package/dist/auto-reply/reply/agent-runner.js +2 -2
  73. package/dist/auto-reply/reply/commands-export-session.js +7 -7
  74. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  75. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  76. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  77. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  78. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  79. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  80. package/dist/auto-reply/reply/model-selection.js +7 -4
  81. package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
  82. package/dist/auto-reply/reply/post-compaction-context.js +3 -3
  83. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  84. package/dist/auto-reply/reply/session.js +3 -3
  85. package/dist/auto-reply/skill-commands.js +3 -3
  86. package/dist/auto-reply/status.js +6 -6
  87. package/dist/brand.js +1 -1
  88. package/dist/browser/chrome.executables.js +3 -3
  89. package/dist/browser/chrome.js +3 -3
  90. package/dist/browser/chrome.profile-decoration.js +6 -6
  91. package/dist/browser/profiles-service.js +2 -2
  92. package/dist/browser/server-context.js +2 -2
  93. package/dist/browser/trash.js +4 -4
  94. package/dist/build-info.json +3 -3
  95. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  96. package/dist/canvas-host/server.js +4 -4
  97. package/dist/capabilities/catalog.js +3 -3
  98. package/dist/channel-web.js +2 -2
  99. package/dist/channels/plugins/catalog.js +3 -3
  100. package/dist/cli/browser-cli-extension.js +6 -6
  101. package/dist/cli/command-format.js +2 -2
  102. package/dist/cli/cron-cli/register.cron-simple.js +2 -2
  103. package/dist/cli/dns-cli.js +9 -9
  104. package/dist/cli/gateway-cli/dev.js +5 -5
  105. package/dist/cli/gateway-cli/run.js +10 -2
  106. package/dist/cli/hooks-cli.js +5 -5
  107. package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
  108. package/dist/cli/memory-cli.js +7 -7
  109. package/dist/cli/nodes-media-utils.js +2 -2
  110. package/dist/cli/plugins-cli.js +2 -2
  111. package/dist/cli/program/command-registry.js +1 -1
  112. package/dist/cli/program/register.onboard.js +2 -3
  113. package/dist/cli/program/register.wallet.js +16 -123
  114. package/dist/cli/providers-cli.js +1 -1
  115. package/dist/cli/sat-cli.js +129 -2
  116. package/dist/cli/secrets-cli.js +3 -3
  117. package/dist/cli/update-cli/update-command.js +260 -11
  118. package/dist/cli/windows-argv.js +2 -2
  119. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  120. package/dist/commands/dashboard-link.js +3 -3
  121. package/dist/commands/doctor-config-flow.js +1 -1
  122. package/dist/commands/doctor-install.js +5 -5
  123. package/dist/commands/doctor-legacy-config.js +2 -13
  124. package/dist/commands/doctor-memory-search.js +2 -2
  125. package/dist/commands/doctor-platform-notes.js +2 -2
  126. package/dist/commands/doctor-sandbox.js +2 -2
  127. package/dist/commands/doctor-state-integrity.js +23 -23
  128. package/dist/commands/doctor-workspace.js +3 -3
  129. package/dist/commands/doctor.js +3 -3
  130. package/dist/commands/managed-up.js +2 -2
  131. package/dist/commands/model-picker.js +6 -6
  132. package/dist/commands/models/auth.js +1 -1
  133. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  134. package/dist/commands/onboard-auth.credentials.js +35 -11
  135. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  136. package/dist/commands/onboard-non-interactive/local.js +5 -1
  137. package/dist/commands/onboarding/plugin-install.js +2 -2
  138. package/dist/commands/sessions-cleanup.js +2 -2
  139. package/dist/commands/signal-install.js +6 -6
  140. package/dist/commands/status-all/channels.js +2 -2
  141. package/dist/commands/wallet.js +570 -1913
  142. package/dist/config/cache-utils.js +2 -2
  143. package/dist/config/config.js +2 -2
  144. package/dist/config/includes.js +5 -5
  145. package/dist/config/io.js +66 -4
  146. package/dist/config/paths.js +3 -3
  147. package/dist/config/sat-runtime-ids.js +3 -3
  148. package/dist/config/schema.help.js +8 -7
  149. package/dist/config/schema.labels.js +5 -4
  150. package/dist/config/sessions/disk-budget.js +6 -6
  151. package/dist/config/sessions/paths.js +2 -2
  152. package/dist/config/sessions/store.js +17 -17
  153. package/dist/config/sessions/transcript.js +4 -4
  154. package/dist/config/talk.js +2 -2
  155. package/dist/config/zod-schema.agent-runtime.js +1 -0
  156. package/dist/config/zod-schema.js +5 -0
  157. package/dist/control-ui/assets/{app-BXA4gPvN.js → app-bR-fO5ty.js} +1511 -1555
  158. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  159. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  160. package/dist/control-ui/assets/{index-D2QbJhVg.js → index-ckCxHwjy.js} +3 -3
  161. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  162. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  163. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  164. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  165. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  166. package/dist/control-ui/index.html +1 -1
  167. package/dist/control-ui/version.json +1 -1
  168. package/dist/cron/service/store.js +2 -2
  169. package/dist/cron/store.js +6 -6
  170. package/dist/daemon/systemd-system.js +60 -54
  171. package/dist/discord/monitor/thread-bindings.state.js +2 -2
  172. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  173. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  174. package/dist/extensions/sat-mining/src/sat-bond-layout.js +14 -11
  175. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  176. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  177. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  178. package/dist/federation/auto-connect.js +98 -8
  179. package/dist/federation/marketplace-capability-adapter.js +33 -7
  180. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  181. package/dist/federation/marketplace-delivery.js +351 -215
  182. package/dist/federation/marketplace-direct-payment.js +272 -141
  183. package/dist/federation/marketplace-escrow.js +607 -249
  184. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  185. package/dist/federation/offers.js +9 -7
  186. package/dist/federation/peer-auth-v2.js +529 -0
  187. package/dist/gateway/a2a-http.js +425 -96
  188. package/dist/gateway/a2a-settlement.js +259 -153
  189. package/dist/gateway/a2a-task-store.js +524 -0
  190. package/dist/gateway/auth.js +38 -2
  191. package/dist/gateway/config-reload.js +46 -33
  192. package/dist/gateway/control-ui-boot-check.js +6 -6
  193. package/dist/gateway/control-ui-login.js +7 -7
  194. package/dist/gateway/control-ui.js +9 -9
  195. package/dist/gateway/durable-capacity.js +31 -0
  196. package/dist/gateway/federation-http.js +540 -135
  197. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  198. package/dist/gateway/federation-marketplace.js +535 -230
  199. package/dist/gateway/hooks-mapping.js +4 -4
  200. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  201. package/dist/gateway/security-path.js +1 -1
  202. package/dist/gateway/server-discovery.js +2 -2
  203. package/dist/gateway/server-http.js +1088 -1209
  204. package/dist/gateway/server-methods/chat.js +3 -3
  205. package/dist/gateway/server-methods/models.js +1 -1
  206. package/dist/gateway/server-methods/secrets.js +40 -0
  207. package/dist/gateway/server-methods/sessions.js +6 -6
  208. package/dist/gateway/server-methods/usage.js +2 -2
  209. package/dist/gateway/server-methods.js +1 -2
  210. package/dist/gateway/server-reload-handlers.js +196 -66
  211. package/dist/gateway/server-runtime-config.js +1 -1
  212. package/dist/gateway/server-secrets-runtime.js +288 -0
  213. package/dist/gateway/server.impl.js +73 -42
  214. package/dist/gateway/session-compaction-checkpoints.js +4 -4
  215. package/dist/gateway/session-utils.fs.js +24 -24
  216. package/dist/gateway/session-utils.js +6 -6
  217. package/dist/gateway/sessions-patch.js +3 -5
  218. package/dist/hooks/bundled-dir.js +4 -4
  219. package/dist/hooks/gmail-setup-utils.js +6 -6
  220. package/dist/hooks/import-url.js +2 -2
  221. package/dist/hooks/loader.js +4 -4
  222. package/dist/hooks/workspace.js +7 -7
  223. package/dist/index.js +4 -2
  224. package/dist/infra/archive.js +17 -17
  225. package/dist/infra/boundary-file-read.js +2 -2
  226. package/dist/infra/boundary-path.js +15 -15
  227. package/dist/infra/brew.js +2 -2
  228. package/dist/infra/control-ui-assets.js +14 -14
  229. package/dist/infra/device-auth-store.js +8 -8
  230. package/dist/infra/device-identity.js +8 -8
  231. package/dist/infra/dotenv.js +2 -2
  232. package/dist/infra/exec-approvals.js +8 -8
  233. package/dist/infra/exec-command-resolution.js +4 -4
  234. package/dist/infra/exec-safe-bin-trust.js +2 -2
  235. package/dist/infra/fased-root.js +5 -5
  236. package/dist/infra/fasedhub.js +64 -1
  237. package/dist/infra/fs-safe.js +14 -14
  238. package/dist/infra/gateway-lock.js +11 -11
  239. package/dist/infra/git-commit.js +5 -5
  240. package/dist/infra/git-root.js +4 -4
  241. package/dist/infra/hosted-runtime-artifact.js +3 -3
  242. package/dist/infra/is-main.js +2 -2
  243. package/dist/infra/json-file.js +7 -7
  244. package/dist/infra/local-source-paired-update.js +538 -0
  245. package/dist/infra/managed-runtime-bootstrap.js +6 -6
  246. package/dist/infra/outbound/delivery-queue.js +16 -16
  247. package/dist/infra/path-env.js +3 -3
  248. package/dist/infra/ports-lsof.js +4 -4
  249. package/dist/infra/provider-usage.auth.js +3 -3
  250. package/dist/infra/restart.js +41 -10
  251. package/dist/infra/safe-open-sync.js +2 -2
  252. package/dist/infra/session-cost-usage.js +9 -9
  253. package/dist/infra/shell-env.js +2 -2
  254. package/dist/infra/state-migrations.fs.js +6 -6
  255. package/dist/infra/state-migrations.js +23 -23
  256. package/dist/infra/tmp-fased-dir.js +6 -6
  257. package/dist/infra/update-runner.js +96 -0
  258. package/dist/infra/widearea-dns.js +3 -3
  259. package/dist/infra/wsl.js +2 -2
  260. package/dist/light-update-status.js +11 -11
  261. package/dist/line/accounts.js +2 -2
  262. package/dist/line/download.js +2 -2
  263. package/dist/logging/config.js +3 -3
  264. package/dist/logging/logger.js +7 -7
  265. package/dist/managed/federation.js +3 -3
  266. package/dist/managed/tunnel.js +3 -3
  267. package/dist/media/store.js +13 -13
  268. package/dist/media-understanding/runner.js +3 -3
  269. package/dist/memory/backend-config.js +2 -1
  270. package/dist/memory/embeddings.js +2 -2
  271. package/dist/memory/internal.js +10 -10
  272. package/dist/memory/manager-sync-ops.js +7 -7
  273. package/dist/memory/repair-executor.js +17 -17
  274. package/dist/memory/session-files.js +16 -2
  275. package/dist/node-host/invoke-system-run-plan.js +8 -8
  276. package/dist/node-host/invoke.js +2 -2
  277. package/dist/node-host/runner.js +3 -3
  278. package/dist/pairing/pairing-store.js +3 -3
  279. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  280. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  281. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  282. package/dist/plugin-sdk/{audio-preflight-Bv0hUOWL.js → audio-preflight-BYxAt775.js} +27 -27
  283. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  284. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  285. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  286. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  287. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  288. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  289. package/dist/plugin-sdk/{chunk-items-Bk--NU3E.js → chunk-items-DIRHG2gJ.js} +1 -1
  290. package/dist/plugin-sdk/command-status.d.ts +2 -2
  291. package/dist/plugin-sdk/command-status.js +27 -27
  292. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  293. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  294. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  295. package/dist/plugin-sdk/{config-schema-CGW6J3Pv.js → config-schema-BOT7kHb6.js} +6779 -3696
  296. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  297. package/dist/plugin-sdk/discord.d.ts +5 -5
  298. package/dist/plugin-sdk/discord.js +19 -19
  299. package/dist/plugin-sdk/file-lock.js +35 -4
  300. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  301. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  302. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  303. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  304. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  305. package/dist/plugin-sdk/index.d.ts +9 -27
  306. package/dist/plugin-sdk/index.js +29 -29
  307. package/dist/plugin-sdk/json-store.js +6 -6
  308. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  309. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  310. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  311. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  312. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  313. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  314. package/dist/plugin-sdk/{monitor-B9Cmt_Je.js → monitor-BCFDaqJ-.js} +31 -31
  315. package/dist/plugin-sdk/{monitor-B71iwAgC.js → monitor-BgbjRiPM.js} +32 -32
  316. package/dist/plugin-sdk/{openresponses-http-Du4GMmwo.js → openresponses-http-DFf87SMM.js} +27 -27
  317. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  318. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  319. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  320. package/dist/plugin-sdk/{pairing-message-BMkkS038.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  321. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  322. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  323. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  324. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  325. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  326. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  327. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  328. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  329. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  330. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  331. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  332. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  333. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  334. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  335. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  336. package/dist/plugin-sdk/sat-runtime.js +29 -29
  337. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  338. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  339. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  340. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  341. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  342. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  343. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  344. package/dist/plugin-sdk/{slack-D_bbE6Yd.js → slack-BUTt8cxK.js} +39 -39
  345. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  346. package/dist/plugin-sdk/slack.d.ts +5 -5
  347. package/dist/plugin-sdk/slack.js +9 -9
  348. package/dist/plugin-sdk/{sticker-cache-Dqo9nRhi.js → sticker-cache-D0wHVqjt.js} +3 -3
  349. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  350. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  351. package/dist/plugin-sdk/{telegram-actions-Cnag7JTH.js → telegram-actions-CC_qN4v0.js} +30 -30
  352. package/dist/plugin-sdk/telegram.d.ts +5 -5
  353. package/dist/plugin-sdk/telegram.js +8 -8
  354. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  355. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  356. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  357. package/dist/plugin-sdk/{types-CLIvQaVg.d.ts → types-C3avNytw.d.ts} +3 -4
  358. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  359. package/dist/plugin-sdk/{types-BYDL6dQj.d.ts → types-DWfbSAaM.d.ts} +2 -2
  360. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  361. package/dist/plugin-sdk/{web-BInKQkc4.js → web-BXsJ1vqe.js} +32 -32
  362. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  363. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  364. package/dist/plugin-sdk/whatsapp.d.ts +5 -5
  365. package/dist/plugin-sdk/whatsapp.js +12 -12
  366. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  367. package/dist/plugins/bundled-dir.js +3 -3
  368. package/dist/plugins/discovery.js +11 -11
  369. package/dist/plugins/loader.js +13 -13
  370. package/dist/plugins/manifest-registry.js +2 -2
  371. package/dist/plugins/manifest.js +4 -4
  372. package/dist/plugins/path-safety.js +3 -3
  373. package/dist/plugins/status-cache.js +9 -9
  374. package/dist/plugins/update.js +3 -3
  375. package/dist/plugins/web-search-install-catalog.js +3 -3
  376. package/dist/providers/refresh.js +1 -1
  377. package/dist/providers/registry.js +1 -1
  378. package/dist/secrets/apply.js +17 -17
  379. package/dist/secrets/audit.js +11 -11
  380. package/dist/secrets/runtime.js +1 -1
  381. package/dist/secrets/shared.js +9 -9
  382. package/dist/security/scan-paths.js +2 -2
  383. package/dist/shared/config-eval.js +2 -2
  384. package/dist/shared/pid-alive.js +2 -2
  385. package/dist/tasks/standing-orders.js +5 -5
  386. package/dist/tasks/task-flow-registry.js +5 -5
  387. package/dist/tasks/task-registry.js +5 -5
  388. package/dist/tasks/workflow-definitions.js +6 -6
  389. package/dist/telegram/token.js +5 -5
  390. package/dist/utils.js +5 -5
  391. package/dist/wallet/external-submission-ledger.js +376 -0
  392. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  393. package/dist/wallet/local-socket-signer-archive.js +30 -0
  394. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  395. package/dist/wallet/local-socket-signer-policy.js +166 -0
  396. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  397. package/dist/wallet/native-signer-wallet-id.js +25 -0
  398. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  399. package/dist/wallet/providers/local-socket-signer-adapter.js +382 -107
  400. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  401. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  402. package/dist/wallet/signer-network-admin.js +184 -0
  403. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  404. package/dist/wallet/solana-bond-signing.js +157 -69
  405. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  406. package/dist/wallet/solana-swap.js +520 -64
  407. package/dist/wallet/solana-transaction-inspection.js +106 -4
  408. package/dist/wallet/solana-trigger.js +658 -320
  409. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  410. package/dist/wallet/wallet-approval-auth.js +20 -31
  411. package/dist/wallet/wallet-atomic-state.js +53 -0
  412. package/dist/wallet/wallet-audit-log.js +5 -5
  413. package/dist/wallet/wallet-canary.js +0 -1
  414. package/dist/wallet/wallet-inbound-events.js +19 -14
  415. package/dist/wallet/wallet-observability.js +5 -5
  416. package/dist/wallet/wallet-policy-simulation.js +1 -1
  417. package/dist/wallet/wallet-policy.js +95 -41
  418. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  419. package/dist/wallet/wallet-provider-registry.js +64 -51
  420. package/dist/wallet/wallet-provider-resolver.js +62 -63
  421. package/dist/wallet/wallet-runtime-config.js +31 -44
  422. package/dist/wallet/wallet-secrets-store.js +44 -22
  423. package/dist/wallet/wallet-send-approvals.js +1894 -592
  424. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  425. package/dist/wallet/wallet-settlement-links.js +17 -16
  426. package/dist/wallet/wallet-standard-review.js +353 -0
  427. package/dist/wallet/wallet-status.js +0 -9
  428. package/dist/wallet/wallet-task-ledger.js +16 -2
  429. package/dist/web/accounts.js +3 -3
  430. package/dist/web/auth-store.js +18 -18
  431. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  432. package/dist/web/auto-reply/monitor.js +2 -2
  433. package/dist/web/session.js +4 -4
  434. package/dist/wizard/host-security-capability.js +15 -24
  435. package/dist/wizard/onboarding.finalize.js +63 -184
  436. package/dist/wizard/onboarding.host-security.js +118 -1368
  437. package/dist/wizard/onboarding.js +180 -242
  438. package/dist/wizard/onboarding.wallet.js +323 -829
  439. package/extensions/acpx/package.json +1 -1
  440. package/extensions/bluebubbles/package.json +1 -1
  441. package/extensions/copilot-proxy/package.json +1 -1
  442. package/extensions/diagnostics-otel/package.json +1 -1
  443. package/extensions/fased-federation/package.json +1 -1
  444. package/extensions/google-gemini-cli-auth/package.json +1 -1
  445. package/extensions/imessage/package.json +1 -1
  446. package/extensions/irc/package.json +1 -1
  447. package/extensions/line/package.json +1 -1
  448. package/extensions/llm-task/package.json +1 -1
  449. package/extensions/lobster/package.json +1 -1
  450. package/extensions/matrix/CHANGELOG.md +18 -0
  451. package/extensions/matrix/package.json +1 -1
  452. package/extensions/mattermost/package.json +1 -1
  453. package/extensions/memory-core/package.json +2 -2
  454. package/extensions/memory-lancedb/package.json +1 -1
  455. package/extensions/minimax-portal-auth/package.json +1 -1
  456. package/extensions/msteams/CHANGELOG.md +18 -0
  457. package/extensions/msteams/package.json +1 -1
  458. package/extensions/nextcloud-talk/package.json +1 -1
  459. package/extensions/nostr/CHANGELOG.md +18 -0
  460. package/extensions/nostr/package.json +1 -1
  461. package/extensions/open-prose/package.json +1 -1
  462. package/extensions/sat-mining/index.ts +498 -153
  463. package/extensions/sat-mining/package.json +1 -1
  464. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  465. package/extensions/sat-mining/src/audit-store.ts +50 -5
  466. package/extensions/sat-mining/src/claim-service.ts +85 -14
  467. package/extensions/sat-mining/src/config.ts +9 -0
  468. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  469. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  470. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  471. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  472. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  473. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  474. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  475. package/extensions/sat-mining/src/runtime.ts +14 -0
  476. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  477. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  478. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  479. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  480. package/extensions/signal/package.json +1 -1
  481. package/extensions/synology-chat/package.json +1 -1
  482. package/extensions/tlon/package.json +1 -1
  483. package/extensions/twitch/CHANGELOG.md +18 -0
  484. package/extensions/twitch/package.json +1 -1
  485. package/extensions/voice-call/CHANGELOG.md +18 -0
  486. package/extensions/voice-call/package.json +1 -1
  487. package/extensions/zalo/CHANGELOG.md +18 -0
  488. package/extensions/zalo/package.json +1 -1
  489. package/extensions/zalouser/CHANGELOG.md +18 -0
  490. package/extensions/zalouser/package.json +1 -1
  491. package/install.sh +4955 -0
  492. package/package.json +24 -5
  493. package/scripts/fased-host-updater.mjs +1421 -0
  494. package/scripts/fased-host-updaterctl.mjs +186 -0
  495. package/scripts/fased-managed-service.sh +36 -0
  496. package/scripts/fased-managed-updater.mjs +3065 -156
  497. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  498. package/scripts/fased-signer-network-hosting.sh +143 -0
  499. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  500. package/scripts/fased-signer-policy-hosting.sh +50 -0
  501. package/scripts/fased-signer-policy-local.sh +26 -0
  502. package/scripts/hosted-release-manifest.mjs +185 -0
  503. package/scripts/install-fased-signerd.sh +217 -0
  504. package/scripts/install-managed-runtime.mjs +212 -10
  505. package/scripts/managed-runtime-layout.mjs +75 -3
  506. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  507. package/scripts/start-managed.sh +169 -360
  508. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  509. package/dist/plugin-sdk/tmp-fased-dir-BdFQvrvw.d.ts +0 -77
  510. package/dist/wallet/local-socket-signer-broker.js +0 -224
  511. package/dist/wallet/local-socket-signer-custody.js +0 -42
  512. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  513. package/dist/wallet/providers/privy-adapter.js +0 -80
  514. 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 fs from "node:fs";
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 = fs.readFileSync(filePath, "utf8");
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 = fs.realpathSync.native?.(pluginRoot) ?? fs.realpathSync(pluginRoot);
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
  });
@@ -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,
@@ -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 fs from "node:fs";
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
- fs.closeSync(guarded.fd);
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 fs from "node:fs";
1
+ import syncFs from "node:fs";
2
2
  import path from "node:path";
3
- import fs$1 from "node:fs/promises";
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$1.readdir(agentsDir, { withFileTypes: true });
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 = fs.readdirSync(agentsDir, { withFileTypes: true });
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 fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import path from "node:path";
5
- import fs$1 from "node:fs/promises";
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$1.rm(held.lockPath, { force: true });
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
- fs.rmSync(held.lockPath, { force: true });
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$1.readFile(lockPath, "utf8");
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$1.stat(lockPath);
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$1.readdir(sessionsDir, { withFileTypes: true });
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$1.rm(lockPath, { force: true });
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$1.mkdir(sessionDir, { recursive: true });
287
+ await fs.mkdir(sessionDir, { recursive: true });
288
288
  let normalizedDir = sessionDir;
289
289
  try {
290
- normalizedDir = await fs$1.realpath(sessionDir);
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$1.open(lockPath, "wx");
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$1.rm(lockPath, { force: true });
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$1.rm(lockPath, { force: true });
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 fs from "node:fs";
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 (fs.existsSync(pwsh7)) {
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 (fs.existsSync(pwsh7Alt)) {
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 (fs.existsSync(candidate)) {
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
- fs.accessSync(candidate, fs.constants.X_OK);
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 fs from "node:fs";
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 = fs.readdirSync(dir, { withFileTypes: true });
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 (fs.existsSync(path.join(fullPath, "SKILL.md"))) {
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 (fs.existsSync(sibling)) {
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 { 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 };
@@ -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 fs from "node:fs";
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 fs.readFileSync(opened.fd, "utf8");
25
+ return syncFs.readFileSync(opened.fd, "utf8");
26
26
  } finally {
27
- fs.closeSync(opened.fd);
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 fs.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));
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 = fs.realpathSync(rootDir);
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 = fs.realpathSync(path.resolve(params.rootDir));
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 fs from "node:fs";
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 (!fs.existsSync(candidate)) {
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 };