@shareai-lab/kode 1.1.13 → 1.1.16-dev.1
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/dist/entrypoints/cli.js +59 -38
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/index.js +5 -26
- package/dist/package.json +4 -1
- package/package.json +11 -104
- package/dist/test/testAdapters.js +0 -88
- package/dist/test/testAdapters.js.map +0 -1
- package/src/ProjectOnboarding.tsx +0 -198
- package/src/Tool.ts +0 -83
- package/src/commands/agents.tsx +0 -3416
- package/src/commands/approvedTools.ts +0 -53
- package/src/commands/bug.tsx +0 -20
- package/src/commands/clear.ts +0 -43
- package/src/commands/compact.ts +0 -120
- package/src/commands/config.tsx +0 -19
- package/src/commands/cost.ts +0 -18
- package/src/commands/ctx_viz.ts +0 -209
- package/src/commands/doctor.ts +0 -24
- package/src/commands/help.tsx +0 -19
- package/src/commands/init.ts +0 -37
- package/src/commands/listen.ts +0 -42
- package/src/commands/login.tsx +0 -51
- package/src/commands/logout.tsx +0 -40
- package/src/commands/mcp.ts +0 -41
- package/src/commands/model.tsx +0 -40
- package/src/commands/modelstatus.tsx +0 -20
- package/src/commands/onboarding.tsx +0 -34
- package/src/commands/pr_comments.ts +0 -59
- package/src/commands/refreshCommands.ts +0 -54
- package/src/commands/release-notes.ts +0 -34
- package/src/commands/resume.tsx +0 -31
- package/src/commands/review.ts +0 -49
- package/src/commands/terminalSetup.ts +0 -221
- package/src/commands.ts +0 -139
- package/src/components/ApproveApiKey.tsx +0 -93
- package/src/components/AsciiLogo.tsx +0 -13
- package/src/components/AutoUpdater.tsx +0 -148
- package/src/components/Bug.tsx +0 -367
- package/src/components/Config.tsx +0 -293
- package/src/components/ConsoleOAuthFlow.tsx +0 -327
- package/src/components/Cost.tsx +0 -23
- package/src/components/CostThresholdDialog.tsx +0 -46
- package/src/components/CustomSelect/option-map.ts +0 -42
- package/src/components/CustomSelect/select-option.tsx +0 -78
- package/src/components/CustomSelect/select.tsx +0 -152
- package/src/components/CustomSelect/theme.ts +0 -45
- package/src/components/CustomSelect/use-select-state.ts +0 -414
- package/src/components/CustomSelect/use-select.ts +0 -35
- package/src/components/FallbackToolUseRejectedMessage.tsx +0 -15
- package/src/components/FileEditToolUpdatedMessage.tsx +0 -66
- package/src/components/Help.tsx +0 -215
- package/src/components/HighlightedCode.tsx +0 -33
- package/src/components/InvalidConfigDialog.tsx +0 -113
- package/src/components/Link.tsx +0 -32
- package/src/components/LogSelector.tsx +0 -86
- package/src/components/Logo.tsx +0 -170
- package/src/components/MCPServerApprovalDialog.tsx +0 -100
- package/src/components/MCPServerDialogCopy.tsx +0 -25
- package/src/components/MCPServerMultiselectDialog.tsx +0 -109
- package/src/components/Message.tsx +0 -221
- package/src/components/MessageResponse.tsx +0 -15
- package/src/components/MessageSelector.tsx +0 -211
- package/src/components/ModeIndicator.tsx +0 -88
- package/src/components/ModelConfig.tsx +0 -301
- package/src/components/ModelListManager.tsx +0 -227
- package/src/components/ModelSelector.tsx +0 -3387
- package/src/components/ModelStatusDisplay.tsx +0 -230
- package/src/components/Onboarding.tsx +0 -274
- package/src/components/PressEnterToContinue.tsx +0 -11
- package/src/components/PromptInput.tsx +0 -760
- package/src/components/SentryErrorBoundary.ts +0 -39
- package/src/components/Spinner.tsx +0 -129
- package/src/components/StickerRequestForm.tsx +0 -16
- package/src/components/StructuredDiff.tsx +0 -191
- package/src/components/TextInput.tsx +0 -259
- package/src/components/TodoItem.tsx +0 -47
- package/src/components/TokenWarning.tsx +0 -31
- package/src/components/ToolUseLoader.tsx +0 -40
- package/src/components/TrustDialog.tsx +0 -106
- package/src/components/binary-feedback/BinaryFeedback.tsx +0 -63
- package/src/components/binary-feedback/BinaryFeedbackOption.tsx +0 -111
- package/src/components/binary-feedback/BinaryFeedbackView.tsx +0 -172
- package/src/components/binary-feedback/utils.ts +0 -220
- package/src/components/messages/AssistantBashOutputMessage.tsx +0 -22
- package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +0 -49
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -19
- package/src/components/messages/AssistantTextMessage.tsx +0 -144
- package/src/components/messages/AssistantThinkingMessage.tsx +0 -40
- package/src/components/messages/AssistantToolUseMessage.tsx +0 -132
- package/src/components/messages/TaskProgressMessage.tsx +0 -32
- package/src/components/messages/TaskToolMessage.tsx +0 -58
- package/src/components/messages/UserBashInputMessage.tsx +0 -28
- package/src/components/messages/UserCommandMessage.tsx +0 -30
- package/src/components/messages/UserKodingInputMessage.tsx +0 -28
- package/src/components/messages/UserPromptMessage.tsx +0 -35
- package/src/components/messages/UserTextMessage.tsx +0 -39
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -12
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -36
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -31
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -57
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -35
- package/src/components/messages/UserToolResultMessage/utils.tsx +0 -56
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -121
- package/src/components/permissions/FallbackPermissionRequest.tsx +0 -153
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
- package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +0 -77
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -164
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -83
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -240
- package/src/components/permissions/PermissionRequest.tsx +0 -101
- package/src/components/permissions/PermissionRequestTitle.tsx +0 -69
- package/src/components/permissions/hooks.ts +0 -44
- package/src/components/permissions/toolUseOptions.ts +0 -59
- package/src/components/permissions/utils.ts +0 -23
- package/src/constants/betas.ts +0 -5
- package/src/constants/claude-asterisk-ascii-art.tsx +0 -238
- package/src/constants/figures.ts +0 -4
- package/src/constants/keys.ts +0 -3
- package/src/constants/macros.ts +0 -11
- package/src/constants/modelCapabilities.ts +0 -179
- package/src/constants/models.ts +0 -1025
- package/src/constants/oauth.ts +0 -18
- package/src/constants/product.ts +0 -17
- package/src/constants/prompts.ts +0 -168
- package/src/constants/releaseNotes.ts +0 -7
- package/src/context/PermissionContext.tsx +0 -149
- package/src/context.ts +0 -278
- package/src/cost-tracker.ts +0 -84
- package/src/entrypoints/cli.tsx +0 -1561
- package/src/entrypoints/mcp.ts +0 -175
- package/src/history.ts +0 -25
- package/src/hooks/useApiKeyVerification.ts +0 -59
- package/src/hooks/useArrowKeyHistory.ts +0 -55
- package/src/hooks/useCanUseTool.ts +0 -138
- package/src/hooks/useCancelRequest.ts +0 -39
- package/src/hooks/useDoublePress.ts +0 -41
- package/src/hooks/useExitOnCtrlCD.ts +0 -31
- package/src/hooks/useInterval.ts +0 -25
- package/src/hooks/useLogMessages.ts +0 -16
- package/src/hooks/useLogStartupTime.ts +0 -12
- package/src/hooks/useNotifyAfterTimeout.ts +0 -65
- package/src/hooks/usePermissionRequestLogging.ts +0 -44
- package/src/hooks/useTerminalSize.ts +0 -49
- package/src/hooks/useTextInput.ts +0 -317
- package/src/hooks/useUnifiedCompletion.ts +0 -1405
- package/src/index.ts +0 -34
- package/src/messages.ts +0 -38
- package/src/permissions.ts +0 -268
- package/src/query.ts +0 -720
- package/src/screens/ConfigureNpmPrefix.tsx +0 -197
- package/src/screens/Doctor.tsx +0 -219
- package/src/screens/LogList.tsx +0 -68
- package/src/screens/REPL.tsx +0 -813
- package/src/screens/ResumeConversation.tsx +0 -68
- package/src/services/adapters/base.ts +0 -38
- package/src/services/adapters/chatCompletions.ts +0 -90
- package/src/services/adapters/responsesAPI.ts +0 -170
- package/src/services/browserMocks.ts +0 -66
- package/src/services/claude.ts +0 -2197
- package/src/services/customCommands.ts +0 -704
- package/src/services/fileFreshness.ts +0 -377
- package/src/services/gpt5ConnectionTest.ts +0 -340
- package/src/services/mcpClient.ts +0 -564
- package/src/services/mcpServerApproval.tsx +0 -50
- package/src/services/mentionProcessor.ts +0 -273
- package/src/services/modelAdapterFactory.ts +0 -69
- package/src/services/notifier.ts +0 -40
- package/src/services/oauth.ts +0 -357
- package/src/services/openai.ts +0 -1359
- package/src/services/responseStateManager.ts +0 -90
- package/src/services/sentry.ts +0 -3
- package/src/services/statsig.ts +0 -172
- package/src/services/statsigStorage.ts +0 -86
- package/src/services/systemReminder.ts +0 -507
- package/src/services/vcr.ts +0 -161
- package/src/test/testAdapters.ts +0 -96
- package/src/tools/ArchitectTool/ArchitectTool.tsx +0 -135
- package/src/tools/ArchitectTool/prompt.ts +0 -15
- package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +0 -576
- package/src/tools/BashTool/BashTool.tsx +0 -243
- package/src/tools/BashTool/BashToolResultMessage.tsx +0 -38
- package/src/tools/BashTool/OutputLine.tsx +0 -49
- package/src/tools/BashTool/prompt.ts +0 -174
- package/src/tools/BashTool/utils.ts +0 -56
- package/src/tools/FileEditTool/FileEditTool.tsx +0 -319
- package/src/tools/FileEditTool/prompt.ts +0 -51
- package/src/tools/FileEditTool/utils.ts +0 -58
- package/src/tools/FileReadTool/FileReadTool.tsx +0 -404
- package/src/tools/FileReadTool/prompt.ts +0 -7
- package/src/tools/FileWriteTool/FileWriteTool.tsx +0 -301
- package/src/tools/FileWriteTool/prompt.ts +0 -10
- package/src/tools/GlobTool/GlobTool.tsx +0 -119
- package/src/tools/GlobTool/prompt.ts +0 -8
- package/src/tools/GrepTool/GrepTool.tsx +0 -147
- package/src/tools/GrepTool/prompt.ts +0 -11
- package/src/tools/MCPTool/MCPTool.tsx +0 -107
- package/src/tools/MCPTool/prompt.ts +0 -3
- package/src/tools/MemoryReadTool/MemoryReadTool.tsx +0 -127
- package/src/tools/MemoryReadTool/prompt.ts +0 -3
- package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +0 -89
- package/src/tools/MemoryWriteTool/prompt.ts +0 -3
- package/src/tools/MultiEditTool/MultiEditTool.tsx +0 -388
- package/src/tools/MultiEditTool/prompt.ts +0 -45
- package/src/tools/NotebookEditTool/NotebookEditTool.tsx +0 -298
- package/src/tools/NotebookEditTool/prompt.ts +0 -3
- package/src/tools/NotebookReadTool/NotebookReadTool.tsx +0 -258
- package/src/tools/NotebookReadTool/prompt.ts +0 -3
- package/src/tools/StickerRequestTool/StickerRequestTool.tsx +0 -107
- package/src/tools/StickerRequestTool/prompt.ts +0 -19
- package/src/tools/TaskTool/TaskTool.tsx +0 -438
- package/src/tools/TaskTool/constants.ts +0 -1
- package/src/tools/TaskTool/prompt.ts +0 -92
- package/src/tools/ThinkTool/ThinkTool.tsx +0 -54
- package/src/tools/ThinkTool/prompt.ts +0 -12
- package/src/tools/TodoWriteTool/TodoWriteTool.tsx +0 -313
- package/src/tools/TodoWriteTool/prompt.ts +0 -63
- package/src/tools/URLFetcherTool/URLFetcherTool.tsx +0 -178
- package/src/tools/URLFetcherTool/cache.ts +0 -55
- package/src/tools/URLFetcherTool/htmlToMarkdown.ts +0 -55
- package/src/tools/URLFetcherTool/prompt.ts +0 -17
- package/src/tools/WebSearchTool/WebSearchTool.tsx +0 -103
- package/src/tools/WebSearchTool/prompt.ts +0 -13
- package/src/tools/WebSearchTool/searchProviders.ts +0 -66
- package/src/tools/lsTool/lsTool.tsx +0 -272
- package/src/tools/lsTool/prompt.ts +0 -2
- package/src/tools.ts +0 -67
- package/src/types/PermissionMode.ts +0 -120
- package/src/types/RequestContext.ts +0 -72
- package/src/types/common.d.ts +0 -2
- package/src/types/conversation.ts +0 -51
- package/src/types/logs.ts +0 -58
- package/src/types/modelCapabilities.ts +0 -64
- package/src/types/notebook.ts +0 -87
- package/src/utils/Cursor.ts +0 -436
- package/src/utils/PersistentShell.ts +0 -552
- package/src/utils/advancedFuzzyMatcher.ts +0 -290
- package/src/utils/agentLoader.ts +0 -278
- package/src/utils/agentStorage.ts +0 -97
- package/src/utils/array.ts +0 -3
- package/src/utils/ask.tsx +0 -99
- package/src/utils/auth.ts +0 -13
- package/src/utils/autoCompactCore.ts +0 -223
- package/src/utils/autoUpdater.ts +0 -458
- package/src/utils/betas.ts +0 -20
- package/src/utils/browser.ts +0 -14
- package/src/utils/cleanup.ts +0 -72
- package/src/utils/commands.ts +0 -261
- package/src/utils/commonUnixCommands.ts +0 -161
- package/src/utils/config.ts +0 -945
- package/src/utils/conversationRecovery.ts +0 -55
- package/src/utils/debugLogger.ts +0 -1235
- package/src/utils/diff.ts +0 -42
- package/src/utils/env.ts +0 -57
- package/src/utils/errors.ts +0 -21
- package/src/utils/exampleCommands.ts +0 -109
- package/src/utils/execFileNoThrow.ts +0 -51
- package/src/utils/expertChatStorage.ts +0 -136
- package/src/utils/file.ts +0 -405
- package/src/utils/fileRecoveryCore.ts +0 -71
- package/src/utils/format.tsx +0 -44
- package/src/utils/fuzzyMatcher.ts +0 -328
- package/src/utils/generators.ts +0 -62
- package/src/utils/git.ts +0 -92
- package/src/utils/globalLogger.ts +0 -77
- package/src/utils/http.ts +0 -10
- package/src/utils/imagePaste.ts +0 -38
- package/src/utils/json.ts +0 -13
- package/src/utils/log.ts +0 -382
- package/src/utils/markdown.ts +0 -213
- package/src/utils/messageContextManager.ts +0 -294
- package/src/utils/messages.tsx +0 -945
- package/src/utils/model.ts +0 -914
- package/src/utils/permissions/filesystem.ts +0 -127
- package/src/utils/responseState.ts +0 -23
- package/src/utils/ripgrep.ts +0 -167
- package/src/utils/secureFile.ts +0 -564
- package/src/utils/sessionState.ts +0 -49
- package/src/utils/state.ts +0 -25
- package/src/utils/style.ts +0 -29
- package/src/utils/terminal.ts +0 -50
- package/src/utils/theme.ts +0 -127
- package/src/utils/thinking.ts +0 -144
- package/src/utils/todoStorage.ts +0 -431
- package/src/utils/tokens.ts +0 -43
- package/src/utils/toolExecutionController.ts +0 -163
- package/src/utils/unaryLogging.ts +0 -26
- package/src/utils/user.ts +0 -37
- package/src/utils/validate.ts +0 -165
package/src/components/Help.tsx
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { Command } from '../commands'
|
|
2
|
-
import { PRODUCT_COMMAND, PRODUCT_NAME } from '../constants/product'
|
|
3
|
-
import {
|
|
4
|
-
getCustomCommandDirectories,
|
|
5
|
-
hasCustomCommands,
|
|
6
|
-
type CustomCommandWithScope,
|
|
7
|
-
} from '../services/customCommands'
|
|
8
|
-
import * as React from 'react'
|
|
9
|
-
import { Box, Text, useInput } from 'ink'
|
|
10
|
-
import { getTheme } from '../utils/theme'
|
|
11
|
-
import { PressEnterToContinue } from './PressEnterToContinue'
|
|
12
|
-
import { MACRO } from '../constants/macros'
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Help Component - Interactive help system with progressive disclosure
|
|
16
|
-
*
|
|
17
|
-
* This component provides a comprehensive help interface that progressively
|
|
18
|
-
* reveals information to avoid overwhelming users. It categorizes commands
|
|
19
|
-
* into built-in and custom types, providing clear guidance on usage.
|
|
20
|
-
*
|
|
21
|
-
* The progressive disclosure pattern (count-based) ensures users can absorb
|
|
22
|
-
* information at their own pace while maintaining a responsive interface.
|
|
23
|
-
*/
|
|
24
|
-
export function Help({
|
|
25
|
-
commands,
|
|
26
|
-
onClose,
|
|
27
|
-
}: {
|
|
28
|
-
commands: Command[]
|
|
29
|
-
onClose: () => void
|
|
30
|
-
}): React.ReactNode {
|
|
31
|
-
const theme = getTheme()
|
|
32
|
-
const moreHelp = `Learn more at: ${MACRO.README_URL}`
|
|
33
|
-
|
|
34
|
-
// Filter out hidden commands from the help display
|
|
35
|
-
const filteredCommands = commands.filter(cmd => !cmd.isHidden)
|
|
36
|
-
|
|
37
|
-
// Separate built-in commands from custom commands
|
|
38
|
-
// Built-in commands are those that don't follow the custom command patterns
|
|
39
|
-
const builtInCommands = filteredCommands.filter(
|
|
40
|
-
cmd => !cmd.name.startsWith('project:') && !cmd.name.startsWith('user:'),
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
// Custom commands are those with project: or user: prefixes
|
|
44
|
-
const customCommands = filteredCommands.filter(
|
|
45
|
-
cmd => cmd.name.startsWith('project:') || cmd.name.startsWith('user:'),
|
|
46
|
-
) as CustomCommandWithScope[]
|
|
47
|
-
|
|
48
|
-
// Progressive disclosure state for managing information flow
|
|
49
|
-
const [count, setCount] = React.useState(0)
|
|
50
|
-
|
|
51
|
-
// Timer-based progressive disclosure to prevent information overload
|
|
52
|
-
React.useEffect(() => {
|
|
53
|
-
const timer = setTimeout(() => {
|
|
54
|
-
if (count < 3) {
|
|
55
|
-
setCount(count + 1)
|
|
56
|
-
}
|
|
57
|
-
}, 250)
|
|
58
|
-
|
|
59
|
-
return () => clearTimeout(timer)
|
|
60
|
-
}, [count])
|
|
61
|
-
|
|
62
|
-
// Handle Enter key to close help
|
|
63
|
-
useInput((_, key) => {
|
|
64
|
-
if (key.return) onClose()
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
return (
|
|
68
|
-
<Box flexDirection="column" padding={1}>
|
|
69
|
-
<Text bold color={theme.kode}>
|
|
70
|
-
{`${PRODUCT_NAME} v${MACRO.VERSION}`}
|
|
71
|
-
</Text>
|
|
72
|
-
|
|
73
|
-
<Box marginTop={1} flexDirection="column">
|
|
74
|
-
<Text>
|
|
75
|
-
{PRODUCT_NAME} is a beta research preview. Always review{' '}
|
|
76
|
-
{PRODUCT_NAME}'s responses, especially when running code.{' '}
|
|
77
|
-
{PRODUCT_NAME} has read access to files in the current directory and
|
|
78
|
-
can run commands and edit files with your permission.
|
|
79
|
-
</Text>
|
|
80
|
-
</Box>
|
|
81
|
-
|
|
82
|
-
{count >= 1 && (
|
|
83
|
-
<Box flexDirection="column" marginTop={1}>
|
|
84
|
-
<Text bold>Usage Modes:</Text>
|
|
85
|
-
<Text>
|
|
86
|
-
• REPL: <Text bold>{PRODUCT_COMMAND}</Text> (interactive session)
|
|
87
|
-
</Text>
|
|
88
|
-
<Text>
|
|
89
|
-
• Non-interactive:{' '}
|
|
90
|
-
<Text bold>{PRODUCT_COMMAND} -p "question"</Text>
|
|
91
|
-
</Text>
|
|
92
|
-
<Box marginTop={1}>
|
|
93
|
-
<Text>
|
|
94
|
-
Run <Text bold>{PRODUCT_COMMAND} -h</Text> for all command line
|
|
95
|
-
options
|
|
96
|
-
</Text>
|
|
97
|
-
</Box>
|
|
98
|
-
</Box>
|
|
99
|
-
)}
|
|
100
|
-
|
|
101
|
-
{count >= 2 && (
|
|
102
|
-
<Box marginTop={1} flexDirection="column">
|
|
103
|
-
<Text bold>Common Tasks:</Text>
|
|
104
|
-
<Text>
|
|
105
|
-
• Ask questions about your codebase{' '}
|
|
106
|
-
<Text color={getTheme().secondaryText}>
|
|
107
|
-
> How does foo.py work?
|
|
108
|
-
</Text>
|
|
109
|
-
</Text>
|
|
110
|
-
<Text>
|
|
111
|
-
• Edit files{' '}
|
|
112
|
-
<Text color={getTheme().secondaryText}>
|
|
113
|
-
> Update bar.ts to...
|
|
114
|
-
</Text>
|
|
115
|
-
</Text>
|
|
116
|
-
<Text>
|
|
117
|
-
• Fix errors{' '}
|
|
118
|
-
<Text color={getTheme().secondaryText}>> cargo build</Text>
|
|
119
|
-
</Text>
|
|
120
|
-
<Text>
|
|
121
|
-
• Run commands{' '}
|
|
122
|
-
<Text color={getTheme().secondaryText}>> /help</Text>
|
|
123
|
-
</Text>
|
|
124
|
-
<Text>
|
|
125
|
-
• Run bash commands{' '}
|
|
126
|
-
<Text color={getTheme().secondaryText}>> !ls</Text>
|
|
127
|
-
</Text>
|
|
128
|
-
</Box>
|
|
129
|
-
)}
|
|
130
|
-
|
|
131
|
-
{count >= 3 && (
|
|
132
|
-
<Box marginTop={1} flexDirection="column">
|
|
133
|
-
<Text bold>Built-in Commands:</Text>
|
|
134
|
-
|
|
135
|
-
<Box flexDirection="column">
|
|
136
|
-
{builtInCommands.map((cmd, i) => (
|
|
137
|
-
<Box key={i} marginLeft={1}>
|
|
138
|
-
<Text bold>{`/${cmd.name}`}</Text>
|
|
139
|
-
<Text> - {cmd.description}</Text>
|
|
140
|
-
</Box>
|
|
141
|
-
))}
|
|
142
|
-
</Box>
|
|
143
|
-
|
|
144
|
-
{customCommands.length > 0 && (
|
|
145
|
-
<>
|
|
146
|
-
<Box marginTop={1}>
|
|
147
|
-
<Text bold>Custom Commands:</Text>
|
|
148
|
-
</Box>
|
|
149
|
-
|
|
150
|
-
<Box flexDirection="column">
|
|
151
|
-
{customCommands.map((cmd, i) => (
|
|
152
|
-
<Box key={i} marginLeft={1}>
|
|
153
|
-
<Text bold color={theme.kode}>{`/${cmd.name}`}</Text>
|
|
154
|
-
<Text> - {cmd.description}</Text>
|
|
155
|
-
{cmd.aliases && cmd.aliases.length > 0 && (
|
|
156
|
-
<Text color={theme.secondaryText}>
|
|
157
|
-
{' '}
|
|
158
|
-
(aliases: {cmd.aliases.join(', ')})
|
|
159
|
-
</Text>
|
|
160
|
-
)}
|
|
161
|
-
{/* Show scope indicator for debugging */}
|
|
162
|
-
{cmd.scope && (
|
|
163
|
-
<Text color={theme.secondaryText}> [{cmd.scope}]</Text>
|
|
164
|
-
)}
|
|
165
|
-
</Box>
|
|
166
|
-
))}
|
|
167
|
-
</Box>
|
|
168
|
-
</>
|
|
169
|
-
)}
|
|
170
|
-
|
|
171
|
-
{/* Show custom command directory information */}
|
|
172
|
-
{hasCustomCommands() || customCommands.length > 0 ? (
|
|
173
|
-
<Box marginTop={1}>
|
|
174
|
-
<Text color={theme.secondaryText}>
|
|
175
|
-
Custom commands loaded from:
|
|
176
|
-
</Text>
|
|
177
|
-
<Text color={theme.secondaryText}>
|
|
178
|
-
• {getCustomCommandDirectories().userClaude} (user: prefix)
|
|
179
|
-
</Text>
|
|
180
|
-
<Text color={theme.secondaryText}>
|
|
181
|
-
• {getCustomCommandDirectories().projectClaude} (project: prefix)
|
|
182
|
-
</Text>
|
|
183
|
-
<Text color={theme.secondaryText}>
|
|
184
|
-
Use /refresh-commands to reload after changes
|
|
185
|
-
</Text>
|
|
186
|
-
</Box>
|
|
187
|
-
) : (
|
|
188
|
-
<Box marginTop={1}>
|
|
189
|
-
<Text color={theme.secondaryText}>
|
|
190
|
-
Create custom commands by adding .md files to:
|
|
191
|
-
</Text>
|
|
192
|
-
<Text color={theme.secondaryText}>
|
|
193
|
-
• {getCustomCommandDirectories().userClaude} (user: prefix)
|
|
194
|
-
</Text>
|
|
195
|
-
<Text color={theme.secondaryText}>
|
|
196
|
-
• {getCustomCommandDirectories().projectClaude} (project: prefix)
|
|
197
|
-
</Text>
|
|
198
|
-
<Text color={theme.secondaryText}>
|
|
199
|
-
Use /refresh-commands to reload after creation
|
|
200
|
-
</Text>
|
|
201
|
-
</Box>
|
|
202
|
-
)}
|
|
203
|
-
</Box>
|
|
204
|
-
)}
|
|
205
|
-
|
|
206
|
-
<Box marginTop={1}>
|
|
207
|
-
<Text color={theme.secondaryText}>{moreHelp}</Text>
|
|
208
|
-
</Box>
|
|
209
|
-
|
|
210
|
-
<Box marginTop={2}>
|
|
211
|
-
<PressEnterToContinue />
|
|
212
|
-
</Box>
|
|
213
|
-
</Box>
|
|
214
|
-
)
|
|
215
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { highlight, supportsLanguage } from 'cli-highlight'
|
|
2
|
-
import { Text } from 'ink'
|
|
3
|
-
import React, { useMemo } from 'react'
|
|
4
|
-
import { logError } from '../utils/log'
|
|
5
|
-
|
|
6
|
-
type Props = {
|
|
7
|
-
code: string
|
|
8
|
-
language: string
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function HighlightedCode({ code, language }: Props): React.ReactElement {
|
|
12
|
-
const highlightedCode = useMemo(() => {
|
|
13
|
-
try {
|
|
14
|
-
if (supportsLanguage(language)) {
|
|
15
|
-
return highlight(code, { language })
|
|
16
|
-
} else {
|
|
17
|
-
logError(
|
|
18
|
-
`Language not supported while highlighting code, falling back to markdown: ${language}`,
|
|
19
|
-
)
|
|
20
|
-
return highlight(code, { language: 'markdown' })
|
|
21
|
-
}
|
|
22
|
-
} catch (e) {
|
|
23
|
-
if (e instanceof Error && e.message.includes('Unknown language')) {
|
|
24
|
-
logError(
|
|
25
|
-
`Language not supported while highlighting code, falling back to markdown: ${e}`,
|
|
26
|
-
)
|
|
27
|
-
return highlight(code, { language: 'markdown' })
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}, [code, language])
|
|
31
|
-
|
|
32
|
-
return <Text>{highlightedCode}</Text>
|
|
33
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Box, Newline, Text, useInput } from 'ink'
|
|
3
|
-
import { getTheme } from '../utils/theme'
|
|
4
|
-
import { Select } from './CustomSelect/select'
|
|
5
|
-
import { render } from 'ink'
|
|
6
|
-
import { writeFileSync } from 'fs'
|
|
7
|
-
import { ConfigParseError } from '../utils/errors'
|
|
8
|
-
import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
|
|
9
|
-
interface InvalidConfigHandlerProps {
|
|
10
|
-
error: ConfigParseError
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
interface InvalidConfigDialogProps {
|
|
14
|
-
filePath: string
|
|
15
|
-
errorDescription: string
|
|
16
|
-
onExit: () => void
|
|
17
|
-
onReset: () => void
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Dialog shown when the Claude config file contains invalid JSON
|
|
22
|
-
*/
|
|
23
|
-
function InvalidConfigDialog({
|
|
24
|
-
filePath,
|
|
25
|
-
errorDescription,
|
|
26
|
-
onExit,
|
|
27
|
-
onReset,
|
|
28
|
-
}: InvalidConfigDialogProps): React.ReactNode {
|
|
29
|
-
const theme = getTheme()
|
|
30
|
-
|
|
31
|
-
// Handle escape key
|
|
32
|
-
useInput((_, key) => {
|
|
33
|
-
if (key.escape) {
|
|
34
|
-
onExit()
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
const exitState = useExitOnCtrlCD(() => process.exit(0))
|
|
39
|
-
|
|
40
|
-
// Handler for Select onChange
|
|
41
|
-
const handleSelect = (value: string) => {
|
|
42
|
-
if (value === 'exit') {
|
|
43
|
-
onExit()
|
|
44
|
-
} else {
|
|
45
|
-
onReset()
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return (
|
|
50
|
-
<>
|
|
51
|
-
<Box
|
|
52
|
-
flexDirection="column"
|
|
53
|
-
borderColor={theme.error}
|
|
54
|
-
borderStyle="round"
|
|
55
|
-
padding={1}
|
|
56
|
-
width={70}
|
|
57
|
-
gap={1}
|
|
58
|
-
>
|
|
59
|
-
<Text bold>Configuration Error</Text>
|
|
60
|
-
|
|
61
|
-
<Box flexDirection="column" gap={1}>
|
|
62
|
-
<Text>
|
|
63
|
-
The configuration file at <Text bold>{filePath}</Text> contains
|
|
64
|
-
invalid JSON.
|
|
65
|
-
</Text>
|
|
66
|
-
<Text>{errorDescription}</Text>
|
|
67
|
-
</Box>
|
|
68
|
-
|
|
69
|
-
<Box flexDirection="column">
|
|
70
|
-
<Text bold>Choose an option:</Text>
|
|
71
|
-
<Select
|
|
72
|
-
options={[
|
|
73
|
-
{ label: 'Exit and fix manually', value: 'exit' },
|
|
74
|
-
{ label: 'Reset with default configuration', value: 'reset' },
|
|
75
|
-
]}
|
|
76
|
-
onChange={handleSelect}
|
|
77
|
-
/>
|
|
78
|
-
</Box>
|
|
79
|
-
</Box>
|
|
80
|
-
{exitState.pending ? (
|
|
81
|
-
<Text dimColor>Press {exitState.keyName} again to exit</Text>
|
|
82
|
-
) : (
|
|
83
|
-
<Newline />
|
|
84
|
-
)}
|
|
85
|
-
</>
|
|
86
|
-
)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function showInvalidConfigDialog({
|
|
90
|
-
error,
|
|
91
|
-
}: InvalidConfigHandlerProps): Promise<void> {
|
|
92
|
-
return new Promise(resolve => {
|
|
93
|
-
render(
|
|
94
|
-
<InvalidConfigDialog
|
|
95
|
-
filePath={error.filePath}
|
|
96
|
-
errorDescription={error.message}
|
|
97
|
-
onExit={() => {
|
|
98
|
-
resolve()
|
|
99
|
-
process.exit(1)
|
|
100
|
-
}}
|
|
101
|
-
onReset={() => {
|
|
102
|
-
writeFileSync(
|
|
103
|
-
error.filePath,
|
|
104
|
-
JSON.stringify(error.defaultConfig, null, 2),
|
|
105
|
-
)
|
|
106
|
-
resolve()
|
|
107
|
-
process.exit(0)
|
|
108
|
-
}}
|
|
109
|
-
/>,
|
|
110
|
-
{ exitOnCtrlC: false },
|
|
111
|
-
)
|
|
112
|
-
})
|
|
113
|
-
}
|
package/src/components/Link.tsx
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import InkLink from 'ink-link'
|
|
2
|
-
import { Text } from 'ink'
|
|
3
|
-
import React from 'react'
|
|
4
|
-
import { env } from '../utils/env'
|
|
5
|
-
|
|
6
|
-
type LinkProps = {
|
|
7
|
-
url: string
|
|
8
|
-
children?: React.ReactNode
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// Terminals that support hyperlinks
|
|
12
|
-
const LINK_SUPPORTING_TERMINALS = ['iTerm.app', 'WezTerm', 'Hyper', 'VSCode']
|
|
13
|
-
|
|
14
|
-
export default function Link({ url, children }: LinkProps): React.ReactNode {
|
|
15
|
-
const supportsLinks = LINK_SUPPORTING_TERMINALS.includes(env.terminal ?? '')
|
|
16
|
-
|
|
17
|
-
// Determine what text to display - use children or fall back to the URL itself
|
|
18
|
-
const displayContent = children || url
|
|
19
|
-
|
|
20
|
-
// Use InkLink to get clickable links when we can, or to get a nice fallback when we can't
|
|
21
|
-
if (supportsLinks || displayContent !== url) {
|
|
22
|
-
return (
|
|
23
|
-
<InkLink url={url}>
|
|
24
|
-
<Text>{displayContent}</Text>
|
|
25
|
-
</InkLink>
|
|
26
|
-
)
|
|
27
|
-
} else {
|
|
28
|
-
// But if we don't have a title and just have a url *and* are not a terminal that supports links
|
|
29
|
-
// that doesn't support clickable links anyway, just show the URL
|
|
30
|
-
return <Text underline>{displayContent}</Text>
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Box, Text } from 'ink'
|
|
3
|
-
import { Select } from './CustomSelect/select'
|
|
4
|
-
import type { LogOption } from '../types/logs'
|
|
5
|
-
import { getTheme } from '../utils/theme'
|
|
6
|
-
import { useTerminalSize } from '../hooks/useTerminalSize'
|
|
7
|
-
import { formatDate } from '../utils/log'
|
|
8
|
-
|
|
9
|
-
type LogSelectorProps = {
|
|
10
|
-
logs: LogOption[]
|
|
11
|
-
onSelect: (logValue: number) => void
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function LogSelector({
|
|
15
|
-
logs,
|
|
16
|
-
onSelect,
|
|
17
|
-
}: LogSelectorProps): React.ReactNode {
|
|
18
|
-
const { rows, columns } = useTerminalSize()
|
|
19
|
-
if (logs.length === 0) {
|
|
20
|
-
return null
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const visibleCount = rows - 3 // Account for header and footer
|
|
24
|
-
const hiddenCount = Math.max(0, logs.length - visibleCount)
|
|
25
|
-
|
|
26
|
-
// Create formatted options
|
|
27
|
-
// Calculate column widths
|
|
28
|
-
const indexWidth = 7 // [0] to [99] with extra spaces
|
|
29
|
-
const modifiedWidth = 21 // "Yesterday at 7:49 pm" with space
|
|
30
|
-
const createdWidth = 21 // "Yesterday at 7:49 pm" with space
|
|
31
|
-
const countWidth = 9 // "999 msgs" (right-aligned)
|
|
32
|
-
|
|
33
|
-
const options = logs.map((log, i) => {
|
|
34
|
-
const index = `[${i}]`.padEnd(indexWidth)
|
|
35
|
-
const modified = formatDate(log.modified).padEnd(modifiedWidth)
|
|
36
|
-
const created = formatDate(log.created).padEnd(createdWidth)
|
|
37
|
-
const msgCount = `${log.messageCount}`.padStart(countWidth)
|
|
38
|
-
const prompt = log.firstPrompt
|
|
39
|
-
let branchInfo = ''
|
|
40
|
-
if (log.forkNumber) branchInfo += ` (fork #${log.forkNumber})`
|
|
41
|
-
if (log.sidechainNumber)
|
|
42
|
-
branchInfo += ` (sidechain #${log.sidechainNumber})`
|
|
43
|
-
|
|
44
|
-
const labelTxt = `${index}${modified}${created}${msgCount} ${prompt}${branchInfo}`
|
|
45
|
-
const truncated =
|
|
46
|
-
labelTxt.length > columns - 2 // Account for "> " selection cursor
|
|
47
|
-
? `${labelTxt.slice(0, columns - 5)}...`
|
|
48
|
-
: labelTxt
|
|
49
|
-
return {
|
|
50
|
-
label: truncated,
|
|
51
|
-
value: log.value.toString(),
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
return (
|
|
56
|
-
<Box flexDirection="column" height="100%" width="100%">
|
|
57
|
-
<Box paddingLeft={9}>
|
|
58
|
-
<Text bold color={getTheme().text}>
|
|
59
|
-
Modified
|
|
60
|
-
</Text>
|
|
61
|
-
<Text>{' '}</Text>
|
|
62
|
-
<Text bold color={getTheme().text}>
|
|
63
|
-
Created
|
|
64
|
-
</Text>
|
|
65
|
-
<Text>{' '}</Text>
|
|
66
|
-
<Text bold color={getTheme().text}>
|
|
67
|
-
# Messages
|
|
68
|
-
</Text>
|
|
69
|
-
<Text> </Text>
|
|
70
|
-
<Text bold color={getTheme().text}>
|
|
71
|
-
First message
|
|
72
|
-
</Text>
|
|
73
|
-
</Box>
|
|
74
|
-
<Select
|
|
75
|
-
options={options}
|
|
76
|
-
onChange={index => onSelect(parseInt(index, 10))}
|
|
77
|
-
visibleOptionCount={visibleCount}
|
|
78
|
-
/>
|
|
79
|
-
{hiddenCount > 0 && (
|
|
80
|
-
<Box paddingLeft={2}>
|
|
81
|
-
<Text color={getTheme().secondaryText}>and {hiddenCount} more…</Text>
|
|
82
|
-
</Box>
|
|
83
|
-
)}
|
|
84
|
-
</Box>
|
|
85
|
-
)
|
|
86
|
-
}
|
package/src/components/Logo.tsx
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { Box, Text, Newline } from 'ink'
|
|
2
|
-
import * as React from 'react'
|
|
3
|
-
import { getTheme } from '../utils/theme'
|
|
4
|
-
import { PRODUCT_NAME } from '../constants/product'
|
|
5
|
-
import { getAnthropicApiKey, getGlobalConfig } from '../utils/config'
|
|
6
|
-
import { getCwd } from '../utils/state'
|
|
7
|
-
import { AsciiLogo } from './AsciiLogo'
|
|
8
|
-
import type { WrappedClient } from '../services/mcpClient'
|
|
9
|
-
import { getModelManager } from '../utils/model'
|
|
10
|
-
|
|
11
|
-
export const MIN_LOGO_WIDTH = 50
|
|
12
|
-
|
|
13
|
-
export function Logo({
|
|
14
|
-
mcpClients,
|
|
15
|
-
isDefaultModel = false,
|
|
16
|
-
updateBannerVersion,
|
|
17
|
-
updateBannerCommands,
|
|
18
|
-
}: {
|
|
19
|
-
mcpClients: WrappedClient[]
|
|
20
|
-
isDefaultModel?: boolean
|
|
21
|
-
updateBannerVersion?: string | null
|
|
22
|
-
updateBannerCommands?: string[] | null
|
|
23
|
-
}): React.ReactNode {
|
|
24
|
-
const width = Math.max(MIN_LOGO_WIDTH, getCwd().length + 12)
|
|
25
|
-
const theme = getTheme()
|
|
26
|
-
const config = getGlobalConfig()
|
|
27
|
-
|
|
28
|
-
const modelManager = getModelManager()
|
|
29
|
-
const mainModelName = modelManager.getModelName('main')
|
|
30
|
-
const currentModel = mainModelName || 'No model configured'
|
|
31
|
-
const apiKey = getAnthropicApiKey()
|
|
32
|
-
const hasOverrides = Boolean(
|
|
33
|
-
process.env.ANTHROPIC_API_KEY ||
|
|
34
|
-
process.env.DISABLE_PROMPT_CACHING ||
|
|
35
|
-
process.env.API_TIMEOUT_MS ||
|
|
36
|
-
process.env.MAX_THINKING_TOKENS,
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<Box flexDirection="column">
|
|
41
|
-
<Box
|
|
42
|
-
borderColor={theme.kode}
|
|
43
|
-
borderStyle="round"
|
|
44
|
-
flexDirection="column"
|
|
45
|
-
gap={1}
|
|
46
|
-
paddingLeft={1}
|
|
47
|
-
marginRight={2}
|
|
48
|
-
width={width}
|
|
49
|
-
>
|
|
50
|
-
{updateBannerVersion ? (
|
|
51
|
-
<Box flexDirection="column">
|
|
52
|
-
<Text color="yellow">New version available: {updateBannerVersion}</Text>
|
|
53
|
-
<Text>Run the following command to update:</Text>
|
|
54
|
-
<Text>
|
|
55
|
-
{' '}
|
|
56
|
-
{updateBannerCommands?.[0] ?? 'bun add -g @shareai-lab/kode@latest'}
|
|
57
|
-
</Text>
|
|
58
|
-
<Text>Or:</Text>
|
|
59
|
-
<Text>
|
|
60
|
-
{' '}
|
|
61
|
-
{updateBannerCommands?.[1] ?? 'npm install -g @shareai-lab/kode@latest'}
|
|
62
|
-
</Text>
|
|
63
|
-
{process.platform !== 'win32' && (
|
|
64
|
-
<Text dimColor>
|
|
65
|
-
Note: you may need to prefix with "sudo" on macOS/Linux.
|
|
66
|
-
</Text>
|
|
67
|
-
)}
|
|
68
|
-
</Box>
|
|
69
|
-
) : null}
|
|
70
|
-
<Text>
|
|
71
|
-
<Text color={theme.kode}>✻</Text> Welcome to{' '}
|
|
72
|
-
<Text bold>{PRODUCT_NAME}</Text> <Text>research preview!</Text>
|
|
73
|
-
</Text>
|
|
74
|
-
{/* <AsciiLogo /> */}
|
|
75
|
-
|
|
76
|
-
<>
|
|
77
|
-
<Box paddingLeft={2} flexDirection="column" gap={1}>
|
|
78
|
-
<Text color={theme.secondaryText} italic>
|
|
79
|
-
/help for help
|
|
80
|
-
</Text>
|
|
81
|
-
<Text color={theme.secondaryText}>cwd: {getCwd()}</Text>
|
|
82
|
-
</Box>
|
|
83
|
-
|
|
84
|
-
{hasOverrides && (
|
|
85
|
-
<Box
|
|
86
|
-
borderColor={theme.secondaryBorder}
|
|
87
|
-
borderStyle="single"
|
|
88
|
-
borderBottom={false}
|
|
89
|
-
borderLeft={false}
|
|
90
|
-
borderRight={false}
|
|
91
|
-
borderTop={true}
|
|
92
|
-
flexDirection="column"
|
|
93
|
-
marginLeft={2}
|
|
94
|
-
marginRight={1}
|
|
95
|
-
paddingTop={1}
|
|
96
|
-
>
|
|
97
|
-
<Box marginBottom={1}>
|
|
98
|
-
<Text color={theme.secondaryText}>Overrides (via env):</Text>
|
|
99
|
-
</Box>
|
|
100
|
-
{process.env.ANTHROPIC_API_KEY && apiKey ? (
|
|
101
|
-
<Text color={theme.secondaryText}>
|
|
102
|
-
• API Key:{' '}
|
|
103
|
-
<Text bold>sk-ant-…{apiKey!.slice(-width + 25)}</Text>
|
|
104
|
-
</Text>
|
|
105
|
-
) : null}
|
|
106
|
-
{process.env.DISABLE_PROMPT_CACHING ? (
|
|
107
|
-
<Text color={theme.secondaryText}>
|
|
108
|
-
• Prompt caching:{' '}
|
|
109
|
-
<Text color={theme.error} bold>
|
|
110
|
-
off
|
|
111
|
-
</Text>
|
|
112
|
-
</Text>
|
|
113
|
-
) : null}
|
|
114
|
-
{process.env.API_TIMEOUT_MS ? (
|
|
115
|
-
<Text color={theme.secondaryText}>
|
|
116
|
-
• API timeout:{' '}
|
|
117
|
-
<Text bold>{process.env.API_TIMEOUT_MS}ms</Text>
|
|
118
|
-
</Text>
|
|
119
|
-
) : null}
|
|
120
|
-
{process.env.MAX_THINKING_TOKENS ? (
|
|
121
|
-
<Text color={theme.secondaryText}>
|
|
122
|
-
• Max thinking tokens:{' '}
|
|
123
|
-
<Text bold>{process.env.MAX_THINKING_TOKENS}</Text>
|
|
124
|
-
</Text>
|
|
125
|
-
) : null}
|
|
126
|
-
{process.env.ANTHROPIC_BASE_URL ? (
|
|
127
|
-
<Text color={theme.secondaryText}>
|
|
128
|
-
• API Base URL:{' '}
|
|
129
|
-
<Text bold>{process.env.ANTHROPIC_BASE_URL}</Text>
|
|
130
|
-
</Text>
|
|
131
|
-
) : null}
|
|
132
|
-
</Box>
|
|
133
|
-
)}
|
|
134
|
-
</>
|
|
135
|
-
{mcpClients.length ? (
|
|
136
|
-
<Box
|
|
137
|
-
borderColor={theme.secondaryBorder}
|
|
138
|
-
borderStyle="single"
|
|
139
|
-
borderBottom={false}
|
|
140
|
-
borderLeft={false}
|
|
141
|
-
borderRight={false}
|
|
142
|
-
borderTop={true}
|
|
143
|
-
flexDirection="column"
|
|
144
|
-
marginLeft={2}
|
|
145
|
-
marginRight={1}
|
|
146
|
-
paddingTop={1}
|
|
147
|
-
>
|
|
148
|
-
<Box marginBottom={1}>
|
|
149
|
-
<Text color={theme.secondaryText}>MCP Servers:</Text>
|
|
150
|
-
</Box>
|
|
151
|
-
{mcpClients.map((client, idx) => (
|
|
152
|
-
<Box key={idx} width={width - 6}>
|
|
153
|
-
<Text color={theme.secondaryText}>• {client.name}</Text>
|
|
154
|
-
<Box flexGrow={1} />
|
|
155
|
-
<Text
|
|
156
|
-
bold
|
|
157
|
-
color={
|
|
158
|
-
client.type === 'connected' ? theme.success : theme.error
|
|
159
|
-
}
|
|
160
|
-
>
|
|
161
|
-
{client.type === 'connected' ? 'connected' : 'failed'}
|
|
162
|
-
</Text>
|
|
163
|
-
</Box>
|
|
164
|
-
))}
|
|
165
|
-
</Box>
|
|
166
|
-
) : null}
|
|
167
|
-
</Box>
|
|
168
|
-
</Box>
|
|
169
|
-
)
|
|
170
|
-
}
|