dsh-ssh-tui 0.5.3 → 0.5.5

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 (57) hide show
  1. package/README.en.md +36 -10
  2. package/README.md +21 -12
  3. package/lib/approval-reviewer.js +56 -15
  4. package/lib/approval-reviewer.js.map +1 -1
  5. package/lib/auto-approval.js +251 -35
  6. package/lib/auto-approval.js.map +1 -1
  7. package/lib/copy-text.js +62 -0
  8. package/lib/copy-text.js.map +1 -0
  9. package/lib/dsh-compat.js +142 -1
  10. package/lib/dsh-compat.js.map +1 -1
  11. package/lib/footer.js +337 -0
  12. package/lib/footer.js.map +1 -0
  13. package/lib/i18n/en.js +62 -3
  14. package/lib/i18n/en.js.map +1 -1
  15. package/lib/i18n/zh.js +62 -3
  16. package/lib/i18n/zh.js.map +1 -1
  17. package/lib/index.js +7 -5
  18. package/lib/index.js.map +1 -1
  19. package/lib/json-args.js +30 -0
  20. package/lib/json-args.js.map +1 -0
  21. package/lib/paint.js +288 -0
  22. package/lib/paint.js.map +1 -0
  23. package/lib/picker.js +453 -66
  24. package/lib/picker.js.map +1 -1
  25. package/lib/plan.js +369 -0
  26. package/lib/plan.js.map +1 -0
  27. package/lib/quota.js +408 -0
  28. package/lib/quota.js.map +1 -0
  29. package/lib/session-index.js +80 -0
  30. package/lib/session-index.js.map +1 -0
  31. package/lib/session-list.js +210 -88
  32. package/lib/session-list.js.map +1 -1
  33. package/lib/term-text.js +953 -0
  34. package/lib/term-text.js.map +1 -0
  35. package/lib/tool-present.js +744 -0
  36. package/lib/tool-present.js.map +1 -0
  37. package/lib/transcript-types.js +6 -0
  38. package/lib/transcript-types.js.map +1 -0
  39. package/lib/tui.js +643 -3299
  40. package/lib/tui.js.map +1 -1
  41. package/lib/types/approval-reviewer.d.ts +8 -2
  42. package/lib/types/auto-approval.d.ts +28 -0
  43. package/lib/types/copy-text.d.ts +9 -0
  44. package/lib/types/dsh-compat.d.ts +78 -6
  45. package/lib/types/footer.d.ts +155 -0
  46. package/lib/types/json-args.d.ts +7 -0
  47. package/lib/types/paint.d.ts +80 -0
  48. package/lib/types/picker.d.ts +101 -7
  49. package/lib/types/plan.d.ts +80 -0
  50. package/lib/types/quota.d.ts +94 -0
  51. package/lib/types/session-index.d.ts +32 -0
  52. package/lib/types/session-list.d.ts +35 -2
  53. package/lib/types/term-text.d.ts +149 -0
  54. package/lib/types/tool-present.d.ts +165 -0
  55. package/lib/types/transcript-types.d.ts +152 -0
  56. package/lib/types/tui.d.ts +53 -723
  57. package/package.json +20 -18
