@fased/fased 0.1.42 → 0.1.43

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 (273) hide show
  1. package/dist/acp/client.js +2 -2
  2. package/dist/acp/secret-file.js +2 -2
  3. package/dist/agents/agent-scope.js +2 -2
  4. package/dist/agents/apply-patch.js +8 -8
  5. package/dist/agents/auth-profiles/paths.js +2 -2
  6. package/dist/agents/auth-profiles/store.js +2 -2
  7. package/dist/agents/bash-tools.shared.js +2 -2
  8. package/dist/agents/cli-credentials.js +4 -4
  9. package/dist/agents/docs-path.js +3 -3
  10. package/dist/agents/embedded-pi-mcp.js +4 -4
  11. package/dist/agents/identity-avatar.js +3 -3
  12. package/dist/agents/identity-file.js +2 -2
  13. package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
  14. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
  15. package/dist/agents/pi-model-discovery.js +6 -6
  16. package/dist/agents/pi-project-settings.js +3 -3
  17. package/dist/agents/sandbox/fs-bridge.js +2 -2
  18. package/dist/agents/session-dirs.js +4 -4
  19. package/dist/agents/session-write-lock.js +13 -13
  20. package/dist/agents/shell-utils.js +5 -5
  21. package/dist/agents/skills/bundled-dir.js +4 -4
  22. package/dist/agents/skills/local-loader.js +6 -6
  23. package/dist/agents/skills/plugin-skills.js +2 -2
  24. package/dist/agents/skills/workspace.js +13 -13
  25. package/dist/agents/skills-install-download.js +7 -7
  26. package/dist/agents/skills-install-plan.js +2 -2
  27. package/dist/agents/skills-install.js +2 -2
  28. package/dist/agents/skills-status.js +2 -2
  29. package/dist/agents/subagent-depth.js +2 -2
  30. package/dist/agents/system-prompt-params.js +2 -2
  31. package/dist/agents/workspace.js +22 -22
  32. package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
  33. package/dist/auto-reply/reply/agent-runner.js +2 -2
  34. package/dist/auto-reply/reply/commands-export-session.js +7 -7
  35. package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
  36. package/dist/auto-reply/reply/post-compaction-context.js +3 -3
  37. package/dist/auto-reply/reply/session.js +3 -3
  38. package/dist/auto-reply/skill-commands.js +3 -3
  39. package/dist/auto-reply/status.js +6 -6
  40. package/dist/brand.js +1 -1
  41. package/dist/browser/chrome.executables.js +3 -3
  42. package/dist/browser/chrome.js +3 -3
  43. package/dist/browser/chrome.profile-decoration.js +6 -6
  44. package/dist/browser/profiles-service.js +2 -2
  45. package/dist/browser/server-context.js +2 -2
  46. package/dist/browser/trash.js +4 -4
  47. package/dist/build-info.json +3 -3
  48. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  49. package/dist/canvas-host/server.js +4 -4
  50. package/dist/capabilities/catalog.js +3 -3
  51. package/dist/channels/plugins/catalog.js +3 -3
  52. package/dist/cli/browser-cli-extension.js +6 -6
  53. package/dist/cli/command-format.js +2 -2
  54. package/dist/cli/cron-cli/register.cron-simple.js +2 -2
  55. package/dist/cli/daemon-cli/restart-health.js +49 -13
  56. package/dist/cli/dns-cli.js +9 -9
  57. package/dist/cli/gateway-cli/dev.js +5 -5
  58. package/dist/cli/gateway-cli/run.js +2 -2
  59. package/dist/cli/hooks-cli.js +5 -5
  60. package/dist/cli/memory-cli.js +7 -7
  61. package/dist/cli/nodes-media-utils.js +2 -2
  62. package/dist/cli/plugins-cli.js +2 -2
  63. package/dist/cli/secrets-cli.js +3 -3
  64. package/dist/cli/update-cli/shared.js +1 -29
  65. package/dist/cli/update-cli/update-command.js +12 -15
  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/cron/service/store.js +2 -2
  93. package/dist/cron/store.js +6 -6
  94. package/dist/daemon/systemd-system.js +5 -5
  95. package/dist/discord/monitor/thread-bindings.state.js +2 -2
  96. package/dist/extensions/sat-mining/src/sat-bond-layout.js +9 -9
  97. package/dist/gateway/control-ui-boot-check.js +6 -6
  98. package/dist/gateway/control-ui-login.js +7 -7
  99. package/dist/gateway/control-ui.js +9 -9
  100. package/dist/gateway/hooks-mapping.js +4 -4
  101. package/dist/gateway/server-discovery.js +2 -2
  102. package/dist/gateway/server-http.js +4 -4
  103. package/dist/gateway/server-methods/chat.js +6 -6
  104. package/dist/gateway/server-methods/sessions.js +6 -6
  105. package/dist/gateway/server-methods/usage.js +2 -2
  106. package/dist/gateway/server.impl.js +3 -3
  107. package/dist/gateway/session-compaction-checkpoints.js +4 -4
  108. package/dist/gateway/session-utils.fs.js +24 -24
  109. package/dist/gateway/session-utils.js +6 -6
  110. package/dist/hooks/bundled-dir.js +4 -4
  111. package/dist/hooks/gmail-setup-utils.js +6 -6
  112. package/dist/hooks/import-url.js +2 -2
  113. package/dist/hooks/loader.js +4 -4
  114. package/dist/hooks/workspace.js +7 -7
  115. package/dist/infra/archive.js +17 -17
  116. package/dist/infra/boundary-file-read.js +2 -2
  117. package/dist/infra/boundary-path.js +15 -15
  118. package/dist/infra/brew.js +2 -2
  119. package/dist/infra/control-ui-assets.js +14 -14
  120. package/dist/infra/device-auth-store.js +8 -8
  121. package/dist/infra/device-identity.js +8 -8
  122. package/dist/infra/dotenv.js +2 -2
  123. package/dist/infra/exec-approvals.js +8 -8
  124. package/dist/infra/exec-command-resolution.js +4 -4
  125. package/dist/infra/exec-safe-bin-trust.js +2 -2
  126. package/dist/infra/fased-root.js +5 -5
  127. package/dist/infra/fs-safe.js +14 -14
  128. package/dist/infra/gateway-lock.js +11 -11
  129. package/dist/infra/git-commit.js +5 -5
  130. package/dist/infra/git-root.js +4 -4
  131. package/dist/infra/hosted-runtime-artifact.js +3 -3
  132. package/dist/infra/is-main.js +2 -2
  133. package/dist/infra/json-file.js +7 -7
  134. package/dist/infra/outbound/delivery-queue.js +16 -16
  135. package/dist/infra/path-env.js +3 -3
  136. package/dist/infra/ports-lsof.js +4 -4
  137. package/dist/infra/provider-usage.auth.js +3 -3
  138. package/dist/infra/safe-open-sync.js +2 -2
  139. package/dist/infra/session-cost-usage.js +9 -9
  140. package/dist/infra/shell-env.js +2 -2
  141. package/dist/infra/state-migrations.fs.js +6 -6
  142. package/dist/infra/state-migrations.js +23 -23
  143. package/dist/infra/tmp-fased-dir.js +6 -6
  144. package/dist/infra/update-global.js +1 -0
  145. package/dist/infra/update-runner.js +111 -64
  146. package/dist/infra/widearea-dns.js +3 -3
  147. package/dist/infra/wsl.js +2 -2
  148. package/dist/light-update-status.js +1 -1
  149. package/dist/line/accounts.js +2 -2
  150. package/dist/line/download.js +2 -2
  151. package/dist/logging/config.js +3 -3
  152. package/dist/logging/logger.js +7 -7
  153. package/dist/managed/federation.js +3 -3
  154. package/dist/managed/tunnel.js +3 -3
  155. package/dist/media/store.js +13 -13
  156. package/dist/media-understanding/runner.js +3 -3
  157. package/dist/memory/embeddings.js +2 -2
  158. package/dist/memory/internal.js +10 -10
  159. package/dist/memory/manager-sync-ops.js +7 -7
  160. package/dist/memory/repair-executor.js +17 -17
  161. package/dist/node-host/invoke-system-run-plan.js +8 -8
  162. package/dist/node-host/invoke.js +2 -2
  163. package/dist/node-host/runner.js +3 -3
  164. package/dist/pairing/pairing-store.js +3 -3
  165. package/dist/plugin-sdk/{audio-preflight-XJNZUuhw.js → audio-preflight-CzG6BjAn.js} +3 -3
  166. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  167. package/dist/plugin-sdk/{chunk-items-me0j1xjK.js → chunk-items-CxRDAM7m.js} +1 -1
  168. package/dist/plugin-sdk/command-status.js +3 -3
  169. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  170. package/dist/plugin-sdk/discord.d.ts +4 -4
  171. package/dist/plugin-sdk/index.d.ts +20 -20
  172. package/dist/plugin-sdk/index.js +5 -4
  173. package/dist/plugin-sdk/json-store.js +6 -6
  174. package/dist/plugin-sdk/{monitor-C7si_bKw.js → monitor-B1PUtkd6.js} +5 -5
  175. package/dist/plugin-sdk/{monitor-DUyt6cCK.js → monitor-BrxWsb7H.js} +7 -7
  176. package/dist/plugin-sdk/{openresponses-http-sYsdEjGP.js → openresponses-http-DJ2lfMja.js} +3 -3
  177. package/dist/plugin-sdk/{pairing-message-C5m-8Evp.d.ts → pairing-message-DWXHX-jt.d.ts} +1 -1
  178. package/dist/plugin-sdk/{pi-embedded-runner-C6HkZJ5E.js → pi-embedded-runner-DMfkIj60.js} +12 -12
  179. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +1 -1
  180. package/dist/plugin-sdk/{pw-ai-BFHYmEIx.js → pw-ai-BgsJH_P8.js} +1 -1
  181. package/dist/plugin-sdk/{runtime-dependency-B5Fut2tT.js → runtime-dependency-pUwxUAJp.js} +9 -9
  182. package/dist/plugin-sdk/sat-runtime.d.ts +2 -2
  183. package/dist/plugin-sdk/sat-runtime.js +1 -1
  184. package/dist/plugin-sdk/{slack-CEoLScM7.js → slack-B6lIY1Jk.js} +5 -5
  185. package/dist/plugin-sdk/slack.d.ts +4 -4
  186. package/dist/plugin-sdk/{sticker-cache-PRfvBRnv.js → sticker-cache-D4Ljzv1P.js} +2 -2
  187. package/dist/plugin-sdk/{telegram-actions-D4PNLPEZ.js → telegram-actions-tOhBd6st.js} +4 -4
  188. package/dist/plugin-sdk/telegram.d.ts +4 -4
  189. package/dist/plugin-sdk/{tmp-fased-dir-B-AAdaCr.d.ts → tmp-fased-dir-Be1wBhVz.d.ts} +1 -1
  190. package/dist/plugin-sdk/{types-ZT0DGnls.d.ts → types-CJGVZX6j.d.ts} +2 -2
  191. package/dist/plugin-sdk/{types-56R2vXgt.d.ts → types-CXLEOrJX.d.ts} +1 -1
  192. package/dist/plugin-sdk/{wallet-status-D9UVH6k9.js → wallet-status-CdxTkLWz.js} +4 -4
  193. package/dist/plugin-sdk/{web-CSpyzE3P.js → web-CX12Rpz1.js} +3 -3
  194. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  195. package/dist/plugin-sdk/{zod-schema.providers-core-FaYR6KdD.d.ts → zod-schema.providers-core-BEbNizPe.d.ts} +78 -78
  196. package/dist/plugins/bundled-dir.js +3 -3
  197. package/dist/plugins/discovery.js +11 -11
  198. package/dist/plugins/loader.js +13 -13
  199. package/dist/plugins/manifest-registry.js +2 -2
  200. package/dist/plugins/manifest.js +4 -4
  201. package/dist/plugins/path-safety.js +3 -3
  202. package/dist/plugins/status-cache.js +9 -9
  203. package/dist/plugins/update.js +3 -3
  204. package/dist/plugins/web-search-install-catalog.js +3 -3
  205. package/dist/secrets/apply.js +16 -16
  206. package/dist/secrets/audit.js +11 -11
  207. package/dist/secrets/shared.js +9 -9
  208. package/dist/security/scan-paths.js +2 -2
  209. package/dist/shared/config-eval.js +2 -2
  210. package/dist/shared/pid-alive.js +2 -2
  211. package/dist/tasks/standing-orders.js +5 -5
  212. package/dist/tasks/task-flow-registry.js +5 -5
  213. package/dist/tasks/task-registry.js +5 -5
  214. package/dist/tasks/workflow-definitions.js +6 -6
  215. package/dist/telegram/token.js +5 -5
  216. package/dist/utils.js +5 -5
  217. package/dist/wallet/local-socket-signer-broker.js +16 -16
  218. package/dist/wallet/providers/embedded-keystore-adapter.js +5 -5
  219. package/dist/wallet/providers/local-socket-signer-adapter.js +2 -2
  220. package/dist/wallet/wallet-approval-auth.js +5 -5
  221. package/dist/wallet/wallet-audit-log.js +5 -5
  222. package/dist/wallet/wallet-custody.js +21 -21
  223. package/dist/wallet/wallet-inbound-events.js +5 -5
  224. package/dist/wallet/wallet-observability.js +5 -5
  225. package/dist/wallet/wallet-policy.js +9 -9
  226. package/dist/wallet/wallet-provider-registry.js +7 -7
  227. package/dist/wallet/wallet-runtime-config.js +3 -3
  228. package/dist/wallet/wallet-secrets-store.js +22 -22
  229. package/dist/wallet/wallet-send-approvals.js +5 -5
  230. package/dist/wallet/wallet-settlement-links.js +5 -5
  231. package/dist/web/accounts.js +3 -3
  232. package/dist/web/auth-store.js +18 -18
  233. package/dist/web/session.js +4 -4
  234. package/dist/wizard/host-security-capability.js +2 -2
  235. package/dist/wizard/onboarding.host-security.js +7 -7
  236. package/dist/wizard/onboarding.js +7 -7
  237. package/dist/wizard/onboarding.wallet.js +44 -44
  238. package/extensions/acpx/package.json +1 -1
  239. package/extensions/bluebubbles/package.json +1 -1
  240. package/extensions/copilot-proxy/package.json +1 -1
  241. package/extensions/diagnostics-otel/package.json +1 -1
  242. package/extensions/fased-federation/package.json +1 -1
  243. package/extensions/google-gemini-cli-auth/package.json +1 -1
  244. package/extensions/imessage/package.json +1 -1
  245. package/extensions/irc/package.json +1 -1
  246. package/extensions/line/package.json +1 -1
  247. package/extensions/llm-task/package.json +1 -1
  248. package/extensions/lobster/package.json +1 -1
  249. package/extensions/matrix/CHANGELOG.md +6 -0
  250. package/extensions/matrix/package.json +1 -1
  251. package/extensions/mattermost/package.json +1 -1
  252. package/extensions/memory-core/package.json +2 -2
  253. package/extensions/memory-lancedb/package.json +1 -1
  254. package/extensions/minimax-portal-auth/package.json +1 -1
  255. package/extensions/msteams/CHANGELOG.md +6 -0
  256. package/extensions/msteams/package.json +1 -1
  257. package/extensions/nextcloud-talk/package.json +1 -1
  258. package/extensions/nostr/CHANGELOG.md +6 -0
  259. package/extensions/nostr/package.json +1 -1
  260. package/extensions/open-prose/package.json +1 -1
  261. package/extensions/sat-mining/package.json +1 -1
  262. package/extensions/signal/package.json +1 -1
  263. package/extensions/synology-chat/package.json +1 -1
  264. package/extensions/tlon/package.json +1 -1
  265. package/extensions/twitch/CHANGELOG.md +6 -0
  266. package/extensions/twitch/package.json +1 -1
  267. package/extensions/voice-call/CHANGELOG.md +6 -0
  268. package/extensions/voice-call/package.json +1 -1
  269. package/extensions/zalo/CHANGELOG.md +6 -0
  270. package/extensions/zalo/package.json +1 -1
  271. package/extensions/zalouser/CHANGELOG.md +6 -0
  272. package/extensions/zalouser/package.json +1 -1
  273. package/package.json +1 -1
