@slkiser/opencode-quota 1.4.4 → 2.1.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 (75) hide show
  1. package/README.md +54 -19
  2. package/dist/lib/config.d.ts.map +1 -1
  3. package/dist/lib/config.js +2 -0
  4. package/dist/lib/config.js.map +1 -1
  5. package/dist/lib/copilot.d.ts.map +1 -1
  6. package/dist/lib/copilot.js +105 -18
  7. package/dist/lib/copilot.js.map +1 -1
  8. package/dist/lib/entries.d.ts +23 -3
  9. package/dist/lib/entries.d.ts.map +1 -1
  10. package/dist/lib/entries.js +6 -1
  11. package/dist/lib/entries.js.map +1 -1
  12. package/dist/lib/firmware.d.ts +2 -17
  13. package/dist/lib/firmware.d.ts.map +1 -1
  14. package/dist/lib/firmware.js +12 -80
  15. package/dist/lib/firmware.js.map +1 -1
  16. package/dist/lib/format-utils.d.ts +1 -0
  17. package/dist/lib/format-utils.d.ts.map +1 -1
  18. package/dist/lib/format-utils.js +5 -0
  19. package/dist/lib/format-utils.js.map +1 -1
  20. package/dist/lib/format.d.ts.map +1 -1
  21. package/dist/lib/format.js +34 -2
  22. package/dist/lib/format.js.map +1 -1
  23. package/dist/lib/modelsdev-pricing.d.ts +6 -0
  24. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  25. package/dist/lib/modelsdev-pricing.js +35 -0
  26. package/dist/lib/modelsdev-pricing.js.map +1 -1
  27. package/dist/lib/opencode-auth.d.ts +9 -0
  28. package/dist/lib/opencode-auth.d.ts.map +1 -1
  29. package/dist/lib/opencode-auth.js +38 -0
  30. package/dist/lib/opencode-auth.js.map +1 -1
  31. package/dist/lib/opencode-sqlite.d.ts +7 -0
  32. package/dist/lib/opencode-sqlite.d.ts.map +1 -0
  33. package/dist/lib/opencode-sqlite.js +44 -0
  34. package/dist/lib/opencode-sqlite.js.map +1 -0
  35. package/dist/lib/opencode-storage.d.ts +14 -18
  36. package/dist/lib/opencode-storage.d.ts.map +1 -1
  37. package/dist/lib/opencode-storage.js +183 -134
  38. package/dist/lib/opencode-storage.js.map +1 -1
  39. package/dist/lib/quota-command-format.d.ts.map +1 -1
  40. package/dist/lib/quota-command-format.js +6 -1
  41. package/dist/lib/quota-command-format.js.map +1 -1
  42. package/dist/lib/quota-stats-format.d.ts.map +1 -1
  43. package/dist/lib/quota-stats-format.js +77 -22
  44. package/dist/lib/quota-stats-format.js.map +1 -1
  45. package/dist/lib/quota-stats.d.ts +14 -0
  46. package/dist/lib/quota-stats.d.ts.map +1 -1
  47. package/dist/lib/quota-stats.js +80 -1
  48. package/dist/lib/quota-stats.js.map +1 -1
  49. package/dist/lib/quota-status.d.ts.map +1 -1
  50. package/dist/lib/quota-status.js +180 -29
  51. package/dist/lib/quota-status.js.map +1 -1
  52. package/dist/lib/qwen-local-quota.d.ts +35 -0
  53. package/dist/lib/qwen-local-quota.d.ts.map +1 -0
  54. package/dist/lib/qwen-local-quota.js +162 -0
  55. package/dist/lib/qwen-local-quota.js.map +1 -0
  56. package/dist/lib/toast-format-grouped.d.ts.map +1 -1
  57. package/dist/lib/toast-format-grouped.js +31 -1
  58. package/dist/lib/toast-format-grouped.js.map +1 -1
  59. package/dist/lib/types.d.ts +8 -2
  60. package/dist/lib/types.d.ts.map +1 -1
  61. package/dist/lib/types.js.map +1 -1
  62. package/dist/plugin.d.ts.map +1 -1
  63. package/dist/plugin.js +163 -89
  64. package/dist/plugin.js.map +1 -1
  65. package/dist/providers/firmware.d.ts.map +1 -1
  66. package/dist/providers/firmware.js +10 -40
  67. package/dist/providers/firmware.js.map +1 -1
  68. package/dist/providers/qwen-code.d.ts +3 -0
  69. package/dist/providers/qwen-code.d.ts.map +1 -0
  70. package/dist/providers/qwen-code.js +66 -0
  71. package/dist/providers/qwen-code.js.map +1 -0
  72. package/dist/providers/registry.d.ts.map +1 -1
  73. package/dist/providers/registry.js +2 -0
  74. package/dist/providers/registry.js.map +1 -1
  75. package/package.json +1 -1
