mirror of
http://10.0.2.1:3031/sauer/claude-code.git
synced 2026-06-30 16:26:58 +10:00
200 lines
23 KiB
TypeScript
200 lines
23 KiB
TypeScript
|
|
import { c as _c } from "react/compiler-runtime";
|
||
|
|
import { feature } from 'bun:bundle';
|
||
|
|
import React, { useContext, useEffect, useEffectEvent, useState, useSyncExternalStore } from 'react';
|
||
|
|
import { MailboxProvider } from '../context/mailbox.js';
|
||
|
|
import { useSettingsChange } from '../hooks/useSettingsChange.js';
|
||
|
|
import { logForDebugging } from '../utils/debug.js';
|
||
|
|
import { createDisabledBypassPermissionsContext, isBypassPermissionsModeDisabled } from '../utils/permissions/permissionSetup.js';
|
||
|
|
import { applySettingsChange } from '../utils/settings/applySettingsChange.js';
|
||
|
|
import type { SettingSource } from '../utils/settings/constants.js';
|
||
|
|
import { createStore } from './store.js';
|
||
|
|
|
||
|
|
// DCE: voice context is ant-only. External builds get a passthrough.
|
||
|
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
||
|
|
const VoiceProvider: (props: {
|
||
|
|
children: React.ReactNode;
|
||
|
|
}) => React.ReactNode = feature('VOICE_MODE') ? require('../context/voice.js').VoiceProvider : ({
|
||
|
|
children
|
||
|
|
}) => children;
|
||
|
|
|
||
|
|
/* eslint-enable @typescript-eslint/no-require-imports */
|
||
|
|
import { type AppState, type AppStateStore, getDefaultAppState } from './AppStateStore.js';
|
||
|
|
|
||
|
|
// TODO: Remove these re-exports once all callers import directly from
|
||
|
|
// ./AppStateStore.js. Kept for back-compat during migration so .ts callers
|
||
|
|
// can incrementally move off the .tsx import and stop pulling React.
|
||
|
|
export { type AppState, type AppStateStore, type CompletionBoundary, getDefaultAppState, IDLE_SPECULATION_STATE, type SpeculationResult, type SpeculationState } from './AppStateStore.js';
|
||
|
|
export const AppStoreContext = React.createContext<AppStateStore | null>(null);
|
||
|
|
type Props = {
|
||
|
|
children: React.ReactNode;
|
||
|
|
initialState?: AppState;
|
||
|
|
onChangeAppState?: (args: {
|
||
|
|
newState: AppState;
|
||
|
|
oldState: AppState;
|
||
|
|
}) => void;
|
||
|
|
};
|
||
|
|
const HasAppStateContext = React.createContext<boolean>(false);
|
||
|
|
export function AppStateProvider(t0) {
|
||
|
|
const $ = _c(13);
|
||
|
|
const {
|
||
|
|
children,
|
||
|
|
initialState,
|
||
|
|
onChangeAppState
|
||
|
|
} = t0;
|
||
|
|
const hasAppStateContext = useContext(HasAppStateContext);
|
||
|
|
if (hasAppStateContext) {
|
||
|
|
throw new Error("AppStateProvider can not be nested within another AppStateProvider");
|
||
|
|
}
|
||
|
|
let t1;
|
||
|
|
if ($[0] !== initialState || $[1] !== onChangeAppState) {
|
||
|
|
t1 = () => createStore(initialState ?? getDefaultAppState(), onChangeAppState);
|
||
|
|
$[0] = initialState;
|
||
|
|
$[1] = onChangeAppState;
|
||
|
|
$[2] = t1;
|
||
|
|
} else {
|
||
|
|
t1 = $[2];
|
||
|
|
}
|
||
|
|
const [store] = useState(t1);
|
||
|
|
let t2;
|
||
|
|
if ($[3] !== store) {
|
||
|
|
t2 = () => {
|
||
|
|
const {
|
||
|
|
toolPermissionContext
|
||
|
|
} = store.getState();
|
||
|
|
if (toolPermissionContext.isBypassPermissionsModeAvailable && isBypassPermissionsModeDisabled()) {
|
||
|
|
logForDebugging("Disabling bypass permissions mode on mount (remote settings loaded before mount)");
|
||
|
|
store.setState(_temp);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
$[3] = store;
|
||
|
|
$[4] = t2;
|
||
|
|
} else {
|
||
|
|
t2 = $[4];
|
||
|
|
}
|
||
|
|
let t3;
|
||
|
|
if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t3 = [];
|
||
|
|
$[5] = t3;
|
||
|
|
} else {
|
||
|
|
t3 = $[5];
|
||
|
|
}
|
||
|
|
useEffect(t2, t3);
|
||
|
|
let t4;
|
||
|
|
if ($[6] !== store.setState) {
|
||
|
|
t4 = source => applySettingsChange(source, store.setState);
|
||
|
|
$[6] = store.setState;
|
||
|
|
$[7] = t4;
|
||
|
|
} else {
|
||
|
|
t4 = $[7];
|
||
|
|
}
|
||
|
|
const onSettingsChange = useEffectEvent(t4);
|
||
|
|
useSettingsChange(onSettingsChange);
|
||
|
|
let t5;
|
||
|
|
if ($[8] !== children) {
|
||
|
|
t5 = <MailboxProvider><VoiceProvider>{children}</VoiceProvider></MailboxProvider>;
|
||
|
|
$[8] = children;
|
||
|
|
$[9] = t5;
|
||
|
|
} else {
|
||
|
|
t5 = $[9];
|
||
|
|
}
|
||
|
|
let t6;
|
||
|
|
if ($[10] !== store || $[11] !== t5) {
|
||
|
|
t6 = <HasAppStateContext.Provider value={true}><AppStoreContext.Provider value={store}>{t5}</AppStoreContext.Provider></HasAppStateContext.Provider>;
|
||
|
|
$[10] = store;
|
||
|
|
$[11] = t5;
|
||
|
|
$[12] = t6;
|
||
|
|
} else {
|
||
|
|
t6 = $[12];
|
||
|
|
}
|
||
|
|
return t6;
|
||
|
|
}
|
||
|
|
function _temp(prev) {
|
||
|
|
return {
|
||
|
|
...prev,
|
||
|
|
toolPermissionContext: createDisabledBypassPermissionsContext(prev.toolPermissionContext)
|
||
|
|
};
|
||
|
|
}
|
||
|
|
function useAppStore(): AppStateStore {
|
||
|
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
||
|
|
const store = useContext(AppStoreContext);
|
||
|
|
if (!store) {
|
||
|
|
throw new ReferenceError('useAppState/useSetAppState cannot be called outside of an <AppStateProvider />');
|
||
|
|
}
|
||
|
|
return store;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Subscribe to a slice of AppState. Only re-renders when the selected value
|
||
|
|
* changes (compared via Object.is).
|
||
|
|
*
|
||
|
|
* For multiple independent fields, call the hook multiple times:
|
||
|
|
* ```
|
||
|
|
* const verbose = useAppState(s => s.verbose)
|
||
|
|
* const model = useAppState(s => s.mainLoopModel)
|
||
|
|
* ```
|
||
|
|
*
|
||
|
|
* Do NOT return new objects from the selector -- Object.is will always see
|
||
|
|
* them as changed. Instead, select an existing sub-object reference:
|
||
|
|
* ```
|
||
|
|
* const { text, promptId } = useAppState(s => s.promptSuggestion) // good
|
||
|
|
* ```
|
||
|
|
*/
|
||
|
|
export function useAppState(selector) {
|
||
|
|
const $ = _c(3);
|
||
|
|
const store = useAppStore();
|
||
|
|
let t0;
|
||
|
|
if ($[0] !== selector || $[1] !== store) {
|
||
|
|
t0 = () => {
|
||
|
|
const state = store.getState();
|
||
|
|
const selected = selector(state);
|
||
|
|
if (false && state === selected) {
|
||
|
|
throw new Error(`Your selector in \`useAppState(${selector.toString()})\` returned the original state, which is not allowed. You must instead return a property for optimised rendering.`);
|
||
|
|
}
|
||
|
|
return selected;
|
||
|
|
};
|
||
|
|
$[0] = selector;
|
||
|
|
$[1] = store;
|
||
|
|
$[2] = t0;
|
||
|
|
} else {
|
||
|
|
t0 = $[2];
|
||
|
|
}
|
||
|
|
const get = t0;
|
||
|
|
return useSyncExternalStore(store.subscribe, get, get);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the setAppState updater without subscribing to any state.
|
||
|
|
* Returns a stable reference that never changes -- components using only
|
||
|
|
* this hook will never re-render from state changes.
|
||
|
|
*/
|
||
|
|
export function useSetAppState() {
|
||
|
|
return useAppStore().setState;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the store directly (for passing getState/setState to non-React code).
|
||
|
|
*/
|
||
|
|
export function useAppStateStore() {
|
||
|
|
return useAppStore();
|
||
|
|
}
|
||
|
|
const NOOP_SUBSCRIBE = () => () => {};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Safe version of useAppState that returns undefined if called outside of AppStateProvider.
|
||
|
|
* Useful for components that may be rendered in contexts where AppStateProvider isn't available.
|
||
|
|
*/
|
||
|
|
export function useAppStateMaybeOutsideOfProvider(selector) {
|
||
|
|
const $ = _c(3);
|
||
|
|
const store = useContext(AppStoreContext);
|
||
|
|
let t0;
|
||
|
|
if ($[0] !== selector || $[1] !== store) {
|
||
|
|
t0 = () => store ? selector(store.getState()) : undefined;
|
||
|
|
$[0] = selector;
|
||
|
|
$[1] = store;
|
||
|
|
$[2] = t0;
|
||
|
|
} else {
|
||
|
|
t0 = $[2];
|
||
|
|
}
|
||
|
|
return useSyncExternalStore(store ? store.subscribe : NOOP_SUBSCRIBE, t0);
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJ1c2VDb250ZXh0IiwidXNlRWZmZWN0IiwidXNlRWZmZWN0RXZlbnQiLCJ1c2VTdGF0ZSIsInVzZVN5bmNFeHRlcm5hbFN0b3JlIiwiTWFpbGJveFByb3ZpZGVyIiwidXNlU2V0dGluZ3NDaGFuZ2UiLCJsb2dGb3JEZWJ1Z2dpbmciLCJjcmVhdGVEaXNhYmxlZEJ5cGFzc1Blcm1pc3Npb25zQ29udGV4dCIsImlzQnlwYXNzUGVybWlzc2lvbnNNb2RlRGlzYWJsZWQiLCJhcHBseVNldHRpbmdzQ2hhbmdlIiwiU2V0dGluZ1NvdXJjZSIsImNyZWF0ZVN0b3JlIiwiVm9pY2VQcm92aWRlciIsInByb3BzIiwiY2hpbGRyZW4iLCJSZWFjdE5vZGUiLCJyZXF1aXJlIiwiQXBwU3RhdGUiLCJBcHBTdGF0ZVN0b3JlIiwiZ2V0RGVmYXVsdEFwcFN0YXRlIiwiQ29tcGxldGlvbkJvdW5kYXJ5IiwiSURMRV9TUEVDVUxBVElPTl9TVEFURSIsIlNwZWN1bGF0aW9uUmVzdWx0IiwiU3BlY3VsYXRpb25TdGF0ZSIsIkFwcFN0b3JlQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJQcm9wcyIsImluaXRpYWxTdGF0ZSIsIm9uQ2hhbmdlQXBwU3RhdGUiLCJhcmdzIiwibmV3U3RhdGUiLCJvbGRTdGF0ZSIsIkhhc0FwcFN0YXRlQ29udGV4dCIsIkFwcFN0YXRlUHJvdmlkZXIiLCJ0MCIsIiQiLCJfYyIsImhhc0FwcFN0YXRlQ29udGV4dCIsIkVycm9yIiwidDEiLCJzdG9yZSIsInQyIiwidG9vbFBlcm1pc3Npb25Db250ZXh0IiwiZ2V0U3RhdGUiLCJpc0J5cGFzc1Blcm1pc3Npb25zTW9kZUF2YWlsYWJsZSIsInNldFN0YXRlIiwiX3RlbXAiLCJ0MyIsIlN5bWJvbCIsImZvciIsInQ0Iiwic291cmNlIiwib25TZXR0aW5nc0NoYW5nZSIsInQ1IiwidDYiLCJwcmV2IiwidXNlQXBwU3RvcmUiLCJSZWZlcmVuY2VFcnJvciIsInVzZUFwcFN0YXRlIiwic2VsZWN0b3IiLCJzdGF0ZSIsInNlbGVjdGVkIiwidG9TdHJpbmciLCJnZXQiLCJzdWJzY3JpYmUiLCJ1c2VTZXRBcHBTdGF0ZSIsInVzZUFwcFN0YXRlU3RvcmUiLCJOT09QX1NVQlNDUklCRSIsInVzZUFwcFN0YXRlTWF5YmVPdXRzaWRlT2ZQcm92aWRlciIsInVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIkFwcFN0YXRlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmZWF0dXJlIH0gZnJvbSAnYnVuOmJ1bmRsZSdcbmltcG9ydCBSZWFjdCwge1xuICB1c2VDb250ZXh0LFxuICB1c2VFZmZlY3QsXG4gIHVzZUVmZmVjdEV2ZW50LFxuICB1c2VTdGF0ZSxcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUsXG59IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTWFpbGJveFByb3ZpZGVyIH0gZnJvbSAnLi4vY29udGV4dC9tYWlsYm94LmpzJ1xuaW1wb3J0IHsgdXNlU2V0dGluZ3NDaGFuZ2UgfSBmcm9tICcuLi9ob29rcy91c2VTZXR0aW5nc0NoYW5nZS5qcydcbmltcG9ydCB7IGxvZ0ZvckRlYnVnZ2luZyB9IGZyb20gJy4uL3V0aWxzL2RlYnVnLmpzJ1xuaW1wb3J0IHtcbiAgY3JlYXRlRGlzYWJsZWRCeXBhc3NQZXJtaXNzaW9uc0NvbnRleHQsXG4gIGlzQnlwYXNzUGVybWlzc2lvbnNNb2RlRGlzYWJsZWQsXG59IGZyb20gJy4uL3V0aWxzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25TZXR1cC5qcydcbmltcG9ydCB7IGFwcGx5U2V0dGluZ3NDaGFuZ2UgfSBmcm9tICcuLi91dGlscy9zZXR0aW5ncy9hcHBseVNldHRpbmdzQ2hhbmdlLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nU291cmNlIH0gZnJvbSAnLi4vdXRpbHMvc2V0dGluZ3MvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICcuL3N0b3JlLmpzJ1xuXG4vLyBEQ0U6IHZvaWNlIGNvbnRleHQgaXMgYW50LW9ubHkuIEV4dGVybmFsIGJ1aWxkcyBnZXQgYSBwYXNzdGhyb3VnaC5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmNvbnN0IFZvaWNlUHJvdmlkZXI6IChwcm9wczogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pID0+IFJlYWN0LlJlYWN0Tm9kZSA9XG4gIGZlYXR1cmUoJ1ZPSUNFX01PREUnKVxuICAgID8gcmVxdWlyZSgnLi4vY29udGV4dC92b2ljZS5qcycpLlZvaWNlUHJvdmlkZXJcbiAgICA6ICh7IGNoaWxkcmVuIH0pID0+IGNoaWxkcmVuXG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuaW1wb3J0IHtcbiAgdHlwZSBBcHBTdGF0ZSxcbiAgdHlwZSBBcHBTdGF0ZVN0b3JlLFxuICBnZXREZWZhdWx0QXBwU3RhdGUsXG59IGZyb20gJy4vQXBwU3RhdGVTdG9yZS5qcydcblxuLy8gVE9ETzogUmVtb3ZlIHRoZXNlIHJlLWV4cG9ydHMgb25jZSBhbGwgY2FsbGVycyBpbXBvcnQgZGlyZWN0bHkgZnJvbVxuLy8gLi9BcHBTdGF0ZVN0b3JlLmpzLiBLZXB0IGZvciBiYWNrLWNvbXBhdCBkdXJpbmcgbWlncmF0aW9uIHNvIC50cyBjYWxsZXJzXG4vLyBjYW4gaW5jcmVtZW50YWxseSBtb3ZlIG9mZiB0aGUgLnRzeCBpbXBvcnQgYW5kIHN0b3AgcHVsbGluZyBSZWFjdC5cbmV4cG9ydCB7XG4gIHR5cGUgQXBwU3RhdGUsXG4gIHR5cGUgQXBwU3RhdGVTdG9yZSxcbiAgdHlwZSBDb21wbGV0aW9uQm91bmRhcnksXG4gIGdldERlZmF1bHRBcHBTdGF0ZSxcbiAgSURMRV9TUEVDVUxBVElPTl9TVEFURSxcbiAgdHlwZSBTcGVjdWxhdGlvblJlc3VsdCxcbiAgdHlwZSBTcGVjdWxhdGlvblN0YXRlLFxufSBmcm9tICcuL0FwcFN0YXRlU3RvcmUuanMnXG5cbmV4cG9ydCBjb25zdCBBcHBTdG9yZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PEFwcFN0YXRlU3RvcmUgfCBudWxsPihudWxsKVxuXG50eXBlIFByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG4gIGluaXRpYWxTdGF0ZT86IEFwcFN0YXRlXG4gIG9uQ2hhbmdlQXBwU3RhdGU/OiAoYXJnczogeyBuZXdTdGF0ZTogQXBwU3RhdGU7IG9sZFN0YXRlOiBBcHBTdGF0ZSB9KSA9PiB2b2lkXG59XG5cbmNvbnN0IEhhc0FwcFN0YXRlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8Ym9vbGVhbj4oZmFsc2UpXG5cbmV4cG9ydCBmdW5jdGlvbiBBcHBTdGF
|