@shareai-lab/kode 1.1.13 → 1.1.16
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 +2 -1
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/index.js +5 -26
- package/dist/package.json +4 -1
- package/package.json +9 -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,53 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ProjectConfig,
|
|
3
|
-
getCurrentProjectConfig as getCurrentProjectConfigDefault,
|
|
4
|
-
saveCurrentProjectConfig as saveCurrentProjectConfigDefault,
|
|
5
|
-
} from '../utils/config.js'
|
|
6
|
-
|
|
7
|
-
export type ProjectConfigHandler = {
|
|
8
|
-
getCurrentProjectConfig: () => ProjectConfig
|
|
9
|
-
saveCurrentProjectConfig: (config: ProjectConfig) => void
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// Default config handler using the real implementation
|
|
13
|
-
const defaultConfigHandler: ProjectConfigHandler = {
|
|
14
|
-
getCurrentProjectConfig: getCurrentProjectConfigDefault,
|
|
15
|
-
saveCurrentProjectConfig: saveCurrentProjectConfigDefault,
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Handler for the 'approved-tools list' command
|
|
20
|
-
*/
|
|
21
|
-
export function handleListApprovedTools(
|
|
22
|
-
cwd: string,
|
|
23
|
-
projectConfigHandler: ProjectConfigHandler = defaultConfigHandler,
|
|
24
|
-
): string {
|
|
25
|
-
const projectConfig = projectConfigHandler.getCurrentProjectConfig()
|
|
26
|
-
return `Allowed tools for ${cwd}:\n${projectConfig.allowedTools.join('\n')}`
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Handler for the 'approved-tools remove' command
|
|
31
|
-
*/
|
|
32
|
-
export function handleRemoveApprovedTool(
|
|
33
|
-
tool: string,
|
|
34
|
-
projectConfigHandler: ProjectConfigHandler = defaultConfigHandler,
|
|
35
|
-
): { success: boolean; message: string } {
|
|
36
|
-
const projectConfig = projectConfigHandler.getCurrentProjectConfig()
|
|
37
|
-
const originalToolCount = projectConfig.allowedTools.length
|
|
38
|
-
const updatedAllowedTools = projectConfig.allowedTools.filter(t => t !== tool)
|
|
39
|
-
|
|
40
|
-
if (originalToolCount !== updatedAllowedTools.length) {
|
|
41
|
-
projectConfig.allowedTools = updatedAllowedTools
|
|
42
|
-
projectConfigHandler.saveCurrentProjectConfig(projectConfig)
|
|
43
|
-
return {
|
|
44
|
-
success: true,
|
|
45
|
-
message: `Removed ${tool} from the list of approved tools`,
|
|
46
|
-
}
|
|
47
|
-
} else {
|
|
48
|
-
return {
|
|
49
|
-
success: false,
|
|
50
|
-
message: `${tool} was not in the list of approved tools`,
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
package/src/commands/bug.tsx
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Command } from '../commands'
|
|
2
|
-
import { Bug } from '../components/Bug'
|
|
3
|
-
import * as React from 'react'
|
|
4
|
-
import { PRODUCT_NAME } from '../constants/product'
|
|
5
|
-
|
|
6
|
-
const bug = {
|
|
7
|
-
type: 'local-jsx',
|
|
8
|
-
name: 'bug',
|
|
9
|
-
description: `Submit feedback about ${PRODUCT_NAME}`,
|
|
10
|
-
isEnabled: true,
|
|
11
|
-
isHidden: false,
|
|
12
|
-
async call(onDone) {
|
|
13
|
-
return <Bug onDone={onDone} />
|
|
14
|
-
},
|
|
15
|
-
userFacingName() {
|
|
16
|
-
return 'bug'
|
|
17
|
-
},
|
|
18
|
-
} satisfies Command
|
|
19
|
-
|
|
20
|
-
export default bug
|
package/src/commands/clear.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Command } from '../commands'
|
|
2
|
-
import { getMessagesSetter } from '../messages'
|
|
3
|
-
import { getContext } from '../context'
|
|
4
|
-
import { getCodeStyle } from '../utils/style'
|
|
5
|
-
import { clearTerminal } from '../utils/terminal'
|
|
6
|
-
import { getOriginalCwd, setCwd } from '../utils/state'
|
|
7
|
-
import { Message } from '../query'
|
|
8
|
-
import { resetReminderSession } from '../services/systemReminder'
|
|
9
|
-
import { resetFileFreshnessSession } from '../services/fileFreshness'
|
|
10
|
-
|
|
11
|
-
export async function clearConversation(context: {
|
|
12
|
-
setForkConvoWithMessagesOnTheNextRender: (
|
|
13
|
-
forkConvoWithMessages: Message[],
|
|
14
|
-
) => void
|
|
15
|
-
}) {
|
|
16
|
-
await clearTerminal()
|
|
17
|
-
getMessagesSetter()([])
|
|
18
|
-
context.setForkConvoWithMessagesOnTheNextRender([])
|
|
19
|
-
getContext.cache.clear?.()
|
|
20
|
-
getCodeStyle.cache.clear?.()
|
|
21
|
-
await setCwd(getOriginalCwd())
|
|
22
|
-
|
|
23
|
-
// Reset reminder and file freshness sessions to clean up state
|
|
24
|
-
resetReminderSession()
|
|
25
|
-
resetFileFreshnessSession()
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const clear = {
|
|
29
|
-
type: 'local',
|
|
30
|
-
name: 'clear',
|
|
31
|
-
description: 'Clear conversation history and free up context',
|
|
32
|
-
isEnabled: true,
|
|
33
|
-
isHidden: false,
|
|
34
|
-
async call(_, context) {
|
|
35
|
-
clearConversation(context)
|
|
36
|
-
return ''
|
|
37
|
-
},
|
|
38
|
-
userFacingName() {
|
|
39
|
-
return 'clear'
|
|
40
|
-
},
|
|
41
|
-
} satisfies Command
|
|
42
|
-
|
|
43
|
-
export default clear
|
package/src/commands/compact.ts
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { Command } from '../commands'
|
|
2
|
-
import { getContext } from '../context'
|
|
3
|
-
import { getMessagesGetter, getMessagesSetter } from '../messages'
|
|
4
|
-
import { API_ERROR_MESSAGE_PREFIX, queryLLM } from '../services/claude'
|
|
5
|
-
import {
|
|
6
|
-
createUserMessage,
|
|
7
|
-
normalizeMessagesForAPI,
|
|
8
|
-
} from '../utils/messages.js'
|
|
9
|
-
import { getCodeStyle } from '../utils/style'
|
|
10
|
-
import { clearTerminal } from '../utils/terminal'
|
|
11
|
-
import { resetReminderSession } from '../services/systemReminder'
|
|
12
|
-
import { resetFileFreshnessSession } from '../services/fileFreshness'
|
|
13
|
-
|
|
14
|
-
const COMPRESSION_PROMPT = `Please provide a comprehensive summary of our conversation structured as follows:
|
|
15
|
-
|
|
16
|
-
## Technical Context
|
|
17
|
-
Development environment, tools, frameworks, and configurations in use. Programming languages, libraries, and technical constraints. File structure, directory organization, and project architecture.
|
|
18
|
-
|
|
19
|
-
## Project Overview
|
|
20
|
-
Main project goals, features, and scope. Key components, modules, and their relationships. Data models, APIs, and integration patterns.
|
|
21
|
-
|
|
22
|
-
## Code Changes
|
|
23
|
-
Files created, modified, or analyzed during our conversation. Specific code implementations, functions, and algorithms added. Configuration changes and structural modifications.
|
|
24
|
-
|
|
25
|
-
## Debugging & Issues
|
|
26
|
-
Problems encountered and their root causes. Solutions implemented and their effectiveness. Error messages, logs, and diagnostic information.
|
|
27
|
-
|
|
28
|
-
## Current Status
|
|
29
|
-
What we just completed successfully. Current state of the codebase and any ongoing work. Test results, validation steps, and verification performed.
|
|
30
|
-
|
|
31
|
-
## Pending Tasks
|
|
32
|
-
Immediate next steps and priorities. Planned features, improvements, and refactoring. Known issues, technical debt, and areas needing attention.
|
|
33
|
-
|
|
34
|
-
## User Preferences
|
|
35
|
-
Coding style, formatting, and organizational preferences. Communication patterns and feedback style. Tool choices and workflow preferences.
|
|
36
|
-
|
|
37
|
-
## Key Decisions
|
|
38
|
-
Important technical decisions made and their rationale. Alternative approaches considered and why they were rejected. Trade-offs accepted and their implications.
|
|
39
|
-
|
|
40
|
-
Focus on information essential for continuing the conversation effectively, including specific details about code, files, errors, and plans.`
|
|
41
|
-
|
|
42
|
-
const compact = {
|
|
43
|
-
type: 'local',
|
|
44
|
-
name: 'compact',
|
|
45
|
-
description: 'Clear conversation history but keep a summary in context',
|
|
46
|
-
isEnabled: true,
|
|
47
|
-
isHidden: false,
|
|
48
|
-
async call(
|
|
49
|
-
_,
|
|
50
|
-
{
|
|
51
|
-
options: { tools },
|
|
52
|
-
abortController,
|
|
53
|
-
setForkConvoWithMessagesOnTheNextRender,
|
|
54
|
-
},
|
|
55
|
-
) {
|
|
56
|
-
const messages = getMessagesGetter()()
|
|
57
|
-
|
|
58
|
-
const summaryRequest = createUserMessage(COMPRESSION_PROMPT)
|
|
59
|
-
|
|
60
|
-
const summaryResponse = await queryLLM(
|
|
61
|
-
normalizeMessagesForAPI([...messages, summaryRequest]),
|
|
62
|
-
[
|
|
63
|
-
'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',
|
|
64
|
-
],
|
|
65
|
-
0,
|
|
66
|
-
tools,
|
|
67
|
-
abortController.signal,
|
|
68
|
-
{
|
|
69
|
-
safeMode: false,
|
|
70
|
-
model: 'main', // 使用模型指针,让queryLLM统一解析
|
|
71
|
-
prependCLISysprompt: true,
|
|
72
|
-
},
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
const content = summaryResponse.message.content
|
|
76
|
-
const summary =
|
|
77
|
-
typeof content === 'string'
|
|
78
|
-
? content
|
|
79
|
-
: content.length > 0 && content[0]?.type === 'text'
|
|
80
|
-
? content[0].text
|
|
81
|
-
: null
|
|
82
|
-
|
|
83
|
-
if (!summary) {
|
|
84
|
-
throw new Error(
|
|
85
|
-
`Failed to generate conversation summary - response did not contain valid text content - ${summaryResponse}`,
|
|
86
|
-
)
|
|
87
|
-
} else if (summary.startsWith(API_ERROR_MESSAGE_PREFIX)) {
|
|
88
|
-
throw new Error(summary)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
summaryResponse.message.usage = {
|
|
92
|
-
input_tokens: 0,
|
|
93
|
-
output_tokens: summaryResponse.message.usage.output_tokens,
|
|
94
|
-
cache_creation_input_tokens: 0,
|
|
95
|
-
cache_read_input_tokens: 0,
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
await clearTerminal()
|
|
99
|
-
getMessagesSetter()([])
|
|
100
|
-
setForkConvoWithMessagesOnTheNextRender([
|
|
101
|
-
createUserMessage(
|
|
102
|
-
`Context has been compressed using structured 8-section algorithm. All essential information has been preserved for seamless continuation.`,
|
|
103
|
-
),
|
|
104
|
-
summaryResponse,
|
|
105
|
-
])
|
|
106
|
-
getContext.cache.clear?.()
|
|
107
|
-
getCodeStyle.cache.clear?.()
|
|
108
|
-
resetFileFreshnessSession()
|
|
109
|
-
|
|
110
|
-
// Reset reminder and file freshness sessions to clean up state
|
|
111
|
-
resetReminderSession()
|
|
112
|
-
|
|
113
|
-
return '' // not used, just for typesafety. TODO: avoid this hack
|
|
114
|
-
},
|
|
115
|
-
userFacingName() {
|
|
116
|
-
return 'compact'
|
|
117
|
-
},
|
|
118
|
-
} satisfies Command
|
|
119
|
-
|
|
120
|
-
export default compact
|
package/src/commands/config.tsx
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Command } from '../commands'
|
|
2
|
-
import { Config } from '../components/Config'
|
|
3
|
-
import * as React from 'react'
|
|
4
|
-
|
|
5
|
-
const config = {
|
|
6
|
-
type: 'local-jsx',
|
|
7
|
-
name: 'config',
|
|
8
|
-
description: 'Open config panel',
|
|
9
|
-
isEnabled: true,
|
|
10
|
-
isHidden: false,
|
|
11
|
-
async call(onDone) {
|
|
12
|
-
return <Config onClose={onDone} />
|
|
13
|
-
},
|
|
14
|
-
userFacingName() {
|
|
15
|
-
return 'config'
|
|
16
|
-
},
|
|
17
|
-
} satisfies Command
|
|
18
|
-
|
|
19
|
-
export default config
|
package/src/commands/cost.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Command } from '../commands'
|
|
2
|
-
import { formatTotalCost } from '../cost-tracker'
|
|
3
|
-
|
|
4
|
-
const cost = {
|
|
5
|
-
type: 'local',
|
|
6
|
-
name: 'cost',
|
|
7
|
-
description: 'Show the total cost and duration of the current session',
|
|
8
|
-
isEnabled: true,
|
|
9
|
-
isHidden: false,
|
|
10
|
-
async call() {
|
|
11
|
-
return formatTotalCost()
|
|
12
|
-
},
|
|
13
|
-
userFacingName() {
|
|
14
|
-
return 'cost'
|
|
15
|
-
},
|
|
16
|
-
} satisfies Command
|
|
17
|
-
|
|
18
|
-
export default cost
|
package/src/commands/ctx_viz.ts
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import type { Command } from '../commands'
|
|
2
|
-
import type { Tool } from '../Tool'
|
|
3
|
-
import Table from 'cli-table3'
|
|
4
|
-
import { getSystemPrompt } from '../constants/prompts'
|
|
5
|
-
import { getContext } from '../context'
|
|
6
|
-
import { zodToJsonSchema } from 'zod-to-json-schema'
|
|
7
|
-
import { getMessagesGetter } from '../messages'
|
|
8
|
-
import { PROJECT_FILE } from '../constants/product'
|
|
9
|
-
// Quick and dirty estimate of bytes per token for rough token counts
|
|
10
|
-
const BYTES_PER_TOKEN = 4
|
|
11
|
-
|
|
12
|
-
interface Section {
|
|
13
|
-
title: string
|
|
14
|
-
content: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface ToolSummary {
|
|
18
|
-
name: string
|
|
19
|
-
description: string
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function getContextSections(text: string): Section[] {
|
|
23
|
-
const sections: Section[] = []
|
|
24
|
-
|
|
25
|
-
// Find first <context> tag
|
|
26
|
-
const firstContextIndex = text.indexOf('<context')
|
|
27
|
-
|
|
28
|
-
// Everything before first tag is Core Sysprompt
|
|
29
|
-
if (firstContextIndex > 0) {
|
|
30
|
-
const coreSysprompt = text.slice(0, firstContextIndex).trim()
|
|
31
|
-
if (coreSysprompt) {
|
|
32
|
-
sections.push({
|
|
33
|
-
title: 'Core Sysprompt',
|
|
34
|
-
content: coreSysprompt,
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
let currentPos = firstContextIndex
|
|
40
|
-
let nonContextContent = ''
|
|
41
|
-
|
|
42
|
-
const regex = /<context\s+name="([^"]*)">([\s\S]*?)<\/context>/g
|
|
43
|
-
let match: RegExpExecArray | null
|
|
44
|
-
|
|
45
|
-
while ((match = regex.exec(text)) !== null) {
|
|
46
|
-
// Collect text between context tags
|
|
47
|
-
if (match.index > currentPos) {
|
|
48
|
-
nonContextContent += text.slice(currentPos, match.index)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const [, name = 'Unnamed Section', content = ''] = match
|
|
52
|
-
sections.push({
|
|
53
|
-
title: name === 'codeStyle' ? `CodeStyle + ${PROJECT_FILE}'s` : name,
|
|
54
|
-
content: content.trim(),
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
currentPos = match.index + match[0].length
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Collect remaining text after last tag
|
|
61
|
-
if (currentPos < text.length) {
|
|
62
|
-
nonContextContent += text.slice(currentPos)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Add non-contextualized content if present
|
|
66
|
-
const trimmedNonContext = nonContextContent.trim()
|
|
67
|
-
if (trimmedNonContext) {
|
|
68
|
-
sections.push({
|
|
69
|
-
title: 'Non-contextualized Content',
|
|
70
|
-
content: trimmedNonContext,
|
|
71
|
-
})
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return sections
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function formatTokenCount(bytes: number): string {
|
|
78
|
-
const tokens = bytes / BYTES_PER_TOKEN
|
|
79
|
-
const k = tokens / 1000
|
|
80
|
-
return `${Math.round(k * 10) / 10}k`
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function formatByteCount(bytes: number): string {
|
|
84
|
-
const kb = bytes / 1024
|
|
85
|
-
return `${Math.round(kb * 10) / 10}kb`
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function createSummaryTable(
|
|
89
|
-
systemText: string,
|
|
90
|
-
systemSections: Section[],
|
|
91
|
-
tools: ToolSummary[],
|
|
92
|
-
messages: unknown,
|
|
93
|
-
): string {
|
|
94
|
-
const table = new Table({
|
|
95
|
-
head: ['Component', 'Tokens', 'Size', '% Used'],
|
|
96
|
-
style: { head: ['bold'] },
|
|
97
|
-
chars: {
|
|
98
|
-
mid: '─',
|
|
99
|
-
'left-mid': '├',
|
|
100
|
-
'mid-mid': '┼',
|
|
101
|
-
'right-mid': '┤',
|
|
102
|
-
},
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
const messagesStr = JSON.stringify(messages)
|
|
106
|
-
const toolsStr = JSON.stringify(tools)
|
|
107
|
-
|
|
108
|
-
// Calculate total for percentages
|
|
109
|
-
const total = systemText.length + toolsStr.length + messagesStr.length
|
|
110
|
-
const getPercentage = (n: number) => `${Math.round((n / total) * 100)}%`
|
|
111
|
-
|
|
112
|
-
// System prompt and its sections
|
|
113
|
-
table.push([
|
|
114
|
-
'System prompt',
|
|
115
|
-
formatTokenCount(systemText.length),
|
|
116
|
-
formatByteCount(systemText.length),
|
|
117
|
-
getPercentage(systemText.length),
|
|
118
|
-
])
|
|
119
|
-
for (const section of systemSections) {
|
|
120
|
-
table.push([
|
|
121
|
-
` ${section.title}`,
|
|
122
|
-
formatTokenCount(section.content.length),
|
|
123
|
-
formatByteCount(section.content.length),
|
|
124
|
-
getPercentage(section.content.length),
|
|
125
|
-
])
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Tools
|
|
129
|
-
table.push([
|
|
130
|
-
'Tool definitions',
|
|
131
|
-
formatTokenCount(toolsStr.length),
|
|
132
|
-
formatByteCount(toolsStr.length),
|
|
133
|
-
getPercentage(toolsStr.length),
|
|
134
|
-
])
|
|
135
|
-
for (const tool of tools) {
|
|
136
|
-
table.push([
|
|
137
|
-
` ${tool.name}`,
|
|
138
|
-
formatTokenCount(tool.description.length),
|
|
139
|
-
formatByteCount(tool.description.length),
|
|
140
|
-
getPercentage(tool.description.length),
|
|
141
|
-
])
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Messages and total
|
|
145
|
-
table.push(
|
|
146
|
-
[
|
|
147
|
-
'Messages',
|
|
148
|
-
formatTokenCount(messagesStr.length),
|
|
149
|
-
formatByteCount(messagesStr.length),
|
|
150
|
-
getPercentage(messagesStr.length),
|
|
151
|
-
],
|
|
152
|
-
['Total', formatTokenCount(total), formatByteCount(total), '100%'],
|
|
153
|
-
)
|
|
154
|
-
|
|
155
|
-
return table.toString()
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const command: Command = {
|
|
159
|
-
name: 'ctx-viz',
|
|
160
|
-
description:
|
|
161
|
-
'Show token usage breakdown for the current conversation context',
|
|
162
|
-
isEnabled: true,
|
|
163
|
-
isHidden: false,
|
|
164
|
-
type: 'local',
|
|
165
|
-
|
|
166
|
-
userFacingName() {
|
|
167
|
-
return this.name
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
async call(_args: string, cmdContext: { options: { tools: Tool[] } }) {
|
|
171
|
-
// Get tools and system prompt with injected context
|
|
172
|
-
const [systemPromptRaw, sysContext] = await Promise.all([
|
|
173
|
-
getSystemPrompt(),
|
|
174
|
-
getContext(),
|
|
175
|
-
])
|
|
176
|
-
|
|
177
|
-
const rawTools = cmdContext.options.tools
|
|
178
|
-
|
|
179
|
-
// Full system prompt with context sections injected
|
|
180
|
-
let systemPrompt = systemPromptRaw.join('\n')
|
|
181
|
-
for (const [name, content] of Object.entries(sysContext)) {
|
|
182
|
-
systemPrompt += `\n<context name="${name}">${content}</context>`
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Get full tool definitions including prompts and schemas
|
|
186
|
-
const tools = rawTools.map(t => {
|
|
187
|
-
// Get full prompt and schema
|
|
188
|
-
const fullPrompt = t.prompt({ safeMode: false })
|
|
189
|
-
const schema = JSON.stringify(
|
|
190
|
-
'inputJSONSchema' in t && t.inputJSONSchema
|
|
191
|
-
? t.inputJSONSchema
|
|
192
|
-
: zodToJsonSchema(t.inputSchema),
|
|
193
|
-
)
|
|
194
|
-
|
|
195
|
-
return {
|
|
196
|
-
name: t.name,
|
|
197
|
-
description: `${fullPrompt}\n\nSchema:\n${schema}`,
|
|
198
|
-
}
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
// Get current messages from REPL
|
|
202
|
-
const messages = getMessagesGetter()()
|
|
203
|
-
|
|
204
|
-
const sections = getContextSections(systemPrompt)
|
|
205
|
-
return createSummaryTable(systemPrompt, sections, tools, messages)
|
|
206
|
-
},
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export default command
|
package/src/commands/doctor.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import type { Command } from '../commands'
|
|
3
|
-
import { Doctor } from '../screens/Doctor'
|
|
4
|
-
import { PRODUCT_NAME } from '../constants/product'
|
|
5
|
-
|
|
6
|
-
const doctor: Command = {
|
|
7
|
-
name: 'doctor',
|
|
8
|
-
description: `Checks the health of your ${PRODUCT_NAME} installation`,
|
|
9
|
-
isEnabled: true,
|
|
10
|
-
isHidden: false,
|
|
11
|
-
userFacingName() {
|
|
12
|
-
return 'doctor'
|
|
13
|
-
},
|
|
14
|
-
type: 'local-jsx',
|
|
15
|
-
call(onDone) {
|
|
16
|
-
const element = React.createElement(Doctor, {
|
|
17
|
-
onDone,
|
|
18
|
-
doctorMode: true,
|
|
19
|
-
})
|
|
20
|
-
return Promise.resolve(element)
|
|
21
|
-
},
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export default doctor
|
package/src/commands/help.tsx
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Command } from '../commands'
|
|
2
|
-
import { Help } from '../components/Help'
|
|
3
|
-
import * as React from 'react'
|
|
4
|
-
|
|
5
|
-
const help = {
|
|
6
|
-
type: 'local-jsx',
|
|
7
|
-
name: 'help',
|
|
8
|
-
description: 'Show help and available commands',
|
|
9
|
-
isEnabled: true,
|
|
10
|
-
isHidden: false,
|
|
11
|
-
async call(onDone, context) {
|
|
12
|
-
return <Help commands={context.options?.commands || []} onClose={onDone} />
|
|
13
|
-
},
|
|
14
|
-
userFacingName() {
|
|
15
|
-
return 'help'
|
|
16
|
-
},
|
|
17
|
-
} satisfies Command
|
|
18
|
-
|
|
19
|
-
export default help
|
package/src/commands/init.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { Command } from '../commands'
|
|
2
|
-
import { markProjectOnboardingComplete } from '../ProjectOnboarding'
|
|
3
|
-
import { PROJECT_FILE } from '../constants/product'
|
|
4
|
-
const command = {
|
|
5
|
-
type: 'prompt',
|
|
6
|
-
name: 'init',
|
|
7
|
-
description: `Initialize a new ${PROJECT_FILE} file with codebase documentation`,
|
|
8
|
-
isEnabled: true,
|
|
9
|
-
isHidden: false,
|
|
10
|
-
progressMessage: 'analyzing your codebase',
|
|
11
|
-
userFacingName() {
|
|
12
|
-
return 'init'
|
|
13
|
-
},
|
|
14
|
-
async getPromptForCommand(_args: string) {
|
|
15
|
-
// Mark onboarding as complete when init command is run
|
|
16
|
-
markProjectOnboardingComplete()
|
|
17
|
-
return [
|
|
18
|
-
{
|
|
19
|
-
role: 'user',
|
|
20
|
-
content: [
|
|
21
|
-
{
|
|
22
|
-
type: 'text',
|
|
23
|
-
text: `Please analyze this codebase and create a ${PROJECT_FILE} file containing:
|
|
24
|
-
1. Build/lint/test commands - especially for running a single test
|
|
25
|
-
2. Code style guidelines including imports, formatting, types, naming conventions, error handling, etc.
|
|
26
|
-
|
|
27
|
-
The file you create will be given to agentic coding agents (such as yourself) that operate in this repository. Make it about 20 lines long.
|
|
28
|
-
If there's already a ${PROJECT_FILE}, improve it.
|
|
29
|
-
If there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include them.`,
|
|
30
|
-
},
|
|
31
|
-
],
|
|
32
|
-
},
|
|
33
|
-
]
|
|
34
|
-
},
|
|
35
|
-
} satisfies Command
|
|
36
|
-
|
|
37
|
-
export default command
|
package/src/commands/listen.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { Command } from '../commands'
|
|
2
|
-
import { logError } from '../utils/log'
|
|
3
|
-
import { execFileNoThrow } from '../utils/execFileNoThrow'
|
|
4
|
-
|
|
5
|
-
const isEnabled =
|
|
6
|
-
process.platform === 'darwin' &&
|
|
7
|
-
['iTerm.app', 'Apple_Terminal'].includes(process.env.TERM_PROGRAM || '')
|
|
8
|
-
|
|
9
|
-
const listen: Command = {
|
|
10
|
-
type: 'local',
|
|
11
|
-
name: 'listen',
|
|
12
|
-
description: 'Activates speech recognition and transcribes speech to text',
|
|
13
|
-
isEnabled: isEnabled,
|
|
14
|
-
isHidden: isEnabled,
|
|
15
|
-
userFacingName() {
|
|
16
|
-
return 'listen'
|
|
17
|
-
},
|
|
18
|
-
async call(_, { abortController }) {
|
|
19
|
-
// Start dictation using AppleScript
|
|
20
|
-
const script = `tell application "System Events" to tell ¬
|
|
21
|
-
(the first process whose frontmost is true) to tell ¬
|
|
22
|
-
menu bar 1 to tell ¬
|
|
23
|
-
menu bar item "Edit" to tell ¬
|
|
24
|
-
menu "Edit" to tell ¬
|
|
25
|
-
menu item "Start Dictation" to ¬
|
|
26
|
-
if exists then click it`
|
|
27
|
-
|
|
28
|
-
const { stderr, code } = await execFileNoThrow(
|
|
29
|
-
'osascript',
|
|
30
|
-
['-e', script],
|
|
31
|
-
abortController.signal,
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
if (code !== 0) {
|
|
35
|
-
logError(`Failed to start dictation: ${stderr}`)
|
|
36
|
-
return 'Failed to start dictation'
|
|
37
|
-
}
|
|
38
|
-
return 'Dictation started. Press esc to stop.'
|
|
39
|
-
},
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export default listen
|
package/src/commands/login.tsx
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
import type { Command } from '../commands'
|
|
3
|
-
import { ConsoleOAuthFlow } from '../components/ConsoleOAuthFlow'
|
|
4
|
-
import { clearTerminal } from '../utils/terminal'
|
|
5
|
-
import { isLoggedInToAnthropic } from '../utils/auth'
|
|
6
|
-
import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
|
|
7
|
-
import { Box, Text } from 'ink'
|
|
8
|
-
import { clearConversation } from './clear'
|
|
9
|
-
|
|
10
|
-
export default () =>
|
|
11
|
-
({
|
|
12
|
-
type: 'local-jsx',
|
|
13
|
-
name: 'login',
|
|
14
|
-
description: isLoggedInToAnthropic()
|
|
15
|
-
? 'Switch Anthropic accounts'
|
|
16
|
-
: 'Sign in with your Anthropic account',
|
|
17
|
-
isEnabled: true,
|
|
18
|
-
isHidden: false,
|
|
19
|
-
async call(onDone, context) {
|
|
20
|
-
await clearTerminal()
|
|
21
|
-
return (
|
|
22
|
-
<Login
|
|
23
|
-
onDone={async () => {
|
|
24
|
-
clearConversation(context)
|
|
25
|
-
onDone()
|
|
26
|
-
}}
|
|
27
|
-
/>
|
|
28
|
-
)
|
|
29
|
-
},
|
|
30
|
-
userFacingName() {
|
|
31
|
-
return 'login'
|
|
32
|
-
},
|
|
33
|
-
}) satisfies Command
|
|
34
|
-
|
|
35
|
-
function Login(props: { onDone: () => void }) {
|
|
36
|
-
const exitState = useExitOnCtrlCD(props.onDone)
|
|
37
|
-
return (
|
|
38
|
-
<Box flexDirection="column">
|
|
39
|
-
<ConsoleOAuthFlow onDone={props.onDone} />
|
|
40
|
-
<Box marginLeft={3}>
|
|
41
|
-
<Text dimColor>
|
|
42
|
-
{exitState.pending ? (
|
|
43
|
-
<>Press {exitState.keyName} again to exit</>
|
|
44
|
-
) : (
|
|
45
|
-
''
|
|
46
|
-
)}
|
|
47
|
-
</Text>
|
|
48
|
-
</Box>
|
|
49
|
-
</Box>
|
|
50
|
-
)
|
|
51
|
-
}
|