@thinkrun/cli 0.1.29 → 0.1.31
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/README.md +25 -0
- package/dist/bin/thinkrun.js +5 -0
- package/dist/bin/thinkrun.js.map +1 -1
- package/dist/shared/audit-state.d.ts +32 -0
- package/dist/shared/audit-state.js +99 -0
- package/dist/shared/local-audit-sync.d.ts +12 -0
- package/dist/shared/local-audit-sync.js +38 -0
- package/dist/shared/sensitive-result-redaction.d.ts +1 -0
- package/dist/shared/sensitive-result-redaction.js +112 -0
- package/dist/src/adapters/local.d.ts +8 -0
- package/dist/src/adapters/local.d.ts.map +1 -1
- package/dist/src/adapters/local.js +260 -32
- package/dist/src/adapters/local.js.map +1 -1
- package/dist/src/commands/actions.d.ts.map +1 -1
- package/dist/src/commands/actions.js +26 -5
- package/dist/src/commands/actions.js.map +1 -1
- package/dist/src/commands/analyze.d.ts +0 -1
- package/dist/src/commands/analyze.d.ts.map +1 -1
- package/dist/src/commands/analyze.js +1 -10
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/audit.d.ts +4 -0
- package/dist/src/commands/audit.d.ts.map +1 -0
- package/dist/src/commands/audit.js +101 -0
- package/dist/src/commands/audit.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +4 -0
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +17 -0
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/sessions.d.ts +93 -0
- package/dist/src/commands/sessions.d.ts.map +1 -0
- package/dist/src/commands/sessions.js +354 -0
- package/dist/src/commands/sessions.js.map +1 -0
- package/dist/src/config/store.d.ts.map +1 -1
- package/dist/src/config/store.js +42 -5
- package/dist/src/config/store.js.map +1 -1
- package/dist/src/session/cli-session-sync.d.ts +10 -2
- package/dist/src/session/cli-session-sync.d.ts.map +1 -1
- package/dist/src/session/cli-session-sync.js +68 -28
- package/dist/src/session/cli-session-sync.js.map +1 -1
- package/dist/src/shared/api-helpers.d.ts +12 -0
- package/dist/src/shared/api-helpers.d.ts.map +1 -0
- package/dist/src/shared/api-helpers.js +20 -0
- package/dist/src/shared/api-helpers.js.map +1 -0
- package/package.json +9 -7
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sessions command
|
|
3
|
+
* List the two kinds of "sessions" an agent works with:
|
|
4
|
+
* - browser sessions (live cloud automation sessions, /api/sessions)
|
|
5
|
+
* - recording sessions (human feedback recordings, /api/feedback/recordings)
|
|
6
|
+
*
|
|
7
|
+
* Both views are surfaced together so an autonomous loop can see live automation
|
|
8
|
+
* and the recordings it should act on in one call. JSON mode (default for non-TTY)
|
|
9
|
+
* returns a structured envelope; TTY mode renders two grouped sections.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* thinkrun sessions [list] [--recordings] [--browsers] [--limit <n>]
|
|
13
|
+
* [--status <s>] [--intent <i>] [--source <src>]
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import { config } from '../config/store.js';
|
|
18
|
+
import { isJsonMode } from '../output/mode.js';
|
|
19
|
+
import { emitJson, createSpinner } from '../output/formatter.js';
|
|
20
|
+
import { CloudAdapter } from '../adapters/cloud.js';
|
|
21
|
+
import { buildHeadersForApiKey } from '../shared/api-helpers.js';
|
|
22
|
+
const RECORDINGS_TIMEOUT_MS = 30_000;
|
|
23
|
+
const DEFAULT_RECORDINGS_LIMIT = 20;
|
|
24
|
+
const MAX_RECORDINGS_LIMIT = 200;
|
|
25
|
+
// Upper bound on raw rows scanned when paging for a client-side --source filter, so a
|
|
26
|
+
// rare source can't trigger unbounded paging. Results past this are reported, not silently dropped.
|
|
27
|
+
const MAX_SOURCE_SCAN = 1000;
|
|
28
|
+
// Cap on browser sessions materialized into the render/JSON payload. listSessions() returns
|
|
29
|
+
// every active session; a leaked accumulation of orphaned ones shouldn't blow up the output.
|
|
30
|
+
const MAX_BROWSER_SESSIONS = 100;
|
|
31
|
+
/**
|
|
32
|
+
* Clamp a raw --limit value into [1, MAX]; fall back to the default when not a clean number.
|
|
33
|
+
* Uses Number() (not parseInt) so typo'd input like '3z' is rejected to the default rather
|
|
34
|
+
* than silently truncated to 3; Math.trunc drops any fractional part of a valid number.
|
|
35
|
+
*/
|
|
36
|
+
export function clampLimit(raw) {
|
|
37
|
+
const n = Number(raw);
|
|
38
|
+
if (!Number.isFinite(n))
|
|
39
|
+
return DEFAULT_RECORDINGS_LIMIT;
|
|
40
|
+
return Math.min(MAX_RECORDINGS_LIMIT, Math.max(1, Math.trunc(n)));
|
|
41
|
+
}
|
|
42
|
+
function getApiBase() {
|
|
43
|
+
return config.get('apiUrl') || 'https://api.thinkrun.ai';
|
|
44
|
+
}
|
|
45
|
+
function buildHeaders() {
|
|
46
|
+
return buildHeadersForApiKey(config.get('apiKey'));
|
|
47
|
+
}
|
|
48
|
+
/** Short, human-friendly timestamp (UTC). Falls back to the raw value if unparseable. */
|
|
49
|
+
function fmtTime(iso) {
|
|
50
|
+
if (!iso)
|
|
51
|
+
return '—';
|
|
52
|
+
const d = new Date(iso);
|
|
53
|
+
if (Number.isNaN(d.getTime()))
|
|
54
|
+
return iso;
|
|
55
|
+
return d.toISOString().slice(0, 16).replace('T', ' ');
|
|
56
|
+
}
|
|
57
|
+
function shortId(id) {
|
|
58
|
+
return id.length > 8 ? id.slice(0, 8) + '…' : id;
|
|
59
|
+
}
|
|
60
|
+
/** Normalize an error into a one-line message for partial-failure reporting. */
|
|
61
|
+
function errMessage(error) {
|
|
62
|
+
if (error instanceof Error)
|
|
63
|
+
return error.message;
|
|
64
|
+
return String(error);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Decide which views to render from the -r/-b flags. Both default to shown; a single
|
|
68
|
+
* flag narrows to that view; passing both is equivalent to passing neither (show both).
|
|
69
|
+
*/
|
|
70
|
+
export function resolveViews(opts) {
|
|
71
|
+
// When neither flag is given, show both. A single flag narrows to that view.
|
|
72
|
+
const neitherSpecified = !opts.recordings && !opts.browsers;
|
|
73
|
+
return {
|
|
74
|
+
showRecordings: Boolean(opts.recordings) || neitherSpecified,
|
|
75
|
+
showBrowsers: Boolean(opts.browsers) || neitherSpecified,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Decide whether the command failed outright. True only when every view that was
|
|
80
|
+
* REQUESTED ended in error (and at least one error actually occurred). If a requested
|
|
81
|
+
* view succeeded — even with zero rows — the command is a success and exits 0.
|
|
82
|
+
*/
|
|
83
|
+
export function computeAllFailed(state) {
|
|
84
|
+
const browserDown = !state.showBrowsers || Boolean(state.browserError);
|
|
85
|
+
const recordingDown = !state.showRecordings || Boolean(state.recordingError);
|
|
86
|
+
const anyError = Boolean(state.browserError || state.recordingError);
|
|
87
|
+
return browserDown && recordingDown && anyError;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Build the JSON-envelope `data` payload. A view's fields are set to `undefined` when
|
|
91
|
+
* that view wasn't requested; `emitJson`/`JSON.stringify` then drops them, so the
|
|
92
|
+
* envelope only carries the views the caller asked for.
|
|
93
|
+
*/
|
|
94
|
+
export function buildEnvelopeData(state) {
|
|
95
|
+
// Bound the browser-session payload; report the true total + a flag when truncated so a
|
|
96
|
+
// consumer isn't misled by the capped array length.
|
|
97
|
+
const browserTotal = state.browserSessions.length;
|
|
98
|
+
const browserTruncated = state.showBrowsers && browserTotal > MAX_BROWSER_SESSIONS;
|
|
99
|
+
const browserSessionsOut = state.showBrowsers
|
|
100
|
+
? state.browserSessions.slice(0, MAX_BROWSER_SESSIONS)
|
|
101
|
+
: undefined;
|
|
102
|
+
return {
|
|
103
|
+
browserSessions: browserSessionsOut,
|
|
104
|
+
browserSessionCount: state.showBrowsers ? browserTotal : undefined,
|
|
105
|
+
browserSessionsTruncated: browserTruncated ? true : undefined,
|
|
106
|
+
browserError: state.browserError,
|
|
107
|
+
recordings: state.showRecordings ? state.recordings : undefined,
|
|
108
|
+
recordingCount: state.showRecordings ? state.recordings.length : undefined,
|
|
109
|
+
recordingError: state.recordingError,
|
|
110
|
+
// Only emitted (true) when a --source scan hit its cap before filling --limit, so a
|
|
111
|
+
// consumer can tell "fewer than limit" apart from "scan truncated, more may exist".
|
|
112
|
+
recordingsTruncatedByScan: state.showRecordings && state.recordingsTruncatedByScan ? true : undefined,
|
|
113
|
+
// Raw rows examined during a --source scan (only meaningful when a source filter ran).
|
|
114
|
+
recordingsScanned: state.showRecordings && state.recordingsScanned !== undefined ? state.recordingsScanned : undefined,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Shape raw list-endpoint summaries into trimmed rows, applying an optional client-side source filter. */
|
|
118
|
+
export function mapRecordingRows(raw, sourceFilter) {
|
|
119
|
+
let rows = (raw || []).map((r) => ({
|
|
120
|
+
id: r.id,
|
|
121
|
+
createdAt: r.createdAt,
|
|
122
|
+
status: r.status,
|
|
123
|
+
source: r.source,
|
|
124
|
+
intent: r.metadata?.intent,
|
|
125
|
+
title: r.metadata?.title,
|
|
126
|
+
url: r.metadata?.url,
|
|
127
|
+
hasAnalysis: !!r.hasAnalysis,
|
|
128
|
+
useCase: r.analysisUseCase?.key ?? r.analysisUseCase,
|
|
129
|
+
}));
|
|
130
|
+
if (sourceFilter) {
|
|
131
|
+
const want = sourceFilter.toLowerCase();
|
|
132
|
+
rows = rows.filter((r) => (r.source || '').toLowerCase() === want);
|
|
133
|
+
}
|
|
134
|
+
return rows;
|
|
135
|
+
}
|
|
136
|
+
async function fetchBrowserSessions() {
|
|
137
|
+
const adapter = new CloudAdapter();
|
|
138
|
+
// No explicit timeout here because CloudAdapter.request wraps every fetch in
|
|
139
|
+
// AbortSignal.timeout(defaultTimeout) (60s), so listSessions can't hang indefinitely
|
|
140
|
+
// even though it doesn't take a per-call timeout like the recordings path does.
|
|
141
|
+
return adapter.listSessions();
|
|
142
|
+
}
|
|
143
|
+
/** Fetch one raw page of recording summaries from the list endpoint. */
|
|
144
|
+
async function fetchRecordingsPage(opts) {
|
|
145
|
+
const params = new URLSearchParams();
|
|
146
|
+
params.set('limit', String(opts.limit));
|
|
147
|
+
if (opts.offset > 0)
|
|
148
|
+
params.set('offset', String(opts.offset));
|
|
149
|
+
if (opts.status)
|
|
150
|
+
params.set('status', opts.status);
|
|
151
|
+
if (opts.intent)
|
|
152
|
+
params.set('intent', opts.intent);
|
|
153
|
+
const url = `${getApiBase()}/api/feedback/recordings?${params.toString()}`;
|
|
154
|
+
const res = await fetch(url, {
|
|
155
|
+
method: 'GET',
|
|
156
|
+
headers: buildHeaders(),
|
|
157
|
+
signal: AbortSignal.timeout(RECORDINGS_TIMEOUT_MS),
|
|
158
|
+
});
|
|
159
|
+
if (!res.ok) {
|
|
160
|
+
const body = (await res.json().catch(() => ({})));
|
|
161
|
+
const msg = body?.error || body?.message || `HTTP ${res.status}`;
|
|
162
|
+
throw new Error(msg);
|
|
163
|
+
}
|
|
164
|
+
const data = (await res.json());
|
|
165
|
+
return data.recordings || [];
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Collect up to `limit` rows matching `source` by paging the source-fetcher. The list
|
|
169
|
+
* endpoint can't filter by `source` server-side, so a naive "fetch limit then filter"
|
|
170
|
+
* would drop valid matches that sit past the first page. We page (bounded by `maxScan`
|
|
171
|
+
* to avoid runaway) until we have `limit` matches or the source is exhausted.
|
|
172
|
+
* `scanned` reports how many raw rows were examined so callers can detect a cap hit.
|
|
173
|
+
* Pure except for the injected `fetchPage` — unit-tested with a fake fetcher.
|
|
174
|
+
*/
|
|
175
|
+
export async function collectSourceMatches(fetchPage, opts) {
|
|
176
|
+
const pageSize = opts.pageSize ?? Math.min(MAX_RECORDINGS_LIMIT, Math.max(opts.limit, 50));
|
|
177
|
+
const maxScan = opts.maxScan ?? MAX_SOURCE_SCAN;
|
|
178
|
+
const matches = [];
|
|
179
|
+
let offset = 0;
|
|
180
|
+
let scanned = 0;
|
|
181
|
+
let exhausted = false;
|
|
182
|
+
while (matches.length < opts.limit && scanned < maxScan) {
|
|
183
|
+
// Cap the request to the remaining scan budget so `scanned` never exceeds `maxScan`
|
|
184
|
+
// (a full page past the budget would otherwise overshoot by up to pageSize-1).
|
|
185
|
+
const requested = Math.min(pageSize, maxScan - scanned);
|
|
186
|
+
const page = await fetchPage(offset, requested);
|
|
187
|
+
if (page.length === 0) {
|
|
188
|
+
exhausted = true;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
scanned += page.length;
|
|
192
|
+
// Cap what we take from this page to the remaining slots so `matches` never balloons
|
|
193
|
+
// past `limit` on a page full of matches.
|
|
194
|
+
const remaining = opts.limit - matches.length;
|
|
195
|
+
matches.push(...mapRecordingRows(page, opts.source).slice(0, remaining));
|
|
196
|
+
// A short page means the server ran out of data — but only when we asked for a FULL
|
|
197
|
+
// page. If we deliberately capped the request (budget-limited), a short page is just the
|
|
198
|
+
// budget, not exhaustion, and the loop guard will stop us with exhausted=false.
|
|
199
|
+
if (page.length < requested) {
|
|
200
|
+
exhausted = true;
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
offset += page.length;
|
|
204
|
+
}
|
|
205
|
+
return { rows: matches, scanned, exhausted };
|
|
206
|
+
}
|
|
207
|
+
async function fetchRecordings(opts) {
|
|
208
|
+
// No source filter: a single server-side page is exact (no scan to report).
|
|
209
|
+
if (!opts.source) {
|
|
210
|
+
const page = await fetchRecordingsPage({ limit: opts.limit, offset: 0, status: opts.status, intent: opts.intent });
|
|
211
|
+
return { rows: mapRecordingRows(page, undefined), truncatedByScan: false };
|
|
212
|
+
}
|
|
213
|
+
// Source filter: page through (bounded) because the server can't filter by source.
|
|
214
|
+
const { rows, exhausted, scanned } = await collectSourceMatches((offset, pageSize) => fetchRecordingsPage({ limit: pageSize, offset, status: opts.status, intent: opts.intent }), { limit: opts.limit, source: opts.source });
|
|
215
|
+
// We stopped before filling `limit` AND didn't exhaust the data ⇒ the scan cap truncated results.
|
|
216
|
+
const truncatedByScan = rows.length < opts.limit && !exhausted;
|
|
217
|
+
// `scanned` lets a consumer tell "found 0 after scanning 5" from "found 0 after scanning 950".
|
|
218
|
+
return { rows, truncatedByScan, scanned };
|
|
219
|
+
}
|
|
220
|
+
export function createSessionsCommand() {
|
|
221
|
+
const sessionsCmd = new Command('sessions').description('List browser sessions (live automation) and recording sessions (human recordings)');
|
|
222
|
+
const listCmd = new Command('list')
|
|
223
|
+
.description('List active browser sessions and recent recordings')
|
|
224
|
+
.option('-r, --recordings', 'Show only recording sessions')
|
|
225
|
+
.option('-b, --browsers', 'Show only browser sessions')
|
|
226
|
+
.option('-n, --limit <n>', 'Max recordings to list', String(DEFAULT_RECORDINGS_LIMIT))
|
|
227
|
+
.option('--status <status>', 'Filter recordings by status')
|
|
228
|
+
.option('--intent <intent>', 'Filter recordings by intent')
|
|
229
|
+
.option('--source <source>', `Filter recordings by source (cli, extension, web, web-upload). Pages through results to find up to --limit matches (scans at most ${MAX_SOURCE_SCAN} recordings).`)
|
|
230
|
+
.action(async (opts) => {
|
|
231
|
+
const startMs = Date.now();
|
|
232
|
+
// Default to showing both; a single -r/-b narrows to that view.
|
|
233
|
+
const { showRecordings, showBrowsers } = resolveViews(opts);
|
|
234
|
+
const limit = clampLimit(opts.limit);
|
|
235
|
+
const spinner = createSpinner('Fetching sessions...');
|
|
236
|
+
let browserSessions = [];
|
|
237
|
+
let recordings = [];
|
|
238
|
+
let recordingsTruncatedByScan = false;
|
|
239
|
+
let recordingsScanned;
|
|
240
|
+
let browserError;
|
|
241
|
+
let recordingError;
|
|
242
|
+
// Fetch independently so one source failing (e.g. no live sessions vs. auth)
|
|
243
|
+
// still lets the other render.
|
|
244
|
+
await Promise.all([
|
|
245
|
+
showBrowsers
|
|
246
|
+
? fetchBrowserSessions()
|
|
247
|
+
.then((s) => {
|
|
248
|
+
browserSessions = s;
|
|
249
|
+
})
|
|
250
|
+
.catch((e) => {
|
|
251
|
+
browserError = errMessage(e);
|
|
252
|
+
})
|
|
253
|
+
: Promise.resolve(),
|
|
254
|
+
showRecordings
|
|
255
|
+
? fetchRecordings({ limit, status: opts.status, intent: opts.intent, source: opts.source })
|
|
256
|
+
.then((r) => {
|
|
257
|
+
recordings = r.rows;
|
|
258
|
+
recordingsTruncatedByScan = r.truncatedByScan;
|
|
259
|
+
recordingsScanned = r.scanned;
|
|
260
|
+
})
|
|
261
|
+
.catch((e) => {
|
|
262
|
+
recordingError = errMessage(e);
|
|
263
|
+
})
|
|
264
|
+
: Promise.resolve(),
|
|
265
|
+
]);
|
|
266
|
+
// If everything we asked for failed, treat it as a hard error.
|
|
267
|
+
const allFailed = computeAllFailed({ showBrowsers, showRecordings, browserError, recordingError });
|
|
268
|
+
// Stop the spinner before branching so neither the JSON early-return nor the TTY path
|
|
269
|
+
// can leave it spinning.
|
|
270
|
+
spinner.stop();
|
|
271
|
+
if (isJsonMode()) {
|
|
272
|
+
emitJson({
|
|
273
|
+
success: !allFailed,
|
|
274
|
+
command: 'sessions list',
|
|
275
|
+
durationMs: Date.now() - startMs,
|
|
276
|
+
data: buildEnvelopeData({
|
|
277
|
+
showBrowsers,
|
|
278
|
+
showRecordings,
|
|
279
|
+
browserSessions,
|
|
280
|
+
browserError,
|
|
281
|
+
recordings,
|
|
282
|
+
recordingError,
|
|
283
|
+
recordingsTruncatedByScan,
|
|
284
|
+
recordingsScanned,
|
|
285
|
+
}),
|
|
286
|
+
});
|
|
287
|
+
if (allFailed)
|
|
288
|
+
process.exit(1);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (showBrowsers) {
|
|
292
|
+
console.log('');
|
|
293
|
+
if (browserError) {
|
|
294
|
+
console.log(chalk.bold('Browser Sessions:'), chalk.red(`error — ${browserError}`));
|
|
295
|
+
}
|
|
296
|
+
else if (browserSessions.length === 0) {
|
|
297
|
+
console.log(chalk.bold('Browser Sessions (0):'), chalk.gray('none active'));
|
|
298
|
+
console.log(chalk.gray(' Start one with:'), chalk.cyan('thinkrun cloud start'));
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
console.log(chalk.bold(`Browser Sessions (${browserSessions.length}):`));
|
|
302
|
+
const browserShown = browserSessions.slice(0, MAX_BROWSER_SESSIONS);
|
|
303
|
+
for (const s of browserShown) {
|
|
304
|
+
console.log(` ${chalk.gray('○')} ${chalk.cyan(shortId(s.sessionId))} ` +
|
|
305
|
+
`${(s.status || '').padEnd(11)} ${s.currentUrl || s.title || chalk.gray('(no URL)')}`);
|
|
306
|
+
}
|
|
307
|
+
if (browserSessions.length > MAX_BROWSER_SESSIONS) {
|
|
308
|
+
console.log(chalk.yellow(` Note: showing first ${MAX_BROWSER_SESSIONS} of ${browserSessions.length} sessions.`));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (showRecordings) {
|
|
313
|
+
console.log('');
|
|
314
|
+
if (recordingError) {
|
|
315
|
+
console.log(chalk.bold('Recording Sessions:'), chalk.red(`error — ${recordingError}`));
|
|
316
|
+
}
|
|
317
|
+
else if (recordings.length === 0) {
|
|
318
|
+
console.log(chalk.bold('Recording Sessions (0):'), chalk.gray('none found'));
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
console.log(chalk.bold(`Recording Sessions (${recordings.length}):`));
|
|
322
|
+
for (const r of recordings) {
|
|
323
|
+
const label = r.title || r.url || chalk.gray('(untitled)');
|
|
324
|
+
const tags = [r.source, r.intent].filter(Boolean).join('/') || '—';
|
|
325
|
+
const analyzed = r.hasAnalysis ? chalk.green('✓analyzed') : chalk.gray('·');
|
|
326
|
+
console.log(` ${chalk.gray('○')} ${chalk.cyan(shortId(r.id))} ` +
|
|
327
|
+
`${fmtTime(r.createdAt)} ${(r.status || '—').padEnd(10)} ` +
|
|
328
|
+
`${tags.padEnd(20)} ${analyzed} ${label}`);
|
|
329
|
+
}
|
|
330
|
+
if (recordingsTruncatedByScan) {
|
|
331
|
+
console.log(chalk.yellow(` Note: stopped after scanning ${recordingsScanned ?? MAX_SOURCE_SCAN} recordings; more --source matches may exist.`));
|
|
332
|
+
}
|
|
333
|
+
console.log('');
|
|
334
|
+
console.log(chalk.gray(' Analyze one with:'), chalk.cyan('thinkrun analyze <recording-id>'));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
console.log('');
|
|
338
|
+
if (allFailed)
|
|
339
|
+
process.exit(1);
|
|
340
|
+
});
|
|
341
|
+
listCmd.addHelpText('after', [
|
|
342
|
+
'',
|
|
343
|
+
'Notes:',
|
|
344
|
+
" Browser sessions are the same set shown by 'thinkrun cloud list'.",
|
|
345
|
+
' Partial failure is non-fatal: if one source errors while the other succeeds,',
|
|
346
|
+
" the command still exits 0 with success:true and reports the failure in the",
|
|
347
|
+
" 'browserError' / 'recordingError' field. Consumers must check those fields,",
|
|
348
|
+
' not just the exit code. Exit is non-zero only when every requested view fails.',
|
|
349
|
+
].join('\n'));
|
|
350
|
+
// `list` is the default, so `thinkrun sessions` and `thinkrun sessions list` behave alike.
|
|
351
|
+
sessionsCmd.addCommand(listCmd, { isDefault: true });
|
|
352
|
+
return sessionsCmd;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/config/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/config/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkM7C,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAkB;;IAuB9B,OAAO,CAAC,SAAS;IAajB,uFAAuF;IACvF,OAAO,CAAC,uBAAuB;IA+B/B,GAAG,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAIpD,GAAG,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAIjE,GAAG,CAAC,GAAG,EAAE,MAAM,SAAS,GAAG,OAAO;IAIlC,MAAM,CAAC,GAAG,EAAE,MAAM,SAAS,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,SAAS;IAInB,OAAO,IAAI,MAAM;IAKjB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIpC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIjD,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM;IAOhC,YAAY,IAAI,OAAO;IAIvB;;;;;OAKG;IACH,YAAY,IAAI;QAAE,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE;IAUpI,sBAAsB,IAAI,IAAI;IAI9B,gBAAgB,IAAI,IAAI;CAOzB;AAGD,eAAO,MAAM,MAAM,aAAoB,CAAC"}
|
package/dist/src/config/store.js
CHANGED
|
@@ -91,15 +91,21 @@ const schema = {
|
|
|
91
91
|
default: 'native',
|
|
92
92
|
},
|
|
93
93
|
};
|
|
94
|
+
function getHomeDir() {
|
|
95
|
+
return process.env.HOME || homedir();
|
|
96
|
+
}
|
|
94
97
|
// Use ~/.config/thinkrun/ consistently across all platforms so that the
|
|
95
98
|
// CLI reads the same config.json that browse.sh and users expect to find there.
|
|
96
99
|
// THINKRUN_CONFIG_DIR env var overrides the path — used by tests to avoid
|
|
97
100
|
// polluting the real user config with test data.
|
|
98
101
|
function getConfigDir() {
|
|
99
|
-
return process.env.THINKRUN_CONFIG_DIR || join(
|
|
102
|
+
return process.env.THINKRUN_CONFIG_DIR || join(getHomeDir(), '.config', 'thinkrun');
|
|
100
103
|
}
|
|
101
104
|
function getLegacyBrandConfigPath() {
|
|
102
|
-
return join(
|
|
105
|
+
return join(getHomeDir(), '.config', 'thinkbrowse', 'config.json');
|
|
106
|
+
}
|
|
107
|
+
function getLegacyBrandImportMarkerPath() {
|
|
108
|
+
return join(getConfigDir(), '.legacy-brand-key-imported');
|
|
103
109
|
}
|
|
104
110
|
/**
|
|
105
111
|
* Determine the platform-default Conf path that was used before the cwd fix.
|
|
@@ -111,7 +117,7 @@ function getLegacyBrandConfigPath() {
|
|
|
111
117
|
function getLegacyConfPath() {
|
|
112
118
|
const os = platform();
|
|
113
119
|
if (os === 'darwin') {
|
|
114
|
-
return join(
|
|
120
|
+
return join(getHomeDir(), 'Library', 'Preferences', 'thinkbrowse-nodejs', 'config.json');
|
|
115
121
|
}
|
|
116
122
|
if (os === 'win32') {
|
|
117
123
|
const appData = process.env.APPDATA;
|
|
@@ -130,9 +136,40 @@ function getLegacyConfPath() {
|
|
|
130
136
|
*/
|
|
131
137
|
function migrateConfigIfNeeded() {
|
|
132
138
|
const newPath = join(getConfigDir(), 'config.json');
|
|
133
|
-
if (existsSync(newPath))
|
|
134
|
-
return; // already migrated or freshly created — nothing to do
|
|
135
139
|
const legacyBrandPath = getLegacyBrandConfigPath();
|
|
140
|
+
const legacyBrandImportMarkerPath = getLegacyBrandImportMarkerPath();
|
|
141
|
+
if (existsSync(newPath)) {
|
|
142
|
+
try {
|
|
143
|
+
const current = JSON.parse(readFileSync(newPath, 'utf-8'));
|
|
144
|
+
const currentApiKey = typeof current.apiKey === 'string' ? current.apiKey.trim() : '';
|
|
145
|
+
if (existsSync(legacyBrandImportMarkerPath))
|
|
146
|
+
return;
|
|
147
|
+
if (currentApiKey) {
|
|
148
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
149
|
+
writeFileSync(legacyBrandImportMarkerPath, '1', 'utf-8');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (!existsSync(legacyBrandPath)) {
|
|
153
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
154
|
+
writeFileSync(legacyBrandImportMarkerPath, '1', 'utf-8');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const legacy = JSON.parse(readFileSync(legacyBrandPath, 'utf-8'));
|
|
158
|
+
const legacyApiKey = typeof legacy.apiKey === 'string' ? legacy.apiKey.trim() : '';
|
|
159
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
160
|
+
if (legacyApiKey) {
|
|
161
|
+
writeFileSync(newPath, JSON.stringify({
|
|
162
|
+
...current,
|
|
163
|
+
apiKey: legacy.apiKey,
|
|
164
|
+
}, null, 2), 'utf-8');
|
|
165
|
+
}
|
|
166
|
+
writeFileSync(legacyBrandImportMarkerPath, '1', 'utf-8');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
136
173
|
if (existsSync(legacyBrandPath)) {
|
|
137
174
|
try {
|
|
138
175
|
const data = readFileSync(legacyBrandPath, 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/config/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGxE,6EAA6E;AAC7E,kEAAkE;AAClE,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAC/C,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAE/D,MAAM,MAAM,GAAG;IACb,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,yEAAyE;QACzE,uEAAuE;QACvE,qEAAqE;QACrE,uEAAuE;QACvE,wEAAwE;QACxE,OAAO,EAAE,uBAAuB;KACjC;IACD,oEAAoE;IACpE,wEAAwE;IACxE,aAAa,EAAE;QACb,IAAI,EAAE,QAAQ;KACf;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,yBAAyB;KACnC;IACD,cAAc,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;QACvC,OAAO,EAAE,UAAU;KACpB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,aAAa;KACvB;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,aAAa;KACvB;IACD,gCAAgC,EAAE;QAChC,IAAI,EAAE,SAAS;KAChB;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,QAAQ;KACf;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,gBAAgB;KAC1B;IACD,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;KACf;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,QAAQ;KACf;IACD,cAAc,EAAE;QACd,IAAI,EAAE,QAAQ;KACf;IACD,eAAe,EAAE;QACf,2DAA2D;QAC3D,gFAAgF;QAChF,IAAI,EAAE,QAAQ;KACf;IACD,cAAc,EAAE;QACd,4DAA4D;QAC5D,4EAA4E;QAC5E,IAAI,EAAE,QAAQ;KACf;IACD;;;;;;;;;;;;;OAaG;IACH,cAAc,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,OAAO,EAAE,QAAQ;KAClB;CACO,CAAC;AAEX,wEAAwE;AACxE,gFAAgF;AAChF,0EAA0E;AAC1E,iDAAiD;AACjD,SAAS,YAAY;IACnB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/config/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
* (same directory as working-location.json; THINKRUN_LOCK_DIR for
|
|
15
15
|
* test isolation).
|
|
16
16
|
*/
|
|
17
|
+
import { unrefAbortSignal } from '../../shared/local-audit-sync.js';
|
|
18
|
+
export { unrefAbortSignal };
|
|
17
19
|
interface PersistedNetworkCursor {
|
|
18
20
|
requestId?: string;
|
|
19
21
|
marker?: string;
|
|
@@ -26,6 +28,12 @@ interface PersistedNetworkCursor {
|
|
|
26
28
|
export declare function readCliSessionId(tabId: string): string | undefined;
|
|
27
29
|
export declare function readCliNetworkCursor(tabId: string, sessionId: string): PersistedNetworkCursor | undefined;
|
|
28
30
|
export declare function writeCliNetworkCursor(tabId: string, sessionId: string, cursor: PersistedNetworkCursor): void;
|
|
31
|
+
export interface CliAuditScreenshotState {
|
|
32
|
+
count: number;
|
|
33
|
+
recentKeys: string[];
|
|
34
|
+
}
|
|
35
|
+
export declare function readCliAuditScreenshotState(tabId: string, sessionId: string): CliAuditScreenshotState | undefined;
|
|
36
|
+
export declare function writeCliAuditScreenshotState(tabId: string, sessionId: string, auditScreenshots: CliAuditScreenshotState): void;
|
|
29
37
|
/**
|
|
30
38
|
* Call POST /api/sessions/local-init to register a CLI session in the
|
|
31
39
|
* cloud activity feed. Persists the returned sessionId to disk.
|
|
@@ -33,6 +41,7 @@ export declare function writeCliNetworkCursor(tabId: string, sessionId: string,
|
|
|
33
41
|
* @returns The sessionId on success, undefined on any failure.
|
|
34
42
|
*/
|
|
35
43
|
export declare function initCliSession(tabId: string, fetchFn?: typeof fetch): Promise<string | undefined>;
|
|
44
|
+
export declare function syncCliAuditState(tabId: string, enabled: boolean, updatedAt?: string, fetchFn?: typeof fetch): Promise<boolean>;
|
|
36
45
|
/** Action types accepted by the /local-sync/action endpoint. */
|
|
37
46
|
export type BrowserActionType = 'navigate' | 'click' | 'click_at' | 'type' | 'fill' | 'press' | 'scroll' | 'hover' | 'select' | 'wait' | 'wait_for_text' | 'extract' | 'evaluate' | 'go-back' | 'go-forward' | 'network';
|
|
38
47
|
export interface BrowserActionSyncMeta {
|
|
@@ -63,7 +72,7 @@ export declare function syncBrowserAction(sessionId: string, type: BrowserAction
|
|
|
63
72
|
* Fire-and-forget: POST a screenshot action to the cloud session.
|
|
64
73
|
* Never throws, never blocks the caller.
|
|
65
74
|
*/
|
|
66
|
-
export declare function syncScreenshotAction(sessionId: string, artifactBase64: string, artifactMimeType: string, caption: string, fetchFn?: typeof fetch):
|
|
75
|
+
export declare function syncScreenshotAction(sessionId: string, artifactBase64: string, artifactMimeType: string, caption: string, timestamp?: string, fetchFn?: typeof fetch): Promise<boolean>;
|
|
67
76
|
/**
|
|
68
77
|
* Fire-and-forget: PATCH /api/sessions/:sessionId/local-close, then
|
|
69
78
|
* clean up the persisted session file.
|
|
@@ -90,5 +99,4 @@ export type SpawnSyncFn = (cmd: string, args: string[], opts: object) => unknown
|
|
|
90
99
|
* @param spawnFn — injectable for testing; defaults to node:child_process spawnSync
|
|
91
100
|
*/
|
|
92
101
|
export declare function closeCliSessionSync(tabId: string, status: 'completed' | 'failed', spawnFn?: SpawnSyncFn): void;
|
|
93
|
-
export {};
|
|
94
102
|
//# sourceMappingURL=cli-session-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-session-sync.d.ts","sourceRoot":"","sources":["../../../src/session/cli-session-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"cli-session-sync.d.ts","sourceRoot":"","sources":["../../../src/session/cli-session-sync.ts"],"names":[],"mappings":"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"}
|