@prism-d1/cli 1.7.0 → 1.7.1
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.
- package/dist/src/commands/_top/dashboard.d.ts +4 -0
- package/dist/src/commands/_top/dashboard.d.ts.map +1 -1
- package/dist/src/commands/_top/dashboard.js +36 -3
- package/dist/src/commands/_top/dashboard.js.map +1 -1
- package/dist/src/dashboard/page.d.ts +1 -1
- package/dist/src/dashboard/page.d.ts.map +1 -1
- package/dist/src/dashboard/page.js +45 -14
- package/dist/src/dashboard/page.js.map +1 -1
- package/dist/src/dashboard/payload.d.ts +28 -1
- package/dist/src/dashboard/payload.d.ts.map +1 -1
- package/dist/src/dashboard/payload.js +34 -7
- package/dist/src/dashboard/payload.js.map +1 -1
- package/dist/src/dashboard/server.d.ts +2 -2
- package/dist/src/dashboard/server.d.ts.map +1 -1
- package/dist/src/dashboard/server.js +1 -1
- package/dist/src/dashboard/server.js.map +1 -1
- package/dist/src/dashboard/setup.d.ts +51 -1
- package/dist/src/dashboard/setup.d.ts.map +1 -1
- package/dist/src/dashboard/setup.js +125 -15
- package/dist/src/dashboard/setup.js.map +1 -1
- package/dist/src/dashboard/summary.d.ts +2 -0
- package/dist/src/dashboard/summary.d.ts.map +1 -1
- package/dist/src/dashboard/summary.js +1 -1
- package/dist/src/dashboard/summary.js.map +1 -1
- package/dist/src/dashboard/usage-cache.d.ts +44 -0
- package/dist/src/dashboard/usage-cache.d.ts.map +1 -0
- package/dist/src/dashboard/usage-cache.js +90 -0
- package/dist/src/dashboard/usage-cache.js.map +1 -0
- package/dist/src/dashboard/usage.d.ts +14 -1
- package/dist/src/dashboard/usage.d.ts.map +1 -1
- package/dist/src/dashboard/usage.js +45 -12
- package/dist/src/dashboard/usage.js.map +1 -1
- package/dist/src/utils/private-json.d.ts +5 -0
- package/dist/src/utils/private-json.d.ts.map +1 -0
- package/dist/src/utils/private-json.js +29 -0
- package/dist/src/utils/private-json.js.map +1 -0
- package/dist/src/utils/tool-check.d.ts +9 -0
- package/dist/src/utils/tool-check.d.ts.map +1 -1
- package/dist/src/utils/tool-check.js +37 -2
- package/dist/src/utils/tool-check.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
* Usage panel data, from `codeburn export -f json` (schema codeburn.export.v2,
|
|
3
3
|
* checked against codeburn 0.9.24).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* One `--from <1st of month> --to <today>` export gives this calendar month,
|
|
6
|
+
* its top models and projects, and "Today" from its per-day breakdown
|
|
7
|
+
* (periods[0].daily, one row per local date with usage). Only when an export
|
|
8
|
+
* has no per-day breakdown is a second, today-only export run. The all-time
|
|
9
|
+
* default export is not used: it is the slowest one and only gave "Today".
|
|
7
10
|
* codeburn's own charts are not rebuilt; the panel points at `codeburn web`.
|
|
8
11
|
*/
|
|
9
12
|
import { execFile } from 'node:child_process';
|
|
@@ -38,7 +41,7 @@ export function localDate(d) {
|
|
|
38
41
|
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
|
|
39
42
|
}
|
|
40
43
|
export function emptyUsage(status, message) {
|
|
41
|
-
return { status, message, currency: 'USD', today: null, month: null, topModels: [], topProjects: [], projects: [], generated: null, fullView: 'codeburn web' };
|
|
44
|
+
return { status, message, currency: 'USD', today: null, month: null, topModels: [], topProjects: [], projects: [], generated: null, updatedAt: null, stale: false, refreshError: null, fullView: 'codeburn web' };
|
|
42
45
|
}
|
|
43
46
|
function real(p) {
|
|
44
47
|
try {
|
|
@@ -65,6 +68,19 @@ export function spendByRepo(projects, repoPaths) {
|
|
|
65
68
|
}
|
|
66
69
|
return out;
|
|
67
70
|
}
|
|
71
|
+
const isExport = (j) => String(j?.schema || '').startsWith('codeburn.export.');
|
|
72
|
+
/**
|
|
73
|
+
* Today's totals from a month export's per-day rows; null when the export has
|
|
74
|
+
* no per-day breakdown. No row for today means no usage today (codeburn lists
|
|
75
|
+
* only days with usage).
|
|
76
|
+
*/
|
|
77
|
+
export function todayFromDaily(month, today) {
|
|
78
|
+
const daily = month?.periods?.[0]?.daily;
|
|
79
|
+
if (!Array.isArray(daily))
|
|
80
|
+
return null;
|
|
81
|
+
const row = daily.find((r) => r?.Date === today);
|
|
82
|
+
return row ? totalsFrom(row) : { cost: 0, calls: 0, sessions: 0 };
|
|
83
|
+
}
|
|
68
84
|
export async function collectUsage(opts = {}) {
|
|
69
85
|
let exporter = opts.exporter;
|
|
70
86
|
if (!exporter) {
|
|
@@ -76,25 +92,39 @@ export async function collectUsage(opts = {}) {
|
|
|
76
92
|
const now = opts.now || new Date();
|
|
77
93
|
const to = localDate(now);
|
|
78
94
|
const from = `${to.slice(0, 8)}01`;
|
|
79
|
-
|
|
95
|
+
const failed = (e) => emptyUsage('error', `codeburn export failed: ${String(e?.message || e).split('\n')[0].slice(0, 200)}`);
|
|
96
|
+
const badSchema = (j) => emptyUsage('error', `unrecognised codeburn export schema: ${String(j?.schema).slice(0, 40)}`);
|
|
97
|
+
let month;
|
|
80
98
|
try {
|
|
81
|
-
|
|
99
|
+
month = await exporter(['--from', from, '--to', to]);
|
|
82
100
|
}
|
|
83
101
|
catch (e) {
|
|
84
|
-
return
|
|
102
|
+
return failed(e);
|
|
85
103
|
}
|
|
86
|
-
if (!
|
|
87
|
-
return
|
|
104
|
+
if (!isExport(month))
|
|
105
|
+
return badSchema(month);
|
|
106
|
+
let today = todayFromDaily(month, to);
|
|
107
|
+
if (!today) {
|
|
108
|
+
// An export without per-day rows: ask for today alone (a small range).
|
|
109
|
+
let t;
|
|
110
|
+
try {
|
|
111
|
+
t = await exporter(['--from', to, '--to', to]);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
return failed(e);
|
|
115
|
+
}
|
|
116
|
+
if (!isExport(t))
|
|
117
|
+
return badSchema(t);
|
|
118
|
+
today = Array.isArray(t.summary) && t.summary[0] ? totalsFrom(t.summary[0]) : { cost: 0, calls: 0, sessions: 0 };
|
|
88
119
|
}
|
|
89
|
-
const todayRow = (Array.isArray(base.summary) ? base.summary : []).find((r) => r?.Period === 'Today');
|
|
90
120
|
const monthRow = Array.isArray(month?.summary) ? month.summary[0] : null;
|
|
91
121
|
const monthModels = Array.isArray(month?.periods?.[0]?.models) ? month.periods[0].models : [];
|
|
92
122
|
const monthProjects = Array.isArray(month?.projects) ? month.projects : [];
|
|
93
123
|
const panel = {
|
|
94
124
|
status: 'ok',
|
|
95
125
|
message: null,
|
|
96
|
-
currency: String(
|
|
97
|
-
today
|
|
126
|
+
currency: String(month?.currency?.code || 'USD'),
|
|
127
|
+
today,
|
|
98
128
|
month: monthRow ? { ...totalsFrom(monthRow), from, to } : { cost: 0, calls: 0, sessions: 0, from, to },
|
|
99
129
|
topModels: monthModels
|
|
100
130
|
.map((m) => ({ name: String(m?.Model || 'unknown'), cost: num(m?.['Cost (USD)']), calls: num(m?.['API Calls']) }))
|
|
@@ -105,7 +135,10 @@ export async function collectUsage(opts = {}) {
|
|
|
105
135
|
projects: monthProjects
|
|
106
136
|
.filter((p) => typeof p?.Project === 'string' && p.Project)
|
|
107
137
|
.map((p) => ({ path: real(String(p.Project).replace(/[\\/]+$/, '')), cost: num(p?.['Cost (USD)']), sessions: num(p?.Sessions) })),
|
|
108
|
-
generated: typeof
|
|
138
|
+
generated: typeof month?.generated === 'string' ? month.generated : null,
|
|
139
|
+
updatedAt: now.toISOString(),
|
|
140
|
+
stale: false,
|
|
141
|
+
refreshError: null,
|
|
109
142
|
fullView: 'codeburn web',
|
|
110
143
|
};
|
|
111
144
|
if (panel.today.calls === 0 && panel.month.calls === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/dashboard/usage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/dashboard/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;AACvB,MAAM,iBAAiB,GAAG,MAAM,CAAC;AA6BjC,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YACrC,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;YACnI,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAElF,SAAS,UAAU,CAAC,GAAQ;IAC1B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;AAC9G,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,SAAS,CAAC,CAAO;IAC/B,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA4B,EAAE,OAAe;IACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACpN,CAAC;AAED,SAAS,IAAI,CAAC,CAAS;IACrB,IAAI,CAAC;QAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACrD,CAAC;AAID;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgC,EAAE,SAAmB;IAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzC,MAAM,YAAY,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAEpF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAU,EAAE,KAAa;IACtD,MAAM,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAoE,EAAE;IACvG,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG;YAAE,OAAO,UAAU,CAAC,eAAe,EAAE,sEAAsE,CAAC,CAAC;QACrH,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,2BAA2B,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAClI,MAAM,SAAS,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,wCAAwC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5H,IAAI,KAAU,CAAC;IACf,IAAI,CAAC;QAAC,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAC7F,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,uEAAuE;QACvE,IAAI,CAAM,CAAC;QACX,IAAI,CAAC;YAAC,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,WAAW,GAAU,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,MAAM,aAAa,GAAU,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,MAAM,KAAK,GAAe;QACxB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC;QAChD,KAAK;QACL,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACtG,SAAS,EAAE,WAAW;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;aACjH,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAClD,WAAW,EAAE,aAAa;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAC7L,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAClD,QAAQ,EAAE,aAAa;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC;aAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnI,SAAS,EAAE,OAAO,KAAK,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QACxE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,KAAK,EAAE,KAAK;QACZ,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,cAAc;KACzB,CAAC;IACF,IAAI,KAAK,CAAC,KAAM,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Writes `body` to `file` through a temp file and a rename, so a reader never sees half a file. Dir 0700, file 0600. */
|
|
2
|
+
export declare function writePrivateJson(file: string, body: unknown): void;
|
|
3
|
+
/** Parsed JSON, or null when the file is missing or not JSON. */
|
|
4
|
+
export declare function readJson(file: string): any;
|
|
5
|
+
//# sourceMappingURL=private-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-json.d.ts","sourceRoot":"","sources":["../../../src/utils/private-json.ts"],"names":[],"mappings":"AAKA,yHAAyH;AACzH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAYlE;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAE1C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Small JSON files only this user can read (the dashboard's caches under ~/.prism/cache). */
|
|
2
|
+
import { chmodSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { randomBytes } from 'node:crypto';
|
|
4
|
+
import { dirname } from 'node:path';
|
|
5
|
+
/** Writes `body` to `file` through a temp file and a rename, so a reader never sees half a file. Dir 0700, file 0600. */
|
|
6
|
+
export function writePrivateJson(file, body) {
|
|
7
|
+
const dir = dirname(file);
|
|
8
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
9
|
+
chmodSync(dir, 0o700);
|
|
10
|
+
const tmp = `${file}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`;
|
|
11
|
+
try {
|
|
12
|
+
writeFileSync(tmp, JSON.stringify(body), { mode: 0o600, flag: 'wx' });
|
|
13
|
+
renameSync(tmp, file);
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
rmSync(tmp, { force: true });
|
|
17
|
+
throw e;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Parsed JSON, or null when the file is missing or not JSON. */
|
|
21
|
+
export function readJson(file) {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFileSync(file, 'utf8'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=private-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-json.js","sourceRoot":"","sources":["../../../src/utils/private-json.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,yHAAyH;AACzH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAa;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3E,IAAI,CAAC;QACH,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -10,5 +10,14 @@ export interface ToolInfo {
|
|
|
10
10
|
export declare function checkTool(binary: string, opts?: {
|
|
11
11
|
pathEnv?: string;
|
|
12
12
|
versionArgs?: string[];
|
|
13
|
+
versionCache?: string;
|
|
13
14
|
}): ToolInfo;
|
|
15
|
+
/**
|
|
16
|
+
* toolVersion, remembered in `cacheFile` per binary (symlinks resolved) and
|
|
17
|
+
* args, and reused while the binary's mtime and size are unchanged. An upgrade
|
|
18
|
+
* replaces or rewrites the binary, so it runs the probe again. A failed probe
|
|
19
|
+
* (null) is not cached.
|
|
20
|
+
*/
|
|
21
|
+
export declare function cachedToolVersion(path: string, args: string[] | undefined, cacheFile: string): string | null;
|
|
22
|
+
export declare const TOOL_VERSION_SCHEMA = "prism.tool-versions.v1";
|
|
14
23
|
//# sourceMappingURL=tool-check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-check.d.ts","sourceRoot":"","sources":["../../../src/utils/tool-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-check.d.ts","sourceRoot":"","sources":["../../../src/utils/tool-check.ts"],"names":[],"mappings":"AAWA,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,GAAG,SAA4B,GAAG,MAAM,GAAG,IAAI,CAexG;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAkB,GAAG,MAAM,GAAG,IAAI,CAIzF;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,QAAQ,CAKlI;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBhH;AAED,eAAO,MAAM,mBAAmB,2BAA2B,CAAC"}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* No shell: PATH is scanned directly and the version probe is argv-only.
|
|
6
6
|
*/
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
|
-
import { accessSync, constants, statSync } from 'node:fs';
|
|
8
|
+
import { accessSync, constants, realpathSync, statSync } from 'node:fs';
|
|
9
9
|
import { delimiter, join } from 'node:path';
|
|
10
|
+
import { readJson, writePrivateJson } from './private-json.js';
|
|
10
11
|
/** Resolves an executable on PATH without spawning `which`. */
|
|
11
12
|
export function findOnPath(binary, pathEnv = process.env.PATH) {
|
|
12
13
|
const exts = process.platform === 'win32' ? (process.env.PATHEXT || '.EXE;.CMD;.BAT').split(';') : [''];
|
|
@@ -37,6 +38,40 @@ export function checkTool(binary, opts = {}) {
|
|
|
37
38
|
const path = findOnPath(binary, opts.pathEnv);
|
|
38
39
|
if (!path)
|
|
39
40
|
return { installed: false, path: null, version: null };
|
|
40
|
-
|
|
41
|
+
const version = opts.versionCache ? cachedToolVersion(path, opts.versionArgs, opts.versionCache) : toolVersion(path, opts.versionArgs);
|
|
42
|
+
return { installed: true, path, version };
|
|
41
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* toolVersion, remembered in `cacheFile` per binary (symlinks resolved) and
|
|
46
|
+
* args, and reused while the binary's mtime and size are unchanged. An upgrade
|
|
47
|
+
* replaces or rewrites the binary, so it runs the probe again. A failed probe
|
|
48
|
+
* (null) is not cached.
|
|
49
|
+
*/
|
|
50
|
+
export function cachedToolVersion(path, args = ['--version'], cacheFile) {
|
|
51
|
+
let key, mtimeMs, size;
|
|
52
|
+
try {
|
|
53
|
+
const real = realpathSync(path);
|
|
54
|
+
const st = statSync(real);
|
|
55
|
+
key = `${real}\0${args.join(' ')}`;
|
|
56
|
+
mtimeMs = st.mtimeMs;
|
|
57
|
+
size = st.size;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return toolVersion(path, args);
|
|
61
|
+
}
|
|
62
|
+
const all = readJson(cacheFile);
|
|
63
|
+
const entries = all?.schema === TOOL_VERSION_SCHEMA && all.entries && typeof all.entries === 'object' ? all.entries : {};
|
|
64
|
+
const hit = Object.prototype.hasOwnProperty.call(entries, key) ? entries[key] : undefined;
|
|
65
|
+
if (hit && hit.mtimeMs === mtimeMs && hit.size === size && typeof hit.version === 'string')
|
|
66
|
+
return hit.version;
|
|
67
|
+
const version = toolVersion(path, args);
|
|
68
|
+
if (version !== null) {
|
|
69
|
+
try {
|
|
70
|
+
writePrivateJson(cacheFile, { schema: TOOL_VERSION_SCHEMA, entries: { ...entries, [key]: { mtimeMs, size, version } } });
|
|
71
|
+
}
|
|
72
|
+
catch { /* a cache that cannot be written only costs the probe next time */ }
|
|
73
|
+
}
|
|
74
|
+
return version;
|
|
75
|
+
}
|
|
76
|
+
export const TOOL_VERSION_SCHEMA = 'prism.tool-versions.v1';
|
|
42
77
|
//# sourceMappingURL=tool-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-check.js","sourceRoot":"","sources":["../../../src/utils/tool-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-check.js","sourceRoot":"","sources":["../../../src/utils/tool-check.ts"],"names":[],"mappings":"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"}
|