package/lib/quota.js ADDED
@@ -0,0 +1,408 @@
1
+ /**
2
+ * OpenCode / SuperGrok / DeepSeek quota and prepaid-balance parsers.
3
+ */
4
+ import { t } from './i18n/index.js';
5
+ /** Build per-model reasoningEfforts from a provider-level reasoning default. */
6
+ export function reasoningEffortsForDefault(reasoning) {
7
+ if (typeof reasoning !== 'string')
8
+ return undefined;
9
+ const level = reasoning.trim();
10
+ if (level === '' || level === 'off')
11
+ return undefined;
12
+ return { off: null, [level]: level };
13
+ }
14
+ export const OPENCODE_GO_USAGE_URL = 'https://opencode.ai/zen/go/v1/usage';
15
+ export const OPENCODE_ZEN_BASE_URL = 'https://opencode.ai/zen/v1';
16
+ export const SUPERGROK_BILLING_URL = 'https://cli-chat-proxy.grok.com/v1/billing?format=credits';
17
+ export const DEEPSEEK_PUBLIC_BASE_URL = 'https://api.deepseek.com';
18
+ /** OpenAI-completions gateways: probe these relative to the configured base URL. */
19
+ export const OPENAI_COMPAT_BALANCE_PATHS = [
20
+ '/user/balance',
21
+ '/dashboard/billing/credit_grants',
22
+ '/v1/dashboard/billing/credit_grants',
23
+ '/v1/dashboard/billing/subscription',
24
+ ];
25
+ const QUOTA_ALERT_THRESHOLDS = [50, 25, 10, 5];
26
+ /** Remaining % at or below this is “close” and uses the faster cadence. */
27
+ const QUOTA_NEAR_THRESHOLD_PERCENT = 55;
28
+ /**
29
+ * Classify the currently selected provider as an OpenCode route. Built-in
30
+ * `opencode`/`opencode-go` ids are recognized directly, and custom llm-pi-ai
31
+ * routes are recognized by their `opencode.ai` base URL.
32
+ */
33
+ export function openCodeSourceFor(provider, llmPiAiSection) {
34
+ const section = llmPiAiSection;
35
+ const profile = section?.providers?.[provider];
36
+ const baseURL = typeof profile?.baseURL === 'string' ? profile.baseURL : undefined;
37
+ const lowerBase = baseURL?.toLowerCase() ?? '';
38
+ const isGo = provider === 'opencode-go' || lowerBase.includes('opencode.ai/zen/go');
39
+ const isZen = provider === 'opencode' || (lowerBase.includes('opencode.ai/zen') && !isGo);
40
+ if (!isGo && !isZen)
41
+ return null;
42
+ const apiKeyEnv = typeof profile?.apiKeyEnv === 'string' && profile.apiKeyEnv.trim() !== ''
43
+ ? profile.apiKeyEnv
44
+ : provider === 'opencode'
45
+ ? 'OPENCODE_API_KEY'
46
+ : provider === 'opencode-go'
47
+ ? 'OPENCODE_GO_API_KEY'
48
+ : `${provider.replaceAll('-', '_').toUpperCase()}_API_KEY`;
49
+ const label = typeof profile?.displayName === 'string' && profile.displayName.trim() !== ''
50
+ ? profile.displayName
51
+ : isGo ? 'OpenCode Go' : 'OpenCode Zen';
52
+ return {
53
+ provider,
54
+ flavor: isGo ? 'go' : 'zen',
55
+ label,
56
+ apiKeyEnv,
57
+ ...(baseURL === undefined ? {} : { baseURL }),
58
+ };
59
+ }
60
+ function openCodeGoUsageWindow(value) {
61
+ if (typeof value !== 'object' || value === null)
62
+ return undefined;
63
+ const raw = value;
64
+ return {
65
+ ...(typeof raw.status === 'string' ? { status: raw.status } : {}),
66
+ ...(typeof raw.percent === 'number' && Number.isFinite(raw.percent) ? { percent: raw.percent } : {}),
67
+ ...(typeof raw.resetsAt === 'string' ? { resetsAt: raw.resetsAt } : {}),
68
+ };
69
+ }
70
+ /** A days/hours/minutes/seconds relative duration for quota reset times. */
71
+ function formatRelativeDuration(ms) {
72
+ const seconds = Math.max(0, Math.floor(ms / 1000));
73
+ if (seconds < 60)
74
+ return `${seconds}s`;
75
+ if (seconds < 3600)
76
+ return `${Math.floor(seconds / 60)}m${seconds % 60}s`;
77
+ if (seconds < 86400) {
78
+ return `${Math.floor(seconds / 3600)}h${Math.floor(seconds % 3600 / 60)}m`;
79
+ }
80
+ return `${Math.floor(seconds / 86400)}d${Math.floor(seconds % 86400 / 3600)}h`;
81
+ }
82
+ /** One compact `████░░ 40.0% · 正常 · 约 2m 后重置` line for a Go limit. */
83
+ function formatOpenCodeGoWindow(label, value) {
84
+ const window = openCodeGoUsageWindow(value);
85
+ const percent = window?.percent === undefined
86
+ ? null
87
+ : Math.max(0, Math.min(100, window.percent));
88
+ const state = window?.status === 'rate-limited'
89
+ ? t('quota.throttled')
90
+ : window?.status === 'ok'
91
+ ? t('quota.ok')
92
+ : window?.status ?? t('quota.unknown');
93
+ const parts = [label];
94
+ if (percent !== null) {
95
+ const barWidth = 16;
96
+ const filled = Math.round(percent / 100 * barWidth);
97
+ parts.push(`${'█'.repeat(filled)}${'░'.repeat(barWidth - filled)} ${percent.toFixed(1)}%`);
98
+ }
99
+ parts.push(state);
100
+ if (window?.resetsAt !== undefined) {
101
+ const reset = new Date(window.resetsAt);
102
+ if (!Number.isNaN(reset.getTime())) {
103
+ const until = reset.getTime() - Date.now();
104
+ parts.push(until > 0
105
+ ? t('quota.resetInFull', { duration: formatRelativeDuration(until), when: reset.toLocaleString() })
106
+ : t('quota.resetAt', { when: reset.toLocaleString() }));
107
+ }
108
+ }
109
+ return ` ${parts.join(' · ')}`;
110
+ }
111
+ export function remainingPercentFromUsed(usedPercent) {
112
+ if (!Number.isFinite(usedPercent))
113
+ return 100;
114
+ return Math.max(0, Math.min(100, Math.round((100 - usedPercent) * 10) / 10));
115
+ }
116
+ /** Cross a remaining-percent threshold from above (50 / 25 / 10 / 5).
117
+ * Only the tightest (lowest) crossed threshold is returned, so one drop
118
+ * never paints 50/25/10 as three identical warnings. */
119
+ export function crossedQuotaThresholds(previousRemaining, remaining) {
120
+ const crossed = QUOTA_ALERT_THRESHOLDS.filter(threshold => remaining <= threshold && (previousRemaining === undefined || previousRemaining > threshold));
121
+ if (crossed.length === 0)
122
+ return [];
123
+ return [crossed[crossed.length - 1]];
124
+ }
125
+ export function quotaAlertText(snapshot, window) {
126
+ const reset = window.resetsAt === undefined ? '' : `(${formatQuotaReset(window.resetsAt)})`;
127
+ return t('quota.alert', {
128
+ plan: snapshot.plan,
129
+ period: quotaPeriodLabel(window.period),
130
+ percent: window.remainingPercent.toFixed(0),
131
+ reset,
132
+ });
133
+ }
134
+ /**
135
+ * How often to re-fetch quota or prepaid balance, counted in model steps.
136
+ * Default is every 10 steps. Near a remaining-percent threshold, hourly
137
+ * windows refresh every 4 steps.
138
+ */
139
+ export function quotaRefreshEverySteps(window) {
140
+ if (window === undefined)
141
+ return 10;
142
+ const near = window.remainingPercent <= QUOTA_NEAR_THRESHOLD_PERCENT;
143
+ if (window.period === 'hourly' && near)
144
+ return 4;
145
+ return 10;
146
+ }
147
+ /** @deprecated Same cadence as {@link quotaRefreshEverySteps}; the name predates step accounting. */
148
+ export const quotaRefreshEveryTurns = quotaRefreshEverySteps;
149
+ function quotaPeriodLabel(period) {
150
+ if (period === 'hourly')
151
+ return t('quota.periodHourly');
152
+ if (period === 'weekly')
153
+ return t('quota.periodWeekly');
154
+ if (period === 'monthly')
155
+ return t('quota.periodMonthly');
156
+ return t('quota.periodUnknown');
157
+ }
158
+ function formatQuotaReset(iso) {
159
+ const reset = new Date(iso);
160
+ if (Number.isNaN(reset.getTime()))
161
+ return iso;
162
+ const until = reset.getTime() - Date.now();
163
+ return until > 0
164
+ ? t('quota.resetIn', { duration: formatRelativeDuration(until) })
165
+ : t('quota.resetAt', { when: reset.toLocaleString() });
166
+ }
167
+ export function parseSuperGrokBilling(payload) {
168
+ if (payload === null || typeof payload !== 'object') {
169
+ throw new Error(t('quota.supergrokUnrecognized'));
170
+ }
171
+ const root = payload;
172
+ const cfg = root.config;
173
+ if (cfg === null || typeof cfg !== 'object') {
174
+ throw new Error(t('quota.supergrokUnrecognized'));
175
+ }
176
+ const config = cfg;
177
+ const usedRaw = config.creditUsagePercent ?? config.credit_usage_percent;
178
+ const used = typeof usedRaw === 'number' && Number.isFinite(usedRaw) ? usedRaw : 0;
179
+ const periodRaw = config.currentPeriod ?? config.current_period;
180
+ const periodObj = periodRaw !== null && typeof periodRaw === 'object' ? periodRaw : undefined;
181
+ const type = typeof periodObj?.type === 'string' ? periodObj.type : '';
182
+ const period = type.includes('WEEKLY') ? 'weekly' : type.includes('MONTHLY') ? 'monthly' : 'unknown';
183
+ const end = typeof periodObj?.end === 'string'
184
+ ? periodObj.end
185
+ : typeof config.billingPeriodEnd === 'string'
186
+ ? config.billingPeriodEnd
187
+ : typeof config.billing_period_end === 'string'
188
+ ? config.billing_period_end
189
+ : undefined;
190
+ const plan = typeof root.subscription_tier === 'string' && root.subscription_tier.trim() !== ''
191
+ ? root.subscription_tier.trim()
192
+ : typeof root.subscriptionTier === 'string' && root.subscriptionTier.trim() !== ''
193
+ ? root.subscriptionTier.trim()
194
+ : 'SuperGrok';
195
+ return {
196
+ provider: 'xai',
197
+ plan,
198
+ windows: [{
199
+ label: period === 'monthly' ? t('quota.windowMonthly') : t('quota.windowWeekly'),
200
+ period: period === 'unknown' ? 'weekly' : period,
201
+ remainingPercent: remainingPercentFromUsed(used),
202
+ ...(end === undefined ? {} : { resetsAt: end }),
203
+ }],
204
+ };
205
+ }
206
+ export function parseOpenCodeGoQuota(payload, provider) {
207
+ const raw = payload;
208
+ const usage = raw?.usage;
209
+ if (usage === null || usage === undefined)
210
+ throw new Error(t('quota.unrecognized'));
211
+ const windows = [];
212
+ const push = (label, period, value) => {
213
+ const window = openCodeGoUsageWindow(value);
214
+ if (window?.percent === undefined)
215
+ return;
216
+ windows.push({
217
+ label,
218
+ period,
219
+ remainingPercent: remainingPercentFromUsed(window.percent),
220
+ ...(window.resetsAt === undefined ? {} : { resetsAt: window.resetsAt }),
221
+ });
222
+ };
223
+ push(t('quota.windowHourly'), 'hourly', usage.rolling);
224
+ push(t('quota.windowWeekly'), 'weekly', usage.weekly);
225
+ push(t('quota.windowMonthly'), 'monthly', usage.monthly);
226
+ if (windows.length === 0)
227
+ throw new Error(t('quota.unrecognized'));
228
+ return { provider, plan: 'OpenCode Go', windows };
229
+ }
230
+ export function formatQuotaSnapshot(snapshot) {
231
+ const lines = [t('quota.snapshotHeader', { plan: snapshot.plan, provider: snapshot.provider })];
232
+ for (const window of snapshot.windows) {
233
+ const remaining = Math.max(0, Math.min(100, window.remainingPercent));
234
+ const barWidth = 16;
235
+ const filled = Math.round(remaining / 100 * barWidth);
236
+ const reset = window.resetsAt === undefined ? '' : ` · ${formatQuotaReset(window.resetsAt)}`;
237
+ const bar = `${'█'.repeat(filled)}${'░'.repeat(barWidth - filled)}`;
238
+ lines.push(t('quota.snapshotWindow', {
239
+ label: window.label,
240
+ bar,
241
+ percent: remaining.toFixed(1),
242
+ reset,
243
+ }));
244
+ }
245
+ return lines.join('\n');
246
+ }
247
+ /** Compact `/status` quota line: tightest window first, then the rest. */
248
+ export function formatQuotaStatusLine(snapshot) {
249
+ if (snapshot === undefined || snapshot.windows.length === 0)
250
+ return 'quota: none';
251
+ const tightest = tightestQuotaWindow(snapshot);
252
+ const ordered = tightest === undefined
253
+ ? snapshot.windows
254
+ : [tightest, ...snapshot.windows.filter(window => window !== tightest)];
255
+ const parts = ordered.map(window => {
256
+ const remaining = Math.max(0, Math.min(100, window.remainingPercent));
257
+ return `${window.label} ${remaining.toFixed(0)}%`;
258
+ });
259
+ return `quota: ${snapshot.plan} ${parts.join(' · ')}`;
260
+ }
261
+ /** Tightest remaining window — used for threshold alerts. */
262
+ export function tightestQuotaWindow(snapshot) {
263
+ return snapshot.windows.reduce((best, window) => {
264
+ if (best === undefined || window.remainingPercent < best.remainingPercent)
265
+ return window;
266
+ return best;
267
+ }, undefined);
268
+ }
269
+ /** Render the OpenCode Go quota payload as a transcript block. */
270
+ export function formatOpenCodeGoUsage(payload, source) {
271
+ return formatQuotaSnapshot(parseOpenCodeGoQuota(payload, source.provider));
272
+ }
273
+ export function joinUrl(base, path) {
274
+ const root = base.replace(/\/+$/u, '');
275
+ const suffix = path.startsWith('/') ? path : `/${path}`;
276
+ if (root.endsWith('/v1') && suffix.startsWith('/v1/'))
277
+ return `${root}${suffix.slice(3)}`;
278
+ return `${root}${suffix}`;
279
+ }
280
+ export function parseDeepSeekBalance(payload, provider = 'deepseek-official') {
281
+ if (payload === null || typeof payload !== 'object') {
282
+ throw new Error(t('quota.deepseekUnrecognized'));
283
+ }
284
+ const raw = payload;
285
+ const infos = Array.isArray(raw.balance_infos) ? raw.balance_infos : [];
286
+ const lines = [];
287
+ for (const item of infos) {
288
+ if (item === null || typeof item !== 'object')
289
+ continue;
290
+ const row = item;
291
+ const currency = typeof row.currency === 'string' ? row.currency : undefined;
292
+ const total = typeof row.total_balance === 'string' ? row.total_balance : typeof row.total_balance === 'number' ? String(row.total_balance) : undefined;
293
+ if (total === undefined)
294
+ continue;
295
+ lines.push({
296
+ label: t('balance.available'),
297
+ amount: total,
298
+ ...(currency === undefined ? {} : { currency }),
299
+ });
300
+ const granted = typeof row.granted_balance === 'string' ? row.granted_balance : undefined;
301
+ const topped = typeof row.topped_up_balance === 'string' ? row.topped_up_balance : undefined;
302
+ if (granted !== undefined)
303
+ lines.push({ label: t('balance.granted'), amount: granted, ...(currency === undefined ? {} : { currency }) });
304
+ if (topped !== undefined)
305
+ lines.push({ label: t('balance.topped'), amount: topped, ...(currency === undefined ? {} : { currency }) });
306
+ }
307
+ if (lines.length === 0)
308
+ throw new Error(t('quota.deepseekUnrecognized'));
309
+ return {
310
+ provider,
311
+ plan: t('route.deepseek'),
312
+ available: typeof raw.is_available === 'boolean' ? raw.is_available : undefined,
313
+ lines,
314
+ sourcePath: '/user/balance',
315
+ };
316
+ }
317
+ function numberish(value) {
318
+ if (typeof value === 'number' && Number.isFinite(value))
319
+ return String(value);
320
+ if (typeof value === 'string' && value.trim() !== '')
321
+ return value.trim();
322
+ return undefined;
323
+ }
324
+ function recordOf(value) {
325
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
326
+ ? value
327
+ : undefined;
328
+ }
329
+ /** Best-effort parse of OpenAI-compatible credit/balance JSON. */
330
+ export function parseOpenAiCompatibleBalance(payload, provider, path) {
331
+ const raw = recordOf(payload);
332
+ if (raw === undefined)
333
+ return undefined;
334
+ const lines = [];
335
+ const totalGranted = numberish(raw.total_granted);
336
+ const totalUsed = numberish(raw.total_used);
337
+ const totalAvailable = numberish(raw.total_available);
338
+ if (totalAvailable !== undefined)
339
+ lines.push({ label: t('balance.remaining'), amount: totalAvailable, currency: 'USD' });
340
+ if (totalGranted !== undefined)
341
+ lines.push({ label: t('balance.total'), amount: totalGranted, currency: 'USD' });
342
+ if (totalUsed !== undefined)
343
+ lines.push({ label: t('balance.used'), amount: totalUsed, currency: 'USD' });
344
+ const hardLimit = numberish(raw.hard_limit_usd ?? raw.hard_limit);
345
+ const softLimit = numberish(raw.soft_limit_usd ?? raw.soft_limit);
346
+ if (hardLimit !== undefined)
347
+ lines.push({ label: t('balance.hard'), amount: hardLimit, currency: 'USD' });
348
+ if (softLimit !== undefined)
349
+ lines.push({ label: t('balance.soft'), amount: softLimit, currency: 'USD' });
350
+ const data = recordOf(raw.data) ?? raw;
351
+ const balance = numberish(data.balance ?? data.total_balance ?? data.credit ?? data.credits ?? data.quota);
352
+ if (lines.length === 0 && balance !== undefined) {
353
+ lines.push({ label: t('balance.generic'), amount: balance, currency: typeof data.currency === 'string' ? data.currency : undefined });
354
+ }
355
+ if (Array.isArray(raw.balance_infos)) {
356
+ try {
357
+ return { ...parseDeepSeekBalance(raw, provider), plan: provider, sourcePath: path };
358
+ }
359
+ catch {
360
+ // Not DeepSeek-shaped despite the field name.
361
+ }
362
+ }
363
+ if (lines.length === 0)
364
+ return undefined;
365
+ return { provider, plan: provider, lines, sourcePath: path };
366
+ }
367
+ /** Compact footer chip: `余额 86.42 CNY`. Prefers remaining/available lines. */
368
+ export function formatFooterBalance(snapshot) {
369
+ const preferred = snapshot.lines.find(line => /剩余|可用|余额|available|remaining|credit/iu.test(line.label))
370
+ ?? snapshot.lines[0];
371
+ if (preferred === undefined)
372
+ return undefined;
373
+ const amount = preferred.amount.trim();
374
+ if (amount === '')
375
+ return undefined;
376
+ const currency = preferred.currency === undefined || preferred.currency === '' ? '' : ` ${preferred.currency}`;
377
+ return t('footer.balance', { amount: `${amount}${currency}` });
378
+ }
379
+ export function formatAccountBalance(snapshot) {
380
+ const header = [t('balance.header', { plan: snapshot.plan, provider: snapshot.provider })];
381
+ if (snapshot.available === false)
382
+ header.push(t('balance.unavailable'));
383
+ for (const line of snapshot.lines) {
384
+ const currency = line.currency === undefined ? '' : ` ${line.currency}`;
385
+ header.push(` ${line.label} · ${line.amount}${currency}`);
386
+ }
387
+ if (snapshot.sourcePath !== undefined)
388
+ header.push(t('balance.source', { path: snapshot.sourcePath }));
389
+ return header.join('\n');
390
+ }
391
+ /** Extract a safe human-readable message from an OpenCode error payload. */
392
+ export function openCodeApiErrorMessage(payload) {
393
+ if (typeof payload !== 'object' || payload === null)
394
+ return '';
395
+ const raw = payload;
396
+ const error = raw.error;
397
+ if (typeof error === 'string' && error.trim() !== '')
398
+ return error.trim();
399
+ if (typeof error === 'object' && error !== null) {
400
+ const message = error.message;
401
+ if (typeof message === 'string' && message.trim() !== '')
402
+ return message.trim();
403
+ }
404
+ if (typeof raw.message === 'string' && raw.message.trim() !== '')
405
+ return raw.message.trim();
406
+ return '';
407
+ }
408
+ //# sourceMappingURL=quota.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.js","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Disk cache of picker labels so listing history does not inspect every
3
+ * session.jsonl.zstd on each launch. Invalidated by file mtime/size.
4
+ */
5
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
6
+ import { homedir } from 'node:os';
7
+ import { dirname, join } from 'node:path';
8
+ import { statSync } from 'node:fs';
9
+ import { persistenceLocate } from './dsh-compat.js';
10
+ const INDEX_VERSION = 1;
11
+ /** First page of recent sessions inspected after the header sketch paints. */
12
+ export const PICKER_PRIORITY_COUNT = 9;
13
+ export function sessionIndexPath(dshHome = process.env.DSH_HOME ?? join(homedir(), '.dsh')) {
14
+ return join(dshHome, 'tui-session-index.json');
15
+ }
16
+ /** Artifact fingerprint used as the cache key. Missing files return zeros. */
17
+ export function sessionArtifactStat(persistence, meta) {
18
+ try {
19
+ const location = persistenceLocate(persistence, meta);
20
+ if (location?.path === undefined || location.path === '')
21
+ return { mtimeMs: 0, size: 0 };
22
+ const info = statSync(location.path);
23
+ return { mtimeMs: Math.round(info.mtimeMs), size: info.size };
24
+ }
25
+ catch {
26
+ return { mtimeMs: 0, size: 0 };
27
+ }
28
+ }
29
+ export function indexEntryMatchesStat(entry, stat) {
30
+ if (entry === undefined)
31
+ return false;
32
+ return entry.mtimeMs === stat.mtimeMs && entry.size === stat.size && entry.id !== '';
33
+ }
34
+ export async function loadSessionIndex(path) {
35
+ try {
36
+ const parsed = JSON.parse(await readFile(path, 'utf8'));
37
+ if (parsed.version !== INDEX_VERSION || parsed.entries === null || typeof parsed.entries !== 'object') {
38
+ return new Map();
39
+ }
40
+ const map = new Map();
41
+ for (const [id, entry] of Object.entries(parsed.entries)) {
42
+ if (entry === null || typeof entry !== 'object')
43
+ continue;
44
+ if (typeof entry.id !== 'string' || entry.id === '')
45
+ continue;
46
+ map.set(id, entry);
47
+ }
48
+ return map;
49
+ }
50
+ catch {
51
+ return new Map();
52
+ }
53
+ }
54
+ export async function saveSessionIndex(path, entries) {
55
+ const payload = {
56
+ version: INDEX_VERSION,
57
+ entries: Object.fromEntries(entries),
58
+ };
59
+ const body = `${JSON.stringify(payload)}\n`;
60
+ const tmp = `${path}.${process.pid}.tmp`;
61
+ try {
62
+ await mkdir(dirname(path), { recursive: true });
63
+ await writeFile(tmp, body, { encoding: 'utf8', mode: 0o600 });
64
+ await rename(tmp, path);
65
+ }
66
+ catch {
67
+ try {
68
+ await writeFile(path, body, { encoding: 'utf8', mode: 0o600 });
69
+ }
70
+ catch { /* best-effort */ }
71
+ }
72
+ }
73
+ /** Drop ids that are no longer in the store so the file cannot grow forever. */
74
+ export function pruneSessionIndex(entries, keepIds) {
75
+ for (const id of [...entries.keys()]) {
76
+ if (!keepIds.has(id))
77
+ entries.delete(id);
78
+ }
79
+ }
80
+ //# sourceMappingURL=session-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-index.js","sourceRoot":"","sources":["../src/session-index.ts"],"names":[],"mappings":"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"}