@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.
Files changed (183) hide show
  1. package/README.md +349 -0
  2. package/dist/bin/thinkrun.d.ts +6 -0
  3. package/dist/bin/thinkrun.d.ts.map +1 -0
  4. package/dist/bin/thinkrun.js +124 -0
  5. package/dist/bin/thinkrun.js.map +1 -0
  6. package/dist/scripts/browse.sh +1107 -0
  7. package/dist/src/adapters/cloud.d.ts +79 -0
  8. package/dist/src/adapters/cloud.d.ts.map +1 -0
  9. package/dist/src/adapters/cloud.js +637 -0
  10. package/dist/src/adapters/cloud.js.map +1 -0
  11. package/dist/src/adapters/index.d.ts +47 -0
  12. package/dist/src/adapters/index.d.ts.map +1 -0
  13. package/dist/src/adapters/index.js +211 -0
  14. package/dist/src/adapters/index.js.map +1 -0
  15. package/dist/src/adapters/local-command-retry.d.ts +12 -0
  16. package/dist/src/adapters/local-command-retry.d.ts.map +1 -0
  17. package/dist/src/adapters/local-command-retry.js +224 -0
  18. package/dist/src/adapters/local-command-retry.js.map +1 -0
  19. package/dist/src/adapters/local.d.ts +136 -0
  20. package/dist/src/adapters/local.d.ts.map +1 -0
  21. package/dist/src/adapters/local.js +1273 -0
  22. package/dist/src/adapters/local.js.map +1 -0
  23. package/dist/src/adapters/types.d.ts +45 -0
  24. package/dist/src/adapters/types.d.ts.map +1 -0
  25. package/dist/src/adapters/types.js +6 -0
  26. package/dist/src/adapters/types.js.map +1 -0
  27. package/dist/src/commands/actions.d.ts +135 -0
  28. package/dist/src/commands/actions.d.ts.map +1 -0
  29. package/dist/src/commands/actions.js +2207 -0
  30. package/dist/src/commands/actions.js.map +1 -0
  31. package/dist/src/commands/agent-init.d.ts +16 -0
  32. package/dist/src/commands/agent-init.d.ts.map +1 -0
  33. package/dist/src/commands/agent-init.js +222 -0
  34. package/dist/src/commands/agent-init.js.map +1 -0
  35. package/dist/src/commands/analyze.d.ts +11 -0
  36. package/dist/src/commands/analyze.d.ts.map +1 -0
  37. package/dist/src/commands/analyze.js +238 -0
  38. package/dist/src/commands/analyze.js.map +1 -0
  39. package/dist/src/commands/cache.d.ts +6 -0
  40. package/dist/src/commands/cache.d.ts.map +1 -0
  41. package/dist/src/commands/cache.js +147 -0
  42. package/dist/src/commands/cache.js.map +1 -0
  43. package/dist/src/commands/cloud.d.ts +6 -0
  44. package/dist/src/commands/cloud.d.ts.map +1 -0
  45. package/dist/src/commands/cloud.js +332 -0
  46. package/dist/src/commands/cloud.js.map +1 -0
  47. package/dist/src/commands/config.d.ts +7 -0
  48. package/dist/src/commands/config.d.ts.map +1 -0
  49. package/dist/src/commands/config.js +208 -0
  50. package/dist/src/commands/config.js.map +1 -0
  51. package/dist/src/commands/doctor.d.ts +127 -0
  52. package/dist/src/commands/doctor.d.ts.map +1 -0
  53. package/dist/src/commands/doctor.js +684 -0
  54. package/dist/src/commands/doctor.js.map +1 -0
  55. package/dist/src/commands/evaluate-helpers.d.ts +6 -0
  56. package/dist/src/commands/evaluate-helpers.d.ts.map +1 -0
  57. package/dist/src/commands/evaluate-helpers.js +13 -0
  58. package/dist/src/commands/evaluate-helpers.js.map +1 -0
  59. package/dist/src/commands/install.d.ts +118 -0
  60. package/dist/src/commands/install.d.ts.map +1 -0
  61. package/dist/src/commands/install.js +975 -0
  62. package/dist/src/commands/install.js.map +1 -0
  63. package/dist/src/commands/release.d.ts +7 -0
  64. package/dist/src/commands/release.d.ts.map +1 -0
  65. package/dist/src/commands/release.js +123 -0
  66. package/dist/src/commands/release.js.map +1 -0
  67. package/dist/src/commands/reset-connection.d.ts +17 -0
  68. package/dist/src/commands/reset-connection.d.ts.map +1 -0
  69. package/dist/src/commands/reset-connection.js +141 -0
  70. package/dist/src/commands/reset-connection.js.map +1 -0
  71. package/dist/src/commands/session-debug.d.ts +23 -0
  72. package/dist/src/commands/session-debug.d.ts.map +1 -0
  73. package/dist/src/commands/session-debug.js +267 -0
  74. package/dist/src/commands/session-debug.js.map +1 -0
  75. package/dist/src/commands/setup.d.ts +53 -0
  76. package/dist/src/commands/setup.d.ts.map +1 -0
  77. package/dist/src/commands/setup.js +249 -0
  78. package/dist/src/commands/setup.js.map +1 -0
  79. package/dist/src/config/store.d.ts +39 -0
  80. package/dist/src/config/store.d.ts.map +1 -0
  81. package/dist/src/config/store.js +290 -0
  82. package/dist/src/config/store.js.map +1 -0
  83. package/dist/src/daemon/access.d.ts +53 -0
  84. package/dist/src/daemon/access.d.ts.map +1 -0
  85. package/dist/src/daemon/access.js +87 -0
  86. package/dist/src/daemon/access.js.map +1 -0
  87. package/dist/src/daemon/bridge-envelope.d.ts +96 -0
  88. package/dist/src/daemon/bridge-envelope.d.ts.map +1 -0
  89. package/dist/src/daemon/bridge-envelope.js +235 -0
  90. package/dist/src/daemon/bridge-envelope.js.map +1 -0
  91. package/dist/src/daemon/utils.d.ts +43 -0
  92. package/dist/src/daemon/utils.d.ts.map +1 -0
  93. package/dist/src/daemon/utils.js +134 -0
  94. package/dist/src/daemon/utils.js.map +1 -0
  95. package/dist/src/errors.d.ts +60 -0
  96. package/dist/src/errors.d.ts.map +1 -0
  97. package/dist/src/errors.js +87 -0
  98. package/dist/src/errors.js.map +1 -0
  99. package/dist/src/local-bridge-timing.d.ts +31 -0
  100. package/dist/src/local-bridge-timing.d.ts.map +1 -0
  101. package/dist/src/local-bridge-timing.js +41 -0
  102. package/dist/src/local-bridge-timing.js.map +1 -0
  103. package/dist/src/obstacle-recovery/classify-script.d.ts +16 -0
  104. package/dist/src/obstacle-recovery/classify-script.d.ts.map +1 -0
  105. package/dist/src/obstacle-recovery/classify-script.js +53 -0
  106. package/dist/src/obstacle-recovery/classify-script.js.map +1 -0
  107. package/dist/src/obstacle-recovery/obstacle-classifier.d.ts +21 -0
  108. package/dist/src/obstacle-recovery/obstacle-classifier.d.ts.map +1 -0
  109. package/dist/src/obstacle-recovery/obstacle-classifier.js +37 -0
  110. package/dist/src/obstacle-recovery/obstacle-classifier.js.map +1 -0
  111. package/dist/src/obstacle-recovery/state-fingerprint.d.ts +26 -0
  112. package/dist/src/obstacle-recovery/state-fingerprint.d.ts.map +1 -0
  113. package/dist/src/obstacle-recovery/state-fingerprint.js +85 -0
  114. package/dist/src/obstacle-recovery/state-fingerprint.js.map +1 -0
  115. package/dist/src/obstacle-recovery/types.d.ts +44 -0
  116. package/dist/src/obstacle-recovery/types.d.ts.map +1 -0
  117. package/dist/src/obstacle-recovery/types.js +16 -0
  118. package/dist/src/obstacle-recovery/types.js.map +1 -0
  119. package/dist/src/output/formatter.d.ts +55 -0
  120. package/dist/src/output/formatter.d.ts.map +1 -0
  121. package/dist/src/output/formatter.js +55 -0
  122. package/dist/src/output/formatter.js.map +1 -0
  123. package/dist/src/output/mode.d.ts +11 -0
  124. package/dist/src/output/mode.d.ts.map +1 -0
  125. package/dist/src/output/mode.js +16 -0
  126. package/dist/src/output/mode.js.map +1 -0
  127. package/dist/src/protected-flow/detector.d.ts +26 -0
  128. package/dist/src/protected-flow/detector.d.ts.map +1 -0
  129. package/dist/src/protected-flow/detector.js +75 -0
  130. package/dist/src/protected-flow/detector.js.map +1 -0
  131. package/dist/src/protected-flow/types.d.ts +24 -0
  132. package/dist/src/protected-flow/types.d.ts.map +1 -0
  133. package/dist/src/protected-flow/types.js +28 -0
  134. package/dist/src/protected-flow/types.js.map +1 -0
  135. package/dist/src/session/agent-identity.d.ts +65 -0
  136. package/dist/src/session/agent-identity.d.ts.map +1 -0
  137. package/dist/src/session/agent-identity.js +133 -0
  138. package/dist/src/session/agent-identity.js.map +1 -0
  139. package/dist/src/session/cli-session-sync.d.ts +72 -0
  140. package/dist/src/session/cli-session-sync.d.ts.map +1 -0
  141. package/dist/src/session/cli-session-sync.js +244 -0
  142. package/dist/src/session/cli-session-sync.js.map +1 -0
  143. package/dist/src/session/context.d.ts +24 -0
  144. package/dist/src/session/context.d.ts.map +1 -0
  145. package/dist/src/session/context.js +165 -0
  146. package/dist/src/session/context.js.map +1 -0
  147. package/dist/src/session/continuity.d.ts +33 -0
  148. package/dist/src/session/continuity.d.ts.map +1 -0
  149. package/dist/src/session/continuity.js +179 -0
  150. package/dist/src/session/continuity.js.map +1 -0
  151. package/dist/src/session/errors.d.ts +9 -0
  152. package/dist/src/session/errors.d.ts.map +1 -0
  153. package/dist/src/session/errors.js +31 -0
  154. package/dist/src/session/errors.js.map +1 -0
  155. package/dist/src/session/local-continuity.d.ts +16 -0
  156. package/dist/src/session/local-continuity.d.ts.map +1 -0
  157. package/dist/src/session/local-continuity.js +146 -0
  158. package/dist/src/session/local-continuity.js.map +1 -0
  159. package/dist/src/session/signal-handler.d.ts +24 -0
  160. package/dist/src/session/signal-handler.d.ts.map +1 -0
  161. package/dist/src/session/signal-handler.js +35 -0
  162. package/dist/src/session/signal-handler.js.map +1 -0
  163. package/dist/src/shared/local-recovery-policy.d.ts +40 -0
  164. package/dist/src/shared/local-recovery-policy.d.ts.map +1 -0
  165. package/dist/src/shared/local-recovery-policy.js +59 -0
  166. package/dist/src/shared/local-recovery-policy.js.map +1 -0
  167. package/dist/src/shared/recovery-state.d.ts +3 -0
  168. package/dist/src/shared/recovery-state.d.ts.map +1 -0
  169. package/dist/src/shared/recovery-state.js +9 -0
  170. package/dist/src/shared/recovery-state.js.map +1 -0
  171. package/dist/src/types.d.ts +131 -0
  172. package/dist/src/types.d.ts.map +1 -0
  173. package/dist/src/types.js +5 -0
  174. package/dist/src/types.js.map +1 -0
  175. package/dist/src/utils.d.ts +50 -0
  176. package/dist/src/utils.d.ts.map +1 -0
  177. package/dist/src/utils.js +147 -0
  178. package/dist/src/utils.js.map +1 -0
  179. package/dist/src/working-location.d.ts +107 -0
  180. package/dist/src/working-location.d.ts.map +1 -0
  181. package/dist/src/working-location.js +651 -0
  182. package/dist/src/working-location.js.map +1 -0
  183. 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,6 @@
1
+ /**
2
+ * Stateless page cache — POST /api/cache/* (no browser session).
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function createCacheCommand(): Command;
6
+ //# sourceMappingURL=cache.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Cloud browser session management commands
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function createCloudCommand(): Command;
6
+ //# sourceMappingURL=cloud.d.ts.map
@@ -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"}