@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
package/bin/launcher.js
ADDED
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Nexus Cortex Unified Launcher
|
|
4
|
+
*
|
|
5
|
+
* Starts server as child process and launches CLI
|
|
6
|
+
* Server shuts down when CLI exits (Ctrl+C)
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* cortex # Normal mode
|
|
10
|
+
* cortex --dev # Dev mode with hot reload
|
|
11
|
+
* cortex [command] # Forward to CLI
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { spawn } from 'child_process';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
import { dirname, join } from 'path';
|
|
17
|
+
import { existsSync, realpathSync } from 'fs';
|
|
18
|
+
import http from 'http';
|
|
19
|
+
import { config } from 'dotenv';
|
|
20
|
+
|
|
21
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
22
|
+
// Resolve symlinks to get actual path (important for npm link)
|
|
23
|
+
const __dirname = dirname(realpathSync(__filename));
|
|
24
|
+
|
|
25
|
+
// Paths - resolved from actual location, not symlink
|
|
26
|
+
const CLI_DIR = join(__dirname, '..');
|
|
27
|
+
const SERVER_DIR = join(CLI_DIR, '..', 'server');
|
|
28
|
+
const PKG_ROOT = join(CLI_DIR, '..', '..');
|
|
29
|
+
|
|
30
|
+
// Anchor the install root so .cortex/ config (agents, MCP, etc.) is discoverable
|
|
31
|
+
// regardless of the cwd the user launches from. Honors a pre-set CORTEX_ROOT.
|
|
32
|
+
// Spawned children inherit this via process.env.
|
|
33
|
+
process.env.CORTEX_ROOT = process.env.CORTEX_ROOT || PKG_ROOT;
|
|
34
|
+
|
|
35
|
+
// Load .env: cwd first (user's project), then package root (dev/monorepo).
|
|
36
|
+
// dotenv's default is "first wins" — cwd values take priority.
|
|
37
|
+
const cwdEnv = join(process.cwd(), '.env');
|
|
38
|
+
const pkgEnv = join(PKG_ROOT, '.env');
|
|
39
|
+
const cwdEnvLocal = join(process.cwd(), '.env.local');
|
|
40
|
+
const pkgEnvLocal = join(PKG_ROOT, '.env.local');
|
|
41
|
+
|
|
42
|
+
if (existsSync(cwdEnv)) config({ path: cwdEnv, quiet: true });
|
|
43
|
+
if (existsSync(pkgEnv)) config({ path: pkgEnv, quiet: true });
|
|
44
|
+
if (existsSync(cwdEnvLocal)) config({ path: cwdEnvLocal, override: true, quiet: true });
|
|
45
|
+
if (existsSync(pkgEnvLocal)) config({ path: pkgEnvLocal, override: true, quiet: true });
|
|
46
|
+
|
|
47
|
+
// Parse arguments
|
|
48
|
+
const args = process.argv.slice(2);
|
|
49
|
+
const isDevMode = args.includes('--dev');
|
|
50
|
+
|
|
51
|
+
// Parse --server and --prompt flags
|
|
52
|
+
let serverMode = false;
|
|
53
|
+
let serverUrl = null;
|
|
54
|
+
let promptArg = null;
|
|
55
|
+
let cliArgs = [];
|
|
56
|
+
|
|
57
|
+
for (let i = 0; i < args.length; i++) {
|
|
58
|
+
const arg = args[i];
|
|
59
|
+
if (arg === '--server') {
|
|
60
|
+
serverMode = true;
|
|
61
|
+
// Check if next arg is a URL
|
|
62
|
+
if (i + 1 < args.length && args[i + 1].startsWith('http')) {
|
|
63
|
+
serverUrl = args[i + 1];
|
|
64
|
+
i++; // Skip the URL arg
|
|
65
|
+
}
|
|
66
|
+
} else if (arg === '--prompt' || arg === '-P') {
|
|
67
|
+
if (i + 1 < args.length) {
|
|
68
|
+
promptArg = args[i + 1];
|
|
69
|
+
i++; // Skip the prompt value
|
|
70
|
+
}
|
|
71
|
+
} else if (arg !== '--dev') {
|
|
72
|
+
cliArgs.push(arg);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Configuration
|
|
77
|
+
const PORT = process.env.PORT || 4000;
|
|
78
|
+
const DEFAULT_SERVER_URL = `http://localhost:${PORT}`;
|
|
79
|
+
|
|
80
|
+
// Determine mode
|
|
81
|
+
const mode = serverMode ? 'server' : 'direct';
|
|
82
|
+
const finalServerUrl = serverUrl || DEFAULT_SERVER_URL;
|
|
83
|
+
|
|
84
|
+
// Colors and ANSI codes
|
|
85
|
+
const colors = {
|
|
86
|
+
reset: '\x1b[0m',
|
|
87
|
+
cyan: '\x1b[36m',
|
|
88
|
+
green: '\x1b[32m',
|
|
89
|
+
yellow: '\x1b[33m',
|
|
90
|
+
red: '\x1b[31m',
|
|
91
|
+
magenta: '\x1b[35m',
|
|
92
|
+
dim: '\x1b[2m',
|
|
93
|
+
bold: '\x1b[1m',
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
function log(message, color = 'reset') {
|
|
97
|
+
console.log(`${colors[color]}${message}${colors.reset}`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Reset terminal to clean state before writing shutdown messages
|
|
102
|
+
*
|
|
103
|
+
* The CLI uses cursor save/restore for the input frame, which can leave
|
|
104
|
+
* the terminal in a state where writes go to the saved position (top of screen).
|
|
105
|
+
* Clear the screen entirely to avoid interleaving with CLI output.
|
|
106
|
+
*/
|
|
107
|
+
function resetTerminal() {
|
|
108
|
+
process.stdout.write(
|
|
109
|
+
'\x1b[?25h' + // Show cursor
|
|
110
|
+
'\x1b[0m' + // Reset text attributes
|
|
111
|
+
'\x1b[r' + // Reset scroll region to full screen
|
|
112
|
+
'\x1b[2J' + // Clear entire screen
|
|
113
|
+
'\x1b[H' + // Move cursor to home position (top-left)
|
|
114
|
+
'\n' // Add spacing
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Track child processes
|
|
119
|
+
let serverProcess = null;
|
|
120
|
+
let cliProcess = null;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Graceful shutdown handler
|
|
124
|
+
*/
|
|
125
|
+
function setupShutdownHandler() {
|
|
126
|
+
let shuttingDown = false;
|
|
127
|
+
|
|
128
|
+
const shutdown = (signal) => {
|
|
129
|
+
// Prevent multiple shutdown attempts
|
|
130
|
+
if (shuttingDown) return;
|
|
131
|
+
shuttingDown = true;
|
|
132
|
+
|
|
133
|
+
// Don't print anything here - let the CLI clean up its own terminal state
|
|
134
|
+
// The 'exit' handler on cliProcess will print the exit message
|
|
135
|
+
|
|
136
|
+
// Kill CLI (it will clean up its own terminal)
|
|
137
|
+
if (cliProcess && !cliProcess.killed) {
|
|
138
|
+
cliProcess.kill('SIGTERM');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Kill server
|
|
142
|
+
if (serverProcess && !serverProcess.killed) {
|
|
143
|
+
serverProcess.kill('SIGTERM');
|
|
144
|
+
|
|
145
|
+
// Force kill after 3 seconds if still running
|
|
146
|
+
setTimeout(() => {
|
|
147
|
+
if (serverProcess && !serverProcess.killed) {
|
|
148
|
+
serverProcess.kill('SIGKILL');
|
|
149
|
+
}
|
|
150
|
+
}, 3000);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Exit after brief delay to let processes clean up
|
|
154
|
+
setTimeout(() => {
|
|
155
|
+
process.exit(0);
|
|
156
|
+
}, 500);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// Handle Ctrl+C and termination signals
|
|
160
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
161
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
162
|
+
|
|
163
|
+
// Handle CLI exit
|
|
164
|
+
process.on('exit', () => {
|
|
165
|
+
if (serverProcess && !serverProcess.killed) {
|
|
166
|
+
serverProcess.kill('SIGKILL');
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Check if server is running
|
|
173
|
+
*/
|
|
174
|
+
async function isServerRunning() {
|
|
175
|
+
return new Promise((resolve) => {
|
|
176
|
+
const req = http.get(`${finalServerUrl}/health`, (res) => {
|
|
177
|
+
resolve(res.statusCode === 200);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
req.on('error', () => resolve(false));
|
|
181
|
+
req.setTimeout(1000, () => {
|
|
182
|
+
req.destroy();
|
|
183
|
+
resolve(false);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Wait for server to be ready
|
|
190
|
+
*/
|
|
191
|
+
async function waitForServer(maxAttempts = 30) {
|
|
192
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
193
|
+
if (await isServerRunning()) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Start server in production mode
|
|
203
|
+
*/
|
|
204
|
+
async function startServerProduction() {
|
|
205
|
+
log('[INIT] Starting server...', 'cyan');
|
|
206
|
+
|
|
207
|
+
const serverEntry = join(SERVER_DIR, 'dist', 'index.js');
|
|
208
|
+
if (!existsSync(serverEntry)) {
|
|
209
|
+
log('[ERROR]Server not built. Run: cd packages/server && npm run build', 'red');
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Start server as CHILD process (not detached)
|
|
214
|
+
serverProcess = spawn('node', [serverEntry], {
|
|
215
|
+
cwd: SERVER_DIR,
|
|
216
|
+
env: {
|
|
217
|
+
...process.env,
|
|
218
|
+
PORT: String(PORT),
|
|
219
|
+
},
|
|
220
|
+
stdio: ['ignore', 'pipe', 'pipe'], // Capture output
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// Log server output with prefix
|
|
224
|
+
serverProcess.stdout?.on('data', (data) => {
|
|
225
|
+
const lines = data.toString().trim().split('\n');
|
|
226
|
+
lines.forEach(line => {
|
|
227
|
+
if (line) log(` [server] ${line}`, 'dim');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
serverProcess.stderr?.on('data', (data) => {
|
|
232
|
+
const lines = data.toString().trim().split('\n');
|
|
233
|
+
lines.forEach(line => {
|
|
234
|
+
if (line) log(` [server] ${line}`, 'red');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
serverProcess.on('exit', (code) => {
|
|
239
|
+
if (code !== 0 && code !== null) {
|
|
240
|
+
log(`[ERROR]Server exited with code ${code}`, 'red');
|
|
241
|
+
process.exit(code);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
// Wait for server to be ready
|
|
246
|
+
const ready = await waitForServer();
|
|
247
|
+
if (!ready) {
|
|
248
|
+
log('[ERROR]Server failed to start', 'red');
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
log('[OK]Server ready', 'green');
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Start server in dev mode with hot reload
|
|
257
|
+
*/
|
|
258
|
+
async function startServerDev() {
|
|
259
|
+
log('[INIT] Starting server in DEV MODE (hot reload enabled)...', 'magenta');
|
|
260
|
+
|
|
261
|
+
// Check if tsx is available
|
|
262
|
+
const serverSrc = join(SERVER_DIR, 'src', 'index.ts');
|
|
263
|
+
if (!existsSync(serverSrc)) {
|
|
264
|
+
log('[ERROR]Server source not found', 'red');
|
|
265
|
+
process.exit(1);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Start server with tsx watch
|
|
269
|
+
serverProcess = spawn('npx', ['tsx', 'watch', serverSrc], {
|
|
270
|
+
cwd: SERVER_DIR,
|
|
271
|
+
env: {
|
|
272
|
+
...process.env,
|
|
273
|
+
PORT: String(PORT),
|
|
274
|
+
DEBUG: 'true',
|
|
275
|
+
NODE_ENV: 'development',
|
|
276
|
+
},
|
|
277
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// Log server output
|
|
281
|
+
serverProcess.stdout?.on('data', (data) => {
|
|
282
|
+
const lines = data.toString().trim().split('\n');
|
|
283
|
+
lines.forEach(line => {
|
|
284
|
+
if (line) log(` ${colors.magenta}[SERVER]${colors.reset} ${line}`, 'dim');
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
serverProcess.stderr?.on('data', (data) => {
|
|
289
|
+
const lines = data.toString().trim().split('\n');
|
|
290
|
+
lines.forEach(line => {
|
|
291
|
+
if (line) log(` ${colors.magenta}[SERVER]${colors.reset} ${line}`, 'red');
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
serverProcess.on('exit', (code) => {
|
|
296
|
+
if (code !== 0 && code !== null) {
|
|
297
|
+
log(`[ERROR]Server exited with code ${code}`, 'red');
|
|
298
|
+
process.exit(code);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
// Wait for server
|
|
303
|
+
const ready = await waitForServer();
|
|
304
|
+
if (!ready) {
|
|
305
|
+
log('[ERROR]Server failed to start', 'red');
|
|
306
|
+
process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
log('[OK]Server ready (watching for changes)', 'green');
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Create a new session on the server
|
|
314
|
+
*/
|
|
315
|
+
async function createNewSession() {
|
|
316
|
+
return new Promise((resolve, reject) => {
|
|
317
|
+
const postData = JSON.stringify({
|
|
318
|
+
modelId: process.env.DEFAULT_MODEL_ID,
|
|
319
|
+
projectPath: process.cwd()
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
const options = {
|
|
323
|
+
hostname: 'localhost',
|
|
324
|
+
port: PORT,
|
|
325
|
+
path: '/sessions/new',
|
|
326
|
+
method: 'POST',
|
|
327
|
+
headers: {
|
|
328
|
+
'Content-Type': 'application/json',
|
|
329
|
+
'Content-Length': Buffer.byteLength(postData)
|
|
330
|
+
},
|
|
331
|
+
timeout: 5000
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
const req = http.request(options, (res) => {
|
|
335
|
+
let data = '';
|
|
336
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
337
|
+
res.on('end', () => {
|
|
338
|
+
try {
|
|
339
|
+
const response = JSON.parse(data);
|
|
340
|
+
if (response.success) {
|
|
341
|
+
log(`[OK]New session created: ${response.sessionId}`, 'green');
|
|
342
|
+
log(` Model: ${response.model.name} (${response.model.contextWindow} tokens)`, 'dim');
|
|
343
|
+
resolve(response);
|
|
344
|
+
} else {
|
|
345
|
+
reject(new Error(response.error?.message || 'Failed to create session'));
|
|
346
|
+
}
|
|
347
|
+
} catch (e) {
|
|
348
|
+
reject(new Error(`Invalid response from server: ${data}`));
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
req.on('error', (err) => {
|
|
354
|
+
reject(new Error(`Failed to create session: ${err.message}`));
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
req.on('timeout', () => {
|
|
358
|
+
req.destroy();
|
|
359
|
+
reject(new Error('Session creation timed out'));
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
req.write(postData);
|
|
363
|
+
req.end();
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Launch CLI
|
|
369
|
+
*/
|
|
370
|
+
async function launchCLI() {
|
|
371
|
+
if (isDevMode) {
|
|
372
|
+
const modeLabel = mode === 'direct' ? 'DIRECT MODE' : 'SERVER MODE';
|
|
373
|
+
log(`\n[LAUNCH] CLI (${modeLabel} DEV)`, 'cyan');
|
|
374
|
+
if (mode === 'direct') {
|
|
375
|
+
log(' Using core library directly', 'dim');
|
|
376
|
+
} else {
|
|
377
|
+
log(` Connecting to: ${finalServerUrl}`, 'dim');
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const cliEntry = isDevMode
|
|
382
|
+
? join(CLI_DIR, 'src', 'index.ts')
|
|
383
|
+
: join(CLI_DIR, 'dist', 'index.js');
|
|
384
|
+
|
|
385
|
+
if (!existsSync(cliEntry)) {
|
|
386
|
+
const hint = isDevMode
|
|
387
|
+
? 'Source files missing'
|
|
388
|
+
: 'CLI not built. Run: cd packages/cli && npm run build';
|
|
389
|
+
log(`[ERROR]${hint}`, 'red');
|
|
390
|
+
process.exit(1);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Build command args
|
|
394
|
+
const command = isDevMode ? 'npx' : 'node';
|
|
395
|
+
const baseArgs = isDevMode ? ['tsx', cliEntry] : [cliEntry];
|
|
396
|
+
|
|
397
|
+
// Add command (default to chat, or 'message' if --prompt was provided)
|
|
398
|
+
let cliCommand;
|
|
399
|
+
if (promptArg && cliArgs.length === 0) {
|
|
400
|
+
cliCommand = ['message', promptArg];
|
|
401
|
+
} else {
|
|
402
|
+
cliCommand = cliArgs.length > 0 ? cliArgs : ['chat'];
|
|
403
|
+
}
|
|
404
|
+
const cmdArgs = [...baseArgs, ...cliCommand];
|
|
405
|
+
|
|
406
|
+
// Add --server flag if in server mode
|
|
407
|
+
if (mode === 'server') {
|
|
408
|
+
cmdArgs.push('--server', finalServerUrl);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// Add --debug in dev mode
|
|
412
|
+
if (isDevMode && !cmdArgs.includes('--debug')) {
|
|
413
|
+
cmdArgs.push('--debug');
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Start CLI
|
|
417
|
+
// Set CORTEX_* env for the spawned CLI process
|
|
418
|
+
cliProcess = spawn(command, cmdArgs, {
|
|
419
|
+
stdio: 'inherit',
|
|
420
|
+
env: {
|
|
421
|
+
...process.env,
|
|
422
|
+
CORTEX_MODE: mode,
|
|
423
|
+
CORTEX_SERVER_URL: mode === 'server' ? finalServerUrl : '',
|
|
424
|
+
CORTEX_ROOT: PKG_ROOT,
|
|
425
|
+
NODE_ENV: isDevMode ? 'development' : 'production',
|
|
426
|
+
},
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
cliProcess.on('exit', (code) => {
|
|
430
|
+
// Brief delay to let CLI finish any final terminal cleanup
|
|
431
|
+
setTimeout(() => {
|
|
432
|
+
// Reset terminal state before writing exit messages
|
|
433
|
+
resetTerminal();
|
|
434
|
+
|
|
435
|
+
// CLI exited, shut down server
|
|
436
|
+
log('[OK] Session ended', 'dim');
|
|
437
|
+
if (serverProcess && !serverProcess.killed) {
|
|
438
|
+
serverProcess.kill('SIGTERM');
|
|
439
|
+
}
|
|
440
|
+
setTimeout(() => process.exit(code || 0), 300);
|
|
441
|
+
}, 100);
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Main launcher
|
|
447
|
+
*/
|
|
448
|
+
async function main() {
|
|
449
|
+
// Setup shutdown handlers
|
|
450
|
+
setupShutdownHandler();
|
|
451
|
+
|
|
452
|
+
// Banner (verbose in dev mode only)
|
|
453
|
+
if (isDevMode) {
|
|
454
|
+
const modeStr = mode === 'direct' ? 'Direct Core' : 'Server';
|
|
455
|
+
log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━', 'cyan');
|
|
456
|
+
log(` Nexus Cortex - ${modeStr} DEV`, mode === 'direct' ? 'cyan' : 'magenta');
|
|
457
|
+
log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n', 'cyan');
|
|
458
|
+
|
|
459
|
+
if (existsSync(cwdEnv)) {
|
|
460
|
+
log(`[OK] Configuration loaded from: ${cwdEnv}`, 'dim');
|
|
461
|
+
} else if (existsSync(pkgEnv)) {
|
|
462
|
+
log(`[OK] Configuration loaded from: ${pkgEnv}`, 'dim');
|
|
463
|
+
} else {
|
|
464
|
+
log(`[WARN] No .env file found`, 'yellow');
|
|
465
|
+
}
|
|
466
|
+
} else if (!existsSync(cwdEnv) && !existsSync(pkgEnv)) {
|
|
467
|
+
log(`[WARN] No .env file found`, 'yellow');
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Server mode: Start server or connect to remote
|
|
471
|
+
if (mode === 'server') {
|
|
472
|
+
// Check if connecting to remote server
|
|
473
|
+
if (serverUrl) {
|
|
474
|
+
log(`\n[INIT] Connecting to remote server: ${serverUrl}`, 'cyan');
|
|
475
|
+
// No need to start local server
|
|
476
|
+
} else {
|
|
477
|
+
// Check for existing local server
|
|
478
|
+
const alreadyRunning = await isServerRunning();
|
|
479
|
+
if (alreadyRunning) {
|
|
480
|
+
log('[WARN]Server already running (external instance)', 'yellow');
|
|
481
|
+
log(' This launcher will NOT manage that server.', 'dim');
|
|
482
|
+
log(' Stop it with: pkill -f "server/dist/index.js"\n', 'dim');
|
|
483
|
+
} else {
|
|
484
|
+
// Start our managed local server
|
|
485
|
+
if (isDevMode) {
|
|
486
|
+
await startServerDev();
|
|
487
|
+
} else {
|
|
488
|
+
await startServerProduction();
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Create a new session
|
|
492
|
+
try {
|
|
493
|
+
log('\n[INIT] Creating new session...', 'cyan');
|
|
494
|
+
await createNewSession();
|
|
495
|
+
} catch (error) {
|
|
496
|
+
log(`[WARN]Warning: ${error.message}`, 'yellow');
|
|
497
|
+
log(' Continuing with existing session...', 'dim');
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
} else if (isDevMode) {
|
|
502
|
+
log('\n[INIT] Direct mode: core library loaded on CLI startup', 'cyan');
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// Launch CLI
|
|
506
|
+
await launchCLI();
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Run
|
|
510
|
+
main().catch((err) => {
|
|
511
|
+
log(`\n[ERROR]Error: ${err.message}`, 'red');
|
|
512
|
+
if (serverProcess && !serverProcess.killed) {
|
|
513
|
+
serverProcess.kill('SIGKILL');
|
|
514
|
+
}
|
|
515
|
+
process.exit(1);
|
|
516
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Agent Menu
|
|
3
|
+
*
|
|
4
|
+
* Ink-based terminal UI for managing Task Agent profiles.
|
|
5
|
+
* Provides list view, navigation, CRUD operations, and AI-powered agent creation.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { AgentStore } from '@nexus-cortex/core';
|
|
9
|
+
/**
|
|
10
|
+
* Conversation message for multi-turn agent creation
|
|
11
|
+
*/
|
|
12
|
+
export interface ConversationMessage {
|
|
13
|
+
role: 'user' | 'assistant';
|
|
14
|
+
content: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generated agent profile (from conversational creator)
|
|
18
|
+
*/
|
|
19
|
+
export interface GeneratedAgentProfile {
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
tools: string[] | 'all';
|
|
23
|
+
systemPrompt: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Model info from registry
|
|
27
|
+
*/
|
|
28
|
+
export interface ModelInfo {
|
|
29
|
+
id: string;
|
|
30
|
+
displayName?: string;
|
|
31
|
+
owned_by?: string;
|
|
32
|
+
contextWindow?: number;
|
|
33
|
+
inputCostPer1M?: number;
|
|
34
|
+
outputCostPer1M?: number;
|
|
35
|
+
supportsTools?: boolean;
|
|
36
|
+
reasoning?: {
|
|
37
|
+
supported: boolean;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Model listing function type
|
|
42
|
+
*/
|
|
43
|
+
export type ModelListFn = () => Promise<ModelInfo[]>;
|
|
44
|
+
/**
|
|
45
|
+
* One-shot agent profile generator function type (legacy)
|
|
46
|
+
*/
|
|
47
|
+
export type AgentProfileGenerator = (description: string, model: string) => Promise<GeneratedAgentProfile>;
|
|
48
|
+
/**
|
|
49
|
+
* Conversational response from AI during agent creation
|
|
50
|
+
*/
|
|
51
|
+
export interface ConversationalAgentResponse {
|
|
52
|
+
/** Response type */
|
|
53
|
+
type: 'question' | 'profile';
|
|
54
|
+
/** Clarifying question to ask the user */
|
|
55
|
+
question?: string;
|
|
56
|
+
/** Final generated profile */
|
|
57
|
+
profile?: GeneratedAgentProfile;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Conversational agent creator function type
|
|
61
|
+
*
|
|
62
|
+
* Takes the full conversation history and returns either:
|
|
63
|
+
* - A clarifying question (type: 'question')
|
|
64
|
+
* - A final profile (type: 'profile')
|
|
65
|
+
*/
|
|
66
|
+
export type ConversationalAgentCreator = (messages: ConversationMessage[], model: string) => Promise<ConversationalAgentResponse>;
|
|
67
|
+
/**
|
|
68
|
+
* Edit assistant function type
|
|
69
|
+
* Takes current content and edit request, returns updated content
|
|
70
|
+
*/
|
|
71
|
+
export type EditAssistantFn = (currentContent: string, editRequest: string, agentName: string) => Promise<{
|
|
72
|
+
content: string;
|
|
73
|
+
summary: string;
|
|
74
|
+
}>;
|
|
75
|
+
/**
|
|
76
|
+
* Props for InteractiveAgentMenu
|
|
77
|
+
*/
|
|
78
|
+
export interface InteractiveAgentMenuProps {
|
|
79
|
+
/** Agent store instance */
|
|
80
|
+
store: AgentStore;
|
|
81
|
+
/** Optional initial agent name to select */
|
|
82
|
+
initialAgentName?: string;
|
|
83
|
+
/** Current model ID for inherit option */
|
|
84
|
+
currentModel?: string;
|
|
85
|
+
/** Function to generate agent profile using AI (legacy one-shot) */
|
|
86
|
+
generateAgentProfile?: AgentProfileGenerator;
|
|
87
|
+
/** Function for conversational agent creation with clarifying questions */
|
|
88
|
+
conversationalCreator?: ConversationalAgentCreator;
|
|
89
|
+
/** Function to list available models from registry */
|
|
90
|
+
listModels?: ModelListFn;
|
|
91
|
+
/** Function for AI-assisted editing of existing agents */
|
|
92
|
+
editAssistant?: EditAssistantFn;
|
|
93
|
+
/** Callback when user exits the menu (enables graceful return to CLI) */
|
|
94
|
+
onExit?: () => void;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Interactive Agent Menu Component
|
|
98
|
+
*/
|
|
99
|
+
export declare const InteractiveAgentMenu: React.FC<InteractiveAgentMenuProps>;
|
|
100
|
+
//# sourceMappingURL=InteractiveAgentMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteractiveAgentMenu.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/InteractiveAgentMenu.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAuC,MAAM,OAAO,CAAC;AAK5D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsBhD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,oBAAoB;IACpB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACvC,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,2BAA2B;IAC3B,KAAK,EAAE,UAAU,CAAC;IAElB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAE7C,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,0BAA0B,CAAC;IAEnD,sDAAsD;IACtD,UAAU,CAAC,EAAE,WAAW,CAAC;IAEzB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,eAAe,CAAC;IAEhC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CA+/CpE,CAAC"}
|