@dreb/coding-agent 2.66.3 → 2.68.0

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 (70) hide show
  1. package/README.md +4 -2
  2. package/dist/cli/args.d.ts.map +1 -1
  3. package/dist/cli/args.js +1 -1
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/config.d.ts +12 -2
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +27 -4
  8. package/dist/config.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +5 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +16 -1
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/daily-cost-tracker.d.ts +22 -6
  14. package/dist/core/daily-cost-tracker.d.ts.map +1 -1
  15. package/dist/core/daily-cost-tracker.js +117 -47
  16. package/dist/core/daily-cost-tracker.js.map +1 -1
  17. package/dist/core/footer-data-provider.d.ts +10 -2
  18. package/dist/core/footer-data-provider.d.ts.map +1 -1
  19. package/dist/core/footer-data-provider.js +17 -1
  20. package/dist/core/footer-data-provider.js.map +1 -1
  21. package/dist/core/sdk.d.ts.map +1 -1
  22. package/dist/core/sdk.js +2 -1
  23. package/dist/core/sdk.js.map +1 -1
  24. package/dist/core/session-manager.d.ts +32 -4
  25. package/dist/core/session-manager.d.ts.map +1 -1
  26. package/dist/core/session-manager.js +234 -108
  27. package/dist/core/session-manager.js.map +1 -1
  28. package/dist/core/settings-manager.d.ts +4 -0
  29. package/dist/core/settings-manager.d.ts.map +1 -1
  30. package/dist/core/settings-manager.js +4 -0
  31. package/dist/core/settings-manager.js.map +1 -1
  32. package/dist/core/subagent-session-cost-tracker.d.ts +22 -0
  33. package/dist/core/subagent-session-cost-tracker.d.ts.map +1 -0
  34. package/dist/core/subagent-session-cost-tracker.js +94 -0
  35. package/dist/core/subagent-session-cost-tracker.js.map +1 -0
  36. package/dist/core/tools/subagent.d.ts +14 -8
  37. package/dist/core/tools/subagent.d.ts.map +1 -1
  38. package/dist/core/tools/subagent.js +145 -71
  39. package/dist/core/tools/subagent.js.map +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +1 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/main.d.ts.map +1 -1
  45. package/dist/main.js +16 -7
  46. package/dist/main.js.map +1 -1
  47. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  48. package/dist/modes/interactive/components/footer.js +8 -2
  49. package/dist/modes/interactive/components/footer.js.map +1 -1
  50. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  51. package/dist/modes/interactive/interactive-mode.js +5 -1
  52. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  53. package/dist/modes/rpc/rpc-client.d.ts +7 -2
  54. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  55. package/dist/modes/rpc/rpc-client.js +3 -2
  56. package/dist/modes/rpc/rpc-client.js.map +1 -1
  57. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  58. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  59. package/dist/modes/rpc/rpc-mode.js +34 -9
  60. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  61. package/dist/modes/rpc/rpc-types.d.ts +2 -0
  62. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  63. package/dist/modes/rpc/rpc-types.js.map +1 -1
  64. package/docs/dashboard.md +27 -15
  65. package/docs/rpc.md +9 -5
  66. package/docs/session.md +16 -7
  67. package/docs/settings.md +17 -5
  68. package/docs/skills.md +1 -1
  69. package/package.json +1 -1
  70. package/skills/model-routing-guide/SKILL.md +10 -5
@@ -22,6 +22,7 @@ import { parseModelPattern, resolveModelScopePatterns } from "../../core/model-r
22
22
  import { takeOverStdout, writeRawStdout } from "../../core/output-guard.js";
23
23
  import { SessionManager } from "../../core/session-manager.js";
24
24
  import { BUILTIN_SLASH_COMMANDS, parseBuiltinSlashCommand } from "../../core/slash-commands.js";
25
+ import { SubagentSessionCostTracker } from "../../core/subagent-session-cost-tracker.js";
25
26
  import { TabTitleGenerator } from "../../core/tab-title.js";
26
27
  import { validateThinkingLevelForModel } from "../../core/thinking.js";
27
28
  import { resolveToCwd } from "../../core/tools/path-utils.js";
@@ -247,9 +248,9 @@ export async function deleteSessionForRpc(sessionManager, sessionPath) {
247
248
  }
248
249
  return { ok: true, method: result.method };
249
250
  }
