claude-code/components/BridgeDialog.tsx

401 lines
34 KiB
TypeScript
Raw Normal View History

import { c as _c } from "react/compiler-runtime";
import { basename } from 'path';
import { toString as qrToString } from 'qrcode';
import * as React from 'react';
import { useEffect, useState } from 'react';
import { getOriginalCwd } from '../bootstrap/state.js';
import { buildActiveFooterText, buildIdleFooterText, FAILED_FOOTER_TEXT, getBridgeStatus } from '../bridge/bridgeStatusUtil.js';
import { BRIDGE_FAILED_INDICATOR, BRIDGE_READY_INDICATOR } from '../constants/figures.js';
import { useRegisterOverlay } from '../context/overlayContext.js';
// eslint-disable-next-line custom-rules/prefer-use-keybindings -- raw 'd' key for disconnect, not a configurable keybinding action
import { Box, Text, useInput } from '../ink.js';
import { useKeybindings } from '../keybindings/useKeybinding.js';
import { useAppState, useSetAppState } from '../state/AppState.js';
import { saveGlobalConfig } from '../utils/config.js';
import { getBranch } from '../utils/git.js';
import { Dialog } from './design-system/Dialog.js';
type Props = {
onDone: () => void;
};
export function BridgeDialog(t0) {
const $ = _c(87);
const {
onDone
} = t0;
useRegisterOverlay("bridge-dialog");
const connected = useAppState(_temp);
const sessionActive = useAppState(_temp2);
const reconnecting = useAppState(_temp3);
const connectUrl = useAppState(_temp4);
const sessionUrl = useAppState(_temp5);
const error = useAppState(_temp6);
const explicit = useAppState(_temp7);
const environmentId = useAppState(_temp8);
const sessionId = useAppState(_temp9);
const verbose = useAppState(_temp0);
const setAppState = useSetAppState();
const [showQR, setShowQR] = useState(false);
const [qrText, setQrText] = useState("");
const [branchName, setBranchName] = useState("");
let t1;
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
t1 = basename(getOriginalCwd());
$[0] = t1;
} else {
t1 = $[0];
}
const repoName = t1;
let t2;
let t3;
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
t2 = () => {
getBranch().then(setBranchName).catch(_temp1);
};
t3 = [];
$[1] = t2;
$[2] = t3;
} else {
t2 = $[1];
t3 = $[2];
}
useEffect(t2, t3);
const displayUrl = sessionActive ? sessionUrl : connectUrl;
let t4;
let t5;
if ($[3] !== displayUrl || $[4] !== showQR) {
t4 = () => {
if (!showQR || !displayUrl) {
setQrText("");
return;
}
qrToString(displayUrl, {
type: "utf8",
errorCorrectionLevel: "L",
small: true
}).then(setQrText).catch(() => setQrText(""));
};
t5 = [showQR, displayUrl];
$[3] = displayUrl;
$[4] = showQR;
$[5] = t4;
$[6] = t5;
} else {
t4 = $[5];
t5 = $[6];
}
useEffect(t4, t5);
let t6;
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
t6 = () => {
setShowQR(_temp10);
};
$[7] = t6;
} else {
t6 = $[7];
}
let t7;
if ($[8] !== onDone) {
t7 = {
"confirm:yes": onDone,
"confirm:toggle": t6
};
$[8] = onDone;
$[9] = t7;
} else {
t7 = $[9];
}
let t8;
if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
t8 = {
context: "Confirmation"
};
$[10] = t8;
} else {
t8 = $[10];
}
useKeybindings(t7, t8);
let t9;
if ($[11] !== explicit || $[12] !== onDone || $[13] !== setAppState) {
t9 = input => {
if (input === "d") {
if (explicit) {
saveGlobalConfig(_temp11);
}
setAppState(_temp12);
onDone();
}
};
$[11] = explicit;
$[12] = onDone;
$[13] = setAppState;
$[14] = t9;
} else {
t9 = $[14];
}
useInput(t9);
let t10;
if ($[15] !== connected || $[16] !== error || $[17] !== reconnecting || $[18] !== sessionActive) {
t10 = getBridgeStatus({
error,
connected,
sessionActive,
reconnecting
});
$[15] = connected;
$[16] = error;
$[17] = reconnecting;
$[18] = sessionActive;
$[19] = t10;
} else {
t10 = $[19];
}
const {
label: statusLabel,
color: statusColor
} = t10;
const indicator = error ? BRIDGE_FAILED_INDICATOR : BRIDGE_READY_INDICATOR;
let T0;
let T1;
let footerText;
let t11;
let t12;
let t13;
let t14;
let t15;
let t16;
let t17;
if ($[20] !== branchName || $[21] !== displayUrl || $[22] !== environmentId || $[23] !== error || $[24] !== indicator || $[25] !== onDone || $[26] !== qrText || $[27] !== sessionActive || $[28] !== sessionId || $[29] !== showQR || $[30] !== statusColor || $[31] !== statusLabel || $[32] !== verbose) {
const qrLines = qrText ? qrText.split("\n").filter(_temp13) : [];
let contextParts;
if ($[43] !== branchName) {
contextParts = [];
if (repoName) {
contextParts.push(repoName);
}
if (branchName) {
contextParts.push(branchName);
}
$[43] = branchName;
$[44] = contextParts;
} else {
contextParts = $[44];
}
const contextSuffix = contextParts.length > 0 ? " \xB7 " + contextParts.join(" \xB7 ") : "";
let t18;
if ($[45] !== displayUrl || $[46] !== error || $[47] !== sessionActive) {
t18 = error ? FAILED_FOOTER_TEXT : displayUrl ? sessionActive ? buildActiveFooterText(displayUrl) : buildIdleFooterText(displayUrl) : undefined;
$[45] = displayUrl;
$[46] = error;
$[47] = sessionActive;
$[48] = t18;
} else {
t18 = $[48];
}
footerText = t18;
T1 = Dialog;
t15 = "Remote Control";
t16 = onDone;
t17 = true;
T0 = Box;
t11 = "column";
t12 = 1;
let t19;
if ($[49] !== indicator || $[50] !== statusColor || $[51] !== statusLabel) {
t19 = <Text color={statusColor}>{indicator} {statusLabel}</Text>;
$[49] = indicator;
$[50] = statusColor;
$[51] = statusLabel;
$[52] = t19;
} else {
t19 = $[52];
}
let t20;
if ($[53] !== contextSuffix) {
t20 = <Text dimColor={true}>{contextSuffix}</Text>;
$[53] = contextSuffix;
$[54] = t20;
} else {
t20 = $[54];
}
let t21;
if ($[55] !== t19 || $[56] !== t20) {
t21 = <Text>{t19}{t20}</Text>;
$[55] = t19;
$[56] = t20;
$[57] = t21;
} else {
t21 = $[57];
}
let t22;
if ($[58] !== error) {
t22 = error && <Text color="error">{error}</Text>;
$[58] = error;
$[59] = t22;
} else {
t22 = $[59];
}
let t23;
if ($[60] !== environmentId || $[61] !== verbose) {
t23 = verbose && environmentId && <Text dimColor={true}>Environment: {environmentId}</Text>;
$[60] = environmentId;
$[61] = verbose;
$[62] = t23;
} else {
t23 = $[62];
}
let t24;
if ($[63] !== sessionId || $[64] !== verbose) {
t24 = verbose && sessionId && <Text dimColor={true}>Session: {sessionId}</Text>;
$[63] = sessionId;
$[64] = verbose;
$[65] = t24;
} else {
t24 = $[65];
}
if ($[66] !== t21 || $[67] !== t22 || $[68] !== t23 || $[69] !== t24) {
t13 = <Box flexDirection="column">{t21}{t22}{t23}{t24}</Box>;
$[66] = t21;
$[67] = t22;
$[68] = t23;
$[69] = t24;
$[70] = t13;
} else {
t13 = $[70];
}
t14 = showQR && qrLines.length > 0 && <Box flexDirection="column">{qrLines.map(_temp14)}</Box>;
$[20] = branchName;
$[21] = displayUrl;
$[22] = environmentId;
$[23] = error;
$[24] = indicator;
$[25] = onDone;
$[26] = qrText;
$[27] = sessionActive;
$[28] = sessionId;
$[29] = showQR;
$[30] = statusColor;
$[31] = statusLabel;
$[32] = verbose;
$[33] = T0;
$[34] = T1;
$[35] = footerText;
$[36] = t11;
$[37] = t12;
$[38] = t13;
$[39] = t14;
$[40] = t15;
$[41] = t16;
$[42] = t17;
} else {
T0 = $[33];
T1 = $[34];
footerText = $[35];
t11 = $[36];
t12 = $[37];
t13 = $[38];
t14 = $[39];
t15 = $[40];
t16 = $[41];
t17 = $[42];
}
let t18;
if ($[71] !== footerText) {
t18 = footerText && <Text dimColor={true}>{footerText}</Text>;
$[71] = footerText;
$[72] = t18;
} else {
t18 = $[72];
}
let t19;
if ($[73] === Symbol.for("react.memo_cache_sentinel")) {
t19 = <Text dimColor={true}>d to disconnect · space for QR code · Enter/Esc to close</Text>;
$[73] = t19;
} else {
t19 = $[73];
}
let t20;
if ($[74] !== T0 || $[75] !== t11 || $[76] !== t12 || $[77] !== t13 || $[78] !== t14 || $[79] !== t18) {
t20 = <T0 flexDirection={t11} gap={t12}>{t13}{t14}{t18}{t19}</T0>;
$[74] = T0;
$[75] = t11;
$[76] = t12;
$[77] = t13;
$[78] = t14;
$[79] = t18;
$[80] = t20;
} else {
t20 = $[80];
}
let t21;
if ($[81] !== T1 || $[82] !== t15 || $[83] !== t16 || $[84] !== t17 || $[85] !== t20) {
t21 = <T1 title={t15} onCancel={t16} hideInputGuide={t17}>{t20}</T1>;
$[81] = T1;
$[82] = t15;
$[83] = t16;
$[84] = t17;
$[85] = t20;
$[86] = t21;
} else {
t21 = $[86];
}
return t21;
}
function _temp14(line, i) {
return <Text key={i}>{line}</Text>;
}
function _temp13(l) {
return l.length > 0;
}
function _temp12(prev_0) {
if (!prev_0.replBridgeEnabled) {
return prev_0;
}
return {
...prev_0,
replBridgeEnabled: false
};
}
function _temp11(current) {
if (current.remoteControlAtStartup === false) {
return current;
}
return {
...current,
remoteControlAtStartup: false
};
}
function _temp10(prev) {
return !prev;
}
function _temp1() {}
function _temp0(s_8) {
return s_8.verbose;
}
function _temp9(s_7) {
return s_7.replBridgeSessionId;
}
function _temp8(s_6) {
return s_6.replBridgeEnvironmentId;
}
function _temp7(s_5) {
return s_5.replBridgeExplicit;
}
function _temp6(s_4) {
return s_4.replBridgeError;
}
function _temp5(s_3) {
return s_3.replBridgeSessionUrl;
}
function _temp4(s_2) {
return s_2.replBridgeConnectUrl;
}
function _temp3(s_1) {
return s_1.replBridgeReconnecting;
}
function _temp2(s_0) {
return s_0.replBridgeSessionActive;
}
function _temp(s) {
return s.replBridgeConnected;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXNlbmFtZSIsInRvU3RyaW5nIiwicXJUb1N0cmluZyIsIlJlYWN0IiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJnZXRPcmlnaW5hbEN3ZCIsImJ1aWxkQWN0aXZlRm9vdGVyVGV4dCIsImJ1aWxkSWRsZUZvb3RlclRleHQiLCJGQUlMRURfRk9PVEVSX1RFWFQiLCJnZXRCcmlkZ2VTdGF0dXMiLCJCUklER0VfRkFJTEVEX0lORElDQVRPUiIsIkJSSURHRV9SRUFEWV9JTkRJQ0FUT1IiLCJ1c2VSZWdpc3Rlck92ZXJsYXkiLCJCb3giLCJUZXh0IiwidXNlSW5wdXQiLCJ1c2VLZXliaW5kaW5ncyIsInVzZUFwcFN0YXRlIiwidXNlU2V0QXBwU3RhdGUiLCJzYXZlR2xvYmFsQ29uZmlnIiwiZ2V0QnJhbmNoIiwiRGlhbG9nIiwiUHJvcHMiLCJvbkRvbmUiLCJCcmlkZ2VEaWFsb2ciLCJ0MCIsIiQiLCJfYyIsImNvbm5lY3RlZCIsIl90ZW1wIiwic2Vzc2lvbkFjdGl2ZSIsIl90ZW1wMiIsInJlY29ubmVjdGluZyIsIl90ZW1wMyIsImNvbm5lY3RVcmwiLCJfdGVtcDQiLCJzZXNzaW9uVXJsIiwiX3RlbXA1IiwiZXJyb3IiLCJfdGVtcDYiLCJleHBsaWNpdCIsIl90ZW1wNyIsImVudmlyb25tZW50SWQiLCJfdGVtcDgiLCJzZXNzaW9uSWQiLCJfdGVtcDkiLCJ2ZXJib3NlIiwiX3RlbXAwIiwic2V0QXBwU3RhdGUiLCJzaG93UVIiLCJzZXRTaG93UVIiLCJxclRleHQiLCJzZXRRclRleHQiLCJicmFuY2hOYW1lIiwic2V0QnJhbmNoTmFtZSIsInQxIiwiU3ltYm9sIiwiZm9yIiwicmVwb05hbWUiLCJ0MiIsInQzIiwidGhlbiIsImNhdGNoIiwiX3RlbXAxIiwiZGlzcGxheVVybCIsInQ0IiwidDUiLCJ0eXBlIiwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLCJzbWFsbCIsInQ2IiwiX3RlbXAxMCIsInQ3IiwidDgiLCJjb250ZXh0IiwidDkiLCJpbnB1dCIsIl90ZW1wMTEiLCJfdGVtcDEyIiwidDEwIiwibGFiZWwiLCJzdGF0dXNMYWJlbCIsImNvbG9yIiwic3RhdHVzQ29sb3IiLCJpbmRpY2F0b3IiLCJUMCIsIlQxIiwiZm9vdGVyVGV4dCIsInQxMSIsInQxMiIsInQxMyIsInQxNCIsInQxNSIsInQxNiIsInQxNyIsInFyTGluZXMiLCJzcGxpdCIsImZpbHRlciIsIl90ZW1wMTMiLCJjb250ZXh0UGFydHMiLCJwdXNoIiwiY29udGV4dFN1ZmZpeCIsImxlbmd0aCIsImpvaW4iLCJ0MTgiLCJ1bmRlZmluZWQiLCJ0MTkiLCJ0MjAiLCJ0MjEiLCJ0MjIiLCJ0MjMiLCJ0MjQiLCJtYXAiLCJfdGVtcDE0IiwibGluZSIsImkiLCJsIiwicHJldl8wIiwicHJldiIsInJlcGxCcmlkZ2VFbmFibGVkIiwiY3VycmVudCIsInJlbW90ZUNvbnRyb2xBdFN0YXJ0dXAiLCJzXzgiLCJzIiwic183IiwicmVwbEJyaWRnZVNlc3Npb25JZCIsInNfNiIsInJlcGxCcmlkZ2VFbnZpcm9ubWVudElkIiwic181IiwicmVwbEJyaWRnZUV4cGxpY2l0Iiwic180IiwicmVwbEJyaWRnZUVycm9yIiwic18zIiwicmVwbEJyaWRnZVNlc3Npb25VcmwiLCJzXzIiLCJyZXBsQnJpZGdlQ29ubmVjdFVybCIsInNfMSIsInJlcGxCcmlkZ2VSZWNvbm5lY3RpbmciLCJzXzAiLCJyZXBsQnJpZGdlU2Vzc2lvbkFjdGl2ZSIsInJlcGxCcmlkZ2VDb25uZWN0ZWQiXSwic291cmNlcyI6WyJCcmlkZ2VEaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IHRvU3RyaW5nIGFzIHFyVG9TdHJpbmcgfSBmcm9tICdxcmNvZGUnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGdldE9yaWdpbmFsQ3dkIH0gZnJvbSAnLi4vYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHtcbiAgYnVpbGRBY3RpdmVGb290ZXJUZXh0LFxuICBidWlsZElkbGVGb290ZXJUZXh0LFxuICBGQUlMRURfRk9PVEVSX1RFWFQsXG4gIGdldEJyaWRnZVN0YXR1cyxcbn0gZnJvbSAnLi4vYnJpZGdlL2JyaWRnZVN0YXR1c1V0aWwuanMnXG5pbXBvcnQge1xuICBCUklER0VfRkFJTEVEX0lORElDQVRPUixcbiAgQlJJREdFX1JFQURZX0lORElDQVRPUixcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2ZpZ3VyZXMuanMnXG5pbXBvcnQgeyB1c2VSZWdpc3Rlck92ZXJsYXkgfSBmcm9tICcuLi9jb250ZXh0L292ZXJsYXlDb250ZXh0LmpzJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGN1c3RvbS1ydWxlcy9wcmVmZXItdXNlLWtleWJpbmRpbmdzIC0tIHJhdyAnZCcga2V5IGZvciBkaXNjb25uZWN0LCBub3QgYSBjb25maWd1cmFibGUga2V5YmluZGluZyBhY3Rpb25cbmltcG9ydCB7IEJveCwgVGV4dCwgdXNlSW5wdXQgfSBmcm9tICcuLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5ncyB9IGZyb20gJy4uL2tleWJpbmRpbmdzL3VzZUtleWJpbmRpbmcuanMnXG5pbXBvcnQgeyB1c2VBcHBTdGF0ZSwgdXNlU2V0QXBwU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB7IHNhdmVHbG9iYWxDb25maWcgfSBmcm9tICcuLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyBnZXRCcmFuY2ggfSBmcm9tICcuLi91dGlscy9naXQuanMnXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICcuL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBvbkRvbmU6ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJyaWRnZURpYWxvZyh7IG9uRG9uZSB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHVzZVJlZ2lzdGVyT3ZlcmxheSgnYnJpZGdlLWRpYWxvZycpXG5cbiAgY29uc3QgY29ubmVjdGVkID0gdXNlQXBwU3RhdGUocyA9PiBzLnJlcGxCcmlkZ2VDb25uZWN0ZWQpXG4gIGNvbnN0IHNlc3Npb25BY3RpdmUgPSB1c2VBcHBTdGF0ZShzID0+IHMucmVwbEJyaWRnZVNlc3Npb25BY3RpdmUpXG4gIGNvbnN0IHJlY29ubmVjdGluZyA9IHVzZUFwcFN0YXRlKHMgPT4gcy5yZXBsQnJpZGdlUmVjb25uZWN0aW5nKVxuICBjb25zdCBjb25uZWN0VXJsID0gdXNlQXBwU3RhdGUocyA9PiBzLnJlcGxCcmlkZ2VDb25uZWN0VXJsKVxuICBjb25zdCBzZXNzaW9