@nexus-cortex/tui 4.47.0
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/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +13 -0
- package/bin/cli-full.js +23 -0
- package/bin/cortex-ui.js +26 -0
- package/bin/ink-ui.js +108 -0
- package/bin/launcher-dev.js +266 -0
- package/bin/launcher.js +516 -0
- package/dist/commands/agent/InteractiveAgentMenu.d.ts +100 -0
- package/dist/commands/agent/InteractiveAgentMenu.d.ts.map +1 -0
- package/dist/commands/agent/InteractiveAgentMenu.js +909 -0
- package/dist/commands/agent/InteractiveAgentMenu.js.map +1 -0
- package/dist/commands/agent/index.d.ts +55 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +714 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/chat/interactive.d.ts +13 -0
- package/dist/commands/chat/interactive.d.ts.map +1 -0
- package/dist/commands/chat/interactive.js +2055 -0
- package/dist/commands/chat/interactive.js.map +1 -0
- package/dist/commands/system-message/EditorLauncher.d.ts +65 -0
- package/dist/commands/system-message/EditorLauncher.d.ts.map +1 -0
- package/dist/commands/system-message/EditorLauncher.js +143 -0
- package/dist/commands/system-message/EditorLauncher.js.map +1 -0
- package/dist/commands/system-message/InlineEditor.d.ts +23 -0
- package/dist/commands/system-message/InlineEditor.d.ts.map +1 -0
- package/dist/commands/system-message/InlineEditor.js +225 -0
- package/dist/commands/system-message/InlineEditor.js.map +1 -0
- package/dist/commands/system-message/InteractiveMenu.d.ts +76 -0
- package/dist/commands/system-message/InteractiveMenu.d.ts.map +1 -0
- package/dist/commands/system-message/InteractiveMenu.js +979 -0
- package/dist/commands/system-message/InteractiveMenu.js.map +1 -0
- package/dist/commands/system-message/index.d.ts +56 -0
- package/dist/commands/system-message/index.d.ts.map +1 -0
- package/dist/commands/system-message/index.js +694 -0
- package/dist/commands/system-message/index.js.map +1 -0
- package/dist/commands/ui/artifacts.d.ts +14 -0
- package/dist/commands/ui/artifacts.d.ts.map +1 -0
- package/dist/commands/ui/artifacts.js +22 -0
- package/dist/commands/ui/artifacts.js.map +1 -0
- package/dist/commands/ui/config.d.ts +12 -0
- package/dist/commands/ui/config.d.ts.map +1 -0
- package/dist/commands/ui/config.js +26 -0
- package/dist/commands/ui/config.js.map +1 -0
- package/dist/commands/ui/context.d.ts +16 -0
- package/dist/commands/ui/context.d.ts.map +1 -0
- package/dist/commands/ui/context.js +28 -0
- package/dist/commands/ui/context.js.map +1 -0
- package/dist/commands/ui/middleware.d.ts +14 -0
- package/dist/commands/ui/middleware.d.ts.map +1 -0
- package/dist/commands/ui/middleware.js +22 -0
- package/dist/commands/ui/middleware.js.map +1 -0
- package/dist/commands/ui/models.d.ts +14 -0
- package/dist/commands/ui/models.d.ts.map +1 -0
- package/dist/commands/ui/models.js +50 -0
- package/dist/commands/ui/models.js.map +1 -0
- package/dist/commands/ui/permissions.d.ts +14 -0
- package/dist/commands/ui/permissions.d.ts.map +1 -0
- package/dist/commands/ui/permissions.js +22 -0
- package/dist/commands/ui/permissions.js.map +1 -0
- package/dist/commands/ui/sessions.d.ts +13 -0
- package/dist/commands/ui/sessions.d.ts.map +1 -0
- package/dist/commands/ui/sessions.js +45 -0
- package/dist/commands/ui/sessions.js.map +1 -0
- package/dist/commands/ui/system-messages.d.ts +5 -0
- package/dist/commands/ui/system-messages.d.ts.map +1 -0
- package/dist/commands/ui/system-messages.js +19 -0
- package/dist/commands/ui/system-messages.js.map +1 -0
- package/dist/commands/ui/themes.d.ts +12 -0
- package/dist/commands/ui/themes.d.ts.map +1 -0
- package/dist/commands/ui/themes.js +40 -0
- package/dist/commands/ui/themes.js.map +1 -0
- package/dist/commands/ui/tmux.d.ts +5 -0
- package/dist/commands/ui/tmux.d.ts.map +1 -0
- package/dist/commands/ui/tmux.js +19 -0
- package/dist/commands/ui/tmux.js.map +1 -0
- package/dist/cortex.d.ts +12 -0
- package/dist/cortex.d.ts.map +1 -0
- package/dist/cortex.js +320 -0
- package/dist/cortex.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +112 -0
- package/dist/index.js.map +1 -0
- package/dist/ink-ui/CortexApp.d.ts +28 -0
- package/dist/ink-ui/CortexApp.d.ts.map +1 -0
- package/dist/ink-ui/CortexApp.js +2291 -0
- package/dist/ink-ui/CortexApp.js.map +1 -0
- package/dist/ink-ui/SimpleInputBuffer.d.ts +63 -0
- package/dist/ink-ui/SimpleInputBuffer.d.ts.map +1 -0
- package/dist/ink-ui/SimpleInputBuffer.js +369 -0
- package/dist/ink-ui/SimpleInputBuffer.js.map +1 -0
- package/dist/ink-ui/commands/slashCommands.d.ts +40 -0
- package/dist/ink-ui/commands/slashCommands.d.ts.map +1 -0
- package/dist/ink-ui/commands/slashCommands.js +111 -0
- package/dist/ink-ui/commands/slashCommands.js.map +1 -0
- package/dist/ink-ui/commands/types.d.ts +161 -0
- package/dist/ink-ui/commands/types.d.ts.map +1 -0
- package/dist/ink-ui/commands/types.js +12 -0
- package/dist/ink-ui/commands/types.js.map +1 -0
- package/dist/ink-ui/components/ApprovalDialog.d.ts +21 -0
- package/dist/ink-ui/components/ApprovalDialog.d.ts.map +1 -0
- package/dist/ink-ui/components/ApprovalDialog.js +81 -0
- package/dist/ink-ui/components/ApprovalDialog.js.map +1 -0
- package/dist/ink-ui/components/CommandSuggestions.d.ts +19 -0
- package/dist/ink-ui/components/CommandSuggestions.d.ts.map +1 -0
- package/dist/ink-ui/components/CommandSuggestions.js +36 -0
- package/dist/ink-ui/components/CommandSuggestions.js.map +1 -0
- package/dist/ink-ui/components/DiffPreview.d.ts +60 -0
- package/dist/ink-ui/components/DiffPreview.d.ts.map +1 -0
- package/dist/ink-ui/components/DiffPreview.js +195 -0
- package/dist/ink-ui/components/DiffPreview.js.map +1 -0
- package/dist/ink-ui/components/DocumentPreview.d.ts +50 -0
- package/dist/ink-ui/components/DocumentPreview.d.ts.map +1 -0
- package/dist/ink-ui/components/DocumentPreview.js +92 -0
- package/dist/ink-ui/components/DocumentPreview.js.map +1 -0
- package/dist/ink-ui/components/MarkdownText.d.ts +27 -0
- package/dist/ink-ui/components/MarkdownText.d.ts.map +1 -0
- package/dist/ink-ui/components/MarkdownText.js +342 -0
- package/dist/ink-ui/components/MarkdownText.js.map +1 -0
- package/dist/ink-ui/components/MenuRenderer.d.ts +26 -0
- package/dist/ink-ui/components/MenuRenderer.d.ts.map +1 -0
- package/dist/ink-ui/components/MenuRenderer.js +264 -0
- package/dist/ink-ui/components/MenuRenderer.js.map +1 -0
- package/dist/ink-ui/components/ModelPickerDialog.d.ts +33 -0
- package/dist/ink-ui/components/ModelPickerDialog.d.ts.map +1 -0
- package/dist/ink-ui/components/ModelPickerDialog.js +98 -0
- package/dist/ink-ui/components/ModelPickerDialog.js.map +1 -0
- package/dist/ink-ui/components/StreamDisplay.d.ts +31 -0
- package/dist/ink-ui/components/StreamDisplay.d.ts.map +1 -0
- package/dist/ink-ui/components/StreamDisplay.js +573 -0
- package/dist/ink-ui/components/StreamDisplay.js.map +1 -0
- package/dist/ink-ui/components/SubAgentPanel.d.ts +98 -0
- package/dist/ink-ui/components/SubAgentPanel.d.ts.map +1 -0
- package/dist/ink-ui/components/SubAgentPanel.js +155 -0
- package/dist/ink-ui/components/SubAgentPanel.js.map +1 -0
- package/dist/ink-ui/components/ThinkingDisplay.d.ts +46 -0
- package/dist/ink-ui/components/ThinkingDisplay.d.ts.map +1 -0
- package/dist/ink-ui/components/ThinkingDisplay.js +176 -0
- package/dist/ink-ui/components/ThinkingDisplay.js.map +1 -0
- package/dist/ink-ui/components/ToolCallDisplay.d.ts +51 -0
- package/dist/ink-ui/components/ToolCallDisplay.d.ts.map +1 -0
- package/dist/ink-ui/components/ToolCallDisplay.js +378 -0
- package/dist/ink-ui/components/ToolCallDisplay.js.map +1 -0
- package/dist/ink-ui/components/WritePreview.d.ts +42 -0
- package/dist/ink-ui/components/WritePreview.d.ts.map +1 -0
- package/dist/ink-ui/components/WritePreview.js +100 -0
- package/dist/ink-ui/components/WritePreview.js.map +1 -0
- package/dist/ink-ui/contexts/KeypressContext.d.ts +32 -0
- package/dist/ink-ui/contexts/KeypressContext.d.ts.map +1 -0
- package/dist/ink-ui/contexts/KeypressContext.js +529 -0
- package/dist/ink-ui/contexts/KeypressContext.js.map +1 -0
- package/dist/ink-ui/contexts/SessionContext.d.ts +46 -0
- package/dist/ink-ui/contexts/SessionContext.d.ts.map +1 -0
- package/dist/ink-ui/contexts/SessionContext.js +162 -0
- package/dist/ink-ui/contexts/SessionContext.js.map +1 -0
- package/dist/ink-ui/core-stubs.d.ts +270 -0
- package/dist/ink-ui/core-stubs.d.ts.map +1 -0
- package/dist/ink-ui/core-stubs.js +276 -0
- package/dist/ink-ui/core-stubs.js.map +1 -0
- package/dist/ink-ui/cortex-types.d.ts +214 -0
- package/dist/ink-ui/cortex-types.d.ts.map +1 -0
- package/dist/ink-ui/cortex-types.js +52 -0
- package/dist/ink-ui/cortex-types.js.map +1 -0
- package/dist/ink-ui/hooks/useCortexStream.d.ts +75 -0
- package/dist/ink-ui/hooks/useCortexStream.d.ts.map +1 -0
- package/dist/ink-ui/hooks/useCortexStream.js +518 -0
- package/dist/ink-ui/hooks/useCortexStream.js.map +1 -0
- package/dist/ink-ui/hooks/useFocus.d.ts +11 -0
- package/dist/ink-ui/hooks/useFocus.d.ts.map +1 -0
- package/dist/ink-ui/hooks/useFocus.js +51 -0
- package/dist/ink-ui/hooks/useFocus.js.map +1 -0
- package/dist/ink-ui/hooks/useHistoryManager.d.ts +23 -0
- package/dist/ink-ui/hooks/useHistoryManager.d.ts.map +1 -0
- package/dist/ink-ui/hooks/useHistoryManager.js +63 -0
- package/dist/ink-ui/hooks/useHistoryManager.js.map +1 -0
- package/dist/ink-ui/hooks/useKeypress.d.ts +18 -0
- package/dist/ink-ui/hooks/useKeypress.d.ts.map +1 -0
- package/dist/ink-ui/hooks/useKeypress.js +27 -0
- package/dist/ink-ui/hooks/useKeypress.js.map +1 -0
- package/dist/ink-ui/hooks/useReactApprovalHandler.d.ts +74 -0
- package/dist/ink-ui/hooks/useReactApprovalHandler.d.ts.map +1 -0
- package/dist/ink-ui/hooks/useReactApprovalHandler.js +83 -0
- package/dist/ink-ui/hooks/useReactApprovalHandler.js.map +1 -0
- package/dist/ink-ui/hooks/useTerminalSize.d.ts +10 -0
- package/dist/ink-ui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/ink-ui/hooks/useTerminalSize.js +28 -0
- package/dist/ink-ui/hooks/useTerminalSize.js.map +1 -0
- package/dist/ink-ui/semantic-colors.d.ts +8 -0
- package/dist/ink-ui/semantic-colors.d.ts.map +1 -0
- package/dist/ink-ui/semantic-colors.js +24 -0
- package/dist/ink-ui/semantic-colors.js.map +1 -0
- package/dist/ink-ui/state/extensions.d.ts +68 -0
- package/dist/ink-ui/state/extensions.d.ts.map +1 -0
- package/dist/ink-ui/state/extensions.js +97 -0
- package/dist/ink-ui/state/extensions.js.map +1 -0
- package/dist/ink-ui/themes/ansi-light.d.ts +8 -0
- package/dist/ink-ui/themes/ansi-light.d.ts.map +1 -0
- package/dist/ink-ui/themes/ansi-light.js +143 -0
- package/dist/ink-ui/themes/ansi-light.js.map +1 -0
- package/dist/ink-ui/themes/ansi.d.ts +8 -0
- package/dist/ink-ui/themes/ansi.d.ts.map +1 -0
- package/dist/ink-ui/themes/ansi.js +153 -0
- package/dist/ink-ui/themes/ansi.js.map +1 -0
- package/dist/ink-ui/themes/atom-one-dark.d.ts +8 -0
- package/dist/ink-ui/themes/atom-one-dark.d.ts.map +1 -0
- package/dist/ink-ui/themes/atom-one-dark.js +140 -0
- package/dist/ink-ui/themes/atom-one-dark.js.map +1 -0
- package/dist/ink-ui/themes/ayu-light.d.ts +8 -0
- package/dist/ink-ui/themes/ayu-light.d.ts.map +1 -0
- package/dist/ink-ui/themes/ayu-light.js +132 -0
- package/dist/ink-ui/themes/ayu-light.js.map +1 -0
- package/dist/ink-ui/themes/ayu.d.ts +8 -0
- package/dist/ink-ui/themes/ayu.d.ts.map +1 -0
- package/dist/ink-ui/themes/ayu.js +106 -0
- package/dist/ink-ui/themes/ayu.js.map +1 -0
- package/dist/ink-ui/themes/color-utils.d.ts +23 -0
- package/dist/ink-ui/themes/color-utils.d.ts.map +1 -0
- package/dist/ink-ui/themes/color-utils.js +237 -0
- package/dist/ink-ui/themes/color-utils.js.map +1 -0
- package/dist/ink-ui/themes/default-light.d.ts +8 -0
- package/dist/ink-ui/themes/default-light.d.ts.map +1 -0
- package/dist/ink-ui/themes/default-light.js +100 -0
- package/dist/ink-ui/themes/default-light.js.map +1 -0
- package/dist/ink-ui/themes/default.d.ts +8 -0
- package/dist/ink-ui/themes/default.d.ts.map +1 -0
- package/dist/ink-ui/themes/default.js +143 -0
- package/dist/ink-ui/themes/default.js.map +1 -0
- package/dist/ink-ui/themes/dracula.d.ts +8 -0
- package/dist/ink-ui/themes/dracula.d.ts.map +1 -0
- package/dist/ink-ui/themes/dracula.js +117 -0
- package/dist/ink-ui/themes/dracula.js.map +1 -0
- package/dist/ink-ui/themes/github-dark.d.ts +8 -0
- package/dist/ink-ui/themes/github-dark.d.ts.map +1 -0
- package/dist/ink-ui/themes/github-dark.js +140 -0
- package/dist/ink-ui/themes/github-dark.js.map +1 -0
- package/dist/ink-ui/themes/github-light.d.ts +8 -0
- package/dist/ink-ui/themes/github-light.d.ts.map +1 -0
- package/dist/ink-ui/themes/github-light.js +142 -0
- package/dist/ink-ui/themes/github-light.js.map +1 -0
- package/dist/ink-ui/themes/googlecode.d.ts +8 -0
- package/dist/ink-ui/themes/googlecode.d.ts.map +1 -0
- package/dist/ink-ui/themes/googlecode.js +139 -0
- package/dist/ink-ui/themes/googlecode.js.map +1 -0
- package/dist/ink-ui/themes/no-color.d.ts +8 -0
- package/dist/ink-ui/themes/no-color.d.ts.map +1 -0
- package/dist/ink-ui/themes/no-color.js +118 -0
- package/dist/ink-ui/themes/no-color.js.map +1 -0
- package/dist/ink-ui/themes/semantic-tokens.d.ts +40 -0
- package/dist/ink-ui/themes/semantic-tokens.d.ts.map +1 -0
- package/dist/ink-ui/themes/semantic-tokens.js +100 -0
- package/dist/ink-ui/themes/semantic-tokens.js.map +1 -0
- package/dist/ink-ui/themes/shades-of-purple.d.ts +12 -0
- package/dist/ink-ui/themes/shades-of-purple.d.ts.map +1 -0
- package/dist/ink-ui/themes/shades-of-purple.js +306 -0
- package/dist/ink-ui/themes/shades-of-purple.js.map +1 -0
- package/dist/ink-ui/themes/theme-manager.d.ts +67 -0
- package/dist/ink-ui/themes/theme-manager.d.ts.map +1 -0
- package/dist/ink-ui/themes/theme-manager.js +263 -0
- package/dist/ink-ui/themes/theme-manager.js.map +1 -0
- package/dist/ink-ui/themes/theme.d.ts +134 -0
- package/dist/ink-ui/themes/theme.d.ts.map +1 -0
- package/dist/ink-ui/themes/theme.js +390 -0
- package/dist/ink-ui/themes/theme.js.map +1 -0
- package/dist/ink-ui/themes/xcode.d.ts +8 -0
- package/dist/ink-ui/themes/xcode.d.ts.map +1 -0
- package/dist/ink-ui/themes/xcode.js +147 -0
- package/dist/ink-ui/themes/xcode.js.map +1 -0
- package/dist/ink-ui/types.d.ts +306 -0
- package/dist/ink-ui/types.d.ts.map +1 -0
- package/dist/ink-ui/types.js +65 -0
- package/dist/ink-ui/types.js.map +1 -0
- package/dist/ink-ui/utils/input.d.ts +18 -0
- package/dist/ink-ui/utils/input.d.ts.map +1 -0
- package/dist/ink-ui/utils/input.js +51 -0
- package/dist/ink-ui/utils/input.js.map +1 -0
- package/dist/ink-ui/utils/mouse.d.ts +33 -0
- package/dist/ink-ui/utils/mouse.d.ts.map +1 -0
- package/dist/ink-ui/utils/mouse.js +182 -0
- package/dist/ink-ui/utils/mouse.js.map +1 -0
- package/dist/services/BuiltinCommandLoader.d.ts +21 -0
- package/dist/services/BuiltinCommandLoader.d.ts.map +1 -0
- package/dist/services/BuiltinCommandLoader.js +182 -0
- package/dist/services/BuiltinCommandLoader.js.map +1 -0
- package/dist/services/CommandService.d.ts +39 -0
- package/dist/services/CommandService.d.ts.map +1 -0
- package/dist/services/CommandService.js +49 -0
- package/dist/services/CommandService.js.map +1 -0
- package/dist/services/FileCommandLoader.d.ts +16 -0
- package/dist/services/FileCommandLoader.d.ts.map +1 -0
- package/dist/services/FileCommandLoader.js +19 -0
- package/dist/services/FileCommandLoader.js.map +1 -0
- package/dist/services/McpPromptLoader.d.ts +16 -0
- package/dist/services/McpPromptLoader.d.ts.map +1 -0
- package/dist/services/McpPromptLoader.js +19 -0
- package/dist/services/McpPromptLoader.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/ui/ChalkMenuRenderer.d.ts +22 -0
- package/dist/ui/ChalkMenuRenderer.d.ts.map +1 -0
- package/dist/ui/ChalkMenuRenderer.js +478 -0
- package/dist/ui/ChalkMenuRenderer.js.map +1 -0
- package/dist/ui/ChalkModelPicker.d.ts +20 -0
- package/dist/ui/ChalkModelPicker.d.ts.map +1 -0
- package/dist/ui/ChalkModelPicker.js +363 -0
- package/dist/ui/ChalkModelPicker.js.map +1 -0
- package/dist/ui/ChalkThemePicker.d.ts +20 -0
- package/dist/ui/ChalkThemePicker.d.ts.map +1 -0
- package/dist/ui/ChalkThemePicker.js +370 -0
- package/dist/ui/ChalkThemePicker.js.map +1 -0
- package/dist/ui/InkApprovalDialog.d.ts +8 -0
- package/dist/ui/InkApprovalDialog.d.ts.map +1 -0
- package/dist/ui/InkApprovalDialog.js +25 -0
- package/dist/ui/InkApprovalDialog.js.map +1 -0
- package/dist/ui/InkCommandPalette.d.ts +43 -0
- package/dist/ui/InkCommandPalette.d.ts.map +1 -0
- package/dist/ui/InkCommandPalette.js +105 -0
- package/dist/ui/InkCommandPalette.js.map +1 -0
- package/dist/ui/InkConfigMenu.d.ts +24 -0
- package/dist/ui/InkConfigMenu.d.ts.map +1 -0
- package/dist/ui/InkConfigMenu.js +259 -0
- package/dist/ui/InkConfigMenu.js.map +1 -0
- package/dist/ui/InkHelp.d.ts +25 -0
- package/dist/ui/InkHelp.d.ts.map +1 -0
- package/dist/ui/InkHelp.js +55 -0
- package/dist/ui/InkHelp.js.map +1 -0
- package/dist/ui/InkMenuPicker.d.ts +19 -0
- package/dist/ui/InkMenuPicker.d.ts.map +1 -0
- package/dist/ui/InkMenuPicker.js +33 -0
- package/dist/ui/InkMenuPicker.js.map +1 -0
- package/dist/ui/InkModelPicker.d.ts +23 -0
- package/dist/ui/InkModelPicker.d.ts.map +1 -0
- package/dist/ui/InkModelPicker.js +53 -0
- package/dist/ui/InkModelPicker.js.map +1 -0
- package/dist/ui/PersistentInput.d.ts +91 -0
- package/dist/ui/PersistentInput.d.ts.map +1 -0
- package/dist/ui/PersistentInput.js +283 -0
- package/dist/ui/PersistentInput.js.map +1 -0
- package/dist/ui/RawInput.d.ts +27 -0
- package/dist/ui/RawInput.d.ts.map +1 -0
- package/dist/ui/RawInput.js +731 -0
- package/dist/ui/RawInput.js.map +1 -0
- package/dist/ui/SlashCommandAutocomplete.d.ts +94 -0
- package/dist/ui/SlashCommandAutocomplete.d.ts.map +1 -0
- package/dist/ui/SlashCommandAutocomplete.js +274 -0
- package/dist/ui/SlashCommandAutocomplete.js.map +1 -0
- package/dist/ui/SplashScreen.d.ts +76 -0
- package/dist/ui/SplashScreen.d.ts.map +1 -0
- package/dist/ui/SplashScreen.js +316 -0
- package/dist/ui/SplashScreen.js.map +1 -0
- package/dist/ui/components/ArtifactDashboard.d.ts +16 -0
- package/dist/ui/components/ArtifactDashboard.d.ts.map +1 -0
- package/dist/ui/components/ArtifactDashboard.js +102 -0
- package/dist/ui/components/ArtifactDashboard.js.map +1 -0
- package/dist/ui/components/ChatInput.d.ts +36 -0
- package/dist/ui/components/ChatInput.d.ts.map +1 -0
- package/dist/ui/components/ChatInput.js +11 -0
- package/dist/ui/components/ChatInput.js.map +1 -0
- package/dist/ui/components/ConfigWizard.d.ts +17 -0
- package/dist/ui/components/ConfigWizard.d.ts.map +1 -0
- package/dist/ui/components/ConfigWizard.js +134 -0
- package/dist/ui/components/ConfigWizard.js.map +1 -0
- package/dist/ui/components/ContextViewer.d.ts +18 -0
- package/dist/ui/components/ContextViewer.d.ts.map +1 -0
- package/dist/ui/components/ContextViewer.js +85 -0
- package/dist/ui/components/ContextViewer.js.map +1 -0
- package/dist/ui/components/MiddlewareDashboard.d.ts +16 -0
- package/dist/ui/components/MiddlewareDashboard.d.ts.map +1 -0
- package/dist/ui/components/MiddlewareDashboard.js +98 -0
- package/dist/ui/components/MiddlewareDashboard.js.map +1 -0
- package/dist/ui/components/ModelPicker.d.ts +24 -0
- package/dist/ui/components/ModelPicker.d.ts.map +1 -0
- package/dist/ui/components/ModelPicker.js +96 -0
- package/dist/ui/components/ModelPicker.js.map +1 -0
- package/dist/ui/components/MultiLineInput.d.ts +27 -0
- package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
- package/dist/ui/components/MultiLineInput.js +182 -0
- package/dist/ui/components/MultiLineInput.js.map +1 -0
- package/dist/ui/components/PermissionsBrowser.d.ts +16 -0
- package/dist/ui/components/PermissionsBrowser.d.ts.map +1 -0
- package/dist/ui/components/PermissionsBrowser.js +110 -0
- package/dist/ui/components/PermissionsBrowser.js.map +1 -0
- package/dist/ui/components/SessionBrowser.d.ts +19 -0
- package/dist/ui/components/SessionBrowser.d.ts.map +1 -0
- package/dist/ui/components/SessionBrowser.js +66 -0
- package/dist/ui/components/SessionBrowser.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +32 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/ui/components/StatusBar.js +27 -0
- package/dist/ui/components/StatusBar.js.map +1 -0
- package/dist/ui/components/SystemMessageBrowser.d.ts +11 -0
- package/dist/ui/components/SystemMessageBrowser.d.ts.map +1 -0
- package/dist/ui/components/SystemMessageBrowser.js +106 -0
- package/dist/ui/components/SystemMessageBrowser.js.map +1 -0
- package/dist/ui/components/ThemePicker.d.ts +11 -0
- package/dist/ui/components/ThemePicker.d.ts.map +1 -0
- package/dist/ui/components/ThemePicker.js +62 -0
- package/dist/ui/components/ThemePicker.js.map +1 -0
- package/dist/ui/components/TmuxBrowser.d.ts +11 -0
- package/dist/ui/components/TmuxBrowser.d.ts.map +1 -0
- package/dist/ui/components/TmuxBrowser.js +85 -0
- package/dist/ui/components/TmuxBrowser.js.map +1 -0
- package/dist/ui/components/index.d.ts +22 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +21 -0
- package/dist/ui/components/index.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useCortexStream - Bridge between Nexus Cortex core and Gemini CLI UI
|
|
3
|
+
*
|
|
4
|
+
* This hook provides the same interface as useGeminiStream but wires to our
|
|
5
|
+
* @nexus-cortex/core orchestrator instead of Google's Gemini client.
|
|
6
|
+
*
|
|
7
|
+
* Key responsibilities:
|
|
8
|
+
* 1. Convert OrchestratorClient.streamMessage() chunks to UI history items
|
|
9
|
+
* 2. Handle tool call scheduling and confirmation flow
|
|
10
|
+
* 3. Manage streaming state for UI components
|
|
11
|
+
* 4. Support slash commands and shell mode
|
|
12
|
+
*/
|
|
13
|
+
import { useState, useRef, useCallback, useMemo } from 'react';
|
|
14
|
+
import { StreamingState, MessageType, StreamEventType, ToolCallStatus } from '../cortex-types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Main streaming hook - bridges Cortex core to Gemini UI
|
|
17
|
+
*/
|
|
18
|
+
export const useCortexStream = (orchestratorClient, _history, addItem, _config, settings, onDebugMessage, handleSlashCommand, _shellModeActive, onCancelSubmit, _terminalWidth, _terminalHeight, refreshHistory) => {
|
|
19
|
+
// State
|
|
20
|
+
const [streamingState, setStreamingState] = useState(StreamingState.Idle);
|
|
21
|
+
const [initError, setInitError] = useState(null);
|
|
22
|
+
const [thought, setThought] = useState(null);
|
|
23
|
+
const [_pendingHistoryItem, setPendingHistoryItem] = useState(null);
|
|
24
|
+
const pendingHistoryItemRef = useRef(null);
|
|
25
|
+
const [loopDetectionConfirmationRequest, _setLoopDetectionConfirmationRequest] = useState(null);
|
|
26
|
+
const [activePtyId, _setActivePtyId] = useState(null);
|
|
27
|
+
const [lastShellOutputTime, _setLastShellOutputTime] = useState(0);
|
|
28
|
+
// Track current thinking block ID for interleaving
|
|
29
|
+
const currentThinkingBlockIdRef = useRef(null);
|
|
30
|
+
// Keep ref in sync with state
|
|
31
|
+
const updatePendingHistoryItem = useCallback((item) => {
|
|
32
|
+
pendingHistoryItemRef.current = item;
|
|
33
|
+
setPendingHistoryItem(item);
|
|
34
|
+
}, []);
|
|
35
|
+
// Refs
|
|
36
|
+
const abortControllerRef = useRef(null);
|
|
37
|
+
const turnCancelledRef = useRef(false);
|
|
38
|
+
const activeQueryIdRef = useRef(null);
|
|
39
|
+
// Simplified tool tracking (full scheduler will be integrated later)
|
|
40
|
+
const [toolCalls, setToolCalls] = useState([]);
|
|
41
|
+
const [toolInputArgs, setToolInputArgs] = useState(new Map());
|
|
42
|
+
const [lastToolOutputTime, _setLastToolOutputTime] = useState(0);
|
|
43
|
+
// Turn summary & next-action prediction (set at end of turn when TURN_SUMMARY_PREDICTION=true)
|
|
44
|
+
const [turnSummary, setTurnSummary] = useState(null);
|
|
45
|
+
const [nextActionPrediction, setNextActionPrediction] = useState(null);
|
|
46
|
+
// Turn usage data from orchestrator (set on message_stop)
|
|
47
|
+
const [turnUsage, setTurnUsage] = useState(null);
|
|
48
|
+
// Stream start timestamp for elapsed timer
|
|
49
|
+
const [streamStartTime, setStreamStartTime] = useState(0);
|
|
50
|
+
// Stream events for interleaved display - tracks all content in order
|
|
51
|
+
const [streamEvents, setStreamEvents] = useState([]);
|
|
52
|
+
const streamEventsRef = useRef([]);
|
|
53
|
+
// Helper to add a stream event
|
|
54
|
+
const addStreamEvent = useCallback((event) => {
|
|
55
|
+
const newEvent = {
|
|
56
|
+
...event,
|
|
57
|
+
id: `event-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`,
|
|
58
|
+
timestamp: Date.now(),
|
|
59
|
+
};
|
|
60
|
+
streamEventsRef.current = [...streamEventsRef.current, newEvent];
|
|
61
|
+
setStreamEvents(streamEventsRef.current);
|
|
62
|
+
return newEvent.id;
|
|
63
|
+
}, []);
|
|
64
|
+
// Helper to update an existing stream event
|
|
65
|
+
const updateStreamEvent = useCallback((eventId, updates) => {
|
|
66
|
+
streamEventsRef.current = streamEventsRef.current.map(e => e.id === eventId ? { ...e, ...updates } : e);
|
|
67
|
+
setStreamEvents(streamEventsRef.current);
|
|
68
|
+
}, []);
|
|
69
|
+
const cancelAllToolCalls = useCallback(() => {
|
|
70
|
+
setToolCalls([]);
|
|
71
|
+
setToolInputArgs(new Map());
|
|
72
|
+
setStreamEvents([]);
|
|
73
|
+
streamEventsRef.current = [];
|
|
74
|
+
}, []);
|
|
75
|
+
/**
|
|
76
|
+
* Cancel ongoing request
|
|
77
|
+
*/
|
|
78
|
+
const cancelOngoingRequest = useCallback(() => {
|
|
79
|
+
if (abortControllerRef.current) {
|
|
80
|
+
abortControllerRef.current.abort();
|
|
81
|
+
turnCancelledRef.current = true;
|
|
82
|
+
}
|
|
83
|
+
cancelAllToolCalls();
|
|
84
|
+
setStreamingState(StreamingState.Idle);
|
|
85
|
+
onCancelSubmit(true);
|
|
86
|
+
}, [cancelAllToolCalls, onCancelSubmit]);
|
|
87
|
+
/**
|
|
88
|
+
* Handle approval mode changes (auto-approve whitelist + graylist)
|
|
89
|
+
* Note: This is NOT YOLO mode - blacklist actions still require manual approval
|
|
90
|
+
*/
|
|
91
|
+
const handleApprovalModeChange = useCallback((autoApprove) => {
|
|
92
|
+
if (orchestratorClient) {
|
|
93
|
+
// Update orchestrator approval mode (graylist will be auto-approved)
|
|
94
|
+
orchestratorClient.setApprovalMode(autoApprove);
|
|
95
|
+
}
|
|
96
|
+
onDebugMessage(`Auto-approve mode: ${autoApprove ? 'ON' : 'OFF'}`);
|
|
97
|
+
}, [orchestratorClient, onDebugMessage]);
|
|
98
|
+
/**
|
|
99
|
+
* Helper to update thinking state with proper block tracking
|
|
100
|
+
*/
|
|
101
|
+
const updateThinkingState = useCallback((thinkingText, isComplete, accumulatedThinkingBlocks) => {
|
|
102
|
+
if (!settings.showThinking)
|
|
103
|
+
return;
|
|
104
|
+
// Get or create current block ID
|
|
105
|
+
if (!currentThinkingBlockIdRef.current) {
|
|
106
|
+
currentThinkingBlockIdRef.current = `thinking-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`;
|
|
107
|
+
}
|
|
108
|
+
const blockId = currentThinkingBlockIdRef.current;
|
|
109
|
+
// Find or create block
|
|
110
|
+
let blockIndex = accumulatedThinkingBlocks.current.findIndex(b => b.id === blockId);
|
|
111
|
+
if (blockIndex === -1) {
|
|
112
|
+
accumulatedThinkingBlocks.current.push({
|
|
113
|
+
id: blockId,
|
|
114
|
+
text: '',
|
|
115
|
+
isComplete: false,
|
|
116
|
+
startedAt: Date.now(),
|
|
117
|
+
});
|
|
118
|
+
blockIndex = accumulatedThinkingBlocks.current.length - 1;
|
|
119
|
+
}
|
|
120
|
+
// Update block
|
|
121
|
+
const block = accumulatedThinkingBlocks.current[blockIndex];
|
|
122
|
+
if (block) {
|
|
123
|
+
block.text = thinkingText;
|
|
124
|
+
block.isComplete = isComplete;
|
|
125
|
+
if (isComplete) {
|
|
126
|
+
block.completedAt = Date.now();
|
|
127
|
+
// Reset for next thinking block
|
|
128
|
+
currentThinkingBlockIdRef.current = null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Update thought state
|
|
132
|
+
setThought({
|
|
133
|
+
text: thinkingText,
|
|
134
|
+
isComplete,
|
|
135
|
+
blocks: [...accumulatedThinkingBlocks.current],
|
|
136
|
+
});
|
|
137
|
+
}, [settings.showThinking]);
|
|
138
|
+
/**
|
|
139
|
+
* Process streaming chunk and update UI state
|
|
140
|
+
*
|
|
141
|
+
* SIMPLE APPROACH: Just store chunks as stream events in order.
|
|
142
|
+
* The core library provides chunks in the correct interleaved order.
|
|
143
|
+
* We just need to render them.
|
|
144
|
+
*/
|
|
145
|
+
const processStreamChunk = useCallback((chunk, accumulatedText, accumulatedThinking, accumulatedThinkingBlocks) => {
|
|
146
|
+
// Debug: log all chunk types to understand what's coming through
|
|
147
|
+
onDebugMessage(`Chunk: ${chunk.type}${chunk.delta ? ` (delta: ${chunk.delta.slice(0, 30)}...)` : ''}${chunk.thinking ? ' (has thinking)' : ''}${chunk.toolUse ? ` (tool: ${chunk.toolUse.name})` : ''}`);
|
|
148
|
+
switch (chunk.type) {
|
|
149
|
+
case 'text_delta':
|
|
150
|
+
if (chunk.delta) {
|
|
151
|
+
accumulatedText.current += chunk.delta;
|
|
152
|
+
// Add text chunk as stream event - core provides these in correct order
|
|
153
|
+
addStreamEvent({
|
|
154
|
+
type: StreamEventType.Text,
|
|
155
|
+
text: chunk.delta,
|
|
156
|
+
});
|
|
157
|
+
// Also update pending history item for overall text
|
|
158
|
+
updatePendingHistoryItem({
|
|
159
|
+
type: MessageType.Model,
|
|
160
|
+
modelContent: accumulatedText.current,
|
|
161
|
+
thought: accumulatedThinking.current || undefined,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
case 'thinking_delta':
|
|
166
|
+
if (chunk.delta) {
|
|
167
|
+
accumulatedThinking.current += chunk.delta;
|
|
168
|
+
updateThinkingState(accumulatedThinking.current, false, accumulatedThinkingBlocks);
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
case 'thinking':
|
|
172
|
+
// Direct thinking chunk (some providers send full thinking at once)
|
|
173
|
+
if (chunk.thinking) {
|
|
174
|
+
accumulatedThinking.current = chunk.thinking;
|
|
175
|
+
updateThinkingState(accumulatedThinking.current, chunk.isComplete || false, accumulatedThinkingBlocks);
|
|
176
|
+
}
|
|
177
|
+
break;
|
|
178
|
+
case 'thinking_start':
|
|
179
|
+
// New thinking block started - already handled by updateThinkingState creating new block
|
|
180
|
+
onDebugMessage('Thinking block started');
|
|
181
|
+
break;
|
|
182
|
+
case 'thinking_stop':
|
|
183
|
+
// Current thinking block completed
|
|
184
|
+
if (accumulatedThinking.current) {
|
|
185
|
+
updateThinkingState(accumulatedThinking.current, true, accumulatedThinkingBlocks);
|
|
186
|
+
// Reset for next thinking block
|
|
187
|
+
accumulatedThinking.current = '';
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
case 'content_block_delta':
|
|
191
|
+
const data = chunk.data;
|
|
192
|
+
const deltaType = data?.delta?.type || chunk.data?.type;
|
|
193
|
+
// Check for input_json_delta (tool input streaming) - IGNORE these
|
|
194
|
+
// They are already handled by content_block_start with full input
|
|
195
|
+
if (deltaType === 'input_json_delta') {
|
|
196
|
+
// Tool input JSON delta - skip, don't add to text
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
if (data?.reasoning && chunk.delta) {
|
|
200
|
+
// Interleaved thinking (Grok, Claude) or OpenAI reasoning tokens
|
|
201
|
+
// ALWAYS show interleaved thinking - it's part of the model's natural output
|
|
202
|
+
// The Tab toggle only controls front/rear-loaded extended thinking (Claude <thinking> tags)
|
|
203
|
+
accumulatedThinking.current += chunk.delta;
|
|
204
|
+
// Always add to stream events - interleaved thinking should always be visible
|
|
205
|
+
addStreamEvent({
|
|
206
|
+
type: StreamEventType.Thinking,
|
|
207
|
+
thinking: chunk.delta,
|
|
208
|
+
thinkingComplete: false,
|
|
209
|
+
});
|
|
210
|
+
// Also update thinking state (for the separate thinking indicator if enabled)
|
|
211
|
+
updateThinkingState(accumulatedThinking.current, false, accumulatedThinkingBlocks);
|
|
212
|
+
}
|
|
213
|
+
else if (!data?.reasoning && chunk.delta) {
|
|
214
|
+
// Regular text - add as text event
|
|
215
|
+
accumulatedText.current += chunk.delta;
|
|
216
|
+
addStreamEvent({
|
|
217
|
+
type: StreamEventType.Text,
|
|
218
|
+
text: chunk.delta,
|
|
219
|
+
});
|
|
220
|
+
updatePendingHistoryItem({
|
|
221
|
+
type: MessageType.Model,
|
|
222
|
+
modelContent: accumulatedText.current,
|
|
223
|
+
thought: accumulatedThinking.current || undefined,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
case 'content_block_start':
|
|
228
|
+
// Check block type from chunk.data or chunk.content_block
|
|
229
|
+
const startData = chunk.data;
|
|
230
|
+
const contentBlock = startData?.content_block || startData;
|
|
231
|
+
if (contentBlock?.type === 'thinking') {
|
|
232
|
+
onDebugMessage('Thinking content block started');
|
|
233
|
+
}
|
|
234
|
+
// Note: tool_use blocks are handled by tool_use_complete event
|
|
235
|
+
break;
|
|
236
|
+
case 'content_block_stop':
|
|
237
|
+
// Check if this is a thinking block end
|
|
238
|
+
const stopData = chunk.data;
|
|
239
|
+
if (stopData?.type === 'thinking' && accumulatedThinking.current) {
|
|
240
|
+
updateThinkingState(accumulatedThinking.current, true, accumulatedThinkingBlocks);
|
|
241
|
+
// Reset for next thinking block
|
|
242
|
+
accumulatedThinking.current = '';
|
|
243
|
+
}
|
|
244
|
+
break;
|
|
245
|
+
case 'tool_use_complete':
|
|
246
|
+
// Tool call completed - add to stream events AND history
|
|
247
|
+
// Core library provides this in correct order relative to text
|
|
248
|
+
if (chunk.toolUse) {
|
|
249
|
+
const toolUse = chunk.toolUse;
|
|
250
|
+
onDebugMessage(`Tool use: ${toolUse.name}`);
|
|
251
|
+
// Debug: Log input keys to understand what data we have
|
|
252
|
+
if (toolUse.input) {
|
|
253
|
+
onDebugMessage(`Tool input keys: ${Object.keys(toolUse.input).join(', ')}`);
|
|
254
|
+
if (toolUse.name === 'Edit') {
|
|
255
|
+
onDebugMessage(`Edit tool has old_string: ${toolUse.input.old_string !== undefined}, new_string: ${toolUse.input.new_string !== undefined}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
onDebugMessage(`Tool input is undefined`);
|
|
260
|
+
}
|
|
261
|
+
const callId = toolUse.id || `tool-${Date.now()}`;
|
|
262
|
+
// Create tool call display entry
|
|
263
|
+
const newToolCall = {
|
|
264
|
+
callId,
|
|
265
|
+
name: toolUse.name,
|
|
266
|
+
description: '',
|
|
267
|
+
status: ToolCallStatus.Executing,
|
|
268
|
+
resultDisplay: undefined,
|
|
269
|
+
confirmationDetails: undefined,
|
|
270
|
+
};
|
|
271
|
+
setToolCalls(prev => [...prev, newToolCall]);
|
|
272
|
+
// Store input args for tool display
|
|
273
|
+
if (toolUse.input) {
|
|
274
|
+
setToolInputArgs(prev => {
|
|
275
|
+
const newMap = new Map(prev);
|
|
276
|
+
newMap.set(callId, toolUse.input);
|
|
277
|
+
return newMap;
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// Add stream event for interleaved display during streaming
|
|
281
|
+
addStreamEvent({
|
|
282
|
+
type: StreamEventType.ToolCall,
|
|
283
|
+
toolCall: newToolCall,
|
|
284
|
+
toolInputArgs: toolUse.input,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
case 'tool_result':
|
|
289
|
+
// Tool completed - toolResult field contains the result data
|
|
290
|
+
if (chunk.toolResult) {
|
|
291
|
+
const toolResult = chunk.toolResult;
|
|
292
|
+
onDebugMessage(`Tool result for ${toolResult.tool_name}: ${toolResult.is_error ? 'error' : 'success'}`);
|
|
293
|
+
// Update tool call with result
|
|
294
|
+
const resultCallId = toolResult.tool_use_id;
|
|
295
|
+
if (resultCallId) {
|
|
296
|
+
// Build result display with metadata (includes diff for Edit tool)
|
|
297
|
+
const resultDisplay = {
|
|
298
|
+
output: typeof toolResult.content === 'string'
|
|
299
|
+
? toolResult.content
|
|
300
|
+
: JSON.stringify(toolResult.content),
|
|
301
|
+
isError: toolResult.is_error,
|
|
302
|
+
error: toolResult.is_error ? toolResult.content : undefined,
|
|
303
|
+
// IMPORTANT: Pass through metadata which contains diff, fileStats, etc.
|
|
304
|
+
metadata: toolResult.metadata,
|
|
305
|
+
};
|
|
306
|
+
// Debug: log if we have diff data for Edit tool
|
|
307
|
+
if (toolResult.tool_name === 'Edit' && toolResult.metadata?.diff) {
|
|
308
|
+
onDebugMessage(`Edit tool has diff metadata (${toolResult.metadata.diff.length} chars)`);
|
|
309
|
+
// Diff is shown inline by StreamDisplay during streaming
|
|
310
|
+
// History refresh at end syncs from orchestrator
|
|
311
|
+
}
|
|
312
|
+
setToolCalls(prev => prev.map(tc => {
|
|
313
|
+
if (tc.callId === resultCallId) {
|
|
314
|
+
return {
|
|
315
|
+
...tc,
|
|
316
|
+
status: toolResult.is_error ? ToolCallStatus.Error : ToolCallStatus.Success,
|
|
317
|
+
resultDisplay,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
return tc;
|
|
321
|
+
}));
|
|
322
|
+
// Update corresponding stream event with result
|
|
323
|
+
const eventToUpdate = streamEventsRef.current.find(e => e.type === StreamEventType.ToolCall && e.toolCall?.callId === resultCallId);
|
|
324
|
+
if (eventToUpdate) {
|
|
325
|
+
updateStreamEvent(eventToUpdate.id, {
|
|
326
|
+
toolCall: {
|
|
327
|
+
...eventToUpdate.toolCall,
|
|
328
|
+
status: toolResult.is_error ? ToolCallStatus.Error : ToolCallStatus.Success,
|
|
329
|
+
resultDisplay,
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
case 'turn_summary':
|
|
337
|
+
if (chunk.data) {
|
|
338
|
+
const { summary, prediction } = chunk.data;
|
|
339
|
+
if (summary)
|
|
340
|
+
setTurnSummary(summary);
|
|
341
|
+
if (prediction)
|
|
342
|
+
setNextActionPrediction(prediction);
|
|
343
|
+
onDebugMessage(`Turn summary: ${summary || '(none)'} | Prediction: ${prediction || '(none)'}`);
|
|
344
|
+
}
|
|
345
|
+
break;
|
|
346
|
+
case 'message_stop':
|
|
347
|
+
// Stream complete - finalize any open thinking block
|
|
348
|
+
if (accumulatedThinking.current && !thought?.isComplete) {
|
|
349
|
+
updateThinkingState(accumulatedThinking.current, true, accumulatedThinkingBlocks);
|
|
350
|
+
}
|
|
351
|
+
// Capture usage data from orchestrator for turn summary display
|
|
352
|
+
if (chunk.data?.usage) {
|
|
353
|
+
setTurnUsage(chunk.data.usage);
|
|
354
|
+
}
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
}, [updatePendingHistoryItem, onDebugMessage, updateThinkingState, thought?.isComplete, addStreamEvent, updateStreamEvent]);
|
|
358
|
+
/**
|
|
359
|
+
* Submit a query to the orchestrator
|
|
360
|
+
*/
|
|
361
|
+
const submitQuery = useCallback(async (userInput, options = {}) => {
|
|
362
|
+
if (!orchestratorClient) {
|
|
363
|
+
setInitError('Orchestrator not initialized');
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (streamingState !== StreamingState.Idle) {
|
|
367
|
+
onDebugMessage('Cannot submit while streaming');
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const trimmedInput = userInput.trim();
|
|
371
|
+
if (!trimmedInput)
|
|
372
|
+
return;
|
|
373
|
+
// Check for slash commands
|
|
374
|
+
let effectiveInput = trimmedInput;
|
|
375
|
+
if (trimmedInput.startsWith('/')) {
|
|
376
|
+
const result = await handleSlashCommand(trimmedInput);
|
|
377
|
+
if (result !== false) {
|
|
378
|
+
if (result && result.type === 'submit_prompt' && typeof result.content === 'string') {
|
|
379
|
+
effectiveInput = result.content;
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// Generate query ID for tracking
|
|
387
|
+
const queryId = `query-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
388
|
+
activeQueryIdRef.current = queryId;
|
|
389
|
+
// Before starting new query, save any pending response to history
|
|
390
|
+
// This handles the case where previous response had tool calls and text was kept pending
|
|
391
|
+
if (pendingHistoryItemRef.current) {
|
|
392
|
+
const pending = pendingHistoryItemRef.current;
|
|
393
|
+
if (pending.modelContent) {
|
|
394
|
+
addItem({
|
|
395
|
+
type: MessageType.Model,
|
|
396
|
+
modelContent: pending.modelContent,
|
|
397
|
+
thought: pending.thought,
|
|
398
|
+
}, Date.now());
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Start streaming - clear all pending state
|
|
402
|
+
setStreamingState(StreamingState.Streaming);
|
|
403
|
+
setStreamStartTime(Date.now());
|
|
404
|
+
updatePendingHistoryItem(null);
|
|
405
|
+
setThought(null);
|
|
406
|
+
setToolCalls([]);
|
|
407
|
+
setToolInputArgs(new Map());
|
|
408
|
+
setStreamEvents([]);
|
|
409
|
+
streamEventsRef.current = [];
|
|
410
|
+
setTurnSummary(null);
|
|
411
|
+
setNextActionPrediction(null);
|
|
412
|
+
setTurnUsage(null);
|
|
413
|
+
turnCancelledRef.current = false;
|
|
414
|
+
abortControllerRef.current = new AbortController();
|
|
415
|
+
currentThinkingBlockIdRef.current = null;
|
|
416
|
+
// Accumulators for streaming content
|
|
417
|
+
const accumulatedText = { current: '' };
|
|
418
|
+
const accumulatedThinking = { current: '' };
|
|
419
|
+
const accumulatedThinkingBlocks = { current: [] };
|
|
420
|
+
try {
|
|
421
|
+
// Add user message to stream events FIRST (before any model response)
|
|
422
|
+
// This shows the user's input immediately without refreshing history
|
|
423
|
+
addStreamEvent({
|
|
424
|
+
type: StreamEventType.UserMessage,
|
|
425
|
+
userMessage: effectiveInput,
|
|
426
|
+
});
|
|
427
|
+
// Stream message through orchestrator
|
|
428
|
+
const stream = orchestratorClient.streamMessage(effectiveInput, {
|
|
429
|
+
model: options.model,
|
|
430
|
+
reasoningEffort: options.reasoningEffort,
|
|
431
|
+
prefillProvenance: options.prefillProvenance,
|
|
432
|
+
});
|
|
433
|
+
// Process chunks through React state (pure Ink rendering, no stdout)
|
|
434
|
+
// NOTE: We do NOT refresh history during streaming to avoid scroll reset
|
|
435
|
+
// The user message is shown via StreamDisplay's accumulated content
|
|
436
|
+
// History is refreshed ONLY after streaming completes
|
|
437
|
+
for await (const chunk of stream) {
|
|
438
|
+
// Check for abort
|
|
439
|
+
if (abortControllerRef.current?.signal.aborted || turnCancelledRef.current) {
|
|
440
|
+
onDebugMessage('Stream aborted by user');
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
// Check if this is still the active query
|
|
444
|
+
if (activeQueryIdRef.current !== queryId) {
|
|
445
|
+
onDebugMessage('Query superseded by newer query');
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
// Process chunk through React state - updates streamEvents for Ink rendering
|
|
449
|
+
processStreamChunk(chunk, accumulatedText, accumulatedThinking, accumulatedThinkingBlocks);
|
|
450
|
+
}
|
|
451
|
+
// Refresh UI from orchestrator's canonical history
|
|
452
|
+
// The orchestrator already has the complete message with all content blocks
|
|
453
|
+
// Just trigger a refresh - orchestrator is the single source of truth
|
|
454
|
+
if (refreshHistory) {
|
|
455
|
+
refreshHistory();
|
|
456
|
+
onDebugMessage(`History refreshed from orchestrator`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch (error) {
|
|
460
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
461
|
+
onDebugMessage(`Stream error: ${errorMessage}`);
|
|
462
|
+
// Add error message to history
|
|
463
|
+
addItem({
|
|
464
|
+
type: MessageType.Error,
|
|
465
|
+
errorContent: errorMessage,
|
|
466
|
+
}, Date.now());
|
|
467
|
+
}
|
|
468
|
+
finally {
|
|
469
|
+
// Clean up
|
|
470
|
+
setStreamingState(StreamingState.Idle);
|
|
471
|
+
updatePendingHistoryItem(null);
|
|
472
|
+
abortControllerRef.current = null;
|
|
473
|
+
activeQueryIdRef.current = null;
|
|
474
|
+
}
|
|
475
|
+
}, [
|
|
476
|
+
orchestratorClient,
|
|
477
|
+
streamingState,
|
|
478
|
+
handleSlashCommand,
|
|
479
|
+
addItem,
|
|
480
|
+
processStreamChunk,
|
|
481
|
+
onDebugMessage,
|
|
482
|
+
updatePendingHistoryItem,
|
|
483
|
+
]);
|
|
484
|
+
// Compute pending history items for UI
|
|
485
|
+
const pendingHistoryItems = useMemo(() => {
|
|
486
|
+
const items = [];
|
|
487
|
+
if (pendingHistoryItemRef.current) {
|
|
488
|
+
items.push(pendingHistoryItemRef.current);
|
|
489
|
+
}
|
|
490
|
+
return items;
|
|
491
|
+
}, [pendingHistoryItemRef.current]);
|
|
492
|
+
// Compute last output time
|
|
493
|
+
const lastOutputTime = Math.max(lastToolOutputTime, lastShellOutputTime);
|
|
494
|
+
return {
|
|
495
|
+
streamingState,
|
|
496
|
+
submitQuery,
|
|
497
|
+
initError,
|
|
498
|
+
pendingHistoryItems,
|
|
499
|
+
thought,
|
|
500
|
+
cancelOngoingRequest,
|
|
501
|
+
pendingToolCalls: toolCalls,
|
|
502
|
+
pendingToolInputArgs: toolInputArgs,
|
|
503
|
+
handleApprovalModeChange,
|
|
504
|
+
activePtyId,
|
|
505
|
+
loopDetectionConfirmationRequest,
|
|
506
|
+
lastOutputTime,
|
|
507
|
+
// New: interleaved stream events for display
|
|
508
|
+
streamEvents,
|
|
509
|
+
// Turn summary & prediction (post-turn helper model output)
|
|
510
|
+
turnSummary,
|
|
511
|
+
nextActionPrediction,
|
|
512
|
+
// Turn usage from orchestrator (set on message_stop)
|
|
513
|
+
turnUsage,
|
|
514
|
+
// Streaming timer
|
|
515
|
+
streamStartTime,
|
|
516
|
+
};
|
|
517
|
+
};
|
|
518
|
+
//# sourceMappingURL=useCortexStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCortexStream.js","sourceRoot":"","sources":["../../../src/ink-ui/hooks/useCortexStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare const ENABLE_FOCUS_REPORTING = "\u001B[?1004h";
|
|
7
|
+
export declare const DISABLE_FOCUS_REPORTING = "\u001B[?1004l";
|
|
8
|
+
export declare const FOCUS_IN = "\u001B[I";
|
|
9
|
+
export declare const FOCUS_OUT = "\u001B[O";
|
|
10
|
+
export declare const useFocus: () => boolean;
|
|
11
|
+
//# sourceMappingURL=useFocus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocus.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/hooks/useFocus.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,eAAO,MAAM,sBAAsB,kBAAgB,CAAC;AACpD,eAAO,MAAM,uBAAuB,kBAAgB,CAAC;AAGrD,eAAO,MAAM,QAAQ,aAAW,CAAC;AACjC,eAAO,MAAM,SAAS,aAAW,CAAC;AAElC,eAAO,MAAM,QAAQ,eA2CpB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { useStdin, useStdout } from 'ink';
|
|
7
|
+
import { useEffect, useState } from 'react';
|
|
8
|
+
import { useKeypress } from './useKeypress.js';
|
|
9
|
+
// ANSI escape codes to enable/disable terminal focus reporting
|
|
10
|
+
export const ENABLE_FOCUS_REPORTING = '\x1b[?1004h';
|
|
11
|
+
export const DISABLE_FOCUS_REPORTING = '\x1b[?1004l';
|
|
12
|
+
// ANSI escape codes for focus events
|
|
13
|
+
export const FOCUS_IN = '\x1b[I';
|
|
14
|
+
export const FOCUS_OUT = '\x1b[O';
|
|
15
|
+
export const useFocus = () => {
|
|
16
|
+
const { stdin } = useStdin();
|
|
17
|
+
const { stdout } = useStdout();
|
|
18
|
+
const [isFocused, setIsFocused] = useState(true);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const handleData = (data) => {
|
|
21
|
+
const sequence = data.toString();
|
|
22
|
+
const lastFocusIn = sequence.lastIndexOf(FOCUS_IN);
|
|
23
|
+
const lastFocusOut = sequence.lastIndexOf(FOCUS_OUT);
|
|
24
|
+
if (lastFocusIn > lastFocusOut) {
|
|
25
|
+
setIsFocused(true);
|
|
26
|
+
}
|
|
27
|
+
else if (lastFocusOut > lastFocusIn) {
|
|
28
|
+
setIsFocused(false);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
// Enable focus reporting
|
|
32
|
+
stdout?.write(ENABLE_FOCUS_REPORTING);
|
|
33
|
+
stdin?.on('data', handleData);
|
|
34
|
+
return () => {
|
|
35
|
+
// Disable focus reporting on cleanup
|
|
36
|
+
stdout?.write(DISABLE_FOCUS_REPORTING);
|
|
37
|
+
stdin?.removeListener('data', handleData);
|
|
38
|
+
};
|
|
39
|
+
}, [stdin, stdout]);
|
|
40
|
+
useKeypress((_) => {
|
|
41
|
+
if (!isFocused) {
|
|
42
|
+
// If the user has typed a key, and we cannot possibly be focused out.
|
|
43
|
+
// This is a workaround for some tmux use cases. It is still useful to
|
|
44
|
+
// listen for the true FOCUS_IN event as well as that will update the
|
|
45
|
+
// focus state earlier than waiting for a keypress.
|
|
46
|
+
setIsFocused(true);
|
|
47
|
+
}
|
|
48
|
+
}, { isActive: true });
|
|
49
|
+
return isFocused;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=useFocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocus.js","sourceRoot":"","sources":["../../../src/ink-ui/hooks/useFocus.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,+DAA+D;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAErD,qCAAqC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;AACjC,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAElC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAErD,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;gBAC/B,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,YAAY,GAAG,WAAW,EAAE,CAAC;gBACtC,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF,yBAAyB;QACzB,MAAM,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE9B,OAAO,GAAG,EAAE;YACV,qCAAqC;YACrC,MAAM,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACvC,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,WAAW,CACT,CAAC,CAAC,EAAE,EAAE;QACJ,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,sEAAsE;YACtE,sEAAsE;YACtE,qEAAqE;YACrE,mDAAmD;YACnD,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useHistoryManager - Manages conversation history for the UI
|
|
3
|
+
*
|
|
4
|
+
* Simplified version for Cortex that doesn't depend on @google/gemini-cli-core.
|
|
5
|
+
*/
|
|
6
|
+
import type { HistoryItem, HistoryItemWithoutId } from '../cortex-types.js';
|
|
7
|
+
type HistoryItemUpdater = (prevItem: HistoryItem) => Partial<Omit<HistoryItem, 'id'>>;
|
|
8
|
+
export interface UseHistoryManagerReturn {
|
|
9
|
+
history: HistoryItem[];
|
|
10
|
+
addItem: (itemData: HistoryItemWithoutId, baseTimestamp: number, isResuming?: boolean) => string;
|
|
11
|
+
updateItem: (id: string, updates: Partial<Omit<HistoryItem, 'id'>> | HistoryItemUpdater) => void;
|
|
12
|
+
clearHistory: () => void;
|
|
13
|
+
loadHistory: (newHistory: HistoryItem[]) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Custom hook to manage the chat history state.
|
|
17
|
+
*
|
|
18
|
+
* Encapsulates the history array, message ID generation, adding items,
|
|
19
|
+
* updating items, and clearing the history.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useHistory(): UseHistoryManagerReturn;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=useHistoryManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHistoryManager.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/hooks/useHistoryManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG5E,KAAK,kBAAkB,GAAG,CACxB,QAAQ,EAAE,WAAW,KAClB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAEtC,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,CACP,QAAQ,EAAE,oBAAoB,EAC9B,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,OAAO,KACjB,MAAM,CAAC;IACZ,UAAU,EAAE,CACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,GAAG,kBAAkB,KAC3D,IAAI,CAAC;IACV,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,uBAAuB,CA4EpD"}
|