@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/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { Box, Text } from 'ink'
|
|
2
|
-
import React, { useMemo } from 'react'
|
|
3
|
-
import { Select } from '../../CustomSelect/select'
|
|
4
|
-
import { getTheme } from '../../../utils/theme'
|
|
5
|
-
import {
|
|
6
|
-
PermissionRequestTitle,
|
|
7
|
-
textColorForRiskScore,
|
|
8
|
-
} from '../PermissionRequestTitle.js'
|
|
9
|
-
import { logUnaryEvent } from '../../../utils/unaryLogging'
|
|
10
|
-
import { env } from '../../../utils/env'
|
|
11
|
-
import {
|
|
12
|
-
type PermissionRequestProps,
|
|
13
|
-
type ToolUseConfirm,
|
|
14
|
-
} from '../PermissionRequest.js'
|
|
15
|
-
import chalk from 'chalk'
|
|
16
|
-
import {
|
|
17
|
-
UnaryEvent,
|
|
18
|
-
usePermissionRequestLogging,
|
|
19
|
-
} from '../../../hooks/usePermissionRequestLogging.js'
|
|
20
|
-
import { FileEditTool } from '../../../tools/FileEditTool/FileEditTool'
|
|
21
|
-
import { FileWriteTool } from '../../../tools/FileWriteTool/FileWriteTool'
|
|
22
|
-
import { GrepTool } from '../../../tools/GrepTool/GrepTool'
|
|
23
|
-
import { GlobTool } from '../../../tools/GlobTool/GlobTool'
|
|
24
|
-
import { LSTool } from '../../../tools/lsTool/lsTool'
|
|
25
|
-
import { FileReadTool } from '../../../tools/FileReadTool/FileReadTool'
|
|
26
|
-
import { NotebookEditTool } from '../../../tools/NotebookEditTool/NotebookEditTool'
|
|
27
|
-
import { NotebookReadTool } from '../../../tools/NotebookReadTool/NotebookReadTool'
|
|
28
|
-
import { FallbackPermissionRequest } from '../FallbackPermissionRequest'
|
|
29
|
-
import {
|
|
30
|
-
grantWritePermissionForOriginalDir,
|
|
31
|
-
pathInOriginalCwd,
|
|
32
|
-
toAbsolutePath,
|
|
33
|
-
} from '../../../utils/permissions/filesystem.js'
|
|
34
|
-
import { getCwd } from '../../../utils/state'
|
|
35
|
-
|
|
36
|
-
function pathArgNameForToolUse(toolUseConfirm: ToolUseConfirm): string | null {
|
|
37
|
-
switch (toolUseConfirm.tool) {
|
|
38
|
-
case FileWriteTool:
|
|
39
|
-
case FileEditTool:
|
|
40
|
-
case FileReadTool: {
|
|
41
|
-
return 'file_path'
|
|
42
|
-
}
|
|
43
|
-
case GlobTool:
|
|
44
|
-
case GrepTool:
|
|
45
|
-
case LSTool: {
|
|
46
|
-
return 'path'
|
|
47
|
-
}
|
|
48
|
-
case NotebookEditTool:
|
|
49
|
-
case NotebookReadTool: {
|
|
50
|
-
return 'notebook_path'
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return null
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function isMultiFile(toolUseConfirm: ToolUseConfirm): boolean {
|
|
57
|
-
switch (toolUseConfirm.tool) {
|
|
58
|
-
case GlobTool:
|
|
59
|
-
case GrepTool:
|
|
60
|
-
case LSTool: {
|
|
61
|
-
return true
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return false
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function pathFromToolUse(toolUseConfirm: ToolUseConfirm): string | null {
|
|
68
|
-
const pathArgName = pathArgNameForToolUse(toolUseConfirm)
|
|
69
|
-
const input = toolUseConfirm.input
|
|
70
|
-
if (pathArgName && pathArgName in input) {
|
|
71
|
-
if (typeof input[pathArgName] === 'string') {
|
|
72
|
-
return toAbsolutePath(input[pathArgName])
|
|
73
|
-
} else {
|
|
74
|
-
return toAbsolutePath(getCwd())
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return null
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export function FilesystemPermissionRequest({
|
|
81
|
-
toolUseConfirm,
|
|
82
|
-
onDone,
|
|
83
|
-
verbose,
|
|
84
|
-
}: PermissionRequestProps): React.ReactNode {
|
|
85
|
-
const path = pathFromToolUse(toolUseConfirm)
|
|
86
|
-
if (!path) {
|
|
87
|
-
// Fall back to generic permission request if no path is found
|
|
88
|
-
return (
|
|
89
|
-
<FallbackPermissionRequest
|
|
90
|
-
toolUseConfirm={toolUseConfirm}
|
|
91
|
-
onDone={onDone}
|
|
92
|
-
verbose={verbose}
|
|
93
|
-
/>
|
|
94
|
-
)
|
|
95
|
-
}
|
|
96
|
-
return (
|
|
97
|
-
<FilesystemPermissionRequestImpl
|
|
98
|
-
toolUseConfirm={toolUseConfirm}
|
|
99
|
-
path={path}
|
|
100
|
-
onDone={onDone}
|
|
101
|
-
verbose={verbose}
|
|
102
|
-
/>
|
|
103
|
-
)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function getDontAskAgainOptions(toolUseConfirm: ToolUseConfirm, path: string) {
|
|
107
|
-
if (toolUseConfirm.tool.isReadOnly()) {
|
|
108
|
-
// "Always allow" is not an option for read-only tools,
|
|
109
|
-
// because they always have write permission in the project directory.
|
|
110
|
-
return []
|
|
111
|
-
}
|
|
112
|
-
// Only show don't ask again option for edits in original working directory
|
|
113
|
-
return pathInOriginalCwd(path)
|
|
114
|
-
? [
|
|
115
|
-
{
|
|
116
|
-
label: "Yes, and don't ask again for file edits this session",
|
|
117
|
-
value: 'yes-dont-ask-again',
|
|
118
|
-
},
|
|
119
|
-
]
|
|
120
|
-
: []
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
type Props = {
|
|
124
|
-
toolUseConfirm: ToolUseConfirm
|
|
125
|
-
path: string
|
|
126
|
-
onDone(): void
|
|
127
|
-
verbose: boolean
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function FilesystemPermissionRequestImpl({
|
|
131
|
-
toolUseConfirm,
|
|
132
|
-
path,
|
|
133
|
-
onDone,
|
|
134
|
-
verbose,
|
|
135
|
-
}: Props): React.ReactNode {
|
|
136
|
-
const userFacingName = toolUseConfirm.tool.userFacingName()
|
|
137
|
-
|
|
138
|
-
const userFacingReadOrWrite = toolUseConfirm.tool.isReadOnly()
|
|
139
|
-
? 'Read'
|
|
140
|
-
: 'Edit'
|
|
141
|
-
const title = `${userFacingReadOrWrite} ${isMultiFile(toolUseConfirm) ? 'files' : 'file'}`
|
|
142
|
-
|
|
143
|
-
const unaryEvent = useMemo<UnaryEvent>(
|
|
144
|
-
() => ({
|
|
145
|
-
completion_type: 'tool_use_single',
|
|
146
|
-
language_name: 'none',
|
|
147
|
-
}),
|
|
148
|
-
[],
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
usePermissionRequestLogging(toolUseConfirm, unaryEvent)
|
|
152
|
-
|
|
153
|
-
return (
|
|
154
|
-
<Box
|
|
155
|
-
flexDirection="column"
|
|
156
|
-
borderStyle="round"
|
|
157
|
-
borderColor={textColorForRiskScore(toolUseConfirm.riskScore)}
|
|
158
|
-
marginTop={1}
|
|
159
|
-
paddingLeft={1}
|
|
160
|
-
paddingRight={1}
|
|
161
|
-
paddingBottom={1}
|
|
162
|
-
>
|
|
163
|
-
<PermissionRequestTitle
|
|
164
|
-
title={title}
|
|
165
|
-
riskScore={toolUseConfirm.riskScore}
|
|
166
|
-
/>
|
|
167
|
-
<Box flexDirection="column" paddingX={2} paddingY={1}>
|
|
168
|
-
<Text>
|
|
169
|
-
{userFacingName}(
|
|
170
|
-
{toolUseConfirm.tool.renderToolUseMessage(
|
|
171
|
-
toolUseConfirm.input as never,
|
|
172
|
-
{ verbose },
|
|
173
|
-
)}
|
|
174
|
-
)
|
|
175
|
-
</Text>
|
|
176
|
-
</Box>
|
|
177
|
-
|
|
178
|
-
<Box flexDirection="column">
|
|
179
|
-
<Text>Do you want to proceed?</Text>
|
|
180
|
-
<Select
|
|
181
|
-
options={[
|
|
182
|
-
{
|
|
183
|
-
label: 'Yes',
|
|
184
|
-
value: 'yes',
|
|
185
|
-
},
|
|
186
|
-
...getDontAskAgainOptions(toolUseConfirm, path),
|
|
187
|
-
{
|
|
188
|
-
label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,
|
|
189
|
-
value: 'no',
|
|
190
|
-
},
|
|
191
|
-
]}
|
|
192
|
-
onChange={newValue => {
|
|
193
|
-
switch (newValue) {
|
|
194
|
-
case 'yes':
|
|
195
|
-
logUnaryEvent({
|
|
196
|
-
completion_type: 'tool_use_single',
|
|
197
|
-
event: 'accept',
|
|
198
|
-
metadata: {
|
|
199
|
-
language_name: 'none',
|
|
200
|
-
message_id: toolUseConfirm.assistantMessage.message.id,
|
|
201
|
-
platform: env.platform,
|
|
202
|
-
},
|
|
203
|
-
})
|
|
204
|
-
toolUseConfirm.onAllow('temporary')
|
|
205
|
-
onDone()
|
|
206
|
-
break
|
|
207
|
-
case 'yes-dont-ask-again':
|
|
208
|
-
logUnaryEvent({
|
|
209
|
-
completion_type: 'tool_use_single',
|
|
210
|
-
event: 'accept',
|
|
211
|
-
metadata: {
|
|
212
|
-
language_name: 'none',
|
|
213
|
-
message_id: toolUseConfirm.assistantMessage.message.id,
|
|
214
|
-
platform: env.platform,
|
|
215
|
-
},
|
|
216
|
-
})
|
|
217
|
-
grantWritePermissionForOriginalDir()
|
|
218
|
-
toolUseConfirm.onAllow('permanent')
|
|
219
|
-
onDone()
|
|
220
|
-
break
|
|
221
|
-
case 'no':
|
|
222
|
-
logUnaryEvent({
|
|
223
|
-
completion_type: 'tool_use_single',
|
|
224
|
-
event: 'reject',
|
|
225
|
-
metadata: {
|
|
226
|
-
language_name: 'none',
|
|
227
|
-
message_id: toolUseConfirm.assistantMessage.message.id,
|
|
228
|
-
platform: env.platform,
|
|
229
|
-
},
|
|
230
|
-
})
|
|
231
|
-
toolUseConfirm.onReject()
|
|
232
|
-
onDone()
|
|
233
|
-
break
|
|
234
|
-
}
|
|
235
|
-
}}
|
|
236
|
-
/>
|
|
237
|
-
</Box>
|
|
238
|
-
</Box>
|
|
239
|
-
)
|
|
240
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { useInput } from 'ink'
|
|
2
|
-
import * as React from 'react'
|
|
3
|
-
import { Tool } from '../../Tool'
|
|
4
|
-
import { AssistantMessage } from '../../query'
|
|
5
|
-
import { FileEditTool } from '../../tools/FileEditTool/FileEditTool'
|
|
6
|
-
import { FileWriteTool } from '../../tools/FileWriteTool/FileWriteTool'
|
|
7
|
-
import { BashTool } from '../../tools/BashTool/BashTool'
|
|
8
|
-
import { FileEditPermissionRequest } from './FileEditPermissionRequest/FileEditPermissionRequest'
|
|
9
|
-
import { BashPermissionRequest } from './BashPermissionRequest/BashPermissionRequest'
|
|
10
|
-
import { FallbackPermissionRequest } from './FallbackPermissionRequest'
|
|
11
|
-
import { useNotifyAfterTimeout } from '../../hooks/useNotifyAfterTimeout'
|
|
12
|
-
import { FileWritePermissionRequest } from './FileWritePermissionRequest/FileWritePermissionRequest'
|
|
13
|
-
import { type CommandSubcommandPrefixResult } from '../../utils/commands'
|
|
14
|
-
import { FilesystemPermissionRequest } from './FilesystemPermissionRequest/FilesystemPermissionRequest'
|
|
15
|
-
import { NotebookEditTool } from '../../tools/NotebookEditTool/NotebookEditTool'
|
|
16
|
-
import { GlobTool } from '../../tools/GlobTool/GlobTool'
|
|
17
|
-
import { GrepTool } from '../../tools/GrepTool/GrepTool'
|
|
18
|
-
import { LSTool } from '../../tools/lsTool/lsTool'
|
|
19
|
-
import { FileReadTool } from '../../tools/FileReadTool/FileReadTool'
|
|
20
|
-
import { NotebookReadTool } from '../../tools/NotebookReadTool/NotebookReadTool'
|
|
21
|
-
import { PRODUCT_NAME } from '../../constants/product'
|
|
22
|
-
|
|
23
|
-
function permissionComponentForTool(tool: Tool) {
|
|
24
|
-
switch (tool) {
|
|
25
|
-
case FileEditTool:
|
|
26
|
-
return FileEditPermissionRequest
|
|
27
|
-
case FileWriteTool:
|
|
28
|
-
return FileWritePermissionRequest
|
|
29
|
-
case BashTool:
|
|
30
|
-
return BashPermissionRequest
|
|
31
|
-
case GlobTool:
|
|
32
|
-
case GrepTool:
|
|
33
|
-
case LSTool:
|
|
34
|
-
case FileReadTool:
|
|
35
|
-
case NotebookReadTool:
|
|
36
|
-
case NotebookEditTool:
|
|
37
|
-
return FilesystemPermissionRequest
|
|
38
|
-
default:
|
|
39
|
-
return FallbackPermissionRequest
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export type PermissionRequestProps = {
|
|
44
|
-
toolUseConfirm: ToolUseConfirm
|
|
45
|
-
onDone(): void
|
|
46
|
-
verbose: boolean
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function toolUseConfirmGetPrefix(
|
|
50
|
-
toolUseConfirm: ToolUseConfirm,
|
|
51
|
-
): string | null {
|
|
52
|
-
return (
|
|
53
|
-
(toolUseConfirm.commandPrefix &&
|
|
54
|
-
!(toolUseConfirm.commandPrefix as any).commandInjectionDetected &&
|
|
55
|
-
(toolUseConfirm.commandPrefix as any).commandPrefix) ||
|
|
56
|
-
null
|
|
57
|
-
)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export type ToolUseConfirm = {
|
|
61
|
-
assistantMessage: AssistantMessage
|
|
62
|
-
tool: Tool
|
|
63
|
-
description: string
|
|
64
|
-
input: { [key: string]: unknown }
|
|
65
|
-
commandPrefix: CommandSubcommandPrefixResult | null
|
|
66
|
-
// TODO: remove riskScore from ToolUseConfirm
|
|
67
|
-
riskScore: number | null
|
|
68
|
-
onAbort(): void
|
|
69
|
-
onAllow(type: 'permanent' | 'temporary'): void
|
|
70
|
-
onReject(): void
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// TODO: Move this to Tool.renderPermissionRequest
|
|
74
|
-
export function PermissionRequest({
|
|
75
|
-
toolUseConfirm,
|
|
76
|
-
onDone,
|
|
77
|
-
verbose,
|
|
78
|
-
}: PermissionRequestProps): React.ReactNode {
|
|
79
|
-
// Handle Ctrl+C
|
|
80
|
-
useInput((input, key) => {
|
|
81
|
-
if (key.ctrl && input === 'c') {
|
|
82
|
-
onDone()
|
|
83
|
-
toolUseConfirm.onReject()
|
|
84
|
-
}
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
const toolName = toolUseConfirm.tool.userFacingName?.() || 'Tool'
|
|
88
|
-
useNotifyAfterTimeout(
|
|
89
|
-
`${PRODUCT_NAME} needs your permission to use ${toolName}`,
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
const PermissionComponent = permissionComponentForTool(toolUseConfirm.tool)
|
|
93
|
-
|
|
94
|
-
return (
|
|
95
|
-
<PermissionComponent
|
|
96
|
-
toolUseConfirm={toolUseConfirm}
|
|
97
|
-
onDone={onDone}
|
|
98
|
-
verbose={verbose}
|
|
99
|
-
/>
|
|
100
|
-
)
|
|
101
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
import { Box, Text } from 'ink'
|
|
3
|
-
import { getTheme } from '../../utils/theme'
|
|
4
|
-
|
|
5
|
-
export type RiskScoreCategory = 'low' | 'moderate' | 'high'
|
|
6
|
-
|
|
7
|
-
export function categoryForRiskScore(riskScore: number): RiskScoreCategory {
|
|
8
|
-
return riskScore >= 70 ? 'high' : riskScore >= 30 ? 'moderate' : 'low'
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function colorSchemeForRiskScoreCategory(category: RiskScoreCategory): {
|
|
12
|
-
highlightColor: string
|
|
13
|
-
textColor: string
|
|
14
|
-
} {
|
|
15
|
-
const theme = getTheme()
|
|
16
|
-
switch (category) {
|
|
17
|
-
case 'low':
|
|
18
|
-
return {
|
|
19
|
-
highlightColor: theme.success,
|
|
20
|
-
textColor: theme.permission,
|
|
21
|
-
}
|
|
22
|
-
case 'moderate':
|
|
23
|
-
return {
|
|
24
|
-
highlightColor: theme.warning,
|
|
25
|
-
textColor: theme.warning,
|
|
26
|
-
}
|
|
27
|
-
case 'high':
|
|
28
|
-
return {
|
|
29
|
-
highlightColor: theme.error,
|
|
30
|
-
textColor: theme.error,
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function textColorForRiskScore(riskScore: number | null): string {
|
|
36
|
-
if (riskScore === null) {
|
|
37
|
-
return getTheme().permission
|
|
38
|
-
}
|
|
39
|
-
const category = categoryForRiskScore(riskScore)
|
|
40
|
-
return colorSchemeForRiskScoreCategory(category).textColor
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function PermissionRiskScore({
|
|
44
|
-
riskScore,
|
|
45
|
-
}: {
|
|
46
|
-
riskScore: number
|
|
47
|
-
}): React.ReactNode {
|
|
48
|
-
const category = categoryForRiskScore(riskScore)
|
|
49
|
-
return <Text color={textColorForRiskScore(riskScore)}>Risk: {category}</Text>
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
type Props = {
|
|
53
|
-
title: string
|
|
54
|
-
riskScore: number | null
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function PermissionRequestTitle({
|
|
58
|
-
title,
|
|
59
|
-
riskScore,
|
|
60
|
-
}: Props): React.ReactNode {
|
|
61
|
-
return (
|
|
62
|
-
<Box flexDirection="column">
|
|
63
|
-
<Text bold color={getTheme().permission}>
|
|
64
|
-
{title}
|
|
65
|
-
</Text>
|
|
66
|
-
{riskScore !== null && <PermissionRiskScore riskScore={riskScore} />}
|
|
67
|
-
</Box>
|
|
68
|
-
)
|
|
69
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { useEffect } from 'react'
|
|
2
|
-
import { logUnaryEvent, CompletionType } from '../../utils/unaryLogging'
|
|
3
|
-
import { ToolUseConfirm } from '../../components/permissions/PermissionRequest'
|
|
4
|
-
import { env } from '../../utils/env'
|
|
5
|
-
import { logEvent } from '../../services/statsig'
|
|
6
|
-
|
|
7
|
-
type UnaryEventType = {
|
|
8
|
-
completion_type: CompletionType
|
|
9
|
-
language_name: string | Promise<string>
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Logs permission request events using Statsig and unary logging.
|
|
14
|
-
* Handles both the Statsig event and the unary event logging.
|
|
15
|
-
* Can handle either a string or Promise<string> for language_name.
|
|
16
|
-
*/
|
|
17
|
-
export function usePermissionRequestLogging(
|
|
18
|
-
toolUseConfirm: ToolUseConfirm,
|
|
19
|
-
unaryEvent: UnaryEventType,
|
|
20
|
-
): void {
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
// Log Statsig event
|
|
23
|
-
logEvent('tengu_tool_use_show_permission_request', {
|
|
24
|
-
messageID: toolUseConfirm.assistantMessage.message.id,
|
|
25
|
-
toolName: toolUseConfirm.tool.name,
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
// Handle string or Promise language name
|
|
29
|
-
const languagePromise = Promise.resolve(unaryEvent.language_name)
|
|
30
|
-
|
|
31
|
-
// Log unary event once language is resolved
|
|
32
|
-
languagePromise.then(language => {
|
|
33
|
-
logUnaryEvent({
|
|
34
|
-
completion_type: unaryEvent.completion_type,
|
|
35
|
-
event: 'response',
|
|
36
|
-
metadata: {
|
|
37
|
-
language_name: language,
|
|
38
|
-
message_id: toolUseConfirm.assistantMessage.message.id,
|
|
39
|
-
platform: env.platform,
|
|
40
|
-
},
|
|
41
|
-
})
|
|
42
|
-
})
|
|
43
|
-
}, [toolUseConfirm, unaryEvent])
|
|
44
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { type Option } from '@inkjs/ui'
|
|
2
|
-
import chalk from 'chalk'
|
|
3
|
-
import {
|
|
4
|
-
type ToolUseConfirm,
|
|
5
|
-
toolUseConfirmGetPrefix,
|
|
6
|
-
} from './PermissionRequest.js'
|
|
7
|
-
import { isUnsafeCompoundCommand } from '../../utils/commands'
|
|
8
|
-
import { getCwd } from '../../utils/state'
|
|
9
|
-
import { getTheme } from '../../utils/theme'
|
|
10
|
-
import { type OptionSubtree } from '../CustomSelect/select'
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Generates options for the tool use confirmation dialog
|
|
14
|
-
*/
|
|
15
|
-
export function toolUseOptions({
|
|
16
|
-
toolUseConfirm,
|
|
17
|
-
command,
|
|
18
|
-
}: {
|
|
19
|
-
toolUseConfirm: ToolUseConfirm
|
|
20
|
-
command: string
|
|
21
|
-
}): (Option | OptionSubtree)[] {
|
|
22
|
-
// Hide "don't ask again" options if the command is an unsafe compound command, or a potential command injection
|
|
23
|
-
const showDontAskAgainOption =
|
|
24
|
-
!isUnsafeCompoundCommand(command) &&
|
|
25
|
-
toolUseConfirm.commandPrefix &&
|
|
26
|
-
!toolUseConfirm.commandPrefix.commandInjectionDetected
|
|
27
|
-
const prefix = toolUseConfirmGetPrefix(toolUseConfirm)
|
|
28
|
-
const showDontAskAgainPrefixOption = showDontAskAgainOption && prefix !== null
|
|
29
|
-
|
|
30
|
-
let dontShowAgainOptions: (Option | OptionSubtree)[] = []
|
|
31
|
-
if (showDontAskAgainPrefixOption) {
|
|
32
|
-
// Prefix option takes precedence over full command option
|
|
33
|
-
dontShowAgainOptions = [
|
|
34
|
-
{
|
|
35
|
-
label: `Yes, and don't ask again for ${chalk.bold(prefix)} commands in ${chalk.bold(getCwd())}`,
|
|
36
|
-
value: 'yes-dont-ask-again-prefix',
|
|
37
|
-
},
|
|
38
|
-
]
|
|
39
|
-
} else if (showDontAskAgainOption) {
|
|
40
|
-
dontShowAgainOptions = [
|
|
41
|
-
{
|
|
42
|
-
label: `Yes, and don't ask again for ${chalk.bold(command)} commands in ${chalk.bold(getCwd())}`,
|
|
43
|
-
value: 'yes-dont-ask-again-full',
|
|
44
|
-
},
|
|
45
|
-
]
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return [
|
|
49
|
-
{
|
|
50
|
-
label: 'Yes',
|
|
51
|
-
value: 'yes',
|
|
52
|
-
},
|
|
53
|
-
...dontShowAgainOptions,
|
|
54
|
-
{
|
|
55
|
-
label: `No, and provide instructions (${chalk.bold.hex(getTheme().warning)('esc')})`,
|
|
56
|
-
value: 'no',
|
|
57
|
-
},
|
|
58
|
-
]
|
|
59
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { env } from '../../utils/env'
|
|
2
|
-
import { CompletionType, logUnaryEvent } from '../../utils/unaryLogging'
|
|
3
|
-
import { ToolUseConfirm } from './PermissionRequest'
|
|
4
|
-
|
|
5
|
-
export function logUnaryPermissionEvent(
|
|
6
|
-
completion_type: CompletionType,
|
|
7
|
-
{
|
|
8
|
-
assistantMessage: {
|
|
9
|
-
message: { id: message_id },
|
|
10
|
-
},
|
|
11
|
-
}: ToolUseConfirm,
|
|
12
|
-
event: 'accept' | 'reject',
|
|
13
|
-
): void {
|
|
14
|
-
logUnaryEvent({
|
|
15
|
-
completion_type,
|
|
16
|
-
event,
|
|
17
|
-
metadata: {
|
|
18
|
-
language_name: 'none',
|
|
19
|
-
message_id,
|
|
20
|
-
platform: env.platform,
|
|
21
|
-
},
|
|
22
|
-
})
|
|
23
|
-
}
|
package/src/constants/betas.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export const GATE_TOKEN_EFFICIENT_TOOLS = 'tengu-token-efficient-tools'
|
|
2
|
-
export const BETA_HEADER_TOKEN_EFFICIENT_TOOLS =
|
|
3
|
-
'token-efficient-tools-2024-12-11'
|
|
4
|
-
export const GATE_USE_EXTERNAL_UPDATER = 'tengu-use-external-updater'
|
|
5
|
-
export const CLAUDE_CODE_20250219_BETA_HEADER = 'claude-code-20250219'
|