claude-code/src/components/SessionBackgroundHint.tsx

108 lines
13 KiB
TypeScript
Raw Normal View History

2026-03-31 19:22:47 +08:00
import { c as _c } from "react/compiler-runtime";
import * as React from 'react';
import { useCallback, useState } from 'react';
import { useDoublePress } from '../hooks/useDoublePress.js';
import { Box, Text } from '../ink.js';
import { useKeybinding } from '../keybindings/useKeybinding.js';
import { useShortcutDisplay } from '../keybindings/useShortcutDisplay.js';
import { useAppState, useAppStateStore, useSetAppState } from '../state/AppState.js';
import { backgroundAll, hasForegroundTasks } from '../tasks/LocalShellTask/LocalShellTask.js';
import { getGlobalConfig, saveGlobalConfig } from '../utils/config.js';
import { env } from '../utils/env.js';
import { isEnvTruthy } from '../utils/envUtils.js';
import { KeyboardShortcutHint } from './design-system/KeyboardShortcutHint.js';
type Props = {
onBackgroundSession: () => void;
isLoading: boolean;
};
/**
* Shows a hint when user presses Ctrl+B to background the current session.
* Uses double-press pattern: first press shows hint, second press within 800ms backgrounds.
*
* Only activates when:
* 1. isLoading is true (a query is in progress)
* 2. No foreground tasks (bash/agent) are running (those take priority for Ctrl+B)
*/
export function SessionBackgroundHint(t0) {
const $ = _c(10);
const {
onBackgroundSession,
isLoading
} = t0;
const setAppState = useSetAppState();
const appStateStore = useAppStateStore();
const [showSessionHint, setShowSessionHint] = useState(false);
const handleDoublePress = useDoublePress(setShowSessionHint, onBackgroundSession, _temp);
let t1;
if ($[0] !== appStateStore || $[1] !== handleDoublePress || $[2] !== isLoading || $[3] !== setAppState) {
t1 = () => {
if (isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_BACKGROUND_TASKS)) {
return;
}
const state = appStateStore.getState();
if (hasForegroundTasks(state)) {
backgroundAll(() => appStateStore.getState(), setAppState);
if (!getGlobalConfig().hasUsedBackgroundTask) {
saveGlobalConfig(_temp2);
}
} else {
if (isEnvTruthy("false") && isLoading) {
handleDoublePress();
}
}
};
$[0] = appStateStore;
$[1] = handleDoublePress;
$[2] = isLoading;
$[3] = setAppState;
$[4] = t1;
} else {
t1 = $[4];
}
const handleBackground = t1;
const hasForeground = useAppState(hasForegroundTasks);
let t2;
if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
t2 = isEnvTruthy("false");
$[5] = t2;
} else {
t2 = $[5];
}
const sessionBgEnabled = t2;
const t3 = hasForeground || sessionBgEnabled && isLoading;
let t4;
if ($[6] !== t3) {
t4 = {
context: "Task",
isActive: t3
};
$[6] = t3;
$[7] = t4;
} else {
t4 = $[7];
}
useKeybinding("task:background", handleBackground, t4);
const baseShortcut = useShortcutDisplay("task:background", "Task", "ctrl+b");
const shortcut = env.terminal === "tmux" && baseShortcut === "ctrl+b" ? "ctrl+b ctrl+b" : baseShortcut;
if (!isLoading || !showSessionHint) {
return null;
}
let t5;
if ($[8] !== shortcut) {
t5 = <Box paddingLeft={2}><Text dimColor={true}><KeyboardShortcutHint shortcut={shortcut} action="background" /></Text></Box>;
$[8] = shortcut;
$[9] = t5;
} else {
t5 = $[9];
}
return t5;
}
function _temp2(c) {
return c.hasUsedBackgroundTask ? c : {
...c,
hasUsedBackgroundTask: true
};
}
function _temp() {}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlU3RhdGUiLCJ1c2VEb3VibGVQcmVzcyIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5nIiwidXNlU2hvcnRjdXREaXNwbGF5IiwidXNlQXBwU3RhdGUiLCJ1c2VBcHBTdGF0ZVN0b3JlIiwidXNlU2V0QXBwU3RhdGUiLCJiYWNrZ3JvdW5kQWxsIiwiaGFzRm9yZWdyb3VuZFRhc2tzIiwiZ2V0R2xvYmFsQ29uZmlnIiwic2F2ZUdsb2JhbENvbmZpZyIsImVudiIsImlzRW52VHJ1dGh5IiwiS2V5Ym9hcmRTaG9ydGN1dEhpbnQiLCJQcm9wcyIsIm9uQmFja2dyb3VuZFNlc3Npb24iLCJpc0xvYWRpbmciLCJTZXNzaW9uQmFja2dyb3VuZEhpbnQiLCJ0MCIsIiQiLCJfYyIsInNldEFwcFN0YXRlIiwiYXBwU3RhdGVTdG9yZSIsInNob3dTZXNzaW9uSGludCIsInNldFNob3dTZXNzaW9uSGludCIsImhhbmRsZURvdWJsZVByZXNzIiwiX3RlbXAiLCJ0MSIsInByb2Nlc3MiLCJDTEFVREVfQ09ERV9ESVNBQkxFX0JBQ0tHUk9VTkRfVEFTS1MiLCJzdGF0ZSIsImdldFN0YXRlIiwiaGFzVXNlZEJhY2tncm91bmRUYXNrIiwiX3RlbXAyIiwiaGFuZGxlQmFja2dyb3VuZCIsImhhc0ZvcmVncm91bmQiLCJ0MiIsIlN5bWJvbCIsImZvciIsInNlc3Npb25CZ0VuYWJsZWQiLCJ0MyIsInQ0IiwiY29udGV4dCIsImlzQWN0aXZlIiwiYmFzZVNob3J0Y3V0Iiwic2hvcnRjdXQiLCJ0ZXJtaW5hbCIsInQ1IiwiYyJdLCJzb3VyY2VzIjpbIlNlc3Npb25CYWNrZ3JvdW5kSGludC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZURvdWJsZVByZXNzIH0gZnJvbSAnLi4vaG9va3MvdXNlRG91YmxlUHJlc3MuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5nIH0gZnJvbSAnLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7IHVzZVNob3J0Y3V0RGlzcGxheSB9IGZyb20gJy4uL2tleWJpbmRpbmdzL3VzZVNob3J0Y3V0RGlzcGxheS5qcydcbmltcG9ydCB7XG4gIHVzZUFwcFN0YXRlLFxuICB1c2VBcHBTdGF0ZVN0b3JlLFxuICB1c2VTZXRBcHBTdGF0ZSxcbn0gZnJvbSAnLi4vc3RhdGUvQXBwU3RhdGUuanMnXG5pbXBvcnQge1xuICBiYWNrZ3JvdW5kQWxsLFxuICBoYXNGb3JlZ3JvdW5kVGFza3MsXG59IGZyb20gJy4uL3Rhc2tzL0xvY2FsU2hlbGxUYXNrL0xvY2FsU2hlbGxUYXNrLmpzJ1xuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnLCBzYXZlR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLmpzJ1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJ1xuaW1wb3J0IHsgaXNFbnZUcnV0aHkgfSBmcm9tICcuLi91dGlscy9lbnZVdGlscy5qcydcbmltcG9ydCB7IEtleWJvYXJkU2hvcnRjdXRIaW50IH0gZnJvbSAnLi9kZXNpZ24tc3lzdGVtL0tleWJvYXJkU2hvcnRjdXRIaW50LmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBvbkJhY2tncm91bmRTZXNzaW9uOiAoKSA9PiB2b2lkXG4gIGlzTG9hZGluZzogYm9vbGVhblxufVxuXG4vKipcbiAqIFNob3dzIGEgaGludCB3aGVuIHVzZXIgcHJlc3NlcyBDdHJsK0IgdG8gYmFja2dyb3VuZCB0aGUgY3VycmVudCBzZXNzaW9uLlxuICogVXNlcyBkb3VibGUtcHJlc3MgcGF0dGVybjogZmlyc3QgcHJlc3Mgc2hvd3MgaGludCwgc2Vjb25kIHByZXNzIHdpdGhpbiA4MDBtcyBiYWNrZ3JvdW5kcy5cbiAqXG4gKiBPbmx5IGFjdGl2YXRlcyB3aGVuOlxuICogMS4gaXNMb2FkaW5nIGlzIHRydWUgKGEgcXVlcnkgaXMgaW4gcHJvZ3Jlc3MpXG4gKiAyLiBObyBmb3JlZ3JvdW5kIHRhc2tzIChiYXNoL2FnZW50KSBhcmUgcnVubmluZyAodGhvc2UgdGFrZSBwcmlvcml0eSBmb3IgQ3RybCtCKVxuICovXG5leHBvcnQgZnVuY3Rpb24gU2Vzc2lvbkJhY2tncm91bmRIaW50KHtcbiAgb25CYWNrZ3JvdW5kU2Vzc2lvbixcbiAgaXNMb2FkaW5nLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdEVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3Qgc2V0QXBwU3RhdGUgPSB1c2VTZXRBcHBTdGF0ZSgpXG4gIGNvbnN0IGFwcFN0YXRlU3RvcmUgPSB1c2VBcHBTdGF0ZVN0b3JlKClcblxuICBjb25zdCBbc2hvd1Nlc3Npb25IaW50LCBzZXRTaG93U2Vzc2lvbkhpbnRdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgaGFuZGxlRG91YmxlUHJlc3MgPSB1c2VEb3VibGVQcmVzcyhcbiAgICBzZXRTaG93U2Vzc2lvbkhpbnQsXG4gICAgb25CYWNrZ3JvdW5kU2Vzc2lvbixcbiAgICAoKSA9PiB7fSwgLy8gRmlyc3QgcHJlc3MganVzdCBzaG93cyB0aGUgaGludFxuICApXG5cbiAgLy8gSGFuZGxlciBmb3IgdGFzazpiYWNrZ3JvdW5kIC0gcHJpb3JpdGl6ZXMgZm9yZWdyb3VuZCB0YXNrcywgZmFsbHMgYmFjayB0byBzZXNzaW9uIGJhY2tncm91bmRpbmdcbiAgLy8gU2tpcCBhbGwgYmFja2dyb3VuZCBmdW5jdGlvbmFsaXR5IGlmIGJhY2tncm91bmQgdGFza3MgYXJlIGRpc2FibGVkXG4gIGNvbnN0IGhhbmRsZUJhY2tncm91bmQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGlzRW52VHJ1dGh5KHByb2Nlc3MuZW52LkNMQVVERV9DT0RFX0RJU0FCTEVfQkFDS0dST1VORF9UQVNLUykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IGFwcFN0YXRlU3RvcmUuZ2V0U3RhdGUoKVxuICAgIGlmIChoYXNGb3JlZ3JvdW5kVGFza3Moc3RhdGUpKSB7XG4gICAgICAvLyBFeGlzdGluZyBiZWhhdmlvciAtIGJhY2tncm91bmQgcnVubmluZyBiYXNoL2FnZW50IHRhc2tzXG4gICAgICBiYWNrZ3JvdW5kQWxsKCgpID0+IGFwcFN0YXRlU3RvcmUuZ2V0U3RhdGUoKSwgc2V0QXBwU3RhdGUpXG4gICAgICBpZiAoIWdldEdsb2JhbENvbmZpZygpLmhhc1VzZWRCYWNrZ3JvdW5kVGFzaykge1xuICAgICAgICBzYXZlR2xvYmFsQ29uZmlnKGMgPT5cbiAgICAgICAgICB