diff --git a/scripts/dev.ts b/scripts/dev.ts index 72919caa8..c828996f6 100644 --- a/scripts/dev.ts +++ b/scripts/dev.ts @@ -14,11 +14,20 @@ const __dirname = dirname(__filename) const projectRoot = join(__dirname, '..') const cliPath = join(projectRoot, 'src/entrypoints/cli.tsx') +// React production mode — prevents 6,889+ _debugStack Error objects +// (12MB) from accumulating during long-running sessions. +// Opt-in via CLAUDE_CODE_FORCE_NODE_ENV=production for dev sessions that +// need the memory optimization. Default keeps NODE_ENV='development' so +// dev-only diagnostics (DevBar, doctorDiagnostic, AutoUpdater dev branches, +// etc.) continue to work. +const forcedNodeEnv = + process.env.CLAUDE_CODE_FORCE_NODE_ENV ?? + process.env.NODE_ENV ?? + 'development' + const defines = { ...getMacroDefines(), - // React production mode — prevents 6,889+ _debugStack Error objects - // (12MB) from accumulating during long-running sessions. - 'process.env.NODE_ENV': JSON.stringify('production'), + 'process.env.NODE_ENV': JSON.stringify(forcedNodeEnv), } const defineArgs = Object.entries(defines).flatMap(([k, v]) => [ diff --git a/src/screens/REPL.tsx b/src/screens/REPL.tsx index 750da47ca..66f68cd90 100644 --- a/src/screens/REPL.tsx +++ b/src/screens/REPL.tsx @@ -4937,7 +4937,7 @@ export function REPL({ useMailboxBridge({ isLoading, onSubmitMessage: handleIncomingPrompt }); useMasterMonitor(); useSlaveNotifications(); - const _pipeIpcState = useAppState(s => getPipeIpc(s as any)); + const _pipeIpcState = useAppState(s => getPipeIpc(s)); usePipePermissionForward({ store, tools, setMessages, setToolUseConfirmQueue, getToolUseContext, mainLoopModel }); usePipeMuteSync({ setToolUseConfirmQueue }); diff --git a/src/services/api/gemini/index.ts b/src/services/api/gemini/index.ts index 6754189af..10524873d 100644 --- a/src/services/api/gemini/index.ts +++ b/src/services/api/gemini/index.ts @@ -6,7 +6,7 @@ import type { StreamEvent, SystemAPIErrorMessage, } from '../../../types/message.js' -import { type Tools } from '../../../Tool.js' +import type { Tools } from 'src/Tool.js' import { toolToAPISchema } from '../../../utils/api.js' import { logForDebugging } from '../../../utils/debug.js' import { diff --git a/src/utils/performanceShim.ts b/src/utils/performanceShim.ts index 174518bb6..486fc5fa5 100644 --- a/src/utils/performanceShim.ts +++ b/src/utils/performanceShim.ts @@ -105,6 +105,10 @@ function getEntriesByName(name: string, type?: string): PerformanceEntryLike[] { return entries.filter(e => e.name === name) } +function getEntries(): PerformanceEntryLike[] { + return [...getEntriesByType('mark'), ...getEntriesByType('measure')] +} + function clearMarks(name?: string): void { if (name !== undefined) { marks.delete(name) @@ -128,6 +132,7 @@ const shim = { now, mark, measure: measure as typeof performance.measure, + getEntries: getEntries as typeof performance.getEntries, getEntriesByType: getEntriesByType as typeof performance.getEntriesByType, getEntriesByName: getEntriesByName as typeof performance.getEntriesByName, clearMarks: clearMarks as typeof performance.clearMarks,