@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
@@ -2,7 +2,7 @@ import { resolveStateDir } from "../../config/paths.js";
2
2
  import { formatErrorMessage } from "../errors.js";
3
3
  import { generateSecureUuid } from "../secure-random.js";
4
4
  import { formatOutboundTargetForLog, redactOutboundTargetInText } from "./format.js";
5
- import fs from "node:fs";
5
+ import syncFs from "node:fs";
6
6
  import path from "node:path";
7
7
 
8
8
  //#region src/infra/outbound/delivery-queue.ts
@@ -26,11 +26,11 @@ function resolveFailedDir(stateDir) {
26
26
  /** Ensure the queue directory (and failed/ subdirectory) exist. */
27
27
  async function ensureQueueDir(stateDir) {
28
28
  const queueDir = resolveQueueDir(stateDir);
29
- await fs.promises.mkdir(queueDir, {
29
+ await syncFs.promises.mkdir(queueDir, {
30
30
  recursive: true,
31
31
  mode: 448
32
32
  });
33
- await fs.promises.mkdir(resolveFailedDir(stateDir), {
33
+ await syncFs.promises.mkdir(resolveFailedDir(stateDir), {
34
34
  recursive: true,
35
35
  mode: 448
36
36
  });
@@ -57,18 +57,18 @@ async function enqueueDelivery(params, stateDir) {
57
57
  const filePath = path.join(queueDir, `${id}.json`);
58
58
  const tmp = `${filePath}.${process.pid}.tmp`;
59
59
  const json = JSON.stringify(entry, null, 2);
60
- await fs.promises.writeFile(tmp, json, {
60
+ await syncFs.promises.writeFile(tmp, json, {
61
61
  encoding: "utf-8",
62
62
  mode: 384
63
63
  });
64
- await fs.promises.rename(tmp, filePath);
64
+ await syncFs.promises.rename(tmp, filePath);
65
65
  return id;
66
66
  }
67
67
  /** Remove a successfully delivered entry from the queue. */
68
68
  async function ackDelivery(id, stateDir) {
69
69
  const filePath = path.join(resolveQueueDir(stateDir), `${id}.json`);
70
70
  try {
71
- await fs.promises.unlink(filePath);
71
+ await syncFs.promises.unlink(filePath);
72
72
  } catch (err) {
73
73
  const code = err && typeof err === "object" && "code" in err ? String(err.code) : null;
74
74
  if (code !== "ENOENT") {
@@ -79,24 +79,24 @@ async function ackDelivery(id, stateDir) {
79
79
  /** Update a queue entry after a failed delivery attempt. */
80
80
  async function failDelivery(id, error, stateDir) {
81
81
  const filePath = path.join(resolveQueueDir(stateDir), `${id}.json`);
82
- const raw = await fs.promises.readFile(filePath, "utf-8");
82
+ const raw = await syncFs.promises.readFile(filePath, "utf-8");
83
83
  const entry = JSON.parse(raw);
84
84
  entry.retryCount += 1;
85
85
  entry.lastAttemptAt = Date.now();
86
86
  entry.lastError = error;
87
87
  const tmp = `${filePath}.${process.pid}.tmp`;
88
- await fs.promises.writeFile(tmp, JSON.stringify(entry, null, 2), {
88
+ await syncFs.promises.writeFile(tmp, JSON.stringify(entry, null, 2), {
89
89
  encoding: "utf-8",
90
90
  mode: 384
91
91
  });
92
- await fs.promises.rename(tmp, filePath);
92
+ await syncFs.promises.rename(tmp, filePath);
93
93
  }
94
94
  /** Load all pending delivery entries from the queue directory. */
95
95
  async function loadPendingDeliveries(stateDir) {
96
96
  const queueDir = resolveQueueDir(stateDir);
97
97
  let files;
98
98
  try {
99
- files = await fs.promises.readdir(queueDir);
99
+ files = await syncFs.promises.readdir(queueDir);
100
100
  } catch (err) {
101
101
  const code = err && typeof err === "object" && "code" in err ? String(err.code) : null;
102
102
  if (code === "ENOENT") {
@@ -111,20 +111,20 @@ async function loadPendingDeliveries(stateDir) {
111
111
  }
112
112
  const filePath = path.join(queueDir, file);
113
113
  try {
114
- const stat = await fs.promises.stat(filePath);
114
+ const stat = await syncFs.promises.stat(filePath);
115
115
  if (!stat.isFile()) {
116
116
  continue;
117
117
  }
118
- const raw = await fs.promises.readFile(filePath, "utf-8");
118
+ const raw = await syncFs.promises.readFile(filePath, "utf-8");
119
119
  const parsed = JSON.parse(raw);
120
120
  const { entry, migrated } = normalizeLegacyQueuedDeliveryEntry(parsed);
121
121
  if (migrated) {
122
122
  const tmp = `${filePath}.${process.pid}.tmp`;
123
- await fs.promises.writeFile(tmp, JSON.stringify(entry, null, 2), {
123
+ await syncFs.promises.writeFile(tmp, JSON.stringify(entry, null, 2), {
124
124
  encoding: "utf-8",
125
125
  mode: 384
126
126
  });
127
- await fs.promises.rename(tmp, filePath);
127
+ await syncFs.promises.rename(tmp, filePath);
128
128
  }
129
129
  entries.push(entry);
130
130
  } catch {}
@@ -135,13 +135,13 @@ async function loadPendingDeliveries(stateDir) {
135
135
  async function moveToFailed(id, stateDir) {
136
136
  const queueDir = resolveQueueDir(stateDir);
137
137
  const failedDir = resolveFailedDir(stateDir);
138
- await fs.promises.mkdir(failedDir, {
138
+ await syncFs.promises.mkdir(failedDir, {
139
139
  recursive: true,
140
140
  mode: 448
141
141
  });
142
142
  const src = path.join(queueDir, `${id}.json`);
143
143
  const dest = path.join(failedDir, `${id}.json`);
144
- await fs.promises.rename(src, dest);
144
+ await syncFs.promises.rename(src, dest);
145
145
  }
146
146
  /** Compute the backoff delay in ms for a given retry count. */
147
147
  function computeBackoffMs(retryCount) {
@@ -1,13 +1,13 @@
1
1
  import { isTruthyEnvValue } from "./env.js";
2
2
  import { resolveBrewPathDirs } from "./brew.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
 
7
7
  //#region src/infra/path-env.ts
8
8
  function isExecutable(filePath) {
9
9
  try {
10
- fs.accessSync(filePath, fs.constants.X_OK);
10
+ syncFs.accessSync(filePath, syncFs.constants.X_OK);
11
11
  return true;
12
12
  } catch {
13
13
  return false;
@@ -15,7 +15,7 @@ function isExecutable(filePath) {
15
15
  }
16
16
  function isDirectory(dirPath) {
17
17
  try {
18
- return fs.statSync(dirPath).isDirectory();
18
+ return syncFs.statSync(dirPath).isDirectory();
19
19
  } catch {
20
20
  return false;
21
21
  }
@@ -1,11 +1,11 @@
1
- import fs from "node:fs";
2
- import fs$1 from "node:fs/promises";
1
+ import syncFs from "node:fs";
2
+ import fs from "node:fs/promises";
3
3
 
4
4
  //#region src/infra/ports-lsof.ts
5
5
  const LSOF_CANDIDATES = process.platform === "darwin" ? ["/usr/sbin/lsof", "/usr/bin/lsof"] : ["/usr/bin/lsof", "/usr/sbin/lsof"];
6
6
  async function canExecute(path) {
7
7
  try {
8
- await fs$1.access(path, fs.constants.X_OK);
8
+ await fs.access(path, syncFs.constants.X_OK);
9
9
  return true;
10
10
  } catch {
11
11
  return false;
@@ -22,7 +22,7 @@ async function resolveLsofCommand() {
22
22
  function resolveLsofCommandSync() {
23
23
  for (const candidate of LSOF_CANDIDATES) {
24
24
  try {
25
- fs.accessSync(candidate, fs.constants.X_OK);
25
+ syncFs.accessSync(candidate, syncFs.constants.X_OK);
26
26
  return candidate;
27
27
  } catch {}
28
28
  }
@@ -9,7 +9,7 @@ import { resolveAuthProfileOrder } from "../agents/auth-profiles/order.js";
9
9
  import "../agents/auth-profiles.js";
10
10
  import { getCustomProviderApiKey } from "../agents/model-auth.js";
11
11
  import { normalizeProviderId } from "../agents/model-selection.js";
12
- import fs from "node:fs";
12
+ import syncFs from "node:fs";
13
13
  import os from "node:os";
14
14
  import path from "node:path";
15
15
 
@@ -43,10 +43,10 @@ function resolveZaiApiKey() {
43
43
  }
44
44
  try {
45
45
  const authPath = path.join(resolveRequiredHomeDir(process.env, os.homedir), ".pi", "agent", "auth.json");
46
- if (!fs.existsSync(authPath)) {
46
+ if (!syncFs.existsSync(authPath)) {
47
47
  return undefined;
48
48
  }
49
- const data = JSON.parse(fs.readFileSync(authPath, "utf-8"));
49
+ const data = JSON.parse(syncFs.readFileSync(authPath, "utf-8"));
50
50
  return data["z-ai"]?.access || data.zai?.access;
51
51
  } catch {
52
52
  return undefined;
@@ -1,5 +1,5 @@
1
1
  import { sameFileIdentity as sameFileIdentity$1 } from "./file-identity.js";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
 
4
4
  //#region src/infra/safe-open-sync.ts
5
5
  function isExpectedPathError(error) {
@@ -10,7 +10,7 @@ function sameFileIdentity(left, right) {
10
10
  return sameFileIdentity$1(left, right);
11
11
  }
12
12
  function openVerifiedFileSync(params) {
13
- const ioFs = params.ioFs ?? fs;
13
+ const ioFs = params.ioFs ?? syncFs;
14
14
  const openReadFlags = ioFs.constants.O_RDONLY | (typeof ioFs.constants.O_NOFOLLOW === "number" ? ioFs.constants.O_NOFOLLOW : 0);
15
15
  let fd = null;
16
16
  try {
@@ -4,7 +4,7 @@ import { stripInboundMetadata } from "../auto-reply/reply/strip-inbound-meta.js"
4
4
  import { stripEnvelope, stripMessageIdHints } from "../shared/chat-envelope.js";
5
5
  import { normalizeUsage } from "../agents/usage.js";
6
6
  import { estimateUsageCost, resolveModelCostConfig } from "../utils/usage-format.js";
7
- import fs from "node:fs";
7
+ import syncFs from "node:fs";
8
8
  import path from "node:path";
9
9
  import readline from "node:readline";
10
10
 
@@ -145,7 +145,7 @@ const applyCostTotal = (totals, costTotal) => {
145
145
  totals.totalCost += costTotal;
146
146
  };
147
147
  async function* readJsonlRecords(filePath) {
148
- const fileStream = fs.createReadStream(filePath, { encoding: "utf-8" });
148
+ const fileStream = syncFs.createReadStream(filePath, { encoding: "utf-8" });
149
149
  const rl = readline.createInterface({
150
150
  input: fileStream,
151
151
  crlfDelay: Infinity
@@ -225,10 +225,10 @@ async function loadCostUsageSummary(params) {
225
225
  const dailyMap = new Map();
226
226
  const totals = emptyTotals();
227
227
  const sessionsDir = resolveSessionTranscriptsDirForAgent(params?.agentId);
228
- const entries = await fs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
228
+ const entries = await syncFs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
229
229
  const files = (await Promise.all(entries.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl")).map(async (entry) => {
230
230
  const filePath = path.join(sessionsDir, entry.name);
231
- const stats = await fs.promises.stat(filePath).catch(() => null);
231
+ const stats = await syncFs.promises.stat(filePath).catch(() => null);
232
232
  if (!stats) {
233
233
  return null;
234
234
  }
@@ -279,14 +279,14 @@ async function loadCostUsageSummary(params) {
279
279
  */
280
280
  async function discoverAllSessions(params) {
281
281
  const sessionsDir = resolveSessionTranscriptsDirForAgent(params?.agentId);
282
- const entries = await fs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
282
+ const entries = await syncFs.promises.readdir(sessionsDir, { withFileTypes: true }).catch(() => []);
283
283
  const discovered = [];
284
284
  for (const entry of entries) {
285
285
  if (!entry.isFile() || !entry.name.endsWith(".jsonl")) {
286
286
  continue;
287
287
  }
288
288
  const filePath = path.join(sessionsDir, entry.name);
289
- const stats = await fs.promises.stat(filePath).catch(() => null);
289
+ const stats = await syncFs.promises.stat(filePath).catch(() => null);
290
290
  if (!stats) {
291
291
  continue;
292
292
  }
@@ -330,7 +330,7 @@ async function discoverAllSessions(params) {
330
330
  }
331
331
  async function loadSessionCostSummary(params) {
332
332
  const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
333
- if (!sessionFile || !fs.existsSync(sessionFile)) {
333
+ if (!sessionFile || !syncFs.existsSync(sessionFile)) {
334
334
  return null;
335
335
  }
336
336
  const totals = emptyTotals();
@@ -547,7 +547,7 @@ async function loadSessionCostSummary(params) {
547
547
  }
548
548
  async function loadSessionUsageTimeSeries(params) {
549
549
  const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
550
- if (!sessionFile || !fs.existsSync(sessionFile)) {
550
+ if (!sessionFile || !syncFs.existsSync(sessionFile)) {
551
551
  return null;
552
552
  }
553
553
  const points = [];
@@ -635,7 +635,7 @@ async function loadSessionUsageTimeSeries(params) {
635
635
  }
636
636
  async function loadSessionLogs(params) {
637
637
  const sessionFile = params.sessionFile ?? (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry, { agentId: params.agentId }) : undefined);
638
- if (!sessionFile || !fs.existsSync(sessionFile)) {
638
+ if (!sessionFile || !syncFs.existsSync(sessionFile)) {
639
639
  return null;
640
640
  }
641
641
  const logs = [];
@@ -1,6 +1,6 @@
1
1
  import { sanitizeHostExecEnv } from "./host-env-security.js";
2
2
  import { isTruthyEnvValue } from "./env.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { execFileSync } from "node:child_process";
@@ -34,7 +34,7 @@ function readEtcShells() {
34
34
  return cachedEtcShells;
35
35
  }
36
36
  try {
37
- const raw = fs.readFileSync("/etc/shells", "utf8");
37
+ const raw = syncFs.readFileSync("/etc/shells", "utf8");
38
38
  const entries = raw.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#") && path.isAbsolute(line));
39
39
  cachedEtcShells = new Set(entries);
40
40
  } catch {
@@ -1,27 +1,27 @@
1
- import fs from "node:fs";
1
+ import syncFs from "node:fs";
2
2
  import JSON5 from "json5";
3
3
 
4
4
  //#region src/infra/state-migrations.fs.ts
5
5
  function safeReadDir(dir) {
6
6
  try {
7
- return fs.readdirSync(dir, { withFileTypes: true });
7
+ return syncFs.readdirSync(dir, { withFileTypes: true });
8
8
  } catch {
9
9
  return [];
10
10
  }
11
11
  }
12
12
  function existsDir(dir) {
13
13
  try {
14
- return fs.existsSync(dir) && fs.statSync(dir).isDirectory();
14
+ return syncFs.existsSync(dir) && syncFs.statSync(dir).isDirectory();
15
15
  } catch {
16
16
  return false;
17
17
  }
18
18
  }
19
19
  function ensureDir(dir) {
20
- fs.mkdirSync(dir, { recursive: true });
20
+ syncFs.mkdirSync(dir, { recursive: true });
21
21
  }
22
22
  function fileExists(p) {
23
23
  try {
24
- return fs.existsSync(p) && fs.statSync(p).isFile();
24
+ return syncFs.existsSync(p) && syncFs.statSync(p).isFile();
25
25
  } catch {
26
26
  return false;
27
27
  }
@@ -37,7 +37,7 @@ function isLegacyWhatsAppAuthFile(name) {
37
37
  }
38
38
  function readSessionStoreJson5(storePath) {
39
39
  try {
40
- const raw = fs.readFileSync(storePath, "utf-8");
40
+ const raw = syncFs.readFileSync(storePath, "utf-8");
41
41
  const parsed = JSON5.parse(raw);
42
42
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
43
43
  return {
@@ -8,7 +8,7 @@ import { canonicalizeMainSessionAlias } from "../config/sessions/main-session.js
8
8
  import { saveSessionStore } from "../config/sessions/store.js";
9
9
  import "../config/sessions.js";
10
10
  import { ensureDir, existsDir, fileExists, isLegacyWhatsAppAuthFile, readSessionStoreJson5, safeReadDir } from "./state-migrations.fs.js";
11
- import fs from "node:fs";
11
+ import syncFs from "node:fs";
12
12
  import os from "node:os";
13
13
  import path from "node:path";
14
14
 
@@ -241,7 +241,7 @@ function removeDirIfEmpty(dir) {
241
241
  return;
242
242
  }
243
243
  try {
244
- fs.rmdirSync(dir);
244
+ syncFs.rmdirSync(dir);
245
245
  } catch {}
246
246
  }
247
247
  function resetAutoMigrateLegacyStateForTest() {
@@ -255,7 +255,7 @@ function resetAutoMigrateLegacyStateDirForTest() {
255
255
  }
256
256
  function resolveSymlinkTarget(linkPath) {
257
257
  try {
258
- const target = fs.readlinkSync(linkPath);
258
+ const target = syncFs.readlinkSync(linkPath);
259
259
  return path.resolve(path.dirname(linkPath), target);
260
260
  } catch {
261
261
  return null;
@@ -266,7 +266,7 @@ function formatStateDirMigration(legacyDir, targetDir) {
266
266
  }
267
267
  function isDirPath(filePath) {
268
268
  try {
269
- return fs.statSync(filePath).isDirectory();
269
+ return syncFs.statSync(filePath).isDirectory();
270
270
  } catch {
271
271
  return false;
272
272
  }
@@ -274,7 +274,7 @@ function isDirPath(filePath) {
274
274
  function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
275
275
  let entries;
276
276
  try {
277
- entries = fs.readdirSync(currentDir, { withFileTypes: true });
277
+ entries = syncFs.readdirSync(currentDir, { withFileTypes: true });
278
278
  } catch {
279
279
  return false;
280
280
  }
@@ -285,7 +285,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
285
285
  const entryPath = path.join(currentDir, entry.name);
286
286
  let stat;
287
287
  try {
288
- stat = fs.lstatSync(entryPath);
288
+ stat = syncFs.lstatSync(entryPath);
289
289
  } catch {
290
290
  return false;
291
291
  }
@@ -296,7 +296,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
296
296
  }
297
297
  let resolvedRealTarget;
298
298
  try {
299
- resolvedRealTarget = fs.realpathSync(resolvedTarget);
299
+ resolvedRealTarget = syncFs.realpathSync(resolvedTarget);
300
300
  } catch {
301
301
  return false;
302
302
  }
@@ -318,7 +318,7 @@ function isLegacyTreeSymlinkMirror(currentDir, realTargetDir) {
318
318
  function isLegacyDirSymlinkMirror(legacyDir, targetDir) {
319
319
  let realTargetDir;
320
320
  try {
321
- realTargetDir = fs.realpathSync(targetDir);
321
+ realTargetDir = syncFs.realpathSync(targetDir);
322
322
  } catch {
323
323
  return false;
324
324
  }
@@ -348,7 +348,7 @@ async function autoMigrateLegacyStateDir(params) {
348
348
  const legacyDirs = resolveLegacyStateDirs(homedir);
349
349
  let legacyDir = legacyDirs.find((dir) => {
350
350
  try {
351
- return fs.existsSync(dir);
351
+ return syncFs.existsSync(dir);
352
352
  } catch {
353
353
  return false;
354
354
  }
@@ -357,7 +357,7 @@ async function autoMigrateLegacyStateDir(params) {
357
357
  const changes = [];
358
358
  let legacyStat = null;
359
359
  try {
360
- legacyStat = legacyDir ? fs.lstatSync(legacyDir) : null;
360
+ legacyStat = legacyDir ? syncFs.lstatSync(legacyDir) : null;
361
361
  } catch {
362
362
  legacyStat = null;
363
363
  }
@@ -401,7 +401,7 @@ async function autoMigrateLegacyStateDir(params) {
401
401
  if (legacyDirs.some((dir) => path.resolve(dir) === path.resolve(legacyTarget))) {
402
402
  legacyDir = legacyTarget;
403
403
  try {
404
- legacyStat = fs.lstatSync(legacyDir);
404
+ legacyStat = syncFs.lstatSync(legacyDir);
405
405
  } catch {
406
406
  legacyStat = null;
407
407
  }
@@ -464,7 +464,7 @@ async function autoMigrateLegacyStateDir(params) {
464
464
  if (!legacyDir) {
465
465
  throw new Error("Legacy state dir not found");
466
466
  }
467
- fs.renameSync(legacyDir, targetDir);
467
+ syncFs.renameSync(legacyDir, targetDir);
468
468
  } catch (err) {
469
469
  warnings.push(`Failed to move legacy state dir (${legacyDir ?? "unknown"} → ${targetDir}): ${String(err)}`);
470
470
  return {
@@ -478,7 +478,7 @@ async function autoMigrateLegacyStateDir(params) {
478
478
  if (!legacyDir) {
479
479
  throw new Error("Legacy state dir not found");
480
480
  }
481
- fs.symlinkSync(targetDir, legacyDir, "dir");
481
+ syncFs.symlinkSync(targetDir, legacyDir, "dir");
482
482
  changes.push(formatStateDirMigration(legacyDir, targetDir));
483
483
  } catch (err) {
484
484
  try {
@@ -486,7 +486,7 @@ async function autoMigrateLegacyStateDir(params) {
486
486
  if (!legacyDir) {
487
487
  throw new Error("Legacy state dir not found", { cause: err });
488
488
  }
489
- fs.symlinkSync(targetDir, legacyDir, "junction");
489
+ syncFs.symlinkSync(targetDir, legacyDir, "junction");
490
490
  changes.push(formatStateDirMigration(legacyDir, targetDir));
491
491
  } else {
492
492
  throw err;
@@ -496,7 +496,7 @@ async function autoMigrateLegacyStateDir(params) {
496
496
  if (!legacyDir) {
497
497
  throw new Error("Legacy state dir not found", { cause: fallbackErr });
498
498
  }
499
- fs.renameSync(targetDir, legacyDir);
499
+ syncFs.renameSync(targetDir, legacyDir);
500
500
  warnings.push(`State dir migration rolled back (failed to link legacy path): ${String(fallbackErr)}`);
501
501
  return {
502
502
  migrated: false,
@@ -682,7 +682,7 @@ async function migrateLegacySessions(detected, now) {
682
682
  continue;
683
683
  }
684
684
  try {
685
- fs.renameSync(from, to);
685
+ syncFs.renameSync(from, to);
686
686
  changes.push(`Moved ${entry.name} → agents/${detected.targetAgentId}/sessions`);
687
687
  } catch (err) {
688
688
  warnings.push(`Failed moving ${from}: ${String(err)}`);
@@ -691,7 +691,7 @@ async function migrateLegacySessions(detected, now) {
691
691
  if (legacyParsed.ok) {
692
692
  try {
693
693
  if (fileExists(detected.sessions.legacyStorePath)) {
694
- fs.rmSync(detected.sessions.legacyStorePath, { force: true });
694
+ syncFs.rmSync(detected.sessions.legacyStorePath, { force: true });
695
695
  }
696
696
  } catch {}
697
697
  }
@@ -700,7 +700,7 @@ async function migrateLegacySessions(detected, now) {
700
700
  if (legacyLeft.length > 0) {
701
701
  const backupDir = `${detected.sessions.legacyDir}.legacy-${now()}`;
702
702
  try {
703
- fs.renameSync(detected.sessions.legacyDir, backupDir);
703
+ syncFs.renameSync(detected.sessions.legacyDir, backupDir);
704
704
  warnings.push(`Left legacy sessions at ${backupDir}`);
705
705
  } catch {}
706
706
  }
@@ -723,11 +723,11 @@ async function migrateLegacyAgentDir(detected, now) {
723
723
  for (const entry of entries) {
724
724
  const from = path.join(detected.agentDir.legacyDir, entry.name);
725
725
  const to = path.join(detected.agentDir.targetDir, entry.name);
726
- if (fs.existsSync(to)) {
726
+ if (syncFs.existsSync(to)) {
727
727
  continue;
728
728
  }
729
729
  try {
730
- fs.renameSync(from, to);
730
+ syncFs.renameSync(from, to);
731
731
  changes.push(`Moved agent file ${entry.name} → agents/${detected.targetAgentId}/agent`);
732
732
  } catch (err) {
733
733
  warnings.push(`Failed moving ${from}: ${String(err)}`);
@@ -737,7 +737,7 @@ async function migrateLegacyAgentDir(detected, now) {
737
737
  if (!emptyDirOrMissing(detected.agentDir.legacyDir)) {
738
738
  const backupDir = path.join(detected.stateDir, "agents", detected.targetAgentId, `agent.legacy-${now()}`);
739
739
  try {
740
- fs.renameSync(detected.agentDir.legacyDir, backupDir);
740
+ syncFs.renameSync(detected.agentDir.legacyDir, backupDir);
741
741
  warnings.push(`Left legacy agent dir at ${backupDir}`);
742
742
  } catch (err) {
743
743
  warnings.push(`Failed relocating legacy agent dir: ${String(err)}`);
@@ -775,7 +775,7 @@ async function migrateLegacyWhatsAppAuth(detected) {
775
775
  continue;
776
776
  }
777
777
  try {
778
- fs.renameSync(from, to);
778
+ syncFs.renameSync(from, to);
779
779
  changes.push(`Moved WhatsApp auth ${entry.name} → whatsapp/default`);
780
780
  } catch (err) {
781
781
  warnings.push(`Failed moving ${from}: ${String(err)}`);
@@ -799,7 +799,7 @@ async function migrateLegacyTelegramPairingAllowFrom(detected) {
799
799
  const targetPath = detected.pairingAllowFrom.targetTelegramPath;
800
800
  try {
801
801
  ensureDir(path.dirname(targetPath));
802
- fs.copyFileSync(legacyPath, targetPath);
802
+ syncFs.copyFileSync(legacyPath, targetPath);
803
803
  changes.push(`Copied Telegram pairing allowFrom → ${targetPath}`);
804
804
  } catch (err) {
805
805
  warnings.push(`Failed migrating Telegram pairing allowFrom (${legacyPath}): ${String(err)}`);
@@ -1,18 +1,18 @@
1
- import fs from "node:fs";
1
+ import syncFs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
 
5
5
  //#region src/infra/tmp-fased-dir.ts
6
6
  const POSIX_FASED_TMP_DIR = "/tmp/fased";
7
- const TMP_DIR_ACCESS_MODE = fs.constants.W_OK | fs.constants.X_OK;
7
+ const TMP_DIR_ACCESS_MODE = syncFs.constants.W_OK | syncFs.constants.X_OK;
8
8
  function isNodeErrorWithCode(err, code) {
9
9
  return typeof err === "object" && err !== null && "code" in err && err.code === code;
10
10
  }
11
11
  function resolvePreferredFasedAgentTmpDir(options = {}) {
12
- const accessSync = options.accessSync ?? fs.accessSync;
13
- const chmodSync = options.chmodSync ?? fs.chmodSync;
14
- const lstatSync = options.lstatSync ?? fs.lstatSync;
15
- const mkdirSync = options.mkdirSync ?? fs.mkdirSync;
12
+ const accessSync = options.accessSync ?? syncFs.accessSync;
13
+ const chmodSync = options.chmodSync ?? syncFs.chmodSync;
14
+ const lstatSync = options.lstatSync ?? syncFs.lstatSync;
15
+ const mkdirSync = options.mkdirSync ?? syncFs.mkdirSync;
16
16
  const warn = options.warn ?? ((message) => console.warn(message));
17
17
  const getuid = options.getuid ?? (() => {
18
18
  try {
@@ -1,5 +1,5 @@
1
1
  import { CONFIG_DIR, ensureDir } from "../utils.js";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
5
 
@@ -126,7 +126,7 @@ async function writeWideAreaGatewayZone(opts) {
126
126
  await ensureDir(path.dirname(zonePath));
127
127
  const existing = (() => {
128
128
  try {
129
- return fs.readFileSync(zonePath, "utf-8");
129
+ return syncFs.readFileSync(zonePath, "utf-8");
130
130
  } catch {
131
131
  return null;
132
132
  }
@@ -149,7 +149,7 @@ async function writeWideAreaGatewayZone(opts) {
149
149
  ...opts,
150
150
  serial
151
151
  });
152
- fs.writeFileSync(zonePath, next, "utf-8");
152
+ syncFs.writeFileSync(zonePath, next, "utf-8");
153
153
  return {
154
154
  zonePath,
155
155
  changed: true
package/dist/infra/wsl.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
- import fs$1 from "node:fs/promises";
2
+ import fs from "node:fs/promises";
3
3
 
4
4
  //#region src/infra/wsl.ts
5
5
  let wslCached = null;
@@ -50,7 +50,7 @@ async function isWSL() {
50
50
  return wslCached;
51
51
  }
52
52
  try {
53
- const release = await fs$1.readFile("/proc/sys/kernel/osrelease", "utf8");
53
+ const release = await fs.readFile("/proc/sys/kernel/osrelease", "utf8");
54
54
  wslCached = release.toLowerCase().includes("microsoft") || release.toLowerCase().includes("wsl");
55
55
  } catch {
56
56
  wslCached = false;
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId as normalizeAccountId$1 } from "../routing/account-id.js";
2
2
  import { resolveAccountEntry } from "../routing/account-lookup.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
 
5
5
  //#region src/line/accounts.ts
6
6
  function readFileIfExists(filePath) {
@@ -8,7 +8,7 @@ function readFileIfExists(filePath) {
8
8
  return undefined;
9
9
  }
10
10
  try {
11
- return fs.readFileSync(filePath, "utf-8").trim();
11
+ return syncFs.readFileSync(filePath, "utf-8").trim();
12
12
  } catch {
13
13
  return undefined;
14
14
  }
@@ -1,7 +1,7 @@
1
1
  import { logVerbose } from "../globals.js";
2
2
  import { buildRandomTempFilePath } from "../plugin-sdk/temp-path.js";
3
3
  import { formatLineIdForLog } from "./logging.js";
4
- import fs from "node:fs";
4
+ import syncFs from "node:fs";
5
5
  import { messagingApi } from "@line/bot-sdk";
6
6
 
7
7
  //#region src/line/download.ts
@@ -24,7 +24,7 @@ async function downloadLineMedia(messageId, channelAccessToken, maxBytes = 10 *
24
24
  prefix: "line-media",
25
25
  extension: ext
26
26
  });
27
- await fs.promises.writeFile(filePath, buffer);
27
+ await syncFs.promises.writeFile(filePath, buffer);
28
28
  logVerbose(`line: downloaded media ${formatLineIdForLog(messageId)} to ${filePath} (${buffer.length} bytes)`);
29
29
  return {
30
30
  path: filePath,
@@ -1,15 +1,15 @@
1
1
  import { resolveConfigPath } from "../config/paths.js";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
  import JSON5 from "json5";
4
4
 
5
5
  //#region src/logging/config.ts
6
6
  function readLoggingConfig() {
7
7
  const configPath = resolveConfigPath();
8
8
  try {
9
- if (!fs.existsSync(configPath)) {
9
+ if (!syncFs.existsSync(configPath)) {
10
10
  return undefined;
11
11
  }
12
- const raw = fs.readFileSync(configPath, "utf-8");
12
+ const raw = syncFs.readFileSync(configPath, "utf-8");
13
13
  const parsed = JSON5.parse(raw);
14
14
  const logging = parsed?.logging;
15
15
  if (!logging || typeof logging !== "object" || Array.isArray(logging)) {