@thinkrun/cli 0.1.27
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 +349 -0
- package/dist/bin/thinkrun.d.ts +6 -0
- package/dist/bin/thinkrun.d.ts.map +1 -0
- package/dist/bin/thinkrun.js +124 -0
- package/dist/bin/thinkrun.js.map +1 -0
- package/dist/scripts/browse.sh +1107 -0
- package/dist/src/adapters/cloud.d.ts +79 -0
- package/dist/src/adapters/cloud.d.ts.map +1 -0
- package/dist/src/adapters/cloud.js +637 -0
- package/dist/src/adapters/cloud.js.map +1 -0
- package/dist/src/adapters/index.d.ts +47 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +211 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/local-command-retry.d.ts +12 -0
- package/dist/src/adapters/local-command-retry.d.ts.map +1 -0
- package/dist/src/adapters/local-command-retry.js +224 -0
- package/dist/src/adapters/local-command-retry.js.map +1 -0
- package/dist/src/adapters/local.d.ts +136 -0
- package/dist/src/adapters/local.d.ts.map +1 -0
- package/dist/src/adapters/local.js +1273 -0
- package/dist/src/adapters/local.js.map +1 -0
- package/dist/src/adapters/types.d.ts +45 -0
- package/dist/src/adapters/types.d.ts.map +1 -0
- package/dist/src/adapters/types.js +6 -0
- package/dist/src/adapters/types.js.map +1 -0
- package/dist/src/commands/actions.d.ts +135 -0
- package/dist/src/commands/actions.d.ts.map +1 -0
- package/dist/src/commands/actions.js +2207 -0
- package/dist/src/commands/actions.js.map +1 -0
- package/dist/src/commands/agent-init.d.ts +16 -0
- package/dist/src/commands/agent-init.d.ts.map +1 -0
- package/dist/src/commands/agent-init.js +222 -0
- package/dist/src/commands/agent-init.js.map +1 -0
- package/dist/src/commands/analyze.d.ts +11 -0
- package/dist/src/commands/analyze.d.ts.map +1 -0
- package/dist/src/commands/analyze.js +238 -0
- package/dist/src/commands/analyze.js.map +1 -0
- package/dist/src/commands/cache.d.ts +6 -0
- package/dist/src/commands/cache.d.ts.map +1 -0
- package/dist/src/commands/cache.js +147 -0
- package/dist/src/commands/cache.js.map +1 -0
- package/dist/src/commands/cloud.d.ts +6 -0
- package/dist/src/commands/cloud.d.ts.map +1 -0
- package/dist/src/commands/cloud.js +332 -0
- package/dist/src/commands/cloud.js.map +1 -0
- package/dist/src/commands/config.d.ts +7 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +208 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +127 -0
- package/dist/src/commands/doctor.d.ts.map +1 -0
- package/dist/src/commands/doctor.js +684 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/evaluate-helpers.d.ts +6 -0
- package/dist/src/commands/evaluate-helpers.d.ts.map +1 -0
- package/dist/src/commands/evaluate-helpers.js +13 -0
- package/dist/src/commands/evaluate-helpers.js.map +1 -0
- package/dist/src/commands/install.d.ts +118 -0
- package/dist/src/commands/install.d.ts.map +1 -0
- package/dist/src/commands/install.js +975 -0
- package/dist/src/commands/install.js.map +1 -0
- package/dist/src/commands/release.d.ts +7 -0
- package/dist/src/commands/release.d.ts.map +1 -0
- package/dist/src/commands/release.js +123 -0
- package/dist/src/commands/release.js.map +1 -0
- package/dist/src/commands/reset-connection.d.ts +17 -0
- package/dist/src/commands/reset-connection.d.ts.map +1 -0
- package/dist/src/commands/reset-connection.js +141 -0
- package/dist/src/commands/reset-connection.js.map +1 -0
- package/dist/src/commands/session-debug.d.ts +23 -0
- package/dist/src/commands/session-debug.d.ts.map +1 -0
- package/dist/src/commands/session-debug.js +267 -0
- package/dist/src/commands/session-debug.js.map +1 -0
- package/dist/src/commands/setup.d.ts +53 -0
- package/dist/src/commands/setup.d.ts.map +1 -0
- package/dist/src/commands/setup.js +249 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/config/store.d.ts +39 -0
- package/dist/src/config/store.d.ts.map +1 -0
- package/dist/src/config/store.js +290 -0
- package/dist/src/config/store.js.map +1 -0
- package/dist/src/daemon/access.d.ts +53 -0
- package/dist/src/daemon/access.d.ts.map +1 -0
- package/dist/src/daemon/access.js +87 -0
- package/dist/src/daemon/access.js.map +1 -0
- package/dist/src/daemon/bridge-envelope.d.ts +96 -0
- package/dist/src/daemon/bridge-envelope.d.ts.map +1 -0
- package/dist/src/daemon/bridge-envelope.js +235 -0
- package/dist/src/daemon/bridge-envelope.js.map +1 -0
- package/dist/src/daemon/utils.d.ts +43 -0
- package/dist/src/daemon/utils.d.ts.map +1 -0
- package/dist/src/daemon/utils.js +134 -0
- package/dist/src/daemon/utils.js.map +1 -0
- package/dist/src/errors.d.ts +60 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +87 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/local-bridge-timing.d.ts +31 -0
- package/dist/src/local-bridge-timing.d.ts.map +1 -0
- package/dist/src/local-bridge-timing.js +41 -0
- package/dist/src/local-bridge-timing.js.map +1 -0
- package/dist/src/obstacle-recovery/classify-script.d.ts +16 -0
- package/dist/src/obstacle-recovery/classify-script.d.ts.map +1 -0
- package/dist/src/obstacle-recovery/classify-script.js +53 -0
- package/dist/src/obstacle-recovery/classify-script.js.map +1 -0
- package/dist/src/obstacle-recovery/obstacle-classifier.d.ts +21 -0
- package/dist/src/obstacle-recovery/obstacle-classifier.d.ts.map +1 -0
- package/dist/src/obstacle-recovery/obstacle-classifier.js +37 -0
- package/dist/src/obstacle-recovery/obstacle-classifier.js.map +1 -0
- package/dist/src/obstacle-recovery/state-fingerprint.d.ts +26 -0
- package/dist/src/obstacle-recovery/state-fingerprint.d.ts.map +1 -0
- package/dist/src/obstacle-recovery/state-fingerprint.js +85 -0
- package/dist/src/obstacle-recovery/state-fingerprint.js.map +1 -0
- package/dist/src/obstacle-recovery/types.d.ts +44 -0
- package/dist/src/obstacle-recovery/types.d.ts.map +1 -0
- package/dist/src/obstacle-recovery/types.js +16 -0
- package/dist/src/obstacle-recovery/types.js.map +1 -0
- package/dist/src/output/formatter.d.ts +55 -0
- package/dist/src/output/formatter.d.ts.map +1 -0
- package/dist/src/output/formatter.js +55 -0
- package/dist/src/output/formatter.js.map +1 -0
- package/dist/src/output/mode.d.ts +11 -0
- package/dist/src/output/mode.d.ts.map +1 -0
- package/dist/src/output/mode.js +16 -0
- package/dist/src/output/mode.js.map +1 -0
- package/dist/src/protected-flow/detector.d.ts +26 -0
- package/dist/src/protected-flow/detector.d.ts.map +1 -0
- package/dist/src/protected-flow/detector.js +75 -0
- package/dist/src/protected-flow/detector.js.map +1 -0
- package/dist/src/protected-flow/types.d.ts +24 -0
- package/dist/src/protected-flow/types.d.ts.map +1 -0
- package/dist/src/protected-flow/types.js +28 -0
- package/dist/src/protected-flow/types.js.map +1 -0
- package/dist/src/session/agent-identity.d.ts +65 -0
- package/dist/src/session/agent-identity.d.ts.map +1 -0
- package/dist/src/session/agent-identity.js +133 -0
- package/dist/src/session/agent-identity.js.map +1 -0
- package/dist/src/session/cli-session-sync.d.ts +72 -0
- package/dist/src/session/cli-session-sync.d.ts.map +1 -0
- package/dist/src/session/cli-session-sync.js +244 -0
- package/dist/src/session/cli-session-sync.js.map +1 -0
- package/dist/src/session/context.d.ts +24 -0
- package/dist/src/session/context.d.ts.map +1 -0
- package/dist/src/session/context.js +165 -0
- package/dist/src/session/context.js.map +1 -0
- package/dist/src/session/continuity.d.ts +33 -0
- package/dist/src/session/continuity.d.ts.map +1 -0
- package/dist/src/session/continuity.js +179 -0
- package/dist/src/session/continuity.js.map +1 -0
- package/dist/src/session/errors.d.ts +9 -0
- package/dist/src/session/errors.d.ts.map +1 -0
- package/dist/src/session/errors.js +31 -0
- package/dist/src/session/errors.js.map +1 -0
- package/dist/src/session/local-continuity.d.ts +16 -0
- package/dist/src/session/local-continuity.d.ts.map +1 -0
- package/dist/src/session/local-continuity.js +146 -0
- package/dist/src/session/local-continuity.js.map +1 -0
- package/dist/src/session/signal-handler.d.ts +24 -0
- package/dist/src/session/signal-handler.d.ts.map +1 -0
- package/dist/src/session/signal-handler.js +35 -0
- package/dist/src/session/signal-handler.js.map +1 -0
- package/dist/src/shared/local-recovery-policy.d.ts +40 -0
- package/dist/src/shared/local-recovery-policy.d.ts.map +1 -0
- package/dist/src/shared/local-recovery-policy.js +59 -0
- package/dist/src/shared/local-recovery-policy.js.map +1 -0
- package/dist/src/shared/recovery-state.d.ts +3 -0
- package/dist/src/shared/recovery-state.d.ts.map +1 -0
- package/dist/src/shared/recovery-state.js +9 -0
- package/dist/src/shared/recovery-state.js.map +1 -0
- package/dist/src/types.d.ts +131 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils.d.ts +50 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +147 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/working-location.d.ts +107 -0
- package/dist/src/working-location.d.ts.map +1 -0
- package/dist/src/working-location.js +651 -0
- package/dist/src/working-location.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analyze command
|
|
3
|
+
* Trigger AI analysis of a feedback recording and render the structured document.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* thinkrun analyze <recording-id> [--output json|markdown|stdout] [--save]
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { writeFileSync } from 'fs';
|
|
11
|
+
import { config } from '../config/store.js';
|
|
12
|
+
import { isJsonMode } from '../output/mode.js';
|
|
13
|
+
import { emitJson, createSpinner } from '../output/formatter.js';
|
|
14
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
15
|
+
const ANALYZE_TIMEOUT_MS = 120_000; // 2 minutes
|
|
16
|
+
function getApiBase() {
|
|
17
|
+
return config.get('apiUrl') || 'https://api.thinkbrowse.io';
|
|
18
|
+
}
|
|
19
|
+
function getApiKey() {
|
|
20
|
+
return config.get('apiKey');
|
|
21
|
+
}
|
|
22
|
+
export function buildHeadersForApiKey(apiKey) {
|
|
23
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
24
|
+
const key = apiKey?.trim();
|
|
25
|
+
if (key) {
|
|
26
|
+
// Transitional: send both shapes so older gateways that only read one header still authenticate.
|
|
27
|
+
headers['X-API-Key'] = key;
|
|
28
|
+
headers['Authorization'] = `Bearer ${key}`;
|
|
29
|
+
}
|
|
30
|
+
return headers;
|
|
31
|
+
}
|
|
32
|
+
function buildHeaders() {
|
|
33
|
+
return buildHeadersForApiKey(getApiKey());
|
|
34
|
+
}
|
|
35
|
+
/** Render analysis as human-readable stdout text */
|
|
36
|
+
function renderStdout(analysis) {
|
|
37
|
+
const intent = analysis.intent || 'unknown';
|
|
38
|
+
console.log('');
|
|
39
|
+
console.log(chalk.bold('Analysis'));
|
|
40
|
+
console.log(chalk.gray(`Intent: ${intent} | Confidence: ${Math.round((analysis.confidence || 0) * 100)}%`));
|
|
41
|
+
console.log('');
|
|
42
|
+
console.log(chalk.bold('Summary'));
|
|
43
|
+
console.log(analysis.summary || '(no summary)');
|
|
44
|
+
if (analysis.sections?.length) {
|
|
45
|
+
console.log('');
|
|
46
|
+
console.log(chalk.bold(`Sections (${analysis.sections.length})`));
|
|
47
|
+
for (const section of analysis.sections) {
|
|
48
|
+
const severityColor = section.severity === 'critical' ? chalk.red
|
|
49
|
+
: section.severity === 'high' ? chalk.yellow
|
|
50
|
+
: section.severity === 'medium' ? chalk.cyan
|
|
51
|
+
: chalk.gray;
|
|
52
|
+
console.log('');
|
|
53
|
+
console.log(severityColor(`[${section.sectionType.toUpperCase()}] ${section.title}`));
|
|
54
|
+
console.log(section.body);
|
|
55
|
+
if (section.citations?.length) {
|
|
56
|
+
console.log(chalk.gray(` Citations (${section.citations.length}):`));
|
|
57
|
+
for (const c of section.citations) {
|
|
58
|
+
if (c.type === 'console_error') {
|
|
59
|
+
console.log(chalk.gray(` ✗ Console error at ${c.timestampMs}ms: ${c.message}`));
|
|
60
|
+
}
|
|
61
|
+
else if (c.type === 'network_request') {
|
|
62
|
+
console.log(chalk.gray(` ✗ [${c.status}] ${c.url}`));
|
|
63
|
+
}
|
|
64
|
+
else if (c.type === 'dom_element') {
|
|
65
|
+
console.log(chalk.gray(` ↳ DOM: ${c.selector} "${c.text || ''}"`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (analysis.issues?.length) {
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(chalk.bold('Issues'));
|
|
74
|
+
for (const issue of analysis.issues) {
|
|
75
|
+
const sev = issue.severity || 'medium';
|
|
76
|
+
const color = sev === 'critical' || sev === 'high' ? chalk.red : chalk.yellow;
|
|
77
|
+
console.log(` ${color(`[${sev}]`)} ${issue.description}`);
|
|
78
|
+
if (issue.suggestedFix)
|
|
79
|
+
console.log(` Fix: ${issue.suggestedFix}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (analysis.steps?.length) {
|
|
83
|
+
console.log('');
|
|
84
|
+
console.log(chalk.bold('Steps'));
|
|
85
|
+
for (const step of analysis.steps) {
|
|
86
|
+
console.log(` ${chalk.cyan(String(step.order).padEnd(3))} ${step.description || step.action}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (analysis.insights?.length) {
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log(chalk.bold('Insights'));
|
|
92
|
+
for (const insight of analysis.insights) {
|
|
93
|
+
console.log(` • ${insight}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.log('');
|
|
97
|
+
}
|
|
98
|
+
/** Render analysis as Markdown */
|
|
99
|
+
function renderMarkdown(analysis, recordingId) {
|
|
100
|
+
const lines = [];
|
|
101
|
+
lines.push(`# Recording Analysis`);
|
|
102
|
+
lines.push(`**Recording ID:** \`${recordingId}\``);
|
|
103
|
+
lines.push(`**Intent:** ${analysis.intent || 'unknown'}`);
|
|
104
|
+
lines.push(`**Analyzed at:** ${analysis.analyzedAt || new Date().toISOString()}`);
|
|
105
|
+
lines.push(`**Confidence:** ${Math.round((analysis.confidence || 0) * 100)}%`);
|
|
106
|
+
lines.push('');
|
|
107
|
+
lines.push('## Summary');
|
|
108
|
+
lines.push(analysis.summary || '(no summary)');
|
|
109
|
+
if (analysis.sections?.length) {
|
|
110
|
+
lines.push('');
|
|
111
|
+
lines.push('## Sections');
|
|
112
|
+
for (const section of analysis.sections) {
|
|
113
|
+
lines.push('');
|
|
114
|
+
const badge = section.severity ? ` (${section.severity})` : '';
|
|
115
|
+
lines.push(`### ${section.order}. ${section.title}${badge}`);
|
|
116
|
+
lines.push(section.body);
|
|
117
|
+
if (section.citations?.length) {
|
|
118
|
+
lines.push('');
|
|
119
|
+
lines.push('**Citations:**');
|
|
120
|
+
for (const c of section.citations) {
|
|
121
|
+
if (c.type === 'console_error') {
|
|
122
|
+
lines.push(`- 🔴 Console error @ ${c.timestampMs}ms: \`${c.message}\``);
|
|
123
|
+
}
|
|
124
|
+
else if (c.type === 'network_request') {
|
|
125
|
+
lines.push(`- ⚠️ [${c.status}] \`${c.url}\``);
|
|
126
|
+
}
|
|
127
|
+
else if (c.type === 'dom_element') {
|
|
128
|
+
lines.push(`- 🔗 DOM: \`${c.selector}\` "${c.text || ''}"`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (analysis.issues?.length) {
|
|
135
|
+
lines.push('');
|
|
136
|
+
lines.push('## Issues');
|
|
137
|
+
for (const issue of analysis.issues) {
|
|
138
|
+
lines.push(`### ${issue.severity?.toUpperCase() || 'ISSUE'}: ${issue.description}`);
|
|
139
|
+
if (issue.suggestedFix)
|
|
140
|
+
lines.push(`**Fix:** ${issue.suggestedFix}`);
|
|
141
|
+
lines.push('');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else if (analysis.steps?.length) {
|
|
145
|
+
lines.push('');
|
|
146
|
+
lines.push('## Steps');
|
|
147
|
+
for (const step of analysis.steps) {
|
|
148
|
+
lines.push(`${step.order}. **${step.action}** — ${step.description}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (analysis.insights?.length) {
|
|
152
|
+
lines.push('');
|
|
153
|
+
lines.push('## Insights');
|
|
154
|
+
for (const insight of analysis.insights) {
|
|
155
|
+
lines.push(`- ${insight}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
export function createAnalyzeCommand() {
|
|
161
|
+
return new Command('analyze')
|
|
162
|
+
.argument('<recording-id>', 'UUID of the recording to analyze')
|
|
163
|
+
.option('--output <format>', 'Output format: stdout|json|markdown', 'stdout')
|
|
164
|
+
.option('--save <path>', 'Save output to file (required for markdown)')
|
|
165
|
+
.description('Analyze a feedback recording with AI and render the structured document')
|
|
166
|
+
.action(async (recordingId, options) => {
|
|
167
|
+
const startMs = Date.now();
|
|
168
|
+
if (!UUID_RE.test(recordingId)) {
|
|
169
|
+
const msg = `Invalid recording ID format. Expected a UUID, got: ${recordingId}`;
|
|
170
|
+
if (isJsonMode()) {
|
|
171
|
+
process.stderr.write(JSON.stringify({ success: false, command: 'analyze', error: msg, code: 'INVALID_ARGUMENT' }) + '\n');
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
console.error(chalk.red('Error:'), msg);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const spinner = createSpinner(`Analyzing recording ${recordingId.slice(0, 8)}...`);
|
|
178
|
+
try {
|
|
179
|
+
const apiBase = getApiBase();
|
|
180
|
+
const url = `${apiBase}/api/feedback/recordings/${recordingId}/analyze`;
|
|
181
|
+
const headers = buildHeaders();
|
|
182
|
+
const res = await fetch(url, {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
headers,
|
|
185
|
+
signal: AbortSignal.timeout(ANALYZE_TIMEOUT_MS),
|
|
186
|
+
});
|
|
187
|
+
if (!res.ok) {
|
|
188
|
+
const body = await res.json().catch(() => ({}));
|
|
189
|
+
const errMsg = body?.error || body?.message || `HTTP ${res.status}`;
|
|
190
|
+
spinner.fail(`Analysis failed: ${errMsg}`);
|
|
191
|
+
if (isJsonMode()) {
|
|
192
|
+
process.stderr.write(JSON.stringify({ success: false, command: 'analyze', durationMs: Date.now() - startMs, error: errMsg, code: 'API_ERROR' }) + '\n');
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
const data = await res.json();
|
|
198
|
+
const analysis = data.analysis;
|
|
199
|
+
if (!analysis) {
|
|
200
|
+
spinner.fail('No analysis returned from server');
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}
|
|
203
|
+
spinner.succeed(`Analysis complete (${Math.round((Date.now() - startMs) / 1000)}s)`);
|
|
204
|
+
const outputFormat = options.output || 'stdout';
|
|
205
|
+
if (outputFormat === 'json' || isJsonMode()) {
|
|
206
|
+
emitJson({ success: true, command: 'analyze', durationMs: Date.now() - startMs, data: analysis });
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (outputFormat === 'markdown') {
|
|
210
|
+
const md = renderMarkdown(analysis, recordingId);
|
|
211
|
+
if (options.save) {
|
|
212
|
+
writeFileSync(options.save, md, 'utf-8');
|
|
213
|
+
console.log(chalk.green('✓'), `Saved to ${options.save}`);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
process.stdout.write(md + '\n');
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
renderStdout(analysis);
|
|
221
|
+
if (options.save) {
|
|
222
|
+
const md = renderMarkdown(analysis, recordingId);
|
|
223
|
+
writeFileSync(options.save, md, 'utf-8');
|
|
224
|
+
console.log(chalk.green('✓'), `Also saved to ${options.save}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
spinner.fail('Analysis failed');
|
|
229
|
+
if (isJsonMode()) {
|
|
230
|
+
process.stderr.write(JSON.stringify({ success: false, command: 'analyze', durationMs: Date.now() - startMs, error: error.message || String(error), code: 'INTERNAL_ERROR' }) + '\n');
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/commands/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,wBAAgB,kBAAkB,IAAI,OAAO,CAyG5C"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless page cache — POST /api/cache/* (no browser session).
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { writeFileSync } from 'node:fs';
|
|
7
|
+
import { CloudAdapter } from '../adapters/cloud.js';
|
|
8
|
+
import { ApiError } from '../errors.js';
|
|
9
|
+
import { isJsonMode } from '../output/mode.js';
|
|
10
|
+
import { emitJson } from '../output/formatter.js';
|
|
11
|
+
import { handleError } from '../utils.js';
|
|
12
|
+
function buildPageCacheOptions(opts) {
|
|
13
|
+
const o = {};
|
|
14
|
+
if (opts.provider === 'cloud' || opts.provider === 'local') {
|
|
15
|
+
o.provider = opts.provider;
|
|
16
|
+
}
|
|
17
|
+
if (opts.sensitive) {
|
|
18
|
+
o.sensitive = true;
|
|
19
|
+
}
|
|
20
|
+
if (opts.timeout !== undefined && opts.timeout !== '') {
|
|
21
|
+
const n = parseInt(opts.timeout, 10);
|
|
22
|
+
if (!Number.isNaN(n) && n > 0) {
|
|
23
|
+
o.timeout = n;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (opts.fullPage) {
|
|
27
|
+
o.fullPage = true;
|
|
28
|
+
}
|
|
29
|
+
if (opts.waitFor !== undefined && opts.waitFor !== '') {
|
|
30
|
+
const w = opts.waitFor;
|
|
31
|
+
if (w === 'load' || w === 'domcontentloaded' || w === 'networkidle') {
|
|
32
|
+
o.waitFor = w;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const n = parseFloat(w);
|
|
36
|
+
if (!Number.isNaN(n) && n > 0) {
|
|
37
|
+
o.waitFor = n;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (opts.maxDimension !== undefined && opts.maxDimension !== '') {
|
|
42
|
+
const n = parseInt(opts.maxDimension, 10);
|
|
43
|
+
if (!Number.isNaN(n) && n > 0) {
|
|
44
|
+
o.maxDimension = n;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return Object.keys(o).length > 0 ? o : undefined;
|
|
48
|
+
}
|
|
49
|
+
function writeScreenshotFile(path, bytes) {
|
|
50
|
+
try {
|
|
51
|
+
writeFileSync(path, bytes);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
55
|
+
throw new ApiError(`Failed to write screenshot to ${path}: ${message}`, 500, 'Check that the target directory exists and is writable.');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function decodeInlineScreenshotDataUrl(dataUrl) {
|
|
59
|
+
const match = /^data:([^;]+);base64,(.+)$/s.exec(dataUrl);
|
|
60
|
+
if (!match) {
|
|
61
|
+
throw new ApiError('Local page-cache screenshot response was not a valid base64 data URL', 502, 'Retry without --output to inspect the raw JSON response.');
|
|
62
|
+
}
|
|
63
|
+
return Buffer.from(match[2], 'base64');
|
|
64
|
+
}
|
|
65
|
+
export function createCacheCommand() {
|
|
66
|
+
const cacheCmd = new Command('cache').description('Stateless page cache via API (no session) — html, text, or screenshot');
|
|
67
|
+
function addSubcommand(name, description) {
|
|
68
|
+
const sub = cacheCmd
|
|
69
|
+
.command(name)
|
|
70
|
+
.description(description)
|
|
71
|
+
.argument('<url>', 'Page URL')
|
|
72
|
+
.option('--provider <mode>', 'cloud or local')
|
|
73
|
+
.option('--sensitive', 'Sensitive URL — server prefers local path when supported')
|
|
74
|
+
.option('--timeout <ms>', 'Navigation timeout in milliseconds')
|
|
75
|
+
.option('--wait-for <value>', 'load | domcontentloaded | networkidle | positive milliseconds');
|
|
76
|
+
// Screenshot-only options: registering them on html/text would silently
|
|
77
|
+
// accept and ignore the flags.
|
|
78
|
+
if (name === 'screenshot') {
|
|
79
|
+
sub
|
|
80
|
+
.option('--full-page', 'Full scrollable page')
|
|
81
|
+
.option('--max-dimension <px>', 'Max dimension (resize)')
|
|
82
|
+
.option('--output <path>', 'Save screenshot to file');
|
|
83
|
+
}
|
|
84
|
+
sub.action(async (url, options) => {
|
|
85
|
+
const startMs = Date.now();
|
|
86
|
+
let target = url;
|
|
87
|
+
if (!target.startsWith('http://') && !target.startsWith('https://')) {
|
|
88
|
+
target = `https://${target}`;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const adapter = new CloudAdapter();
|
|
92
|
+
const bodyOpts = buildPageCacheOptions(options);
|
|
93
|
+
const data = await adapter.pageCache(name, target, bodyOpts);
|
|
94
|
+
if (name === 'screenshot' && options.output) {
|
|
95
|
+
if (data && typeof data === 'object' && 'dataUrl' in data) {
|
|
96
|
+
const inlineDataUrl = data.dataUrl;
|
|
97
|
+
if (typeof inlineDataUrl !== 'string') {
|
|
98
|
+
throw new ApiError('Local screenshot response did not include a dataUrl', 502);
|
|
99
|
+
}
|
|
100
|
+
writeScreenshotFile(options.output, decodeInlineScreenshotDataUrl(inlineDataUrl));
|
|
101
|
+
}
|
|
102
|
+
else if (data && typeof data === 'object' && 'artifactUrl' in data) {
|
|
103
|
+
const artifactUrl = data.artifactUrl;
|
|
104
|
+
if (typeof artifactUrl !== 'string' || artifactUrl.length === 0) {
|
|
105
|
+
throw new ApiError('Cloud screenshot response did not include an artifactUrl', 502);
|
|
106
|
+
}
|
|
107
|
+
const response = await fetch(artifactUrl);
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new ApiError(`Failed to download cache screenshot: HTTP ${response.status}`, response.status);
|
|
110
|
+
}
|
|
111
|
+
// Screenshots are small enough to buffer in memory; switch to a
|
|
112
|
+
// stream pipeline if this ever needs to handle large artifacts.
|
|
113
|
+
writeScreenshotFile(options.output, Buffer.from(await response.arrayBuffer()));
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
throw new ApiError('Screenshot response did not include a downloadable image payload', 502, 'Retry without --output to inspect the raw response body.');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (isJsonMode()) {
|
|
120
|
+
emitJson({
|
|
121
|
+
success: true,
|
|
122
|
+
command: `cache ${name}`,
|
|
123
|
+
durationMs: Date.now() - startMs,
|
|
124
|
+
data,
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
console.log(chalk.green('Success'), chalk.cyan(target));
|
|
129
|
+
if (name === 'screenshot' && options.output) {
|
|
130
|
+
console.log(chalk.gray(`Saved screenshot to ${options.output}`));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const preview = JSON.stringify(data, null, 2);
|
|
134
|
+
const max = 12000;
|
|
135
|
+
console.log(preview.length > max ? `${preview.slice(0, max)}\n…` : preview);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
handleError(error, `cache ${name}`, startMs);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
addSubcommand('html', 'Fetch rendered HTML for a URL');
|
|
143
|
+
addSubcommand('text', 'Extract plain text for a URL');
|
|
144
|
+
addSubcommand('screenshot', 'Capture screenshot (JSON includes artifactUrl when applicable)');
|
|
145
|
+
return cacheCmd;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/commands/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../../src/commands/cloud.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,kBAAkB,IAAI,OAAO,CA6U5C"}
|