@proxysoul/soulforge 2.15.6 → 2.15.7

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.
@@ -30964,6 +30964,50 @@ var init_errors4 = __esm(() => {
30964
30964
  })));
30965
30965
  });
30966
30966
 
30967
+ // src/stores/model-events.ts
30968
+ function recordModelCall(event) {
30969
+ try {
30970
+ const s = useModelEventsStore.getState();
30971
+ if (!s.enabled)
30972
+ return;
30973
+ s.push(event);
30974
+ } catch {}
30975
+ }
30976
+ var MAX_EVENTS = 500, useModelEventsStore;
30977
+ var init_model_events = __esm(() => {
30978
+ init_esm();
30979
+ init_middleware();
30980
+ useModelEventsStore = create()(subscribeWithSelector((set2, get) => ({
30981
+ enabled: false,
30982
+ events: [],
30983
+ setEnabled: (v) => set2(v ? {
30984
+ enabled: true
30985
+ } : {
30986
+ enabled: false,
30987
+ events: []
30988
+ }),
30989
+ push: (event) => {
30990
+ if (!get().enabled)
30991
+ return null;
30992
+ const id = event.id ?? crypto.randomUUID();
30993
+ const full = {
30994
+ ...event,
30995
+ id
30996
+ };
30997
+ set2((s) => {
30998
+ const events = s.events.length >= MAX_EVENTS ? [...s.events.slice(-(MAX_EVENTS - 1)), full] : [...s.events, full];
30999
+ return {
31000
+ events
31001
+ };
31002
+ });
31003
+ return id;
31004
+ },
31005
+ clear: () => set2({
31006
+ events: []
31007
+ })
31008
+ })));
31009
+ });
31010
+
30967
31011
  // src/utils/errors.ts
