@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,637 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud API adapter - connects to thinkrun.io API
|
|
3
|
+
*/
|
|
4
|
+
import { ApiKeyError, ApiError, SessionError } from '../errors.js';
|
|
5
|
+
import { config } from '../config/store.js';
|
|
6
|
+
import { API_KEY_HELP_FALLBACK, isLocalApiUrl } from '../utils.js';
|
|
7
|
+
import { clearCloudSessionContext, getCloudSessionContext, setCloudSessionContext, } from '../session/context.js';
|
|
8
|
+
import { cloudCommandRequiresSessionError } from '../session/errors.js';
|
|
9
|
+
import { captureFingerprint, compareFingerprints } from '../obstacle-recovery/state-fingerprint.js';
|
|
10
|
+
import { classifyElementFailure } from '../obstacle-recovery/obstacle-classifier.js';
|
|
11
|
+
import { classifyFromStateCheck } from '../protected-flow/detector.js';
|
|
12
|
+
/** Tunable post-action settle delay (ms). React batches setState updates
|
|
13
|
+
* (~16ms); 50ms gives margin for async DOM mutations to settle. */
|
|
14
|
+
const POST_ACTION_SETTLE_MS = 50;
|
|
15
|
+
export class CloudAdapter {
|
|
16
|
+
baseUrl;
|
|
17
|
+
apiKey;
|
|
18
|
+
defaultTimeout = 60000; // 60 seconds
|
|
19
|
+
constructor(apiKey, baseUrl) {
|
|
20
|
+
this.apiKey = apiKey || config.get('apiKey') || '';
|
|
21
|
+
this.baseUrl = baseUrl || config.get('apiUrl') || 'https://api.thinkbrowse.io';
|
|
22
|
+
if (!this.apiKey) {
|
|
23
|
+
const health = config.getKeyHealth();
|
|
24
|
+
if (health.state === 'malformed') {
|
|
25
|
+
throw new ApiKeyError(`Stored API key is malformed and was quarantined (${health.quarantinedMasked}). It may have been overwritten (e.g. by browser autofill).`, 'API_KEY_MALFORMED', 'Set a valid key: thinkrun config set-key <your-api-key>. Diagnose with: thinkrun doctor', 401);
|
|
26
|
+
}
|
|
27
|
+
throw new ApiKeyError('API key not configured', 'API_KEY_MISSING', 'Run: thinkrun config set-key <your-api-key>', 401);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async request(path, options = {}, retries = 3) {
|
|
31
|
+
const url = `${this.baseUrl}${path}`;
|
|
32
|
+
const headers = {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'x-api-key': this.apiKey,
|
|
35
|
+
...options.headers,
|
|
36
|
+
};
|
|
37
|
+
const fetchTimeout = options.timeoutMs ?? this.defaultTimeout;
|
|
38
|
+
try {
|
|
39
|
+
const response = await fetch(url, {
|
|
40
|
+
method: options.method || 'GET',
|
|
41
|
+
headers,
|
|
42
|
+
body: options.body,
|
|
43
|
+
signal: AbortSignal.timeout(fetchTimeout),
|
|
44
|
+
});
|
|
45
|
+
const text = await response.text();
|
|
46
|
+
let data = {};
|
|
47
|
+
if (text) {
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(text);
|
|
50
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
51
|
+
data = parsed;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Non-JSON body — leave data {} and use raw text for 401 below
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const errStr = typeof data.error === 'string' ? data.error : '';
|
|
60
|
+
const msgStr = typeof data.message === 'string' ? data.message : '';
|
|
61
|
+
const codeStr = typeof data.code === 'string' ? data.code : '';
|
|
62
|
+
if (errStr === 'INSUFFICIENT_SCOPE' || codeStr === 'INSUFFICIENT_SCOPE') {
|
|
63
|
+
const msg = msgStr || 'This feature requires a paid plan.';
|
|
64
|
+
const upgradeUrl = typeof data.upgradeUrl === 'string' ? data.upgradeUrl : 'https://thinkbrowse.io/billing';
|
|
65
|
+
throw new ApiError(msg, response.status, undefined, 'INSUFFICIENT_SCOPE', undefined, upgradeUrl);
|
|
66
|
+
}
|
|
67
|
+
if (response.status === 401) {
|
|
68
|
+
const localPrimary = isLocalApiUrl(this.baseUrl)
|
|
69
|
+
? `Local endpoint detected (${this.baseUrl}). Set key to mech-browser-service TEST_API_KEY (often "ak_..."): thinkrun config set-key <TEST_API_KEY>`
|
|
70
|
+
: 'Check your API key with: thinkrun config show';
|
|
71
|
+
const suggestion = `${localPrimary}. ${API_KEY_HELP_FALLBACK}`;
|
|
72
|
+
let serverLine = msgStr || errStr;
|
|
73
|
+
if (!serverLine && text) {
|
|
74
|
+
const t = text.trim();
|
|
75
|
+
if (t && !t.startsWith('<')) {
|
|
76
|
+
serverLine = t.slice(0, 500);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const message = serverLine ? `Authentication failed: ${serverLine}` : 'Authentication failed';
|
|
80
|
+
// Well-formed key, server said no — distinct from missing/malformed.
|
|
81
|
+
throw new ApiKeyError(message, 'API_KEY_REJECTED', suggestion, 401);
|
|
82
|
+
}
|
|
83
|
+
if (response.status === 404) {
|
|
84
|
+
throw new SessionError(errStr || 'Session not found', 'The session may have expired. Create a new one with: thinkrun cloud start');
|
|
85
|
+
}
|
|
86
|
+
const hint = typeof data.hint === 'string' ? data.hint : undefined;
|
|
87
|
+
const errMessage = errStr || msgStr || 'API request failed';
|
|
88
|
+
throw new ApiError(errMessage, response.status, hint, codeStr || undefined);
|
|
89
|
+
}
|
|
90
|
+
if (!text) {
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
return JSON.parse(text);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new ApiError('Invalid JSON response', response.status);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// Retry on transient errors
|
|
102
|
+
if (retries > 0 && (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.status === 502 || error.status === 503)) {
|
|
103
|
+
await this.sleep(Math.pow(2, 3 - retries) * 1000);
|
|
104
|
+
return this.request(path, options, retries - 1);
|
|
105
|
+
}
|
|
106
|
+
// Re-throw our custom errors
|
|
107
|
+
if (error instanceof ApiError || error instanceof SessionError) {
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
// Wrap unknown errors
|
|
111
|
+
throw new ApiError(error.message || 'Network request failed', undefined, 'Check your internet connection');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
sleep(ms) {
|
|
115
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
116
|
+
}
|
|
117
|
+
getActiveSessionId() {
|
|
118
|
+
const sessionId = getCloudSessionContext()?.sessionId;
|
|
119
|
+
if (!sessionId) {
|
|
120
|
+
const localTip = isLocalApiUrl(this.baseUrl)
|
|
121
|
+
? 'Local server may have sessions already. Run: thinkrun cloud list, then select one: thinkrun cloud use <sessionId>'
|
|
122
|
+
: 'Start a session with: thinkrun cloud start';
|
|
123
|
+
const error = cloudCommandRequiresSessionError();
|
|
124
|
+
error.suggestion = localTip;
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
return sessionId;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Capture a state fingerprint via evaluate. Returns null if capture fails
|
|
131
|
+
* (never throws — fingerprint failures must not block the primary action).
|
|
132
|
+
*/
|
|
133
|
+
async tryCaptureFP() {
|
|
134
|
+
let timerId;
|
|
135
|
+
try {
|
|
136
|
+
const timeoutPromise = new Promise(r => { timerId = setTimeout(() => r(null), 3000); });
|
|
137
|
+
return await Promise.race([
|
|
138
|
+
captureFingerprint(async (script) => {
|
|
139
|
+
const result = await this.evaluate(script);
|
|
140
|
+
return result.data;
|
|
141
|
+
}),
|
|
142
|
+
timeoutPromise,
|
|
143
|
+
]);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
if (timerId)
|
|
150
|
+
clearTimeout(timerId);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Compare pre/post fingerprints and return a BlockedOutcome if the action
|
|
155
|
+
* had no effect. Returns null if state changed or fingerprints are unavailable.
|
|
156
|
+
*/
|
|
157
|
+
checkForNoOp(actionType, pre, post) {
|
|
158
|
+
if (!pre || !post)
|
|
159
|
+
return null;
|
|
160
|
+
// Guard against false positives: if both are empty fallback fingerprints
|
|
161
|
+
// (capture failed for both), skip comparison — we have no real data.
|
|
162
|
+
if (!pre.url && !post.url)
|
|
163
|
+
return null;
|
|
164
|
+
const comparison = compareFingerprints(pre, post);
|
|
165
|
+
if (comparison === 'unchanged') {
|
|
166
|
+
return classifyFromStateCheck(actionType, pre, post);
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Check if an API error indicates an element-not-found condition.
|
|
172
|
+
*/
|
|
173
|
+
isElementNotFound(error) {
|
|
174
|
+
if (error instanceof ApiError) {
|
|
175
|
+
if (error.statusCode === 404 || error.nativeCode === 'ELEMENT_NOT_FOUND')
|
|
176
|
+
return true;
|
|
177
|
+
const msg = error.message.toLowerCase();
|
|
178
|
+
return msg.includes('element not found') || msg.includes('element_not_found');
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* If the error is an element-not-found, classify the obstacle and throw
|
|
184
|
+
* an enriched ApiError with obstacleType. Otherwise does nothing.
|
|
185
|
+
* @throws {ApiError} with obstacleType when element-not-found is detected
|
|
186
|
+
*/
|
|
187
|
+
async throwIfElementNotFound(error, selector) {
|
|
188
|
+
if (!this.isElementNotFound(error))
|
|
189
|
+
return;
|
|
190
|
+
try {
|
|
191
|
+
const obstacleType = await classifyElementFailure(selector, async (script) => {
|
|
192
|
+
const result = await this.evaluate(script);
|
|
193
|
+
return result.data;
|
|
194
|
+
});
|
|
195
|
+
const enrichedError = error instanceof ApiError
|
|
196
|
+
? error
|
|
197
|
+
: new ApiError(error.message ?? 'Element not found', 404);
|
|
198
|
+
enrichedError.obstacleType = obstacleType;
|
|
199
|
+
throw enrichedError;
|
|
200
|
+
}
|
|
201
|
+
catch (classifyErr) {
|
|
202
|
+
// Re-throw enriched errors — only swallow classification-internal failures
|
|
203
|
+
if (classifyErr instanceof ApiError && classifyErr.obstacleType) {
|
|
204
|
+
throw classifyErr;
|
|
205
|
+
}
|
|
206
|
+
// Classification failed — let the original error propagate
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// --- Session Management ---
|
|
210
|
+
async startSession(options = {}) {
|
|
211
|
+
const response = await this.request('/api/sessions', {
|
|
212
|
+
method: 'POST',
|
|
213
|
+
body: JSON.stringify({
|
|
214
|
+
browser: options.browser || config.get('defaultBrowser') || 'chromium',
|
|
215
|
+
proxyRotation: options.proxy ? { enabled: true } : undefined,
|
|
216
|
+
stealth: options.stealth,
|
|
217
|
+
headless: options.headless !== false,
|
|
218
|
+
}),
|
|
219
|
+
});
|
|
220
|
+
const sessionId = response.sessionId || response.data?.sessionId;
|
|
221
|
+
const status = response.status || response.data?.status;
|
|
222
|
+
if (!sessionId || !status) {
|
|
223
|
+
throw new ApiError('Invalid session response from API');
|
|
224
|
+
}
|
|
225
|
+
const session = {
|
|
226
|
+
sessionId,
|
|
227
|
+
status: status,
|
|
228
|
+
createdAt: new Date().toISOString(),
|
|
229
|
+
};
|
|
230
|
+
setCloudSessionContext(session.sessionId);
|
|
231
|
+
return session;
|
|
232
|
+
}
|
|
233
|
+
async waitForSessionReady(sessionId, timeout = 90000) {
|
|
234
|
+
const pollInterval = 2000;
|
|
235
|
+
const startTime = Date.now();
|
|
236
|
+
const terminalStatuses = ['active', 'ready', 'running', 'error', 'failed', 'terminated', 'closed'];
|
|
237
|
+
while (Date.now() - startTime < timeout) {
|
|
238
|
+
const session = await this.getSession(sessionId);
|
|
239
|
+
if (terminalStatuses.includes(session.status)) {
|
|
240
|
+
if (['error', 'failed', 'terminated', 'closed'].includes(session.status)) {
|
|
241
|
+
throw new SessionError(`Session entered ${session.status} state during provisioning`, 'Try creating a new session with: thinkrun cloud start');
|
|
242
|
+
}
|
|
243
|
+
return session;
|
|
244
|
+
}
|
|
245
|
+
await this.sleep(pollInterval);
|
|
246
|
+
}
|
|
247
|
+
throw new SessionError('Session provisioning timed out', 'The session may still be starting. Check with: thinkrun cloud status');
|
|
248
|
+
}
|
|
249
|
+
async stopSession(sessionId) {
|
|
250
|
+
const id = sessionId || this.getActiveSessionId();
|
|
251
|
+
await this.request(`/api/sessions/${id}`, {
|
|
252
|
+
method: 'DELETE',
|
|
253
|
+
});
|
|
254
|
+
if (id === getCloudSessionContext()?.sessionId) {
|
|
255
|
+
clearCloudSessionContext(id);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
async getSession(sessionId) {
|
|
259
|
+
const response = await this.request(`/api/sessions/${sessionId}`);
|
|
260
|
+
if (response?.data)
|
|
261
|
+
return response.data;
|
|
262
|
+
return response;
|
|
263
|
+
}
|
|
264
|
+
async listSessions() {
|
|
265
|
+
const response = await this.request('/api/sessions?includeTerminated=false');
|
|
266
|
+
// Handle both array and { sessions: [] } response shapes
|
|
267
|
+
if (Array.isArray(response))
|
|
268
|
+
return response;
|
|
269
|
+
if (response.data?.sessions)
|
|
270
|
+
return response.data.sessions;
|
|
271
|
+
return response.sessions || [];
|
|
272
|
+
}
|
|
273
|
+
async listArtifacts(sessionId) {
|
|
274
|
+
return this.request(`/api/sessions/${sessionId}/artifacts`);
|
|
275
|
+
}
|
|
276
|
+
// --- Navigation ---
|
|
277
|
+
async navigate(url, options = {}) {
|
|
278
|
+
const sessionId = this.getActiveSessionId();
|
|
279
|
+
const response = await this.request(`/api/sessions/${sessionId}/navigate`, {
|
|
280
|
+
method: 'POST',
|
|
281
|
+
body: JSON.stringify({
|
|
282
|
+
url,
|
|
283
|
+
waitUntil: options.waitUntil || 'load',
|
|
284
|
+
timeout: options.timeout,
|
|
285
|
+
}),
|
|
286
|
+
});
|
|
287
|
+
return {
|
|
288
|
+
success: response.success,
|
|
289
|
+
data: {
|
|
290
|
+
url: response.url,
|
|
291
|
+
title: response.title,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
async goBack() {
|
|
296
|
+
const sessionId = this.getActiveSessionId();
|
|
297
|
+
return this.request(`/api/sessions/${sessionId}/go-back`, {
|
|
298
|
+
method: 'POST',
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
async goForward() {
|
|
302
|
+
const sessionId = this.getActiveSessionId();
|
|
303
|
+
return this.request(`/api/sessions/${sessionId}/go-forward`, {
|
|
304
|
+
method: 'POST',
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
// --- Interaction ---
|
|
308
|
+
async click(selector, options = {}) {
|
|
309
|
+
const sessionId = this.getActiveSessionId();
|
|
310
|
+
const preFP = await this.tryCaptureFP();
|
|
311
|
+
let response;
|
|
312
|
+
try {
|
|
313
|
+
response = await this.request(`/api/sessions/${sessionId}/click`, {
|
|
314
|
+
method: 'POST',
|
|
315
|
+
body: JSON.stringify({
|
|
316
|
+
selector,
|
|
317
|
+
button: options.button || 'left',
|
|
318
|
+
clickCount: options.count || 1,
|
|
319
|
+
delay: options.delay,
|
|
320
|
+
timeout: options.timeout || 15000,
|
|
321
|
+
}),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
await this.throwIfElementNotFound(error, selector);
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
// State verification: detect no-op actions
|
|
329
|
+
try {
|
|
330
|
+
if (POST_ACTION_SETTLE_MS > 0)
|
|
331
|
+
await this.sleep(POST_ACTION_SETTLE_MS);
|
|
332
|
+
const postFP = await this.tryCaptureFP();
|
|
333
|
+
const blocked = this.checkForNoOp('click', preFP, postFP);
|
|
334
|
+
if (blocked)
|
|
335
|
+
return { success: false, data: blocked };
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
// Fingerprint comparison failed — proceed with normal result
|
|
339
|
+
}
|
|
340
|
+
return { success: response.success };
|
|
341
|
+
}
|
|
342
|
+
async type(selector, text, options = {}) {
|
|
343
|
+
const sessionId = this.getActiveSessionId();
|
|
344
|
+
const preFP = await this.tryCaptureFP();
|
|
345
|
+
let response;
|
|
346
|
+
try {
|
|
347
|
+
response = await this.request(`/api/sessions/${sessionId}/type`, {
|
|
348
|
+
method: 'POST',
|
|
349
|
+
body: JSON.stringify({
|
|
350
|
+
selector,
|
|
351
|
+
text,
|
|
352
|
+
delay: options.delay,
|
|
353
|
+
}),
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
await this.throwIfElementNotFound(error, selector);
|
|
358
|
+
throw error;
|
|
359
|
+
}
|
|
360
|
+
// State verification: detect no-op actions
|
|
361
|
+
try {
|
|
362
|
+
if (POST_ACTION_SETTLE_MS > 0)
|
|
363
|
+
await this.sleep(POST_ACTION_SETTLE_MS);
|
|
364
|
+
const postFP = await this.tryCaptureFP();
|
|
365
|
+
const blocked = this.checkForNoOp('type', preFP, postFP);
|
|
366
|
+
if (blocked)
|
|
367
|
+
return { success: false, data: blocked };
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// Fingerprint comparison failed — proceed with normal result
|
|
371
|
+
}
|
|
372
|
+
return { success: response.success };
|
|
373
|
+
}
|
|
374
|
+
async fill(selector, value) {
|
|
375
|
+
const sessionId = this.getActiveSessionId();
|
|
376
|
+
const preFP = await this.tryCaptureFP();
|
|
377
|
+
let response;
|
|
378
|
+
try {
|
|
379
|
+
response = await this.request(`/api/sessions/${sessionId}/fill`, {
|
|
380
|
+
method: 'POST',
|
|
381
|
+
body: JSON.stringify({ selector, value }),
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
await this.throwIfElementNotFound(error, selector);
|
|
386
|
+
throw error;
|
|
387
|
+
}
|
|
388
|
+
// State verification: detect no-op actions
|
|
389
|
+
try {
|
|
390
|
+
if (POST_ACTION_SETTLE_MS > 0)
|
|
391
|
+
await this.sleep(POST_ACTION_SETTLE_MS);
|
|
392
|
+
const postFP = await this.tryCaptureFP();
|
|
393
|
+
const blocked = this.checkForNoOp('fill', preFP, postFP);
|
|
394
|
+
if (blocked)
|
|
395
|
+
return { success: false, data: blocked };
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
// Fingerprint comparison failed — proceed with normal result
|
|
399
|
+
}
|
|
400
|
+
return { success: response.success };
|
|
401
|
+
}
|
|
402
|
+
async press(key) {
|
|
403
|
+
const sessionId = this.getActiveSessionId();
|
|
404
|
+
const response = await this.request(`/api/sessions/${sessionId}/press`, {
|
|
405
|
+
method: 'POST',
|
|
406
|
+
body: JSON.stringify({ key }),
|
|
407
|
+
});
|
|
408
|
+
return { success: response.success };
|
|
409
|
+
}
|
|
410
|
+
async scroll(options) {
|
|
411
|
+
const sessionId = this.getActiveSessionId();
|
|
412
|
+
const response = await this.request(`/api/sessions/${sessionId}/scroll`, {
|
|
413
|
+
method: 'POST',
|
|
414
|
+
body: JSON.stringify(options),
|
|
415
|
+
});
|
|
416
|
+
return { success: response.success };
|
|
417
|
+
}
|
|
418
|
+
async hover(selector) {
|
|
419
|
+
const sessionId = this.getActiveSessionId();
|
|
420
|
+
try {
|
|
421
|
+
const response = await this.request(`/api/sessions/${sessionId}/hover`, {
|
|
422
|
+
method: 'POST',
|
|
423
|
+
body: JSON.stringify({ selector }),
|
|
424
|
+
});
|
|
425
|
+
return { success: response.success };
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
await this.throwIfElementNotFound(error, selector);
|
|
429
|
+
throw error;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
async select(selector, value) {
|
|
433
|
+
const sessionId = this.getActiveSessionId();
|
|
434
|
+
const preFP = await this.tryCaptureFP();
|
|
435
|
+
let response;
|
|
436
|
+
try {
|
|
437
|
+
response = await this.request(`/api/sessions/${sessionId}/select`, {
|
|
438
|
+
method: 'POST',
|
|
439
|
+
body: JSON.stringify({ selector, value }),
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
await this.throwIfElementNotFound(error, selector);
|
|
444
|
+
throw error;
|
|
445
|
+
}
|
|
446
|
+
// State verification: detect no-op actions
|
|
447
|
+
try {
|
|
448
|
+
if (POST_ACTION_SETTLE_MS > 0)
|
|
449
|
+
await this.sleep(POST_ACTION_SETTLE_MS);
|
|
450
|
+
const postFP = await this.tryCaptureFP();
|
|
451
|
+
const blocked = this.checkForNoOp('select', preFP, postFP);
|
|
452
|
+
if (blocked)
|
|
453
|
+
return { success: false, data: blocked };
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
// Fingerprint comparison failed — proceed with normal result
|
|
457
|
+
}
|
|
458
|
+
return { success: response.success };
|
|
459
|
+
}
|
|
460
|
+
// --- Waiting ---
|
|
461
|
+
async wait(condition, options = {}) {
|
|
462
|
+
// If condition is a number, it's a timeout in ms
|
|
463
|
+
if (typeof condition === 'number') {
|
|
464
|
+
await this.sleep(condition);
|
|
465
|
+
return { success: true };
|
|
466
|
+
}
|
|
467
|
+
// Use the dedicated wait endpoint
|
|
468
|
+
const sessionId = this.getActiveSessionId();
|
|
469
|
+
const state = options.hidden ? 'hidden' : options.visible ? 'visible' : 'visible';
|
|
470
|
+
return this.request(`/api/sessions/${sessionId}/wait`, {
|
|
471
|
+
method: 'POST',
|
|
472
|
+
body: JSON.stringify({
|
|
473
|
+
selector: condition,
|
|
474
|
+
state,
|
|
475
|
+
timeout: options.timeout || 30000,
|
|
476
|
+
}),
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
async waitForText(text, options = {}) {
|
|
480
|
+
const sessionId = this.getActiveSessionId();
|
|
481
|
+
return this.request(`/api/sessions/${sessionId}/wait-for-text`, {
|
|
482
|
+
method: 'POST',
|
|
483
|
+
body: JSON.stringify({
|
|
484
|
+
text,
|
|
485
|
+
timeout: options.timeout || 30000,
|
|
486
|
+
}),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
// --- Observation ---
|
|
490
|
+
async snapshot() {
|
|
491
|
+
const sessionId = this.getActiveSessionId();
|
|
492
|
+
const response = await this.request(`/api/sessions/${sessionId}/snapshot`, { method: 'POST' });
|
|
493
|
+
return {
|
|
494
|
+
success: response.success,
|
|
495
|
+
data: response.snapshot,
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
async screenshot(options = {}) {
|
|
499
|
+
const sessionId = this.getActiveSessionId();
|
|
500
|
+
const response = await this.request(`/api/sessions/${sessionId}/screenshot`, {
|
|
501
|
+
method: 'POST',
|
|
502
|
+
body: JSON.stringify({
|
|
503
|
+
fullPage: options.fullPage,
|
|
504
|
+
selector: options.selector,
|
|
505
|
+
type: options.format || 'png',
|
|
506
|
+
quality: options.quality,
|
|
507
|
+
upload: true,
|
|
508
|
+
maxDimension: options.maxDimension,
|
|
509
|
+
}),
|
|
510
|
+
});
|
|
511
|
+
return {
|
|
512
|
+
success: response.success,
|
|
513
|
+
data: {
|
|
514
|
+
url: response.publicUrl,
|
|
515
|
+
artifactId: response.artifactId,
|
|
516
|
+
},
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
async extract(selector, options = {}) {
|
|
520
|
+
const sessionId = this.getActiveSessionId();
|
|
521
|
+
const response = await this.request(`/api/sessions/${sessionId}/extract`, {
|
|
522
|
+
method: 'POST',
|
|
523
|
+
body: JSON.stringify({
|
|
524
|
+
selector,
|
|
525
|
+
type: options.attr ? 'attribute' : options.format || 'text',
|
|
526
|
+
attribute: options.attr,
|
|
527
|
+
multiple: options.all,
|
|
528
|
+
}),
|
|
529
|
+
});
|
|
530
|
+
return {
|
|
531
|
+
success: response.success,
|
|
532
|
+
data: response.data,
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
async evaluate(script, args = [], evalOpts) {
|
|
536
|
+
const sessionId = this.getActiveSessionId();
|
|
537
|
+
const timeoutMs = evalOpts?.timeout ?? 30_000;
|
|
538
|
+
const response = await this.request(`/api/sessions/${sessionId}/evaluate`, {
|
|
539
|
+
method: 'POST',
|
|
540
|
+
body: JSON.stringify({ script, args, timeout: timeoutMs }),
|
|
541
|
+
timeoutMs: Math.min(timeoutMs + 30_000, 630_000),
|
|
542
|
+
});
|
|
543
|
+
return {
|
|
544
|
+
success: response.success,
|
|
545
|
+
data: response.result,
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
async getUrl() {
|
|
549
|
+
// Cloud mode has no local tab-lease distinction, so these read-only
|
|
550
|
+
// convenience helpers still delegate to the underlying evaluate primitive.
|
|
551
|
+
return this.evaluate('window.location.href');
|
|
552
|
+
}
|
|
553
|
+
async getTitle() {
|
|
554
|
+
return this.evaluate('document.title');
|
|
555
|
+
}
|
|
556
|
+
async getHtml() {
|
|
557
|
+
return this.evaluate('document.documentElement.outerHTML');
|
|
558
|
+
}
|
|
559
|
+
// --- Dialog Handling ---
|
|
560
|
+
async getDialog() {
|
|
561
|
+
const sessionId = this.getActiveSessionId();
|
|
562
|
+
return this.request(`/api/sessions/${sessionId}/dialog`);
|
|
563
|
+
}
|
|
564
|
+
async handleDialog(action, promptText) {
|
|
565
|
+
const sessionId = this.getActiveSessionId();
|
|
566
|
+
return this.request(`/api/sessions/${sessionId}/dialog`, {
|
|
567
|
+
method: 'POST',
|
|
568
|
+
body: JSON.stringify({ accept: action === 'accept', promptText }),
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
// --- Monitoring ---
|
|
572
|
+
async getConsoleMessages() {
|
|
573
|
+
const sessionId = this.getActiveSessionId();
|
|
574
|
+
const result = await this.request(`/api/sessions/${sessionId}/console`);
|
|
575
|
+
return {
|
|
576
|
+
success: result.success,
|
|
577
|
+
logs: result.data?.logs || [],
|
|
578
|
+
count: result.data?.count || 0,
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
async getNetworkRequests() {
|
|
582
|
+
const sessionId = this.getActiveSessionId();
|
|
583
|
+
const result = await this.request(`/api/sessions/${sessionId}/network`);
|
|
584
|
+
return {
|
|
585
|
+
success: result.success,
|
|
586
|
+
requests: result.data?.requests || [],
|
|
587
|
+
count: result.data?.count || 0,
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
async clearLogs() {
|
|
591
|
+
const sessionId = this.getActiveSessionId();
|
|
592
|
+
const response = await this.request(`/api/sessions/${sessionId}/clear-logs`, { method: 'POST', body: JSON.stringify({}) });
|
|
593
|
+
return { success: response.success };
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Stateless page cache — no session. POST /api/cache/{html|text|screenshot}
|
|
597
|
+
*/
|
|
598
|
+
async pageCache(format, url, options) {
|
|
599
|
+
this.assertAbsoluteHttpUrl('url', url);
|
|
600
|
+
const proxy = options?.proxy;
|
|
601
|
+
if (proxy && typeof proxy === 'object' && proxy !== null && 'server' in proxy) {
|
|
602
|
+
const server = proxy.server;
|
|
603
|
+
if (typeof server === 'string' && server.length > 0) {
|
|
604
|
+
this.assertAbsoluteHttpUrl('proxy.server', server);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
const data = await this.request(`/api/cache/${format}`, {
|
|
608
|
+
method: 'POST',
|
|
609
|
+
body: JSON.stringify({ url, options }),
|
|
610
|
+
headers: { Accept: 'application/json' },
|
|
611
|
+
});
|
|
612
|
+
if (data && typeof data === 'object' && data.success === false) {
|
|
613
|
+
const hint = typeof data.hint === 'string'
|
|
614
|
+
? (data.hint)
|
|
615
|
+
: undefined;
|
|
616
|
+
throw new ApiError(String(data.error || 'Page cache failed'), typeof data.status === 'number'
|
|
617
|
+
? data.status
|
|
618
|
+
: 502, hint);
|
|
619
|
+
}
|
|
620
|
+
return data;
|
|
621
|
+
}
|
|
622
|
+
/** Reject relative or non-http(s) URLs before the request (aligned with service validation). */
|
|
623
|
+
assertAbsoluteHttpUrl(label, value) {
|
|
624
|
+
try {
|
|
625
|
+
const parsed = new URL(value);
|
|
626
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
627
|
+
throw new ApiError(`${label} must use http or https`, 400, 'Use a full URL like https://example.com/path');
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
catch (e) {
|
|
631
|
+
if (e instanceof ApiError)
|
|
632
|
+
throw e;
|
|
633
|
+
throw new ApiError(`Invalid ${label}`, 400, 'Use a full URL including https://');
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../../src/adapters/cloud.ts"],"names":[],"mappings":"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"}
|