@@ -5,7 +5,6 @@
5
5
  * and queries: https://app.firmware.ai/api/v1/quota
6
6
  */
7
7
  import { fetchWithTimeout } from "./http.js";
8
- import { clampPercent } from "./format-utils.js";
9
8
  import { resolveFirmwareApiKey, hasFirmwareApiKey, } from "./firmware-config.js";
10
9
  /**
11
10
  * Strip control characters (ANSI escapes, etc.) from error text
@@ -23,7 +22,6 @@ async function readFirmwareAuth() {
23
22
  return { type: "api", key: result.key, source: result.source };
24
23
  }
25
24
  const FIRMWARE_QUOTA_URL = "https://app.firmware.ai/api/v1/quota";
26
- const FIRMWARE_RESET_WINDOW_URL = "https://app.firmware.ai/api/v1/quota/reset-window";
27
25
  export async function hasFirmwareApiKeyConfigured() {
28
26
  return await hasFirmwareApiKey();
29
27
  }
@@ -48,43 +46,15 @@ export async function queryFirmwareQuota() {
48
46
  };
49
47
  }
50
48
  const data = (await resp.json());
51
- // Parse 5-hour window
52
- const windowUsed = typeof data.windowUsed === "number" ? data.windowUsed : NaN;
53
- const windowPercentRemaining = clampPercent(100 - windowUsed * 100);
54
- const windowResetIso = typeof data.windowReset === "string" && data.windowReset.length > 0
55
- ? data.windowReset
56
- : undefined;
57
- // Parse weekly
58
- const weeklyUsed = typeof data.weeklyUsed === "number" ? data.weeklyUsed : NaN;
59
- const weeklyPercentRemaining = clampPercent(100 - weeklyUsed * 100);
60
- const weeklyResetIso = typeof data.weeklyReset === "string" && data.weeklyReset.length > 0
61
- ? data.weeklyReset
62
- : undefined;
63
- // Parse resets remaining (use trunc to avoid surprising rounding)
64
- const windowResetsRemaining = typeof data.windowResetsRemaining === "number"
65
- ? Math.max(0, Math.min(2, Math.trunc(data.windowResetsRemaining)))
66
- : 0;
67
- // Back-compat: use worst window for classic display
68
- const windowQuota = {
69
- percentRemaining: windowPercentRemaining,
70
- resetTimeIso: windowResetIso,
71
- };
72
- const weeklyQuota = {
73
- percentRemaining: weeklyPercentRemaining,
74
- resetTimeIso: weeklyResetIso,
75
- };
76
- // Worst window for classic mode
77
- const isWindowWorse = windowPercentRemaining <= weeklyPercentRemaining;
78
- const worst = isWindowWorse ? windowQuota : weeklyQuota;
49
+ const creditsUsd = typeof data.credits === "number" ? data.credits : NaN;
50
+ const resetTimeIso = typeof data.reset === "string" && data.reset.length > 0 ? data.reset : undefined;
51
+ if (!Number.isFinite(creditsUsd)) {
52
+ return { success: false, error: "Firmware API response missing credits" };
53
+ }
79
54
  return {
80
55
  success: true,
81
- percentRemaining: worst.percentRemaining,
82
- resetTimeIso: worst.resetTimeIso,
83
- windows: {
84
- window: windowQuota,
85
- weekly: weeklyQuota,
86
- },
87
- windowResetsRemaining,
56
+ creditsUsd,
57
+ resetTimeIso,
88
58
  };
89
59
  }
90
60
  catch (err) {
@@ -95,53 +65,15 @@ export async function queryFirmwareQuota() {
95
65
  }
96
66
  }
97
67
  /**
98
- * Manually reset the 5-hour spending window.
99
- * Consumes one of the 2 weekly resets available.
68
+ * Deprecated: Firmware no longer documents a reset-window endpoint.
100
69
  */
