@fased/fased 0.1.60 → 0.1.62

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 (275) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/acp/client.js +2 -2
  3. package/dist/acp/secret-file.js +2 -2
  4. package/dist/agents/agent-scope.js +2 -2
  5. package/dist/agents/apply-patch.js +8 -8
  6. package/dist/agents/auth-profiles/paths.js +2 -2
  7. package/dist/agents/auth-profiles/store.js +2 -2
  8. package/dist/agents/bash-tools.shared.js +2 -2
  9. package/dist/agents/cli-credentials.js +4 -4
  10. package/dist/agents/docs-path.js +3 -3
  11. package/dist/agents/embedded-pi-mcp.js +4 -4
  12. package/dist/agents/identity-avatar.js +3 -3
  13. package/dist/agents/identity-file.js +2 -2
  14. package/dist/agents/openai-codex-app-server.js +5 -5
  15. package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
  16. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
  17. package/dist/agents/pi-model-discovery.js +6 -6
  18. package/dist/agents/pi-project-settings.js +3 -3
  19. package/dist/agents/sandbox/fs-bridge.js +2 -2
  20. package/dist/agents/session-dirs.js +4 -4
  21. package/dist/agents/session-write-lock.js +13 -13
  22. package/dist/agents/shell-utils.js +5 -5
  23. package/dist/agents/skills/bundled-dir.js +4 -4
  24. package/dist/agents/skills/local-loader.js +6 -6
  25. package/dist/agents/skills/plugin-skills.js +2 -2
  26. package/dist/agents/skills/workspace.js +13 -13
  27. package/dist/agents/skills-install-download.js +7 -7
  28. package/dist/agents/skills-install-plan.js +2 -2
  29. package/dist/agents/skills-install.js +2 -2
  30. package/dist/agents/skills-status.js +2 -2
  31. package/dist/agents/subagent-depth.js +2 -2
  32. package/dist/agents/system-prompt-params.js +2 -2
  33. package/dist/agents/workspace.js +22 -22
  34. package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
  35. package/dist/auto-reply/reply/agent-runner.js +2 -2
  36. package/dist/auto-reply/reply/commands-export-session.js +7 -7
  37. package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
  38. package/dist/auto-reply/reply/post-compaction-context.js +3 -3
  39. package/dist/auto-reply/reply/session.js +3 -3
  40. package/dist/auto-reply/skill-commands.js +3 -3
  41. package/dist/auto-reply/status.js +6 -6
  42. package/dist/brand.js +1 -1
  43. package/dist/browser/chrome.executables.js +3 -3
  44. package/dist/browser/chrome.js +3 -3
  45. package/dist/browser/chrome.profile-decoration.js +6 -6
  46. package/dist/browser/profiles-service.js +2 -2
  47. package/dist/browser/server-context.js +2 -2
  48. package/dist/browser/trash.js +4 -4
  49. package/dist/build-info.json +3 -3
  50. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  51. package/dist/canvas-host/server.js +4 -4
  52. package/dist/capabilities/catalog.js +3 -3
  53. package/dist/channels/plugins/catalog.js +3 -3
  54. package/dist/cli/browser-cli-extension.js +6 -6
  55. package/dist/cli/command-format.js +2 -2
  56. package/dist/cli/cron-cli/register.cron-simple.js +2 -2
  57. package/dist/cli/dns-cli.js +9 -9
  58. package/dist/cli/gateway-cli/dev.js +5 -5
  59. package/dist/cli/gateway-cli/run.js +2 -2
  60. package/dist/cli/hooks-cli.js +5 -5
  61. package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
  62. package/dist/cli/memory-cli.js +7 -7
  63. package/dist/cli/nodes-media-utils.js +2 -2
  64. package/dist/cli/plugins-cli.js +2 -2
  65. package/dist/cli/secrets-cli.js +3 -3
  66. package/dist/cli/windows-argv.js +2 -2
  67. package/dist/commands/dashboard-link.js +3 -3
  68. package/dist/commands/doctor-install.js +5 -5
  69. package/dist/commands/doctor-memory-search.js +2 -2
  70. package/dist/commands/doctor-platform-notes.js +2 -2
  71. package/dist/commands/doctor-sandbox.js +2 -2
  72. package/dist/commands/doctor-state-integrity.js +23 -23
  73. package/dist/commands/doctor-workspace.js +3 -3
  74. package/dist/commands/doctor.js +3 -3
  75. package/dist/commands/managed-up.js +2 -2
  76. package/dist/commands/onboard-auth.credentials.js +3 -3
  77. package/dist/commands/onboarding/plugin-install.js +2 -2
  78. package/dist/commands/sessions-cleanup.js +2 -2
  79. package/dist/commands/signal-install.js +6 -6
  80. package/dist/commands/status-all/channels.js +2 -2
  81. package/dist/commands/wallet.js +47 -47
  82. package/dist/config/cache-utils.js +2 -2
  83. package/dist/config/includes.js +5 -5
  84. package/dist/config/io.js +2 -2
  85. package/dist/config/paths.js +3 -3
  86. package/dist/config/sat-runtime-ids.js +3 -3
  87. package/dist/config/sessions/disk-budget.js +6 -6
  88. package/dist/config/sessions/paths.js +2 -2
  89. package/dist/config/sessions/store.js +17 -17
  90. package/dist/config/sessions/transcript.js +4 -4
  91. package/dist/config/talk.js +2 -2
  92. package/dist/control-ui/assets/{app-CqF4Tc9n.js → app-DLil9VO1.js} +3 -3
  93. package/dist/control-ui/assets/{index-DYggPSfy.js → index-DdE_NIXo.js} +3 -3
  94. package/dist/control-ui/index.html +1 -1
  95. package/dist/control-ui/version.json +1 -1
  96. package/dist/cron/service/store.js +2 -2
  97. package/dist/cron/store.js +6 -6
  98. package/dist/daemon/systemd-system.js +5 -5
  99. package/dist/discord/monitor/thread-bindings.state.js +2 -2
  100. package/dist/extensions/sat-mining/src/sat-bond-layout.js +9 -9
  101. package/dist/gateway/control-ui-boot-check.js +6 -6
  102. package/dist/gateway/control-ui-login.js +7 -7
  103. package/dist/gateway/control-ui.js +9 -9
  104. package/dist/gateway/hooks-mapping.js +4 -4
  105. package/dist/gateway/server-discovery.js +2 -2
  106. package/dist/gateway/server-http.js +4 -4
  107. package/dist/gateway/server-methods/chat.js +3 -3
  108. package/dist/gateway/server-methods/sessions.js +6 -6
  109. package/dist/gateway/server-methods/usage.js +2 -2
  110. package/dist/gateway/server.impl.js +3 -3
  111. package/dist/gateway/session-compaction-checkpoints.js +4 -4
  112. package/dist/gateway/session-utils.fs.js +24 -24
  113. package/dist/gateway/session-utils.js +6 -6
  114. package/dist/hooks/bundled-dir.js +4 -4
  115. package/dist/hooks/gmail-setup-utils.js +6 -6
  116. package/dist/hooks/import-url.js +2 -2
  117. package/dist/hooks/loader.js +4 -4
  118. package/dist/hooks/workspace.js +7 -7
  119. package/dist/infra/archive.js +17 -17
  120. package/dist/infra/boundary-file-read.js +2 -2
  121. package/dist/infra/boundary-path.js +15 -15
  122. package/dist/infra/brew.js +2 -2
  123. package/dist/infra/control-ui-assets.js +14 -14
  124. package/dist/infra/device-auth-store.js +8 -8
  125. package/dist/infra/device-identity.js +8 -8
  126. package/dist/infra/dotenv.js +2 -2
  127. package/dist/infra/exec-approvals.js +8 -8
  128. package/dist/infra/exec-command-resolution.js +4 -4
  129. package/dist/infra/exec-safe-bin-trust.js +2 -2
  130. package/dist/infra/fased-root.js +5 -5
  131. package/dist/infra/fs-safe.js +14 -14
  132. package/dist/infra/gateway-lock.js +11 -11
  133. package/dist/infra/git-commit.js +5 -5
  134. package/dist/infra/git-root.js +4 -4
  135. package/dist/infra/hosted-runtime-artifact.js +3 -3
  136. package/dist/infra/is-main.js +2 -2
  137. package/dist/infra/json-file.js +7 -7
  138. package/dist/infra/managed-runtime-bootstrap.js +6 -6
  139. package/dist/infra/outbound/delivery-queue.js +16 -16
  140. package/dist/infra/path-env.js +3 -3
  141. package/dist/infra/ports-lsof.js +4 -4
  142. package/dist/infra/provider-usage.auth.js +3 -3
  143. package/dist/infra/safe-open-sync.js +2 -2
  144. package/dist/infra/session-cost-usage.js +9 -9
  145. package/dist/infra/shell-env.js +2 -2
  146. package/dist/infra/state-migrations.fs.js +6 -6
  147. package/dist/infra/state-migrations.js +23 -23
  148. package/dist/infra/tmp-fased-dir.js +6 -6
  149. package/dist/infra/widearea-dns.js +3 -3
  150. package/dist/infra/wsl.js +2 -2
  151. package/dist/line/accounts.js +2 -2
  152. package/dist/line/download.js +2 -2
  153. package/dist/logging/config.js +3 -3
  154. package/dist/logging/logger.js +7 -7
  155. package/dist/managed/federation.js +3 -3
  156. package/dist/managed/tunnel.js +3 -3
  157. package/dist/media/store.js +13 -13
  158. package/dist/media-understanding/runner.js +3 -3
  159. package/dist/memory/embeddings.js +2 -2
  160. package/dist/memory/internal.js +10 -10
  161. package/dist/memory/manager-sync-ops.js +7 -7
  162. package/dist/memory/repair-executor.js +17 -17
  163. package/dist/node-host/invoke-system-run-plan.js +8 -8
  164. package/dist/node-host/invoke.js +2 -2
  165. package/dist/node-host/runner.js +3 -3
  166. package/dist/pairing/pairing-store.js +3 -3
  167. package/dist/plugin-sdk/{audio-preflight-C2QXh5Ml.js → audio-preflight-Bwi2Oq03.js} +2 -2
  168. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  169. package/dist/plugin-sdk/{chunk-items-3ZyiGiff.js → chunk-items-DzT4L4Ty.js} +1 -1
  170. package/dist/plugin-sdk/command-status.js +2 -2
  171. package/dist/plugin-sdk/{config-schema-C9tx1Lyz.js → config-schema-BrkmtFxB.js} +16 -16
  172. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  173. package/dist/plugin-sdk/discord.d.ts +4 -4
  174. package/dist/plugin-sdk/index.d.ts +20 -20
  175. package/dist/plugin-sdk/index.js +2 -2
  176. package/dist/plugin-sdk/json-store.js +6 -6
  177. package/dist/plugin-sdk/{monitor-Xgx6vGcg.js → monitor-M_ta2lMc.js} +4 -4
  178. package/dist/plugin-sdk/{monitor-XbunF2-r.js → monitor-wYVncM9w.js} +6 -6
  179. package/dist/plugin-sdk/{openresponses-http-BRUr0JLE.js → openresponses-http-B2GmeSt4.js} +2 -2
  180. package/dist/plugin-sdk/{pairing-message-C403mq4K.d.ts → pairing-message-B3bHYGaw.d.ts} +1 -1
  181. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +1 -1
  182. package/dist/plugin-sdk/{pw-ai-BzV0f18N.js → pw-ai-AFUqn-tQ.js} +1 -1
  183. package/dist/plugin-sdk/{runtime-dependency-Ch7J9a0d.js → runtime-dependency-DLDmB94f.js} +9 -9
  184. package/dist/plugin-sdk/sat-runtime.d.ts +2 -2
  185. package/dist/plugin-sdk/sat-runtime.js +2 -2
  186. package/dist/plugin-sdk/{slack-BzJfCWjq.js → slack-CxE1mfzj.js} +4 -4
  187. package/dist/plugin-sdk/slack.d.ts +4 -4
  188. package/dist/plugin-sdk/{sticker-cache-Dex-XpRj.js → sticker-cache-CGzGWu00.js} +2 -2
  189. package/dist/plugin-sdk/{telegram-actions-DoFTGX4z.js → telegram-actions-DaEcYQ8r.js} +3 -3
  190. package/dist/plugin-sdk/telegram.d.ts +4 -4
  191. package/dist/plugin-sdk/{tmp-fased-dir-Ouj58axY.d.ts → tmp-fased-dir-CS6zsYEE.d.ts} +1 -1
  192. package/dist/plugin-sdk/{types-B4hj6HgR.d.ts → types-DFAW-n1J.d.ts} +1 -1
  193. package/dist/plugin-sdk/{types-dWZFX1fk.d.ts → types-vcJrC_uv.d.ts} +2 -2
  194. package/dist/plugin-sdk/{web--wC3ZfVl.js → web-CInY-lCv.js} +2 -2
  195. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  196. package/dist/plugin-sdk/{zod-schema.providers-core-FaYR6KdD.d.ts → zod-schema.providers-core-BEbNizPe.d.ts} +78 -78
  197. package/dist/plugins/bundled-dir.js +3 -3
  198. package/dist/plugins/discovery.js +11 -11
  199. package/dist/plugins/loader.js +13 -13
  200. package/dist/plugins/manifest-registry.js +2 -2
  201. package/dist/plugins/manifest.js +4 -4
  202. package/dist/plugins/path-safety.js +3 -3
  203. package/dist/plugins/status-cache.js +9 -9
  204. package/dist/plugins/update.js +3 -3
  205. package/dist/plugins/web-search-install-catalog.js +3 -3
  206. package/dist/secrets/apply.js +16 -16
  207. package/dist/secrets/audit.js +11 -11
  208. package/dist/secrets/shared.js +9 -9
  209. package/dist/security/scan-paths.js +2 -2
  210. package/dist/shared/config-eval.js +2 -2
  211. package/dist/shared/pid-alive.js +2 -2
  212. package/dist/tasks/standing-orders.js +5 -5
  213. package/dist/tasks/task-flow-registry.js +5 -5
  214. package/dist/tasks/task-registry.js +5 -5
  215. package/dist/tasks/workflow-definitions.js +6 -6
  216. package/dist/telegram/token.js +5 -5
  217. package/dist/utils.js +5 -5
  218. package/dist/wallet/local-socket-signer-broker.js +16 -16
  219. package/dist/wallet/providers/embedded-keystore-adapter.js +5 -5
  220. package/dist/wallet/providers/local-socket-signer-adapter.js +2 -2
  221. package/dist/wallet/wallet-approval-auth.js +5 -5
  222. package/dist/wallet/wallet-audit-log.js +5 -5
  223. package/dist/wallet/wallet-custody.js +21 -21
  224. package/dist/wallet/wallet-inbound-events.js +5 -5
  225. package/dist/wallet/wallet-observability.js +5 -5
  226. package/dist/wallet/wallet-policy.js +9 -9
  227. package/dist/wallet/wallet-provider-registry.js +7 -7
  228. package/dist/wallet/wallet-runtime-config.js +3 -3
  229. package/dist/wallet/wallet-secrets-store.js +22 -22
  230. package/dist/wallet/wallet-send-approvals.js +5 -5
  231. package/dist/wallet/wallet-settlement-links.js +5 -5
  232. package/dist/web/accounts.js +3 -3
  233. package/dist/web/auth-store.js +18 -18
  234. package/dist/web/session.js +4 -4
  235. package/dist/wizard/host-security-capability.js +2 -2
  236. package/dist/wizard/onboarding.host-security.js +7 -7
  237. package/dist/wizard/onboarding.js +11 -28
  238. package/dist/wizard/onboarding.wallet.js +132 -85
  239. package/extensions/acpx/package.json +1 -1
  240. package/extensions/bluebubbles/package.json +1 -1
  241. package/extensions/copilot-proxy/package.json +1 -1
  242. package/extensions/diagnostics-otel/package.json +1 -1
  243. package/extensions/fased-federation/package.json +1 -1
  244. package/extensions/google-gemini-cli-auth/package.json +1 -1
  245. package/extensions/imessage/package.json +1 -1
  246. package/extensions/irc/package.json +1 -1
  247. package/extensions/line/package.json +1 -1
  248. package/extensions/llm-task/package.json +1 -1
  249. package/extensions/lobster/package.json +1 -1
  250. package/extensions/matrix/CHANGELOG.md +12 -0
  251. package/extensions/matrix/package.json +1 -1
  252. package/extensions/mattermost/package.json +1 -1
  253. package/extensions/memory-core/package.json +2 -2
  254. package/extensions/memory-lancedb/package.json +1 -1
  255. package/extensions/minimax-portal-auth/package.json +1 -1
  256. package/extensions/msteams/CHANGELOG.md +12 -0
  257. package/extensions/msteams/package.json +1 -1
  258. package/extensions/nextcloud-talk/package.json +1 -1
  259. package/extensions/nostr/CHANGELOG.md +12 -0
  260. package/extensions/nostr/package.json +1 -1
  261. package/extensions/open-prose/package.json +1 -1
  262. package/extensions/sat-mining/package.json +1 -1
  263. package/extensions/signal/package.json +1 -1
  264. package/extensions/synology-chat/package.json +1 -1
  265. package/extensions/tlon/package.json +1 -1
  266. package/extensions/twitch/CHANGELOG.md +12 -0
  267. package/extensions/twitch/package.json +1 -1
  268. package/extensions/voice-call/CHANGELOG.md +12 -0
  269. package/extensions/voice-call/package.json +1 -1
  270. package/extensions/zalo/CHANGELOG.md +12 -0
  271. package/extensions/zalo/package.json +1 -1
  272. package/extensions/zalouser/CHANGELOG.md +12 -0
  273. package/extensions/zalouser/package.json +1 -1
  274. package/package.json +2 -1
  275. package/scripts/install-fased-signerd.sh +142 -0
