@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
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { TextBlock, ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'
|
|
2
|
-
import { AssistantMessage, BinaryFeedbackResult } from '../../query'
|
|
3
|
-
import { MAIN_QUERY_TEMPERATURE } from '../../services/claude'
|
|
4
|
-
import { getDynamicConfig, logEvent } from '../../services/statsig'
|
|
5
|
-
|
|
6
|
-
import { isEqual, zip } from 'lodash-es'
|
|
7
|
-
import { getGitState } from '../../utils/git'
|
|
8
|
-
|
|
9
|
-
export type BinaryFeedbackChoice =
|
|
10
|
-
| 'prefer-left'
|
|
11
|
-
| 'prefer-right'
|
|
12
|
-
| 'neither'
|
|
13
|
-
| 'no-preference'
|
|
14
|
-
|
|
15
|
-
export type BinaryFeedbackChoose = (choice: BinaryFeedbackChoice) => void
|
|
16
|
-
|
|
17
|
-
type BinaryFeedbackConfig = {
|
|
18
|
-
sampleFrequency: number
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async function getBinaryFeedbackStatsigConfig(): Promise<BinaryFeedbackConfig> {
|
|
22
|
-
return await getDynamicConfig('tengu-binary-feedback-config', {
|
|
23
|
-
sampleFrequency: 0,
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function getMessageBlockSequence(m: AssistantMessage) {
|
|
28
|
-
return m.message.content.map(cb => {
|
|
29
|
-
if (cb.type === 'text') return 'text'
|
|
30
|
-
if (cb.type === 'tool_use') return cb.name
|
|
31
|
-
return cb.type // Handle other block types like 'thinking' or 'redacted_thinking'
|
|
32
|
-
})
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export async function logBinaryFeedbackEvent(
|
|
36
|
-
m1: AssistantMessage,
|
|
37
|
-
m2: AssistantMessage,
|
|
38
|
-
choice: BinaryFeedbackChoice,
|
|
39
|
-
): Promise<void> {
|
|
40
|
-
const modelA = m1.message.model
|
|
41
|
-
const modelB = m2.message.model
|
|
42
|
-
const gitState = await getGitState()
|
|
43
|
-
logEvent('tengu_binary_feedback', {
|
|
44
|
-
msg_id_A: m1.message.id,
|
|
45
|
-
msg_id_B: m2.message.id,
|
|
46
|
-
choice: {
|
|
47
|
-
'prefer-left': m1.message.id,
|
|
48
|
-
'prefer-right': m2.message.id,
|
|
49
|
-
neither: undefined,
|
|
50
|
-
'no-preference': undefined,
|
|
51
|
-
}[choice],
|
|
52
|
-
choiceStr: choice,
|
|
53
|
-
gitHead: gitState?.commitHash,
|
|
54
|
-
gitBranch: gitState?.branchName,
|
|
55
|
-
gitRepoRemoteUrl: gitState?.remoteUrl || undefined,
|
|
56
|
-
gitRepoIsHeadOnRemote: gitState?.isHeadOnRemote?.toString(),
|
|
57
|
-
gitRepoIsClean: gitState?.isClean?.toString(),
|
|
58
|
-
modelA,
|
|
59
|
-
modelB,
|
|
60
|
-
temperatureA: String(MAIN_QUERY_TEMPERATURE),
|
|
61
|
-
temperatureB: String(MAIN_QUERY_TEMPERATURE),
|
|
62
|
-
seqA: String(getMessageBlockSequence(m1)),
|
|
63
|
-
seqB: String(getMessageBlockSequence(m2)),
|
|
64
|
-
})
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export async function logBinaryFeedbackSamplingDecision(
|
|
68
|
-
decision: boolean,
|
|
69
|
-
reason?: string,
|
|
70
|
-
): Promise<void> {
|
|
71
|
-
logEvent('tengu_binary_feedback_sampling_decision', {
|
|
72
|
-
decision: decision.toString(),
|
|
73
|
-
reason,
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export async function logBinaryFeedbackDisplayDecision(
|
|
78
|
-
decision: boolean,
|
|
79
|
-
m1: AssistantMessage,
|
|
80
|
-
m2: AssistantMessage,
|
|
81
|
-
reason?: string,
|
|
82
|
-
): Promise<void> {
|
|
83
|
-
logEvent('tengu_binary_feedback_display_decision', {
|
|
84
|
-
decision: decision.toString(),
|
|
85
|
-
reason,
|
|
86
|
-
msg_id_A: m1.message.id,
|
|
87
|
-
msg_id_B: m2.message.id,
|
|
88
|
-
seqA: String(getMessageBlockSequence(m1)),
|
|
89
|
-
seqB: String(getMessageBlockSequence(m2)),
|
|
90
|
-
})
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function textContentBlocksEqual(cb1: TextBlock, cb2: TextBlock): boolean {
|
|
94
|
-
return cb1.text === cb2.text
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function contentBlocksEqual(
|
|
98
|
-
cb1: TextBlock | ToolUseBlock,
|
|
99
|
-
cb2: TextBlock | ToolUseBlock,
|
|
100
|
-
): boolean {
|
|
101
|
-
if (cb1.type !== cb2.type) {
|
|
102
|
-
return false
|
|
103
|
-
}
|
|
104
|
-
if (cb1.type === 'text') {
|
|
105
|
-
return textContentBlocksEqual(cb1, cb2 as TextBlock)
|
|
106
|
-
}
|
|
107
|
-
cb2 = cb2 as ToolUseBlock
|
|
108
|
-
return cb1.name === cb2.name && isEqual(cb1.input, cb2.input)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function allContentBlocksEqual(
|
|
112
|
-
content1: (TextBlock | ToolUseBlock)[],
|
|
113
|
-
content2: (TextBlock | ToolUseBlock)[],
|
|
114
|
-
): boolean {
|
|
115
|
-
if (content1.length !== content2.length) {
|
|
116
|
-
return false
|
|
117
|
-
}
|
|
118
|
-
return zip(content1, content2).every(([cb1, cb2]) =>
|
|
119
|
-
contentBlocksEqual(cb1!, cb2!),
|
|
120
|
-
)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export async function shouldUseBinaryFeedback(): Promise<boolean> {
|
|
124
|
-
if (process.env.DISABLE_BINARY_FEEDBACK) {
|
|
125
|
-
logBinaryFeedbackSamplingDecision(false, 'disabled_by_env_var')
|
|
126
|
-
return false
|
|
127
|
-
}
|
|
128
|
-
if (process.env.FORCE_BINARY_FEEDBACK) {
|
|
129
|
-
logBinaryFeedbackSamplingDecision(true, 'forced_by_env_var')
|
|
130
|
-
return true
|
|
131
|
-
}
|
|
132
|
-
if (process.env.USER_TYPE !== 'ant') {
|
|
133
|
-
logBinaryFeedbackSamplingDecision(false, 'not_ant')
|
|
134
|
-
return false
|
|
135
|
-
}
|
|
136
|
-
if (process.env.NODE_ENV === 'test') {
|
|
137
|
-
// Binary feedback breaks a couple tests related to checking for permission,
|
|
138
|
-
// so we have to disable it in tests at the risk of hiding bugs
|
|
139
|
-
logBinaryFeedbackSamplingDecision(false, 'test')
|
|
140
|
-
return false
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const config = await getBinaryFeedbackStatsigConfig()
|
|
144
|
-
if (config.sampleFrequency === 0) {
|
|
145
|
-
logBinaryFeedbackSamplingDecision(false, 'top_level_frequency_zero')
|
|
146
|
-
return false
|
|
147
|
-
}
|
|
148
|
-
if (Math.random() > config.sampleFrequency) {
|
|
149
|
-
logBinaryFeedbackSamplingDecision(false, 'top_level_frequency_rng')
|
|
150
|
-
return false
|
|
151
|
-
}
|
|
152
|
-
logBinaryFeedbackSamplingDecision(true)
|
|
153
|
-
return true
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export function messagePairValidForBinaryFeedback(
|
|
157
|
-
m1: AssistantMessage,
|
|
158
|
-
m2: AssistantMessage,
|
|
159
|
-
): boolean {
|
|
160
|
-
const logPass = () => logBinaryFeedbackDisplayDecision(true, m1, m2)
|
|
161
|
-
const logFail = (reason: string) =>
|
|
162
|
-
logBinaryFeedbackDisplayDecision(false, m1, m2, reason)
|
|
163
|
-
|
|
164
|
-
// Ignore thinking blocks, on the assumption that users don't find them very relevant
|
|
165
|
-
// compared to other content types
|
|
166
|
-
const nonThinkingBlocks1 = m1.message.content.filter(
|
|
167
|
-
b => b.type !== 'thinking' && b.type !== 'redacted_thinking',
|
|
168
|
-
)
|
|
169
|
-
const nonThinkingBlocks2 = m2.message.content.filter(
|
|
170
|
-
b => b.type !== 'thinking' && b.type !== 'redacted_thinking',
|
|
171
|
-
)
|
|
172
|
-
const hasToolUse =
|
|
173
|
-
nonThinkingBlocks1.some(b => b.type === 'tool_use') ||
|
|
174
|
-
nonThinkingBlocks2.some(b => b.type === 'tool_use')
|
|
175
|
-
|
|
176
|
-
// If they're all text blocks, compare those
|
|
177
|
-
if (!hasToolUse) {
|
|
178
|
-
if (allContentBlocksEqual(nonThinkingBlocks1, nonThinkingBlocks2)) {
|
|
179
|
-
logFail('contents_identical')
|
|
180
|
-
return false
|
|
181
|
-
}
|
|
182
|
-
logPass()
|
|
183
|
-
return true
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// If there are tools, they're the most material difference between the messages.
|
|
187
|
-
// Only show binary feedback if there's a tool use difference, ignoring text.
|
|
188
|
-
if (
|
|
189
|
-
allContentBlocksEqual(
|
|
190
|
-
nonThinkingBlocks1.filter(b => b.type === 'tool_use'),
|
|
191
|
-
nonThinkingBlocks2.filter(b => b.type === 'tool_use'),
|
|
192
|
-
)
|
|
193
|
-
) {
|
|
194
|
-
logFail('contents_identical')
|
|
195
|
-
return false
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
logPass()
|
|
199
|
-
return true
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export function getBinaryFeedbackResultForChoice(
|
|
203
|
-
m1: AssistantMessage,
|
|
204
|
-
m2: AssistantMessage,
|
|
205
|
-
choice: BinaryFeedbackChoice,
|
|
206
|
-
): BinaryFeedbackResult {
|
|
207
|
-
switch (choice) {
|
|
208
|
-
case 'prefer-left':
|
|
209
|
-
return { message: m1, shouldSkipPermissionCheck: true }
|
|
210
|
-
case 'prefer-right':
|
|
211
|
-
return { message: m2, shouldSkipPermissionCheck: true }
|
|
212
|
-
case 'no-preference':
|
|
213
|
-
return {
|
|
214
|
-
message: Math.random() < 0.5 ? m1 : m2,
|
|
215
|
-
shouldSkipPermissionCheck: false,
|
|
216
|
-
}
|
|
217
|
-
case 'neither':
|
|
218
|
-
return { message: null, shouldSkipPermissionCheck: false }
|
|
219
|
-
}
|
|
220
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
import BashToolResultMessage from '../../tools/BashTool/BashToolResultMessage'
|
|
3
|
-
import { extractTag } from '../../utils/messages'
|
|
4
|
-
|
|
5
|
-
export function AssistantBashOutputMessage({
|
|
6
|
-
content,
|
|
7
|
-
verbose,
|
|
8
|
-
}: {
|
|
9
|
-
content: string
|
|
10
|
-
verbose?: boolean
|
|
11
|
-
}): React.ReactNode {
|
|
12
|
-
const stdout = extractTag(content, 'bash-stdout') ?? ''
|
|
13
|
-
const stderr = extractTag(content, 'bash-stderr') ?? ''
|
|
14
|
-
const stdoutLines = stdout.split('\n').length
|
|
15
|
-
const stderrLines = stderr.split('\n').length
|
|
16
|
-
return (
|
|
17
|
-
<BashToolResultMessage
|
|
18
|
-
content={{ stdout, stdoutLines, stderr, stderrLines }}
|
|
19
|
-
verbose={!!verbose}
|
|
20
|
-
/>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
import { extractTag } from '../../utils/messages'
|
|
3
|
-
import { getTheme } from '../../utils/theme'
|
|
4
|
-
import { Box, Text } from 'ink'
|
|
5
|
-
|
|
6
|
-
export function AssistantLocalCommandOutputMessage({
|
|
7
|
-
content,
|
|
8
|
-
}: {
|
|
9
|
-
content: string
|
|
10
|
-
}): React.ReactNode[] {
|
|
11
|
-
const stdout = extractTag(content, 'local-command-stdout')
|
|
12
|
-
const stderr = extractTag(content, 'local-command-stderr')
|
|
13
|
-
if (!stdout && !stderr) {
|
|
14
|
-
return []
|
|
15
|
-
}
|
|
16
|
-
const theme = getTheme()
|
|
17
|
-
let insides = [
|
|
18
|
-
format(stdout?.trim(), theme.text),
|
|
19
|
-
format(stderr?.trim(), theme.error),
|
|
20
|
-
].filter(Boolean)
|
|
21
|
-
|
|
22
|
-
if (insides.length === 0) {
|
|
23
|
-
insides = [
|
|
24
|
-
<React.Fragment key="0">
|
|
25
|
-
<Text>(No output)</Text>
|
|
26
|
-
</React.Fragment>
|
|
27
|
-
]
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return [
|
|
31
|
-
<Box key="0" gap={1}>
|
|
32
|
-
<Box>
|
|
33
|
-
<Text color={theme.secondaryText}>{' '}⎿ </Text>
|
|
34
|
-
</Box>
|
|
35
|
-
{insides.map((_, index) => (
|
|
36
|
-
<Box key={index} flexDirection="column">
|
|
37
|
-
{_}
|
|
38
|
-
</Box>
|
|
39
|
-
))}
|
|
40
|
-
</Box>,
|
|
41
|
-
]
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function format(content: string | undefined, color: string): React.ReactNode {
|
|
45
|
-
if (!content) {
|
|
46
|
-
return null
|
|
47
|
-
}
|
|
48
|
-
return <Text color={color}>{content}</Text>
|
|
49
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Box, Text } from 'ink'
|
|
3
|
-
import { getTheme } from '../../utils/theme'
|
|
4
|
-
|
|
5
|
-
type Props = {
|
|
6
|
-
addMargin: boolean
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function AssistantRedactedThinkingMessage({
|
|
10
|
-
addMargin = false,
|
|
11
|
-
}: Props): React.ReactNode {
|
|
12
|
-
return (
|
|
13
|
-
<Box marginTop={addMargin ? 1 : 0}>
|
|
14
|
-
<Text color={getTheme().secondaryText} italic>
|
|
15
|
-
✻ Thinking…
|
|
16
|
-
</Text>
|
|
17
|
-
</Box>
|
|
18
|
-
)
|
|
19
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { TextBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import { AssistantBashOutputMessage } from './AssistantBashOutputMessage'
|
|
4
|
-
import { AssistantLocalCommandOutputMessage } from './AssistantLocalCommandOutputMessage'
|
|
5
|
-
import { getTheme } from '../../utils/theme'
|
|
6
|
-
import { Box, Text } from 'ink'
|
|
7
|
-
import { Cost } from '../Cost'
|
|
8
|
-
import {
|
|
9
|
-
API_ERROR_MESSAGE_PREFIX,
|
|
10
|
-
CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE,
|
|
11
|
-
INVALID_API_KEY_ERROR_MESSAGE,
|
|
12
|
-
PROMPT_TOO_LONG_ERROR_MESSAGE,
|
|
13
|
-
} from '../../services/claude.js'
|
|
14
|
-
import {
|
|
15
|
-
CANCEL_MESSAGE,
|
|
16
|
-
INTERRUPT_MESSAGE,
|
|
17
|
-
INTERRUPT_MESSAGE_FOR_TOOL_USE,
|
|
18
|
-
isEmptyMessageText,
|
|
19
|
-
NO_RESPONSE_REQUESTED,
|
|
20
|
-
} from '../../utils/messages.js'
|
|
21
|
-
import { BLACK_CIRCLE } from '../../constants/figures'
|
|
22
|
-
import { applyMarkdown } from '../../utils/markdown'
|
|
23
|
-
import { useTerminalSize } from '../../hooks/useTerminalSize'
|
|
24
|
-
|
|
25
|
-
type Props = {
|
|
26
|
-
param: TextBlockParam
|
|
27
|
-
costUSD: number
|
|
28
|
-
durationMs: number
|
|
29
|
-
debug: boolean
|
|
30
|
-
addMargin: boolean
|
|
31
|
-
shouldShowDot: boolean
|
|
32
|
-
verbose?: boolean
|
|
33
|
-
width?: number | string
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function AssistantTextMessage({
|
|
37
|
-
param: { text },
|
|
38
|
-
costUSD,
|
|
39
|
-
durationMs,
|
|
40
|
-
debug,
|
|
41
|
-
addMargin,
|
|
42
|
-
shouldShowDot,
|
|
43
|
-
verbose,
|
|
44
|
-
}: Props): React.ReactNode {
|
|
45
|
-
const { columns } = useTerminalSize()
|
|
46
|
-
if (isEmptyMessageText(text)) {
|
|
47
|
-
return null
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Show bash output
|
|
51
|
-
if (text.startsWith('<bash-stdout') || text.startsWith('<bash-stderr')) {
|
|
52
|
-
return <AssistantBashOutputMessage content={text} verbose={verbose} />
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Show command output
|
|
56
|
-
if (
|
|
57
|
-
text.startsWith('<local-command-stdout') ||
|
|
58
|
-
text.startsWith('<local-command-stderr')
|
|
59
|
-
) {
|
|
60
|
-
return <AssistantLocalCommandOutputMessage content={text} />
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (text.startsWith(API_ERROR_MESSAGE_PREFIX)) {
|
|
64
|
-
return (
|
|
65
|
-
<Text>
|
|
66
|
-
⎿
|
|
67
|
-
<Text color={getTheme().error}>
|
|
68
|
-
{text === API_ERROR_MESSAGE_PREFIX
|
|
69
|
-
? `${API_ERROR_MESSAGE_PREFIX}: Please wait a moment and try again.`
|
|
70
|
-
: text}
|
|
71
|
-
</Text>
|
|
72
|
-
</Text>
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
switch (text) {
|
|
77
|
-
// Local JSX commands don't need a response, but we still want Claude to see them
|
|
78
|
-
// Tool results render their own interrupt messages
|
|
79
|
-
case NO_RESPONSE_REQUESTED:
|
|
80
|
-
case INTERRUPT_MESSAGE_FOR_TOOL_USE:
|
|
81
|
-
return null
|
|
82
|
-
|
|
83
|
-
case INTERRUPT_MESSAGE:
|
|
84
|
-
case CANCEL_MESSAGE:
|
|
85
|
-
return (
|
|
86
|
-
<Text>
|
|
87
|
-
⎿
|
|
88
|
-
<Text color={getTheme().error}>Interrupted by user</Text>
|
|
89
|
-
</Text>
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
case PROMPT_TOO_LONG_ERROR_MESSAGE:
|
|
93
|
-
return (
|
|
94
|
-
<Text>
|
|
95
|
-
⎿
|
|
96
|
-
<Text color={getTheme().error}>
|
|
97
|
-
Context low · Run /compact to compact & continue
|
|
98
|
-
</Text>
|
|
99
|
-
</Text>
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
case CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE:
|
|
103
|
-
return (
|
|
104
|
-
<Text>
|
|
105
|
-
⎿
|
|
106
|
-
<Text color={getTheme().error}>
|
|
107
|
-
Credit balance too low · Add funds:
|
|
108
|
-
https://console.anthropic.com/settings/billing
|
|
109
|
-
</Text>
|
|
110
|
-
</Text>
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
case INVALID_API_KEY_ERROR_MESSAGE:
|
|
114
|
-
return (
|
|
115
|
-
<Text>
|
|
116
|
-
⎿
|
|
117
|
-
<Text color={getTheme().error}>{INVALID_API_KEY_ERROR_MESSAGE}</Text>
|
|
118
|
-
</Text>
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
default:
|
|
122
|
-
return (
|
|
123
|
-
<Box
|
|
124
|
-
alignItems="flex-start"
|
|
125
|
-
flexDirection="row"
|
|
126
|
-
justifyContent="space-between"
|
|
127
|
-
marginTop={addMargin ? 1 : 0}
|
|
128
|
-
width="100%"
|
|
129
|
-
>
|
|
130
|
-
<Box flexDirection="row">
|
|
131
|
-
{shouldShowDot && (
|
|
132
|
-
<Box minWidth={2}>
|
|
133
|
-
<Text color={getTheme().text}>{BLACK_CIRCLE}</Text>
|
|
134
|
-
</Box>
|
|
135
|
-
)}
|
|
136
|
-
<Box flexDirection="column" width={columns - 6}>
|
|
137
|
-
<Text>{applyMarkdown(text)}</Text>
|
|
138
|
-
</Box>
|
|
139
|
-
</Box>
|
|
140
|
-
<Cost costUSD={costUSD} durationMs={durationMs} debug={debug} />
|
|
141
|
-
</Box>
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Box, Text } from 'ink'
|
|
3
|
-
import { getTheme } from '../../utils/theme'
|
|
4
|
-
import { applyMarkdown } from '../../utils/markdown'
|
|
5
|
-
import {
|
|
6
|
-
ThinkingBlock,
|
|
7
|
-
ThinkingBlockParam,
|
|
8
|
-
} from '@anthropic-ai/sdk/resources/index.mjs'
|
|
9
|
-
|
|
10
|
-
type Props = {
|
|
11
|
-
param: ThinkingBlock | ThinkingBlockParam
|
|
12
|
-
addMargin: boolean
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function AssistantThinkingMessage({
|
|
16
|
-
param: { thinking },
|
|
17
|
-
addMargin = false,
|
|
18
|
-
}: Props): React.ReactNode {
|
|
19
|
-
if (!thinking) {
|
|
20
|
-
return null
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<Box
|
|
25
|
-
flexDirection="column"
|
|
26
|
-
gap={1}
|
|
27
|
-
marginTop={addMargin ? 1 : 0}
|
|
28
|
-
width="100%"
|
|
29
|
-
>
|
|
30
|
-
<Text color={getTheme().secondaryText} italic>
|
|
31
|
-
✻ Thinking…
|
|
32
|
-
</Text>
|
|
33
|
-
<Box paddingLeft={2}>
|
|
34
|
-
<Text color={getTheme().secondaryText} italic>
|
|
35
|
-
{applyMarkdown(thinking)}
|
|
36
|
-
</Text>
|
|
37
|
-
</Box>
|
|
38
|
-
</Box>
|
|
39
|
-
)
|
|
40
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { Box, Text } from 'ink'
|
|
2
|
-
import React from 'react'
|
|
3
|
-
import { logError } from '../../utils/log'
|
|
4
|
-
import { ToolUseBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'
|
|
5
|
-
import { Tool } from '../../Tool'
|
|
6
|
-
import { Cost } from '../Cost'
|
|
7
|
-
import { ToolUseLoader } from '../ToolUseLoader'
|
|
8
|
-
import { getTheme } from '../../utils/theme'
|
|
9
|
-
import { BLACK_CIRCLE } from '../../constants/figures'
|
|
10
|
-
import { ThinkTool } from '../../tools/ThinkTool/ThinkTool'
|
|
11
|
-
import { AssistantThinkingMessage } from './AssistantThinkingMessage'
|
|
12
|
-
import { TaskToolMessage } from './TaskToolMessage'
|
|
13
|
-
|
|
14
|
-
type Props = {
|
|
15
|
-
param: ToolUseBlockParam
|
|
16
|
-
costUSD: number
|
|
17
|
-
durationMs: number
|
|
18
|
-
addMargin: boolean
|
|
19
|
-
tools: Tool[]
|
|
20
|
-
debug: boolean
|
|
21
|
-
verbose: boolean
|
|
22
|
-
erroredToolUseIDs: Set<string>
|
|
23
|
-
inProgressToolUseIDs: Set<string>
|
|
24
|
-
unresolvedToolUseIDs: Set<string>
|
|
25
|
-
shouldAnimate: boolean
|
|
26
|
-
shouldShowDot: boolean
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function AssistantToolUseMessage({
|
|
30
|
-
param,
|
|
31
|
-
costUSD,
|
|
32
|
-
durationMs,
|
|
33
|
-
addMargin,
|
|
34
|
-
tools,
|
|
35
|
-
debug,
|
|
36
|
-
verbose,
|
|
37
|
-
erroredToolUseIDs,
|
|
38
|
-
inProgressToolUseIDs,
|
|
39
|
-
unresolvedToolUseIDs,
|
|
40
|
-
shouldAnimate,
|
|
41
|
-
shouldShowDot,
|
|
42
|
-
}: Props): React.ReactNode {
|
|
43
|
-
const tool = tools.find(_ => _.name === param.name)
|
|
44
|
-
if (!tool) {
|
|
45
|
-
logError(`Tool ${param.name} not found`)
|
|
46
|
-
return null
|
|
47
|
-
}
|
|
48
|
-
const isQueued =
|
|
49
|
-
!inProgressToolUseIDs.has(param.id) && unresolvedToolUseIDs.has(param.id)
|
|
50
|
-
// Keeping color undefined makes the OS use the default color regardless of appearance
|
|
51
|
-
const color = isQueued ? getTheme().secondaryText : undefined
|
|
52
|
-
|
|
53
|
-
// TODO: Avoid this special case
|
|
54
|
-
if (tool === ThinkTool) {
|
|
55
|
-
// params were already validated in query(), so this won't throe
|
|
56
|
-
const { thought } = ThinkTool.inputSchema.parse(param.input)
|
|
57
|
-
return (
|
|
58
|
-
<AssistantThinkingMessage
|
|
59
|
-
param={{ thinking: thought, signature: '', type: 'thinking' }}
|
|
60
|
-
addMargin={addMargin}
|
|
61
|
-
/>
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const userFacingToolName = tool.userFacingName ? tool.userFacingName() : tool.name
|
|
66
|
-
return (
|
|
67
|
-
<Box
|
|
68
|
-
flexDirection="row"
|
|
69
|
-
justifyContent="space-between"
|
|
70
|
-
marginTop={addMargin ? 1 : 0}
|
|
71
|
-
width="100%"
|
|
72
|
-
>
|
|
73
|
-
<Box>
|
|
74
|
-
<Box
|
|
75
|
-
flexWrap="nowrap"
|
|
76
|
-
minWidth={userFacingToolName.length + (shouldShowDot ? 2 : 0)}
|
|
77
|
-
>
|
|
78
|
-
{shouldShowDot &&
|
|
79
|
-
(isQueued ? (
|
|
80
|
-
<Box minWidth={2}>
|
|
81
|
-
<Text color={color}>{BLACK_CIRCLE}</Text>
|
|
82
|
-
</Box>
|
|
83
|
-
) : (
|
|
84
|
-
<ToolUseLoader
|
|
85
|
-
shouldAnimate={shouldAnimate}
|
|
86
|
-
isUnresolved={unresolvedToolUseIDs.has(param.id)}
|
|
87
|
-
isError={erroredToolUseIDs.has(param.id)}
|
|
88
|
-
/>
|
|
89
|
-
))}
|
|
90
|
-
{tool.name === 'Task' && param.input ? (
|
|
91
|
-
<TaskToolMessage
|
|
92
|
-
agentType={String((param.input as any).subagent_type || 'general-purpose')}
|
|
93
|
-
bold={Boolean(!isQueued)}
|
|
94
|
-
children={String(userFacingToolName || '')}
|
|
95
|
-
/>
|
|
96
|
-
) : (
|
|
97
|
-
<Text color={color} bold={!isQueued}>
|
|
98
|
-
{userFacingToolName}
|
|
99
|
-
</Text>
|
|
100
|
-
)}
|
|
101
|
-
</Box>
|
|
102
|
-
<Box flexWrap="nowrap">
|
|
103
|
-
{Object.keys(param.input as { [key: string]: unknown }).length > 0 &&
|
|
104
|
-
(() => {
|
|
105
|
-
const toolMessage = tool.renderToolUseMessage(
|
|
106
|
-
param.input as never,
|
|
107
|
-
{
|
|
108
|
-
verbose,
|
|
109
|
-
},
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
// If the tool returns a React component, render it directly
|
|
113
|
-
if (React.isValidElement(toolMessage)) {
|
|
114
|
-
return (
|
|
115
|
-
<Box flexDirection="row">
|
|
116
|
-
<Text color={color}>(</Text>
|
|
117
|
-
{toolMessage}
|
|
118
|
-
<Text color={color}>)</Text>
|
|
119
|
-
</Box>
|
|
120
|
-
)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// If it's a string, wrap it in Text
|
|
124
|
-
return <Text color={color}>({toolMessage})</Text>
|
|
125
|
-
})()}
|
|
126
|
-
<Text color={color}>…</Text>
|
|
127
|
-
</Box>
|
|
128
|
-
</Box>
|
|
129
|
-
<Cost costUSD={costUSD} durationMs={durationMs} debug={debug} />
|
|
130
|
-
</Box>
|
|
131
|
-
)
|
|
132
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Box, Text } from 'ink'
|
|
3
|
-
import { getTheme } from '../../utils/theme'
|
|
4
|
-
|
|
5
|
-
interface Props {
|
|
6
|
-
agentType: string
|
|
7
|
-
status: string
|
|
8
|
-
toolCount?: number
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function TaskProgressMessage({ agentType, status, toolCount }: Props) {
|
|
12
|
-
const theme = getTheme()
|
|
13
|
-
|
|
14
|
-
return (
|
|
15
|
-
<Box flexDirection="column" marginTop={1}>
|
|
16
|
-
<Box flexDirection="row">
|
|
17
|
-
<Text color={theme.kode}>⎯ </Text>
|
|
18
|
-
<Text color={theme.text} bold>
|
|
19
|
-
[{agentType}]
|
|
20
|
-
</Text>
|
|
21
|
-
<Text color={theme.secondaryText}> {status}</Text>
|
|
22
|
-
</Box>
|
|
23
|
-
{toolCount && toolCount > 0 && (
|
|
24
|
-
<Box marginLeft={3}>
|
|
25
|
-
<Text color={theme.secondaryText}>
|
|
26
|
-
Tools used: {toolCount}
|
|
27
|
-
</Text>
|
|
28
|
-
</Box>
|
|
29
|
-
)}
|
|
30
|
-
</Box>
|
|
31
|
-
)
|
|
32
|
-
}
|