@shareai-lab/kode 1.0.70 → 1.0.71
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/README.md +202 -76
- package/README.zh-CN.md +246 -0
- package/cli.js +62 -0
- package/package.json +45 -25
- package/scripts/postinstall.js +56 -0
- package/src/ProjectOnboarding.tsx +180 -0
- package/src/Tool.ts +53 -0
- package/src/commands/approvedTools.ts +53 -0
- package/src/commands/bug.tsx +20 -0
- package/src/commands/clear.ts +43 -0
- package/src/commands/compact.ts +120 -0
- package/src/commands/config.tsx +19 -0
- package/src/commands/cost.ts +18 -0
- package/src/commands/ctx_viz.ts +209 -0
- package/src/commands/doctor.ts +24 -0
- package/src/commands/help.tsx +19 -0
- package/src/commands/init.ts +37 -0
- package/src/commands/listen.ts +42 -0
- package/src/commands/login.tsx +51 -0
- package/src/commands/logout.tsx +40 -0
- package/src/commands/mcp.ts +41 -0
- package/src/commands/model.tsx +40 -0
- package/src/commands/modelstatus.tsx +20 -0
- package/src/commands/onboarding.tsx +34 -0
- package/src/commands/pr_comments.ts +59 -0
- package/src/commands/refreshCommands.ts +54 -0
- package/src/commands/release-notes.ts +34 -0
- package/src/commands/resume.tsx +30 -0
- package/src/commands/review.ts +49 -0
- package/src/commands/terminalSetup.ts +221 -0
- package/src/commands.ts +136 -0
- package/src/components/ApproveApiKey.tsx +93 -0
- package/src/components/AsciiLogo.tsx +13 -0
- package/src/components/AutoUpdater.tsx +148 -0
- package/src/components/Bug.tsx +367 -0
- package/src/components/Config.tsx +289 -0
- package/src/components/ConsoleOAuthFlow.tsx +326 -0
- package/src/components/Cost.tsx +23 -0
- package/src/components/CostThresholdDialog.tsx +46 -0
- package/src/components/CustomSelect/option-map.ts +42 -0
- package/src/components/CustomSelect/select-option.tsx +52 -0
- package/src/components/CustomSelect/select.tsx +143 -0
- package/src/components/CustomSelect/use-select-state.ts +414 -0
- package/src/components/CustomSelect/use-select.ts +35 -0
- package/src/components/FallbackToolUseRejectedMessage.tsx +15 -0
- package/src/components/FileEditToolUpdatedMessage.tsx +66 -0
- package/src/components/Help.tsx +215 -0
- package/src/components/HighlightedCode.tsx +33 -0
- package/src/components/InvalidConfigDialog.tsx +113 -0
- package/src/components/Link.tsx +32 -0
- package/src/components/LogSelector.tsx +86 -0
- package/src/components/Logo.tsx +145 -0
- package/src/components/MCPServerApprovalDialog.tsx +100 -0
- package/src/components/MCPServerDialogCopy.tsx +25 -0
- package/src/components/MCPServerMultiselectDialog.tsx +109 -0
- package/src/components/Message.tsx +219 -0
- package/src/components/MessageResponse.tsx +15 -0
- package/src/components/MessageSelector.tsx +211 -0
- package/src/components/ModeIndicator.tsx +88 -0
- package/src/components/ModelConfig.tsx +301 -0
- package/src/components/ModelListManager.tsx +223 -0
- package/src/components/ModelSelector.tsx +3208 -0
- package/src/components/ModelStatusDisplay.tsx +228 -0
- package/src/components/Onboarding.tsx +274 -0
- package/src/components/PressEnterToContinue.tsx +11 -0
- package/src/components/PromptInput.tsx +710 -0
- package/src/components/SentryErrorBoundary.ts +33 -0
- package/src/components/Spinner.tsx +129 -0
- package/src/components/StructuredDiff.tsx +184 -0
- package/src/components/TextInput.tsx +246 -0
- package/src/components/TokenWarning.tsx +31 -0
- package/src/components/ToolUseLoader.tsx +40 -0
- package/src/components/TrustDialog.tsx +106 -0
- package/src/components/binary-feedback/BinaryFeedback.tsx +63 -0
- package/src/components/binary-feedback/BinaryFeedbackOption.tsx +111 -0
- package/src/components/binary-feedback/BinaryFeedbackView.tsx +172 -0
- package/src/components/binary-feedback/utils.ts +220 -0
- package/src/components/messages/AssistantBashOutputMessage.tsx +22 -0
- package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +45 -0
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +19 -0
- package/src/components/messages/AssistantTextMessage.tsx +144 -0
- package/src/components/messages/AssistantThinkingMessage.tsx +40 -0
- package/src/components/messages/AssistantToolUseMessage.tsx +123 -0
- package/src/components/messages/UserBashInputMessage.tsx +28 -0
- package/src/components/messages/UserCommandMessage.tsx +30 -0
- package/src/components/messages/UserKodingInputMessage.tsx +28 -0
- package/src/components/messages/UserPromptMessage.tsx +35 -0
- package/src/components/messages/UserTextMessage.tsx +39 -0
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +12 -0
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +36 -0
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +31 -0
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +57 -0
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +35 -0
- package/src/components/messages/UserToolResultMessage/utils.tsx +56 -0
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +121 -0
- package/src/components/permissions/FallbackPermissionRequest.tsx +155 -0
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
- package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +75 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +164 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +81 -0
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +242 -0
- package/src/components/permissions/PermissionRequest.tsx +103 -0
- package/src/components/permissions/PermissionRequestTitle.tsx +69 -0
- package/src/components/permissions/hooks.ts +44 -0
- package/src/components/permissions/toolUseOptions.ts +59 -0
- package/src/components/permissions/utils.ts +23 -0
- package/src/constants/betas.ts +5 -0
- package/src/constants/claude-asterisk-ascii-art.tsx +238 -0
- package/src/constants/figures.ts +4 -0
- package/src/constants/keys.ts +3 -0
- package/src/constants/macros.ts +6 -0
- package/src/constants/models.ts +935 -0
- package/src/constants/oauth.ts +18 -0
- package/src/constants/product.ts +17 -0
- package/src/constants/prompts.ts +177 -0
- package/src/constants/releaseNotes.ts +7 -0
- package/src/context/PermissionContext.tsx +149 -0
- package/src/context.ts +278 -0
- package/src/cost-tracker.ts +84 -0
- package/src/entrypoints/cli.tsx +1498 -0
- package/src/entrypoints/mcp.ts +176 -0
- package/src/history.ts +25 -0
- package/src/hooks/useApiKeyVerification.ts +59 -0
- package/src/hooks/useArrowKeyHistory.ts +55 -0
- package/src/hooks/useCanUseTool.ts +138 -0
- package/src/hooks/useCancelRequest.ts +39 -0
- package/src/hooks/useDoublePress.ts +42 -0
- package/src/hooks/useExitOnCtrlCD.ts +31 -0
- package/src/hooks/useInterval.ts +25 -0
- package/src/hooks/useLogMessages.ts +16 -0
- package/src/hooks/useLogStartupTime.ts +12 -0
- package/src/hooks/useNotifyAfterTimeout.ts +65 -0
- package/src/hooks/usePermissionRequestLogging.ts +44 -0
- package/src/hooks/useSlashCommandTypeahead.ts +137 -0
- package/src/hooks/useTerminalSize.ts +49 -0
- package/src/hooks/useTextInput.ts +315 -0
- package/src/messages.ts +37 -0
- package/src/permissions.ts +268 -0
- package/src/query.ts +704 -0
- package/src/screens/ConfigureNpmPrefix.tsx +197 -0
- package/src/screens/Doctor.tsx +219 -0
- package/src/screens/LogList.tsx +68 -0
- package/src/screens/REPL.tsx +792 -0
- package/src/screens/ResumeConversation.tsx +68 -0
- package/src/services/browserMocks.ts +66 -0
- package/src/services/claude.ts +1947 -0
- package/src/services/customCommands.ts +683 -0
- package/src/services/fileFreshness.ts +377 -0
- package/src/services/mcpClient.ts +564 -0
- package/src/services/mcpServerApproval.tsx +50 -0
- package/src/services/notifier.ts +40 -0
- package/src/services/oauth.ts +357 -0
- package/src/services/openai.ts +796 -0
- package/src/services/sentry.ts +3 -0
- package/src/services/statsig.ts +171 -0
- package/src/services/statsigStorage.ts +86 -0
- package/src/services/systemReminder.ts +406 -0
- package/src/services/vcr.ts +161 -0
- package/src/tools/ArchitectTool/ArchitectTool.tsx +122 -0
- package/src/tools/ArchitectTool/prompt.ts +15 -0
- package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +505 -0
- package/src/tools/BashTool/BashTool.tsx +270 -0
- package/src/tools/BashTool/BashToolResultMessage.tsx +38 -0
- package/src/tools/BashTool/OutputLine.tsx +48 -0
- package/src/tools/BashTool/prompt.ts +174 -0
- package/src/tools/BashTool/utils.ts +56 -0
- package/src/tools/FileEditTool/FileEditTool.tsx +316 -0
- package/src/tools/FileEditTool/prompt.ts +51 -0
- package/src/tools/FileEditTool/utils.ts +58 -0
- package/src/tools/FileReadTool/FileReadTool.tsx +371 -0
- package/src/tools/FileReadTool/prompt.ts +7 -0
- package/src/tools/FileWriteTool/FileWriteTool.tsx +297 -0
- package/src/tools/FileWriteTool/prompt.ts +10 -0
- package/src/tools/GlobTool/GlobTool.tsx +119 -0
- package/src/tools/GlobTool/prompt.ts +8 -0
- package/src/tools/GrepTool/GrepTool.tsx +147 -0
- package/src/tools/GrepTool/prompt.ts +11 -0
- package/src/tools/MCPTool/MCPTool.tsx +106 -0
- package/src/tools/MCPTool/prompt.ts +3 -0
- package/src/tools/MemoryReadTool/MemoryReadTool.tsx +127 -0
- package/src/tools/MemoryReadTool/prompt.ts +3 -0
- package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +89 -0
- package/src/tools/MemoryWriteTool/prompt.ts +3 -0
- package/src/tools/MultiEditTool/MultiEditTool.tsx +366 -0
- package/src/tools/MultiEditTool/prompt.ts +45 -0
- package/src/tools/NotebookEditTool/NotebookEditTool.tsx +298 -0
- package/src/tools/NotebookEditTool/prompt.ts +3 -0
- package/src/tools/NotebookReadTool/NotebookReadTool.tsx +266 -0
- package/src/tools/NotebookReadTool/prompt.ts +3 -0
- package/src/tools/StickerRequestTool/StickerRequestTool.tsx +93 -0
- package/src/tools/StickerRequestTool/prompt.ts +19 -0
- package/src/tools/TaskTool/TaskTool.tsx +382 -0
- package/src/tools/TaskTool/constants.ts +1 -0
- package/src/tools/TaskTool/prompt.ts +56 -0
- package/src/tools/ThinkTool/ThinkTool.tsx +56 -0
- package/src/tools/ThinkTool/prompt.ts +12 -0
- package/src/tools/TodoWriteTool/TodoWriteTool.tsx +289 -0
- package/src/tools/TodoWriteTool/prompt.ts +63 -0
- package/src/tools/lsTool/lsTool.tsx +269 -0
- package/src/tools/lsTool/prompt.ts +2 -0
- package/src/tools.ts +63 -0
- package/src/types/PermissionMode.ts +120 -0
- package/src/types/RequestContext.ts +72 -0
- package/src/utils/Cursor.ts +436 -0
- package/src/utils/PersistentShell.ts +373 -0
- package/src/utils/agentStorage.ts +97 -0
- package/src/utils/array.ts +3 -0
- package/src/utils/ask.tsx +98 -0
- package/src/utils/auth.ts +13 -0
- package/src/utils/autoCompactCore.ts +223 -0
- package/src/utils/autoUpdater.ts +318 -0
- package/src/utils/betas.ts +20 -0
- package/src/utils/browser.ts +14 -0
- package/src/utils/cleanup.ts +72 -0
- package/src/utils/commands.ts +261 -0
- package/src/utils/config.ts +771 -0
- package/src/utils/conversationRecovery.ts +54 -0
- package/src/utils/debugLogger.ts +1123 -0
- package/src/utils/diff.ts +42 -0
- package/src/utils/env.ts +57 -0
- package/src/utils/errors.ts +21 -0
- package/src/utils/exampleCommands.ts +108 -0
- package/src/utils/execFileNoThrow.ts +51 -0
- package/src/utils/expertChatStorage.ts +136 -0
- package/src/utils/file.ts +402 -0
- package/src/utils/fileRecoveryCore.ts +71 -0
- package/src/utils/format.tsx +44 -0
- package/src/utils/generators.ts +62 -0
- package/src/utils/git.ts +92 -0
- package/src/utils/globalLogger.ts +77 -0
- package/src/utils/http.ts +10 -0
- package/src/utils/imagePaste.ts +38 -0
- package/src/utils/json.ts +13 -0
- package/src/utils/log.ts +382 -0
- package/src/utils/markdown.ts +213 -0
- package/src/utils/messageContextManager.ts +289 -0
- package/src/utils/messages.tsx +938 -0
- package/src/utils/model.ts +836 -0
- package/src/utils/permissions/filesystem.ts +118 -0
- package/src/utils/ripgrep.ts +167 -0
- package/src/utils/sessionState.ts +49 -0
- package/src/utils/state.ts +25 -0
- package/src/utils/style.ts +29 -0
- package/src/utils/terminal.ts +49 -0
- package/src/utils/theme.ts +122 -0
- package/src/utils/thinking.ts +144 -0
- package/src/utils/todoStorage.ts +431 -0
- package/src/utils/tokens.ts +43 -0
- package/src/utils/toolExecutionController.ts +163 -0
- package/src/utils/unaryLogging.ts +26 -0
- package/src/utils/user.ts +37 -0
- package/src/utils/validate.ts +165 -0
- package/cli.mjs +0 -1803
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createHash, type UUID } from 'crypto'
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'fs'
|
|
3
|
+
import { dirname } from 'path'
|
|
4
|
+
import type { AssistantMessage, UserMessage } from '../query'
|
|
5
|
+
import { existsSync } from 'fs'
|
|
6
|
+
import { env } from '../utils/env'
|
|
7
|
+
import { getCwd } from '../utils/state'
|
|
8
|
+
import * as path from 'path'
|
|
9
|
+
import { mapValues } from 'lodash-es'
|
|
10
|
+
import type { ContentBlock } from '@anthropic-ai/sdk/resources/index.mjs'
|
|
11
|
+
|
|
12
|
+
export async function withVCR(
|
|
13
|
+
messages: (UserMessage | AssistantMessage)[],
|
|
14
|
+
f: () => Promise<AssistantMessage>,
|
|
15
|
+
): Promise<AssistantMessage> {
|
|
16
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
17
|
+
return await f()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const dehydratedInput = mapMessages(
|
|
21
|
+
messages.map(_ => _.message.content),
|
|
22
|
+
dehydrateValue,
|
|
23
|
+
)
|
|
24
|
+
const filename = `./fixtures/${dehydratedInput.map(_ => createHash('sha1').update(JSON.stringify(_)).digest('hex').slice(0, 6)).join('-')}.json`
|
|
25
|
+
|
|
26
|
+
// Fetch cached fixture
|
|
27
|
+
if (existsSync(filename)) {
|
|
28
|
+
const cached = JSON.parse(readFileSync(filename, 'utf-8'))
|
|
29
|
+
return mapAssistantMessage(cached.output, hydrateValue)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (env.isCI) {
|
|
33
|
+
console.warn(
|
|
34
|
+
`Anthropic API fixture missing. Re-run npm test locally, then commit the result. ${JSON.stringify({ input: dehydratedInput }, null, 2)}`,
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Create & write new fixture
|
|
39
|
+
const result = await f()
|
|
40
|
+
if (env.isCI) {
|
|
41
|
+
return result
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!existsSync(dirname(filename))) {
|
|
45
|
+
mkdirSync(dirname(filename), { recursive: true })
|
|
46
|
+
}
|
|
47
|
+
writeFileSync(
|
|
48
|
+
filename,
|
|
49
|
+
JSON.stringify(
|
|
50
|
+
{
|
|
51
|
+
input: dehydratedInput,
|
|
52
|
+
output: mapAssistantMessage(result, dehydrateValue),
|
|
53
|
+
},
|
|
54
|
+
null,
|
|
55
|
+
2,
|
|
56
|
+
),
|
|
57
|
+
)
|
|
58
|
+
return result
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function mapMessages(
|
|
62
|
+
messages: (UserMessage | AssistantMessage)['message']['content'][],
|
|
63
|
+
f: (s: unknown) => unknown,
|
|
64
|
+
): (UserMessage | AssistantMessage)['message']['content'][] {
|
|
65
|
+
return messages.map(_ => {
|
|
66
|
+
if (typeof _ === 'string') {
|
|
67
|
+
return f(_)
|
|
68
|
+
}
|
|
69
|
+
return _.map(_ => {
|
|
70
|
+
switch (_.type) {
|
|
71
|
+
case 'tool_result':
|
|
72
|
+
if (typeof _.content === 'string') {
|
|
73
|
+
return { ..._, content: f(_.content) }
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(_.content)) {
|
|
76
|
+
return {
|
|
77
|
+
..._,
|
|
78
|
+
content: _.content.map(_ => {
|
|
79
|
+
switch (_.type) {
|
|
80
|
+
case 'text':
|
|
81
|
+
return { ..._, text: f(_.text) }
|
|
82
|
+
case 'image':
|
|
83
|
+
return _
|
|
84
|
+
}
|
|
85
|
+
}),
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return _
|
|
89
|
+
case 'text':
|
|
90
|
+
return { ..._, text: f(_.text) }
|
|
91
|
+
case 'tool_use':
|
|
92
|
+
return {
|
|
93
|
+
..._,
|
|
94
|
+
input: mapValues(_.input as Record<string, unknown>, f),
|
|
95
|
+
}
|
|
96
|
+
case 'image':
|
|
97
|
+
return _
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
}) as (UserMessage | AssistantMessage)['message']['content'][]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function mapAssistantMessage(
|
|
104
|
+
message: AssistantMessage,
|
|
105
|
+
f: (s: unknown) => unknown,
|
|
106
|
+
): AssistantMessage {
|
|
107
|
+
return {
|
|
108
|
+
durationMs: 'DURATION' as unknown as number,
|
|
109
|
+
costUSD: 'COST' as unknown as number,
|
|
110
|
+
uuid: 'UUID' as unknown as UUID,
|
|
111
|
+
message: {
|
|
112
|
+
...message.message,
|
|
113
|
+
content: message.message.content
|
|
114
|
+
.map(_ => {
|
|
115
|
+
switch (_.type) {
|
|
116
|
+
case 'text':
|
|
117
|
+
return {
|
|
118
|
+
..._,
|
|
119
|
+
text: f(_.text) as string,
|
|
120
|
+
citations: _.citations || [],
|
|
121
|
+
} // Ensure citations
|
|
122
|
+
case 'tool_use':
|
|
123
|
+
return {
|
|
124
|
+
..._,
|
|
125
|
+
input: mapValues(_.input as Record<string, unknown>, f),
|
|
126
|
+
}
|
|
127
|
+
default:
|
|
128
|
+
return _ // Handle other block types unchanged
|
|
129
|
+
}
|
|
130
|
+
})
|
|
131
|
+
.filter(Boolean) as ContentBlock[],
|
|
132
|
+
},
|
|
133
|
+
type: 'assistant',
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function dehydrateValue(s: unknown): unknown {
|
|
138
|
+
if (typeof s !== 'string') {
|
|
139
|
+
return s
|
|
140
|
+
}
|
|
141
|
+
const s1 = s
|
|
142
|
+
.replace(/num_files="\d+"/g, 'num_files="[NUM]"')
|
|
143
|
+
.replace(/duration_ms="\d+"/g, 'duration_ms="[DURATION]"')
|
|
144
|
+
.replace(/cost_usd="\d+"/g, 'cost_usd="[COST]"')
|
|
145
|
+
.replace(/\//g, path.sep)
|
|
146
|
+
.replaceAll(getCwd(), '[CWD]')
|
|
147
|
+
if (s1.includes('Files modified by user:')) {
|
|
148
|
+
return 'Files modified by user: [FILES]'
|
|
149
|
+
}
|
|
150
|
+
return s1
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function hydrateValue(s: unknown): unknown {
|
|
154
|
+
if (typeof s !== 'string') {
|
|
155
|
+
return s
|
|
156
|
+
}
|
|
157
|
+
return s
|
|
158
|
+
.replaceAll('[NUM]', '1')
|
|
159
|
+
.replaceAll('[DURATION]', '100')
|
|
160
|
+
.replaceAll('[CWD]', getCwd())
|
|
161
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'
|
|
2
|
+
import { Box } from 'ink'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import type { Tool } from '../../Tool'
|
|
6
|
+
import { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'
|
|
7
|
+
import { HighlightedCode } from '../../components/HighlightedCode'
|
|
8
|
+
import { getContext } from '../../context'
|
|
9
|
+
import { Message, query } from '../../query'
|
|
10
|
+
import { lastX } from '../../utils/generators'
|
|
11
|
+
import { createUserMessage } from '../../utils/messages'
|
|
12
|
+
import { BashTool } from '../BashTool/BashTool'
|
|
13
|
+
import { FileReadTool } from '../FileReadTool/FileReadTool'
|
|
14
|
+
import { FileWriteTool } from '../FileWriteTool/FileWriteTool'
|
|
15
|
+
import { GlobTool } from '../GlobTool/GlobTool'
|
|
16
|
+
import { GrepTool } from '../GrepTool/GrepTool'
|
|
17
|
+
import { LSTool } from '../lsTool/lsTool'
|
|
18
|
+
import { ARCHITECT_SYSTEM_PROMPT, DESCRIPTION } from './prompt'
|
|
19
|
+
|
|
20
|
+
const FS_EXPLORATION_TOOLS: Tool[] = [
|
|
21
|
+
BashTool,
|
|
22
|
+
LSTool,
|
|
23
|
+
FileReadTool,
|
|
24
|
+
FileWriteTool,
|
|
25
|
+
GlobTool,
|
|
26
|
+
GrepTool,
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
const inputSchema = z.strictObject({
|
|
30
|
+
prompt: z
|
|
31
|
+
.string()
|
|
32
|
+
.describe('The technical request or coding task to analyze'),
|
|
33
|
+
context: z
|
|
34
|
+
.string()
|
|
35
|
+
.describe('Optional context from previous conversation or system state')
|
|
36
|
+
.optional(),
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
export const ArchitectTool = {
|
|
40
|
+
name: 'Architect',
|
|
41
|
+
async description() {
|
|
42
|
+
return DESCRIPTION
|
|
43
|
+
},
|
|
44
|
+
inputSchema,
|
|
45
|
+
isReadOnly() {
|
|
46
|
+
return true
|
|
47
|
+
},
|
|
48
|
+
isConcurrencySafe() {
|
|
49
|
+
return true // ArchitectTool is read-only, safe for concurrent execution
|
|
50
|
+
},
|
|
51
|
+
userFacingName() {
|
|
52
|
+
return 'Architect'
|
|
53
|
+
},
|
|
54
|
+
async isEnabled() {
|
|
55
|
+
return false
|
|
56
|
+
},
|
|
57
|
+
needsPermissions() {
|
|
58
|
+
return false
|
|
59
|
+
},
|
|
60
|
+
async *call({ prompt, context }, toolUseContext, canUseTool) {
|
|
61
|
+
const content = context
|
|
62
|
+
? `<context>${context}</context>\n\n${prompt}`
|
|
63
|
+
: prompt
|
|
64
|
+
|
|
65
|
+
const userMessage = createUserMessage(content)
|
|
66
|
+
|
|
67
|
+
const messages: Message[] = [userMessage]
|
|
68
|
+
|
|
69
|
+
// We only allow the file exploration tools to be used in the architect tool
|
|
70
|
+
const allowedTools = (toolUseContext.options.tools ?? []).filter(_ =>
|
|
71
|
+
FS_EXPLORATION_TOOLS.map(_ => _.name).includes(_.name),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
const lastResponse = await lastX(
|
|
75
|
+
query(
|
|
76
|
+
messages,
|
|
77
|
+
[ARCHITECT_SYSTEM_PROMPT],
|
|
78
|
+
await getContext(),
|
|
79
|
+
canUseTool,
|
|
80
|
+
{
|
|
81
|
+
...toolUseContext,
|
|
82
|
+
options: { ...toolUseContext.options, tools: allowedTools },
|
|
83
|
+
},
|
|
84
|
+
),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
if (lastResponse.type !== 'assistant') {
|
|
88
|
+
throw new Error(`Invalid response from API`)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const data = lastResponse.message.content.filter(_ => _.type === 'text')
|
|
92
|
+
yield {
|
|
93
|
+
type: 'result',
|
|
94
|
+
data,
|
|
95
|
+
resultForAssistant: this.renderResultForAssistant(data),
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
async prompt() {
|
|
99
|
+
return DESCRIPTION
|
|
100
|
+
},
|
|
101
|
+
renderResultForAssistant(data) {
|
|
102
|
+
return data
|
|
103
|
+
},
|
|
104
|
+
renderToolUseMessage(input) {
|
|
105
|
+
return Object.entries(input)
|
|
106
|
+
.map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
|
|
107
|
+
.join(', ')
|
|
108
|
+
},
|
|
109
|
+
renderToolResultMessage(content) {
|
|
110
|
+
return (
|
|
111
|
+
<Box flexDirection="column" gap={1}>
|
|
112
|
+
<HighlightedCode
|
|
113
|
+
code={content.map(_ => _.text).join('\n')}
|
|
114
|
+
language="markdown"
|
|
115
|
+
/>
|
|
116
|
+
</Box>
|
|
117
|
+
)
|
|
118
|
+
},
|
|
119
|
+
renderToolUseRejectedMessage() {
|
|
120
|
+
return <FallbackToolUseRejectedMessage />
|
|
121
|
+
},
|
|
122
|
+
} satisfies Tool<typeof inputSchema, TextBlock[]>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const ARCHITECT_SYSTEM_PROMPT = `You are an expert software architect. Your role is to analyze technical requirements and produce clear, actionable implementation plans.
|
|
2
|
+
These plans will then be carried out by a junior software engineer so you need to be specific and detailed. However do not actually write the code, just explain the plan.
|
|
3
|
+
|
|
4
|
+
Follow these steps for each request:
|
|
5
|
+
1. Carefully analyze requirements to identify core functionality and constraints
|
|
6
|
+
2. Define clear technical approach with specific technologies and patterns
|
|
7
|
+
3. Break down implementation into concrete, actionable steps at the appropriate level of abstraction
|
|
8
|
+
|
|
9
|
+
Keep responses focused, specific and actionable.
|
|
10
|
+
|
|
11
|
+
IMPORTANT: Do not ask the user if you should implement the changes at the end. Just provide the plan as described above.
|
|
12
|
+
IMPORTANT: Do not attempt to write the code or use any string modification tools. Just provide the plan.`
|
|
13
|
+
|
|
14
|
+
export const DESCRIPTION =
|
|
15
|
+
'Your go-to tool for any technical or coding task. Analyzes requirements and breaks them down into clear, actionable implementation steps. Use this whenever you need help planning how to implement a feature, solve a technical problem, or structure your code.'
|