@@ -15,7 +15,7 @@ import { startLocalSocketSignerBroker } from "../wallet/local-socket-signer-brok
15
15
  import { listWalletInboundEvents, pollWalletInboundEvents, reconcileWalletInboundEvents } from "../wallet/wallet-inbound-events.js";
16
16
  import { buildWalletCanaryReport, runWalletProviderCanaryReport } from "../wallet/wallet-canary.js";
17
17
  import { resolveSignerdBinaryPath, restartLocalSocketSigner } from "../wizard/onboarding.wallet.js";
18
- import fs from "node:fs";
18
+ import syncFs from "node:fs";
19
19
  import path from "node:path";
20
20
  import { createCipheriv, createDecipheriv, createPrivateKey, createPublicKey, randomBytes, scryptSync } from "node:crypto";
21
21
  import { createInterface } from "node:readline/promises";
@@ -676,12 +676,12 @@ function resolveKeystorePassphrase(optionsPassphrase, env) {
676
676
  return optionsPassphrase.trim();
677
677
  }
678
678
  const file = String(env.FASED_WALLET_PASSPHRASE_FILE ?? "").trim();
679
- if (file && fs.existsSync(file)) {
680
- return fs.readFileSync(file, "utf8").trim();
679
+ if (file && syncFs.existsSync(file)) {
680
+ return syncFs.readFileSync(file, "utf8").trim();
681
681
  }
682
682
  const managedFile = path.join(resolveLocalSignerMaterialRootDir(env), "passphrase");
683
- if (fs.existsSync(managedFile)) {
684
- return fs.readFileSync(managedFile, "utf8").trim();
683
+ if (syncFs.existsSync(managedFile)) {
684
+ return syncFs.readFileSync(managedFile, "utf8").trim();
685
685
  }
686
686
  return String(env.FASED_WALLET_PASSPHRASE ?? "").trim();
687
687
  }
@@ -697,7 +697,7 @@ function resolveLocalSignerPassphraseSource(env) {
697
697
  const candidates = [configuredFile ? path.resolve(configuredFile) : "", path.join(resolveLocalSignerMaterialRootDir(env), "passphrase")].filter(Boolean);
698
698
  for (const candidate of candidates) {
699
699
  try {
700
- const value = fs.readFileSync(candidate, "utf8").trim();
700
+ const value = syncFs.readFileSync(candidate, "utf8").trim();
701
701
  if (value) {
702
702
  return {
703
703
  kind: "file",
@@ -775,16 +775,16 @@ function ensureLocalSignerPassphraseFileForCustodyDisable(params) {
775
775
  };
776
776
  }
777
777
  function writePassphraseFile(filePath, passphrase) {
778
- fs.mkdirSync(path.dirname(filePath), {
778
+ syncFs.mkdirSync(path.dirname(filePath), {
779
779
  recursive: true,
780
780
  mode: 448
781
781
  });
782
- fs.writeFileSync(filePath, `${passphrase}\n`, {
782
+ syncFs.writeFileSync(filePath, `${passphrase}\n`, {
783
783
  encoding: "utf8",
784
784
  mode: 384
785
785
  });
786
786
  try {
787
- fs.chmodSync(filePath, 384);
787
+ syncFs.chmodSync(filePath, 384);
788
788
  } catch {}
789
789
  }
790
790
  function walletIdsMatchForEnvSuffix(left, right) {
@@ -824,7 +824,7 @@ function collectLocalSignerKeystoreTargets(cfg, env) {
824
824
  return;
825
825
  }
826
826
  const resolved = path.resolve(candidate);
827
- if (!fs.existsSync(resolved)) {
827
+ if (!syncFs.existsSync(resolved)) {
828
828
  return;
829
829
  }
830
830
  const existing = targets.get(resolved);
@@ -851,8 +851,8 @@ function collectLocalSignerKeystoreTargets(cfg, env) {
851
851
  addTarget("solana", value, key.slice("FASED_WALLET_SOLANA_KEYSTORE_PATH__".length).toLowerCase());
852
852
  }
853
853
  }
854
- if (fs.existsSync(materialRoot)) {
855
- for (const entry of fs.readdirSync(materialRoot, { withFileTypes: true })) {
854
+ if (syncFs.existsSync(materialRoot)) {
855
+ for (const entry of syncFs.readdirSync(materialRoot, { withFileTypes: true })) {
856
856
  if (!entry.isFile()) {
857
857
  continue;
858
858
  }
@@ -872,7 +872,7 @@ function collectLocalSignerKeystoreTargets(cfg, env) {
872
872
  return [...targets.values()].toSorted((left, right) => left.label.localeCompare(right.label));
873
873
  }
874
874
  async function reencryptLocalSignerKeystore(params) {
875
- const raw = fs.readFileSync(params.target.path, "utf8");
875
+ const raw = syncFs.readFileSync(params.target.path, "utf8");
876
876
  const detected = detectEmbeddedKeystoreType(raw);
877
877
  if (detected === "solana-envelope") {
878
878
  const envelope = parseSolanaKeystoreEnvelope(raw);
@@ -885,7 +885,7 @@ async function reencryptLocalSignerKeystore(params) {
885
885
  passphrase: params.newPassphrase,
886
886
  publicKey: envelope.publicKey
887
887
  });
888
- fs.writeFileSync(params.target.path, `${JSON.stringify(nextEnvelope, null, 2)}\n`, {
888
+ syncFs.writeFileSync(params.target.path, `${JSON.stringify(nextEnvelope, null, 2)}\n`, {
889
889
  encoding: "utf8",
890
890
  mode: 384
891
891
  });
@@ -906,13 +906,13 @@ function removeLocalSignerPassphraseFileIfManaged(env) {
906
906
  const resolved = path.resolve(configured);
907
907
  const materialRoot = resolveLocalSignerMaterialRootDir(env);
908
908
  const withinMaterialRoot = resolved === materialRoot || resolved.startsWith(`${materialRoot}${path.sep}`);
909
- if (!withinMaterialRoot || !fs.existsSync(resolved)) {
909
+ if (!withinMaterialRoot || !syncFs.existsSync(resolved)) {
910
910
  return {
911
911
  removed: false,
912
912
  path: resolved
913
913
  };
914
914
  }
915
- fs.rmSync(resolved, { force: true });
915
+ syncFs.rmSync(resolved, { force: true });
916
916
  return {
917
917
  removed: true,
918
918
  path: resolved
@@ -950,11 +950,11 @@ function writeLocalSignerEnvFile(cfg, env) {
950
950
  "",
951
951
  `"${signerBinPath}" --socket "\${FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET:-$FASED_WALLET_LOCAL_SIGNER_SOCKET}"`
952
952
  ];
953
- fs.mkdirSync(path.dirname(signerEnvPath), {
953
+ syncFs.mkdirSync(path.dirname(signerEnvPath), {
954
954
  recursive: true,
955
955
  mode: 448
956
956
  });
957
- fs.writeFileSync(signerEnvPath, `${signerEnvLines.join("\n")}\n`, {
957
+ syncFs.writeFileSync(signerEnvPath, `${signerEnvLines.join("\n")}\n`, {
958
958
  encoding: "utf8",
959
959
  mode: 384
960
960
  });
@@ -1052,11 +1052,11 @@ async function configureLocalSignerMode(runtime, options, env) {
1052
1052
  "",
1053
1053
  `"${signerBinPath}" --socket "\${FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET:-$FASED_WALLET_LOCAL_SIGNER_SOCKET}"`
1054
1054
  ];
1055
- fs.mkdirSync(path.dirname(signerEnvPath), {
1055
+ syncFs.mkdirSync(path.dirname(signerEnvPath), {
1056
1056
  recursive: true,
1057
1057
  mode: 448
1058
1058
  });
1059
- fs.writeFileSync(signerEnvPath, `${signerEnvLines.join("\n")}\n`, {
1059
+ syncFs.writeFileSync(signerEnvPath, `${signerEnvLines.join("\n")}\n`, {
1060
1060
  encoding: "utf8",
1061
1061
  mode: 384
1062
1062
  });
@@ -1500,10 +1500,10 @@ async function walletKeystoreInitCommand(runtime = defaultRuntime, options = {})
1500
1500
  }
1501
1501
  const chain = options.chain ?? "solana";
1502
1502
  const outPath = resolveEmbeddedKeystorePathForChain(env, chain, options.out, options.walletId);
1503
- if (fs.existsSync(outPath) && !options.force) {
1503
+ if (syncFs.existsSync(outPath) && !options.force) {
1504
1504
  throw new Error(`Keystore already exists: ${outPath}`);
1505
1505
  }
1506
- fs.mkdirSync(path.dirname(outPath), {
1506
+ syncFs.mkdirSync(path.dirname(outPath), {
1507
1507
  recursive: true,
1508
1508
  mode: 448
1509
1509
  });
@@ -1518,14 +1518,14 @@ async function walletKeystoreInitCommand(runtime = defaultRuntime, options = {})
1518
1518
  passphrase,
1519
1519
  publicKey
1520
1520
  });
1521
- fs.writeFileSync(outPath, `${JSON.stringify(envelope, null, 2)}\n`, {
1521
+ syncFs.writeFileSync(outPath, `${JSON.stringify(envelope, null, 2)}\n`, {
1522
1522
  encoding: "utf8",
1523
1523
  mode: 384
1524
1524
  });
1525
1525
  addressOut = publicKey;
1526
1526
  privateKeyOut = Buffer.from(secretKey).toString("base64");
1527
1527
  try {
1528
- fs.chmodSync(outPath, 384);
1528
+ syncFs.chmodSync(outPath, 384);
1529
1529
  } catch {}
1530
1530
  const cfg = options.skipProviderConfig ? ensureWalletMaterialConfig(loadConfig(), {
1531
1531
  keystorePath: outPath,
@@ -1600,10 +1600,10 @@ async function walletKeystoreImportCommand(runtime = defaultRuntime, options = {
1600
1600
  throw new Error("Missing private key. Pass --private-key or set FASED_WALLET_PRIVATE_KEY.");
1601
1601
  }
1602
1602
  const outPath = resolveEmbeddedKeystorePathForChain(env, chain, options.out, options.walletId);
1603
- if (fs.existsSync(outPath) && !options.force) {
1603
+ if (syncFs.existsSync(outPath) && !options.force) {
1604
1604
  throw new Error(`Keystore already exists: ${outPath}`);
1605
1605
  }
1606
- fs.mkdirSync(path.dirname(outPath), {
1606
+ syncFs.mkdirSync(path.dirname(outPath), {
1607
1607
  recursive: true,
1608
1608
  mode: 448
1609
1609
  });
@@ -1615,13 +1615,13 @@ async function walletKeystoreImportCommand(runtime = defaultRuntime, options = {
1615
1615
  passphrase,
1616
1616
  publicKey
1617
1617
  });
1618
- fs.writeFileSync(outPath, `${JSON.stringify(envelope, null, 2)}\n`, {
1618
+ syncFs.writeFileSync(outPath, `${JSON.stringify(envelope, null, 2)}\n`, {
1619
1619
  encoding: "utf8",
1620
1620
  mode: 384
1621
1621
  });
1622
1622
  addressOut = publicKey;
1623
1623
  try {
1624
- fs.chmodSync(outPath, 384);
1624
+ syncFs.chmodSync(outPath, 384);
1625
1625
  } catch {}
1626
1626
  const cfg = options.skipProviderConfig ? ensureWalletMaterialConfig(loadConfig(), {
1627
1627
  keystorePath: outPath,
@@ -1683,7 +1683,7 @@ async function walletKeystoreStatusCommand(runtime = defaultRuntime, options = {
1683
1683
  const cfg = loadConfig();
1684
1684
  const chain = options.chain ?? "solana";
1685
1685
  const keystorePath = resolveEmbeddedKeystorePathForChain(env, chain, cfg.wallet?.keystore?.path, options.walletId);
1686
- const exists = fs.existsSync(keystorePath);
1686
+ const exists = syncFs.existsSync(keystorePath);
1687
1687
  const providerId = cfg.wallet?.provider?.id;
1688
1688
  let address;
1689
1689
  let unlocked = false;
@@ -1691,7 +1691,7 @@ async function walletKeystoreStatusCommand(runtime = defaultRuntime, options = {
1691
1691
  let detectedType = "missing";
1692
1692
  if (exists) {
1693
1693
  const passphrase = resolveKeystorePassphrase(undefined, env);
1694
- const raw = fs.readFileSync(keystorePath, "utf8");
1694
+ const raw = syncFs.readFileSync(keystorePath, "utf8");
1695
1695
  detectedType = detectEmbeddedKeystoreType(raw);
1696
1696
  if (passphrase) {
1697
1697
  try {
@@ -1756,14 +1756,14 @@ async function walletKeystoreValidateCommand(runtime = defaultRuntime, options =
1756
1756
  };
1757
1757
  let raw = "";
1758
1758
  let detectedType = "missing";
1759
- if (!fs.existsSync(keystorePath)) {
1759
+ if (!syncFs.existsSync(keystorePath)) {
1760
1760
  result.checks.push({
1761
1761
  id: "keystore.exists",
1762
1762
  ok: false,
1763
1763
  message: `missing: ${keystorePath}`
1764
1764
  });
1765
1765
  } else {
1766
- raw = fs.readFileSync(keystorePath, "utf8");
1766
+ raw = syncFs.readFileSync(keystorePath, "utf8");
1767
1767
  detectedType = detectEmbeddedKeystoreType(raw);
1768
1768
  result.checks.push({
1769
1769
  id: "keystore.exists",
@@ -1865,7 +1865,7 @@ async function walletKeystoreValidateCommand(runtime = defaultRuntime, options =
1865
1865
  async function walletKeystorePassphraseInitCommand(runtime = defaultRuntime, options = {}) {
1866
1866
  const env = process.env ?? process.env;
1867
1867
  const outPath = resolvePassphraseFilePath(env, options.out);
1868
- if (fs.existsSync(outPath) && !options.force) {
1868
+ if (syncFs.existsSync(outPath) && !options.force) {
1869
1869
  throw new Error(`Passphrase file already exists: ${outPath} (use --force to overwrite)`);
1870
1870
  }
1871
1871
  const bytes = typeof options.length === "number" && Number.isFinite(options.length) && options.length >= 16 ? Math.floor(options.length) : 24;
@@ -1887,15 +1887,15 @@ async function walletKeystorePassphraseRotateCommand(runtime = defaultRuntime, o
1887
1887
  const cfg = loadConfig();
1888
1888
  const keystorePath = resolveEmbeddedKeystorePath(env, cfg.wallet?.keystore?.path);
1889
1889
  const passphraseFile = resolvePassphraseFilePath(env, options.file);
1890
- if (!fs.existsSync(keystorePath)) {
1890
+ if (!syncFs.existsSync(keystorePath)) {
1891
1891
  throw new Error(`Keystore missing: ${keystorePath}`);
1892
1892
  }
1893
- const oldPassphrase = (options.oldPassphrase ?? (fs.existsSync(passphraseFile) ? fs.readFileSync(passphraseFile, "utf8") : "")).trim() || String(env.FASED_WALLET_PASSPHRASE ?? "").trim();
1893
+ const oldPassphrase = (options.oldPassphrase ?? (syncFs.existsSync(passphraseFile) ? syncFs.readFileSync(passphraseFile, "utf8") : "")).trim() || String(env.FASED_WALLET_PASSPHRASE ?? "").trim();
1894
1894
  if (!oldPassphrase) {
1895
1895
  throw new Error("Missing old passphrase. Provide --old-passphrase or configure passphrase file/env.");
1896
1896
  }
1897
1897
  const newPassphrase = (options.newPassphrase ?? "").trim() || randomBytes(24).toString("base64url");
1898
- const raw = fs.readFileSync(keystorePath, "utf8");
1898
+ const raw = syncFs.readFileSync(keystorePath, "utf8");
1899
1899
  const detected = detectEmbeddedKeystoreType(raw);
1900
1900
  if (detected === "solana-envelope") {
1901
1901
  const envelope = parseSolanaKeystoreEnvelope(raw);
@@ -1908,7 +1908,7 @@ async function walletKeystorePassphraseRotateCommand(runtime = defaultRuntime, o
1908
1908
  passphrase: newPassphrase,
1909
1909
  publicKey: envelope.publicKey
1910
1910
  });
1911
- fs.writeFileSync(keystorePath, `${JSON.stringify(nextEnvelope, null, 2)}\n`, {
1911
+ syncFs.writeFileSync(keystorePath, `${JSON.stringify(nextEnvelope, null, 2)}\n`, {
1912
1912
  encoding: "utf8",
1913
1913
  mode: 384
1914
1914
  });
@@ -1933,10 +1933,10 @@ async function walletKeystoreExportCommand(runtime = defaultRuntime, options = {
1933
1933
  const env = process.env ?? process.env;
1934
1934
  const cfg = loadConfig();
1935
1935
  const keystorePath = resolveEmbeddedKeystorePath(env, cfg.wallet?.keystore?.path);
1936
- if (!fs.existsSync(keystorePath)) {
1936
+ if (!syncFs.existsSync(keystorePath)) {
1937
1937
  throw new Error(`Keystore missing: ${keystorePath}`);
1938
1938
  }
1939
- const raw = fs.readFileSync(keystorePath, "utf8");
1939
+ const raw = syncFs.readFileSync(keystorePath, "utf8");
1940
1940
  const detected = detectEmbeddedKeystoreType(raw);
1941
1941
  const outPath = options.out?.trim() ? path.resolve(options.out.trim()) : undefined;
1942
1942
  const payload = {
@@ -1949,11 +1949,11 @@ async function walletKeystoreExportCommand(runtime = defaultRuntime, options = {
1949
1949
  payload.keystore = raw;
1950
1950
  }
1951
1951
  if (outPath) {
1952
- fs.mkdirSync(path.dirname(outPath), {
1952
+ syncFs.mkdirSync(path.dirname(outPath), {
1953
1953
  recursive: true,
1954
1954
  mode: 448
1955
1955
  });
1956
- fs.writeFileSync(outPath, raw, {
1956
+ syncFs.writeFileSync(outPath, raw, {
1957
1957
  encoding: "utf8",
1958
1958
  mode: 384
1959
1959
  });
@@ -2139,7 +2139,7 @@ async function collectWalletSignerDoctorReport(env = process.env, options = {})
2139
2139
  const isNotFoundError = (err) => err?.code === "ENOENT";
2140
2140
  if (isLocalSigner) {
2141
2141
  try {
2142
- const st = fs.statSync(socketPath);
2142
+ const st = syncFs.statSync(socketPath);
2143
2143
  push("socket.exists", st.isSocket?.() ?? true, socketPath);
2144
2144
  try {
2145
2145
  const mode = st.mode & 511;
@@ -2149,7 +2149,7 @@ async function collectWalletSignerDoctorReport(env = process.env, options = {})
2149
2149
  push("socket.exists", localSignerSetupPending && isNotFoundError(err), localSignerSetupPending && isNotFoundError(err) ? "Configure" : String(err));
2150
2150
  }
2151
2151
  try {
2152
- const pidRaw = fs.readFileSync(pidPath, "utf8").trim();
2152
+ const pidRaw = syncFs.readFileSync(pidPath, "utf8").trim();
2153
2153
  const pid = Number.parseInt(pidRaw, 10);
2154
2154
  if (Number.isFinite(pid) && pid > 1) {
2155
2155
  try {
@@ -2165,7 +2165,7 @@ async function collectWalletSignerDoctorReport(env = process.env, options = {})
2165
2165
  push("pid.alive", localSignerSetupPending && isNotFoundError(err), localSignerSetupPending && isNotFoundError(err) ? "Configure" : String(err));
2166
2166
  }
2167
2167
  try {
2168
- const st = fs.statSync(auditPath);
2168
+ const st = syncFs.statSync(auditPath);
2169
2169
  push("audit.exists", true, `bytes=${st.size}`);
2170
2170
  } catch (err) {
2171
2171
  push("audit.exists", localSignerSetupPending && isNotFoundError(err), localSignerSetupPending && isNotFoundError(err) ? "Configure" : String(err));
@@ -2193,14 +2193,14 @@ async function collectWalletSignerDoctorReport(env = process.env, options = {})
2193
2193
  return "";
2194
2194
  }
2195
2195
  try {
2196
- return fs.readFileSync(p, "utf8").trim();
2196
+ return syncFs.readFileSync(p, "utf8").trim();
2197
2197
  } catch {
2198
2198
  return "";
2199
2199
  }
2200
2200
  })();
2201
2201
  const inspectKeystore = (label, keystorePath) => {
2202
2202
  try {
2203
- const raw = fs.readFileSync(keystorePath, "utf8");
2203
+ const raw = syncFs.readFileSync(keystorePath, "utf8");
2204
2204
  const kind = detectEmbeddedKeystoreType(raw);
2205
2205
  if (kind === "unknown") {
2206
2206
  push(`keystore.file.${label}`, false, `${keystorePath} type=unknown (expected fased-solana-keypair envelope)`);
@@ -2257,7 +2257,7 @@ async function collectWalletSignerDoctorReport(env = process.env, options = {})
2257
2257
  return true;
2258
2258
  }
2259
2259
  const defaultPath = resolveEmbeddedKeystorePathForChain(effectiveEnv, "solana");
2260
- if (fs.existsSync(defaultPath)) {
2260
+ if (syncFs.existsSync(defaultPath)) {
2261
2261
  return true;
2262
2262
  }
2263
2263
  if (providerDefaultWallet?.addresses?.solana) {
@@ -1,4 +1,4 @@
1
- import fs from "node:fs";
1
+ import syncFs from "node:fs";
2
2
 
3
3
  //#region src/config/cache-utils.ts
4
4
  function resolveCacheTtlMs(params) {
@@ -16,7 +16,7 @@ function isCacheEnabled(ttlMs) {
16
16
  }
17
17
  function getFileMtimeMs(filePath) {
18
18
  try {
19
- return fs.statSync(filePath).mtimeMs;
19
+ return syncFs.statSync(filePath).mtimeMs;
20
20
  } catch {
21
21
  return undefined;
22
22
  }
@@ -4,7 +4,7 @@ import { isBlockedObjectKey } from "../infra/prototype-keys.js";
4
4
  import { canUseBoundaryFileOpen, openBoundaryFileSync } from "../infra/boundary-file-read.js";
5
5
  import { isPathInside } from "../security/scan-paths.js";
6
6
  import "./prototype-keys.js";
7
- import fs from "node:fs";
7
+ import syncFs from "node:fs";
8
8
  import path from "node:path";
9
9
  import JSON5 from "json5";
10
10
 
@@ -130,7 +130,7 @@ var IncludeProcessor = class IncludeProcessor {
130
130
  throw new ConfigIncludeError(`Include path escapes config directory: ${includePath} (root: ${this.rootDir})`, includePath);
131
131
  }
132
132
  try {
133
- const real = fs.realpathSync(normalized);
133
+ const real = syncFs.realpathSync(normalized);
134
134
  if (!isPathInside(this.rootRealDir, real)) {
135
135
  throw new ConfigIncludeError(`Include path resolves outside config directory (symlink): ${includePath} (root: ${this.rootDir})`, includePath);
136
136
  }
@@ -184,13 +184,13 @@ var IncludeProcessor = class IncludeProcessor {
184
184
  };
185
185
  function safeRealpath(target) {
186
186
  try {
187
- return fs.realpathSync(target);
187
+ return syncFs.realpathSync(target);
188
188
  } catch {
189
189
  return target;
190
190
  }
191
191
  }
192
192
  function readConfigIncludeFileWithGuards(params) {
193
- const ioFs = params.ioFs ?? fs;
193
+ const ioFs = params.ioFs ?? syncFs;
194
194
  const maxBytes = params.maxBytes ?? MAX_INCLUDE_FILE_BYTES;
195
195
  if (!canUseBoundaryFileOpen(ioFs)) {
196
196
  return ioFs.readFileSync(params.resolvedPath, "utf-8");
@@ -217,7 +217,7 @@ function readConfigIncludeFileWithGuards(params) {
217
217
  }
218
218
  }
219
219
  const defaultResolver = {
220
- readFile: (p) => fs.readFileSync(p, "utf-8"),
220
+ readFile: (p) => syncFs.readFileSync(p, "utf-8"),
221
221
  readFileWithGuards: ({ includePath, resolvedPath, rootRealDir }) => readConfigIncludeFileWithGuards({
222
222
  includePath,
223
223
  resolvedPath,
package/dist/config/io.js CHANGED
@@ -22,7 +22,7 @@ import { repairInstalledPluginAllowlist } from "./plugins-allowlist.js";
22
22
  import { applyConfigOverrides } from "./runtime-overrides.js";
23
23
  import { validateConfigObjectRawWithPlugins, validateConfigObjectWithPlugins } from "./validation.js";
24
24
  import { compareFasedAgentVersions } from "./version.js";
25
- import fs from "node:fs";
25
+ import syncFs from "node:fs";
26
26
  import os from "node:os";
27
27
  import path from "node:path";
28
28
  import JSON5 from "json5";
@@ -477,7 +477,7 @@ function resolveConfigPathForDeps(deps) {
477
477
  }
478
478
  function normalizeDeps(overrides = {}) {
479
479
  return {
480
- fs: overrides.fs ?? fs,
480
+ fs: overrides.fs ?? syncFs,
481
481
  json5: overrides.json5 ?? JSON5,
482
482
  env: overrides.env ?? process.env,
483
483
  homedir: overrides.homedir ?? (() => resolveRequiredHomeDir(overrides.env ?? process.env, os.homedir)),
@@ -1,5 +1,5 @@
1
1
  import { expandHomePrefix, resolveRequiredHomeDir } from "../infra/home-dir.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
 
@@ -86,7 +86,7 @@ function resolveConfigPathCandidate(env = process.env, homedir = envHomedir(env)
86
86
  const candidates = resolveDefaultConfigCandidates(env, homedir);
87
87
  const existing = candidates.find((candidate) => {
88
88
  try {
89
- return fs.existsSync(candidate);
89
+ return syncFs.existsSync(candidate);
90
90
  } catch {
91
91
  return false;
92
92
  }
@@ -108,7 +108,7 @@ function resolveConfigPath(env = process.env, stateDir = resolveStateDir(env, en
108
108
  const candidates = [path.join(stateDir, CONFIG_FILENAME)];
109
109
  const existing = candidates.find((candidate) => {
110
110
  try {
111
- return fs.existsSync(candidate);
111
+ return syncFs.existsSync(candidate);
112
112
  } catch {
113
113
  return false;
114
114
  }
@@ -1,4 +1,4 @@
1
- import fs from "node:fs";
1
+ import syncFs from "node:fs";
2
2
  import path from "node:path";
3
3
 
4
4
  //#region src/config/sat-runtime-ids.ts
@@ -63,7 +63,7 @@ function resolveSatRuntimeDefaultsFile(env = process.env) {
63
63
  path.resolve(import.meta.dirname, "..", "..", "..", "config", "sat-runtime.env")
64
64
  ];
65
65
  for (const candidate of candidates) {
66
- if (candidate && fs.existsSync(candidate)) {
66
+ if (candidate && syncFs.existsSync(candidate)) {
67
67
  return candidate;
68
68
  }
69
69
  }
@@ -82,7 +82,7 @@ function loadSatRuntimeDefaults(env = process.env) {
82
82
  if (!file) {
83
83
  return null;
84
84
  }
85
- const parsed = parseEnvFile(fs.readFileSync(file, "utf8"));
85
+ const parsed = parseEnvFile(syncFs.readFileSync(file, "utf8"));
86
86
  if (!parsed.programId || !parsed.bondProgramId || !parsed.mintAddress || !parsed.mintProgramId) {
87
87
  return null;
88
88
  }
@@ -1,6 +1,6 @@
1
1
  import { isPrimarySessionTranscriptFileName, isSessionArchiveArtifactName } from "./artifacts.js";
2
2
  import { resolveSessionFilePath } from "./paths.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import path from "node:path";
5
5
 
6
6
  //#region src/config/sessions/disk-budget.ts
@@ -11,7 +11,7 @@ const NOOP_LOGGER = {
11
11
  function canonicalizePathForComparison(filePath) {
12
12
  const resolved = path.resolve(filePath);
13
13
  try {
14
- return fs.realpathSync(resolved);
14
+ return syncFs.realpathSync(resolved);
15
15
  } catch {
16
16
  return resolved;
17
17
  }
@@ -83,14 +83,14 @@ function resolveReferencedSessionTranscriptPaths(params) {
83
83
  return referenced;
84
84
  }
85
85
  async function readSessionsDirFiles(sessionsDir) {
86
- const dirEntries = await fs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
86
+ const dirEntries = await syncFs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
87
87
  const files = [];
88
88
  for (const dirent of dirEntries) {
89
89
  if (!dirent.isFile()) {
90
90
  continue;
91
91
  }
92
92
  const filePath = path.join(sessionsDir, dirent.name);
93
- const stat = await fs.promises.stat(filePath).catch(() => null);
93
+ const stat = await syncFs.promises.stat(filePath).catch(() => null);
94
94
  if (!stat?.isFile()) {
95
95
  continue;
96
96
  }
@@ -105,11 +105,11 @@ async function readSessionsDirFiles(sessionsDir) {
105
105
  return files;
106
106
  }
107
107
  async function removeFileIfExists(filePath) {
108
- const stat = await fs.promises.stat(filePath).catch(() => null);
108
+ const stat = await syncFs.promises.stat(filePath).catch(() => null);
109
109
  if (!stat?.isFile()) {
110
110
  return 0;
111
111
  }
112
- await fs.promises.rm(filePath, { force: true }).catch(() => undefined);
112
+ await syncFs.promises.rm(filePath, { force: true }).catch(() => undefined);
113
113
  return stat.size;
114
114
  }
115
115
  async function removeFileForBudget(params) {
@@ -1,7 +1,7 @@
1
1
  import { expandHomePrefix, resolveRequiredHomeDir } from "../../infra/home-dir.js";
2
2
  import { resolveStateDir } from "../paths.js";
3
3
  import { DEFAULT_AGENT_ID, normalizeAgentId } from "../../routing/session-key.js";
4
- import fs from "node:fs";
4
+ import syncFs from "node:fs";
5
5
  import os from "node:os";
6
6
  import path from "node:path";
7
7
 
@@ -112,7 +112,7 @@ function resolveStructuralSessionFallbackPath(candidateAbsPath, expectedAgentId)
112
112
  }
113
113
  function safeRealpathSync(filePath) {
114
114
  try {
115
- return fs.realpathSync(filePath);
115
+ return syncFs.realpathSync(filePath);
116
116
  } catch {
117
117
  return undefined;
118
118
  }
@@ -10,7 +10,7 @@ import { archiveSessionTranscripts, cleanupArchivedSessionTranscripts } from "..
10
10
  import { deliveryContextFromSession, mergeDeliveryContext, normalizeDeliveryContext, normalizeSessionDeliveryFields } from "../../utils/delivery-context.js";
11
11
  import { getFileMtimeMs, isCacheEnabled, resolveCacheTtlMs } from "../cache-utils.js";
12
12
  import { enforceSessionDiskBudget } from "./disk-budget.js";
13
- import fs from "node:fs";
13
+ import syncFs from "node:fs";
14
14
  import path from "node:path";
15
15
  import crypto from "node:crypto";
16
16
 
@@ -155,7 +155,7 @@ function loadSessionStore(storePath, opts = {}) {
155
155
  const retryBuf = maxReadAttempts > 1 ? new Int32Array(new SharedArrayBuffer(4)) : undefined;
156
156
  for (let attempt = 0; attempt < maxReadAttempts; attempt++) {
157
157
  try {
158
- const raw = fs.readFileSync(storePath, "utf-8");
158
+ const raw = syncFs.readFileSync(storePath, "utf-8");
159
159
  if (raw.length === 0 && attempt < maxReadAttempts - 1) {
160
160
  Atomics.wait(retryBuf, 0, 0, 50);
161
161
  continue;
@@ -406,7 +406,7 @@ function capEntryCount(store, overrideMax, opts = {}) {
406
406
  }
407
407
  async function getSessionFileSize(storePath) {
408
408
  try {
409
- const stat = await fs.promises.stat(storePath);
409
+ const stat = await syncFs.promises.stat(storePath);
410
410
  return stat.size;
411
411
  } catch {
412
412
  return null;
@@ -428,7 +428,7 @@ async function rotateSessionFile(storePath, overrideBytes) {
428
428
  }
429
429
  const backupPath = `${storePath}.bak.${Date.now()}`;
430
430
  try {
431
- await fs.promises.rename(storePath, backupPath);
431
+ await syncFs.promises.rename(storePath, backupPath);
432
432
  log.info("rotated session store file", {
433
433
  backupPath: path.basename(backupPath),
434
434
  sizeBytes: fileSize
@@ -439,13 +439,13 @@ async function rotateSessionFile(storePath, overrideBytes) {
439
439
  try {
440
440
  const dir = path.dirname(storePath);
441
441
  const baseName = path.basename(storePath);
442
- const files = await fs.promises.readdir(dir);
442
+ const files = await syncFs.promises.readdir(dir);
443
443
  const backups = files.filter((f) => f.startsWith(`${baseName}.bak.`)).toSorted().toReversed();
444
444
  const maxBackups = 3;
445
445
  if (backups.length > maxBackups) {
446
446
  const toDelete = backups.slice(maxBackups);
447
447
  for (const old of toDelete) {
448
- await fs.promises.unlink(path.join(dir, old)).catch(() => undefined);
448
+ await syncFs.promises.unlink(path.join(dir, old)).catch(() => undefined);
449
449
  }
450
450
  log.info("cleaned up old session store backups", { deleted: toDelete.length });
451
451
  }
@@ -561,15 +561,15 @@ async function saveSessionStoreUnlocked(storePath, store, opts) {
561
561
  });
562
562
  }
563
563
  }
564
- await fs.promises.mkdir(path.dirname(storePath), { recursive: true });
564
+ await syncFs.promises.mkdir(path.dirname(storePath), { recursive: true });
565
565
  const json = JSON.stringify(store, null, 2);
566
566
  if (process.platform === "win32") {
567
567
  const tmp = `${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
568
568
  try {
569
- await fs.promises.writeFile(tmp, json, "utf-8");
569
+ await syncFs.promises.writeFile(tmp, json, "utf-8");
570
570
  for (let i = 0; i < 5; i++) {
571
571
  try {
572
- await fs.promises.rename(tmp, storePath);
572
+ await syncFs.promises.rename(tmp, storePath);
573
573
  break;
574
574
  } catch {
575
575
  if (i < 4) {
@@ -587,28 +587,28 @@ async function saveSessionStoreUnlocked(storePath, store, opts) {
587
587
  }
588
588
  throw err;
589
589
  } finally {
590
- await fs.promises.rm(tmp, { force: true }).catch(() => undefined);
590
+ await syncFs.promises.rm(tmp, { force: true }).catch(() => undefined);
591
591
  }
592
592
  return;
593
593
  }
594
594
  const tmp = `${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
595
595
  try {
596
- await fs.promises.writeFile(tmp, json, {
596
+ await syncFs.promises.writeFile(tmp, json, {
597
597
  mode: 384,
598
598
  encoding: "utf-8"
599
599
  });
600
- await fs.promises.rename(tmp, storePath);
601
- await fs.promises.chmod(storePath, 384);
600
+ await syncFs.promises.rename(tmp, storePath);
601
+ await syncFs.promises.chmod(storePath, 384);
602
602
  } catch (err) {
603
603
  const code = err && typeof err === "object" && "code" in err ? String(err.code) : null;
604
604
  if (code === "ENOENT") {
605
605
  try {
606
- await fs.promises.mkdir(path.dirname(storePath), { recursive: true });
607
- await fs.promises.writeFile(storePath, json, {
606
+ await syncFs.promises.mkdir(path.dirname(storePath), { recursive: true });
607
+ await syncFs.promises.writeFile(storePath, json, {
608
608
  mode: 384,
609
609
  encoding: "utf-8"
610
610
  });
611
- await fs.promises.chmod(storePath, 384);
611
+ await syncFs.promises.chmod(storePath, 384);
612
612
  } catch (err2) {
613
613
  const code2 = err2 && typeof err2 === "object" && "code" in err2 ? String(err2.code) : null;
614
614
  if (code2 === "ENOENT") {
@@ -620,7 +620,7 @@ async function saveSessionStoreUnlocked(storePath, store, opts) {
620
620
  }
621
621
  throw err;
622
622
  } finally {
623
- await fs.promises.rm(tmp, { force: true });
623
+ await syncFs.promises.rm(tmp, { force: true });
624
624
  }
625
625
  }
626
626
  async function saveSessionStore(storePath, store, opts) {