101
70
  export async function resetFirmwareQuotaWindow() {
102
71
  const auth = await readFirmwareAuth();
103
72
  if (!auth)
104
73
  return null;
105
- try {
106
- const resp = await fetchWithTimeout(FIRMWARE_RESET_WINDOW_URL, {
107
- method: "POST",
108
- headers: {
109
- Authorization: `Bearer ${auth.key}`,
110
- "User-Agent": "OpenCode-Quota-Toast/1.0",
111
- },
112
- });
113
- if (!resp.ok) {
114
- const text = await resp.text();
115
- // Try to parse error JSON for better message
116
- try {
117
- const errorData = JSON.parse(text);
118
- if (errorData.message) {
119
- return {
120
- success: false,
121
- error: sanitizeErrorText(errorData.message),
122
- };
123
- }
124
- }
125
- catch {
126
- // Not JSON, use raw text
127
- }
128
- return {
129
- success: false,
130
- error: `Firmware API error ${resp.status}: ${sanitizeErrorText(text.slice(0, 120))}`,
131
- };
132
- }
133
- // Parse success response
134
- const data = (await resp.json());
135
- return {
136
- success: true,
137
- windowResetsRemaining: typeof data.windowResetsRemaining === "number" ? data.windowResetsRemaining : undefined,
138
- };
139
- }
140
- catch (err) {
141
- return {
142
- success: false,
143
- error: err instanceof Error ? err.message : String(err),
144
- };
145
- }
74
+ return {
75
+ success: false,
76
+ error: "Deprecated: Firmware reset-window is no longer supported by the API.",
77
+ };
146
78
  }
147
79
  //# sourceMappingURL=firmware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"firmware.js","sourceRoot":"","sources":["../../src/lib/firmware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firmware.js","sourceRoot":"","sources":["../../src/lib/firmware.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,7 @@ export declare function formatTokenCount(count: number): string;
42
42
  *
43
43
  * Removes common prefixes/suffixes before truncating with ellipsis.
44
44
  */
45
+ export declare function fmtUsdAmount(n: number): string;
45
46
  export declare function shortenModelName(name: string, maxLen: number): string;
