@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
@@ -19,7 +19,7 @@ import { loadSessionStore } from "../config/sessions/store.js";
19
19
  import "../config/sessions.js";
20
20
  import { lookupContextTokens } from "../agents/context.js";
21
21
  import { listSessionCompactionCheckpoints } from "./session-compaction-checkpoints.js";
22
- import fs from "node:fs";
22
+ import syncFs from "node:fs";
23
23
  import path from "node:path";
24
24
 
25
25
  //#region src/gateway/session-utils.ts
@@ -41,7 +41,7 @@ function isCombinedSessionStoreCacheFresh(entry) {
41
41
  }
42
42
  function readSessionStoreSignature(storePath) {
43
43
  try {
44
- const stat = fs.statSync(storePath);
44
+ const stat = syncFs.statSync(storePath);
45
45
  return {
46
46
  storePath,
47
47
  exists: true,
@@ -94,7 +94,7 @@ function clearCombinedSessionStoreCacheForTest() {
94
94
  }
95
95
  function tryResolveExistingPath(value) {
96
96
  try {
97
- return fs.realpathSync(value);
97
+ return syncFs.realpathSync(value);
98
98
  } catch {
99
99
  return null;
100
100
  }
@@ -132,11 +132,11 @@ function resolveIdentityAvatarUrl(cfg, agentId, avatar) {
132
132
  return undefined;
133
133
  }
134
134
  try {
135
- const buffer = fs.readFileSync(opened.fd);
135
+ const buffer = syncFs.readFileSync(opened.fd);
136
136
  const mime = resolveAvatarMime(resolvedCandidate);
137
137
  return `data:${mime};base64,${buffer.toString("base64")}`;
138
138
  } finally {
139
- fs.closeSync(opened.fd);
139
+ syncFs.closeSync(opened.fd);
140
140
  }
141
141
  } catch {
142
142
  return undefined;
@@ -304,7 +304,7 @@ function listExistingAgentIdsFromDisk() {
304
304
  const root = resolveStateDir();
305
305
  const agentsDir = path.join(root, "agents");
306
306
  try {
307
- const entries = fs.readdirSync(agentsDir, { withFileTypes: true });
307
+ const entries = syncFs.readdirSync(agentsDir, { withFileTypes: true });
308
308
  return entries.filter((entry) => entry.isDirectory()).map((entry) => normalizeAgentId(entry.name)).filter(Boolean);
309
309
  } catch {
310
310
  return [];
@@ -1,5 +1,5 @@
1
1
  import { fileURLToPath } from "node:url";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
  import path from "node:path";
4
4
 
5
5
  //#region src/hooks/bundled-dir.ts
@@ -11,14 +11,14 @@ function resolveBundledHooksDir() {
11
11
  try {
12
12
  const execDir = path.dirname(process.execPath);
13
13
  const sibling = path.join(execDir, "hooks", "bundled");
14
- if (fs.existsSync(sibling)) {
14
+ if (syncFs.existsSync(sibling)) {
15
15
  return sibling;
16
16
  }
17
17
  } catch {}
18
18
  try {
19
19
  const moduleDir = path.dirname(fileURLToPath(import.meta.url));
20
20
  const distBundled = path.join(moduleDir, "bundled");
21
- if (fs.existsSync(distBundled)) {
21
+ if (syncFs.existsSync(distBundled)) {
22
22
  return distBundled;
23
23
  }
24
24
  } catch {}
@@ -26,7 +26,7 @@ function resolveBundledHooksDir() {
26
26
  const moduleDir = path.dirname(fileURLToPath(import.meta.url));
27
27
  const root = path.resolve(moduleDir, "..", "..");
28
28
  const srcBundled = path.join(root, "src", "hooks", "bundled");
29
- if (fs.existsSync(srcBundled)) {
29
+ if (syncFs.existsSync(srcBundled)) {
30
30
  return srcBundled;
31
31
  }
32
32
  } catch {}
@@ -3,7 +3,7 @@ import { runCommandWithTimeout } from "../process/exec.js";
3
3
  import { hasBinary } from "../shared/config-eval.js";
4
4
  import "../agents/skills.js";
5
5
  import { normalizeServePath } from "./gmail.js";
6
- import fs from "node:fs";
6
+ import syncFs from "node:fs";
7
7
  import path from "node:path";
8
8
 
9
9
  //#region src/hooks/gmail-setup-utils.ts
@@ -71,7 +71,7 @@ function findExecutablesOnPath(bins) {
71
71
  continue;
72
72
  }
73
73
  try {
74
- fs.accessSync(candidate, fs.constants.X_OK);
74
+ syncFs.accessSync(candidate, syncFs.constants.X_OK);
75
75
  matches.push(candidate);
76
76
  seen.add(candidate);
77
77
  } catch {}
@@ -100,7 +100,7 @@ function ensureGcloudOnPath() {
100
100
  ];
101
101
  for (const candidate of candidates) {
102
102
  try {
103
- fs.accessSync(candidate, fs.constants.X_OK);
103
+ syncFs.accessSync(candidate, syncFs.constants.X_OK);
104
104
  ensurePathIncludes(path.dirname(candidate), "append");
105
105
  return true;
106
106
  } catch {}
@@ -126,7 +126,7 @@ async function resolvePythonExecutablePath() {
126
126
  continue;
127
127
  }
128
128
  try {
129
- fs.accessSync(resolved, fs.constants.X_OK);
129
+ syncFs.accessSync(resolved, syncFs.constants.X_OK);
130
130
  cachedPythonPath = resolved;
131
131
  return resolved;
132
132
  } catch {}
@@ -303,11 +303,11 @@ async function ensureTailscaleEndpoint(params) {
303
303
  async function resolveProjectIdFromGogCredentials() {
304
304
  const candidates = gogCredentialsPaths();
305
305
  for (const candidate of candidates) {
306
- if (!fs.existsSync(candidate)) {
306
+ if (!syncFs.existsSync(candidate)) {
307
307
  continue;
308
308
  }
309
309
  try {
310
- const raw = fs.readFileSync(candidate, "utf-8");
310
+ const raw = syncFs.readFileSync(candidate, "utf-8");
311
311
  const parsed = JSON.parse(raw);
312
312
  const clientId = extractGogClientId(parsed);
313
313
  const projectNumber = extractProjectNumber(clientId);
@@ -1,5 +1,5 @@
1
1
  import { pathToFileURL } from "node:url";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
 
4
4
  //#region src/hooks/import-url.ts
5
5
  /**
@@ -24,7 +24,7 @@ function buildImportUrl(handlerPath, source) {
24
24
  return base;
25
25
  }
26
26
  try {
27
- const { mtimeMs, size } = fs.statSync(handlerPath);
27
+ const { mtimeMs, size } = syncFs.statSync(handlerPath);
28
28
  return `${base}?t=${mtimeMs}&s=${size}`;
29
29
  } catch {
30
30
  return `${base}?t=${Date.now()}`;
@@ -5,7 +5,7 @@ import { resolveHookConfig, shouldIncludeHook } from "./config.js";
5
5
  import { resolveFunctionModuleExport } from "./module-loader.js";
6
6
  import { loadWorkspaceHookEntries } from "./workspace.js";
7
7
  import { buildImportUrl } from "./import-url.js";
8
- import fs from "node:fs";
8
+ import syncFs from "node:fs";
9
9
  import path from "node:path";
10
10
 
11
11
  //#region src/hooks/loader.ts
@@ -67,7 +67,7 @@ async function loadInternalHooks(cfg, workspaceDir, opts) {
67
67
  continue;
68
68
  }
69
69
  const safeHandlerPath = opened.path;
70
- fs.closeSync(opened.fd);
70
+ syncFs.closeSync(opened.fd);
71
71
  const importUrl = buildImportUrl(safeHandlerPath, entry.hook.source);
72
72
  const mod = await import(importUrl);
73
73
  const exportName = entry.metadata?.export ?? "default";
@@ -127,7 +127,7 @@ async function loadInternalHooks(cfg, workspaceDir, opts) {
127
127
  continue;
128
128
  }
129
129
  const safeModulePath = opened.path;
130
- fs.closeSync(opened.fd);
130
+ syncFs.closeSync(opened.fd);
131
131
  const importUrl = buildImportUrl(safeModulePath, "fased-workspace");
132
132
  const mod = await import(importUrl);
133
133
  const exportName = handlerConfig.export ?? "default";
@@ -150,7 +150,7 @@ async function loadInternalHooks(cfg, workspaceDir, opts) {
150
150
  }
151
151
  function safeRealpathOrResolve(value) {
152
152
  try {
153
- return fs.realpathSync(value);
153
+ return syncFs.realpathSync(value);
154
154
  } catch {
155
155
  return path.resolve(value);
156
156
  }
@@ -6,7 +6,7 @@ import { isPathInsideWithRealpath } from "../security/scan-paths.js";
6
6
  import { parseFrontmatter, resolveFasedAgentMetadata, resolveHookInvocationPolicy } from "./frontmatter.js";
7
7
  import { shouldIncludeHook } from "./config.js";
8
8
  import { resolveBundledHooksDir } from "./bundled-dir.js";
9
- import fs from "node:fs";
9
+ import syncFs from "node:fs";
10
10
  import path from "node:path";
11
11
 
12
12
  //#region src/hooks/workspace.ts
@@ -106,15 +106,15 @@ function loadHookFromDir(params) {
106
106
  */
107
107
  function loadHooksFromDir(params) {
108
108
  const { dir, source, pluginId } = params;
109
- if (!fs.existsSync(dir)) {
109
+ if (!syncFs.existsSync(dir)) {
110
110
  return [];
111
111
  }
112
- const stat = fs.statSync(dir);
112
+ const stat = syncFs.statSync(dir);
113
113
  if (!stat.isDirectory()) {
114
114
  return [];
115
115
  }
116
116
  const hooks = [];
117
- const entries = fs.readdirSync(dir, { withFileTypes: true });
117
+ const entries = syncFs.readdirSync(dir, { withFileTypes: true });
118
118
  for (const entry of entries) {
119
119
  if (!entry.isDirectory()) {
120
120
  continue;
@@ -263,11 +263,11 @@ function readBoundaryFileUtf8(params) {
263
263
  return null;
264
264
  }
265
265
  try {
266
- return fs.readFileSync(opened.fd, "utf-8");
266
+ return syncFs.readFileSync(opened.fd, "utf-8");
267
267
  } catch {
268
268
  return null;
269
269
  } finally {
270
- fs.closeSync(opened.fd);
270
+ syncFs.closeSync(opened.fd);
271
271
  }
272
272
  }
273
273
  function resolveBoundaryFilePath(params) {
@@ -280,7 +280,7 @@ function resolveBoundaryFilePath(params) {
280
280
  return null;
281
281
  }
282
282
  const safePath = opened.path;
283
- fs.closeSync(opened.fd);
283
+ syncFs.closeSync(opened.fd);
284
284
  return safePath;
285
285
  }
286
286
 
@@ -2,7 +2,7 @@ import { isNotFoundPathError, isPathInside, isSymlinkOpenError } from "./path-gu
2
2
  import { resolveArchiveOutputPath, stripArchivePath, validateArchiveEntryPath } from "./archive-path.js";
3
3
  import { constants } from "node:fs";
4
4
  import path from "node:path";
5
- import fs$1 from "node:fs/promises";
5
+ import fs from "node:fs/promises";
6
6
  import { Readable, Transform } from "node:stream";
7
7
  import { pipeline } from "node:stream/promises";
8
8
  import JSZip from "jszip";
@@ -48,12 +48,12 @@ function resolveArchiveKind(filePath) {
48
48
  async function resolvePackedRootDir(extractDir) {
49
49
  const direct = path.join(extractDir, "package");
50
50
  try {
51
- const stat = await fs$1.stat(direct);
51
+ const stat = await fs.stat(direct);
52
52
  if (stat.isDirectory()) {
53
53
  return direct;
54
54
  }
55
55
  } catch {}
56
- const entries = await fs$1.readdir(extractDir, { withFileTypes: true });
56
+ const entries = await fs.readdir(extractDir, { withFileTypes: true });
57
57
  const dirs = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
58
58
  if (dirs.length !== 1) {
59
59
  throw new Error(`unexpected archive layout (dirs: ${dirs.join(", ")})`);
@@ -142,14 +142,14 @@ function symlinkTraversalError(originalPath) {
142
142
  return new ArchiveSecurityError("destination-symlink-traversal", `${ERROR_ARCHIVE_ENTRY_TRAVERSES_SYMLINK}: ${originalPath}`);
143
143
  }
144
144
  async function assertDestinationDirReady(destDir) {
145
- const stat = await fs$1.lstat(destDir);
145
+ const stat = await fs.lstat(destDir);
146
146
  if (stat.isSymbolicLink()) {
147
147
  throw new ArchiveSecurityError("destination-symlink", "archive destination is a symlink");
148
148
  }
149
149
  if (!stat.isDirectory()) {
150
150
  throw new ArchiveSecurityError("destination-not-directory", "archive destination is not a directory");
151
151
  }
152
- return await fs$1.realpath(destDir);
152
+ return await fs.realpath(destDir);
153
153
  }
154
154
  async function assertNoSymlinkTraversal(params) {
155
155
  const parts = params.relPath.split("/").filter(Boolean);
@@ -158,7 +158,7 @@ async function assertNoSymlinkTraversal(params) {
158
158
  current = path.join(current, part);
159
159
  let stat;
160
160
  try {
161
- stat = await fs$1.lstat(current);
161
+ stat = await fs.lstat(current);
162
162
  } catch (err) {
163
163
  if (isNotFoundPathError(err)) {
164
164
  continue;
@@ -173,7 +173,7 @@ async function assertNoSymlinkTraversal(params) {
173
173
  async function assertResolvedInsideDestination(params) {
174
174
  let resolved;
175
175
  try {
176
- resolved = await fs$1.realpath(params.targetPath);
176
+ resolved = await fs.realpath(params.targetPath);
177
177
  } catch (err) {
178
178
  if (isNotFoundPathError(err)) {
179
179
  return;
@@ -186,7 +186,7 @@ async function assertResolvedInsideDestination(params) {
186
186
  }
187
187
  async function openZipOutputFile(outPath, originalPath) {
188
188
  try {
189
- return await fs$1.open(outPath, OPEN_WRITE_FLAGS, 438);
189
+ return await fs.open(outPath, OPEN_WRITE_FLAGS, 438);
190
190
  } catch (err) {
191
191
  if (isSymlinkOpenError(err)) {
192
192
  throw symlinkTraversalError(originalPath);
@@ -197,7 +197,7 @@ async function openZipOutputFile(outPath, originalPath) {
197
197
  async function cleanupPartialRegularFile(filePath) {
198
198
  let stat;
199
199
  try {
200
- stat = await fs$1.lstat(filePath);
200
+ stat = await fs.lstat(filePath);
201
201
  } catch (err) {
202
202
  if (isNotFoundPathError(err)) {
203
203
  return;
@@ -205,7 +205,7 @@ async function cleanupPartialRegularFile(filePath) {
205
205
  throw err;
206
206
  }
207
207
  if (stat.isFile()) {
208
- await fs$1.unlink(filePath).catch(() => undefined);
208
+ await fs.unlink(filePath).catch(() => undefined);
209
209
  }
210
210
  }
211
211
  async function readZipEntryStream(entry) {
@@ -238,7 +238,7 @@ async function prepareZipOutputPath(params) {
238
238
  originalPath: params.originalPath
239
239
  });
240
240
  if (params.isDirectory) {
241
- await fs$1.mkdir(params.outPath, { recursive: true });
241
+ await fs.mkdir(params.outPath, { recursive: true });
242
242
  await assertResolvedInsideDestination({
243
243
  destinationRealDir: params.destinationRealDir,
244
244
  targetPath: params.outPath,
@@ -247,7 +247,7 @@ async function prepareZipOutputPath(params) {
247
247
  return;
248
248
  }
249
249
  const parentDir = path.dirname(params.outPath);
250
- await fs$1.mkdir(parentDir, { recursive: true });
250
+ await fs.mkdir(parentDir, { recursive: true });
251
251
  await assertResolvedInsideDestination({
252
252
  destinationRealDir: params.destinationRealDir,
253
253
  targetPath: parentDir,
@@ -268,18 +268,18 @@ async function writeZipFileEntry(params) {
268
268
  if (typeof params.entry.unixPermissions === "number") {
269
269
  const mode = params.entry.unixPermissions & 511;
270
270
  if (mode !== 0) {
271
- await fs$1.chmod(params.outPath, mode).catch(() => undefined);
271
+ await fs.chmod(params.outPath, mode).catch(() => undefined);
272
272
  }
273
273
  }
274
274
  }
275
275
  async function extractZip(params) {
276
276
  const limits = resolveExtractLimits(params.limits);
277
277
  const destinationRealDir = await assertDestinationDirReady(params.destDir);
278
- const stat = await fs$1.stat(params.archivePath);
278
+ const stat = await fs.stat(params.archivePath);
279
279
  if (stat.size > limits.maxArchiveBytes) {
280
280
  throw new Error(ERROR_ARCHIVE_SIZE_EXCEEDS_LIMIT);
281
281
  }
282
- const buffer = await fs$1.readFile(params.archivePath);
282
+ const buffer = await fs.readFile(params.archivePath);
283
283
  const zip = await JSZip.loadAsync(buffer);
284
284
  const entries = Object.values(zip.files);
285
285
  const strip = Math.max(0, Math.floor(params.stripComponents ?? 0));
@@ -378,14 +378,14 @@ async function extractArchive(params) {
378
378
  }
379
379
  async function fileExists(filePath) {
380
380
  try {
381
- await fs$1.stat(filePath);
381
+ await fs.stat(filePath);
382
382
  return true;
383
383
  } catch {
384
384
  return false;
385
385
  }
386
386
  }
387
387
  async function readJsonFile(filePath) {
388
- const raw = await fs$1.readFile(filePath, "utf-8");
388
+ const raw = await fs.readFile(filePath, "utf-8");
389
389
  return JSON.parse(raw);
390
390
  }
391
391
 
@@ -1,6 +1,6 @@
1
1
  import { resolveBoundaryPath, resolveBoundaryPathSync } from "./boundary-path.js";
2
2
  import { openVerifiedFileSync } from "./safe-open-sync.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/infra/boundary-file-read.ts
@@ -8,7 +8,7 @@ function canUseBoundaryFileOpen(ioFs) {
8
8
  return typeof ioFs.openSync === "function" && typeof ioFs.closeSync === "function" && typeof ioFs.fstatSync === "function" && typeof ioFs.lstatSync === "function" && typeof ioFs.realpathSync === "function" && typeof ioFs.readFileSync === "function" && typeof ioFs.constants === "object" && ioFs.constants !== null;
9
9
  }
10
10
  function openBoundaryFileSync(params) {
11
- const ioFs = params.ioFs ?? fs;
11
+ const ioFs = params.ioFs ?? syncFs;
12
12
  const absolutePath = path.resolve(params.absolutePath);
13
13
  let resolvedPath;
14
14
  let rootRealPath;
@@ -1,8 +1,8 @@
1
1
  import { isNotFoundPathError, isPathInside } from "./path-guards.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
- import fs$1 from "node:fs/promises";
5
+ import fs from "node:fs/promises";
6
6
 
7
7
  //#region src/infra/boundary-path.ts
8
8
  const BOUNDARY_PATH_ALIAS_POLICIES = {
@@ -114,7 +114,7 @@ async function resolveBoundaryPathLexicalAsync(params) {
114
114
  lexicalCursor = path.join(lexicalCursor, segment);
115
115
  let stat;
116
116
  try {
117
- stat = await fs$1.lstat(lexicalCursor);
117
+ stat = await fs.lstat(lexicalCursor);
118
118
  } catch (error) {
119
119
  if (isNotFoundPathError(error)) {
120
120
  const missingSuffix = segments.slice(idx);
@@ -189,7 +189,7 @@ function resolveBoundaryPathLexicalSync(params) {
189
189
  lexicalCursor = path.join(lexicalCursor, segment);
190
190
  let stat;
191
191
  try {
192
- stat = fs.lstatSync(lexicalCursor);
192
+ stat = syncFs.lstatSync(lexicalCursor);
193
193
  } catch (error) {
194
194
  if (isNotFoundPathError(error)) {
195
195
  const missingSuffix = segments.slice(idx);
@@ -294,7 +294,7 @@ async function resolvePathViaExistingAncestor(targetPath) {
294
294
  return normalized;
295
295
  }
296
296
  try {
297
- const resolvedAncestor = path.resolve(await fs$1.realpath(cursor));
297
+ const resolvedAncestor = path.resolve(await fs.realpath(cursor));
298
298
  if (missingSuffix.length === 0) {
299
299
  return resolvedAncestor;
300
300
  }
@@ -307,7 +307,7 @@ function resolvePathViaExistingAncestorSync(targetPath) {
307
307
  const normalized = path.resolve(targetPath);
308
308
  let cursor = normalized;
309
309
  const missingSuffix = [];
310
- while (!isFilesystemRoot(cursor) && !fs.existsSync(cursor)) {
310
+ while (!isFilesystemRoot(cursor) && !syncFs.existsSync(cursor)) {
311
311
  missingSuffix.unshift(path.basename(cursor));
312
312
  const parent = path.dirname(cursor);
313
313
  if (parent === cursor) {
@@ -315,11 +315,11 @@ function resolvePathViaExistingAncestorSync(targetPath) {
315
315
  }
316
316
  cursor = parent;
317
317
  }
318
- if (!fs.existsSync(cursor)) {
318
+ if (!syncFs.existsSync(cursor)) {
319
319
  return normalized;
320
320
  }
321
321
  try {
322
- const resolvedAncestor = path.resolve(fs.realpathSync(cursor));
322
+ const resolvedAncestor = path.resolve(syncFs.realpathSync(cursor));
323
323
  if (missingSuffix.length === 0) {
324
324
  return resolvedAncestor;
325
325
  }
@@ -330,7 +330,7 @@ function resolvePathViaExistingAncestorSync(targetPath) {
330
330
  }
331
331
  async function getPathKind(absolutePath, preserveFinalSymlink) {
332
332
  try {
333
- const stat = preserveFinalSymlink ? await fs$1.lstat(absolutePath) : await fs$1.stat(absolutePath);
333
+ const stat = preserveFinalSymlink ? await fs.lstat(absolutePath) : await fs.stat(absolutePath);
334
334
  return {
335
335
  exists: true,
336
336
  kind: toResolvedKind(stat)
@@ -347,7 +347,7 @@ async function getPathKind(absolutePath, preserveFinalSymlink) {
347
347
  }
348
348
  function getPathKindSync(absolutePath, preserveFinalSymlink) {
349
349
  try {
350
- const stat = preserveFinalSymlink ? fs.lstatSync(absolutePath) : fs.statSync(absolutePath);
350
+ const stat = preserveFinalSymlink ? syncFs.lstatSync(absolutePath) : syncFs.statSync(absolutePath);
351
351
  return {
352
352
  exists: true,
353
353
  kind: toResolvedKind(stat)
@@ -408,7 +408,7 @@ function isFilesystemRoot(candidate) {
408
408
  }
409
409
  async function pathExists(targetPath) {
410
410
  try {
411
- await fs$1.lstat(targetPath);
411
+ await fs.lstat(targetPath);
412
412
  return true;
413
413
  } catch (error) {
414
414
  if (isNotFoundPathError(error)) {
@@ -419,24 +419,24 @@ async function pathExists(targetPath) {
419
419
  }
420
420
  async function resolveSymlinkHopPath(symlinkPath) {
421
421
  try {
422
- return path.resolve(await fs$1.realpath(symlinkPath));
422
+ return path.resolve(await fs.realpath(symlinkPath));
423
423
  } catch (error) {
424
424
  if (!isNotFoundPathError(error)) {
425
425
  throw error;
426
426
  }
427
- const linkTarget = await fs$1.readlink(symlinkPath);
427
+ const linkTarget = await fs.readlink(symlinkPath);
428
428
  const linkAbsolute = path.resolve(path.dirname(symlinkPath), linkTarget);
429
429
  return resolvePathViaExistingAncestor(linkAbsolute);
430
430
  }
431
431
  }
432
432
  function resolveSymlinkHopPathSync(symlinkPath) {
433
433
  try {
434
- return path.resolve(fs.realpathSync(symlinkPath));
434
+ return path.resolve(syncFs.realpathSync(symlinkPath));
435
435
  } catch (error) {
436
436
  if (!isNotFoundPathError(error)) {
437
437
  throw error;
438
438
  }
439
- const linkTarget = fs.readlinkSync(symlinkPath);
439
+ const linkTarget = syncFs.readlinkSync(symlinkPath);
440
440
  const linkAbsolute = path.resolve(path.dirname(symlinkPath), linkTarget);
441
441
  return resolvePathViaExistingAncestorSync(linkAbsolute);
442
442
  }
@@ -1,11 +1,11 @@
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/brew.ts
6
6
  function isExecutable(filePath) {
7
7
  try {
8
- fs.accessSync(filePath, fs.constants.X_OK);
8
+ syncFs.accessSync(filePath, syncFs.constants.X_OK);
9
9
  return true;
10
10
  } catch {
11
11
  return false;
@@ -2,7 +2,7 @@ import { defaultRuntime } from "../runtime.js";
2
2
  import { runCommandWithTimeout } from "../process/exec.js";
3
3
  import { resolveFasedAgentPackageRoot, resolveFasedAgentPackageRootSync } from "./fased-root.js";
4
4
  import { fileURLToPath } from "node:url";
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/control-ui-assets.ts
@@ -21,7 +21,7 @@ async function resolveControlUiDistIndexHealth(opts = {}) {
21
21
  });
22
22
  return {
23
23
  indexPath,
24
- exists: Boolean(indexPath && fs.existsSync(indexPath))
24
+ exists: Boolean(indexPath && syncFs.existsSync(indexPath))
25
25
  };
26
26
  }
27
27
  function resolveControlUiRepoRoot(argv1 = process.argv[1]) {
@@ -33,13 +33,13 @@ function resolveControlUiRepoRoot(argv1 = process.argv[1]) {
33
33
  const srcIndex = parts.lastIndexOf("src");
34
34
  if (srcIndex !== -1) {
35
35
  const root = parts.slice(0, srcIndex).join(path.sep);
36
- if (fs.existsSync(path.join(root, "ui", "vite.config.ts"))) {
36
+ if (syncFs.existsSync(path.join(root, "ui", "vite.config.ts"))) {
37
37
  return root;
38
38
  }
39
39
  }
40
40
  let dir = path.dirname(normalized);
41
41
  for (let i = 0; i < 8; i++) {
42
- if (fs.existsSync(path.join(dir, "package.json")) && fs.existsSync(path.join(dir, "ui", "vite.config.ts"))) {
42
+ if (syncFs.existsSync(path.join(dir, "package.json")) && syncFs.existsSync(path.join(dir, "ui", "vite.config.ts"))) {
43
43
  return dir;
44
44
  }
45
45
  const parent = path.dirname(dir);
@@ -72,12 +72,12 @@ async function resolveControlUiDistIndexPath(argv1OrOpts) {
72
72
  for (let i = 0; i < 8; i++) {
73
73
  const pkgJsonPath = path.join(dir, "package.json");
74
74
  const indexPath = path.join(dir, "dist", "control-ui", "index.html");
75
- if (fs.existsSync(pkgJsonPath)) {
75
+ if (syncFs.existsSync(pkgJsonPath)) {
76
76
  try {
77
- const raw = fs.readFileSync(pkgJsonPath, "utf-8");
77
+ const raw = syncFs.readFileSync(pkgJsonPath, "utf-8");
78
78
  const parsed = JSON.parse(raw);
79
79
  if (parsed.name === "fased") {
80
- return fs.existsSync(indexPath) ? indexPath : null;
80
+ return syncFs.existsSync(indexPath) ? indexPath : null;
81
81
  }
82
82
  return null;
83
83
  } catch {
@@ -101,13 +101,13 @@ function addCandidate(candidates, value) {
101
101
  function resolveControlUiRootOverrideSync(rootOverride) {
102
102
  const resolved = path.resolve(rootOverride);
103
103
  try {
104
- const stats = fs.statSync(resolved);
104
+ const stats = syncFs.statSync(resolved);
105
105
  if (stats.isFile()) {
106
106
  return path.basename(resolved) === "index.html" ? path.dirname(resolved) : null;
107
107
  }
108
108
  if (stats.isDirectory()) {
109
109
  const indexPath = path.join(resolved, "index.html");
110
- return fs.existsSync(indexPath) ? resolved : null;
110
+ return syncFs.existsSync(indexPath) ? resolved : null;
111
111
  }
112
112
  } catch {
113
113
  return null;
@@ -123,7 +123,7 @@ function resolveControlUiRootSync(opts = {}) {
123
123
  const execDir = (() => {
124
124
  try {
125
125
  const execPath = opts.execPath ?? process.execPath;
126
- return path.dirname(fs.realpathSync(execPath));
126
+ return path.dirname(syncFs.realpathSync(execPath));
127
127
  } catch {
128
128
  return null;
129
129
  }
@@ -149,7 +149,7 @@ function resolveControlUiRootSync(opts = {}) {
149
149
  addCandidate(candidates, path.join(cwd, "dist", "control-ui"));
150
150
  for (const dir of candidates) {
151
151
  const indexPath = path.join(dir, "index.html");
152
- if (fs.existsSync(indexPath)) {
152
+ if (syncFs.existsSync(indexPath)) {
153
153
  return dir;
154
154
  }
155
155
  }
@@ -185,14 +185,14 @@ async function ensureControlUiAssetsBuilt(runtime = defaultRuntime, opts) {
185
185
  };
186
186
  }
187
187
  const indexPath = resolveControlUiDistIndexPathForRoot(repoRoot);
188
- if (fs.existsSync(indexPath)) {
188
+ if (syncFs.existsSync(indexPath)) {
189
189
  return {
190
190
  ok: true,
191
191
  built: false
192
192
  };
193
193
  }
194
194
  const uiScript = path.join(repoRoot, "scripts", "ui.js");
195
- if (!fs.existsSync(uiScript)) {
195
+ if (!syncFs.existsSync(uiScript)) {
196
196
  return {
197
197
  ok: false,
198
198
  built: false,
@@ -215,7 +215,7 @@ async function ensureControlUiAssetsBuilt(runtime = defaultRuntime, opts) {
215
215
  message: `Control UI build failed: ${summarizeCommandOutput(build.stderr) ?? `exit ${build.code}`}`
216
216
  };
217
217
  }
218
- if (!fs.existsSync(indexPath)) {
218
+ if (!syncFs.existsSync(indexPath)) {
219
219
  return {
220
220
  ok: false,
221
221
  built: true,
@@ -1,6 +1,6 @@
1
1
  import { resolveStateDir } from "../config/paths.js";
2
2
  import { normalizeDeviceAuthRole, normalizeDeviceAuthScopes } from "../shared/device-auth.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/infra/device-auth-store.ts
@@ -10,10 +10,10 @@ function resolveDeviceAuthPath(env = process.env) {
10
10
  }
11
11
  function readStore(filePath) {
12
12
  try {
13
- if (!fs.existsSync(filePath)) {
13
+ if (!syncFs.existsSync(filePath)) {
14
14
  return null;
15
15
  }
16
- const raw = fs.readFileSync(filePath, "utf8");
16
+ const raw = syncFs.readFileSync(filePath, "utf8");
17
17
  const parsed = JSON.parse(raw);
18
18
  if (parsed?.version !== 1 || typeof parsed.deviceId !== "string") {
19
19
  return null;
@@ -27,10 +27,10 @@ function readStore(filePath) {
27
27
  }
28
28
  }
29
29
  function writeStore(filePath, store) {
30
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
31
- fs.writeFileSync(filePath, `${JSON.stringify(store, null, 2)}\n`, { mode: 384 });
30
+ syncFs.mkdirSync(path.dirname(filePath), { recursive: true });
31
+ syncFs.writeFileSync(filePath, `${JSON.stringify(store, null, 2)}\n`, { mode: 384 });
32
32
  try {
33
- fs.chmodSync(filePath, 384);
33
+ syncFs.chmodSync(filePath, 384);
34
34
  } catch {}
35
35
  }
36
36
  function loadDeviceAuthToken(params) {
@@ -88,11 +88,11 @@ function clearDeviceAuthToken(params) {
88
88
  }
89
89
  function clearDeviceAuthStore(env = process.env) {
90
90
  const filePath = resolveDeviceAuthPath(env);
91
- if (!fs.existsSync(filePath)) {
91
+ if (!syncFs.existsSync(filePath)) {
92
92
  return false;
93
93
  }
94
94
  try {
95
- fs.unlinkSync(filePath);
95
+ syncFs.unlinkSync(filePath);
96
96
  return true;
97
97
  } catch {
98
98
  return false;