@@ -1,27 +1,27 @@
1
- import syncFs from "node:fs";
1
+ import fs 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 syncFs.readdirSync(dir, { withFileTypes: true });
7
+ return fs.readdirSync(dir, { withFileTypes: true });
8
8
  } catch {
9
9
  return [];
10
10
  }
11
11
  }
12
12
  function existsDir(dir) {
13
13
  try {
14
- return syncFs.existsSync(dir) && syncFs.statSync(dir).isDirectory();
14
+ return fs.existsSync(dir) && fs.statSync(dir).isDirectory();
15
15
  } catch {
16
16
  return false;
17
17
  }
18
18
  }
19
19
  function ensureDir(dir) {
20
- syncFs.mkdirSync(dir, { recursive: true });
20
+ fs.mkdirSync(dir, { recursive: true });
21
21
  }
22
22
  function fileExists(p) {
23
23
  try {
24
- return syncFs.existsSync(p) && syncFs.statSync(p).isFile();
24
+ return fs.existsSync(p) && fs.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 = syncFs.readFileSync(storePath, "utf-8");
40
+ const raw = fs.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 syncFs from "node:fs";
11
+ import fs 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
- syncFs.rmdirSync(dir);
244
+ fs.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 = syncFs.readlinkSync(linkPath);
258
+ const target = fs.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 syncFs.statSync(filePath).isDirectory();
269
+ return fs.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 = syncFs.readdirSync(currentDir, { withFileTypes: true });
277
+ entries = fs.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 = syncFs.lstatSync(entryPath);
288
+ stat = fs.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 = syncFs.realpathSync(resolvedTarget);
299
+ resolvedRealTarget = fs.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 = syncFs.realpathSync(targetDir);
321
+ realTargetDir = fs.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 syncFs.existsSync(dir);
351
+ return fs.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 ? syncFs.lstatSync(legacyDir) : null;
360
+ legacyStat = legacyDir ? fs.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 = syncFs.lstatSync(legacyDir);
404
+ legacyStat = fs.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
- syncFs.renameSync(legacyDir, targetDir);
467
+ fs.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
- syncFs.symlinkSync(targetDir, legacyDir, "dir");
481
+ fs.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
- syncFs.symlinkSync(targetDir, legacyDir, "junction");
489
+ fs.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
- syncFs.renameSync(targetDir, legacyDir);
499
+ fs.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
- syncFs.renameSync(from, to);
685
+ fs.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
- syncFs.rmSync(detected.sessions.legacyStorePath, { force: true });
694
+ fs.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
- syncFs.renameSync(detected.sessions.legacyDir, backupDir);
703
+ fs.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 (syncFs.existsSync(to)) {
726
+ if (fs.existsSync(to)) {
727
727
  continue;
728
728
  }
729
729
  try {
730
- syncFs.renameSync(from, to);
730
+ fs.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
- syncFs.renameSync(detected.agentDir.legacyDir, backupDir);
740
+ fs.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
- syncFs.renameSync(from, to);
778
+ fs.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
- syncFs.copyFileSync(legacyPath, targetPath);
802
+ fs.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 syncFs from "node:fs";
1
+ import fs 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 = syncFs.constants.W_OK | syncFs.constants.X_OK;
7
+ const TMP_DIR_ACCESS_MODE = fs.constants.W_OK | fs.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 ?? syncFs.accessSync;
13
- const chmodSync = options.chmodSync ?? syncFs.chmodSync;
14
- const lstatSync = options.lstatSync ?? syncFs.lstatSync;
15
- const mkdirSync = options.mkdirSync ?? syncFs.mkdirSync;
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;
16
16
  const warn = options.warn ?? ((message) => console.warn(message));
17
17
  const getuid = options.getuid ?? (() => {
18
18
  try {
@@ -53,6 +53,7 @@ function resolveHostedNpmInstallTarget(pkgRoot) {
53
53
  return {
54
54
  manager: "npm",
55
55
  globalRoot,
56
+ cacheRoot: path.dirname(prefix),
56
57
  env: {
57
58
  npm_config_prefix: prefix,
58
59
  npm_config_cache: cache
@@ -487,6 +487,7 @@ async function runHostedArtifactUpdate(params) {
487
487
  kind: "updated",
488
488
  steps,
489
489
  afterVersion,
490
+ reason: "package artifact swap",
490
491
  transaction: {
491
492
  kind: "package-root-swap",
492
493
  packageRoot: params.pkgRoot,
@@ -508,6 +509,96 @@ async function pathExists(pathname) {
508
509
  return false;
509
510
  }
510
511
  }
512
+ async function seedHostedDependencyLayerFromCurrent(params) {
513
+ const currentMetadata = await readHostedRuntimeMetadata(params.pkgRoot);
514
+ if (currentMetadata?.dependencyHash !== params.dependencyHash) {
515
+ return false;
516
+ }
517
+ const currentModules = path.join(params.pkgRoot, "node_modules");
518
+ const dependencyModules = path.join(params.dependencyRoot, "node_modules");
519
+ let currentStat;
520
+ try {
521
+ currentStat = await fs.lstat(currentModules);
522
+ } catch {
523
+ return false;
524
+ }
525
+ if (currentStat.isSymbolicLink()) {
526
+ try {
527
+ const currentModulesReal = await fs.realpath(currentModules);
528
+ if (currentModulesReal === await fs.realpath(dependencyModules).catch(() => "")) {
529
+ return true;
530
+ }
531
+ const legacyDependencyRoot = path.dirname(currentModulesReal);
532
+ const legacyDependencyParent = path.dirname(legacyDependencyRoot);
533
+ const recognizedLegacyLayer = path.basename(currentModulesReal) === "node_modules" && path.basename(legacyDependencyRoot) === params.dependencyHash && path.basename(legacyDependencyParent) === ".fased-dependencies";
534
+ if (!recognizedLegacyLayer) {
535
+ return false;
536
+ }
537
+ const nextLink = path.join(params.pkgRoot, `.node_modules-link-${process.pid}-${Date.now()}`);
538
+ const previousLink = path.join(params.pkgRoot, `.node_modules-previous-${process.pid}-${Date.now()}`);
539
+ let layerMoved = false;
540
+ let linkReplaced = false;
541
+ await fs.mkdir(path.dirname(params.dependencyRoot), { recursive: true });
542
+ try {
543
+ await fs.symlink(dependencyModules, nextLink, "dir");
544
+ await fs.rename(legacyDependencyRoot, params.dependencyRoot);
545
+ layerMoved = true;
546
+ await fs.rename(currentModules, previousLink);
547
+ await fs.rename(nextLink, currentModules);
548
+ linkReplaced = true;
549
+ await safeRemove(previousLink);
550
+ return true;
551
+ } catch (error) {
552
+ if (linkReplaced) {
553
+ await safeRemove(currentModules);
554
+ }
555
+ if (await pathExists(previousLink)) {
556
+ await fs.rename(previousLink, currentModules).catch(() => undefined);
557
+ }
558
+ if (layerMoved) {
559
+ await fs.rename(params.dependencyRoot, legacyDependencyRoot).catch(() => undefined);
560
+ }
561
+ await safeRemove(nextLink);
562
+ throw error;
563
+ }
564
+ } catch {
565
+ return false;
566
+ }
567
+ }
568
+ if (!currentStat.isDirectory()) {
569
+ return false;
570
+ }
571
+ const dependencyParent = path.dirname(params.dependencyRoot);
572
+ const stagingRoot = `${params.dependencyRoot}.staging-${process.pid}-${Date.now()}`;
573
+ const linkPath = path.join(params.pkgRoot, `.node_modules-link-${process.pid}-${Date.now()}`);
574
+ let modulesMoved = false;
575
+ let layerActivated = false;
576
+ await fs.mkdir(dependencyParent, { recursive: true });
577
+ if (await pathExists(params.dependencyRoot)) {
578
+ await safeRemove(params.dependencyRoot);
579
+ }
580
+ try {
581
+ await fs.symlink(dependencyModules, linkPath, "dir");
582
+ await fs.mkdir(stagingRoot, { recursive: true });
583
+ await fs.rename(currentModules, path.join(stagingRoot, "node_modules"));
584
+ modulesMoved = true;
585
+ await fs.rename(stagingRoot, params.dependencyRoot);
586
+ layerActivated = true;
587
+ await fs.rename(linkPath, currentModules);
588
+ return true;
589
+ } catch (error) {
590
+ await safeRemove(linkPath);
591
+ if (!await pathExists(currentModules)) {
592
+ const rollbackSource = path.join(layerActivated ? params.dependencyRoot : stagingRoot, "node_modules");
593
+ if (modulesMoved && await pathExists(rollbackSource)) {
594
+ await fs.rename(rollbackSource, currentModules).catch(() => undefined);
595
+ }
596
+ }
597
+ throw error;
598
+ } finally {
599
+ await safeRemove(stagingRoot);
600
+ }
601
+ }
511
602
  async function runHostedLayeredArtifactUpdate(params) {
512
603
  const packageParent = path.dirname(params.pkgRoot);
513
604
  const tempRoot = await fs.mkdtemp(path.join(packageParent, ".fased-layered-update-"));
@@ -601,9 +692,19 @@ async function runHostedLayeredArtifactUpdate(params) {
601
692
  reason: "hosted app dependency metadata missing"
602
693
  };
603
694
  }
604
- const dependencyParent = path.join(packageParent, ".fased-dependencies");
695
+ const dependencyParent = path.join(params.dependencyCacheRoot, "hosted-dependencies");
605
696
  const dependencyRoot = path.join(dependencyParent, metadata.dependencyHash);
606
697
  const dependencyModules = path.join(dependencyRoot, "node_modules");
698
+ if (!await pathExists(dependencyModules)) {
699
+ const currentMetadata = await readHostedRuntimeMetadata(params.pkgRoot);
700
+ if (currentMetadata?.dependencyHash === metadata.dependencyHash) {
701
+ await record("hosted dependency seed", `reuse current dependency layer ${metadata.dependencyHash.slice(0, 12)}`, async () => await seedHostedDependencyLayerFromCurrent({
702
+ pkgRoot: params.pkgRoot,
703
+ dependencyRoot,
704
+ dependencyHash: metadata.dependencyHash
705
+ }));
706
+ }
707
+ }
607
708
  if (!await pathExists(dependencyModules)) {
608
709
  const dependencyDescriptor = resolveHostedRuntimeDependencyArtifact({
609
710
  version: params.expectedVersion,
@@ -664,33 +765,7 @@ async function runHostedLayeredArtifactUpdate(params) {
664
765
  afterVersion: await readPackageVersion(params.pkgRoot)
665
766
  };
666
767
  }
667
- const smokeHome = path.join(tempRoot, "smoke-home");
668
- const smokeStateDir = path.join(smokeHome, ".fased");
669
- await fs.mkdir(smokeStateDir, { recursive: true });
670
- const smokeArgv = [
671
- process.execPath,
672
- path.join(artifactRoot, "fased.mjs"),
673
- "plugins",
674
- "doctor"
675
- ];
676
- const smokeResult = await record("hosted layered verify", smokeArgv.join(" "), async () => await params.runCommand(smokeArgv, {
677
- cwd: artifactRoot,
678
- timeoutMs: params.timeoutMs,
679
- env: {
680
- ...process.env,
681
- HOME: smokeHome,
682
- FASED_STATE_DIR: smokeStateDir,
683
- FASED_CONFIG_PATH: path.join(smokeStateDir, "fased.json")
684
- }
685
- }));
686
- if (smokeResult.code !== 0) {
687
- return {
688
- kind: "error",
689
- steps,
690
- reason: "layered hosted runtime verification failed",
691
- afterVersion: await readPackageVersion(params.pkgRoot)
692
- };
693
- }
768
+ await record("hosted layered verify", `verify checksummed v${params.expectedVersion} runtime shape`, async () => undefined);
694
769
  await record("hosted app swap", `replace ${params.pkgRoot}`, async () => {
695
770
  const swapped = await swapPackageRoot({
696
771
  pkgRoot: params.pkgRoot,
@@ -706,6 +781,7 @@ async function runHostedLayeredArtifactUpdate(params) {
706
781
  kind: "updated",
707
782
  steps,
708
783
  afterVersion: await readPackageVersion(params.pkgRoot),
784
+ reason: "verified layered hosted runtime",
709
785
  transaction: {
710
786
  kind: "package-root-swap",
711
787
  packageRoot: params.pkgRoot,
@@ -828,49 +904,18 @@ async function runHostedReleaseArtifactUpdate(params) {
828
904
  const artifactRoot = path.join(extractDir, "package");
829
905
  const artifactVersion = await readPackageVersion(artifactRoot);
830
906
  const runtimeShapeReady = compareSemverStrings(artifactVersion, params.expectedVersion) === 0 && await pathExists(path.join(artifactRoot, "fased.mjs")) && await pathExists(path.join(artifactRoot, "node_modules"));
831
- const smokeHome = path.join(tempRoot, "smoke-home");
832
- const smokeStateDir = path.join(smokeHome, ".fased");
833
- const smokeArgv = [
834
- process.execPath,
835
- path.join(artifactRoot, "fased.mjs"),
836
- "plugins",
837
- "doctor"
838
- ];
839
- const verifyCommand = smokeArgv.join(" ");
907
+ const verifyCommand = `verify checksummed v${params.expectedVersion} runtime shape`;
840
908
  const verifyInfo = startProgress("hosted artifact verify", verifyCommand, artifactRoot);
841
909
  const verifyStarted = Date.now();
842
- let smokeResult = null;
843
- let smokeError = null;
844
- if (runtimeShapeReady) {
845
- try {
846
- await fs.mkdir(smokeHome, { recursive: true });
847
- smokeResult = await params.runCommand(smokeArgv, {
848
- cwd: artifactRoot,
849
- timeoutMs: params.timeoutMs,
850
- env: {
851
- ...process.env,
852
- HOME: smokeHome,
853
- FASED_STATE_DIR: smokeStateDir,
854
- FASED_CONFIG_PATH: path.join(smokeStateDir, "fased.json")
855
- }
856
- });
857
- } catch (error) {
858
- smokeError = String(error);
859
- }
860
- }
861
- const runtimeReady = runtimeShapeReady && smokeResult?.code === 0;
862
- const verifyFailure = !runtimeShapeReady ? `expected complete v${params.expectedVersion}, found ${artifactVersion ?? "unknown"}` : trimLogTail([
863
- smokeResult?.stderr,
864
- smokeResult?.stdout,
865
- smokeError
866
- ].filter((value) => Boolean(value?.trim())).join("\n"), MAX_LOG_CHARS) || "hosted runtime CLI and plugin check failed";
910
+ const runtimeReady = runtimeShapeReady;
911
+ const verifyFailure = !runtimeShapeReady ? `expected complete v${params.expectedVersion}, found ${artifactVersion ?? "unknown"}` : "hosted runtime shape verification failed";
867
912
  completeProgress(verifyInfo, {
868
913
  name: "hosted artifact verify",
869
914
  command: verifyCommand,
870
915
  cwd: artifactRoot,
871
916
  durationMs: Date.now() - verifyStarted,
872
917
  exitCode: runtimeReady ? 0 : 1,
873
- ...runtimeReady ? { stdoutTail: `v${params.expectedVersion} CLI and bundled plugins passed` } : { stderrTail: verifyFailure }
918
+ ...runtimeReady ? { stdoutTail: `checksummed v${params.expectedVersion} runtime shape passed` } : { stderrTail: verifyFailure }
874
919
  });
875
920
  if (!runtimeReady) {
876
921
  return {
@@ -917,6 +962,7 @@ async function runHostedReleaseArtifactUpdate(params) {
917
962
  kind: "updated",
918
963
  steps,
919
964
  afterVersion: await readPackageVersion(params.pkgRoot),
965
+ reason: "verified self-contained hosted runtime",
920
966
  transaction: {
921
967
  kind: "package-root-swap",
922
968
  packageRoot: params.pkgRoot,
@@ -1624,6 +1670,7 @@ async function runGatewayUpdate(opts = {}) {
1624
1670
  fetchImpl: releaseFetch,
1625
1671
  baseUrl: opts.hostedReleaseBaseUrl ?? process.env.FASED_HOSTED_ARTIFACT_BASE_URL,
1626
1672
  pkgRoot,
1673
+ dependencyCacheRoot: hostedTarget.cacheRoot,
1627
1674
  expectedVersion,
1628
1675
  runCommand,
1629
1676
  timeoutMs,
@@ -1636,7 +1683,7 @@ async function runGatewayUpdate(opts = {}) {
1636
1683
  mode: globalManager,
1637
1684
  strategy: {
1638
1685
  kind: "hosted-artifact",
1639
- reason: "verified self-contained hosted runtime"
1686
+ reason: releaseResult.reason
1640
1687
  },
1641
1688
  root: pkgRoot,
1642
1689
  before: { version: beforeVersion },
@@ -1,5 +1,5 @@
1
1
  import { CONFIG_DIR, ensureDir } from "../utils.js";
2
- import syncFs from "node:fs";
2
+ import fs 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 syncFs.readFileSync(zonePath, "utf-8");
129
+ return fs.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
- syncFs.writeFileSync(zonePath, next, "utf-8");
152
+ fs.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 from "node:fs/promises";
2
+ import fs$1 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.readFile("/proc/sys/kernel/osrelease", "utf8");
53
+ const release = await fs$1.readFile("/proc/sys/kernel/osrelease", "utf8");
54
54
  wslCached = release.toLowerCase().includes("microsoft") || release.toLowerCase().includes("wsl");
55
55
  } catch {
56
56
  wslCached = false;