250
- /** Handle the `list_all_sessions` RPC command: list every project's sessions as RPC DTOs. */
251
- export async function listAllSessionsForRpc() {
252
- const sessions = await SessionManager.listAll();
251
+ /** Handle `list_all_sessions` using a custom flat store when one is active. */
252
+ export async function listAllSessionsForRpc(customDir) {
253
+ const sessions = customDir !== undefined ? await SessionManager.listAllFromDir(customDir) : await SessionManager.listAll();
253
254
  return sessions.map(toRpcSessionInfo);
254
255
  }
255
256
  /**
@@ -1433,7 +1434,7 @@ export async function runRpcMode(session, modelFallbackMessage) {
1433
1434
  return { id, type: "response", command, success: false, error: message };
1434
1435
  };
1435
1436
  if (session.sessionFile && session.messages.length > 0) {
1436
- const rehydratedCount = rehydrateBackgroundAgentsFromDisk(session.sessionFile);
1437
+ const rehydratedCount = rehydrateBackgroundAgentsFromDisk(session.sessionFile, session.subagentSessionDiscoveryRoots);
1437
1438
  if (rehydratedCount > 0) {
1438
1439
  console.error(`[rpc] Rehydrated ${rehydratedCount} background subagent${rehydratedCount === 1 ? "" : "s"} from disk`);
1439
1440
  }
@@ -1446,6 +1447,9 @@ export async function runRpcMode(session, modelFallbackMessage) {
1446
1447
  let shutdownRequested = false;
1447
1448
  let dailyCostTracker;
1448
1449
  let dailyCostTrackerPrimed = false;
1450
+ let subagentSessionCostTracker;
1451
+ let subagentCostGeneration = 0;
1452
+ let refreshedSubagentCostGeneration = -1;
1449
1453
  // Extension UI context uses the RPC protocol; built by a module-scope
1450
1454
  // factory so the dialog round trip is unit-testable (see createRpcExtensionUIContext).
1451
1455
  const createExtensionUIContext = () => createRpcExtensionUIContext(output, pendingExtensionRequests, () => void session.abort());
@@ -1487,13 +1491,13 @@ export async function runRpcMode(session, modelFallbackMessage) {
1487
1491
  output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
1488
1492
  },
1489
1493
  });
1490
- const getDailyCost = async () => {
1494
+ const getDailyCostBreakdown = async () => {
1491
1495
  dailyCostTracker ??= new DailyCostTracker();
1492
1496
  if (!dailyCostTrackerPrimed) {
1493
1497
  await dailyCostTracker.refresh();
1494
1498
  dailyCostTrackerPrimed = true;
1495
1499
  }
1496
- return dailyCostTracker.getDailyCost();
1500
+ return dailyCostTracker.getDailyCostBreakdown();
1497
1501
  };
1498
1502
  const cwd = session.cwd;
1499
1503
  const tabTitleSettings = session.settingsManager.getTabTitleSettings();
@@ -1533,6 +1537,10 @@ export async function runRpcMode(session, modelFallbackMessage) {
1533
1537
  const dashboardEventProjector = session.uiType === "dashboard" ? createDashboardRpcEventProjector() : undefined;
1534
1538
  // Output all agent events as JSON
1535
1539
  session.subscribe((event) => {
1540
+ if (event.type === "background_agent_end") {
1541
+ // Force the next stats request to await a fresh per-session cost scan.
1542
+ subagentCostGeneration++;
1543
+ }
1536
1544
  if (tabTitleGenerator && !session.sessionName) {
1537
1545
  if (event.type === "tool_execution_end") {
1538
1546
  tabTitleGenerator.onToolEnd({
@@ -1650,7 +1658,12 @@ export async function runRpcMode(session, modelFallbackMessage) {
1650
1658
  return success(id, "get_git_branch", { branch: getGitBranch(session.cwd) });
1651
1659
  }
1652
1660
  case "get_daily_cost": {
1653
- return success(id, "get_daily_cost", { cost: await getDailyCost() });
1661
+ const breakdown = await getDailyCostBreakdown();
1662
+ return success(id, "get_daily_cost", {
1663
+ cost: breakdown.total,
1664
+ main: breakdown.main,
1665
+ subagent: breakdown.subagent,
1666
+ });
1654
1667
  }
1655
1668
  // =================================================================
1656
1669
  // Model
@@ -1791,8 +1804,17 @@ export async function runRpcMode(session, modelFallbackMessage) {
1791
1804
  // Session
1792
1805
  // =================================================================
1793
1806
  case "get_session_stats": {
1807
+ subagentSessionCostTracker ??= new SubagentSessionCostTracker();
1808
+ if (refreshedSubagentCostGeneration !== subagentCostGeneration) {
1809
+ const refreshGeneration = subagentCostGeneration;
1810
+ await subagentSessionCostTracker.refresh();
1811
+ refreshedSubagentCostGeneration = refreshGeneration;
1812
+ }
1794
1813
  const stats = session.getSessionStats();
1795
- return success(id, "get_session_stats", stats);
1814
+ return success(id, "get_session_stats", {
1815
+ ...stats,
1816
+ subagentCost: subagentSessionCostTracker.getCost(),
1817
+ });
1796
1818
  }
1797
1819
  case "get_performance_stats": {
1798
1820
  return success(id, "get_performance_stats", getPerformanceStatsData(session));
@@ -1874,7 +1896,9 @@ export async function runRpcMode(session, modelFallbackMessage) {
1874
1896
  return success(id, "list_sessions", { sessions: sessions.map(toRpcSessionInfo) });
1875
1897
  }
1876
1898
  case "list_all_sessions": {
1877
- return success(id, "list_all_sessions", { sessions: await listAllSessionsForRpc() });
1899
+ return success(id, "list_all_sessions", {
1900
+ sessions: await listAllSessionsForRpc(session.sessionManager.getCustomSessionInventoryRoot()),
1901
+ });
1878
1902
  }
1879
1903
  // =================================================================
1880
1904
  // Background agents
@@ -1966,6 +1990,7 @@ export async function runRpcMode(session, modelFallbackMessage) {
1966
1990
  await currentRunner.emit({ type: "session_shutdown" });
1967
1991
  }
1968
1992
  dailyCostTracker?.dispose();
1993
+ subagentSessionCostTracker?.dispose();
1969
1994
  detachInput();
1970
1995
  process.stdin.pause();
1971
1996
  process.exit(0);