@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,332 @@
1
+ /**
2
+ * Cloud browser session management commands
3
+ */
4
+ import { Command } from 'commander';
5
+ import chalk from 'chalk';
6
+ import { CloudAdapter } from '../adapters/cloud.js';
7
+ import { isJsonMode } from '../output/mode.js';
8
+ import { handleError } from '../utils.js';
9
+ import { emitJson, createSpinner } from '../output/formatter.js';
10
+ import { getCloudSessionContext, setCloudSessionContext } from '../session/context.js';
11
+ export function createCloudCommand() {
12
+ const cloudCmd = new Command('cloud')
13
+ .description('Manage cloud browser sessions');
14
+ // cloud start
15
+ cloudCmd
16
+ .command('start')
17
+ .description('Start a new cloud browser session')
18
+ .option('-b, --browser <type>', 'Browser type (chromium|firefox|webkit)', 'chromium')
19
+ .option('--proxy', 'Enable proxy rotation')
20
+ .option('--stealth', 'Enable stealth mode (anti-detection)')
21
+ .option('--headless', 'Run in headless mode', true)
22
+ .option('--no-wait', 'Return immediately without waiting for session to be ready')
23
+ .action(async (options) => {
24
+ const startMs = Date.now();
25
+ const spinner = createSpinner('Starting cloud browser session...');
26
+ try {
27
+ const adapter = new CloudAdapter();
28
+ const sessionOptions = {
29
+ browser: options.browser,
30
+ proxy: options.proxy,
31
+ stealth: options.stealth,
32
+ headless: options.headless,
33
+ };
34
+ const session = await adapter.startSession(sessionOptions);
35
+ // Wait for session to be ready unless --no-wait is passed
36
+ if (options.wait !== false) {
37
+ spinner.text = `Provisioning session ${session.sessionId.slice(0, 8)}...`;
38
+ const readySession = await adapter.waitForSessionReady(session.sessionId);
39
+ if (isJsonMode()) {
40
+ emitJson({ success: true, command: 'cloud start', durationMs: Date.now() - startMs,
41
+ data: { sessionId: readySession.sessionId, browser: options.browser, status: readySession.status,
42
+ currentUrl: readySession.currentUrl ?? null } });
43
+ return;
44
+ }
45
+ spinner.succeed('Cloud browser session ready');
46
+ console.log('');
47
+ console.log(' Session ID:', chalk.cyan(readySession.sessionId));
48
+ console.log(' Browser: ', chalk.cyan(options.browser));
49
+ console.log(' Status: ', chalk.green(readySession.status));
50
+ if (readySession.currentUrl) {
51
+ console.log(' URL: ', chalk.cyan(readySession.currentUrl));
52
+ }
53
+ }
54
+ else {
55
+ if (isJsonMode()) {
56
+ emitJson({ success: true, command: 'cloud start', durationMs: Date.now() - startMs,
57
+ data: { sessionId: session.sessionId, browser: options.browser, status: session.status } });
58
+ return;
59
+ }
60
+ spinner.succeed('Cloud browser session created');
61
+ console.log('');
62
+ console.log(' Session ID:', chalk.cyan(session.sessionId));
63
+ console.log(' Browser: ', chalk.cyan(options.browser));
64
+ console.log(' Status: ', chalk.yellow(session.status));
65
+ }
66
+ if (options.proxy)
67
+ console.log(' Proxy: ', chalk.yellow('enabled'));
68
+ if (options.stealth)
69
+ console.log(' Stealth: ', chalk.yellow('enabled'));
70
+ console.log('');
71
+ console.log(chalk.gray('This session is now active. Run browser commands without --session flag.'));
72
+ }
73
+ catch (error) {
74
+ spinner.fail('Failed to start session');
75
+ handleError(error, 'cloud start', startMs);
76
+ }
77
+ });
78
+ // cloud stop
79
+ cloudCmd
80
+ .command('stop')
81
+ .description('Stop the active cloud browser session')
82
+ .option('-s, --session <id>', 'Session ID (defaults to active session)')
83
+ .option('--all', 'Stop all active sessions')
84
+ .action(async (options) => {
85
+ const startMs = Date.now();
86
+ try {
87
+ const adapter = new CloudAdapter();
88
+ if (options.all) {
89
+ const spinner = createSpinner('Stopping all sessions...');
90
+ const sessions = await adapter.listSessions();
91
+ if (sessions.length === 0) {
92
+ if (isJsonMode()) {
93
+ emitJson({ success: true, command: 'cloud stop', durationMs: Date.now() - startMs,
94
+ data: { stopped: 0, sessions: [] } });
95
+ return;
96
+ }
97
+ spinner.stop();
98
+ console.log(chalk.gray('No active sessions to stop'));
99
+ return;
100
+ }
101
+ const sessionIds = sessions.map((s) => s.sessionId);
102
+ for (const session of sessions) {
103
+ await adapter.stopSession(session.sessionId);
104
+ }
105
+ if (isJsonMode()) {
106
+ emitJson({ success: true, command: 'cloud stop', durationMs: Date.now() - startMs,
107
+ data: { stopped: sessions.length, sessions: sessionIds } });
108
+ return;
109
+ }
110
+ spinner.succeed(`Stopped ${sessions.length} session(s)`);
111
+ }
112
+ else {
113
+ const sessionId = options.session || getCloudSessionContext()?.sessionId;
114
+ if (!sessionId) {
115
+ const msg = 'No active session. Start one with: thinkrun cloud start';
116
+ if (isJsonMode()) {
117
+ process.stderr.write(JSON.stringify({ success: false, command: 'cloud stop',
118
+ error: 'No active session', code: 'SESSION_ERROR', hint: msg }) + '\n');
119
+ process.exit(1);
120
+ }
121
+ console.error(chalk.red('Error:'), 'No active session');
122
+ console.error(chalk.yellow('Tip:'), 'Start one with: thinkrun cloud start');
123
+ process.exit(1);
124
+ }
125
+ const spinner = createSpinner(`Stopping session ${sessionId.slice(0, 8)}...`);
126
+ await adapter.stopSession(sessionId);
127
+ if (isJsonMode()) {
128
+ emitJson({ success: true, command: 'cloud stop', durationMs: Date.now() - startMs,
129
+ data: { stopped: 1, sessionId } });
130
+ return;
131
+ }
132
+ spinner.succeed('Session stopped');
133
+ }
134
+ }
135
+ catch (error) {
136
+ handleError(error, 'cloud stop', startMs);
137
+ }
138
+ });
139
+ // cloud list
140
+ cloudCmd
141
+ .command('list')
142
+ .description('List all active cloud browser sessions')
143
+ .action(async () => {
144
+ const startMs = Date.now();
145
+ const spinner = createSpinner('Fetching sessions...');
146
+ try {
147
+ const adapter = new CloudAdapter();
148
+ const sessions = await adapter.listSessions();
149
+ if (isJsonMode()) {
150
+ emitJson({ success: true, command: 'cloud list', durationMs: Date.now() - startMs,
151
+ data: { sessions, count: sessions.length } });
152
+ return;
153
+ }
154
+ spinner.stop();
155
+ if (sessions.length === 0) {
156
+ console.log(chalk.gray('No active sessions'));
157
+ console.log('');
158
+ console.log('Start one with:', chalk.cyan('thinkrun cloud start'));
159
+ return;
160
+ }
161
+ console.log('');
162
+ console.log(chalk.bold(`Active Sessions (${sessions.length}):`));
163
+ console.log('');
164
+ const activeSessionId = getCloudSessionContext()?.sessionId;
165
+ for (const session of sessions) {
166
+ const isActive = session.sessionId === activeSessionId;
167
+ const prefix = isActive ? chalk.green('●') : chalk.gray('○');
168
+ const id = session.sessionId.slice(0, 8) + '...';
169
+ console.log(`${prefix} ${chalk.cyan(id)} ${session.status.padEnd(10)} ${session.currentUrl || '(no URL)'}`);
170
+ }
171
+ console.log('');
172
+ if (activeSessionId) {
173
+ console.log(chalk.gray('● = active session'));
174
+ }
175
+ }
176
+ catch (error) {
177
+ spinner.fail('Failed to list sessions');
178
+ handleError(error, 'cloud list', startMs);
179
+ }
180
+ });
181
+ // cloud status
182
+ cloudCmd
183
+ .command('status')
184
+ .description('Show status of the active cloud browser session')
185
+ .option('-s, --session <id>', 'Session ID (defaults to active session)')
186
+ .action(async (options) => {
187
+ const startMs = Date.now();
188
+ try {
189
+ const adapter = new CloudAdapter();
190
+ const sessionId = options.session || getCloudSessionContext()?.sessionId;
191
+ if (!sessionId) {
192
+ const msg = 'No active session. Start one with: thinkrun cloud start';
193
+ if (isJsonMode()) {
194
+ process.stderr.write(JSON.stringify({ success: false, command: 'cloud status',
195
+ error: 'No active session', code: 'SESSION_ERROR', hint: msg }) + '\n');
196
+ process.exit(1);
197
+ }
198
+ console.error(chalk.red('Error:'), 'No active session');
199
+ console.error(chalk.yellow('Tip:'), 'Start one with: thinkrun cloud start');
200
+ process.exit(1);
201
+ }
202
+ const spinner = createSpinner('Fetching session status...');
203
+ const session = await adapter.getSession(sessionId);
204
+ if (isJsonMode()) {
205
+ emitJson({ success: true, command: 'cloud status', durationMs: Date.now() - startMs,
206
+ data: session });
207
+ return;
208
+ }
209
+ spinner.stop();
210
+ console.log('');
211
+ console.log(chalk.bold('Session Status:'));
212
+ console.log('');
213
+ console.log(' Session ID: ', chalk.cyan(session.sessionId));
214
+ console.log(' Status: ', getStatusColor(session.status)(session.status));
215
+ console.log(' URL: ', chalk.cyan(session.currentUrl || '(none)'));
216
+ console.log(' Title: ', session.title || '(none)');
217
+ console.log(' Created: ', session.createdAt);
218
+ if (session.isFlyMachine) {
219
+ console.log(' Location: ', chalk.gray('Fly.io'));
220
+ }
221
+ console.log('');
222
+ }
223
+ catch (error) {
224
+ handleError(error, 'cloud status', startMs);
225
+ }
226
+ });
227
+ // cloud artifacts
228
+ cloudCmd
229
+ .command('artifacts')
230
+ .description('List artifacts for a session')
231
+ .option('-s, --session <id>', 'Session ID (defaults to active session)')
232
+ .action(async (options) => {
233
+ const startMs = Date.now();
234
+ try {
235
+ const adapter = new CloudAdapter();
236
+ const sessionId = options.session || getCloudSessionContext()?.sessionId;
237
+ if (!sessionId) {
238
+ const msg = 'No active session. Start one with: thinkrun cloud start';
239
+ if (isJsonMode()) {
240
+ process.stderr.write(JSON.stringify({ success: false, command: 'cloud artifacts',
241
+ error: 'No active session', code: 'SESSION_ERROR', hint: msg }) + '\n');
242
+ process.exit(1);
243
+ }
244
+ console.error(chalk.red('Error:'), 'No active session');
245
+ console.error(chalk.yellow('Tip:'), 'Start one with: thinkrun cloud start');
246
+ process.exit(1);
247
+ }
248
+ const spinner = createSpinner('Fetching session artifacts...');
249
+ const artifacts = await adapter.listArtifacts(sessionId);
250
+ if (isJsonMode()) {
251
+ emitJson({ success: true, command: 'cloud artifacts', durationMs: Date.now() - startMs,
252
+ data: artifacts });
253
+ return;
254
+ }
255
+ spinner.stop();
256
+ console.log('');
257
+ console.log(chalk.bold('Session Artifacts:'));
258
+ console.log('');
259
+ if (!artifacts || (!artifacts.screenshots?.length && !artifacts.recordings?.length && !artifacts.actions?.length)) {
260
+ console.log(chalk.gray(' No artifacts found for this session.'));
261
+ console.log('');
262
+ return;
263
+ }
264
+ if (artifacts.screenshots?.length) {
265
+ console.log(chalk.underline('Screenshots:'));
266
+ artifacts.screenshots.forEach((s) => {
267
+ console.log(` ${chalk.cyan(s.artifactId || s.objectId)} ${chalk.gray(s.createdAt || '')}`);
268
+ if (s.publicUrl)
269
+ console.log(` ${chalk.blue(s.publicUrl)}`);
270
+ });
271
+ console.log('');
272
+ }
273
+ if (artifacts.recordings?.length) {
274
+ console.log(chalk.underline('Recordings:'));
275
+ artifacts.recordings.forEach((r) => {
276
+ console.log(` ${chalk.cyan(r.artifactId || r.objectId)} ${chalk.gray(r.createdAt || '')}`);
277
+ if (r.publicUrl)
278
+ console.log(` ${chalk.blue(r.publicUrl)}`);
279
+ });
280
+ console.log('');
281
+ }
282
+ if (artifacts.actions?.length) {
283
+ console.log(chalk.underline('Actions:'));
284
+ artifacts.actions.slice(0, 10).forEach((a) => {
285
+ const status = a.success ? chalk.green('✓') : chalk.red('✗');
286
+ console.log(` ${status} ${a.type.padEnd(10)} ${chalk.gray(a.timestamp)}`);
287
+ });
288
+ if (artifacts.actions.length > 10) {
289
+ console.log(chalk.gray(` ... and ${artifacts.actions.length - 10} more actions`));
290
+ }
291
+ console.log('');
292
+ }
293
+ }
294
+ catch (error) {
295
+ handleError(error, 'cloud artifacts', startMs);
296
+ }
297
+ });
298
+ // cloud use
299
+ cloudCmd
300
+ .command('use <sessionId>')
301
+ .description('Switch active session')
302
+ .action((sessionId) => {
303
+ const startMs = Date.now();
304
+ setCloudSessionContext(sessionId);
305
+ if (isJsonMode()) {
306
+ emitJson({ success: true, command: 'cloud use', durationMs: Date.now() - startMs,
307
+ data: { sessionId } });
308
+ return;
309
+ }
310
+ console.log(chalk.green('✓'), 'Switched to session', chalk.cyan(sessionId.slice(0, 8) + '...'));
311
+ });
312
+ return cloudCmd;
313
+ }
314
+ function getStatusColor(status) {
315
+ switch (status) {
316
+ case 'active':
317
+ case 'ready':
318
+ case 'running':
319
+ return chalk.green;
320
+ case 'busy':
321
+ case 'provisioning':
322
+ case 'creating':
323
+ case 'pending':
324
+ return chalk.yellow;
325
+ case 'error':
326
+ case 'failed':
327
+ return chalk.red;
328
+ default:
329
+ return chalk.gray;
330
+ }
331
+ }
332
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../../src/commands/cloud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Configuration management commands
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function validateApiUrl(value: string): void;
6
+ export declare function createConfigCommand(): Command;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAUlD;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAqN7C"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Configuration management commands
3
+ */
4
+ import { Command } from 'commander';
5
+ import chalk from 'chalk';
6
+ import { config } from '../config/store.js';
7
+ import { ConfigError } from '../errors.js';
8
+ import { createInterface } from 'readline/promises';
9
+ import { isLocalApiUrl } from '../utils.js';
10
+ export function validateApiUrl(value) {
11
+ let url;
12
+ try {
13
+ url = new URL(value);
14
+ }
15
+ catch {
16
+ throw new Error(`Invalid URL "${value}". Must be a valid http/https URL.`);
17
+ }
18
+ if (!['http:', 'https:'].includes(url.protocol)) {
19
+ throw new Error(`Invalid URL "${value}". URL must use http or https protocol.`);
20
+ }
21
+ }
22
+ export function createConfigCommand() {
23
+ const configCmd = new Command('config')
24
+ .description('Manage CLI configuration');
25
+ // config set-key <key>
26
+ configCmd
27
+ .command('set-key [key]')
28
+ .description('Set ThinkRun API key')
29
+ .option('--force', 'Override shape validation for a future key format (asks you to re-type the value)')
30
+ .action(async (key, options) => {
31
+ try {
32
+ let apiKey = key;
33
+ // Interactive prompt if no key provided
34
+ if (!apiKey) {
35
+ const rl = createInterface({
36
+ input: process.stdin,
37
+ output: process.stdout,
38
+ });
39
+ apiKey = await rl.question('Enter your ThinkRun API key: ');
40
+ rl.close();
41
+ }
42
+ apiKey = apiKey?.trim();
43
+ if (!apiKey) {
44
+ throw new ConfigError('API key cannot be empty.');
45
+ }
46
+ // Validate key format
47
+ if (!config.validateApiKey(apiKey)) {
48
+ const apiUrl = config.get('apiUrl') || 'https://api.thinkbrowse.io';
49
+ const localHint = isLocalApiUrl(apiUrl)
50
+ ? `Local endpoint detected (${apiUrl}). Use TEST_API_KEY from mech-browser-service/.env (typically starts with "ak_").`
51
+ : 'Get your API key from: https://thinkbrowse.io/settings';
52
+ if (!options.force) {
53
+ const looksLikeUrl = /^https?:\/\//i.test(apiKey);
54
+ throw new ConfigError(looksLikeUrl
55
+ ? 'That looks like a URL, not an API key. Keys start with "tb_", legacy "mech_browse_", or local "ak_".'
56
+ : 'Invalid API key format. Must start with "tb_", legacy "mech_browse_", or local TEST_API_KEY "ak_".', `${localHint} (Use --force only for a future key format.)`);
57
+ }
58
+ // --force is confirm-style: re-type the exact value, no silent bypass.
59
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
60
+ const confirmed = await rl.question('Key fails shape validation. Re-type it exactly to confirm: ');
61
+ rl.close();
62
+ if (confirmed.trim() !== apiKey) {
63
+ throw new ConfigError('Confirmation did not match — key not saved.');
64
+ }
65
+ }
66
+ // Store key; clear any quarantined invalid value it replaces.
67
+ config.set('apiKey', apiKey);
68
+ config.clearQuarantinedApiKey();
69
+ console.log(chalk.green('✓') + ' API key saved');
70
+ console.log(chalk.gray(`Config file: ${config.getPath()}`));
71
+ }
72
+ catch (error) {
73
+ if (error instanceof ConfigError) {
74
+ console.error(chalk.red('Error:'), error.message);
75
+ if (error.suggestion) {
76
+ console.error(chalk.yellow('Tip:'), error.suggestion);
77
+ }
78
+ }
79
+ else {
80
+ console.error(chalk.red('Error:'), error);
81
+ }
82
+ process.exit(1);
83
+ }
84
+ });
85
+ // config set-extension-id <id>
86
+ configCmd
87
+ .command('set-extension-id <extensionId>')
88
+ .description('Store the Chrome extension ID used for native-host registration')
89
+ .action((extensionId) => {
90
+ try {
91
+ if (!config.validateExtensionId(extensionId)) {
92
+ throw new ConfigError('Invalid extension ID format. Must be 32 lowercase letters in the range a-p.', 'Open chrome://extensions, copy the ThinkRun ID, then run: thinkrun config set-extension-id <id>');
93
+ }
94
+ config.set('extensionId', extensionId);
95
+ config.delete('preferPackagedDefaultExtensionId');
96
+ console.log(chalk.green('✓') + ' Extension ID saved');
97
+ console.log(chalk.yellow('Next:') + ` run ${chalk.cyan('thinkrun setup')} to re-register the native host for this extension ID.`);
98
+ console.log(chalk.gray(`Config file: ${config.getPath()}`));
99
+ }
100
+ catch (error) {
101
+ if (error instanceof ConfigError) {
102
+ console.error(chalk.red('Error:'), error.message);
103
+ if (error.suggestion) {
104
+ console.error(chalk.yellow('Tip:'), error.suggestion);
105
+ }
106
+ }
107
+ else {
108
+ console.error(chalk.red('Error:'), error);
109
+ }
110
+ process.exit(1);
111
+ }
112
+ });
113
+ configCmd
114
+ .command('clear-extension-id')
115
+ .description('Remove the saved extension ID override; rerun setup to re-register the native host for the packaged default')
116
+ .action(() => {
117
+ config.delete('extensionId');
118
+ config.set('preferPackagedDefaultExtensionId', true);
119
+ console.log(chalk.green('✓') + ' Extension ID cleared');
120
+ console.log(chalk.yellow('Next:') + ` run ${chalk.cyan('thinkrun setup')} to re-register the native host for the packaged default extension ID.`);
121
+ console.log(chalk.gray(`Config file: ${config.getPath()}`));
122
+ });
123
+ // config show
124
+ configCmd
125
+ .command('show')
126
+ .description('Show current configuration')
127
+ .action(() => {
128
+ const allConfig = config.getAll();
129
+ console.log(chalk.bold('ThinkRun Configuration:'));
130
+ console.log('');
131
+ console.log(' API Key: ', chalk.cyan(config.maskApiKey(allConfig.apiKey)));
132
+ console.log(' API URL: ', chalk.cyan(allConfig.apiUrl || '(default)'));
133
+ console.log(' Default Browser:', chalk.cyan(allConfig.defaultBrowser || 'chromium'));
134
+ console.log(' Extension ID: ', chalk.cyan(allConfig.extensionId || '(default packaged ID)'));
135
+ console.log(' Registered ID: ', chalk.cyan(allConfig.registeredExtensionId || '(unknown)'));
136
+ console.log(' Local Tab: ', chalk.cyan(allConfig.localTabId || '(none)'));
137
+ console.log(' Cloud Session: ', chalk.cyan(allConfig.cloudSessionId || '(none)'));
138
+ console.log(' Active Session:', chalk.cyan(allConfig.activeSessionId || '(none)'));
139
+ console.log('');
140
+ console.log(chalk.gray('Config file:'), config.getPath());
141
+ });
142
+ // config set <key> <value>
143
+ configCmd
144
+ .command('set <key> <value>')
145
+ .description('Set a configuration value')
146
+ .action((key, value) => {
147
+ try {
148
+ if (key === 'apiKey') {
149
+ throw new ConfigError('Use "thinkrun config set-key" to set API key');
150
+ }
151
+ const validKeys = ['apiUrl', 'defaultBrowser'];
152
+ if (!validKeys.includes(key)) {
153
+ throw new ConfigError(`Unknown config key: ${key}`, `Valid keys: ${validKeys.join(', ')}`);
154
+ }
155
+ if (key === 'apiUrl') {
156
+ try {
157
+ validateApiUrl(value);
158
+ }
159
+ catch (e) {
160
+ throw new ConfigError(e.message, 'Example: thinkrun config set apiUrl https://api.thinkbrowse.io');
161
+ }
162
+ }
163
+ config.set(key, value);
164
+ console.log(chalk.green('✓'), `Set ${key} =`, chalk.cyan(value));
165
+ }
166
+ catch (error) {
167
+ if (error instanceof ConfigError) {
168
+ console.error(chalk.red('Error:'), error.message);
169
+ if (error.suggestion) {
170
+ console.error(chalk.yellow('Tip:'), error.suggestion);
171
+ }
172
+ }
173
+ else {
174
+ console.error(chalk.red('Error:'), error);
175
+ }
176
+ process.exit(1);
177
+ }
178
+ });
179
+ // config reset
180
+ configCmd
181
+ .command('reset')
182
+ .description('Clear all configuration')
183
+ .option('-y, --yes', 'Skip confirmation prompt')
184
+ .action(async (options) => {
185
+ try {
186
+ if (!options.yes) {
187
+ const rl = createInterface({
188
+ input: process.stdin,
189
+ output: process.stdout,
190
+ });
191
+ const answer = await rl.question('Are you sure you want to reset all config? (yes/no): ');
192
+ rl.close();
193
+ if (answer.toLowerCase() !== 'yes') {
194
+ console.log('Cancelled');
195
+ return;
196
+ }
197
+ }
198
+ config.clear();
199
+ console.log(chalk.green('✓'), 'Configuration reset');
200
+ }
201
+ catch (error) {
202
+ console.error(chalk.red('Error:'), error);
203
+ process.exit(1);
204
+ }
205
+ });
206
+ return configCmd;
207
+ }
208
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"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"}