@shareai-lab/kode 1.1.14 → 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/cli.js +77 -82
- 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/index.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
// Unified CLI entry (lightweight)
|
|
2
|
-
// - Development: use `bun run src/entrypoints/cli.tsx`
|
|
3
|
-
// - Production: transpiled to `dist/index.js` and used as bin/main
|
|
4
|
-
|
|
5
|
-
import { createRequire } from 'module'
|
|
6
|
-
const require = createRequire(import.meta.url)
|
|
7
|
-
|
|
8
|
-
function hasFlag(...flags: string[]): boolean {
|
|
9
|
-
return process.argv.some(arg => flags.includes(arg))
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// Minimal pre-parse: handle version/help early without loading heavy UI modules
|
|
13
|
-
if (hasFlag('--version', '-v')) {
|
|
14
|
-
try {
|
|
15
|
-
const pkg = require('../package.json')
|
|
16
|
-
console.log(pkg.version || '')
|
|
17
|
-
} catch {
|
|
18
|
-
console.log('')
|
|
19
|
-
}
|
|
20
|
-
process.exit(0)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (hasFlag('--help-lite')) {
|
|
24
|
-
console.log(`Usage: kode [options] [command] [prompt]\n\n` +
|
|
25
|
-
`Common options:\n` +
|
|
26
|
-
` -h, --help Show full help\n` +
|
|
27
|
-
` -v, --version Show version\n` +
|
|
28
|
-
` -p, --print Print response and exit (non-interactive)\n` +
|
|
29
|
-
` -c, --cwd <cwd> Set working directory`)
|
|
30
|
-
process.exit(0)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// For compatibility, --help loads full CLI help
|
|
34
|
-
await import('./entrypoints/cli.js')
|
package/src/messages.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import type { Message } from './query'
|
|
3
|
-
|
|
4
|
-
let getMessages: () => Message[] = () => []
|
|
5
|
-
let setMessages: React.Dispatch<React.SetStateAction<Message[]>> = () => {}
|
|
6
|
-
|
|
7
|
-
export function setMessagesGetter(getter: () => Message[]) {
|
|
8
|
-
getMessages = getter
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function getMessagesGetter(): () => Message[] {
|
|
12
|
-
return getMessages
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function setMessagesSetter(
|
|
16
|
-
setter: React.Dispatch<React.SetStateAction<Message[]>>,
|
|
17
|
-
) {
|
|
18
|
-
setMessages = setter
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function getMessagesSetter(): React.Dispatch<
|
|
22
|
-
React.SetStateAction<Message[]>
|
|
23
|
-
> {
|
|
24
|
-
return setMessages
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Global UI refresh mechanism for model configuration changes
|
|
28
|
-
let onModelConfigChange: (() => void) | null = null
|
|
29
|
-
|
|
30
|
-
export function setModelConfigChangeHandler(handler: () => void) {
|
|
31
|
-
onModelConfigChange = handler
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function triggerModelConfigChange() {
|
|
35
|
-
if (onModelConfigChange) {
|
|
36
|
-
onModelConfigChange()
|
|
37
|
-
}
|
|
38
|
-
}
|
package/src/permissions.ts
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import type { CanUseToolFn } from './hooks/useCanUseTool'
|
|
2
|
-
import { Tool, ToolUseContext } from './Tool'
|
|
3
|
-
import { BashTool, inputSchema } from './tools/BashTool/BashTool'
|
|
4
|
-
import { FileEditTool } from './tools/FileEditTool/FileEditTool'
|
|
5
|
-
import { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'
|
|
6
|
-
import { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool'
|
|
7
|
-
import { getCommandSubcommandPrefix, splitCommand } from './utils/commands'
|
|
8
|
-
import {
|
|
9
|
-
getCurrentProjectConfig,
|
|
10
|
-
saveCurrentProjectConfig,
|
|
11
|
-
} from './utils/config.js'
|
|
12
|
-
import { AbortError } from './utils/errors'
|
|
13
|
-
import { logError } from './utils/log'
|
|
14
|
-
import { grantWritePermissionForOriginalDir } from './utils/permissions/filesystem'
|
|
15
|
-
import { getCwd } from './utils/state'
|
|
16
|
-
import { PRODUCT_NAME } from './constants/product'
|
|
17
|
-
|
|
18
|
-
// Commands that are known to be safe for execution
|
|
19
|
-
const SAFE_COMMANDS = new Set([
|
|
20
|
-
'git status',
|
|
21
|
-
'git diff',
|
|
22
|
-
'git log',
|
|
23
|
-
'git branch',
|
|
24
|
-
'pwd',
|
|
25
|
-
'tree',
|
|
26
|
-
'date',
|
|
27
|
-
'which',
|
|
28
|
-
])
|
|
29
|
-
|
|
30
|
-
export const bashToolCommandHasExactMatchPermission = (
|
|
31
|
-
tool: Tool,
|
|
32
|
-
command: string,
|
|
33
|
-
allowedTools: string[],
|
|
34
|
-
): boolean => {
|
|
35
|
-
if (SAFE_COMMANDS.has(command)) {
|
|
36
|
-
return true
|
|
37
|
-
}
|
|
38
|
-
// Check exact match first
|
|
39
|
-
if (allowedTools.includes(getPermissionKey(tool, { command }, null))) {
|
|
40
|
-
return true
|
|
41
|
-
}
|
|
42
|
-
// Check if command is an exact match with an approved prefix
|
|
43
|
-
if (allowedTools.includes(getPermissionKey(tool, { command }, command))) {
|
|
44
|
-
return true
|
|
45
|
-
}
|
|
46
|
-
return false
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export const bashToolCommandHasPermission = (
|
|
50
|
-
tool: Tool,
|
|
51
|
-
command: string,
|
|
52
|
-
prefix: string | null,
|
|
53
|
-
allowedTools: string[],
|
|
54
|
-
): boolean => {
|
|
55
|
-
// Check exact match first
|
|
56
|
-
if (bashToolCommandHasExactMatchPermission(tool, command, allowedTools)) {
|
|
57
|
-
return true
|
|
58
|
-
}
|
|
59
|
-
return allowedTools.includes(getPermissionKey(tool, { command }, prefix))
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export const bashToolHasPermission = async (
|
|
63
|
-
tool: Tool,
|
|
64
|
-
command: string,
|
|
65
|
-
context: ToolUseContext,
|
|
66
|
-
allowedTools: string[],
|
|
67
|
-
getCommandSubcommandPrefixFn = getCommandSubcommandPrefix,
|
|
68
|
-
): Promise<PermissionResult> => {
|
|
69
|
-
if (bashToolCommandHasExactMatchPermission(tool, command, allowedTools)) {
|
|
70
|
-
// This is an exact match for a command that is allowed, so we can skip the prefix check
|
|
71
|
-
return { result: true }
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const subCommands = splitCommand(command).filter(_ => {
|
|
75
|
-
// Denim likes to add this, we strip it out so we don't need to prompt the user each time
|
|
76
|
-
if (_ === `cd ${getCwd()}`) {
|
|
77
|
-
return false
|
|
78
|
-
}
|
|
79
|
-
return true
|
|
80
|
-
})
|
|
81
|
-
const commandSubcommandPrefix = await getCommandSubcommandPrefixFn(
|
|
82
|
-
command,
|
|
83
|
-
context.abortController.signal,
|
|
84
|
-
)
|
|
85
|
-
if (context.abortController.signal.aborted) {
|
|
86
|
-
throw new AbortError()
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (commandSubcommandPrefix === null) {
|
|
90
|
-
// Fail closed and ask for user approval if the command prefix query failed (e.g. due to network error)
|
|
91
|
-
// This is NOT the same as `fullCommandPrefix.commandPrefix === null`, which means no prefix was detected
|
|
92
|
-
return {
|
|
93
|
-
result: false,
|
|
94
|
-
message: `${PRODUCT_NAME} requested permissions to use ${tool.name}, but you haven't granted it yet.`,
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (commandSubcommandPrefix.commandInjectionDetected) {
|
|
99
|
-
// Only allow exact matches for potential command injections
|
|
100
|
-
if (bashToolCommandHasExactMatchPermission(tool, command, allowedTools)) {
|
|
101
|
-
return { result: true }
|
|
102
|
-
} else {
|
|
103
|
-
return {
|
|
104
|
-
result: false,
|
|
105
|
-
message: `${PRODUCT_NAME} requested permissions to use ${tool.name}, but you haven't granted it yet.`,
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// If there is only one command, no need to process subCommands
|
|
111
|
-
if (subCommands.length < 2) {
|
|
112
|
-
if (
|
|
113
|
-
bashToolCommandHasPermission(
|
|
114
|
-
tool,
|
|
115
|
-
command,
|
|
116
|
-
commandSubcommandPrefix.commandPrefix,
|
|
117
|
-
allowedTools,
|
|
118
|
-
)
|
|
119
|
-
) {
|
|
120
|
-
return { result: true }
|
|
121
|
-
} else {
|
|
122
|
-
return {
|
|
123
|
-
result: false,
|
|
124
|
-
message: `${PRODUCT_NAME} requested permissions to use ${tool.name}, but you haven't granted it yet.`,
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (
|
|
129
|
-
subCommands.every(subCommand => {
|
|
130
|
-
const prefixResult =
|
|
131
|
-
commandSubcommandPrefix.subcommandPrefixes.get(subCommand)
|
|
132
|
-
if (prefixResult === undefined || prefixResult.commandInjectionDetected) {
|
|
133
|
-
// If prefix result is missing or command injection is detected, always ask for permission
|
|
134
|
-
return false
|
|
135
|
-
}
|
|
136
|
-
const hasPermission = bashToolCommandHasPermission(
|
|
137
|
-
tool,
|
|
138
|
-
subCommand,
|
|
139
|
-
prefixResult ? prefixResult.commandPrefix : null,
|
|
140
|
-
allowedTools,
|
|
141
|
-
)
|
|
142
|
-
return hasPermission
|
|
143
|
-
})
|
|
144
|
-
) {
|
|
145
|
-
return { result: true }
|
|
146
|
-
}
|
|
147
|
-
return {
|
|
148
|
-
result: false,
|
|
149
|
-
message: `${PRODUCT_NAME} requested permissions to use ${tool.name}, but you haven't granted it yet.`,
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
type PermissionResult = { result: true } | { result: false; message: string }
|
|
154
|
-
|
|
155
|
-
export const hasPermissionsToUseTool: CanUseToolFn = async (
|
|
156
|
-
tool,
|
|
157
|
-
input,
|
|
158
|
-
context,
|
|
159
|
-
_assistantMessage,
|
|
160
|
-
): Promise<PermissionResult> => {
|
|
161
|
-
// If safe mode is not enabled, allow all tools (permissive by default)
|
|
162
|
-
if (!context.options.safeMode) {
|
|
163
|
-
return { result: true }
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
if (context.abortController.signal.aborted) {
|
|
167
|
-
throw new AbortError()
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Check if the tool needs permissions
|
|
171
|
-
try {
|
|
172
|
-
if (!tool.needsPermissions(input as never)) {
|
|
173
|
-
return { result: true }
|
|
174
|
-
}
|
|
175
|
-
} catch (e) {
|
|
176
|
-
logError(`Error checking permissions: ${e}`)
|
|
177
|
-
return { result: false, message: 'Error checking permissions' }
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const projectConfig = getCurrentProjectConfig()
|
|
181
|
-
const allowedTools = projectConfig.allowedTools ?? []
|
|
182
|
-
// Special case for BashTool to allow blanket commands without exposing them in the UI
|
|
183
|
-
if (tool === BashTool && allowedTools.includes(BashTool.name)) {
|
|
184
|
-
return { result: true }
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// TODO: Move this into tool definitions (done for read tools!)
|
|
188
|
-
switch (tool) {
|
|
189
|
-
// For bash tool, check each sub-command's permissions separately
|
|
190
|
-
case BashTool: {
|
|
191
|
-
// The types have already been validated by the tool,
|
|
192
|
-
// so we can safely parse the input (as opposed to safeParse).
|
|
193
|
-
const { command } = inputSchema.parse(input)
|
|
194
|
-
return await bashToolHasPermission(tool, command, context, allowedTools)
|
|
195
|
-
}
|
|
196
|
-
// For file editing tools, check session-only permissions
|
|
197
|
-
case FileEditTool:
|
|
198
|
-
case FileWriteTool:
|
|
199
|
-
case NotebookEditTool: {
|
|
200
|
-
// The types have already been validated by the tool,
|
|
201
|
-
// so we can safely pass this in
|
|
202
|
-
if (!tool.needsPermissions(input)) {
|
|
203
|
-
return { result: true }
|
|
204
|
-
}
|
|
205
|
-
return {
|
|
206
|
-
result: false,
|
|
207
|
-
message: `${PRODUCT_NAME} requested permissions to use ${tool.name}, but you haven't granted it yet.`,
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// For other tools, check persistent permissions
|
|
211
|
-
default: {
|
|
212
|
-
const permissionKey = getPermissionKey(tool, input, null)
|
|
213
|
-
if (allowedTools.includes(permissionKey)) {
|
|
214
|
-
return { result: true }
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return {
|
|
218
|
-
result: false,
|
|
219
|
-
message: `${PRODUCT_NAME} requested permissions to use ${tool.name}, but you haven't granted it yet.`,
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
export async function savePermission(
|
|
226
|
-
tool: Tool,
|
|
227
|
-
input: { [k: string]: unknown },
|
|
228
|
-
prefix: string | null,
|
|
229
|
-
): Promise<void> {
|
|
230
|
-
const key = getPermissionKey(tool, input, prefix)
|
|
231
|
-
|
|
232
|
-
// For file editing tools, store write permissions only in memory
|
|
233
|
-
if (
|
|
234
|
-
tool === FileEditTool ||
|
|
235
|
-
tool === FileWriteTool ||
|
|
236
|
-
tool === NotebookEditTool
|
|
237
|
-
) {
|
|
238
|
-
grantWritePermissionForOriginalDir()
|
|
239
|
-
return
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// For other tools, store permissions on disk
|
|
243
|
-
const projectConfig = getCurrentProjectConfig()
|
|
244
|
-
if (projectConfig.allowedTools.includes(key)) {
|
|
245
|
-
return
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
projectConfig.allowedTools.push(key)
|
|
249
|
-
projectConfig.allowedTools.sort()
|
|
250
|
-
|
|
251
|
-
saveCurrentProjectConfig(projectConfig)
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function getPermissionKey(
|
|
255
|
-
tool: Tool,
|
|
256
|
-
input: { [k: string]: unknown },
|
|
257
|
-
prefix: string | null,
|
|
258
|
-
): string {
|
|
259
|
-
switch (tool) {
|
|
260
|
-
case BashTool:
|
|
261
|
-
if (prefix) {
|
|
262
|
-
return `${BashTool.name}(${prefix}:*)`
|
|
263
|
-
}
|
|
264
|
-
return `${BashTool.name}(${BashTool.renderToolUseMessage(input as never)})`
|
|
265
|
-
default:
|
|
266
|
-
return tool.name
|
|
267
|
-
}
|
|
268
|
-
}
|