@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
@@ -2,21 +2,23 @@ import { CONFIG_DIR, resolveUserPath } from "../../utils.js";
2
2
  import { createSubsystemLogger } from "../../logging/subsystem.js";
3
3
  import { normalizeSkillFilter } from "./filter.js";
4
4
  import { resolveEffectiveAgentSkillFilter } from "./agent-filter.js";
5
+ import { isMarketplaceSkillDir, marketplaceSkillIdsFromEntries } from "./trust.js";
5
6
  import { resolveSandboxPath } from "../sandbox-paths.js";
6
7
  import { parseFrontmatter, resolveFasedAgentMetadata, resolveSkillInvocationPolicy, resolveSkillKey } from "./frontmatter.js";
7
8
  import { shouldIncludeSkill } from "./config.js";
8
9
  import { resolveBundledSkillsDir } from "./bundled-dir.js";
9
10
  import { resolvePluginSkillDirs } from "./plugin-skills.js";
10
11
  import { serializeByKey } from "./serialize.js";
11
- import fs from "node:fs";
12
+ import syncFs from "node:fs";
12
13
  import os from "node:os";
13
14
  import path from "node:path";
14
15
  import { formatSkillsForPrompt, loadSkillsFromDir } from "@mariozechner/pi-coding-agent";
15
16
 
16
17
  //#region src/agents/skills/workspace.ts
17
- const fsp = fs.promises;
18
+ const fsp = syncFs.promises;
18
19
  const skillsLogger = createSubsystemLogger("skills");
19
20
  const skillCommandDebugOnce = new Set();
