@proxysoul/soulforge 2.20.9 → 2.20.10

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 (2) hide show
  1. package/dist/index.js +132 -44
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -46983,6 +46983,8 @@ function supportsTemperature(modelId) {
46983
46983
  const base = extractBaseModel(modelId);
46984
46984
  if (!base.startsWith("claude"))
46985
46985
  return true;
46986
+ if (isClaude5Plus(base))
46987
+ return false;
46986
46988
  const v = parseOpusVersion(base);
46987
46989
  if (!v)
46988
46990
  return true;
@@ -46990,11 +46992,20 @@ function supportsTemperature(modelId) {
46990
46992
  }
46991
46993
  function isAdaptiveOnly(modelId) {
46992
46994
  const base = extractBaseModel(modelId);
46995
+ if (isClaude5Plus(base))
46996
+ return true;
46993
46997
  const v = parseOpusVersion(base);
46994
46998
  if (!v)
46995
46999
  return false;
46996
47000
  return v.major >= 5 || v.major === 4 && v.minor >= 7;
46997
47001
  }
47002
+ function isClaude5Plus(base) {
47003
+ if (/(?:fable|mythos)-(\d+)/.test(base)) {
47004
+ const m = base.match(/(?:fable|mythos)-(\d+)/);
47005
+ return m ? Number(m[1]) >= 5 : false;
47006
+ }
47007
+ return false;
47008
+ }
46998
47009
 
46999
47010
  // src/utils/errors.ts
47000
47011
  function toErrorMessage(err2) {
@@ -52021,6 +52032,8 @@ var init_anthropic = __esm(() => {
52021
52032
  return result;
52022
52033
  },
52023
52034
  fallbackModels: [
52035
+ { id: "claude-fable-5", name: "Claude Fable 5" },
52036
+ { id: "claude-mythos-5", name: "Claude Mythos 5" },
52024
52037
  { id: "claude-opus-4-8", name: "Claude Opus 4.8" },
52025
52038
  { id: "claude-opus-4-7", name: "Claude Opus 4.7" },
52026
52039
  { id: "claude-opus-4-6", name: "Claude Opus 4.6" },
@@ -52032,6 +52045,8 @@ var init_anthropic = __esm(() => {
52032
52045
  { id: "claude-haiku-4", name: "Claude Haiku 4" }
52033
52046
  ],
52034
52047
  contextWindows: [
52048
+ ["claude-fable-5", 1e6],
52049
+ ["claude-mythos-5", 1e6],
52035
52050
  ["claude-opus-4-8", 1e6],
52036
52051
  ["claude-opus-4-7", 1e6],
52037
52052
  ["claude-opus-4-6", 1e6],
@@ -71947,7 +71962,7 @@ var package_default;
71947
71962
  var init_package = __esm(() => {
71948
71963
  package_default = {
71949
71964
  name: "@proxysoul/soulforge",
71950
- version: "2.20.9",
71965
+ version: "2.20.10",
71951
71966
  description: "Graph-powered code intelligence \u2014 multi-agent coding with codebase-aware AI",
71952
71967
  repository: {
71953
71968
  type: "git",
@@ -100230,6 +100245,7 @@ import {
100230
100245
  mkdirSync as mkdirSync13,
100231
100246
  readdirSync as readdirSync4,
100232
100247
  readFileSync as readFileSync13,
100248
+ statSync as statSync3,
100233
100249
  unlinkSync as unlinkSync4,
100234
100250
  writeFileSync as writeFileSync11
100235
100251
  } from "fs";
@@ -100659,6 +100675,8 @@ function runProxyLogin(onOutput, providerFlag) {
100659
100675
  }
100660
100676
  ensureConfig();
100661
100677
  const flag = providerFlag ?? "-claude-login";
100678
+ const prefix = PROXY_PROVIDERS.find((p) => p.flag === flag)?.prefix ?? "";
100679
+ const credSnapshot = snapshotProviderCreds(prefix);
100662
100680
  const proc = spawn4(binary2, ["-config", PROXY_CONFIG_PATH, flag], {
100663
100681
  stdio: ["ignore", "pipe", "pipe"]
100664
100682
  });
@@ -100678,12 +100696,20 @@ function runProxyLogin(onOutput, providerFlag) {
100678
100696
  proc.stderr?.on("data", handleData);
100679
100697
  const promise2 = new Promise((resolve6) => {
100680
100698
  proc.on("close", async (code) => {
100681
- if (code === 0) {
100682
- const result = await ensureProxy();
100683
- resolve6({ ok: result.ok });
100684
- } else {
100699
+ const authed = code === 0 && credsChangedSince(prefix, credSnapshot);
100700
+ if (!authed) {
100685
100701
  resolve6({ ok: false });
100702
+ return;
100686
100703
  }
100704
+ try {
100705
+ const healthy = await bounceProxy();
100706
+ if (!healthy) {
100707
+ onOutput("Credentials saved, but the proxy did not come back up. Run /proxy restart.");
100708
+ }
100709
+ } catch {
100710
+ onOutput("Credentials saved, but restarting the proxy failed. Run /proxy restart.");
100711
+ }
100712
+ resolve6({ ok: true });
100687
100713
  });
100688
100714
  proc.on("error", (err2) => {
100689
100715
  onOutput(`Login failed: ${err2.message}`);
@@ -100825,6 +100851,35 @@ function parseNetstatPidsForPort(out2, port) {
100825
100851
  }
100826
100852
  return pids;
100827
100853
  }
100854
+ function snapshotProviderCreds(prefix) {
100855
+ const snap = new Map;
100856
+ if (!prefix || !existsSync16(AUTH_DIR))
100857
+ return snap;
100858
+ for (const f of readdirSync4(AUTH_DIR)) {
100859
+ if (!f.startsWith(prefix) || !f.endsWith(".json"))
100860
+ continue;
100861
+ try {
100862
+ snap.set(f, statSync3(join19(AUTH_DIR, f)).mtimeMs);
100863
+ } catch {}
100864
+ }
100865
+ return snap;
100866
+ }
100867
+ function credsChangedSince(prefix, before) {
100868
+ if (!prefix || !existsSync16(AUTH_DIR))
100869
+ return false;
100870
+ for (const f of readdirSync4(AUTH_DIR)) {
100871
+ if (!f.startsWith(prefix) || !f.endsWith(".json"))
100872
+ continue;
100873
+ const prev = before.get(f);
100874
+ if (prev === undefined)
100875
+ return true;
100876
+ try {
100877
+ if (statSync3(join19(AUTH_DIR, f)).mtimeMs > prev)
100878
+ return true;
100879
+ } catch {}
100880
+ }
100881
+ return false;
100882
+ }
100828
100883
  var proxyProcess = null, PROXY_URL, PROXY_CONFIG_DIR, PROXY_CONFIG_PATH, HEALTH_TIMEOUT_MS = 2000, STARTUP_POLL_MS = 500, STARTUP_POLL_ATTEMPTS = 10, currentState = "stopped", lastError = null, stateListeners, VERSION_FILE, LEGACY_PERF_MARKER_PREFIX = "# soulforge-perf-defaults", bounceInFlight = null, PROXY_PROVIDERS, AUTH_DIR, cachedLatest = null, VERSION_CACHE_TTL;
100829
100884
  var init_lifecycle = __esm(() => {
100830
100885
  init_errors();
@@ -115417,7 +115472,7 @@ var init_checkpoints = __esm(() => {
115417
115472
  });
115418
115473
 
115419
115474
  // src/core/commands/utils.ts
115420
- import { existsSync as existsSync17, readdirSync as readdirSync5, statSync as statSync3 } from "fs";
115475
+ import { existsSync as existsSync17, readdirSync as readdirSync5, statSync as statSync4 } from "fs";
115421
115476
  import { homedir as homedir4 } from "os";
115422
115477
  import { join as join20 } from "path";
115423
115478
  function sysMsg(ctx, content) {
@@ -115445,7 +115500,7 @@ function dirSize(dirPath) {
115445
115500
  for (const entry of readdirSync5(dirPath)) {
115446
115501
  const fp = join20(dirPath, entry);
115447
115502
  try {
115448
- const s = statSync3(fp);
115503
+ const s = statSync4(fp);
115449
115504
  total += s.isDirectory() ? dirSize(fp) : s.size;
115450
115505
  } catch {}
115451
115506
  }
@@ -115453,7 +115508,7 @@ function dirSize(dirPath) {
115453
115508
  }
115454
115509
  function fileSize(filePath) {
115455
115510
  try {
115456
- return statSync3(filePath).size;
115511
+ return statSync4(filePath).size;
115457
115512
  } catch {
115458
115513
  return 0;
115459
115514
  }
@@ -134682,7 +134737,7 @@ ${lanes.join(`
134682
134737
  return process.memoryUsage().heapUsed;
134683
134738
  },
134684
134739
  getFileSize(path) {
134685
- const stat2 = statSync4(path);
134740
+ const stat2 = statSync5(path);
134686
134741
  if (stat2 == null ? undefined : stat2.isFile()) {
134687
134742
  return stat2.size;
134688
134743
  }
@@ -134725,7 +134780,7 @@ ${lanes.join(`
134725
134780
  }
134726
134781
  };
134727
134782
  return nodeSystem;
134728
- function statSync4(path) {
134783
+ function statSync5(path) {
134729
134784
  try {
134730
134785
  return _fs.statSync(path, statSyncOptions);
134731
134786
  } catch {
@@ -134777,7 +134832,7 @@ ${lanes.join(`
134777
134832
  activeSession.post("Profiler.stop", (err2, { profile }) => {
134778
134833
  var _a31;
134779
134834
  if (!err2) {
134780
- if ((_a31 = statSync4(profilePath)) == null ? undefined : _a31.isDirectory()) {
134835
+ if ((_a31 = statSync5(profilePath)) == null ? undefined : _a31.isDirectory()) {
134781
134836
  profilePath = _path.join(profilePath, `${(/* @__PURE__ */ new Date()).toISOString().replace(/:/g, "-")}+P${process.pid}.cpuprofile`);
134782
134837
  }
134783
134838
  try {
@@ -134886,7 +134941,7 @@ ${lanes.join(`
134886
134941
  let stat2;
134887
134942
  if (typeof dirent === "string" || dirent.isSymbolicLink()) {
134888
134943
  const name38 = combinePaths(path, entry);
134889
- stat2 = statSync4(name38);
134944
+ stat2 = statSync5(name38);
134890
134945
  if (!stat2) {
134891
134946
  continue;
134892
134947
  }
@@ -134910,7 +134965,7 @@ ${lanes.join(`
134910
134965
  return matchFiles(path, extensions, excludes, includes, useCaseSensitiveFileNames2, process.cwd(), depth, getAccessibleFileSystemEntries, realpath);
134911
134966
  }
134912
134967
  function fileSystemEntryExists(path, entryKind) {
134913
- const stat2 = statSync4(path);
134968
+ const stat2 = statSync5(path);
134914
134969
  if (!stat2) {
134915
134970
  return false;
134916
134971
  }
@@ -134944,7 +134999,7 @@ ${lanes.join(`
134944
134999
  }
134945
135000
  function getModifiedTime3(path) {
134946
135001
  var _a31;
134947
- return (_a31 = statSync4(path)) == null ? undefined : _a31.mtime;
135002
+ return (_a31 = statSync5(path)) == null ? undefined : _a31.mtime;
134948
135003
  }
134949
135004
  function setModifiedTime(path, time3) {
134950
135005
  try {
@@ -378118,7 +378173,7 @@ var init_trigram = __esm(() => {
378118
378173
 
378119
378174
  // src/core/intelligence/repo-map.ts
378120
378175
  import { Database } from "bun:sqlite";
378121
- import { chmodSync as chmodSync3, existsSync as existsSync25, readdirSync as readdirSync9, readFileSync as readFileSync17, statSync as statSync4 } from "fs";
378176
+ import { chmodSync as chmodSync3, existsSync as existsSync25, readdirSync as readdirSync9, readFileSync as readFileSync17, statSync as statSync5 } from "fs";
378122
378177
  import { stat as statAsync } from "fs/promises";
378123
378178
  import { dirname as dirname8, extname as extname2, join as join30, relative as relative4, resolve as resolve13 } from "path";
378124
378179
 
@@ -380193,7 +380248,7 @@ class RepoMap {
380193
380248
  for (const f of files) {
380194
380249
  const absPath = join30(this.cwd, f.path);
380195
380250
  try {
380196
- const st2 = statSync4(absPath);
380251
+ const st2 = statSync5(absPath);
380197
380252
  if (st2.mtimeMs !== f.mtime_ms || st2.size !== f.size_bytes) {
380198
380253
  this.onFileChanged(absPath);
380199
380254
  }
@@ -380698,7 +380753,7 @@ class RepoMap {
380698
380753
  continue;
380699
380754
  seenPaths.add(absPath);
380700
380755
  try {
380701
- const stat3 = statSync4(absPath);
380756
+ const stat3 = statSync5(absPath);
380702
380757
  if (Math.abs(stat3.mtimeMs - row.mtime_ms) > 1000)
380703
380758
  continue;
380704
380759
  } catch {
@@ -380788,7 +380843,7 @@ class RepoMap {
380788
380843
  seen.add(key);
380789
380844
  const absPath = join30(this.cwd, row.path);
380790
380845
  try {
380791
- const stat3 = statSync4(absPath);
380846
+ const stat3 = statSync5(absPath);
380792
380847
  if (Math.abs(stat3.mtimeMs - row.mtime_ms) > 1000)
380793
380848
  continue;
380794
380849
  } catch {
@@ -380842,7 +380897,7 @@ class RepoMap {
380842
380897
  for (const row of rows) {
380843
380898
  const absPath = join30(this.cwd, row.path);
380844
380899
  try {
380845
- const stat3 = statSync4(absPath);
380900
+ const stat3 = statSync5(absPath);
380846
380901
  if (Math.abs(stat3.mtimeMs - row.mtime_ms) > 1000)
380847
380902
  continue;
380848
380903
  } catch {
@@ -403005,6 +403060,8 @@ function matchPricing(modelId) {
403005
403060
  if (id.includes(key))
403006
403061
  return pricing;
403007
403062
  }
403063
+ if (id.includes("fable") || id.includes("mythos"))
403064
+ return MODEL_PRICING["claude-fable-5"] ?? DEFAULT_PRICING;
403008
403065
  if (id.includes("opus"))
403009
403066
  return MODEL_PRICING["claude-opus-4-8"] ?? DEFAULT_PRICING;
403010
403067
  if (id.includes("sonnet"))
@@ -403013,6 +403070,8 @@ function matchPricing(modelId) {
403013
403070
  return MODEL_PRICING["claude-haiku-4-5"] ?? DEFAULT_PRICING;
403014
403071
  if (id.includes("gemini"))
403015
403072
  return MODEL_PRICING["gemini-2.5-flash"] ?? DEFAULT_PRICING;
403073
+ if (id.includes("grok"))
403074
+ return MODEL_PRICING["grok-4.3"] ?? DEFAULT_PRICING;
403016
403075
  if (id.includes("gpt"))
403017
403076
  return MODEL_PRICING["gpt-5.4"] ?? DEFAULT_PRICING;
403018
403077
  if (id.includes("deepseek"))
@@ -403052,6 +403111,9 @@ function resetStatusBarStore() {
403052
403111
  memPollTimer = null;
403053
403112
  memPollStarted = false;
403054
403113
  }
403114
+ footprintCacheMB = null;
403115
+ footprintCacheAt = 0;
403116
+ footprintRefreshInFlight = false;
403055
403117
  useStatusBarStore.setState({
403056
403118
  tokenUsage: { ...ZERO_USAGE },
403057
403119
  activeModel: "none",
@@ -403143,8 +403205,24 @@ async function getMainFootprintMB() {
403143
403205
  const rssMB = Math.round(process.memoryUsage().rss / 1024 / 1024);
403144
403206
  if (process.platform !== "darwin")
403145
403207
  return rssMB;
403146
- const footprint = await macFootprintMB(process.pid);
403147
- return footprint ?? rssMB;
403208
+ const now2 = Date.now();
403209
+ if (footprintCacheMB === null || now2 - footprintCacheAt >= FOOTPRINT_TTL_MS) {
403210
+ refreshFootprintMB();
403211
+ }
403212
+ return footprintCacheMB ?? rssMB;
403213
+ }
403214
+ async function refreshFootprintMB() {
403215
+ if (footprintRefreshInFlight)
403216
+ return;
403217
+ footprintRefreshInFlight = true;
403218
+ try {
403219
+ const mb = await macFootprintMB(process.pid);
403220
+ footprintCacheAt = Date.now();
403221
+ if (mb != null)
403222
+ footprintCacheMB = mb;
403223
+ } finally {
403224
+ footprintRefreshInFlight = false;
403225
+ }
403148
403226
  }
403149
403227
  function macFootprintMB(pid) {
403150
403228
  return new Promise((resolve14) => {
@@ -403197,7 +403275,7 @@ function startMemoryPoll(intervalMs = 2000) {
403197
403275
  });
403198
403276
  }, intervalMs);
403199
403277
  }
403200
- var MODEL_PRICING, FREE_PRICING, DEFAULT_PRICING, FREE, M025, M033, M1, M3, M30, M75, COPILOT_PRICING, LOCAL_PROVIDERS, ZERO_USAGE, ZERO_PROCESS_RSS, useStatusBarStore, memPollStarted = false, memPollTimer = null;
403278
+ var MODEL_PRICING, FREE_PRICING, DEFAULT_PRICING, FREE, M025, M033, M1, M3, M30, M75, COPILOT_PRICING, LOCAL_PROVIDERS, ZERO_USAGE, ZERO_PROCESS_RSS, useStatusBarStore, FOOTPRINT_TTL_MS = 30000, footprintCacheMB = null, footprintCacheAt = 0, footprintRefreshInFlight = false, memPollStarted = false, memPollTimer = null;
403201
403279
  var init_statusbar = __esm(() => {
403202
403280
  init_esm();
403203
403281
  init_middleware();
@@ -403207,6 +403285,8 @@ var init_statusbar = __esm(() => {
403207
403285
  init_platform();
403208
403286
  init_lifecycle();
403209
403287
  MODEL_PRICING = {
403288
+ "claude-fable-5": { input: 10, cacheWrite: 12.5, cacheRead: 1, output: 50 },
403289
+ "claude-mythos-5": { input: 10, cacheWrite: 12.5, cacheRead: 1, output: 50 },
403210
403290
  "claude-opus-4-8": { input: 5, cacheWrite: 6.25, cacheRead: 0.5, output: 25 },
403211
403291
  "claude-opus-4-7": { input: 5, cacheWrite: 6.25, cacheRead: 0.5, output: 25 },
403212
403292
  "claude-opus-4-6": { input: 5, cacheWrite: 6.25, cacheRead: 0.5, output: 25 },
@@ -403242,10 +403322,10 @@ var init_statusbar = __esm(() => {
403242
403322
  "gemini-2.5-flash-lite": { input: 0.1, cacheWrite: 0.1, cacheRead: 0.01, output: 0.4 },
403243
403323
  "gemini-2.0-flash": { input: 0.1, cacheWrite: 0.1, cacheRead: 0.025, output: 0.4 },
403244
403324
  "gemini-2.0-flash-lite": { input: 0.075, cacheWrite: 0.075, cacheRead: 0.019, output: 0.3 },
403245
- "deepseek-v4-pro": { input: 1.74, cacheWrite: 1.74, cacheRead: 0.0145, output: 3.48 },
403246
- "deepseek-v4-flash": { input: 0.14, cacheWrite: 0.14, cacheRead: 0.014, output: 0.28 },
403247
- "deepseek-chat": { input: 0.14, cacheWrite: 0.14, cacheRead: 0.014, output: 0.28 },
403248
- "deepseek-reasoner": { input: 0.14, cacheWrite: 0.14, cacheRead: 0.014, output: 0.28 },
403325
+ "deepseek-v4-pro": { input: 0.435, cacheWrite: 0.435, cacheRead: 0.003625, output: 0.87 },
403326
+ "deepseek-v4-flash": { input: 0.14, cacheWrite: 0.14, cacheRead: 0.0028, output: 0.28 },
403327
+ "deepseek-chat": { input: 0.14, cacheWrite: 0.14, cacheRead: 0.0028, output: 0.28 },
403328
+ "deepseek-reasoner": { input: 0.14, cacheWrite: 0.14, cacheRead: 0.0028, output: 0.28 },
403249
403329
  "deepseek-v3": { input: 0.28, cacheWrite: 0.28, cacheRead: 0.028, output: 0.42 },
403250
403330
  "deepseek-r1": { input: 0.28, cacheWrite: 0.28, cacheRead: 0.028, output: 0.42 },
403251
403331
  "llama-3.3-70b": { input: 0.59, cacheWrite: 0.59, cacheRead: 0.295, output: 0.79 },
@@ -403254,9 +403334,17 @@ var init_statusbar = __esm(() => {
403254
403334
  "qwen3-32b": { input: 0.29, cacheWrite: 0.29, cacheRead: 0.145, output: 0.59 },
403255
403335
  "gpt-oss-20b": { input: 0.075, cacheWrite: 0.075, cacheRead: 0.0375, output: 0.3 },
403256
403336
  "gpt-oss-120b": { input: 0.15, cacheWrite: 0.15, cacheRead: 0.075, output: 0.6 },
403337
+ "grok-4.3": { input: 1.25, cacheWrite: 1.25, cacheRead: 0.2, output: 2.5 },
403338
+ "grok-4.20": { input: 1.25, cacheWrite: 1.25, cacheRead: 0.2, output: 2.5 },
403339
+ "grok-4.1-fast": { input: 0.2, cacheWrite: 0.2, cacheRead: 0.05, output: 0.5 },
403340
+ "grok-4-fast": { input: 0.2, cacheWrite: 0.2, cacheRead: 0.05, output: 0.5 },
403341
+ "grok-code-fast": { input: 0.2, cacheWrite: 0.2, cacheRead: 0.02, output: 1.5 },
403342
+ "grok-4": { input: 3, cacheWrite: 3, cacheRead: 0.75, output: 15 },
403343
+ "grok-3": { input: 3, cacheWrite: 3, cacheRead: 0.75, output: 15 },
403344
+ "grok-3-mini": { input: 0.3, cacheWrite: 0.3, cacheRead: 0.075, output: 0.5 },
403257
403345
  "mistral-large": { input: 0.5, cacheWrite: 0.5, cacheRead: 0.05, output: 1.5 },
403258
- "mistral-medium": { input: 0.4, cacheWrite: 0.4, cacheRead: 0.04, output: 2 },
403259
- "mistral-small": { input: 0.1, cacheWrite: 0.1, cacheRead: 0.01, output: 0.3 },
403346
+ "mistral-medium": { input: 1.5, cacheWrite: 1.5, cacheRead: 0.15, output: 7.5 },
403347
+ "mistral-small": { input: 0.15, cacheWrite: 0.15, cacheRead: 0.015, output: 0.6 },
403260
403348
  codestral: { input: 0.3, cacheWrite: 0.3, cacheRead: 0.03, output: 0.9 },
403261
403349
  magistral: { input: 0.5, cacheWrite: 0.5, cacheRead: 0.05, output: 1.5 },
403262
403350
  ministral: { input: 0.1, cacheWrite: 0.1, cacheRead: 0.01, output: 0.1 },
@@ -415140,7 +415228,7 @@ var init_approval_gates = __esm(() => {
415140
415228
  });
415141
415229
 
415142
415230
  // src/core/utils/path-display.ts
415143
- import { realpathSync as realpathSync3, statSync as statSync5 } from "fs";
415231
+ import { realpathSync as realpathSync3, statSync as statSync6 } from "fs";
415144
415232
  import { homedir as homedir11, platform as platform4 } from "os";
415145
415233
  import { isAbsolute, relative as relative5, resolve as resolve15, sep as sep2 } from "path";
415146
415234
  function canonicalizePath(p) {
@@ -435334,7 +435422,7 @@ function isTextWithEncodingHint(fileBuffer, bytesRead, encoding) {
435334
435422
  var MAX_BYTES = 512;
435335
435423
 
435336
435424
  // node_modules/isbinaryfile/lib/index.js
435337
- import { statSync as statSync6, openSync, readSync, closeSync } from "fs";
435425
+ import { statSync as statSync7, openSync, readSync, closeSync } from "fs";
435338
435426
  import { open, stat as stat4 } from "fs/promises";
435339
435427
 
435340
435428
  class Reader {
@@ -435443,7 +435531,7 @@ async function isBinaryFile(file2, options) {
435443
435531
  }
435444
435532
  function isBinaryFileSync(file2, options) {
435445
435533
  if (isString(file2)) {
435446
- const fileStat = statSync6(file2);
435534
+ const fileStat = statSync7(file2);
435447
435535
  isStatFile(fileStat);
435448
435536
  const fileDescriptor = openSync(file2, "r");
435449
435537
  const allocBuffer = Buffer.alloc(MAX_BYTES2 + UTF8_BOUNDARY_RESERVE);
@@ -435538,7 +435626,7 @@ var MAX_BYTES2 = 512, UTF8_BOUNDARY_RESERVE = 3;
435538
435626
  var init_lib2 = () => {};
435539
435627
 
435540
435628
  // src/core/tools/binary-detect.ts
435541
- import { existsSync as existsSync41, statSync as statSync7 } from "fs";
435629
+ import { existsSync as existsSync41, statSync as statSync8 } from "fs";
435542
435630
  import { extname as extname3, resolve as resolve28 } from "path";
435543
435631
  function binaryHint(ext) {
435544
435632
  if (IMAGE_EXTS.has(ext))
@@ -435561,7 +435649,7 @@ function checkBinaryFile(filePath) {
435561
435649
  try {
435562
435650
  if (!existsSync41(filePath))
435563
435651
  return null;
435564
- const stat5 = statSync7(filePath);
435652
+ const stat5 = statSync8(filePath);
435565
435653
  if (!stat5.isFile())
435566
435654
  return null;
435567
435655
  if (!isBinaryFileSync(filePath))
@@ -437548,7 +437636,7 @@ import {
437548
437636
  existsSync as existsSync42,
437549
437637
  openSync as openSync2,
437550
437638
  readFileSync as readFileSync22,
437551
- statSync as statSync8,
437639
+ statSync as statSync9,
437552
437640
  unlinkSync as unlinkSync8,
437553
437641
  writeSync
437554
437642
  } from "fs";
@@ -437613,7 +437701,7 @@ function isRenderableImage(filePath) {
437613
437701
  if (!IMAGE_EXTENSIONS2.has(ext))
437614
437702
  return false;
437615
437703
  try {
437616
- const stat5 = statSync8(filePath);
437704
+ const stat5 = statSync9(filePath);
437617
437705
  return stat5.isFile() && stat5.size > 0 && stat5.size <= MAX_IMAGE_SIZE;
437618
437706
  } catch {
437619
437707
  return false;
@@ -438054,7 +438142,7 @@ import {
438054
438142
  existsSync as existsSync43,
438055
438143
  readdirSync as readdirSync10,
438056
438144
  readFileSync as readFileSync23,
438057
- statSync as statSync9,
438145
+ statSync as statSync10,
438058
438146
  unlinkSync as unlinkSync9,
438059
438147
  writeFileSync as writeFileSync18
438060
438148
  } from "fs";
@@ -438665,7 +438753,7 @@ async function showImage(args2, cwd2, toolCallId, signal) {
438665
438753
  const filePath = resolve34(cwd2, args2.path);
438666
438754
  let stat5;
438667
438755
  try {
438668
- stat5 = statSync9(filePath);
438756
+ stat5 = statSync10(filePath);
438669
438757
  } catch {
438670
438758
  return { success: false, output: `File not found: ${args2.path}` };
438671
438759
  }
@@ -438807,7 +438895,7 @@ async function restoreSessionImages(messages, cwd2) {
438807
438895
  const filePath = resolve34(cwd2, path);
438808
438896
  if (!existsSync43(filePath))
438809
438897
  continue;
438810
- const stat5 = statSync9(filePath);
438898
+ const stat5 = statSync10(filePath);
438811
438899
  if (!stat5.isFile() || stat5.size > MAX_IMAGE_SIZE2)
438812
438900
  continue;
438813
438901
  data = readFileSync23(filePath);
@@ -438897,7 +438985,7 @@ var init_show_image = __esm(() => {
438897
438985
  });
438898
438986
 
438899
438987
  // src/core/skills/manager.ts
438900
- import { existsSync as existsSync44, readdirSync as readdirSync11, readFileSync as readFileSync24, realpathSync as realpathSync4, rmSync as rmSync6, statSync as statSync10 } from "fs";
438988
+ import { existsSync as existsSync44, readdirSync as readdirSync11, readFileSync as readFileSync24, realpathSync as realpathSync4, rmSync as rmSync6, statSync as statSync11 } from "fs";
438901
438989
  import { homedir as homedir13 } from "os";
438902
438990
  import { dirname as dirname22, join as join47 } from "path";
438903
438991
  async function searchSkills(query2) {
@@ -439011,7 +439099,7 @@ function scanSkillDir(dir, scope, byName, seenPaths) {
439011
439099
  }
439012
439100
  function isDirectorySafe(path) {
439013
439101
  try {
439014
- return statSync10(path).isDirectory();
439102
+ return statSync11(path).isDirectory();
439015
439103
  } catch {
439016
439104
  return false;
439017
439105
  }
@@ -470275,7 +470363,7 @@ var init_headless = __esm(() => {
470275
470363
  });
470276
470364
 
470277
470365
  // src/core/presets/registry.ts
470278
- import { existsSync as existsSync54, mkdirSync as mkdirSync25, readFileSync as readFileSync29, statSync as statSync11, writeFileSync as writeFileSync21 } from "fs";
470366
+ import { existsSync as existsSync54, mkdirSync as mkdirSync25, readFileSync as readFileSync29, statSync as statSync12, writeFileSync as writeFileSync21 } from "fs";
470279
470367
  import { join as join56 } from "path";
470280
470368
  function getCacheDirInternal() {
470281
470369
  return join56(configDir(), "presets");
@@ -470303,7 +470391,7 @@ function cacheAge() {
470303
470391
  if (!existsSync54(file2))
470304
470392
  return Number.POSITIVE_INFINITY;
470305
470393
  try {
470306
- return Date.now() - statSync11(file2).mtimeMs;
470394
+ return Date.now() - statSync12(file2).mtimeMs;
470307
470395
  } catch {
470308
470396
  return Number.POSITIVE_INFINITY;
470309
470397
  }
@@ -502394,7 +502482,7 @@ var init_hearth2 = __esm(() => {
502394
502482
 
502395
502483
  // src/components/settings/HearthSettings.tsx
502396
502484
  import { spawn as spawn22 } from "child_process";
502397
- import { appendFileSync as appendFileSync5, existsSync as existsSync59, readFileSync as readFileSync33, statSync as statSync12, watch as watch3 } from "fs";
502485
+ import { appendFileSync as appendFileSync5, existsSync as existsSync59, readFileSync as readFileSync33, statSync as statSync13, watch as watch3 } from "fs";
502398
502486
  import { tmpdir as tmpdir6 } from "os";
502399
502487
  import { delimiter as delimiter2, dirname as dirname25, join as join64, resolve as resolve45 } from "path";
502400
502488
  import { decodePasteBytes as decodePasteBytes6, TextAttributes as TextAttributes27 } from "@opentui/core";
@@ -505494,7 +505582,7 @@ function findSourceCheckout(startPath) {
505494
505582
  }
505495
505583
  function isExecutable(p3) {
505496
505584
  try {
505497
- const st4 = statSync12(p3);
505585
+ const st4 = statSync13(p3);
505498
505586
  if (!st4.isFile())
505499
505587
  return false;
505500
505588
  if (IS_WIN)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proxysoul/soulforge",
3
- "version": "2.20.9",
3
+ "version": "2.20.10",
4
4
  "description": "Graph-powered code intelligence — multi-agent coding with codebase-aware AI",
5
5
  "repository": {
6
6
  "type": "git",