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