@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,7 +2,7 @@ import { isKnownCoreToolId } from "../agents/tool-catalog.js";
2
2
  import { DANGEROUS_ACP_TOOLS } from "../security/dangerous-tools.js";
3
3
  import { ensureFasedAgentCliOnPath } from "../infra/path-env.js";
4
4
  import { fileURLToPath } from "node:url";
5
- import fs from "node:fs";
5
+ import syncFs from "node:fs";
6
6
  import { homedir } from "node:os";
7
7
  import path from "node:path";
8
8
  import { spawn } from "node:child_process";
@@ -269,7 +269,7 @@ function resolveSelfEntryPath() {
269
269
  try {
270
270
  const here = fileURLToPath(import.meta.url);
271
271
  const candidate = path.resolve(path.dirname(here), "..", "entry.js");
272
- if (fs.existsSync(candidate)) {
272
+ if (syncFs.existsSync(candidate)) {
273
273
  return candidate;
274
274
  }
275
275
  } catch {}
@@ -1,5 +1,5 @@
1
1
  import { resolveUserPath } from "../utils.js";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
 
4
4
  //#region src/acp/secret-file.ts
5
5
  function readSecretFromFile(filePath, label) {
@@ -9,7 +9,7 @@ function readSecretFromFile(filePath, label) {
9
9
  }
10
10
  let raw = "";
11
11
  try {
12
- raw = fs.readFileSync(resolvedPath, "utf8");
12
+ raw = syncFs.readFileSync(resolvedPath, "utf8");
13
13
  } catch (err) {
14
14
  throw new Error(`Failed to read ${label} file at ${resolvedPath}: ${String(err)}`, { cause: err });
15
15
  }
@@ -6,7 +6,7 @@ import { parseAgentSessionKey } from "../sessions/session-key-utils.js";
6
6
  import { DEFAULT_AGENT_ID, normalizeAgentId, resolveAgentIdFromSessionKey } from "../routing/session-key.js";
7
7
  import { resolveEffectiveAgentSkillFilter } from "./skills/agent-filter.js";
8
8
  import { resolveDefaultAgentWorkspaceDir } from "./workspace.js";
9
- import fs from "node:fs";
9
+ import syncFs from "node:fs";
10
10
  import path from "node:path";
11
11
 
12
12
  //#region src/agents/agent-scope.ts
@@ -245,7 +245,7 @@ function normalizePathForComparison(input) {
245
245
  const resolved = path.resolve(stripNullBytes(resolveUserPath(input)));
246
246
  let normalized = resolved;
247
247
  try {
248
- normalized = fs.realpathSync.native(resolved);
248
+ normalized = syncFs.realpathSync.native(resolved);
249
249
  } catch {}
250
250
  if (process.platform === "win32") {
251
251
  return normalized.toLowerCase();
@@ -3,9 +3,9 @@ import { PATH_ALIAS_POLICIES } from "../infra/path-alias-guards.js";
3
3
  import { writeFileWithinRoot } from "../infra/fs-safe.js";
4
4
  import { applyUpdateHunk } from "./apply-patch-update.js";
5
5
  import { assertSandboxPath, resolveSandboxInputPath } from "./sandbox-paths.js";
6
- import fs from "node:fs";
6
+ import syncFs from "node:fs";
7
7
  import path from "node:path";
8
- import fs$1 from "node:fs/promises";
8
+ import fs from "node:fs/promises";
9
9
  import { Type } from "@sinclair/typebox";
10
10
 
11
11
  //#region src/agents/apply-patch.ts
@@ -159,7 +159,7 @@ function resolvePatchFileOps(options) {
159
159
  return {
160
160
  readFile: async (filePath) => {
161
161
  if (!workspaceOnly) {
162
- return await fs$1.readFile(filePath, "utf8");
162
+ return await fs.readFile(filePath, "utf8");
163
163
  }
164
164
  const opened = await openBoundaryFile({
165
165
  absolutePath: filePath,
@@ -168,14 +168,14 @@ function resolvePatchFileOps(options) {
168
168
  });
169
169
  assertBoundaryRead(opened, filePath);
170
170
  try {
171
- return fs.readFileSync(opened.fd, "utf8");
171
+ return syncFs.readFileSync(opened.fd, "utf8");
172
172
  } finally {
173
- fs.closeSync(opened.fd);
173
+ syncFs.closeSync(opened.fd);
174
174
  }
175
175
  },
176
176
  writeFile: async (filePath, content) => {
177
177
  if (!workspaceOnly) {
178
- await fs$1.writeFile(filePath, content, "utf8");
178
+ await fs.writeFile(filePath, content, "utf8");
179
179
  return;
180
180
  }
181
181
  const relative = toRelativeWorkspacePath(options.cwd, filePath);
@@ -186,8 +186,8 @@ function resolvePatchFileOps(options) {
186
186
  encoding: "utf8"
187
187
  });
188
188
  },
189
- remove: (filePath) => fs$1.rm(filePath),
190
- mkdirp: (dir) => fs$1.mkdir(dir, { recursive: true }).then(() => {})
189
+ remove: (filePath) => fs.rm(filePath),
190
+ mkdirp: (dir) => fs.mkdir(dir, { recursive: true }).then(() => {})
191
191
  };
192
192
  }
193
193
  async function ensureDir(filePath, ops) {
@@ -2,7 +2,7 @@ import { resolveUserPath } from "../../utils.js";
2
2
  import { saveJsonFile } from "../../infra/json-file.js";
3
3
  import { AUTH_PROFILE_FILENAME, AUTH_STORE_VERSION, LEGACY_AUTH_FILENAME } from "./constants.js";
4
4
  import { resolveFasedAgentAgentDir } from "../agent-paths.js";
5
- import fs from "node:fs";
5
+ import syncFs from "node:fs";
6
6
  import path from "node:path";
7
7
 
8
8
  //#region src/agents/auth-profiles/paths.ts
@@ -19,7 +19,7 @@ function resolveAuthStorePathForDisplay(agentDir) {
19
19
  return pathname.startsWith("~") ? pathname : resolveUserPath(pathname);
20
20
  }
21
21
  function ensureAuthStoreFile(pathname) {
22
- if (fs.existsSync(pathname)) {
22
+ if (syncFs.existsSync(pathname)) {
23
23
  return;
24
24
  }
25
25
  const payload = {
@@ -1,11 +1,12 @@
1
1
  import { resolveOAuthPath } from "../../config/paths.js";
2
+ import { coerceSecretRef, isSecretRef } from "../../config/types.secrets.js";
2
3
  import { loadJsonFile, saveJsonFile } from "../../infra/json-file.js";
3
4
  import { AUTH_STORE_LOCK_OPTIONS, AUTH_STORE_VERSION, log } from "./constants.js";
4
5
  import { withFileLock } from "../../plugin-sdk/file-lock.js";
5
6
  import "../../infra/file-lock.js";
6
7
  import { syncExternalCliCredentials } from "./external-cli-sync.js";
7
8
  import { ensureAuthStoreFile, resolveAuthStorePath, resolveLegacyAuthStorePath } from "./paths.js";
8
- import fs from "node:fs";
9
+ import syncFs from "node:fs";
9
10
 
10
11
  //#region src/agents/auth-profiles/store.ts
11
12
  const AUTH_PROFILE_TYPES = new Set([
@@ -13,6 +14,18 @@ const AUTH_PROFILE_TYPES = new Set([
13
14
  "oauth",
14
15
  "token"
15
16
  ]);
17
+ const AUTH_PROFILE_FAILURE_REASONS = new Set([
18
+ "auth",
19
+ "auth_permanent",
20
+ "format",
21
+ "rate_limit",
22
+ "overloaded",
23
+ "billing",
24
+ "timeout",
25
+ "model_not_found",
26
+ "session_expired",
27
+ "unknown"
28
+ ]);
16
29
  const runtimeAuthStoreSnapshots = new Map();
17
30
  function resolveRuntimeStoreKey(agentDir) {
18
31
  return resolveAuthStorePath(agentDir);
@@ -89,8 +102,78 @@ function normalizeRawCredentialEntry(raw) {
89
102
  }
90
103
  return entry;
91
104
  }
92
- function parseCredentialEntry(raw, fallbackProvider) {
93
- if (!raw || typeof raw !== "object") {
105
+ function isRecord(value) {
106
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
107
+ }
108
+ function isUsableString(value) {
109
+ return typeof value === "string" && value.trim().length > 0;
110
+ }
111
+ function isOptionalString(value) {
112
+ return value === undefined || typeof value === "string";
113
+ }
114
+ function isOptionalFiniteNumber(value) {
115
+ return value === undefined || typeof value === "number" && Number.isFinite(value);
116
+ }
117
+ function isValidStringMetadata(value) {
118
+ return value === undefined || isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
119
+ }
120
+ function isSupportedStoredSecretRef(value) {
121
+ if (isSecretRef(value)) {
122
+ return true;
123
+ }
124
+ if (!isRecord(value)) {
125
+ return false;
126
+ }
127
+ const keys = Object.keys(value).toSorted();
128
+ return keys.length === 2 && keys[0] === "id" && keys[1] === "source" && coerceSecretRef(value) !== null;
129
+ }
130
+ function hasValidSecretMaterial(params) {
131
+ const valueIsValid = isUsableString(params.value) || isSupportedStoredSecretRef(params.value);
132
+ const refIsValid = isSupportedStoredSecretRef(params.ref);
133
+ return valueIsValid || refIsValid;
134
+ }
135
+ function isValidCredentialShape(entry, type) {
136
+ if (!isOptionalString(entry.email)) {
137
+ return "invalid_shape";
138
+ }
139
+ if (type === "api_key") {
140
+ if (entry.key !== undefined && typeof entry.key !== "string" && !isSupportedStoredSecretRef(entry.key) || entry.keyRef !== undefined && !isSupportedStoredSecretRef(entry.keyRef) || !isValidStringMetadata(entry.metadata)) {
141
+ return "invalid_shape";
142
+ }
143
+ return hasValidSecretMaterial({
144
+ value: entry.key,
145
+ ref: entry.keyRef
146
+ }) ? null : "missing_material";
147
+ }
148
+ if (type === "token") {
149
+ if (entry.token !== undefined && typeof entry.token !== "string" && !isSupportedStoredSecretRef(entry.token) || entry.tokenRef !== undefined && !isSupportedStoredSecretRef(entry.tokenRef) || !isOptionalFiniteNumber(entry.expires)) {
150
+ return "invalid_shape";
151
+ }
152
+ return hasValidSecretMaterial({
153
+ value: entry.token,
154
+ ref: entry.tokenRef
155
+ }) ? null : "missing_material";
156
+ }
157
+ if (!isUsableString(entry.access) || !isUsableString(entry.refresh) || typeof entry.expires !== "number" || !Number.isFinite(entry.expires)) {
158
+ return "missing_material";
159
+ }
160
+ for (const field of [
161
+ "clientId",
162
+ "enterpriseUrl",
163
+ "projectId",
164
+ "accountId"
165
+ ]) {
166
+ if (!isOptionalString(entry[field])) {
167
+ return "invalid_shape";
168
+ }
169
+ }
170
+ if (entry.availableModelIds !== undefined && (!Array.isArray(entry.availableModelIds) || !entry.availableModelIds.every((modelId) => isUsableString(modelId)))) {
171
+ return "invalid_shape";
172
+ }
173
+ return null;
174
+ }
175
+ function parseCredentialEntry(raw, fallbackProvider, options) {
176
+ if (!isRecord(raw)) {
94
177
  return {
95
178
  ok: false,
96
179
  reason: "non_object"
@@ -110,10 +193,21 @@ function parseCredentialEntry(raw, fallbackProvider) {
110
193
  reason: "missing_provider"
111
194
  };
112
195
  }
196
+ const type = typed.type;
197
+ if (options?.strict) {
198
+ const invalidReason = isValidCredentialShape(typed, type);
199
+ if (invalidReason) {
200
+ return {
201
+ ok: false,
202
+ reason: invalidReason
203
+ };
204
+ }
205
+ }
113
206
  return {
114
207
  ok: true,
115
208
  credential: {
116
209
  ...typed,
210
+ type,
117
211
  provider
118
212
  }
119
213
  };
@@ -133,8 +227,8 @@ function warnRejectedCredentialEntries(source, rejected) {
133
227
  keys: rejected.slice(0, 10).map((entry) => entry.key)
134
228
  });
135
229
  }
136
- function coerceLegacyStore(raw) {
137
- if (!raw || typeof raw !== "object") {
230
+ function coerceLegacyStore(raw, options) {
231
+ if (!isRecord(raw)) {
138
232
  return null;
139
233
  }
140
234
  const record = raw;
@@ -144,7 +238,7 @@ function coerceLegacyStore(raw) {
144
238
  const entries = {};
145
239
  const rejected = [];
146
240
  for (const [key, value] of Object.entries(record)) {
147
- const parsed = parseCredentialEntry(value, key);
241
+ const parsed = parseCredentialEntry(value, key, { strict: options?.rejectInvalidEntries === true });
148
242
  if (!parsed.ok) {
149
243
  rejected.push({
150
244
  key,
@@ -154,22 +248,96 @@ function coerceLegacyStore(raw) {
154
248
  }
155
249
  entries[key] = parsed.credential;
156
250
  }
251
+ if (options?.rejectInvalidEntries && rejected.length > 0) {
252
+ return null;
253
+ }
157
254
  warnRejectedCredentialEntries("auth.json", rejected);
158
- return Object.keys(entries).length > 0 ? entries : null;
255
+ return Object.keys(entries).length > 0 || options?.rejectInvalidEntries ? entries : null;
256
+ }
257
+ function isValidProfileOrder(value) {
258
+ if (value === undefined) {
259
+ return true;
260
+ }
261
+ if (!isRecord(value)) {
262
+ return false;
263
+ }
264
+ return Object.entries(value).every(([provider, profileIds]) => isUsableString(provider) && Array.isArray(profileIds) && profileIds.every((profileId) => isUsableString(profileId)));
265
+ }
266
+ function isValidLastGood(value) {
267
+ if (value === undefined) {
268
+ return true;
269
+ }
270
+ if (!isRecord(value)) {
271
+ return false;
272
+ }
273
+ return Object.entries(value).every(([provider, profileId]) => isUsableString(provider) && isUsableString(profileId));
159
274
  }
160
- function coerceAuthStore(raw) {
161
- if (!raw || typeof raw !== "object") {
275
+ function isValidFailureCounts(value) {
276
+ if (value === undefined) {
277
+ return true;
278
+ }
279
+ if (!isRecord(value)) {
280
+ return false;
281
+ }
282
+ return Object.entries(value).every(([reason, count]) => AUTH_PROFILE_FAILURE_REASONS.has(reason) && typeof count === "number" && Number.isFinite(count) && Number.isInteger(count) && count >= 0);
283
+ }
284
+ function isValidUsageStats(value) {
285
+ if (value === undefined) {
286
+ return true;
287
+ }
288
+ if (!isRecord(value)) {
289
+ return false;
290
+ }
291
+ return Object.entries(value).every(([profileId, stats]) => {
292
+ if (!isUsableString(profileId) || !isRecord(stats)) {
293
+ return false;
294
+ }
295
+ for (const field of [
296
+ "lastUsed",
297
+ "cooldownUntil",
298
+ "disabledUntil",
299
+ "lastFailureAt"
300
+ ]) {
301
+ if (!isOptionalFiniteNumber(stats[field])) {
302
+ return false;
303
+ }
304
+ }
305
+ if (stats.errorCount !== undefined && (typeof stats.errorCount !== "number" || !Number.isFinite(stats.errorCount) || !Number.isInteger(stats.errorCount) || stats.errorCount < 0)) {
306
+ return false;
307
+ }
308
+ for (const field of ["disabledReason", "cooldownReason"]) {
309
+ if (stats[field] !== undefined && (typeof stats[field] !== "string" || !AUTH_PROFILE_FAILURE_REASONS.has(stats[field]))) {
310
+ return false;
311
+ }
312
+ }
313
+ if (!isOptionalString(stats.cooldownModel) || !isValidFailureCounts(stats.failureCounts)) {
314
+ return false;
315
+ }
316
+ return true;
317
+ });
318
+ }
319
+ function hasValidStoreMetadata(record) {
320
+ return (record.version === undefined || typeof record.version === "number" && Number.isFinite(record.version) && Number.isInteger(record.version) && record.version >= 1 && record.version <= AUTH_STORE_VERSION) && isValidProfileOrder(record.order) && isValidLastGood(record.lastGood) && isValidUsageStats(record.usageStats);
321
+ }
322
+ function coerceAuthStore(raw, options) {
323
+ if (!isRecord(raw)) {
162
324
  return null;
163
325
  }
164
326
  const record = raw;
165
- if (!record.profiles || typeof record.profiles !== "object") {
327
+ if (!isRecord(record.profiles)) {
328
+ return null;
329
+ }
330
+ if (options?.rejectInvalidEntries && !hasValidStoreMetadata(record)) {
166
331
  return null;
167
332
  }
168
333
  const profiles = record.profiles;
169
334
  const normalized = {};
170
335
  const rejected = [];
171
336
  for (const [key, value] of Object.entries(profiles)) {
172
- const parsed = parseCredentialEntry(value);
337
+ const parsed = !options?.rejectInvalidEntries || isUsableString(key) ? parseCredentialEntry(value, undefined, { strict: options?.rejectInvalidEntries === true }) : {
338
+ ok: false,
339
+ reason: "invalid_shape"
340
+ };
173
341
  if (!parsed.ok) {
174
342
  rejected.push({
175
343
  key,
@@ -179,8 +347,11 @@ function coerceAuthStore(raw) {
179
347
  }
180
348
  normalized[key] = parsed.credential;
181
349
  }
350
+ if (options?.rejectInvalidEntries && rejected.length > 0) {
351
+ return null;
352
+ }
182
353
  warnRejectedCredentialEntries("auth-profiles.json", rejected);
183
- const order = record.order && typeof record.order === "object" ? Object.entries(record.order).reduce((acc, [provider, value]) => {
354
+ const order = options?.rejectInvalidEntries ? record.order : record.order && typeof record.order === "object" ? Object.entries(record.order).reduce((acc, [provider, value]) => {
184
355
  if (!Array.isArray(value)) {
185
356
  return acc;
186
357
  }
@@ -229,27 +400,68 @@ function mergeAuthProfileStores(base, override) {
229
400
  usageStats: mergeRecord(base.usageStats, override.usageStats)
230
401
  };
231
402
  }
232
- function mergeOAuthFileIntoStore(store) {
403
+ function readJsonFileForAuthRuntime(params) {
404
+ if (!params.strict) {
405
+ return loadJsonFile(params.pathname);
406
+ }
407
+ if (!syncFs.existsSync(params.pathname)) {
408
+ return undefined;
409
+ }
410
+ try {
411
+ return JSON.parse(syncFs.readFileSync(params.pathname, "utf8"));
412
+ } catch {
413
+ throw new Error(`${params.label} is unreadable or contains invalid JSON.`);
414
+ }
415
+ }
416
+ function mergeOAuthFileIntoStore(store, strict = false) {
233
417
  const oauthPath = resolveOAuthPath();
234
- const oauthRaw = loadJsonFile(oauthPath);
235
- if (!oauthRaw || typeof oauthRaw !== "object") {
418
+ const oauthRaw = readJsonFileForAuthRuntime({
419
+ pathname: oauthPath,
420
+ label: "OAuth credential store",
421
+ strict
422
+ });
423
+ if (oauthRaw === undefined) {
424
+ return false;
425
+ }
426
+ if (!oauthRaw || typeof oauthRaw !== "object" || Array.isArray(oauthRaw)) {
427
+ if (strict) {
428
+ throw new Error("OAuth credential store has an invalid structure.");
429
+ }
236
430
  return false;
237
431
  }
238
432
  const oauthEntries = oauthRaw;
239
433
  let mutated = false;
240
- for (const [provider, creds] of Object.entries(oauthEntries)) {
241
- if (!creds || typeof creds !== "object") {
434
+ for (const [provider, rawCreds] of Object.entries(oauthEntries)) {
435
+ if (!isRecord(rawCreds)) {
436
+ if (strict) {
437
+ throw new Error("OAuth credential store has an invalid credential entry.");
438
+ }
242
439
  continue;
243
440
  }
441
+ const creds = rawCreds;
442
+ let credential;
443
+ if (strict) {
444
+ const parsed = parseCredentialEntry({
445
+ ...creds,
446
+ type: "oauth",
447
+ provider
448
+ }, undefined, { strict: true });
449
+ if (!parsed.ok) {
450
+ throw new Error("OAuth credential store has an invalid credential entry.");
451
+ }
452
+ credential = parsed.credential;
453
+ } else {
454
+ credential = {
455
+ ...creds,
456
+ type: "oauth",
457
+ provider
458
+ };
459
+ }
244
460
  const profileId = `${provider}:default`;
245
461
  if (store.profiles[profileId]) {
246
462
  continue;
247
463
  }
248
- store.profiles[profileId] = {
249
- type: "oauth",
250
- provider,
251
- ...creds
252
- };
464
+ store.profiles[profileId] = credential;
253
465
  mutated = true;
254
466
  }
255
467
  return mutated;
@@ -261,8 +473,10 @@ function applyLegacyStore(store, legacy) {
261
473
  store.profiles[profileId] = {
262
474
  type: "api_key",
263
475
  provider: String(cred.provider ?? provider),
264
- key: cred.key,
265
- ...cred.email ? { email: cred.email } : {}
476
+ ...cred.key !== undefined ? { key: cred.key } : {},
477
+ ...cred.keyRef ? { keyRef: cred.keyRef } : {},
478
+ ...cred.email ? { email: cred.email } : {},
479
+ ...cred.metadata ? { metadata: cred.metadata } : {}
266
480
  };
267
481
  continue;
268
482
  }
@@ -270,7 +484,8 @@ function applyLegacyStore(store, legacy) {
270
484
  store.profiles[profileId] = {
271
485
  type: "token",
272
486
  provider: String(cred.provider ?? provider),
273
- token: cred.token,
487
+ ...cred.token !== undefined ? { token: cred.token } : {},
488
+ ...cred.tokenRef ? { tokenRef: cred.tokenRef } : {},
274
489
  ...typeof cred.expires === "number" ? { expires: cred.expires } : {},
275
490
  ...cred.email ? { email: cred.email } : {}
276
491
  };
@@ -289,9 +504,20 @@ function applyLegacyStore(store, legacy) {
289
504
  };
290
505
  }
291
506
  }
292
- function loadCoercedStore(authPath) {
293
- const raw = loadJsonFile(authPath);
294
- return coerceAuthStore(raw);
507
+ function loadCoercedStore(authPath, strict = false) {
508
+ const raw = readJsonFileForAuthRuntime({
509
+ pathname: authPath,
510
+ label: "Auth profile store",
511
+ strict
512
+ });
513
+ if (raw === undefined) {
514
+ return null;
515
+ }
516
+ const store = coerceAuthStore(raw, { rejectInvalidEntries: strict });
517
+ if (!store && strict) {
518
+ throw new Error("Auth profile store has an invalid structure or credential entry.");
519
+ }
520
+ return store;
295
521
  }
296
522
  function loadAuthProfileStore() {
297
523
  const authPath = resolveAuthStorePath();
@@ -323,8 +549,9 @@ function loadAuthProfileStore() {
323
549
  }
324
550
  function loadAuthProfileStoreForAgent(agentDir, options) {
325
551
  const readOnly = options?.readOnly === true;
552
+ const strict = options?.strict === true;
326
553
  const authPath = resolveAuthStorePath(agentDir);
327
- const asStore = loadCoercedStore(authPath);
554
+ const asStore = loadCoercedStore(authPath, strict);
328
555
  if (asStore) {
329
556
  const synced = shouldSyncExternalCliCredentials(options) ? syncExternalCliCredentials(asStore) : false;
330
557
  if (synced && !readOnly) {
@@ -342,8 +569,16 @@ function loadAuthProfileStoreForAgent(agentDir, options) {
342
569
  return mainStore;
343
570
  }
344
571
  }
345
- const legacyRaw = loadJsonFile(resolveLegacyAuthStorePath(agentDir));
346
- const legacy = coerceLegacyStore(legacyRaw);
572
+ const legacyPath = resolveLegacyAuthStorePath(agentDir);
573
+ const legacyRaw = readJsonFileForAuthRuntime({
574
+ pathname: legacyPath,
575
+ label: "Legacy auth profile store",
576
+ strict
577
+ });
578
+ const legacy = coerceLegacyStore(legacyRaw, { rejectInvalidEntries: strict });
579
+ if (legacyRaw !== undefined && !legacy && strict) {
580
+ throw new Error("Legacy auth profile store has an invalid structure or credential entry.");
581
+ }
347
582
  const store = {
348
583
  version: AUTH_STORE_VERSION,
349
584
  profiles: {}
@@ -351,7 +586,7 @@ function loadAuthProfileStoreForAgent(agentDir, options) {
351
586
  if (legacy) {
352
587
  applyLegacyStore(store, legacy);
353
588
  }
354
- const mergedOAuth = mergeOAuthFileIntoStore(store);
589
+ const mergedOAuth = mergeOAuthFileIntoStore(store, strict);
355
590
  const syncedCli = shouldSyncExternalCliCredentials(options) ? syncExternalCliCredentials(store) : false;
356
591
  const forceReadOnly = process.env.FASED_AUTH_STORE_READONLY === "1";
357
592
  const shouldWrite = !readOnly && !forceReadOnly && (legacy !== null || mergedOAuth || syncedCli);
@@ -361,7 +596,7 @@ function loadAuthProfileStoreForAgent(agentDir, options) {
361
596
  if (shouldWrite && legacy !== null) {
362
597
  const legacyPath = resolveLegacyAuthStorePath(agentDir);
363
598
  try {
364
- fs.unlinkSync(legacyPath);
599
+ syncFs.unlinkSync(legacyPath);
365
600
  } catch (err) {
366
601
  if (err?.code !== "ENOENT") {
367
602
  log.warn("failed to delete legacy auth.json after migration", {
@@ -389,6 +624,7 @@ function loadAuthProfileStoreForRuntime(agentDir, options) {
389
624
  function loadAuthProfileStoreForSecretsRuntime(agentDir) {
390
625
  return loadAuthProfileStoreForRuntime(agentDir, {
391
626
  readOnly: true,
627
+ strict: true,
392
628
  allowKeychainPrompt: false
393
629
  });
394
630
  }
@@ -11,6 +11,7 @@ import { buildSandboxEnv, clampWithDefault, coerceEnv, readEnvInt, resolveSandbo
11
11
  import { DEFAULT_MAX_OUTPUT, DEFAULT_PATH, DEFAULT_PENDING_MAX_OUTPUT, applyShellPath, execSchema, normalizeExecAsk, normalizeExecSecurity, normalizeExecTarget, resolveApprovalRunningNoticeMs, resolveExecTarget, runExecProcess, sanitizeHostBaseEnv, validateHostEnv } from "./bash-tools.exec-runtime.js";
12
12
  import { processGatewayAllowlist } from "./bash-tools.exec-host-gateway.js";
13
13
  import { executeNodeHostCommand } from "./bash-tools.exec-host-node.js";
14
+ import { getActiveSkillEnvOverrides } from "./skills/env-overrides.js";
14
15
  import path from "node:path";
15
16
 
16
17
  //#region src/agents/bash-tools.exec.ts
@@ -260,16 +261,21 @@ function createExecTool(defaults) {
260
261
  }
261
262
  const inheritedBaseEnv = coerceEnv(process.env);
262
263
  const baseEnv = host === "sandbox" ? inheritedBaseEnv : sanitizeHostBaseEnv(inheritedBaseEnv);
264
+ const trustedSkillEnv = { ...getActiveSkillEnvOverrides() };
263
265
  if (host !== "sandbox" && params.env) {
264
266
  validateHostEnv(params.env);
265
267
  }
266
- const mergedEnv = params.env ? {
268
+ const mergedEnv = {
267
269
  ...baseEnv,
268
- ...params.env
269
- } : baseEnv;
270
+ ...params.env,
271
+ ...trustedSkillEnv
272
+ };
270
273
  const env = sandbox ? buildSandboxEnv({
271
274
  defaultPath: DEFAULT_PATH,
272
- paramsEnv: params.env,
275
+ paramsEnv: {
276
+ ...params.env,
277
+ ...trustedSkillEnv
278
+ },
273
279
  sandboxEnv: sandbox.env,
274
280
  containerWorkdir: containerWorkdir ?? sandbox.containerWorkdir
275
281
  }) : mergedEnv;
@@ -3,7 +3,7 @@ import { assertSandboxPath } from "./sandbox-paths.js";
3
3
  import { existsSync, statSync } from "node:fs";
4
4
  import { homedir } from "node:os";
5
5
  import path from "node:path";
6
- import fs$1 from "node:fs/promises";
6
+ import fs from "node:fs/promises";
7
7
 
8
8
  //#region src/agents/bash-tools.shared.ts
9
9
  const CHUNK_LIMIT = 8 * 1024;
@@ -67,7 +67,7 @@ async function resolveSandboxWorkdir(params) {
67
67
  cwd: process.cwd(),
68
68
  root: params.sandbox.workspaceDir
69
69
  });
70
- const stats = await fs$1.stat(resolved.resolved);
70
+ const stats = await fs.stat(resolved.resolved);
71
71
  if (!stats.isDirectory()) {
72
72
  throw new Error("workdir is not a directory");
73
73
  }
@@ -1,7 +1,7 @@
1
1
  import { resolveUserPath } from "../utils.js";
2
2
  import { createSubsystemLogger } from "../logging/subsystem.js";
3
3
  import { loadJsonFile, saveJsonFile } from "../infra/json-file.js";
4
- import fs from "node:fs";
4
+ import syncFs from "node:fs";
5
5
  import path from "node:path";
6
6
  import { execFileSync, execSync } from "node:child_process";
7
7
  import { createHash } from "node:crypto";
@@ -61,7 +61,7 @@ function resolveCodexHomePath() {
61
61
  const configured = process.env.CODEX_HOME;
62
62
  const home = configured ? resolveUserPath(configured) : resolveUserPath("~/.codex");
63
63
  try {
64
- return fs.realpathSync.native(home);
64
+ return syncFs.realpathSync.native(home);
65
65
  } catch {
66
66
  return home;
67
67
  }
@@ -264,7 +264,7 @@ function writeClaudeCliKeychainCredentials(newCredentials, options) {
264
264
  }
265
265
  function writeClaudeCliFileCredentials(newCredentials, options) {
266
266
  const credPath = resolveClaudeCliCredentialsPath(options?.homeDir);
267
- if (!fs.existsSync(credPath)) {
267
+ if (!syncFs.existsSync(credPath)) {
268
268
  return false;
269
269
  }
270
270
  try {
@@ -331,7 +331,7 @@ function readCodexCliCredentials(options) {
331
331
  }
332
332
  let expires;
333
333
  try {
334
- const stat = fs.statSync(authPath);
334
+ const stat = syncFs.statSync(authPath);
335
335
  expires = stat.mtimeMs + 60 * 60 * 1e3;
336
336
  } catch {
337
337
  expires = Date.now() + 60 * 60 * 1e3;
@@ -1,12 +1,12 @@
1
+ import { XIAOMI_BASE_URL, XIAOMI_MODEL_CATALOG } from "../providers/xiaomi-models.js";
2
+ import { BYTEPLUS_BASE_URL, BYTEPLUS_CODING_BASE_URL, BYTEPLUS_CODING_MODEL_CATALOG, BYTEPLUS_MODEL_CATALOG, buildBytePlusModelDefinition } from "./byteplus-models.js";
1
3
  import { CLOUDFLARE_AI_GATEWAY_MODEL_CATALOG, buildCloudflareAiGatewayModelDefinition } from "../providers/cloudflare-ai-gateway-shared.js";
4
+ import "./cloudflare-ai-gateway.js";
2
5
  import { HUGGINGFACE_BASE_URL, HUGGINGFACE_MODEL_CATALOG, buildHuggingfaceModelDefinition } from "../providers/huggingface-models.js";
3
6
  import { SYNTHETIC_BASE_URL, SYNTHETIC_MODEL_CATALOG, buildSyntheticModelDefinition } from "../providers/synthetic-models.js";
4
7
  import { TOGETHER_BASE_URL, TOGETHER_MODEL_CATALOG, buildTogetherModelDefinition } from "../providers/together-models.js";
5
8
  import { VENICE_BASE_URL, VENICE_MODEL_CATALOG, buildVeniceModelDefinition } from "../providers/venice-models.js";
6
9
  import { VERCEL_AI_GATEWAY_MODEL_IDS, buildVercelAiGatewayModelDefinition } from "../providers/vercel-ai-gateway-models.js";
7
- import { XIAOMI_BASE_URL, XIAOMI_MODEL_CATALOG } from "../providers/xiaomi-models.js";
8
- import { BYTEPLUS_BASE_URL, BYTEPLUS_CODING_BASE_URL, BYTEPLUS_CODING_MODEL_CATALOG, BYTEPLUS_MODEL_CATALOG, buildBytePlusModelDefinition } from "./byteplus-models.js";
9
- import "./cloudflare-ai-gateway.js";
10
10
  import { buildCopilotModelDefinition, buildCopilotProxyModelDefinition, getDefaultCopilotModelIds, getDefaultCopilotProxyModelIds } from "../providers/github-copilot-models.js";
11
11
  import { CHUTES_BASE_URL, CHUTES_MODEL_CATALOG, buildChutesModelDefinition } from "./chutes-models.js";
12
12
  import { DOUBAO_BASE_URL, DOUBAO_CODING_BASE_URL, DOUBAO_CODING_MODEL_CATALOG, DOUBAO_MODEL_CATALOG, buildDoubaoModelDefinition } from "./doubao-models.js";