46
47
  export interface FormatResetCountdownOptions {
47
48
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"format-utils.d.ts","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,2BAA2B,GAAG,MAAM,CAc7F"}
1
+ {"version":3,"file":"format-utils.d.ts","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,2BAA2B,GAAG,MAAM,CAc7F"}
@@ -72,6 +72,11 @@ export function formatTokenCount(count) {
72
72
  *
73
73
  * Removes common prefixes/suffixes before truncating with ellipsis.
74
74
  */
75
+ export function fmtUsdAmount(n) {
76
+ if (!Number.isFinite(n))
77
+ return "$0.00";
78
+ return `$${n.toFixed(2)}`;
79
+ }
75
80
  export function shortenModelName(name, maxLen) {
76
81
  if (name.length <= maxLen)
77
82
  return name;
@@ -1 +1 @@
1
- {"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../../src/lib/format-utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAKxF,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,GAAG,MAAM,CAgFT"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMxF,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,GAAG,MAAM,CAsHT"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Formatting helpers for quota toast output
3
3
  */
4
+ import { isValueEntry } from "./entries.js";
4
5
  import { bar, clampInt, formatResetCountdown, padLeft, padRight } from "./format-utils.js";
5
6
  import { formatQuotaRowsGrouped } from "./toast-format-grouped.js";
6
7
  import { renderSessionTokensLines } from "./session-tokens-format.js";
@@ -29,7 +30,7 @@ export function formatQuotaRows(params) {
29
30
  // Line 2 (bar + percent) spans barWidth + separator + percentCol
30
31
  const barWidth = Math.max(10, maxWidth - separator.length - percentCol);
31
32
  const lines = [];
32
- const addEntry = (name, resetIso, remaining) => {
33
+ const addPercentEntry = (name, resetIso, remaining) => {
33
34
  // Show reset countdown whenever quota is not fully available.
34
35
  // (i.e., any usage at all, or depleted)
35
36
  const timeStr = remaining < 100 ? formatResetCountdown(resetIso, { missing: "-" }) : "";
@@ -56,8 +57,39 @@ export function formatQuotaRows(params) {
56
57
  const barLine = [barCell, percentCell].join(separator);
57
58
  lines.push(barLine);
58
59
  };
60
+ const addValueEntry = (name, resetIso, value) => {
61
+ const timeStr = formatResetCountdown(resetIso, { missing: "-" });
62
+ if (isTiny) {
63
+ // Tiny: single line without percent; keep time col alignment.
64
+ const valueCol = Math.min(value.length, Math.max(6, percentCol + 2));
65
+ const tinyNameCol = maxWidth - separator.length - timeCol - separator.length - valueCol;
66
+ const nameCol = Math.max(1, tinyNameCol);
67
+ const line = [
68
+ padRight(name, nameCol),
69
+ padLeft(timeStr, timeCol),
70
+ padLeft(value, valueCol),
71
+ ].join(separator);
72
+ lines.push(line.slice(0, maxWidth));
73
+ return;
74
+ }
75
+ const right = value;
76
+ const rightWidth = Math.max(right.length, 6);
77
+ const timeWidth = Math.max(timeStr.length, timeCol);
78
+ const leftWidth = Math.max(1, maxWidth - separator.length - rightWidth - separator.length - timeWidth);
79
+ const line = padRight(name, leftWidth) +
80
+ separator +
81
+ padLeft(right, rightWidth) +
82
+ separator +
83
+ padLeft(timeStr, timeWidth);
84
+ lines.push(line.slice(0, maxWidth));
85
+ };
59
86
  for (const entry of params.entries ?? []) {
60
- addEntry(entry.name, entry.resetTimeIso, entry.percentRemaining);
87
+ if (isValueEntry(entry)) {
88
+ addValueEntry(entry.name, entry.resetTimeIso, entry.value);
89
+ }
90
+ else {
91
+ addPercentEntry(entry.name, entry.resetTimeIso, entry.percentRemaining);
92
+ }
61
93
  }
62
94
  // Add error rows (rendered as "label: message")
63
95
  for (const err of params.errors ?? []) {
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,12 @@ type Snapshot = {
16
16
  };
17
17
  export declare function getPricingSnapshotMeta(): Snapshot["_meta"];
18
18
  export declare function hasProvider(providerId: string): boolean;
19
+ export declare function hasModel(providerId: string, modelId: string): boolean;
20
+ /**
21
+ * Infer the snapshot provider that owns a modelId.
22
+ * Returns null when model is not found or is ambiguous across providers.
23
+ */
24
+ export declare function inferProviderForModelId(modelId: string): string | null;
19
25
  export declare function getProviderModelCount(providerId: string): number;
20
26
  export declare function listProviders(): string[];
21
27
  export declare function lookupCost(providerId: string, modelId: string): CostBuckets | null;
@@ -1 +1 @@
1
- {"version":3,"file":"modelsdev-pricing.d.ts","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CACxD,CAAC;AAYF,wBAAgB,sBAAsB,IAAI,QAAQ,CAAC,OAAO,CAAC,CAE1D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMlF"}
1
+ {"version":3,"file":"modelsdev-pricing.d.ts","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CACxD,CAAC;AA+BF,wBAAgB,sBAAsB,IAAI,QAAQ,CAAC,OAAO,CAAC,CAE1D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAItE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMlF"}
@@ -1,5 +1,6 @@
1
1
  import { readFileSync } from "fs";
2
2
  let SNAPSHOT = null;
3
+ let MODEL_INDEX = null;
3
4
  function ensureLoaded() {
4
5
  if (SNAPSHOT)
5
6
  return SNAPSHOT;
@@ -8,12 +9,46 @@ function ensureLoaded() {
8
9
  SNAPSHOT = JSON.parse(raw);
9
10
  return SNAPSHOT;
10
11
  }
12
+ function ensureModelIndex() {
13
+ if (MODEL_INDEX)
14
+ return MODEL_INDEX;
15
+ const snap = ensureLoaded();
16
+ const idx = new Map();
17
+ for (const providerId of Object.keys(snap.providers)) {
18
+ const models = snap.providers[providerId] ?? {};
19
+ for (const modelId of Object.keys(models)) {
20
+ const existing = idx.get(modelId);
21
+ if (existing)
22
+ existing.push(providerId);
23
+ else
24
+ idx.set(modelId, [providerId]);
25
+ }
26
+ }
27
+ MODEL_INDEX = idx;
28
+ return idx;
29
+ }
11
30
  export function getPricingSnapshotMeta() {
12
31
  return ensureLoaded()._meta;
13
32
  }
14
33
  export function hasProvider(providerId) {
15
34
  return !!ensureLoaded().providers[providerId];
16
35
  }
36
+ export function hasModel(providerId, modelId) {
37
+ const p = ensureLoaded().providers[providerId];
38
+ if (!p)
39
+ return false;
40
+ return !!p[modelId];
41
+ }
42
+ /**
43
+ * Infer the snapshot provider that owns a modelId.
44
+ * Returns null when model is not found or is ambiguous across providers.
45
+ */
46
+ export function inferProviderForModelId(modelId) {
47
+ const providers = ensureModelIndex().get(modelId);
48
+ if (!providers || providers.length !== 1)
49
+ return null;
50
+ return providers[0] ?? null;
51
+ }
17
52
  export function getProviderModelCount(providerId) {
18
53
  return Object.keys(ensureLoaded().providers[providerId] || {}).length;
19
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"modelsdev-pricing.js","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAoBlC,IAAI,QAAQ,GAAoB,IAAI,CAAC;AAErC,SAAS,YAAY;IACnB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;IACvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,YAAY,EAAE,CAAC,KAAK,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,OAAe;IAC5D,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"modelsdev-pricing.js","sourceRoot":"","sources":["../../src/lib/modelsdev-pricing.ts"],"names":[],"mappings":"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"}
@@ -15,4 +15,13 @@ export declare function getAuthPaths(): string[];
15
15
  /** Returns OpenCode's primary auth.json path (for display/logging) */
16
16
  export declare function getAuthPath(): string;
17
17
  export declare function readAuthFile(): Promise<AuthData | null>;
18
+ /**
19
+ * Cached auth reader for frequently triggered code paths (e.g. per-question hooks).
20
+ * This avoids repeated filesystem reads while keeping auth updates visible quickly.
21
+ */
22
+ export declare function readAuthFileCached(params?: {
23
+ maxAgeMs?: number;
24
+ }): Promise<AuthData | null>;
25
+ /** Test helper to clear cached auth state between test cases. */
26
+ export declare function clearReadAuthFileCacheForTests(): void;
18
27
  //# sourceMappingURL=opencode-auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-auth.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAMvC;AAED,sEAAsE;AACtE,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAa7D"}
1
+ {"version":3,"file":"opencode-auth.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAY3C;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAMvC;AAED,sEAAsE;AACtE,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAa7D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA+BjG;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
@@ -8,6 +8,8 @@
8
8
  import { readFile } from "fs/promises";
9
9
  import { join } from "path";
10
10
  import { getOpencodeRuntimeDirCandidates, getOpencodeRuntimeDirs } from "./opencode-runtime-paths.js";
11
+ const DEFAULT_AUTH_CACHE_MAX_AGE_MS = 5_000;
12
+ let authCache = null;
11
13
  /**
12
14
  * Get candidate auth.json paths in priority order.
13
15
  * Some OpenCode installations use Linux-style paths even on macOS,
@@ -37,4 +39,40 @@ export async function readAuthFile() {
37
39
  }
38
40
  return null;
39
41
  }
42
+ /**
43
+ * Cached auth reader for frequently triggered code paths (e.g. per-question hooks).
44
+ * This avoids repeated filesystem reads while keeping auth updates visible quickly.
45
+ */
46
+ export async function readAuthFileCached(params) {
47
+ const maxAgeMs = Math.max(0, params?.maxAgeMs ?? DEFAULT_AUTH_CACHE_MAX_AGE_MS);
48
+ const now = Date.now();
49
+ if (authCache && now - authCache.timestamp <= maxAgeMs) {
50
+ return authCache.value;
51
+ }
52
+ if (authCache?.inFlight) {
53
+ return authCache.inFlight;
54
+ }
55
+ const inFlight = (async () => {
56
+ const value = await readAuthFile();
57
+ authCache = { timestamp: Date.now(), value };
58
+ return value;
59
+ })();
60
+ authCache = {
61
+ timestamp: authCache?.timestamp ?? 0,
62
+ value: authCache?.value ?? null,
63
+ inFlight,
64
+ };
65
+ try {
66
+ return await inFlight;
67
+ }
68
+ finally {
69
+ if (authCache?.inFlight === inFlight) {
70
+ authCache.inFlight = undefined;
71
+ }
72
+ }
73
+ }
74
+ /** Test helper to clear cached auth state between test cases. */
75
+ export function clearReadAuthFileCacheForTests() {
76
+ authCache = null;
77
+ }
40
78
  //# sourceMappingURL=opencode-auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-auth.js","sourceRoot":"","sources":["../../src/lib/opencode-auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAItG;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,2DAA2D;IAC3D,+EAA+E;IAC/E,yDAAyD;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,+BAA+B,EAAE,CAAC;IACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"opencode-auth.js","sourceRoot":"","sources":["../../src/lib/opencode-auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAItG,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAQ5C,IAAI,SAAS,GAA0B,IAAI,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,2DAA2D;IAC3D,+EAA+E;IAC/E,yDAAyD;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,+BAA+B,EAAE,CAAC;IACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA8B;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,IAAI,6BAA6B,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,IAAI,SAAS,IAAI,GAAG,GAAG,SAAS,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;QACnC,SAAS,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,EAAE,CAAC;IAEL,SAAS,GAAG;QACV,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,CAAC;QACpC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI;QAC/B,QAAQ;KACT,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,IAAI,SAAS,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrC,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC;QACjC,CAAC;IACH,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,8BAA8B;IAC5C,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface SqliteConn {
2
+ all<T = unknown>(sql: string, params?: unknown[]): T[];
3
+ get<T = unknown>(sql: string, params?: unknown[]): T | null;
4
+ close(): void;
5
+ }
6
+ export declare function openOpenCodeSqliteReadOnly(dbPath: string): Promise<SqliteConn>;
7
+ //# sourceMappingURL=opencode-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-sqlite.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-sqlite.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IACvD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,IAAI,IAAI,CAAC;CACf;AAMD,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAyCpF"}
@@ -0,0 +1,44 @@
1
+ function toParams(params) {
2
+ return Array.isArray(params) ? params : [];
3
+ }
4
+ export async function openOpenCodeSqliteReadOnly(dbPath) {
5
+ const mod = await import("bun:sqlite");
6
+ const Database = mod.Database;
7
+ const db = new Database(dbPath, { readonly: true });
8
+ // Keep reads deterministic and avoid accidental writes.
9
+ try {
10
+ db.query("PRAGMA query_only = ON;").run();
11
+ }
12
+ catch {
13
+ // ignore
14
+ }
15
+ // Avoid transient SQLITE_BUSY errors (WAL).
16
+ try {
17
+ db.query("PRAGMA busy_timeout = 5000;").run();
18
+ }
19
+ catch {
20
+ // ignore
21
+ }
22
+ return {
23
+ all(sql, params) {
24
+ const stmt = db.query(sql);
25
+ const p = toParams(params);
26
+ return (p.length ? stmt.all(...p) : stmt.all());
27
+ },
28
+ get(sql, params) {
29
+ const stmt = db.query(sql);
30
+ const p = toParams(params);
31
+ const row = (p.length ? stmt.get(...p) : stmt.get());
32
+ return row ?? null;
33
+ },
34
+ close() {
35
+ try {
36
+ db.close();
37
+ }
38
+ catch {
39
+ // ignore
40
+ }
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=opencode-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-sqlite.js","sourceRoot":"","sources":["../../src/lib/opencode-sqlite.ts"],"names":[],"mappings":"AAMA,SAAS,QAAQ,CAAC,MAAkB;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,MAAc;IAC7D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAI,GAAW,CAAC,QAAe,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,wDAAwD;IACxD,IAAI,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,OAAO;QACL,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAQ,CAAC;QACzD,CAAC;QAED,GAAG,CAAc,GAAW,EAAE,MAAkB;YAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAkB,CAAC;YACtE,OAAO,GAAG,IAAI,IAAI,CAAC;QACrB,CAAC;QAED,KAAK;YACH,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,8 +1,10 @@
1
1
  /**
2
- * Error thrown when a session directory is not found.
2
+ * Error thrown when a session is not found.
3
3
  *
4
- * This is thrown by iterAssistantMessagesForSession when the session
5
- * directory doesn't exist. Callers should catch this to handle gracefully.
4
+ * With OpenCode >=1.2, sessions/messages live in SQLite (`opencode.db`).
5
+ * This is thrown by iterAssistantMessagesForSession when the database is
6
+ * missing/unreadable, the session id is invalid, or the session row does
7
+ * not exist.
6
8
  */
7
9
  export declare class SessionNotFoundError extends Error {
8
10
  readonly sessionID: string;
@@ -43,29 +45,23 @@ export interface OpenCodeSessionInfo {
43
45
  updated?: number;
44
46
  };
45
47
  }
48
+ export type OpenCodeDbStats = {
49
+ dbPath: string;
50
+ sessionCount: number;
51
+ messageCount: number;
52
+ assistantMessageCount: number;
53
+ };
46
54
  export declare function getOpenCodeDataDirCandidates(): string[];
47
55
  export declare function getOpenCodeDataDir(): string;
48
- export declare function getOpenCodeStorageDirCandidates(): string[];
49
- export declare function getOpenCodeStorageDir(): string;
50
- export declare function getOpenCodeMessageDirCandidates(): string[];
51
- export declare function getOpenCodeMessageDir(): string;
52
- export declare function getOpenCodeSessionDirCandidates(): string[];
53
- export declare function getOpenCodeSessionDir(): string;
54
- export declare function listSessionIDsFromMessageStorage(): Promise<string[]>;
56
+ export declare function getOpenCodeDbPathCandidates(): string[];
57
+ export declare function getOpenCodeDbPath(): string;
58
+ export declare function getOpenCodeDbStats(): Promise<OpenCodeDbStats>;
55
59
  export declare function iterAssistantMessages(params: {
56
60
  sinceMs?: number;
57
61
  untilMs?: number;
58
62
  }): Promise<OpenCodeMessage[]>;
59
63
  /**
60
64
  * Read assistant messages for a specific session only.
61
- *
62
- * This is more efficient than iterAssistantMessages when you only need
63
- * messages from a single session, as it only reads that session's directory.
64
- *
65
- * @param params.sessionID - Session ID (must start with "ses_")
66
- * @param params.sinceMs - Optional: only messages created after this timestamp
67
- * @param params.untilMs - Optional: only messages created before this timestamp
68
- * @throws SessionNotFoundError if the session directory doesn't exist
69
65
  */
70
66
  export declare function iterAssistantMessagesForSession(params: {
71
67
  sessionID: string;
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-storage.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;gBADnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;CAKtC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,+BAA+B,IAAI,MAAM,EAAE,CAE1D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,+BAA+B,IAAI,MAAM,EAAE,CAE1D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,+BAA+B,IAAI,MAAM,EAAE,CAE1D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAWD,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAY1E;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA+B7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwC7B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAoCzF"}
1
+ {"version":3,"file":"opencode-storage.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;gBADnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;CAKtC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAuHD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAuCnE;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB7B;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgC7B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CA4BzF"}