@fased/fased 0.1.61 → 0.1.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +38 -30
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +49 -0
  5. package/config/signer-policies/agent.json.template +32 -0
  6. package/config/signer-policies/mining.json.template +69 -0
  7. package/config/signer-policies/network.json.template +5 -0
  8. package/config/signer-policies/vault.json.template +70 -0
  9. package/config/signer-protocol-v2.json +76 -0
  10. package/config/typescript-noemit-baseline.json +680 -0
  11. package/dist/acp/client.js +2 -2
  12. package/dist/acp/secret-file.js +2 -2
  13. package/dist/agents/agent-scope.js +2 -2
  14. package/dist/agents/apply-patch.js +8 -8
  15. package/dist/agents/auth-profiles/paths.js +2 -2
  16. package/dist/agents/auth-profiles/store.js +269 -33
  17. package/dist/agents/bash-tools.exec.js +10 -4
  18. package/dist/agents/bash-tools.shared.js +2 -2
  19. package/dist/agents/cli-credentials.js +4 -4
  20. package/dist/agents/current-model-catalog.js +3 -3
  21. package/dist/agents/docs-path.js +3 -3
  22. package/dist/agents/embedded-pi-mcp.js +4 -4
  23. package/dist/agents/identity-avatar.js +3 -3
  24. package/dist/agents/identity-file.js +2 -2
  25. package/dist/agents/memory-search.js +7 -1
  26. package/dist/agents/model-catalog-access.js +1 -2
  27. package/dist/agents/model-catalog-snapshot.js +1 -1
  28. package/dist/agents/model-catalog-source.js +1 -1
  29. package/dist/agents/model-metadata.js +1 -1
  30. package/dist/agents/model-selection.js +2 -28
  31. package/dist/agents/models-config.providers.js +6 -6
  32. package/dist/agents/openai-codex-app-server.js +5 -5
  33. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  34. package/dist/agents/pi-embedded-runner/model.js +1 -1
  35. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  36. package/dist/agents/pi-embedded-runner/run.js +2 -0
  37. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  38. package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
  39. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
  40. package/dist/agents/pi-model-discovery.js +6 -6
  41. package/dist/agents/pi-project-settings.js +3 -3
  42. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  43. package/dist/agents/pi-tools.js +2 -1
  44. package/dist/agents/sandbox/config.js +1 -1
  45. package/dist/agents/sandbox/context.js +27 -2
  46. package/dist/agents/sandbox/fs-bridge.js +2 -2
  47. package/dist/agents/session-dirs.js +4 -4
  48. package/dist/agents/session-write-lock.js +13 -13
  49. package/dist/agents/shell-utils.js +5 -5
  50. package/dist/agents/skills/bundled-dir.js +4 -4
  51. package/dist/agents/skills/env-overrides.js +38 -28
  52. package/dist/agents/skills/local-loader.js +6 -6
  53. package/dist/agents/skills/plugin-skills.js +2 -2
  54. package/dist/agents/skills/trust.js +93 -0
  55. package/dist/agents/skills/workspace.js +141 -13
  56. package/dist/agents/skills-clawhub.js +36 -11
  57. package/dist/agents/skills-install-download.js +7 -7
  58. package/dist/agents/skills-install-plan.js +2 -2
  59. package/dist/agents/skills-install.js +2 -2
  60. package/dist/agents/skills-marketplace-scan.js +49 -0
  61. package/dist/agents/skills-status.js +2 -2
  62. package/dist/agents/subagent-depth.js +2 -2
  63. package/dist/agents/system-prompt-params.js +2 -2
  64. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  65. package/dist/agents/tools/mining-tool.js +1 -1
  66. package/dist/agents/tools/session-status-tool.js +1 -1
  67. package/dist/agents/tools/wallet-action-tool.js +172 -36
  68. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  69. package/dist/agents/tools/wallet-tool.js +7 -11
  70. package/dist/agents/workspace.js +22 -22
  71. package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
  72. package/dist/auto-reply/reply/agent-runner.js +2 -2
  73. package/dist/auto-reply/reply/commands-export-session.js +7 -7
  74. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  75. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  76. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  77. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  78. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  79. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  80. package/dist/auto-reply/reply/model-selection.js +7 -4
  81. package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
  82. package/dist/auto-reply/reply/post-compaction-context.js +3 -3
  83. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  84. package/dist/auto-reply/reply/session.js +3 -3
  85. package/dist/auto-reply/skill-commands.js +3 -3
  86. package/dist/auto-reply/status.js +6 -6
  87. package/dist/brand.js +1 -1
  88. package/dist/browser/chrome.executables.js +3 -3
  89. package/dist/browser/chrome.js +3 -3
  90. package/dist/browser/chrome.profile-decoration.js +6 -6
  91. package/dist/browser/profiles-service.js +2 -2
  92. package/dist/browser/server-context.js +2 -2
  93. package/dist/browser/trash.js +4 -4
  94. package/dist/build-info.json +3 -3
  95. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  96. package/dist/canvas-host/server.js +4 -4
  97. package/dist/capabilities/catalog.js +3 -3
  98. package/dist/channel-web.js +2 -2
  99. package/dist/channels/plugins/catalog.js +3 -3
  100. package/dist/cli/browser-cli-extension.js +6 -6
  101. package/dist/cli/command-format.js +2 -2
  102. package/dist/cli/cron-cli/register.cron-simple.js +2 -2
  103. package/dist/cli/dns-cli.js +9 -9
  104. package/dist/cli/gateway-cli/dev.js +5 -5
  105. package/dist/cli/gateway-cli/run.js +10 -2
  106. package/dist/cli/hooks-cli.js +5 -5
  107. package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
  108. package/dist/cli/memory-cli.js +7 -7
  109. package/dist/cli/nodes-media-utils.js +2 -2
  110. package/dist/cli/plugins-cli.js +2 -2
  111. package/dist/cli/program/command-registry.js +1 -1
  112. package/dist/cli/program/register.onboard.js +2 -3
  113. package/dist/cli/program/register.wallet.js +16 -123
  114. package/dist/cli/providers-cli.js +1 -1
  115. package/dist/cli/sat-cli.js +129 -2
  116. package/dist/cli/secrets-cli.js +3 -3
  117. package/dist/cli/update-cli/update-command.js +260 -11
  118. package/dist/cli/windows-argv.js +2 -2
  119. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  120. package/dist/commands/dashboard-link.js +3 -3
  121. package/dist/commands/doctor-config-flow.js +1 -1
  122. package/dist/commands/doctor-install.js +5 -5
  123. package/dist/commands/doctor-legacy-config.js +2 -13
  124. package/dist/commands/doctor-memory-search.js +2 -2
  125. package/dist/commands/doctor-platform-notes.js +2 -2
  126. package/dist/commands/doctor-sandbox.js +2 -2
  127. package/dist/commands/doctor-state-integrity.js +23 -23
  128. package/dist/commands/doctor-workspace.js +3 -3
  129. package/dist/commands/doctor.js +3 -3
  130. package/dist/commands/managed-up.js +2 -2
  131. package/dist/commands/model-picker.js +6 -6
  132. package/dist/commands/models/auth.js +1 -1
  133. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  134. package/dist/commands/onboard-auth.credentials.js +35 -11
  135. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  136. package/dist/commands/onboard-non-interactive/local.js +5 -1
  137. package/dist/commands/onboarding/plugin-install.js +2 -2
  138. package/dist/commands/sessions-cleanup.js +2 -2
  139. package/dist/commands/signal-install.js +6 -6
  140. package/dist/commands/status-all/channels.js +2 -2
  141. package/dist/commands/wallet.js +570 -1913
  142. package/dist/config/cache-utils.js +2 -2
  143. package/dist/config/config.js +2 -2
  144. package/dist/config/includes.js +5 -5
  145. package/dist/config/io.js +66 -4
  146. package/dist/config/paths.js +3 -3
  147. package/dist/config/sat-runtime-ids.js +3 -3
  148. package/dist/config/schema.help.js +8 -7
  149. package/dist/config/schema.labels.js +5 -4
  150. package/dist/config/sessions/disk-budget.js +6 -6
  151. package/dist/config/sessions/paths.js +2 -2
  152. package/dist/config/sessions/store.js +17 -17
  153. package/dist/config/sessions/transcript.js +4 -4
  154. package/dist/config/talk.js +2 -2
  155. package/dist/config/zod-schema.agent-runtime.js +1 -0
  156. package/dist/config/zod-schema.js +5 -0
  157. package/dist/control-ui/assets/{app-BXA4gPvN.js → app-bR-fO5ty.js} +1511 -1555
  158. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  159. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  160. package/dist/control-ui/assets/{index-D2QbJhVg.js → index-ckCxHwjy.js} +3 -3
  161. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  162. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  163. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  164. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  165. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  166. package/dist/control-ui/index.html +1 -1
  167. package/dist/control-ui/version.json +1 -1
  168. package/dist/cron/service/store.js +2 -2
  169. package/dist/cron/store.js +6 -6
  170. package/dist/daemon/systemd-system.js +60 -54
  171. package/dist/discord/monitor/thread-bindings.state.js +2 -2
  172. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  173. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  174. package/dist/extensions/sat-mining/src/sat-bond-layout.js +14 -11
  175. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  176. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  177. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  178. package/dist/federation/auto-connect.js +98 -8
  179. package/dist/federation/marketplace-capability-adapter.js +33 -7
  180. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  181. package/dist/federation/marketplace-delivery.js +351 -215
  182. package/dist/federation/marketplace-direct-payment.js +272 -141
  183. package/dist/federation/marketplace-escrow.js +607 -249
  184. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  185. package/dist/federation/offers.js +9 -7
  186. package/dist/federation/peer-auth-v2.js +529 -0
  187. package/dist/gateway/a2a-http.js +425 -96
  188. package/dist/gateway/a2a-settlement.js +259 -153
  189. package/dist/gateway/a2a-task-store.js +524 -0
  190. package/dist/gateway/auth.js +38 -2
  191. package/dist/gateway/config-reload.js +46 -33
  192. package/dist/gateway/control-ui-boot-check.js +6 -6
  193. package/dist/gateway/control-ui-login.js +7 -7
  194. package/dist/gateway/control-ui.js +9 -9
  195. package/dist/gateway/durable-capacity.js +31 -0
  196. package/dist/gateway/federation-http.js +540 -135
  197. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  198. package/dist/gateway/federation-marketplace.js +535 -230
  199. package/dist/gateway/hooks-mapping.js +4 -4
  200. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  201. package/dist/gateway/security-path.js +1 -1
  202. package/dist/gateway/server-discovery.js +2 -2
  203. package/dist/gateway/server-http.js +1088 -1209
  204. package/dist/gateway/server-methods/chat.js +3 -3
  205. package/dist/gateway/server-methods/models.js +1 -1
  206. package/dist/gateway/server-methods/secrets.js +40 -0
  207. package/dist/gateway/server-methods/sessions.js +6 -6
  208. package/dist/gateway/server-methods/usage.js +2 -2
  209. package/dist/gateway/server-methods.js +1 -2
  210. package/dist/gateway/server-reload-handlers.js +196 -66
  211. package/dist/gateway/server-runtime-config.js +1 -1
  212. package/dist/gateway/server-secrets-runtime.js +288 -0
  213. package/dist/gateway/server.impl.js +73 -42
  214. package/dist/gateway/session-compaction-checkpoints.js +4 -4
  215. package/dist/gateway/session-utils.fs.js +24 -24
  216. package/dist/gateway/session-utils.js +6 -6
  217. package/dist/gateway/sessions-patch.js +3 -5
  218. package/dist/hooks/bundled-dir.js +4 -4
  219. package/dist/hooks/gmail-setup-utils.js +6 -6
  220. package/dist/hooks/import-url.js +2 -2
  221. package/dist/hooks/loader.js +4 -4
  222. package/dist/hooks/workspace.js +7 -7
  223. package/dist/index.js +4 -2
  224. package/dist/infra/archive.js +17 -17
  225. package/dist/infra/boundary-file-read.js +2 -2
  226. package/dist/infra/boundary-path.js +15 -15
  227. package/dist/infra/brew.js +2 -2
  228. package/dist/infra/control-ui-assets.js +14 -14
  229. package/dist/infra/device-auth-store.js +8 -8
  230. package/dist/infra/device-identity.js +8 -8
  231. package/dist/infra/dotenv.js +2 -2
  232. package/dist/infra/exec-approvals.js +8 -8
  233. package/dist/infra/exec-command-resolution.js +4 -4
  234. package/dist/infra/exec-safe-bin-trust.js +2 -2
  235. package/dist/infra/fased-root.js +5 -5
  236. package/dist/infra/fasedhub.js +64 -1
  237. package/dist/infra/fs-safe.js +14 -14
  238. package/dist/infra/gateway-lock.js +11 -11
  239. package/dist/infra/git-commit.js +5 -5
  240. package/dist/infra/git-root.js +4 -4
  241. package/dist/infra/hosted-runtime-artifact.js +3 -3
  242. package/dist/infra/is-main.js +2 -2
  243. package/dist/infra/json-file.js +7 -7
  244. package/dist/infra/local-source-paired-update.js +538 -0
  245. package/dist/infra/managed-runtime-bootstrap.js +6 -6
  246. package/dist/infra/outbound/delivery-queue.js +16 -16
  247. package/dist/infra/path-env.js +3 -3
  248. package/dist/infra/ports-lsof.js +4 -4
  249. package/dist/infra/provider-usage.auth.js +3 -3
  250. package/dist/infra/restart.js +41 -10
  251. package/dist/infra/safe-open-sync.js +2 -2
  252. package/dist/infra/session-cost-usage.js +9 -9
  253. package/dist/infra/shell-env.js +2 -2
  254. package/dist/infra/state-migrations.fs.js +6 -6
  255. package/dist/infra/state-migrations.js +23 -23
  256. package/dist/infra/tmp-fased-dir.js +6 -6
  257. package/dist/infra/update-runner.js +96 -0
  258. package/dist/infra/widearea-dns.js +3 -3
  259. package/dist/infra/wsl.js +2 -2
  260. package/dist/light-update-status.js +11 -11
  261. package/dist/line/accounts.js +2 -2
  262. package/dist/line/download.js +2 -2
  263. package/dist/logging/config.js +3 -3
  264. package/dist/logging/logger.js +7 -7
  265. package/dist/managed/federation.js +3 -3
  266. package/dist/managed/tunnel.js +3 -3
  267. package/dist/media/store.js +13 -13
  268. package/dist/media-understanding/runner.js +3 -3
  269. package/dist/memory/backend-config.js +2 -1
  270. package/dist/memory/embeddings.js +2 -2
  271. package/dist/memory/internal.js +10 -10
  272. package/dist/memory/manager-sync-ops.js +7 -7
  273. package/dist/memory/repair-executor.js +17 -17
  274. package/dist/memory/session-files.js +16 -2
  275. package/dist/node-host/invoke-system-run-plan.js +8 -8
  276. package/dist/node-host/invoke.js +2 -2
  277. package/dist/node-host/runner.js +3 -3
  278. package/dist/pairing/pairing-store.js +3 -3
  279. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  280. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  281. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  282. package/dist/plugin-sdk/{audio-preflight-Bv0hUOWL.js → audio-preflight-BYxAt775.js} +27 -27
  283. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  284. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  285. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  286. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  287. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  288. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  289. package/dist/plugin-sdk/{chunk-items-Bk--NU3E.js → chunk-items-DIRHG2gJ.js} +1 -1
  290. package/dist/plugin-sdk/command-status.d.ts +2 -2
  291. package/dist/plugin-sdk/command-status.js +27 -27
  292. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  293. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  294. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  295. package/dist/plugin-sdk/{config-schema-CGW6J3Pv.js → config-schema-BOT7kHb6.js} +6779 -3696
  296. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  297. package/dist/plugin-sdk/discord.d.ts +5 -5
  298. package/dist/plugin-sdk/discord.js +19 -19
  299. package/dist/plugin-sdk/file-lock.js +35 -4
  300. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  301. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  302. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  303. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  304. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  305. package/dist/plugin-sdk/index.d.ts +9 -27
  306. package/dist/plugin-sdk/index.js +29 -29
  307. package/dist/plugin-sdk/json-store.js +6 -6
  308. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  309. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  310. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  311. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  312. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  313. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  314. package/dist/plugin-sdk/{monitor-B9Cmt_Je.js → monitor-BCFDaqJ-.js} +31 -31
  315. package/dist/plugin-sdk/{monitor-B71iwAgC.js → monitor-BgbjRiPM.js} +32 -32
  316. package/dist/plugin-sdk/{openresponses-http-Du4GMmwo.js → openresponses-http-DFf87SMM.js} +27 -27
  317. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  318. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  319. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  320. package/dist/plugin-sdk/{pairing-message-BMkkS038.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  321. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  322. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  323. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  324. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  325. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  326. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  327. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  328. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  329. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  330. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  331. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  332. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  333. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  334. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  335. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  336. package/dist/plugin-sdk/sat-runtime.js +29 -29
  337. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  338. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  339. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  340. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  341. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  342. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  343. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  344. package/dist/plugin-sdk/{slack-D_bbE6Yd.js → slack-BUTt8cxK.js} +39 -39
  345. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  346. package/dist/plugin-sdk/slack.d.ts +5 -5
  347. package/dist/plugin-sdk/slack.js +9 -9
  348. package/dist/plugin-sdk/{sticker-cache-Dqo9nRhi.js → sticker-cache-D0wHVqjt.js} +3 -3
  349. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  350. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  351. package/dist/plugin-sdk/{telegram-actions-Cnag7JTH.js → telegram-actions-CC_qN4v0.js} +30 -30
  352. package/dist/plugin-sdk/telegram.d.ts +5 -5
  353. package/dist/plugin-sdk/telegram.js +8 -8
  354. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  355. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  356. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  357. package/dist/plugin-sdk/{types-CLIvQaVg.d.ts → types-C3avNytw.d.ts} +3 -4
  358. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  359. package/dist/plugin-sdk/{types-BYDL6dQj.d.ts → types-DWfbSAaM.d.ts} +2 -2
  360. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  361. package/dist/plugin-sdk/{web-BInKQkc4.js → web-BXsJ1vqe.js} +32 -32
  362. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  363. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  364. package/dist/plugin-sdk/whatsapp.d.ts +5 -5
  365. package/dist/plugin-sdk/whatsapp.js +12 -12
  366. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  367. package/dist/plugins/bundled-dir.js +3 -3
  368. package/dist/plugins/discovery.js +11 -11
  369. package/dist/plugins/loader.js +13 -13
  370. package/dist/plugins/manifest-registry.js +2 -2
  371. package/dist/plugins/manifest.js +4 -4
  372. package/dist/plugins/path-safety.js +3 -3
  373. package/dist/plugins/status-cache.js +9 -9
  374. package/dist/plugins/update.js +3 -3
  375. package/dist/plugins/web-search-install-catalog.js +3 -3
  376. package/dist/providers/refresh.js +1 -1
  377. package/dist/providers/registry.js +1 -1
  378. package/dist/secrets/apply.js +17 -17
  379. package/dist/secrets/audit.js +11 -11
  380. package/dist/secrets/runtime.js +1 -1
  381. package/dist/secrets/shared.js +9 -9
  382. package/dist/security/scan-paths.js +2 -2
  383. package/dist/shared/config-eval.js +2 -2
  384. package/dist/shared/pid-alive.js +2 -2
  385. package/dist/tasks/standing-orders.js +5 -5
  386. package/dist/tasks/task-flow-registry.js +5 -5
  387. package/dist/tasks/task-registry.js +5 -5
  388. package/dist/tasks/workflow-definitions.js +6 -6
  389. package/dist/telegram/token.js +5 -5
  390. package/dist/utils.js +5 -5
  391. package/dist/wallet/external-submission-ledger.js +376 -0
  392. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  393. package/dist/wallet/local-socket-signer-archive.js +30 -0
  394. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  395. package/dist/wallet/local-socket-signer-policy.js +166 -0
  396. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  397. package/dist/wallet/native-signer-wallet-id.js +25 -0
  398. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  399. package/dist/wallet/providers/local-socket-signer-adapter.js +382 -107
  400. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  401. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  402. package/dist/wallet/signer-network-admin.js +184 -0
  403. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  404. package/dist/wallet/solana-bond-signing.js +157 -69
  405. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  406. package/dist/wallet/solana-swap.js +520 -64
  407. package/dist/wallet/solana-transaction-inspection.js +106 -4
  408. package/dist/wallet/solana-trigger.js +658 -320
  409. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  410. package/dist/wallet/wallet-approval-auth.js +20 -31
  411. package/dist/wallet/wallet-atomic-state.js +53 -0
  412. package/dist/wallet/wallet-audit-log.js +5 -5
  413. package/dist/wallet/wallet-canary.js +0 -1
  414. package/dist/wallet/wallet-inbound-events.js +19 -14
  415. package/dist/wallet/wallet-observability.js +5 -5
  416. package/dist/wallet/wallet-policy-simulation.js +1 -1
  417. package/dist/wallet/wallet-policy.js +95 -41
  418. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  419. package/dist/wallet/wallet-provider-registry.js +64 -51
  420. package/dist/wallet/wallet-provider-resolver.js +62 -63
  421. package/dist/wallet/wallet-runtime-config.js +31 -44
  422. package/dist/wallet/wallet-secrets-store.js +44 -22
  423. package/dist/wallet/wallet-send-approvals.js +1894 -592
  424. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  425. package/dist/wallet/wallet-settlement-links.js +17 -16
  426. package/dist/wallet/wallet-standard-review.js +353 -0
  427. package/dist/wallet/wallet-status.js +0 -9
  428. package/dist/wallet/wallet-task-ledger.js +16 -2
  429. package/dist/web/accounts.js +3 -3
  430. package/dist/web/auth-store.js +18 -18
  431. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  432. package/dist/web/auto-reply/monitor.js +2 -2
  433. package/dist/web/session.js +4 -4
  434. package/dist/wizard/host-security-capability.js +15 -24
  435. package/dist/wizard/onboarding.finalize.js +63 -184
  436. package/dist/wizard/onboarding.host-security.js +118 -1368
  437. package/dist/wizard/onboarding.js +180 -242
  438. package/dist/wizard/onboarding.wallet.js +323 -829
  439. package/extensions/acpx/package.json +1 -1
  440. package/extensions/bluebubbles/package.json +1 -1
  441. package/extensions/copilot-proxy/package.json +1 -1
  442. package/extensions/diagnostics-otel/package.json +1 -1
  443. package/extensions/fased-federation/package.json +1 -1
  444. package/extensions/google-gemini-cli-auth/package.json +1 -1
  445. package/extensions/imessage/package.json +1 -1
  446. package/extensions/irc/package.json +1 -1
  447. package/extensions/line/package.json +1 -1
  448. package/extensions/llm-task/package.json +1 -1
  449. package/extensions/lobster/package.json +1 -1
  450. package/extensions/matrix/CHANGELOG.md +18 -0
  451. package/extensions/matrix/package.json +1 -1
  452. package/extensions/mattermost/package.json +1 -1
  453. package/extensions/memory-core/package.json +2 -2
  454. package/extensions/memory-lancedb/package.json +1 -1
  455. package/extensions/minimax-portal-auth/package.json +1 -1
  456. package/extensions/msteams/CHANGELOG.md +18 -0
  457. package/extensions/msteams/package.json +1 -1
  458. package/extensions/nextcloud-talk/package.json +1 -1
  459. package/extensions/nostr/CHANGELOG.md +18 -0
  460. package/extensions/nostr/package.json +1 -1
  461. package/extensions/open-prose/package.json +1 -1
  462. package/extensions/sat-mining/index.ts +498 -153
  463. package/extensions/sat-mining/package.json +1 -1
  464. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  465. package/extensions/sat-mining/src/audit-store.ts +50 -5
  466. package/extensions/sat-mining/src/claim-service.ts +85 -14
  467. package/extensions/sat-mining/src/config.ts +9 -0
  468. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  469. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  470. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  471. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  472. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  473. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  474. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  475. package/extensions/sat-mining/src/runtime.ts +14 -0
  476. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  477. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  478. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  479. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  480. package/extensions/signal/package.json +1 -1
  481. package/extensions/synology-chat/package.json +1 -1
  482. package/extensions/tlon/package.json +1 -1
  483. package/extensions/twitch/CHANGELOG.md +18 -0
  484. package/extensions/twitch/package.json +1 -1
  485. package/extensions/voice-call/CHANGELOG.md +18 -0
  486. package/extensions/voice-call/package.json +1 -1
  487. package/extensions/zalo/CHANGELOG.md +18 -0
  488. package/extensions/zalo/package.json +1 -1
  489. package/extensions/zalouser/CHANGELOG.md +18 -0
  490. package/extensions/zalouser/package.json +1 -1
  491. package/install.sh +4955 -0
  492. package/package.json +24 -5
  493. package/scripts/fased-host-updater.mjs +1421 -0
  494. package/scripts/fased-host-updaterctl.mjs +186 -0
  495. package/scripts/fased-managed-service.sh +36 -0
  496. package/scripts/fased-managed-updater.mjs +3065 -156
  497. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  498. package/scripts/fased-signer-network-hosting.sh +143 -0
  499. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  500. package/scripts/fased-signer-policy-hosting.sh +50 -0
  501. package/scripts/fased-signer-policy-local.sh +26 -0
  502. package/scripts/hosted-release-manifest.mjs +185 -0
  503. package/scripts/install-fased-signerd.sh +217 -0
  504. package/scripts/install-managed-runtime.mjs +212 -10
  505. package/scripts/managed-runtime-layout.mjs +75 -3
  506. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  507. package/scripts/start-managed.sh +169 -360
  508. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  509. package/dist/plugin-sdk/tmp-fased-dir-BdFQvrvw.d.ts +0 -77
  510. package/dist/wallet/local-socket-signer-broker.js +0 -224
  511. package/dist/wallet/local-socket-signer-custody.js +0 -42
  512. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  513. package/dist/wallet/providers/privy-adapter.js +0 -80
  514. package/dist/wallet/wallet-custody.js +0 -1836
@@ -1,13 +1,13 @@
1
1
  import { isTruthyEnvValue } from "./env.js";
2
2
  import { resolveBrewPathDirs } from "./brew.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
 
7
7
  //#region src/infra/path-env.ts
8
8
  function isExecutable(filePath) {
9
9
  try {
10
- fs.accessSync(filePath, fs.constants.X_OK);
10
+ syncFs.accessSync(filePath, syncFs.constants.X_OK);
11
11
  return true;
12
12
  } catch {
13
13
  return false;
@@ -15,7 +15,7 @@ function isExecutable(filePath) {
15
15
  }
16
16
  function isDirectory(dirPath) {
17
17
  try {
18
- return fs.statSync(dirPath).isDirectory();
18
+ return syncFs.statSync(dirPath).isDirectory();
19
19
  } catch {
20
20
  return false;
21
21
  }
@@ -1,11 +1,11 @@
1
- import fs from "node:fs";
2
- import fs$1 from "node:fs/promises";
1
+ import syncFs from "node:fs";
2
+ import fs from "node:fs/promises";
3
3
 
4
4
  //#region src/infra/ports-lsof.ts
5
5
  const LSOF_CANDIDATES = process.platform === "darwin" ? ["/usr/sbin/lsof", "/usr/bin/lsof"] : ["/usr/bin/lsof", "/usr/sbin/lsof"];
6
6
  async function canExecute(path) {
7
7
  try {
8
- await fs$1.access(path, fs.constants.X_OK);
8
+ await fs.access(path, syncFs.constants.X_OK);
9
9
  return true;
10
10
  } catch {
11
11
  return false;
@@ -22,7 +22,7 @@ async function resolveLsofCommand() {
22
22
  function resolveLsofCommandSync() {
23
23
  for (const candidate of LSOF_CANDIDATES) {
24
24
  try {
25
- fs.accessSync(candidate, fs.constants.X_OK);
25
+ syncFs.accessSync(candidate, syncFs.constants.X_OK);
26
26
  return candidate;
27
27
  } catch {}
28
28
  }
@@ -9,7 +9,7 @@ import { resolveAuthProfileOrder } from "../agents/auth-profiles/order.js";
9
9
  import "../agents/auth-profiles.js";
10
10
  import { getCustomProviderApiKey } from "../agents/model-auth.js";
11
11
  import { normalizeProviderId } from "../agents/model-selection.js";
12
- import fs from "node:fs";
12
+ import syncFs from "node:fs";
13
13
  import os from "node:os";
14
14
  import path from "node:path";
15
15
 
@@ -43,10 +43,10 @@ function resolveZaiApiKey() {
43
43
  }
44
44
  try {
45
45
  const authPath = path.join(resolveRequiredHomeDir(process.env, os.homedir), ".pi", "agent", "auth.json");
46
- if (!fs.existsSync(authPath)) {
46
+ if (!syncFs.existsSync(authPath)) {
47
47
  return undefined;
48
48
  }
49
- const data = JSON.parse(fs.readFileSync(authPath, "utf-8"));
49
+ const data = JSON.parse(syncFs.readFileSync(authPath, "utf-8"));
50
50
  return data["z-ai"]?.access || data.zai?.access;
51
51
  } catch {
52
52
  return undefined;
@@ -151,44 +151,75 @@ function deferGatewayRestartUntilIdle(opts) {
151
151
  const pollMs = Math.max(10, Math.floor(pollMsRaw));
152
152
  const maxWaitMsRaw = opts.maxWaitMs ?? DEFAULT_DEFERRAL_MAX_WAIT_MS;
153
153
  const maxWaitMs = Math.max(pollMs, Math.floor(maxWaitMsRaw));
154
- let pending;
154
+ let pendingPoll = null;
155
+ let pending = false;
156
+ const handle = {
157
+ cancel: () => {
158
+ if (!pending || !pendingPoll) {
159
+ return false;
160
+ }
161
+ clearInterval(pendingPoll);
162
+ pendingPoll = null;
163
+ pending = false;
164
+ return true;
165
+ },
166
+ isPending: () => pending
167
+ };
168
+ let pendingCount;
155
169
  try {
156
- pending = opts.getPendingCount();
170
+ pendingCount = opts.getPendingCount();
157
171
  } catch (err) {
158
172
  opts.hooks?.onCheckError?.(err);
159
173
  emitGatewayRestart();
160
- return;
174
+ return handle;
161
175
  }
162
- if (pending <= 0) {
176
+ if (pendingCount <= 0) {
163
177
  opts.hooks?.onReady?.();
164
178
  emitGatewayRestart();
165
- return;
179
+ return handle;
166
180
  }
167
- opts.hooks?.onDeferring?.(pending);
181
+ opts.hooks?.onDeferring?.(pendingCount);
168
182
  const startedAt = Date.now();
169
- const poll = setInterval(() => {
183
+ pending = true;
184
+ pendingPoll = setInterval(() => {
170
185
  let current;
171
186
  try {
172
187
  current = opts.getPendingCount();
173
188
  } catch (err) {
174
- clearInterval(poll);
189
+ if (!pending) {
190
+ return;
191
+ }
192
+ pending = false;
193
+ if (pendingPoll) {
194
+ clearInterval(pendingPoll);
195
+ pendingPoll = null;
196
+ }
175
197
  opts.hooks?.onCheckError?.(err);
176
198
  emitGatewayRestart();
177
199
  return;
178
200
  }
179
201
  if (current <= 0) {
180
- clearInterval(poll);
202
+ pending = false;
203
+ if (pendingPoll) {
204
+ clearInterval(pendingPoll);
205
+ pendingPoll = null;
206
+ }
181
207
  opts.hooks?.onReady?.();
182
208
  emitGatewayRestart();
183
209
  return;
184
210
  }
185
211
  const elapsedMs = Date.now() - startedAt;
186
212
  if (elapsedMs >= maxWaitMs) {
187
- clearInterval(poll);
213
+ pending = false;
214
+ if (pendingPoll) {
215
+ clearInterval(pendingPoll);
216
+ pendingPoll = null;
217
+ }
188
218
  opts.hooks?.onTimeout?.(current, elapsedMs);
189
219
  emitGatewayRestart();
190
220
  }
191
221
  }, pollMs);
222
+ return handle;
192
223
  }
193
224
  function formatSpawnDetail(result) {
194
225
  const clean = (value) => {
@@ -1,5 +1,5 @@
1
1
  import { sameFileIdentity as sameFileIdentity$1 } from "./file-identity.js";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
 
4
4
  //#region src/infra/safe-open-sync.ts
5
5
  function isExpectedPathError(error) {
@@ -10,7 +10,7 @@ function sameFileIdentity(left, right) {
10
10
  return sameFileIdentity$1(left, right);
11
11
  }
12
12
  function openVerifiedFileSync(params) {
13
- const ioFs = params.ioFs ?? fs;
13
+ const ioFs = params.ioFs ?? syncFs;
14
14
  const openReadFlags = ioFs.constants.O_RDONLY | (typeof ioFs.constants.O_NOFOLLOW === "number" ? ioFs.constants.O_NOFOLLOW : 0);
15
15
  let fd = null;
16
16
  try {
@@ -4,7 +4,7 @@ import { stripInboundMetadata } from "../auto-reply/reply/strip-inbound-meta.js"
4
4
  import { stripEnvelope, stripMessageIdHints } from "../shared/chat-envelope.js";
5
5
  import { normalizeUsage } from "../agents/usage.js";
6
6
  import { estimateUsageCost, resolveModelCostConfig } from "../utils/usage-format.js";
7
- import fs from "node:fs";
7
+ import syncFs from "node:fs";
8
8
  import path from "node:path";
9
9
  import readline from "node:readline";
10
10
 
@@ -145,7 +145,7 @@ const applyCostTotal = (totals, costTotal) => {
145
145
  totals.totalCost += costTotal;
146
146
  };
147
147
  async function* readJsonlRecords(filePath) {
148
- const fileStream = fs.createReadStream(filePath, { encoding: "utf-8" });
148
+ const fileStream = syncFs.createReadStream(filePath, { encoding: "utf-8" });
149
149
  const rl = readline.createInterface({
150
150
  input: fileStream,
151
151
  crlfDelay: Infinity
@@ -225,10 +225,10 @@ async function loadCostUsageSummary(params) {
225
225
  const dailyMap = new Map();
226
226
  const totals = emptyTotals();
227
227
  const sessionsDir = resolveSessionTranscriptsDirForAgent(params?.agentId);
228
- const entries = await fs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
228
+ const entries = await syncFs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
229
229
  const files = (await Promise.all(entries.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl")).map(async (entry) => {
230
230
  const filePath = path.join(sessionsDir, entry.name);
231
- const stats = await fs.promises.stat(filePath).catch(() => null);
231
+ const stats = await syncFs.promises.stat(filePath).catch(() => null);
232
232
  if (!stats) {
233
233
  return null;
234
234
  }
@@ -279,14 +279,14 @@ async function loadCostUsageSummary(params) {
279
279
  */
280
280
  async function discoverAllSessions(params) {
281
281
  const sessionsDir = resolveSessionTranscriptsDirForAgent(params?.agentId);
282
- const entries = await fs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
282
+ const entries = await syncFs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
283
283
  const discovered = [];
284
284
  for (const entry of entries) {
285
285
  if (!entry.isFile() || !entry.name.endsWith(".jsonl")) {
286
286
  continue;
287
287
  }
288
288
  const filePath = path.join(sessionsDir, entry.name);
289
- const stats = await fs.promises.stat(filePath).catch(() => null);
289
+ const stats = await syncFs.promises.stat(filePath).catch(() => null);
290
290
  if (!stats) {
291
291
  continue;
292
292
  }
@@ -330,7 +330,7 @@ async function discoverAllSessions(params) {
330
330
  }
331
331
  async function loadSessionCostSummary(params) {
332
332
  const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
333
- if (!sessionFile || !fs.existsSync(sessionFile)) {
333
+ if (!sessionFile || !syncFs.existsSync(sessionFile)) {
334
334
  return null;
335
335
  }
336
336
  const totals = emptyTotals();
@@ -547,7 +547,7 @@ async function loadSessionCostSummary(params) {
547
547
  }
548
548
  async function loadSessionUsageTimeSeries(params) {
549
549
  const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
550
- if (!sessionFile || !fs.existsSync(sessionFile)) {
550
+ if (!sessionFile || !syncFs.existsSync(sessionFile)) {
551
551
  return null;
552
552
  }
553
553
  const points = [];
@@ -635,7 +635,7 @@ async function loadSessionUsageTimeSeries(params) {
635
635
  }
636
636
  async function loadSessionLogs(params) {
637
637
  const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
638
- if (!sessionFile || !fs.existsSync(sessionFile)) {
638
+ if (!sessionFile || !syncFs.existsSync(sessionFile)) {
639
639
  return null;
640
640
  }
641
641
  const logs = [];
@@ -1,6 +1,6 @@
1
1
  import { sanitizeHostExecEnv } from "./host-env-security.js";
2
2
  import { isTruthyEnvValue } from "./env.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { execFileSync } from "node:child_process";
@@ -34,7 +34,7 @@ function readEtcShells() {
34
34
  return cachedEtcShells;
35
35
  }
36
36
  try {
37
- const raw = fs.readFileSync("/etc/shells", "utf8");
37
+ const raw = syncFs.readFileSync("/etc/shells", "utf8");
38
38
  const entries = raw.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#") && path.isAbsolute(line));
39
39
  cachedEtcShells = new Set(entries);
40
40
  } catch {
@@ -1,27 +1,27 @@
1
- import fs from "node:fs";
1
+ import syncFs from "node:fs";
2
2
  import JSON5 from "json5";
3
3
 
4
4
  //#region src/infra/state-migrations.fs.ts
5
5
  function safeReadDir(dir) {
6
6
  try {
7
- return fs.readdirSync(dir, { withFileTypes: true });
7
+ return syncFs.readdirSync(dir, { withFileTypes: true });
8
8
  } catch {
9
9
  return [];
10
10
  }
11
11
  }
12
12
  function existsDir(dir) {
13
13
  try {
14
- return fs.existsSync(dir) && fs.statSync(dir).isDirectory();
14
+ return syncFs.existsSync(dir) && syncFs.statSync(dir).isDirectory();
15
15
  } catch {
16
16
  return false;
17
17
  }
18
18
  }
19
19
  function ensureDir(dir) {
20
- fs.mkdirSync(dir, { recursive: true });
20
+ syncFs.mkdirSync(dir, { recursive: true });
21
21
  }
22
22
  function fileExists(p) {
23
23
  try {
24
- return fs.existsSync(p) && fs.statSync(p).isFile();
24
+ return syncFs.existsSync(p) && syncFs.statSync(p).isFile();
25
25
  } catch {
26
26
  return false;
27
27
  }
@@ -37,7 +37,7 @@ function isLegacyWhatsAppAuthFile(name) {
37
37
  }
38
38
  function readSessionStoreJson5(storePath) {
39
39
  try {
40
- const raw = fs.readFileSync(storePath, "utf-8");
40
+ const raw = syncFs.readFileSync(storePath, "utf-8");
41
41
  const parsed = JSON5.parse(raw);
42
42
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
43
43
  return {
@@ -8,7 +8,7 @@ import { canonicalizeMainSessionAlias } from "../config/sessions/main-session.js
8
8
  import { saveSessionStore } from "../config/sessions/store.js";
9
9
  import "../config/sessions.js";
10
10
  import { ensureDir, existsDir, fileExists, isLegacyWhatsAppAuthFile, readSessionStoreJson5, safeReadDir } from "./state-migrations.fs.js";
11
- import fs from "node:fs";
11
+ import syncFs from "node:fs";
12
12
  import os from "node:os";
13
13
  import path from "node:path";
14
14
 
@@ -241,7 +241,7 @@ function removeDirIfEmpty(dir) {
241
241
  return;
242
242
  }
243
243
  try {
244
- fs.rmdirSync(dir);
244
+ syncFs.rmdirSync(dir);
245
245
  } catch {}
246
246
  }
247
247
  function resetAutoMigrateLegacyStateForTest() {
@@ -255,7 +255,7 @@ function resetAutoMigrateLegacyStateDirForTest() {
255
255
  }
256
256
  function resolveSymlinkTarget(linkPath) {
257
257
  try {
258
- const target = fs.readlinkSync(linkPath);
258
+ const target = syncFs.readlinkSync(linkPath);
259
259
  return path.resolve(path.dirname(linkPath), target);
260
260
  } catch {
261
261
  return null;
@@ -266,7 +266,7 @@ function formatStateDirMigration(legacyDir, targetDir) {
266
266
  }
267
267
  function isDirPath(filePath) {
268
268
  try {
269
- return fs.statSync(filePath).isDirectory();
269
+ return syncFs.statSync(filePath).isDirectory();
270
270
  } catch {
271
271
  return false;
272
272
  }
@@ -274,7 +274,7 @@ function isDirPath(filePath) {
274
274
  function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
275
275
  let entries;
276
276
  try {
277
- entries = fs.readdirSync(currentDir, { withFileTypes: true });
277
+ entries = syncFs.readdirSync(currentDir, { withFileTypes: true });
278
278
  } catch {
279
279
  return false;
280
280
  }
@@ -285,7 +285,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
285
285
  const entryPath = path.join(currentDir, entry.name);
286
286
  let stat;
287
287
  try {
288
- stat = fs.lstatSync(entryPath);
288
+ stat = syncFs.lstatSync(entryPath);
289
289
  } catch {
290
290
  return false;
291
291
  }
@@ -296,7 +296,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
296
296
  }
297
297
  let resolvedRealTarget;
298
298
  try {
299
- resolvedRealTarget = fs.realpathSync(resolvedTarget);
299
+ resolvedRealTarget = syncFs.realpathSync(resolvedTarget);
300
300
  } catch {
301
301
  return false;
302
302
  }
@@ -318,7 +318,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
318
318
  function isLegacyDirSymlinkMirror(legacyDir, targetDir) {
319
319
  let realTargetDir;
320
320
  try {
321
- realTargetDir = fs.realpathSync(targetDir);
321
+ realTargetDir = syncFs.realpathSync(targetDir);
322
322
  } catch {
323
323
  return false;
324
324
  }
@@ -348,7 +348,7 @@ async function autoMigrateLegacyStateDir(params) {
348
348
  const legacyDirs = resolveLegacyStateDirs(homedir);
349
349
  let legacyDir = legacyDirs.find((dir) => {
350
350
  try {
351
- return fs.existsSync(dir);
351
+ return syncFs.existsSync(dir);
352
352
  } catch {
353
353
  return false;
354
354
  }
@@ -357,7 +357,7 @@ async function autoMigrateLegacyStateDir(params) {
357
357
  const changes = [];
358
358
  let legacyStat = null;
359
359
  try {
360
- legacyStat = legacyDir ? fs.lstatSync(legacyDir) : null;
360
+ legacyStat = legacyDir ? syncFs.lstatSync(legacyDir) : null;
361
361
  } catch {
362
362
  legacyStat = null;
363
363
  }
@@ -401,7 +401,7 @@ async function autoMigrateLegacyStateDir(params) {
401
401
  if (legacyDirs.some((dir) => path.resolve(dir) === path.resolve(legacyTarget))) {
402
402
  legacyDir = legacyTarget;
403
403
  try {
404
- legacyStat = fs.lstatSync(legacyDir);
404
+ legacyStat = syncFs.lstatSync(legacyDir);
405
405
  } catch {
406
406
  legacyStat = null;
407
407
  }
@@ -464,7 +464,7 @@ async function autoMigrateLegacyStateDir(params) {
464
464
  if (!legacyDir) {
465
465
  throw new Error("Legacy state dir not found");
466
466
  }
467
- fs.renameSync(legacyDir, targetDir);
467
+ syncFs.renameSync(legacyDir, targetDir);
468
468
  } catch (err) {
469
469
  warnings.push(`Failed to move legacy state dir (${legacyDir ?? "unknown"} → ${targetDir}): ${String(err)}`);
470
470
  return {
@@ -478,7 +478,7 @@ async function autoMigrateLegacyStateDir(params) {
478
478
  if (!legacyDir) {
479
479
  throw new Error("Legacy state dir not found");
480
480
  }
481
- fs.symlinkSync(targetDir, legacyDir, "dir");
481
+ syncFs.symlinkSync(targetDir, legacyDir, "dir");
482
482
  changes.push(formatStateDirMigration(legacyDir, targetDir));
483
483
  } catch (err) {
484
484
  try {
@@ -486,7 +486,7 @@ async function autoMigrateLegacyStateDir(params) {
486
486
  if (!legacyDir) {
487
487
  throw new Error("Legacy state dir not found", { cause: err });
488
488
  }
489
- fs.symlinkSync(targetDir, legacyDir, "junction");
489
+ syncFs.symlinkSync(targetDir, legacyDir, "junction");
490
490
  changes.push(formatStateDirMigration(legacyDir, targetDir));
491
491
  } else {
492
492
  throw err;
@@ -496,7 +496,7 @@ async function autoMigrateLegacyStateDir(params) {
496
496
  if (!legacyDir) {
497
497
  throw new Error("Legacy state dir not found", { cause: fallbackErr });
498
498
  }
499
- fs.renameSync(targetDir, legacyDir);
499
+ syncFs.renameSync(targetDir, legacyDir);
500
500
  warnings.push(`State dir migration rolled back (failed to link legacy path): ${String(fallbackErr)}`);
501
501
  return {
502
502
  migrated: false,
@@ -682,7 +682,7 @@ async function migrateLegacySessions(detected, now) {
682
682
  continue;
683
683
  }
684
684
  try {
685
- fs.renameSync(from, to);
685
+ syncFs.renameSync(from, to);
686
686
  changes.push(`Moved ${entry.name} → agents/${detected.targetAgentId}/sessions`);
687
687
  } catch (err) {
688
688
  warnings.push(`Failed moving ${from}: ${String(err)}`);
@@ -691,7 +691,7 @@ async function migrateLegacySessions(detected, now) {
691
691
  if (legacyParsed.ok) {
692
692
  try {
693
693
  if (fileExists(detected.sessions.legacyStorePath)) {
694
- fs.rmSync(detected.sessions.legacyStorePath, { force: true });
694
+ syncFs.rmSync(detected.sessions.legacyStorePath, { force: true });
695
695
  }
696
696
  } catch {}
697
697
  }
@@ -700,7 +700,7 @@ async function migrateLegacySessions(detected, now) {
700
700
  if (legacyLeft.length > 0) {
701
701
  const backupDir = `${detected.sessions.legacyDir}.legacy-${now()}`;
702
702
  try {
703
- fs.renameSync(detected.sessions.legacyDir, backupDir);
703
+ syncFs.renameSync(detected.sessions.legacyDir, backupDir);
704
704
  warnings.push(`Left legacy sessions at ${backupDir}`);
705
705
  } catch {}
706
706
  }
@@ -723,11 +723,11 @@ async function migrateLegacyAgentDir(detected, now) {
723
723
  for (const entry of entries) {
724
724
  const from = path.join(detected.agentDir.legacyDir, entry.name);
725
725
  const to = path.join(detected.agentDir.targetDir, entry.name);
726
- if (fs.existsSync(to)) {
726
+ if (syncFs.existsSync(to)) {
727
727
  continue;
728
728
  }
729
729
  try {
730
- fs.renameSync(from, to);
730
+ syncFs.renameSync(from, to);
731
731
  changes.push(`Moved agent file ${entry.name} → agents/${detected.targetAgentId}/agent`);
732
732
  } catch (err) {
733
733
  warnings.push(`Failed moving ${from}: ${String(err)}`);
@@ -737,7 +737,7 @@ async function migrateLegacyAgentDir(detected, now) {
737
737
  if (!emptyDirOrMissing(detected.agentDir.legacyDir)) {
738
738
  const backupDir = path.join(detected.stateDir, "agents", detected.targetAgentId, `agent.legacy-${now()}`);
739
739
  try {
740
- fs.renameSync(detected.agentDir.legacyDir, backupDir);
740
+ syncFs.renameSync(detected.agentDir.legacyDir, backupDir);
741
741
  warnings.push(`Left legacy agent dir at ${backupDir}`);
742
742
  } catch (err) {
743
743
  warnings.push(`Failed relocating legacy agent dir: ${String(err)}`);
@@ -775,7 +775,7 @@ async function migrateLegacyWhatsAppAuth(detected) {
775
775
  continue;
776
776
  }
777
777
  try {
778
- fs.renameSync(from, to);
778
+ syncFs.renameSync(from, to);
779
779
  changes.push(`Moved WhatsApp auth ${entry.name} → whatsapp/default`);
780
780
  } catch (err) {
781
781
  warnings.push(`Failed moving ${from}: ${String(err)}`);
@@ -799,7 +799,7 @@ async function migrateLegacyTelegramPairingAllowFrom(detected) {
799
799
  const targetPath = detected.pairingAllowFrom.targetTelegramPath;
800
800
  try {
801
801
  ensureDir(path.dirname(targetPath));
802
- fs.copyFileSync(legacyPath, targetPath);
802
+ syncFs.copyFileSync(legacyPath, targetPath);
803
803
  changes.push(`Copied Telegram pairing allowFrom → ${targetPath}`);
804
804
  } catch (err) {
805
805
  warnings.push(`Failed migrating Telegram pairing allowFrom (${legacyPath}): ${String(err)}`);
@@ -1,18 +1,18 @@
1
- import fs from "node:fs";
1
+ import syncFs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
 
5
5
  //#region src/infra/tmp-fased-dir.ts
6
6
  const POSIX_FASED_TMP_DIR = "/tmp/fased";
7
- const TMP_DIR_ACCESS_MODE = fs.constants.W_OK | fs.constants.X_OK;
7
+ const TMP_DIR_ACCESS_MODE = syncFs.constants.W_OK | syncFs.constants.X_OK;
8
8
  function isNodeErrorWithCode(err, code) {
9
9
  return typeof err === "object" && err !== null && "code" in err && err.code === code;
10
10
  }
11
11
  function resolvePreferredFasedAgentTmpDir(options = {}) {
12
- const accessSync = options.accessSync ?? fs.accessSync;
13
- const chmodSync = options.chmodSync ?? fs.chmodSync;
14
- const lstatSync = options.lstatSync ?? fs.lstatSync;
15
- const mkdirSync = options.mkdirSync ?? fs.mkdirSync;
12
+ const accessSync = options.accessSync ?? syncFs.accessSync;
13
+ const chmodSync = options.chmodSync ?? syncFs.chmodSync;
14
+ const lstatSync = options.lstatSync ?? syncFs.lstatSync;
15
+ const mkdirSync = options.mkdirSync ?? syncFs.mkdirSync;
16
16
  const warn = options.warn ?? ((message) => console.warn(message));
17
17
  const getuid = options.getuid ?? (() => {
18
18
  try {
@@ -47,6 +47,78 @@ const DEFAULT_PACKAGE_NAME = "@fased/fased";
47
47
  const LEGACY_PACKAGE_NAME = "fased";
48
48
  const CORE_PACKAGE_NAMES = new Set([LEGACY_PACKAGE_NAME, DEFAULT_PACKAGE_NAME]);
49
49
  const DEV_PREFLIGHT_LINT_OPT_IN_ENV = "FASED_UPDATE_PREFLIGHT_LINT";
50
+ const SOURCE_RELEASE_REPOSITORY = "fased-ai/fased";
51
+ const SOURCE_RELEASE_WORKFLOW = "fased-ai/fased/.github/workflows/hosted-runtime-release.yml";
52
+ async function verifyAttestedSourceRelease(params) {
53
+ const startedAt = Date.now();
54
+ const version = params.tag.replace(/^v/u, "");
55
+ const command = `verify attested source ${params.tag} at ${params.tagCommit}`;
56
+ const cwd = process.cwd();
57
+ const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "fased-source-attestation-"));
58
+ try {
59
+ const base = (params.baseUrl?.trim().replace(/\/+$/u, "") || "https://github.com/fased-ai/fased/releases/download") + `/${params.tag}`;
60
+ const manifestPath = path.join(tempRoot, "fased-hosted-release-v2.json");
61
+ const bundlePath = `${manifestPath}.attestation.json`;
62
+ for (const [name, destination] of [["fased-hosted-release-v2.json", manifestPath], ["fased-hosted-release-v2.json.attestation.json", bundlePath]]) {
63
+ const response = await params.fetchImpl(`${base}/${name}`, { redirect: "follow" });
64
+ if (!response.ok) {
65
+ throw new Error(`release identity asset ${name} is unavailable (${response.status})`);
66
+ }
67
+ await fs.writeFile(destination, new Uint8Array(await response.arrayBuffer()), { mode: 384 });
68
+ }
69
+ const verification = await params.runCommand([
70
+ "gh",
71
+ "attestation",
72
+ "verify",
73
+ manifestPath,
74
+ "--repo",
75
+ SOURCE_RELEASE_REPOSITORY,
76
+ "--bundle",
77
+ bundlePath,
78
+ "--signer-workflow",
79
+ SOURCE_RELEASE_WORKFLOW,
80
+ "--source-ref",
81
+ `refs/tags/${params.tag}`,
82
+ "--deny-self-hosted-runners"
83
+ ], {
84
+ cwd: tempRoot,
85
+ timeoutMs: params.timeoutMs,
86
+ env: {
87
+ ...process.env,
88
+ GH_PROMPT_DISABLED: "1"
89
+ }
90
+ });
91
+ if (verification.code !== 0) {
92
+ throw new Error(verification.stderr.trim() || "GitHub attestation verification failed");
93
+ }
94
+ const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
95
+ if (manifest.schemaVersion !== 2 || manifest.release?.version !== version || manifest.release?.tag !== params.tag || manifest.release?.commit !== params.tagCommit || !/^[a-f0-9]{40}$/u.test(String(manifest.release?.commit ?? "")) || manifest.signer?.release?.version !== version || manifest.signer?.release?.commit !== params.tagCommit || manifest.signer?.release?.development !== false) {
96
+ throw new Error("attested release does not bind the exact source tag, commit, and signer");
97
+ }
98
+ return {
99
+ name: "source release attestation",
100
+ command,
101
+ cwd,
102
+ durationMs: Date.now() - startedAt,
103
+ exitCode: 0,
104
+ stdoutTail: `${params.tag} -> ${params.tagCommit}`
105
+ };
106
+ } catch (error) {
107
+ return {
108
+ name: "source release attestation",
109
+ command,
110
+ cwd,
111
+ durationMs: Date.now() - startedAt,
112
+ exitCode: 1,
113
+ stderrTail: String(error)
114
+ };
115
+ } finally {
116
+ await fs.rm(tempRoot, {
117
+ recursive: true,
118
+ force: true
119
+ });
120
+ }
121
+ }
50
122
  function normalizeDir(value) {
51
123
  if (!value) {
52
124
  return null;
@@ -1472,6 +1544,30 @@ async function runGatewayUpdate(opts = {}) {
1472
1544
  durationMs: Date.now() - startedAt
1473
1545
  };
1474
1546
  }
1547
+ const tagCommitStep = await runStep(step(`git rev-parse ${tag}^{commit}`, [
1548
+ "git",
1549
+ "-C",
1550
+ gitRoot,
1551
+ "rev-parse",
1552
+ `${tag}^{commit}`
1553
+ ], gitRoot));
1554
+ steps.push(tagCommitStep);
1555
+ const tagCommit = tagCommitStep.stdoutTail?.trim() ?? "";
1556
+ if (tagCommitStep.exitCode !== 0 || !/^[a-f0-9]{40}$/u.test(tagCommit)) {
1557
+ return buildGitErrorResult("release-tag-identity-failed");
1558
+ }
1559
+ const attestationStep = await verifyAttestedSourceRelease({
1560
+ tag,
1561
+ tagCommit,
1562
+ timeoutMs,
1563
+ runCommand,
1564
+ fetchImpl: opts.hostedReleaseFetch ?? fetch,
1565
+ baseUrl: opts.hostedReleaseBaseUrl
1566
+ });
1567
+ steps.push(attestationStep);
1568
+ if (attestationStep.exitCode !== 0) {
1569
+ return buildGitErrorResult("source-release-attestation-failed");
1570
+ }
1475
1571
  const failure = await runGitCheckoutOrFail(`git checkout ${tag}`, [
1476
1572
  "git",
1477
1573
  "-C",
@@ -1,5 +1,5 @@
1
1
  import { CONFIG_DIR, ensureDir } from "../utils.js";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
5
 
@@ -126,7 +126,7 @@ async function writeWideAreaGatewayZone(opts) {
126
126
  await ensureDir(path.dirname(zonePath));
127
127
  const existing = (() => {
128
128
  try {
129
- return fs.readFileSync(zonePath, "utf-8");
129
+ return syncFs.readFileSync(zonePath, "utf-8");
130
130
  } catch {
131
131
  return null;
132
132
  }
@@ -149,7 +149,7 @@ async function writeWideAreaGatewayZone(opts) {
149
149
  ...opts,
150
150
  serial
151
151
  });
152
- fs.writeFileSync(zonePath, next, "utf-8");
152
+ syncFs.writeFileSync(zonePath, next, "utf-8");
153
153
  return {
154
154
  zonePath,
155
155
  changed: true