@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,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authoritative session diagnostics — resolved mode, bindings, bridge, API, and command routing.
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { config } from '../config/store.js';
|
|
7
|
+
import { readBridgePort } from '../utils.js';
|
|
8
|
+
import { getLocalSessionContext, getSessionContext } from '../session/context.js';
|
|
9
|
+
import { getResolutionInfo } from '../adapters/index.js';
|
|
10
|
+
import { isJsonMode } from '../output/mode.js';
|
|
11
|
+
import { emitJson } from '../output/formatter.js';
|
|
12
|
+
import { getLastReclaimAudit, getWorkingLocation } from '../working-location.js';
|
|
13
|
+
import { assessLocalContinuity } from '../session/local-continuity.js';
|
|
14
|
+
export function deriveSessionDebugLocalState(persistedLocalBinding, workingLocation) {
|
|
15
|
+
const persisted = persistedLocalBinding ?? null;
|
|
16
|
+
const working = workingLocation
|
|
17
|
+
? {
|
|
18
|
+
tabId: workingLocation.tabId,
|
|
19
|
+
...(workingLocation.windowId !== undefined ? { windowId: workingLocation.windowId } : {}),
|
|
20
|
+
...(workingLocation.group !== undefined ? { group: workingLocation.group } : {}),
|
|
21
|
+
...(workingLocation.agentId !== undefined ? { agentId: workingLocation.agentId } : {}),
|
|
22
|
+
...(workingLocation.ownerShellPid !== undefined ? { ownerShellPid: workingLocation.ownerShellPid } : {}),
|
|
23
|
+
}
|
|
24
|
+
: null;
|
|
25
|
+
const persistedTabId = persisted?.tabId;
|
|
26
|
+
const workingTabId = working ? String(working.tabId) : undefined;
|
|
27
|
+
const driftDetected = !!persistedTabId && !!workingTabId && persistedTabId !== workingTabId;
|
|
28
|
+
const effectiveLocalTabId = workingTabId ?? persistedTabId ?? null;
|
|
29
|
+
const driftWarning = driftDetected
|
|
30
|
+
? `Persisted local binding points to tab ${persistedTabId}, but working-location points to tab ${workingTabId}. Commands may rebind to the working-location tab before execution.`
|
|
31
|
+
: null;
|
|
32
|
+
return {
|
|
33
|
+
persistedLocalBinding: persisted,
|
|
34
|
+
workingLocation: working,
|
|
35
|
+
effectiveLocalTabId,
|
|
36
|
+
driftDetected,
|
|
37
|
+
driftWarning,
|
|
38
|
+
continuity: assessLocalContinuity(persisted
|
|
39
|
+
? {
|
|
40
|
+
mode: 'local',
|
|
41
|
+
tabId: persisted.tabId,
|
|
42
|
+
...(persisted.agentSessionId ? { agentSessionId: persisted.agentSessionId } : {}),
|
|
43
|
+
...(persisted.controlSessionId ? { controlSessionId: persisted.controlSessionId } : {}),
|
|
44
|
+
source: 'typed',
|
|
45
|
+
}
|
|
46
|
+
: undefined, workingLocation),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function getBridgeHealth(port) {
|
|
50
|
+
try {
|
|
51
|
+
const res = await fetch(`http://127.0.0.1:${port}/health`, {
|
|
52
|
+
signal: AbortSignal.timeout(2000),
|
|
53
|
+
});
|
|
54
|
+
if (!res.ok) {
|
|
55
|
+
return { ok: false, message: `HTTP ${res.status}` };
|
|
56
|
+
}
|
|
57
|
+
const body = (await res.json());
|
|
58
|
+
const ext = body?.data?.extensionConnected;
|
|
59
|
+
const status = body?.data?.status;
|
|
60
|
+
const browserName = body?.data?.browser?.name;
|
|
61
|
+
const recoveryState = body?.data?.recoveryState;
|
|
62
|
+
const recentDisconnectCount = body?.data?.recentDisconnectCount;
|
|
63
|
+
const lastRecoveredAt = body?.data?.lastRecoveredAt;
|
|
64
|
+
const msg = status === 'ok' ? 'ok' : body?.data?.service ?? body?.service ?? 'healthy';
|
|
65
|
+
const browserSuffix = typeof browserName === 'string' ? `, browser=${browserName}` : '';
|
|
66
|
+
const recoverySuffix = typeof recoveryState === 'string' && recoveryState !== 'healthy'
|
|
67
|
+
? `, recoveryState=${recoveryState}`
|
|
68
|
+
: '';
|
|
69
|
+
const churnSuffix = typeof recentDisconnectCount === 'number' && recentDisconnectCount > 0
|
|
70
|
+
? `, recentDisconnects=${recentDisconnectCount}`
|
|
71
|
+
: '';
|
|
72
|
+
const recoveredSuffix = typeof lastRecoveredAt === 'string' && lastRecoveredAt.length > 0
|
|
73
|
+
? `, lastRecoveredAt=${lastRecoveredAt}`
|
|
74
|
+
: '';
|
|
75
|
+
return {
|
|
76
|
+
ok: res.ok && (status === 'ok' || !!body?.service),
|
|
77
|
+
extensionConnected: typeof ext === 'boolean' ? ext : undefined,
|
|
78
|
+
browserName: typeof browserName === 'string' ? browserName : undefined,
|
|
79
|
+
recoveryState,
|
|
80
|
+
recentDisconnectCount,
|
|
81
|
+
lastRecoveredAt,
|
|
82
|
+
message: typeof ext === 'boolean'
|
|
83
|
+
? `${msg} (extensionConnected=${ext}${browserSuffix}${recoverySuffix}${churnSuffix}${recoveredSuffix})`
|
|
84
|
+
: msg,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
message: e instanceof Error ? e.message : 'unreachable',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function modeSourceLabel(source) {
|
|
95
|
+
const labels = {
|
|
96
|
+
explicit_local: '--mode local',
|
|
97
|
+
explicit_cloud: '--mode cloud',
|
|
98
|
+
context_local: 'persisted local context',
|
|
99
|
+
context_cloud: 'persisted cloud context',
|
|
100
|
+
fallback_local: 'fallback (bridge available)',
|
|
101
|
+
fallback_cloud: 'fallback (API key available)',
|
|
102
|
+
unavailable: 'unavailable (see error)',
|
|
103
|
+
};
|
|
104
|
+
return labels[source] ?? source;
|
|
105
|
+
}
|
|
106
|
+
export function createSessionDebugCommand() {
|
|
107
|
+
const debugCmd = new Command('debug')
|
|
108
|
+
.description('Show resolved mode, bindings, bridge health, and command routing target')
|
|
109
|
+
.action(async () => {
|
|
110
|
+
const apiUrl = config.get('apiUrl') || 'https://api.thinkbrowse.io';
|
|
111
|
+
const apiKey = config.get('apiKey');
|
|
112
|
+
const bridgePort = readBridgePort();
|
|
113
|
+
let persistedLocalBinding;
|
|
114
|
+
let cloudBinding;
|
|
115
|
+
let contextError;
|
|
116
|
+
const localTabId = config.get('localTabId');
|
|
117
|
+
const cloudSessionId = config.get('cloudSessionId');
|
|
118
|
+
const typedLocalContext = getLocalSessionContext();
|
|
119
|
+
if (localTabId) {
|
|
120
|
+
persistedLocalBinding = {
|
|
121
|
+
tabId: localTabId,
|
|
122
|
+
...(typedLocalContext?.tabId === localTabId && typedLocalContext.agentSessionId
|
|
123
|
+
? { agentSessionId: typedLocalContext.agentSessionId }
|
|
124
|
+
: config.get('localAgentSessionId')
|
|
125
|
+
? { agentSessionId: config.get('localAgentSessionId') }
|
|
126
|
+
: {}),
|
|
127
|
+
...(typedLocalContext?.tabId === localTabId && typedLocalContext.controlSessionId
|
|
128
|
+
? { controlSessionId: typedLocalContext.controlSessionId }
|
|
129
|
+
: {}),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (cloudSessionId) {
|
|
133
|
+
cloudBinding = { sessionId: cloudSessionId };
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
getSessionContext();
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
contextError = e instanceof Error ? e.message : String(e);
|
|
140
|
+
}
|
|
141
|
+
const resolution = await getResolutionInfo();
|
|
142
|
+
const bridgeHealth = await getBridgeHealth(bridgePort);
|
|
143
|
+
const workingLocation = getWorkingLocation();
|
|
144
|
+
const localState = deriveSessionDebugLocalState(persistedLocalBinding, workingLocation);
|
|
145
|
+
const routingTarget = resolution.resolvedMode === 'local' ? 'local (bridge)' : resolution.resolvedMode === 'cloud' ? 'cloud (API)' : 'none (command would fail)';
|
|
146
|
+
if (isJsonMode()) {
|
|
147
|
+
emitJson({
|
|
148
|
+
success: true,
|
|
149
|
+
command: 'session debug',
|
|
150
|
+
data: {
|
|
151
|
+
resolvedMode: resolution.resolvedMode,
|
|
152
|
+
modeSource: resolution.modeSource,
|
|
153
|
+
modeSourceLabel: modeSourceLabel(resolution.modeSource),
|
|
154
|
+
// Deprecated alias retained for backward compatibility with existing JSON consumers.
|
|
155
|
+
localBinding: localState.persistedLocalBinding,
|
|
156
|
+
persistedLocalBinding: localState.persistedLocalBinding,
|
|
157
|
+
workingLocation: localState.workingLocation,
|
|
158
|
+
effectiveLocalTabId: localState.effectiveLocalTabId,
|
|
159
|
+
localBindingDrift: localState.driftDetected,
|
|
160
|
+
localBindingDriftWarning: localState.driftWarning,
|
|
161
|
+
continuityState: localState.continuity.state,
|
|
162
|
+
continuityHint: localState.continuity.hint,
|
|
163
|
+
runtimeSessionPresent: localState.continuity.runtimeSessionPresent,
|
|
164
|
+
controlSessionPresent: localState.continuity.controlSessionPresent,
|
|
165
|
+
controlLeaseHeld: localState.continuity.controlLeaseHeld,
|
|
166
|
+
staleLock: localState.continuity.staleLock,
|
|
167
|
+
lockOwner: localState.continuity.lockOwner,
|
|
168
|
+
lastReclaimAudit: getLastReclaimAudit(),
|
|
169
|
+
cloudBinding: cloudBinding ?? null,
|
|
170
|
+
contextError: contextError ?? null,
|
|
171
|
+
bridgePort: resolution.bridgePort ?? bridgePort,
|
|
172
|
+
bridgeHealthy: bridgeHealth.ok,
|
|
173
|
+
extensionConnected: bridgeHealth.extensionConnected ?? null,
|
|
174
|
+
browser: bridgeHealth.browserName ?? null,
|
|
175
|
+
recoveryState: bridgeHealth.recoveryState ?? null,
|
|
176
|
+
recentDisconnectCount: bridgeHealth.recentDisconnectCount ?? 0,
|
|
177
|
+
lastRecoveredAt: bridgeHealth.lastRecoveredAt ?? null,
|
|
178
|
+
apiUrl,
|
|
179
|
+
hasApiKey: resolution.hasApiKey,
|
|
180
|
+
routingTarget,
|
|
181
|
+
error: resolution.error ?? null,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
console.log(chalk.bold('Session debug'));
|
|
187
|
+
console.log('');
|
|
188
|
+
console.log(' Resolved mode: ', chalk.cyan(resolution.resolvedMode ?? '—'), resolution.error ? chalk.red(`(${resolution.error})`) : '');
|
|
189
|
+
console.log(' Mode source: ', chalk.cyan(modeSourceLabel(resolution.modeSource)));
|
|
190
|
+
console.log(' Persisted local: ', localState.persistedLocalBinding
|
|
191
|
+
? chalk.cyan(`tab ${localState.persistedLocalBinding.tabId}` +
|
|
192
|
+
(localState.persistedLocalBinding.agentSessionId
|
|
193
|
+
? ` (agent ${localState.persistedLocalBinding.agentSessionId})`
|
|
194
|
+
: '') +
|
|
195
|
+
(localState.persistedLocalBinding.controlSessionId
|
|
196
|
+
? ` [control ${localState.persistedLocalBinding.controlSessionId}]`
|
|
197
|
+
: ''))
|
|
198
|
+
: chalk.gray('(none)'));
|
|
199
|
+
console.log(' Working location:', localState.workingLocation
|
|
200
|
+
? chalk.cyan(`tab ${localState.workingLocation.tabId}` +
|
|
201
|
+
(localState.workingLocation.windowId !== undefined
|
|
202
|
+
? ` (window ${localState.workingLocation.windowId})`
|
|
203
|
+
: '') +
|
|
204
|
+
(localState.workingLocation.group ? ` [group ${localState.workingLocation.group}]` : ''))
|
|
205
|
+
: chalk.gray('(none)'));
|
|
206
|
+
if (localState.effectiveLocalTabId) {
|
|
207
|
+
console.log(' Effective local: ', chalk.cyan(`tab ${localState.effectiveLocalTabId}`));
|
|
208
|
+
}
|
|
209
|
+
console.log(' Continuity: ', chalk.cyan(localState.continuity.state));
|
|
210
|
+
if (localState.continuity.hint) {
|
|
211
|
+
console.log(' Continuity hint:', chalk.yellow(localState.continuity.hint));
|
|
212
|
+
}
|
|
213
|
+
console.log(' Control state: ', chalk.cyan(`runtimeSession=${localState.continuity.runtimeSessionPresent ? 'yes' : 'no'}, ` +
|
|
214
|
+
`controlSession=${localState.continuity.controlSessionPresent ? 'yes' : 'no'}, ` +
|
|
215
|
+
`leaseHeld=${localState.continuity.controlLeaseHeld ? 'yes' : 'no'}`));
|
|
216
|
+
if (localState.continuity.lockOwner) {
|
|
217
|
+
const owner = localState.continuity.lockOwner;
|
|
218
|
+
console.log(' Lock owner: ', chalk.cyan(`tab ${owner.tabId}` +
|
|
219
|
+
(owner.agentId ? ` (agent ${owner.agentId})` : ` (pid ${owner.ownerShellPid ?? owner.pid})`) +
|
|
220
|
+
(owner.controlSessionId ? ` [control ${owner.controlSessionId}]` : '') +
|
|
221
|
+
(localState.continuity.staleLock ? ' [stale]' : '')));
|
|
222
|
+
}
|
|
223
|
+
const reclaimAudit = getLastReclaimAudit();
|
|
224
|
+
if (reclaimAudit) {
|
|
225
|
+
console.log(' Last reclaim: ', chalk.cyan(`tab ${reclaimAudit.tabId} at ${reclaimAudit.reclaimedAt} (${reclaimAudit.reason})` +
|
|
226
|
+
(reclaimAudit.previousAgentId ? ` from agent ${reclaimAudit.previousAgentId}` : '')));
|
|
227
|
+
}
|
|
228
|
+
console.log(' Cloud binding: ', cloudBinding ? chalk.cyan(cloudBinding.sessionId) : chalk.gray('(none)'));
|
|
229
|
+
if (contextError) {
|
|
230
|
+
console.log(' Context error: ', chalk.red(contextError));
|
|
231
|
+
}
|
|
232
|
+
if (localState.driftWarning) {
|
|
233
|
+
console.log(' Drift warning: ', chalk.yellow(localState.driftWarning));
|
|
234
|
+
}
|
|
235
|
+
console.log('');
|
|
236
|
+
console.log(' Bridge port: ', chalk.cyan(String(resolution.bridgePort ?? bridgePort)));
|
|
237
|
+
console.log(' Bridge health: ', bridgeHealth.ok ? chalk.green(bridgeHealth.message) : chalk.red(bridgeHealth.message));
|
|
238
|
+
if (typeof bridgeHealth.extensionConnected === 'boolean') {
|
|
239
|
+
const label = bridgeHealth.extensionConnected && bridgeHealth.browserName
|
|
240
|
+
? `connected (${bridgeHealth.browserName})`
|
|
241
|
+
: bridgeHealth.extensionConnected
|
|
242
|
+
? 'connected'
|
|
243
|
+
: 'not connected';
|
|
244
|
+
console.log(' Extension: ', bridgeHealth.extensionConnected ? chalk.green(label) : chalk.yellow(label));
|
|
245
|
+
}
|
|
246
|
+
if (bridgeHealth.recoveryState && bridgeHealth.recoveryState !== 'healthy') {
|
|
247
|
+
console.log(' Recovery state: ', chalk.yellow(bridgeHealth.recoveryState));
|
|
248
|
+
}
|
|
249
|
+
if ((bridgeHealth.recentDisconnectCount ?? 0) > 0) {
|
|
250
|
+
console.log(' Recent disconnects:', chalk.yellow(String(bridgeHealth.recentDisconnectCount)));
|
|
251
|
+
}
|
|
252
|
+
if (bridgeHealth.lastRecoveredAt) {
|
|
253
|
+
console.log(' Last recovered: ', chalk.cyan(bridgeHealth.lastRecoveredAt));
|
|
254
|
+
}
|
|
255
|
+
console.log('');
|
|
256
|
+
console.log(' API URL: ', chalk.cyan(apiUrl));
|
|
257
|
+
console.log(' API key: ', resolution.hasApiKey ? chalk.green('set') : chalk.gray('not set'));
|
|
258
|
+
console.log('');
|
|
259
|
+
console.log(' Routing target: ', chalk.cyan(routingTarget));
|
|
260
|
+
console.log('');
|
|
261
|
+
});
|
|
262
|
+
const sessionCmd = new Command('session')
|
|
263
|
+
.description('Session and mode diagnostics');
|
|
264
|
+
sessionCmd.addCommand(debugCmd);
|
|
265
|
+
return sessionCmd;
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=session-debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-debug.js","sourceRoot":"","sources":["../../../src/commands/session-debug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `thinkrun setup` — one-command setup for new users.
|
|
3
|
+
*
|
|
4
|
+
* Installs the native host binary (if needed) and saves the API key.
|
|
5
|
+
* Replaces the manual download + chmod + --install dance.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import type { NativeHostCheckResult } from './install.js';
|
|
9
|
+
import type { ResolvedExtensionId } from './install.js';
|
|
10
|
+
/**
|
|
11
|
+
* Returns true if the native host install step must run.
|
|
12
|
+
*
|
|
13
|
+
* Install is required when:
|
|
14
|
+
* - binary is missing
|
|
15
|
+
* - version does not match expected
|
|
16
|
+
* - manifest file is missing on macOS/Linux (manifestExists === false)
|
|
17
|
+
* note: manifestExists === null means Windows (registry) — no file to check
|
|
18
|
+
* - --force flag is set
|
|
19
|
+
*/
|
|
20
|
+
export declare function shouldInstallNativeHost(check: NativeHostCheckResult, force: boolean): boolean;
|
|
21
|
+
export interface SetupDeps {
|
|
22
|
+
checkNativeHost: () => Promise<NativeHostCheckResult>;
|
|
23
|
+
installNativeHost: (opts: {
|
|
24
|
+
force: boolean;
|
|
25
|
+
extensionId?: string;
|
|
26
|
+
resolvedExtensionId?: ResolvedExtensionId;
|
|
27
|
+
}) => Promise<boolean>;
|
|
28
|
+
getApiKey: () => string | undefined;
|
|
29
|
+
getExtensionId: () => string | undefined;
|
|
30
|
+
getRegisteredExtensionId: () => string | undefined;
|
|
31
|
+
preferPackagedDefaultExtensionId: () => boolean;
|
|
32
|
+
resolveExtensionId: (extensionId?: string) => ResolvedExtensionId;
|
|
33
|
+
validateExtensionId: (extensionId: string) => boolean;
|
|
34
|
+
validateApiKey: (key: string) => boolean;
|
|
35
|
+
maskApiKey: (key: string | undefined) => string;
|
|
36
|
+
saveExtensionId: (extensionId: string) => void;
|
|
37
|
+
saveRegisteredExtensionId: (extensionId: string) => void;
|
|
38
|
+
clearPreferPackagedDefaultExtensionId: () => void;
|
|
39
|
+
saveApiKey: (key: string) => void;
|
|
40
|
+
/** Creates a readline interface; returns a `question` function and a `close` function. */
|
|
41
|
+
createRl: () => {
|
|
42
|
+
question: (prompt: string) => Promise<string>;
|
|
43
|
+
close: () => void;
|
|
44
|
+
};
|
|
45
|
+
log: (...args: unknown[]) => void;
|
|
46
|
+
setExitCode: (code: number) => void;
|
|
47
|
+
}
|
|
48
|
+
export declare function runSetupAction(opts: {
|
|
49
|
+
force?: boolean;
|
|
50
|
+
extensionId?: string;
|
|
51
|
+
}, deps?: SetupDeps): Promise<void>;
|
|
52
|
+
export declare function createSetupCommand(): Command;
|
|
53
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAOxD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAM7F;AAMD,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtD,iBAAiB,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnI,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACzC,wBAAwB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACnD,gCAAgC,EAAE,MAAM,OAAO,CAAC;IAChD,kBAAkB,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,mBAAmB,CAAC;IAClE,mBAAmB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;IAChD,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,yBAAyB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,qCAAqC,EAAE,MAAM,IAAI,CAAC;IAClD,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0FAA0F;IAC1F,QAAQ,EAAE,MAAM;QAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IACrF,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAqDD,wBAAsB,cAAc,CAClC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/C,IAAI,GAAE,SAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA6Kf;AAMD,wBAAgB,kBAAkB,IAAI,OAAO,CAM5C"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `thinkrun setup` — one-command setup for new users.
|
|
3
|
+
*
|
|
4
|
+
* Installs the native host binary (if needed) and saves the API key.
|
|
5
|
+
* Replaces the manual download + chmod + --install dance.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { createInterface } from 'readline/promises';
|
|
10
|
+
import { checkNativeHost, installNativeHost, resolveExtensionId, resolveRegistrationExtensionIdFromSources, hasAmbiguousManifestExtensionIds, } from './install.js';
|
|
11
|
+
import { config } from '../config/store.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Pure helpers (exported for testing)
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Returns true if the native host install step must run.
|
|
17
|
+
*
|
|
18
|
+
* Install is required when:
|
|
19
|
+
* - binary is missing
|
|
20
|
+
* - version does not match expected
|
|
21
|
+
* - manifest file is missing on macOS/Linux (manifestExists === false)
|
|
22
|
+
* note: manifestExists === null means Windows (registry) — no file to check
|
|
23
|
+
* - --force flag is set
|
|
24
|
+
*/
|
|
25
|
+
export function shouldInstallNativeHost(check, force) {
|
|
26
|
+
if (force)
|
|
27
|
+
return true;
|
|
28
|
+
if (!check.binaryExists)
|
|
29
|
+
return true;
|
|
30
|
+
if (!check.versionMatch)
|
|
31
|
+
return true;
|
|
32
|
+
if (check.manifestExists === false)
|
|
33
|
+
return true;
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
function defaultDeps() {
|
|
37
|
+
return {
|
|
38
|
+
checkNativeHost,
|
|
39
|
+
installNativeHost,
|
|
40
|
+
getApiKey: () => config.get('apiKey'),
|
|
41
|
+
getExtensionId: () => config.get('extensionId'),
|
|
42
|
+
getRegisteredExtensionId: () => config.get('registeredExtensionId'),
|
|
43
|
+
preferPackagedDefaultExtensionId: () => config.get('preferPackagedDefaultExtensionId') === true,
|
|
44
|
+
resolveExtensionId,
|
|
45
|
+
validateExtensionId: (extensionId) => config.validateExtensionId(extensionId),
|
|
46
|
+
validateApiKey: (key) => config.validateApiKey(key),
|
|
47
|
+
maskApiKey: (key) => config.maskApiKey(key),
|
|
48
|
+
saveExtensionId: (extensionId) => config.set('extensionId', extensionId),
|
|
49
|
+
saveRegisteredExtensionId: (extensionId) => config.set('registeredExtensionId', extensionId),
|
|
50
|
+
clearPreferPackagedDefaultExtensionId: () => config.delete('preferPackagedDefaultExtensionId'),
|
|
51
|
+
saveApiKey: (key) => config.set('apiKey', key),
|
|
52
|
+
createRl: () => {
|
|
53
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
54
|
+
return { question: (p) => rl.question(p), close: () => rl.close() };
|
|
55
|
+
},
|
|
56
|
+
log: console.log,
|
|
57
|
+
setExitCode: (code) => { process.exitCode = code; },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function resolveSetupExtensionId(opts, deps, check) {
|
|
61
|
+
const resolvedExtensionId = deps.resolveExtensionId(opts.extensionId);
|
|
62
|
+
return resolveRegistrationExtensionIdFromSources({
|
|
63
|
+
extensionId: resolvedExtensionId.source === 'flag' ? resolvedExtensionId.extensionId : undefined,
|
|
64
|
+
envExtensionId: resolvedExtensionId.source === 'env' ? resolvedExtensionId.extensionId : undefined,
|
|
65
|
+
configuredExtensionId: resolvedExtensionId.source === 'config' ? resolvedExtensionId.extensionId : deps.getExtensionId(),
|
|
66
|
+
registeredExtensionId: deps.getRegisteredExtensionId(),
|
|
67
|
+
preferPackagedDefaultExtensionId: deps.preferPackagedDefaultExtensionId(),
|
|
68
|
+
manifestExtensionIds: check.manifestExtensionIds,
|
|
69
|
+
manifestParseStatus: check.manifestParseStatus,
|
|
70
|
+
manifestExists: check.manifestExists,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function shouldClearPackagedDefaultPreference(source) {
|
|
74
|
+
return source !== 'registered';
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Extracted action (exported for testing)
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
export async function runSetupAction(opts, deps = defaultDeps()) {
|
|
80
|
+
const { log, setExitCode } = deps;
|
|
81
|
+
log(chalk.bold('ThinkRun Setup'));
|
|
82
|
+
log('─'.repeat(40));
|
|
83
|
+
log('');
|
|
84
|
+
// ── Step 1: Native host ──────────────────────────────────────────────
|
|
85
|
+
log(chalk.bold('Step 1: Native host'));
|
|
86
|
+
if (opts.extensionId && !deps.validateExtensionId(opts.extensionId)) {
|
|
87
|
+
log(chalk.red(' Invalid extension ID format.'));
|
|
88
|
+
log(` Open ${chalk.cyan('chrome://extensions')}, copy the ThinkRun ID, then rerun ${chalk.cyan('thinkrun setup --extension-id <id>')}.`);
|
|
89
|
+
setExitCode(1);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const initialResolvedExtensionId = deps.resolveExtensionId(opts.extensionId);
|
|
93
|
+
const check = await deps.checkNativeHost();
|
|
94
|
+
if (hasAmbiguousManifestExtensionIds({
|
|
95
|
+
extensionId: initialResolvedExtensionId.source === 'flag' ? initialResolvedExtensionId.extensionId : undefined,
|
|
96
|
+
envExtensionId: initialResolvedExtensionId.source === 'env' ? initialResolvedExtensionId.extensionId : undefined,
|
|
97
|
+
configuredExtensionId: initialResolvedExtensionId.source === 'config'
|
|
98
|
+
? initialResolvedExtensionId.extensionId
|
|
99
|
+
: deps.getExtensionId(),
|
|
100
|
+
registeredExtensionId: deps.getRegisteredExtensionId(),
|
|
101
|
+
preferPackagedDefaultExtensionId: deps.preferPackagedDefaultExtensionId(),
|
|
102
|
+
manifestExtensionIds: check.manifestExtensionIds,
|
|
103
|
+
manifestParseStatus: check.manifestParseStatus,
|
|
104
|
+
})) {
|
|
105
|
+
log(chalk.red(' Detected browser manifests disagree on the ThinkRun extension ID.'));
|
|
106
|
+
log(` Run ${chalk.cyan('thinkrun config set-extension-id <id>')} or rerun ${chalk.cyan('thinkrun setup --extension-id <id>')}.`);
|
|
107
|
+
setExitCode(1);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const registeredExtensionId = deps.getRegisteredExtensionId();
|
|
111
|
+
const resolvedExtensionId = resolveSetupExtensionId(opts, deps, check);
|
|
112
|
+
const extensionId = resolvedExtensionId.extensionId;
|
|
113
|
+
if (resolvedExtensionId.source === 'flag') {
|
|
114
|
+
log(` Using extension ID ${chalk.cyan(extensionId)} from command line.`);
|
|
115
|
+
}
|
|
116
|
+
else if (resolvedExtensionId.source === 'env') {
|
|
117
|
+
log(` Using extension ID ${chalk.cyan(extensionId)} from ${chalk.cyan('THINKRUN_EXTENSION_ID')} (${chalk.cyan('THINKBROWSE_EXTENSION_ID')} also supported).`);
|
|
118
|
+
}
|
|
119
|
+
else if (resolvedExtensionId.source === 'config') {
|
|
120
|
+
log(` Using saved extension ID ${chalk.cyan(extensionId)}.`);
|
|
121
|
+
}
|
|
122
|
+
else if (resolvedExtensionId.source === 'registered') {
|
|
123
|
+
log(` Using previously registered extension ID ${chalk.cyan(extensionId)}.`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
log(` ${chalk.yellow('!')} No saved extension ID — setup will use the packaged extension ID.`);
|
|
127
|
+
log(` If you loaded an unpacked/dev extension, run ${chalk.cyan('thinkrun config set-extension-id <id>')} first.`);
|
|
128
|
+
}
|
|
129
|
+
const windowsRegistrationUnverifiable = check.manifestExists === null && check.manifestExtensionIds === null;
|
|
130
|
+
const relevantManifestEntries = check.manifestEntries?.filter((entry) => entry.relevant) ?? [];
|
|
131
|
+
const manifestNeedsRequestedExtensionId = !!extensionId &&
|
|
132
|
+
((relevantManifestEntries.length > 0
|
|
133
|
+
? relevantManifestEntries.some((entry) => !entry.manifestExists ||
|
|
134
|
+
entry.manifestParseStatus !== 'parsed' ||
|
|
135
|
+
!Array.isArray(entry.manifestExtensionIds) ||
|
|
136
|
+
!entry.manifestExtensionIds.includes(extensionId))
|
|
137
|
+
: (Array.isArray(check.manifestExtensionIds) && !check.manifestExtensionIds.includes(extensionId))) ||
|
|
138
|
+
(windowsRegistrationUnverifiable &&
|
|
139
|
+
(resolvedExtensionId.source === 'flag' ||
|
|
140
|
+
resolvedExtensionId.source === 'env' ||
|
|
141
|
+
registeredExtensionId !== extensionId)));
|
|
142
|
+
const mustInstallNativeHost = shouldInstallNativeHost(check, opts.force ?? false) ||
|
|
143
|
+
check.manifestParseStatus === 'parse_error' ||
|
|
144
|
+
manifestNeedsRequestedExtensionId;
|
|
145
|
+
if (!mustInstallNativeHost) {
|
|
146
|
+
deps.saveRegisteredExtensionId(extensionId);
|
|
147
|
+
if (shouldClearPackagedDefaultPreference(resolvedExtensionId.source)) {
|
|
148
|
+
deps.clearPreferPackagedDefaultExtensionId();
|
|
149
|
+
}
|
|
150
|
+
log(` ${chalk.green('✓')} Already installed at v${check.installedVersion ?? 'unknown'}`);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
log(` Downloading and installing native host...`);
|
|
154
|
+
const ok = await deps.installNativeHost({
|
|
155
|
+
force: opts.force ?? false,
|
|
156
|
+
extensionId: opts.extensionId,
|
|
157
|
+
resolvedExtensionId,
|
|
158
|
+
});
|
|
159
|
+
if (!ok) {
|
|
160
|
+
log('');
|
|
161
|
+
log(chalk.red('Setup failed at native host installation.'));
|
|
162
|
+
log(` Run ${chalk.cyan('thinkrun install')} for details.`);
|
|
163
|
+
setExitCode(1);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
deps.saveRegisteredExtensionId(extensionId);
|
|
167
|
+
if (shouldClearPackagedDefaultPreference(resolvedExtensionId.source)) {
|
|
168
|
+
deps.clearPreferPackagedDefaultExtensionId();
|
|
169
|
+
}
|
|
170
|
+
log(` ${chalk.green('✓')} Native host ${opts.force ? 'reinstalled' : 'installed'}`);
|
|
171
|
+
}
|
|
172
|
+
log('');
|
|
173
|
+
// ── Step 2: API key ──────────────────────────────────────────────────
|
|
174
|
+
log(chalk.bold('Step 2: API key'));
|
|
175
|
+
const existingKey = deps.getApiKey();
|
|
176
|
+
let apiKeySkipped = false;
|
|
177
|
+
if (existingKey) {
|
|
178
|
+
log(` ${chalk.green('✓')} Already configured (${deps.maskApiKey(existingKey)})`);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
log(` Get your API key at ${chalk.cyan('https://thinkbrowse.io/dashboard')}`);
|
|
182
|
+
log('');
|
|
183
|
+
let apiKey = '';
|
|
184
|
+
if (!process.stdin.isTTY) {
|
|
185
|
+
// Non-interactive environment (CI, Docker, pipes) — rl.question() would
|
|
186
|
+
// hang indefinitely waiting for input that never arrives. Skip the prompt.
|
|
187
|
+
apiKeySkipped = true;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const rl = deps.createRl();
|
|
191
|
+
try {
|
|
192
|
+
apiKey = (await rl.question(' Enter your ThinkRun API key: ')).trim();
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// stdin closed before input arrived — treat as skip
|
|
196
|
+
apiKey = '';
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
rl.close();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (!apiKey) {
|
|
203
|
+
apiKeySkipped = true;
|
|
204
|
+
log('');
|
|
205
|
+
log(chalk.yellow(' No API key entered — skipping.'));
|
|
206
|
+
log(` Run ${chalk.cyan('thinkrun config set-key')} to add it later.`);
|
|
207
|
+
}
|
|
208
|
+
else if (!deps.validateApiKey(apiKey)) {
|
|
209
|
+
log('');
|
|
210
|
+
log(chalk.red(' Invalid API key format.'));
|
|
211
|
+
log(` Run ${chalk.cyan('thinkrun config set-key')} to try again.`);
|
|
212
|
+
setExitCode(1);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
deps.saveApiKey(apiKey);
|
|
217
|
+
log(` ${chalk.green('✓')} API key saved`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
log('');
|
|
221
|
+
// ── Done ─────────────────────────────────────────────────────────────
|
|
222
|
+
if (apiKeySkipped) {
|
|
223
|
+
log(chalk.yellow.bold('Setup partially complete — add your API key to use cloud features.'));
|
|
224
|
+
log('');
|
|
225
|
+
log(' Next step:');
|
|
226
|
+
log(` ${chalk.cyan('thinkrun config set-key')} — add your API key`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
log(chalk.green.bold('All done! ThinkRun is ready.'));
|
|
230
|
+
log('');
|
|
231
|
+
log(' Next steps:');
|
|
232
|
+
log(` ${chalk.cyan('thinkrun doctor')} — verify connection`);
|
|
233
|
+
log(` ${chalk.cyan('thinkrun tabs')} — list open tabs in your Chromium-based browser`);
|
|
234
|
+
log(` ${chalk.cyan('thinkrun navigate https://example.com')} — navigate a tab`);
|
|
235
|
+
}
|
|
236
|
+
log('');
|
|
237
|
+
log(` Docs: ${chalk.cyan('https://thinkbrowse.io/docs')}`);
|
|
238
|
+
}
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// Command factory
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
export function createSetupCommand() {
|
|
243
|
+
return new Command('setup')
|
|
244
|
+
.description('Set up ThinkRun: install native host and configure API key')
|
|
245
|
+
.option('--force', 'force native host installation regardless of current state')
|
|
246
|
+
.option('--extension-id <id>', 'register the native host for a specific Chrome extension ID')
|
|
247
|
+
.action((opts) => runSetupAction(opts));
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|