21
+ const CLAUDE_BUNDLE_MANIFEST_MAX_BYTES = 64 * 1024;
20
22
  /**
21
23
  * Replace the user's home directory prefix with `~` in skill file paths
22
24
  * to reduce system prompt token usage. Models understand `~` expansion,
@@ -84,10 +86,10 @@ function isPathWithinRoot(candidatePath, rootPath) {
84
86
  let candidate = path.resolve(candidatePath);
85
87
  let root = path.resolve(rootPath);
86
88
  try {
87
- candidate = fs.realpathSync.native(candidate);
89
+ candidate = syncFs.realpathSync.native(candidate);
88
90
  } catch {}
89
91
  try {
90
- root = fs.realpathSync.native(root);
92
+ root = syncFs.realpathSync.native(root);
91
93
  } catch {}
92
94
  const relative = path.relative(root, candidate);
93
95
  return relative === "" || !relative.startsWith("..") && !path.isAbsolute(relative);
@@ -135,7 +137,7 @@ function resolveSkillsLimits(config) {
135
137
  }
136
138
  function listChildDirectories(dir) {
137
139
  try {
138
- const entries = fs.readdirSync(dir, { withFileTypes: true });
140
+ const entries = syncFs.readdirSync(dir, { withFileTypes: true });
139
141
  const dirs = [];
140
142
  for (const entry of entries) {
141
143
  if (entry.name.startsWith(".")) continue;
@@ -147,7 +149,7 @@ function listChildDirectories(dir) {
147
149
  }
148
150
  if (entry.isSymbolicLink()) {
149
151
  try {
150
- if (fs.statSync(fullPath).isDirectory()) {
152
+ if (syncFs.statSync(fullPath).isDirectory()) {
151
153
  dirs.push(entry.name);
152
154
  }
153
155
  } catch {}
@@ -161,7 +163,7 @@ function listChildDirectories(dir) {
161
163
  function resolveNestedSkillsRoot(dir, opts) {
162
164
  const nested = path.join(dir, "skills");
163
165
  try {
164
- if (!fs.existsSync(nested) || !fs.statSync(nested).isDirectory()) {
166
+ if (!syncFs.existsSync(nested) || !syncFs.statSync(nested).isDirectory()) {
165
167
  return { baseDir: dir };
166
168
  }
167
169
  } catch {
@@ -172,7 +174,7 @@ function resolveNestedSkillsRoot(dir, opts) {
172
174
  const toScan = scanLimit === 0 ? [] : nestedDirs.slice(0, Math.min(nestedDirs.length, scanLimit));
173
175
  for (const name of toScan) {
174
176
  const skillMd = path.join(nested, name, "SKILL.md");
175
- if (fs.existsSync(skillMd)) {
177
+ if (syncFs.existsSync(skillMd)) {
176
178
  return {
177
179
  baseDir: nested,
178
180
  note: `Detected nested skills root at ${nested}`
@@ -199,9 +201,9 @@ function loadSkillEntries(workspaceDir, opts) {
199
201
  const resolved = resolveNestedSkillsRoot(params.dir, { maxEntriesToScan: limits.maxCandidatesPerRoot });
200
202
  const baseDir = resolved.baseDir;
201
203
  const rootSkillMd = path.join(baseDir, "SKILL.md");
202
- if (fs.existsSync(rootSkillMd)) {
204
+ if (syncFs.existsSync(rootSkillMd)) {
203
205
  try {
204
- const size = fs.statSync(rootSkillMd).size;
206
+ const size = syncFs.statSync(rootSkillMd).size;
205
207
  if (size > limits.maxSkillFileBytes) {
206
208
  skillsLogger.warn("Skipping skills root due to oversized SKILL.md.", {
207
209
  dir: baseDir,
@@ -244,11 +246,11 @@ function loadSkillEntries(workspaceDir, opts) {
244
246
  for (const name of limitedChildren) {
245
247
  const skillDir = path.join(baseDir, name);
246
248
  const skillMd = path.join(skillDir, "SKILL.md");
247
- if (!fs.existsSync(skillMd)) {
249
+ if (!syncFs.existsSync(skillMd)) {
248
250
  continue;
249
251
  }
250
252
  try {
251
- const size = fs.statSync(skillMd).size;
253
+ const size = syncFs.statSync(skillMd).size;
252
254
  if (size > limits.maxSkillFileBytes) {
253
255
  skillsLogger.warn("Skipping skill due to oversized SKILL.md.", {
254
256
  skill: name,
@@ -336,7 +338,7 @@ function loadSkillEntries(workspaceDir, opts) {
336
338
  const skillEntries = Array.from(merged.values()).map((skill) => {
337
339
  let frontmatter = {};
338
340
  try {
339
- const raw = fs.readFileSync(skill.filePath, "utf-8");
341
+ const raw = syncFs.readFileSync(skill.filePath, "utf-8");
340
342
  frontmatter = parseFrontmatter(raw);
341
343
  } catch {}
342
344
  return {
@@ -392,6 +394,7 @@ function buildWorkspaceSkillSnapshot(workspaceDir, opts) {
392
394
  })),
393
395
  ...skillFilter === undefined ? {} : { skillFilter },
394
396
  resolvedSkills,
397
+ marketplaceSkillIds: marketplaceSkillIdsFromEntries(eligible),
395
398
  version: opts?.snapshotVersion
396
399
  };
397
400
  }
@@ -407,6 +410,116 @@ function resolveEffectiveSkillFilter(opts) {
407
410
  }
408
411
  return undefined;
409
412
  }
413
+ function isExplicitlyEnabledClaudeBundle(pluginId, config) {
414
+ const plugins = config?.plugins;
415
+ if (plugins?.enabled === false || plugins?.deny?.includes(pluginId)) {
416
+ return false;
417
+ }
418
+ if (plugins?.allow?.length && !plugins.allow.includes(pluginId)) {
419
+ return false;
420
+ }
421
+ return plugins?.entries?.[pluginId]?.enabled === true;
422
+ }
423
+ function stripMarkdownFrontmatter(content) {
424
+ const normalized = content.replace(/\r\n?/gu, "\n");
425
+ if (!normalized.startsWith("---\n")) {
426
+ return normalized.trim();
427
+ }
428
+ const end = normalized.indexOf("\n---", 4);
429
+ if (end < 0) {
430
+ return "";
431
+ }
432
+ return normalized.slice(end + 4).replace(/^\n/u, "").trim();
433
+ }
434
+ function listImmediateDirectories(root) {
435
+ try {
436
+ return syncFs.readdirSync(root, { withFileTypes: true }).filter((entry) => entry.isDirectory() && !entry.isSymbolicLink()).map((entry) => path.join(root, entry.name));
437
+ } catch {
438
+ return [];
439
+ }
440
+ }
441
+ function loadClaudeBundleCommandSpecs(params) {
442
+ const roots = [
443
+ ...listImmediateDirectories(path.join(CONFIG_DIR, "extensions")),
444
+ ...listImmediateDirectories(path.join(params.workspaceDir, ".fased", "extensions")),
445
+ ...(params.config?.plugins?.load?.paths ?? []).map((entry) => resolveUserPath(entry))
446
+ ];
447
+ const seen = new Set();
448
+ const specs = [];
449
+ for (const unresolvedRoot of roots) {
450
+ let root;
451
+ try {
452
+ const stat = syncFs.lstatSync(unresolvedRoot);
453
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
454
+ continue;
455
+ }
456
+ root = syncFs.realpathSync(unresolvedRoot);
457
+ } catch {
458
+ continue;
459
+ }
460
+ if (seen.has(root) || isMarketplaceSkillDir(root)) {
461
+ continue;
462
+ }
463
+ seen.add(root);
464
+ const manifestPath = path.join(root, ".claude-plugin", "plugin.json");
465
+ let pluginId = "";
466
+ try {
467
+ const stat = syncFs.lstatSync(manifestPath);
468
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size <= 0 || stat.size > CLAUDE_BUNDLE_MANIFEST_MAX_BYTES) {
469
+ continue;
470
+ }
471
+ const manifest = JSON.parse(syncFs.readFileSync(manifestPath, "utf8"));
472
+ pluginId = typeof manifest.name === "string" ? manifest.name.trim() : "";
473
+ } catch {
474
+ continue;
475
+ }
476
+ if (!pluginId || !isExplicitlyEnabledClaudeBundle(pluginId, params.config)) {
477
+ continue;
478
+ }
479
+ const commandsDir = path.join(root, "commands");
480
+ let entries;
481
+ try {
482
+ const stat = syncFs.lstatSync(commandsDir);
483
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
484
+ continue;
485
+ }
486
+ entries = syncFs.readdirSync(commandsDir, { withFileTypes: true });
487
+ } catch {
488
+ continue;
489
+ }
490
+ for (const entry of entries.filter((candidate) => candidate.isFile() && !candidate.isSymbolicLink()).toSorted((left, right) => left.name.localeCompare(right.name)).slice(0, params.maxCandidates)) {
491
+ if (path.extname(entry.name).toLowerCase() !== ".md") {
492
+ continue;
493
+ }
494
+ const filePath = path.join(commandsDir, entry.name);
495
+ let content;
496
+ try {
497
+ const stat = syncFs.lstatSync(filePath);
498
+ if (stat.size <= 0 || stat.size > params.maxFileBytes) {
499
+ continue;
500
+ }
501
+ content = syncFs.readFileSync(filePath, "utf8");
502
+ } catch {
503
+ continue;
504
+ }
505
+ const frontmatter = parseFrontmatter(content);
506
+ const skillName = frontmatter.name?.trim();
507
+ const description = frontmatter.description?.trim();
508
+ const promptTemplate = stripMarkdownFrontmatter(content);
509
+ if (!skillName || !description || !promptTemplate) {
510
+ continue;
511
+ }
512
+ specs.push({
513
+ name: sanitizeSkillCommandName(skillName),
514
+ skillName,
515
+ description: description.length > SKILL_COMMAND_DESCRIPTION_MAX_LENGTH ? `${description.slice(0, SKILL_COMMAND_DESCRIPTION_MAX_LENGTH - 1)}…` : description,
516
+ promptTemplate,
517
+ sourceFilePath: filePath
518
+ });
519
+ }
520
+ }
521
+ return specs;
522
+ }
410
523
  function resolveWorkspaceSkillPromptState(workspaceDir, opts) {
411
524
  const skillEntries = opts?.entries ?? loadSkillEntries(workspaceDir, opts);
412
525
  const eligible = filterSkillEntries(skillEntries, opts?.config, resolveEffectiveSkillFilter(opts), opts?.eligibility);
@@ -599,9 +712,24 @@ function buildWorkspaceSkillCommandSpecs(workspaceDir, opts) {
599
712
  name: unique,
600
713
  skillName: rawName,
601
714
  description,
715
+ sourceFilePath: entry.skill.filePath,
602
716
  ...dispatch ? { dispatch } : {}
603
717
  });
604
718
  }
719
+ const limits = resolveSkillsLimits(opts?.config);
720
+ for (const bundleCommand of loadClaudeBundleCommandSpecs({
721
+ workspaceDir,
722
+ config: opts?.config,
723
+ maxCandidates: limits.maxCandidatesPerRoot,
724
+ maxFileBytes: limits.maxSkillFileBytes
725
+ })) {
726
+ const unique = resolveUniqueSkillCommandName(bundleCommand.name, used);
727
+ used.add(unique.toLowerCase());
728
+ specs.push({
729
+ ...bundleCommand,
730
+ name: unique
731
+ });
732
+ }
605
733
  return specs;
606
734
  }
607
735
 
@@ -163,9 +163,17 @@ async function resolveInstallVersion(params) {
163
163
  if (!resolvedVersion) {
164
164
  throw new Error(`Skill "${params.slug}" has no installable version.`);
165
165
  }
166
+ const versionMetadataMatches = detail.latestVersion?.version === resolvedVersion;
167
+ const expectedIntegrity = versionMetadataMatches ? detail.latestVersion?.integrity : undefined;
168
+ const expectedSha256 = versionMetadataMatches ? detail.latestVersion?.sha256 : undefined;
169
+ if (!expectedIntegrity && !expectedSha256) {
170
+ throw new Error(`Skill "${params.slug}"@${resolvedVersion} has no registry-published archive digest; refusing an unverifiable install.`);
171
+ }
166
172
  return {
167
173
  detail,
168
- version: resolvedVersion
174
+ version: resolvedVersion,
175
+ expectedIntegrity,
176
+ expectedSha256
169
177
  };
170
178
  }
171
179
  async function installExtractedSkill(params) {
@@ -259,10 +267,10 @@ function buildMarketplaceUpdateReview(params) {
259
267
  message: finding.message
260
268
  }));
261
269
  const reasons = [];
262
- if (params.isUpdate && params.permissions.risky && permissionDigestChanged) {
270
+ if (params.permissions.risky && permissionDigestChanged) {
263
271
  reasons.push("requested permissions changed");
264
272
  }
265
- if (params.isUpdate && addedScanFindings.length > 0) {
273
+ if (addedScanFindings.length > 0) {
266
274
  reasons.push("archive scan added reviewable findings");
267
275
  }
268
276
  return {
@@ -278,7 +286,7 @@ function buildMarketplaceUpdateReview(params) {
278
286
  }
279
287
  function assertUpdateReviewAllowed(params) {
280
288
  if (params.review.approvalRequired && params.allowPermissionChanges !== true) {
281
- throw new Error(`ClawHub skill update requires permission review (${params.review.reasons.join(", ")}); rerun with explicit permission-change approval.`);
289
+ throw new Error(`ClawHub skill install or update requires permission review (${params.review.reasons.join(", ")}); rerun with explicit permission-change approval.`);
282
290
  }
283
291
  }
284
292
  async function performClawHubSkillInstall(params) {
@@ -289,7 +297,7 @@ async function performClawHubSkillInstall(params) {
289
297
  allowRegistries: params.allowRegistries,
290
298
  allowTrackedLegacyOrigin: params.force && Boolean(params.previousOrigin)
291
299
  });
292
- const { detail, version } = await resolveInstallVersion({
300
+ const { detail, version, expectedIntegrity, expectedSha256 } = await resolveInstallVersion({
293
301
  slug: params.slug,
294
302
  version: params.version,
295
303
  baseUrl: params.baseUrl
@@ -305,12 +313,15 @@ async function performClawHubSkillInstall(params) {
305
313
  const archive = await downloadClawHubSkillArchive({
306
314
  slug: params.slug,
307
315
  version,
308
- baseUrl: params.baseUrl
316
+ baseUrl: params.baseUrl,
317
+ expectedIntegrity,
318
+ expectedSha256
309
319
  });
310
320
  try {
311
321
  let extractedPermissions = null;
312
322
  let archiveScan = null;
313
323
  let updateReview = null;
324
+ let contentSha256 = null;
314
325
  const install = await withExtractedArchiveRoot({
315
326
  archivePath: archive.archivePath,
316
327
  tempDirPrefix: "fased-skill-clawhub-",
@@ -327,6 +338,7 @@ async function performClawHubSkillInstall(params) {
327
338
  }
328
339
  params.logger?.info?.(`Marketplace archive scan for ${params.slug}: ${formatArchiveScanFindings(scan)}`);
329
340
  const inspection = await inspectSkillMarketplaceManifest(rootDir);
341
+ contentSha256 = await computeSkillFingerprint(rootDir);
330
342
  extractedPermissions = inspection.permissions;
331
343
  updateReview = buildMarketplaceUpdateReview({
332
344
  previousOrigin: params.previousOrigin,
@@ -360,6 +372,9 @@ async function performClawHubSkillInstall(params) {
360
372
  if (!updateReview) {
361
373
  throw new Error("failed to review marketplace skill update");
362
374
  }
375
+ if (!contentSha256) {
376
+ throw new Error("failed to fingerprint marketplace skill content");
377
+ }
363
378
  const installedAt = Date.now();
364
379
  await writeClawHubSkillOrigin(install.targetDir, {
365
380
  version: 1,
@@ -367,6 +382,9 @@ async function performClawHubSkillInstall(params) {
367
382
  slug: params.slug,
368
383
  installedVersion: version,
369
384
  installedAt,
385
+ archiveSha256: archive.sha256,
386
+ archiveIntegrityVerified: archive.integrityVerified,
387
+ contentSha256,
370
388
  permissions: extractedPermissions,
371
389
  installScan: archiveScan,
372
390
  lastUpdateReview: updateReview
@@ -374,7 +392,10 @@ async function performClawHubSkillInstall(params) {
374
392
  const lock = await readClawHubSkillsLockfile(params.workspaceDir);
375
393
  lock.skills[params.slug] = {
376
394
  version,
377
- installedAt
395
+ installedAt,
396
+ archiveSha256: archive.sha256,
397
+ archiveIntegrityVerified: archive.integrityVerified,
398
+ contentSha256
378
399
  };
379
400
  await writeClawHubSkillsLockfile(params.workspaceDir, lock);
380
401
  return {
@@ -432,7 +453,7 @@ async function previewTrackedSkillUpdateFromClawHub(params) {
432
453
  allowRegistries: params.allowRegistries,
433
454
  allowTrackedLegacyOrigin: Boolean(params.previousOrigin)
434
455
  });
435
- const { version } = await resolveInstallVersion({
456
+ const { version, expectedIntegrity, expectedSha256 } = await resolveInstallVersion({
436
457
  slug: params.slug,
437
458
  baseUrl: params.baseUrl
438
459
  });
@@ -440,7 +461,9 @@ async function previewTrackedSkillUpdateFromClawHub(params) {
440
461
  const archive = await downloadClawHubSkillArchive({
441
462
  slug: params.slug,
442
463
  version,
443
- baseUrl: params.baseUrl
464
+ baseUrl: params.baseUrl,
465
+ expectedIntegrity,
466
+ expectedSha256
444
467
  });
445
468
  try {
446
469
  const targetDir = resolveSkillInstallDir(params.workspaceDir, params.slug);
@@ -505,7 +528,7 @@ async function previewSkillInstallFromClawHub(params) {
505
528
  registry,
506
529
  allowRegistries: params.allowRegistries
507
530
  });
508
- const { detail, version } = await resolveInstallVersion({
531
+ const { detail, version, expectedIntegrity, expectedSha256 } = await resolveInstallVersion({
509
532
  slug,
510
533
  version: params.version,
511
534
  baseUrl: params.baseUrl
@@ -521,7 +544,9 @@ async function previewSkillInstallFromClawHub(params) {
521
544
  const archive = await downloadClawHubSkillArchive({
522
545
  slug,
523
546
  version,
524
- baseUrl: params.baseUrl
547
+ baseUrl: params.baseUrl,
548
+ expectedIntegrity,
549
+ expectedSha256
525
550
  });
526
551
  try {
527
552
  let permissions = null;
@@ -8,7 +8,7 @@ import { hasBinary } from "../shared/config-eval.js";
8
8
  import "./skills.js";
9
9
  import { formatInstallFailureMessage } from "./skills-install-output.js";
10
10
  import { resolveSkillToolsRootDir } from "./skills/tools-dir.js";
11
- import fs from "node:fs";
11
+ import syncFs from "node:fs";
12
12
  import path from "node:path";
13
13
  import { createHash } from "node:crypto";
14
14
  import { Readable } from "node:stream";
@@ -85,11 +85,11 @@ async function downloadFile(url, destPath, timeoutMs) {
85
85
  throw new Error(`Download failed (${response.status} ${response.statusText})`);
86
86
  }
87
87
  await ensureDir(path.dirname(destPath));
88
- const file = fs.createWriteStream(destPath);
88
+ const file = syncFs.createWriteStream(destPath);
89
89
  const body = response.body;
90
90
  const readable = isNodeReadableStream(body) ? body : Readable.fromWeb(body);
91
91
  await pipeline(readable, file);
92
- const stat = await fs.promises.stat(destPath);
92
+ const stat = await syncFs.promises.stat(destPath);
93
93
  return { bytes: stat.size };
94
94
  } finally {
95
95
  await release();
@@ -100,7 +100,7 @@ function normalizeHex(value) {
100
100
  }
101
101
  async function digestFile(filePath, algorithm, encoding) {
102
102
  const hash = createHash(algorithm);
103
- await pipeline(fs.createReadStream(filePath), hash);
103
+ await pipeline(syncFs.createReadStream(filePath), hash);
104
104
  return hash.digest(encoding);
105
105
  }
106
106
  async function verifyDownloadIntegrity(archivePath, spec) {
@@ -183,7 +183,7 @@ async function extractArchive(params) {
183
183
  };
184
184
  }
185
185
  const readArchiveFingerprint = async () => {
186
- const stat = await fs.promises.stat(archivePath);
186
+ const stat = await syncFs.promises.stat(archivePath);
187
187
  return {
188
188
  size: stat.size,
189
189
  mtimeMs: stat.mtimeMs
@@ -196,7 +196,7 @@ async function extractArchive(params) {
196
196
  for (const part of parts) {
197
197
  current = path.join(current, part);
198
198
  try {
199
- const stat = await fs.promises.lstat(current);
199
+ const stat = await syncFs.promises.lstat(current);
200
200
  if (stat.isSymbolicLink()) {
201
201
  throw new Error(`archive entry traverses symlink in destination: ${originalPath}`);
202
202
  }
@@ -352,7 +352,7 @@ async function installDownloadSpec(params) {
352
352
  try {
353
353
  targetDir = resolveDownloadTargetDir(entry, spec);
354
354
  await ensureDir(targetDir);
355
- const stat = await fs.promises.lstat(targetDir);
355
+ const stat = await syncFs.promises.lstat(targetDir);
356
356
  if (stat.isSymbolicLink()) {
357
357
  throw new Error(`targetDir is a symlink: ${targetDir}`);
358
358
  }
@@ -1,7 +1,7 @@
1
1
  import { hasBinary } from "../shared/config-eval.js";
2
2
  import "./skills.js";
3
3
  import { resolveBrewExecutable } from "../infra/brew.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-install-plan.ts
@@ -153,7 +153,7 @@ function candidateSkillBinPaths(bin) {
153
153
  function findSkillBinaryOutsidePath(bin) {
154
154
  for (const candidate of candidateSkillBinPaths(bin)) {
155
155
  try {
156
- if (fs.existsSync(candidate)) {
156
+ if (syncFs.existsSync(candidate)) {
157
157
  return candidate;
158
158
  }
159
159
  } catch {}
@@ -8,7 +8,7 @@ import { resolveBrewExecutable } from "../infra/brew.js";
8
8
  import { summarizeSkillInstallTrust } from "./skills-install-trust.js";
9
9
  import { formatInstallFailureMessage } from "./skills-install-output.js";
10
10
  import { installDownloadSpec } from "./skills-install-download.js";
11
- import fs from "node:fs";
11
+ import syncFs from "node:fs";
12
12
  import path from "node:path";
13
13
 
14
14
  //#region src/agents/skills-install.ts
@@ -236,7 +236,7 @@ function candidateBinPaths(bin) {
236
236
  function findBinaryOutsidePath(bin) {
237
237
  for (const candidate of candidateBinPaths(bin)) {
238
238
  try {
239
- if (fs.existsSync(candidate)) {
239
+ if (syncFs.existsSync(candidate)) {
240
240
  return candidate;
241
241
  }
242
242
  } catch {}
@@ -76,6 +76,25 @@ const SUSPICIOUS_SCRIPT_EXTENSIONS = new Set([
76
76
  ".sh",
77
77
  ".zsh"
78
78
  ]);
79
+ const REVIEWABLE_CODE_EXTENSIONS = new Set([
80
+ ".cjs",
81
+ ".go",
82
+ ".js",
83
+ ".jsx",
84
+ ".mjs",
85
+ ".py",
86
+ ".rb",
87
+ ".rs",
88
+ ".ts",
89
+ ".tsx"
90
+ ]);
91
+ const MARKDOWN_EXTENSIONS = new Set([".md", ".mdx"]);
92
+ const MARKDOWN_INSTRUCTION_RISKS = [
93
+ /ignore\s+(?:all\s+)?(?:previous|prior|system|developer)\s+instructions?/iu,
94
+ /(?:upload|send|exfiltrat|leak)[^\n]{0,80}(?:secret|credential|token|private\s+key|seed\s+phrase)/iu,
95
+ /(?:\.ssh|\.aws|\.gnupg|\.env|process\.env|private\s+key|seed\s+phrase)/iu,
96
+ /curl\s+[^\n|]{0,160}\|\s*(?:ba)?sh/iu
97
+ ];
79
98
  const DEPENDENCY_MANIFEST_FILE_NAMES = new Set([
80
99
  "Cargo.toml",
81
100
  "Gemfile",
@@ -132,6 +151,13 @@ function inspectMarketplaceFilePath(params) {
132
151
  path: params.path,
133
152
  message: `skill archive contains script file "${basename}"`
134
153
  });
154
+ } else if (REVIEWABLE_CODE_EXTENSIONS.has(ext)) {
155
+ addFinding(params.findings, {
156
+ severity: "warn",
157
+ code: "executable_source_file",
158
+ path: params.path,
159
+ message: `skill archive contains executable source file "${basename}"; review it before granting tools`
160
+ });
135
161
  }
136
162
  if (DEPENDENCY_MANIFEST_FILE_NAMES.has(basename)) {
137
163
  addFinding(params.findings, {
@@ -142,6 +168,22 @@ function inspectMarketplaceFilePath(params) {
142
168
  });
143
169
  }
144
170
  }
171
+ async function inspectMarketplaceMarkdown(params) {
172
+ const fullPath = path.join(params.rootDir, params.relativePath);
173
+ const stat = await fs.stat(fullPath);
174
+ if (stat.size > MAX_FILE_BYTES) {
175
+ return;
176
+ }
177
+ const content = await fs.readFile(fullPath, "utf8");
178
+ if (MARKDOWN_INSTRUCTION_RISKS.some((pattern) => pattern.test(content))) {
179
+ addFinding(params.findings, {
180
+ severity: "warn",
181
+ code: "instruction_risk",
182
+ path: toPosix(params.relativePath),
183
+ message: "skill instructions reference prompt overrides, secrets, sensitive paths, or shell-pipe execution; manual review is required"
184
+ });
185
+ }
186
+ }
145
187
  async function inspectMarketplaceSourceCode(params) {
146
188
  try {
147
189
  const summary = await scanDirectoryWithSummary(params.rootDir, {
@@ -289,6 +331,13 @@ async function scanSkillMarketplaceArchive(rootDir) {
289
331
  path: posixPath,
290
332
  findings
291
333
  });
334
+ if (MARKDOWN_EXTENSIONS.has(path.posix.extname(entry.name.toLowerCase()))) {
335
+ await inspectMarketplaceMarkdown({
336
+ rootDir,
337
+ relativePath,
338
+ findings
339
+ });
340
+ }
292
341
  }
293
342
  }
294
343
  await inspectMarketplaceSourceCode({
@@ -8,7 +8,7 @@ import { evaluateEntryRequirementsForCurrentPlatform } from "../shared/entry-sta
8
8
  import { resolveSkillInstallPlan } from "./skills-install-plan.js";
9
9
  import { summarizeSkillInstallTrust } from "./skills-install-trust.js";
10
10
  import { resolveBundledSkillsContext } from "./skills/bundled-context.js";
11
- import fs from "node:fs";
11
+ import syncFs from "node:fs";
12
12
  import path from "node:path";
13
13
 
14
14
  //#region src/agents/skills-status.ts
@@ -116,7 +116,7 @@ function readSkillMarketplaceStatus(skillDir) {
116
116
  const candidates = [path.join(skillDir, ".clawhub", "origin.json"), path.join(skillDir, ".clawdhub", "origin.json")];
117
117
  for (const candidate of candidates) {
118
118
  try {
119
- const raw = JSON.parse(fs.readFileSync(candidate, "utf8"));
119
+ const raw = JSON.parse(syncFs.readFileSync(candidate, "utf8"));
120
120
  if (raw.version !== 1 || typeof raw.registry !== "string" || typeof raw.slug !== "string" || typeof raw.installedVersion !== "string" || typeof raw.installedAt !== "number") {
121
121
  continue;
122
122
  }
@@ -1,7 +1,7 @@
1
1
  import { getSubagentDepth, parseAgentSessionKey } from "../sessions/session-key-utils.js";
2
2
  import { resolveDefaultAgentId } from "./agent-scope.js";
3
3
  import { resolveStorePath } from "../config/sessions/paths.js";
4
- import fs from "node:fs";
4
+ import syncFs from "node:fs";
5
5
  import JSON5 from "json5";
6
6
 
7
7
  //#region src/agents/subagent-depth.ts
@@ -28,7 +28,7 @@ function normalizeSessionKey(value) {
28
28
  }
29
29
  function readSessionStore(storePath) {
30
30
  try {
31
- const raw = fs.readFileSync(storePath, "utf-8");
31
+ const raw = syncFs.readFileSync(storePath, "utf-8");
32
32
  const parsed = JSON5.parse(raw);
33
33
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
34
34
  return parsed;
@@ -1,6 +1,6 @@
1
1
  import { formatUserTime, resolveUserTimeFormat, resolveUserTimezone } from "./date-time.js";
2
2
  import { findGitRoot } from "../infra/git-root.js";
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/system-prompt-params.ts
@@ -29,7 +29,7 @@ function resolveRepoRoot(params) {
29
29
  if (configured) {
30
30
  try {
31
31
  const resolved = path.resolve(configured);
32
- const stat = fs.statSync(resolved);
32
+ const stat = syncFs.statSync(resolved);
33
33
  if (stat.isDirectory()) {
34
34
  return resolved;
35
35
  }
@@ -417,7 +417,7 @@ function createMarketplaceSearchTool(params) {
417
417
  orders: orders.filter((entry) => {
418
418
  const paymentStatus = entry.order.paymentIntent?.status;
419
419
  const settlementStatus = entry.order.settlement?.status;
420
- return paymentStatus === "verified" || settlementStatus === "settled" || Boolean(entry.order.invoiceId || entry.order.receiptId || entry.order.txRef);
420
+ return paymentStatus === "verified" || settlementStatus === "settled" || settlementStatus === "verified";
421
421
  })
422
422
  });
423
423
  }
@@ -447,7 +447,7 @@ For scheduled or conditional automation, create a scheduled task whose isolated
447
447
  });
448
448
  }
449
449
  case "capital_init": return jsonResult(await callGateway("sat.initMinerCapital", gatewayOpts, { authority: readStringParam(params, "authority") }));
450
- case "reserve_top_up": return jsonResult(await callGateway("sat.bootstrapRegistryReserve", gatewayOpts, {}));
450
+ case "reserve_top_up": return jsonResult(await callGateway("sat.topUpRegistryReserve", gatewayOpts, { targetBalanceLamports: 0 }));
451
451
  case "deposit_capital": return jsonResult(await callGateway("sat.depositMinerCapital", gatewayOpts, { lamports: parseLamportsInput(params) }));
452
452
  case "withdraw_capital": return jsonResult(await callGateway("sat.withdrawMinerCapital", gatewayOpts, { lamports: parseLamportsInput(params) }));
453
453
  case "set_commit": return jsonResult(await callGateway("sat.setActiveCommit", gatewayOpts, {
@@ -119,7 +119,7 @@ async function resolveModelOverride(params) {
119
119
  throw new Error(`Unrecognized model "${raw}".`);
120
120
  }
121
121
  const key = modelKey(resolved.ref.provider, resolved.ref.model);
122
- if (allowed.allowedKeys.size > 0 && !allowed.allowedKeys.has(key)) {
122
+ if (!allowed.allowAny && !allowed.allowedKeys.has(key)) {
123
123
  throw new Error(`Model "${key}" is not allowed.`);
124
124
  }
125
125
  const isDefault = resolved.ref.provider === configDefault.provider && resolved.ref.model === configDefault.model;