@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,6 +2,10 @@
2
2
  import fsp from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { pathToFileURL } from "node:url";
5
+ import {
6
+ authorizePreactivatedHostedGateway,
7
+ beginPreactivatedHostedTransaction,
8
+ } from "./fased-managed-updater.mjs";
5
9
  import {
6
10
  assertManagedRuntime,
7
11
  atomicSymlink,
@@ -10,12 +14,26 @@ import {
10
14
  copyExecutable,
11
15
  normalizeManagedProfile,
12
16
  readHostedRuntimeMetadata,
17
+ readHostedReleaseBinding,
13
18
  readManagedInstallManifest,
14
19
  readPackageVersion,
15
20
  resolveLinkTarget,
16
21
  resolveManagedRuntimePaths,
17
22
  } from "./managed-runtime-layout.mjs";
18
23
 
24
+ const DEFAULT_HOST_TRANSACTION_TIMEOUT_MS = 2 * 60_000;
25
+ const HOST_TRANSACTION_ID_PATTERN =
26
+ /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
27
+
28
+ function signerReleaseIdentitiesEqual(left, right) {
29
+ return (
30
+ left?.version === right?.version &&
31
+ left?.commit === right?.commit &&
32
+ left?.buildInputDigest === right?.buildInputDigest &&
33
+ left?.development === right?.development
34
+ );
35
+ }
36
+
19
37
  function parseArgs(argv) {
20
38
  const rollback = argv[0] === "--rollback";
21
39
  const tokens = rollback ? argv.slice(1) : argv;
@@ -44,9 +62,48 @@ function parseArgs(argv) {
44
62
  stateDir: path.resolve(stateDir),
45
63
  prefix: path.resolve(prefix),
46
64
  profile: normalizeManagedProfile(values.get("--profile")),
65
+ hostTransactionId: values.get("--host-transaction-id")?.trim() || null,
66
+ hostTransactionVersion: values.get("--host-transaction-version")?.trim() || null,
47
67
  };
48
68
  }
49
69
 
70
+ function resolveHostTransaction(params, { previousManifest, previousRoot, version }) {
71
+ const transactionId = String(params.hostTransactionId || "").trim();
72
+ const transactionVersion = String(params.hostTransactionVersion || "").trim();
73
+ if (Boolean(transactionId) !== Boolean(transactionVersion)) {
74
+ throw new Error(
75
+ "--host-transaction-id and --host-transaction-version must be provided together",
76
+ );
77
+ }
78
+ if (!transactionId) {
79
+ return null;
80
+ }
81
+ if (!HOST_TRANSACTION_ID_PATTERN.test(transactionId)) {
82
+ throw new Error("--host-transaction-id must be a UUID v4");
83
+ }
84
+ if (normalizeManagedProfile(params.profile) !== "hosting") {
85
+ throw new Error("A host update transaction can only activate a hosting runtime.");
86
+ }
87
+ if (transactionVersion !== version) {
88
+ throw new Error(
89
+ `Host transaction version ${transactionVersion} does not match runtime ${version}.`,
90
+ );
91
+ }
92
+
93
+ // A fresh hosting install has no application release to roll back. Its root
94
+ // installer owns the signer transaction and commits it after the first
95
+ // Gateway health check. Existing hosting installs coordinate both sides here.
96
+ if (!previousRoot || previousManifest?.profile !== "hosting") {
97
+ return null;
98
+ }
99
+ if (previousManifest.runtime?.activeVersion !== params.previousVersion) {
100
+ throw new Error(
101
+ "The active hosting manifest does not match the runtime selected for transactional repair.",
102
+ );
103
+ }
104
+ return { transactionId, transactionVersion };
105
+ }
106
+
50
107
  async function pathExists(target) {
51
108
  try {
52
109
  await fsp.lstat(target);
@@ -56,6 +113,29 @@ async function pathExists(target) {
56
113
  }
57
114
  }
58
115
 
116
+ async function fsyncTree(rootPath) {
117
+ const directories = [];
118
+ const pending = [rootPath];
119
+ while (pending.length > 0) {
120
+ const current = pending.pop();
121
+ directories.push(current);
122
+ const directory = await fsp.opendir(current);
123
+ for await (const entry of directory) {
124
+ const entryPath = path.join(current, entry.name);
125
+ if (entry.isDirectory()) {
126
+ pending.push(entryPath);
127
+ } else if (entry.isFile()) {
128
+ const handle = await fsp.open(entryPath, "r");
129
+ await handle.sync().finally(() => handle.close());
130
+ }
131
+ }
132
+ }
133
+ for (const directoryPath of directories.toReversed()) {
134
+ const handle = await fsp.open(directoryPath, "r");
135
+ await handle.sync().finally(() => handle.close());
136
+ }
137
+ }
138
+
59
139
  async function moveDirectory(source, destination) {
60
140
  try {
61
141
  await fsp.rename(source, destination);
@@ -95,7 +175,7 @@ async function replaceWithSymlink(target, linkPath) {
95
175
  return backupPath;
96
176
  }
97
177
 
98
- async function installStableFiles(paths, releaseRoot) {
178
+ async function installStableFiles(paths, releaseRoot, durable = false) {
99
179
  const scriptDir = path.join(releaseRoot, "scripts");
100
180
  await copyExecutable(path.join(scriptDir, "fased-managed-launcher.sh"), paths.launcherPath);
101
181
  await copyExecutable(path.join(scriptDir, "fased-managed-service.sh"), paths.serviceLauncherPath);
@@ -104,18 +184,55 @@ async function installStableFiles(paths, releaseRoot) {
104
184
  path.join(scriptDir, "managed-runtime-layout.mjs"),
105
185
  path.join(paths.updaterDir, "managed-runtime-layout.mjs"),
106
186
  );
187
+ await copyExecutable(
188
+ path.join(scriptDir, "hosted-release-manifest.mjs"),
189
+ path.join(paths.updaterDir, "hosted-release-manifest.mjs"),
190
+ );
107
191
  await fsp.mkdir(path.dirname(paths.prefixLauncherPath), { recursive: true });
108
192
  const launcherBackup = await replaceWithSymlink(paths.launcherPath, paths.prefixLauncherPath);
109
193
  if (launcherBackup) {
110
194
  await fsp.rm(launcherBackup, { recursive: true, force: true });
111
195
  }
196
+ if (!durable) {
197
+ return;
198
+ }
199
+ const stablePaths = [
200
+ paths.launcherPath,
201
+ paths.serviceLauncherPath,
202
+ paths.updaterPath,
203
+ path.join(paths.updaterDir, "managed-runtime-layout.mjs"),
204
+ path.join(paths.updaterDir, "hosted-release-manifest.mjs"),
205
+ ];
206
+ for (const stablePath of stablePaths) {
207
+ const handle = await fsp.open(stablePath, "r");
208
+ await handle.sync().finally(() => handle.close());
209
+ }
210
+ for (const directoryPath of new Set(stablePaths.map((value) => path.dirname(value)))) {
211
+ const handle = await fsp.open(directoryPath, "r");
212
+ await handle.sync().finally(() => handle.close());
213
+ }
112
214
  }
113
215
 
114
- export async function installManagedRuntime(params) {
216
+ export async function installManagedRuntime(params, dependencyOverrides = {}) {
217
+ const dependencies = {
218
+ authorizePreactivatedHostedGateway,
219
+ beginPreactivatedHostedTransaction,
220
+ ...dependencyOverrides,
221
+ };
115
222
  const paths = resolveManagedRuntimePaths(params);
116
223
  const existingManifest = readManagedInstallManifest(paths.manifestPath);
117
224
  const version = await assertManagedRuntime(params.packageRoot);
118
225
  const metadata = await readHostedRuntimeMetadata(params.packageRoot);
226
+ const hostedRelease = await readHostedReleaseBinding(params.packageRoot, metadata, version);
227
+ if (
228
+ normalizeManagedProfile(params.profile) === "hosting" &&
229
+ params.hostTransactionId &&
230
+ !hostedRelease
231
+ ) {
232
+ throw new Error(
233
+ "Maintained Hosting requires an attested unified app and signer release manifest.",
234
+ );
235
+ }
119
236
  let previousRoot = await resolveLinkTarget(paths.currentLink);
120
237
  let previousVersion = previousRoot ? await readPackageVersion(previousRoot) : null;
121
238
  let releaseRoot = path.join(paths.releasesDir, version);
@@ -161,30 +278,111 @@ export async function installManagedRuntime(params) {
161
278
  }
162
279
  }
163
280
 
281
+ const previousManifest =
282
+ existingManifest ||
283
+ (previousRoot && previousVersion
284
+ ? buildManagedInstallManifest({
285
+ paths,
286
+ profile: params.profile,
287
+ version: previousVersion,
288
+ previousVersion: null,
289
+ })
290
+ : null);
291
+ const hostTransaction = resolveHostTransaction(
292
+ { ...params, previousVersion },
293
+ { previousManifest, previousRoot, version },
294
+ );
295
+ if (params.hostTransactionId) {
296
+ await fsyncTree(releaseRoot);
297
+ const nodeModulesPath = path.join(releaseRoot, "node_modules");
298
+ const nodeModulesRoot = await fsp.realpath(nodeModulesPath).catch(() => null);
299
+ if (nodeModulesRoot && !nodeModulesRoot.startsWith(`${path.resolve(releaseRoot)}${path.sep}`)) {
300
+ const dependencyRoot = path.dirname(nodeModulesRoot);
301
+ const durabilityMarker = path.join(dependencyRoot, ".fased-durable-v1");
302
+ try {
303
+ await fsp.access(durabilityMarker);
304
+ } catch {
305
+ await fsyncTree(nodeModulesRoot);
306
+ await fsp.writeFile(durabilityMarker, "durable-v1\n", { mode: 0o600 });
307
+ const markerHandle = await fsp.open(durabilityMarker, "r");
308
+ await markerHandle.sync().finally(() => markerHandle.close());
309
+ const dependencyParent = await fsp.open(dependencyRoot, "r");
310
+ await dependencyParent.sync().finally(() => dependencyParent.close());
311
+ }
312
+ }
313
+ const releasesHandle = await fsp.open(paths.releasesDir, "r");
314
+ await releasesHandle.sync().finally(() => releasesHandle.close());
315
+ }
316
+
164
317
  if (previousRoot && path.resolve(previousRoot) !== path.resolve(releaseRoot)) {
165
318
  await atomicSymlink(previousRoot, paths.previousLink);
166
319
  }
167
- await atomicSymlink(releaseRoot, paths.currentLink);
168
-
169
- const compatibilityBackup = await replaceWithSymlink(
170
- paths.currentLink,
171
- paths.compatibilityPackageRoot,
172
- );
173
- await installStableFiles(paths, releaseRoot);
174
320
 
175
321
  const manifest = buildManagedInstallManifest({
176
322
  paths,
177
323
  profile: params.profile,
178
324
  version,
179
325
  dependencyHash: metadata?.dependencyHash,
326
+ hostedRelease,
180
327
  previousVersion: previousVersion || null,
181
328
  });
329
+ if (hostTransaction) {
330
+ await dependencies.beginPreactivatedHostedTransaction({
331
+ paths,
332
+ transactionId: hostTransaction.transactionId,
333
+ targetVersion: hostTransaction.transactionVersion,
334
+ previousVersion,
335
+ targetRoot: releaseRoot,
336
+ previousRoot,
337
+ nextManifest: manifest,
338
+ previousManifest,
339
+ timeoutMs: params.timeoutMs || DEFAULT_HOST_TRANSACTION_TIMEOUT_MS,
340
+ });
341
+ await fsp.chmod(paths.stateDir, 0o700).catch(() => undefined);
342
+ return { manifest, paths, releaseRoot, hostTransaction: true };
343
+ }
344
+
345
+ await atomicSymlink(releaseRoot, paths.currentLink);
346
+ const compatibilityBackup = await replaceWithSymlink(
347
+ paths.currentLink,
348
+ paths.compatibilityPackageRoot,
349
+ );
350
+ await installStableFiles(paths, releaseRoot, Boolean(params.hostTransactionId));
182
351
  await atomicWriteJson(paths.manifestPath, manifest, 0o600);
352
+ if (params.hostTransactionId) {
353
+ const identityManifestHandle = await fsp.open(paths.manifestPath, "r");
354
+ await identityManifestHandle.sync().finally(() => identityManifestHandle.close());
355
+ for (const directoryPath of new Set([
356
+ paths.stateDir,
357
+ paths.runtimeDir,
358
+ path.dirname(paths.compatibilityPackageRoot),
359
+ ])) {
360
+ const handle = await fsp.open(directoryPath, "r");
361
+ await handle.sync().finally(() => handle.close());
362
+ }
363
+ const authorization = await dependencies.authorizePreactivatedHostedGateway({
364
+ transactionId: params.hostTransactionId,
365
+ targetVersion: params.hostTransactionVersion,
366
+ timeoutMs: params.timeoutMs || DEFAULT_HOST_TRANSACTION_TIMEOUT_MS,
367
+ });
368
+ if (
369
+ !authorization?.release ||
370
+ !signerReleaseIdentitiesEqual(authorization.release, hostedRelease?.signer)
371
+ ) {
372
+ throw new Error(
373
+ "root signer updater did not return the exact signer identity from the unified release manifest",
374
+ );
375
+ }
376
+ manifest.signer = { release: authorization.release };
377
+ await atomicWriteJson(paths.manifestPath, manifest, 0o600);
378
+ const manifestHandle = await fsp.open(paths.manifestPath, "r");
379
+ await manifestHandle.sync().finally(() => manifestHandle.close());
380
+ }
183
381
  await fsp.chmod(paths.stateDir, 0o700).catch(() => undefined);
184
382
  if (compatibilityBackup) {
185
383
  await fsp.rm(compatibilityBackup, { recursive: true, force: true });
186
384
  }
187
- return { manifest, paths, releaseRoot };
385
+ return { manifest, paths, releaseRoot, hostTransaction: false };
188
386
  }
189
387
 
190
388
  export async function rollbackManagedRuntime(params) {
@@ -201,6 +399,7 @@ export async function rollbackManagedRuntime(params) {
201
399
  const previousVersion = await assertManagedRuntime(previousRoot);
202
400
  const currentVersion = await readPackageVersion(currentRoot);
203
401
  const metadata = await readHostedRuntimeMetadata(previousRoot);
402
+ const hostedRelease = await readHostedReleaseBinding(previousRoot, metadata, previousVersion);
204
403
 
205
404
  await atomicSymlink(currentRoot, paths.previousLink);
206
405
  await atomicSymlink(previousRoot, paths.currentLink);
@@ -211,6 +410,7 @@ export async function rollbackManagedRuntime(params) {
211
410
  profile: manifest.profile,
212
411
  version: previousVersion,
213
412
  dependencyHash: metadata?.dependencyHash,
413
+ hostedRelease,
214
414
  previousVersion: currentVersion,
215
415
  });
216
416
  await atomicWriteJson(paths.manifestPath, previousManifest, 0o600);
@@ -233,6 +433,8 @@ if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.ar
233
433
  }
234
434
 
235
435
  export const __testing = {
436
+ parseArgs,
437
+ resolveHostTransaction,
236
438
  installStableFiles,
237
439
  moveDirectory,
238
440
  replaceWithSymlink,
@@ -2,8 +2,9 @@ import fs from "node:fs";
2
2
  import fsp from "node:fs/promises";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
+ import { readHostedReleaseManifestV2 } from "./hosted-release-manifest.mjs";
5
6
 
6
- export const MANAGED_INSTALL_SCHEMA_VERSION = 1;
7
+ export const MANAGED_INSTALL_SCHEMA_VERSION = 2;
7
8
 
8
9
  export function resolveManagedStateDir(env = process.env, homedir = os.homedir) {
9
10
  return path.resolve(
@@ -51,7 +52,7 @@ export function normalizeManagedProfile(value) {
51
52
  export function readManagedInstallManifest(manifestPath) {
52
53
  try {
53
54
  const parsed = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
54
- if (parsed?.schemaVersion !== MANAGED_INSTALL_SCHEMA_VERSION) {
55
+ if (parsed?.schemaVersion !== 1 && parsed?.schemaVersion !== MANAGED_INSTALL_SCHEMA_VERSION) {
55
56
  return null;
56
57
  }
57
58
  if (!parsed.runtime || typeof parsed.runtime.activeVersion !== "string") {
@@ -79,7 +80,13 @@ export async function readHostedRuntimeMetadata(packageRoot) {
79
80
  const parsed = JSON.parse(
80
81
  await fsp.readFile(path.join(packageRoot, ".fased-hosted-runtime.json"), "utf8"),
81
82
  );
82
- if (parsed?.schemaVersion !== 1 || !/^[a-f0-9]{64}$/.test(parsed.dependencyHash || "")) {
83
+ if (
84
+ !new Set([1, 2]).has(parsed?.schemaVersion) ||
85
+ !/^[a-f0-9]{64}$/.test(parsed.dependencyHash || "") ||
86
+ (parsed.schemaVersion === 2 &&
87
+ (!/^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(parsed.version || "") ||
88
+ !/^[a-f0-9]{40}$/.test(parsed.commit || "")))
89
+ ) {
83
90
  return null;
84
91
  }
85
92
  return parsed;
@@ -88,6 +95,45 @@ export async function readHostedRuntimeMetadata(packageRoot) {
88
95
  }
89
96
  }
90
97
 
98
+ export async function readHostedReleaseBinding(packageRoot, metadata, expectedVersion) {
99
+ const releasePath = path.join(packageRoot, ".fased-hosted-release-v2.json");
100
+ let release;
101
+ try {
102
+ release = await readHostedReleaseManifestV2(releasePath, { version: expectedVersion });
103
+ } catch (error) {
104
+ if (error?.code === "ENOENT" && metadata?.schemaVersion !== 2) {
105
+ return null;
106
+ }
107
+ throw error;
108
+ }
109
+ const architecture = process.arch === "x64" ? "x64" : process.arch === "arm64" ? "arm64" : null;
110
+ if (!architecture) {
111
+ throw new Error(`Managed Hosting release has no Linux artifact for ${process.arch}.`);
112
+ }
113
+ const app = release.manifest.application.linux[architecture];
114
+ if (
115
+ metadata?.schemaVersion !== 2 ||
116
+ metadata.version !== expectedVersion ||
117
+ metadata.commit !== release.manifest.release.commit ||
118
+ metadata.dependencyHash !== app.dependencies.dependencyHash
119
+ ) {
120
+ throw new Error("Managed Hosting app metadata does not match its attested release manifest.");
121
+ }
122
+ return Object.freeze({
123
+ manifestDigest: release.digest,
124
+ version: release.manifest.release.version,
125
+ commit: release.manifest.release.commit,
126
+ appArtifact: app.artifact.asset,
127
+ appArtifactDigest: `sha256:${app.artifact.sha256}`,
128
+ dependencyArtifact: app.dependencies.asset,
129
+ dependencyArtifactDigest: `sha256:${app.dependencies.sha256}`,
130
+ dependencyHash: app.dependencies.dependencyHash,
131
+ signer: release.manifest.signer.release,
132
+ capabilities: release.manifest.signer.capabilities,
133
+ capabilitiesDigest: release.manifest.signer.capabilitiesDigest,
134
+ });
135
+ }
136
+
91
137
  export async function assertManagedRuntime(packageRoot, expectedVersion) {
92
138
  const version = await readPackageVersion(packageRoot);
93
139
  if (!version || (expectedVersion && version !== expectedVersion)) {
@@ -152,6 +198,7 @@ export function buildManagedInstallManifest({
152
198
  profile,
153
199
  version,
154
200
  dependencyHash,
201
+ hostedRelease,
155
202
  previousVersion,
156
203
  source = "managed-artifact",
157
204
  }) {
@@ -169,6 +216,10 @@ export function buildManagedInstallManifest({
169
216
  previousLink: paths.previousLink,
170
217
  releasesDir: paths.releasesDir,
171
218
  dependencyHash: dependencyHash || null,
219
+ releaseManifestDigest: hostedRelease?.manifestDigest || null,
220
+ appCommit: hostedRelease?.commit || null,
221
+ appArtifact: hostedRelease?.appArtifact || null,
222
+ appArtifactDigest: hostedRelease?.appArtifactDigest || null,
172
223
  },
173
224
  package: {
174
225
  prefix: paths.prefix,
@@ -183,6 +234,27 @@ export function buildManagedInstallManifest({
183
234
  version,
184
235
  path: paths.updaterPath,
185
236
  },
237
+ release: hostedRelease
238
+ ? {
239
+ version: hostedRelease.version,
240
+ commit: hostedRelease.commit,
241
+ manifestDigest: hostedRelease.manifestDigest,
242
+ application: {
243
+ artifact: hostedRelease.appArtifact,
244
+ digest: hostedRelease.appArtifactDigest,
245
+ dependencies: {
246
+ artifact: hostedRelease.dependencyArtifact,
247
+ digest: hostedRelease.dependencyArtifactDigest,
248
+ dependencyHash: hostedRelease.dependencyHash,
249
+ },
250
+ },
251
+ signer: {
252
+ release: hostedRelease.signer,
253
+ capabilities: hostedRelease.capabilities,
254
+ capabilitiesDigest: hostedRelease.capabilitiesDigest,
255
+ },
256
+ }
257
+ : null,
186
258
  updatedAt: new Date().toISOString(),
187
259
  };
188
260
  }
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "node:child_process";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const SIGNER_BINARY = "/opt/fased/signer/fased-signerd";
7
+ const FIXED_ARGS = [
8
+ "admin",
9
+ "migration",
10
+ "hosted-v1",
11
+ "--control-socket",
12
+ "/run/fased-signerd/control.sock",
13
+ "--policy-file",
14
+ "/etc/fased/signer-migration-policies.json",
15
+ "--app-home",
16
+ "/home/app",
17
+ "--legacy-signer-home",
18
+ "/home/fased-signer",
19
+ "--state-dir",
20
+ "/var/lib/fased-signerd",
21
+ "--marker-file",
22
+ "/var/lib/fased-host-updater/signer-v1-migration.pending",
23
+ ];
24
+
25
+ function fail(message) {
26
+ throw new Error(message);
27
+ }
28
+
29
+ function resolvePhase(argv = process.argv) {
30
+ if (argv.length !== 3 || !new Set(["prepare", "commit"]).has(argv[2])) {
31
+ fail("usage: migrate-hosted-signer-v2.mjs {prepare|commit}");
32
+ }
33
+ return argv[2];
34
+ }
35
+
36
+ function run(phase) {
37
+ const child = spawnSync(SIGNER_BINARY, [...FIXED_ARGS, "--phase", phase], {
38
+ env: {
39
+ HOME: "/var/lib/fased-host-updater",
40
+ LANG: "C",
41
+ LC_ALL: "C",
42
+ PATH: "/usr/sbin:/usr/bin:/sbin:/bin",
43
+ },
44
+ stdio: "inherit",
45
+ });
46
+ if (child.error) {
47
+ fail("the verified native signer migration command could not be started");
48
+ }
49
+ if (child.status !== 0) {
50
+ process.exitCode = child.status ?? 1;
51
+ }
52
+ }
53
+
54
+ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
55
+ run(resolvePhase());
56
+ }
57
+
58
+ export const __testing = { FIXED_ARGS, SIGNER_BINARY, resolvePhase };