30968
31012
  function toErrorMessage(err) {
30969
31013
  return err instanceof Error ? err.message : String(err);
@@ -30990,7 +31034,8 @@ function keychainGet(key) {
30990
31034
  if (process.platform === "darwin") {
30991
31035
  const result = spawnSync("security", ["find-generic-password", "-a", KEYCHAIN_SERVICE, "-s", key, "-w"], {
30992
31036
  timeout: 5000,
30993
- encoding: "utf-8"
31037
+ encoding: "utf-8",
31038
+ stdio: ["ignore", "pipe", "ignore"]
30994
31039
  });
30995
31040
  if (result.status === 0 && result.stdout) {
30996
31041
  return result.stdout.trim();
@@ -31000,7 +31045,8 @@ function keychainGet(key) {
31000
31045
  if (process.platform === "linux") {
31001
31046
  const result = spawnSync("secret-tool", ["lookup", "service", KEYCHAIN_SERVICE, "key", key], {
31002
31047
  timeout: 5000,
31003
- encoding: "utf-8"
31048
+ encoding: "utf-8",
31049
+ stdio: ["ignore", "pipe", "ignore"]
31004
31050
  });
31005
31051
  if (result.status === 0 && result.stdout) {
31006
31052
  return result.stdout.trim();
@@ -31052,8 +31098,9 @@ function getProviderApiKey(envVar, priority = _defaultPriority) {
31052
31098
  }
31053
31099
  return getEnv() ?? getApp();
31054
31100
  }
31055
- var SECRETS_DIR, SECRETS_FILE, KEYCHAIN_SERVICE = "soulforge", _defaultPriority = "env", STATIC_SECRETS, ENV_MAP, ENV_TO_SECRET;
31101
+ var _keychainHasCache, SECRETS_DIR, SECRETS_FILE, KEYCHAIN_SERVICE = "soulforge", _defaultPriority = "env", STATIC_SECRETS, ENV_MAP, ENV_TO_SECRET;
31056
31102
  var init_secrets = __esm(() => {
31103
+ _keychainHasCache = new Map;
31057
31104
  SECRETS_DIR = join3(homedir2(), ".soulforge");
31058
31105
  SECRETS_FILE = join3(SECRETS_DIR, "secrets.json");
31059
31106
  STATIC_SECRETS = {
@@ -42556,6 +42603,7 @@ var init_ui = __esm(() => {
42556
42603
  hearthSettings: false,
42557
42604
  tabNamePopup: false,
42558
42605
  memoryBrowser: false,
42606
+ modelEvents: false,
42559
42607
  uiDemo: false
42560
42608
  };
42561
42609
  useUIStore = create()(subscribeWithSelector((set2) => ({
@@ -42563,6 +42611,7 @@ var init_ui = __esm(() => {
42563
42611
  ...INITIAL_MODALS
42564
42612
  },
42565
42613
  routerSlotPicking: null,
42614
+ fallbackForModel: null,
42566
42615
  commandPickerConfig: null,
42567
42616
  infoPopupConfig: null,
42568
42617
  statusDashboardTab: "Context",
@@ -42599,6 +42648,9 @@ var init_ui = __esm(() => {
42599
42648
  setRouterSlotPicking: (slot) => set2({
42600
42649
  routerSlotPicking: slot
42601
42650
  }),
42651
+ setFallbackForModel: (modelId) => set2({
42652
+ fallbackForModel: modelId
42653
+ }),
42602
42654
  openCommandPicker: (config2) => set2(() => ({
42603
42655
  commandPickerConfig: config2,
42604
42656
  modals: {
@@ -50459,7 +50511,7 @@ var package_default;
50459
50511
  var init_package = __esm(() => {
50460
50512
  package_default = {
50461
50513
  name: "@proxysoul/soulforge",
50462
- version: "2.15.6",
50514
+ version: "2.15.7",
50463
50515
  description: "Graph-powered code intelligence \u2014 multi-agent coding with codebase-aware AI",
50464
50516
  repository: {
50465
50517
  type: "git",
@@ -81683,6 +81735,8 @@ async function buildV2Summary(opts) {
81683
81735
  }
81684
81736
  let gapFill;
81685
81737
  let llmUsage;
81738
+ const v2StartedAt = Date.now();
81739
+ const v2ModelId = getModelId(model);
81686
81740
  try {
81687
81741
  const genResult = await generateText({
81688
81742
  model,
@@ -81714,8 +81768,27 @@ async function buildV2Summary(opts) {
81714
81768
  cacheWriteTokens: details?.cacheWriteTokens ?? 0
81715
81769
  };
81716
81770
  }
81771
+ recordModelCall({
81772
+ modelId: v2ModelId,
81773
+ source: "compaction",
81774
+ startedAt: v2StartedAt,
81775
+ durationMs: Math.max(0, Date.now() - v2StartedAt),
81776
+ state: "ok",
81777
+ input: llmUsage?.inputTokens ?? 0,
81778
+ output: llmUsage?.outputTokens ?? 0,
81779
+ cacheRead: llmUsage?.cacheReadTokens ?? 0,
81780
+ cacheWrite: llmUsage?.cacheWriteTokens ?? 0
81781
+ });
81717
81782
  } catch (err) {
81718
81783
  logBackgroundError("compaction-summarize", err instanceof Error ? err.message : String(err));
81784
+ recordModelCall({
81785
+ modelId: v2ModelId,
81786
+ source: "compaction",
81787
+ startedAt: v2StartedAt,
81788
+ durationMs: Math.max(0, Date.now() - v2StartedAt),
81789
+ state: "error",
81790
+ errorMessage: (err instanceof Error ? err.message : String(err)).slice(0, 500)
81791
+ });
81719
81792
  return {
81720
81793
  summary: structuredState
81721
81794
  };
@@ -81780,6 +81853,7 @@ function messageTextFull(msg) {
81780
81853
  var init_summarize = __esm(() => {
81781
81854
  init_dist5();
81782
81855
  init_errors4();
81856
+ init_model_events();
81783
81857
  init_provider_options();
81784
81858
  });
81785
81859
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proxysoul/soulforge",
3
- "version": "2.15.6",
3
+ "version": "2.15.7",
4
4
  "description": "Graph-powered code intelligence — multi-agent coding with codebase-aware AI",
5
5
  "repository": {
6
6
  "type": "git",