Download src/tools/EnterPlanModeTool/EnterPlanModeTool.ts from chenbhao/codev: direct link, hf CLI and curl.
- Browser
- Download file 4.1 kB
-
https://huggingface.co/chenbhao/codev/resolve/e91c8197c9918ff9e5df3140e8c36282bb30e9a2/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts
- Command line
-
hf download hf://chenbhao/codev@e91c8197c9918ff9e5df3140e8c36282bb30e9a2/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts
-
curl -L -o EnterPlanModeTool.ts https://huggingface.co/chenbhao/codev/resolve/e91c8197c9918ff9e5df3140e8c36282bb30e9a2/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts
4.1 kB
| import { feature } from 'bun:bundle' | |
| import { z } from 'zod/v4' | |
| import { | |
| getAllowedChannels, | |
| handlePlanModeTransition, | |
| } from '../../bootstrap/state.js' | |
| import type { Tool } from '../../Tool.js' | |
| import { buildTool, type ToolDef } from '../../Tool.js' | |
| import { lazySchema } from '../../utils/lazySchema.js' | |
| import { applyPermissionUpdate } from '../../utils/permissions/PermissionUpdate.js' | |
| import { prepareContextForPlanMode } from '../../utils/permissions/permissionSetup.js' | |
| import { isPlanModeInterviewPhaseEnabled } from '../../utils/planModeV2.js' | |
| import { ENTER_PLAN_MODE_TOOL_NAME } from './constants.js' | |
| import { getEnterPlanModeToolPrompt } from './prompt.js' | |
| import { | |
| renderToolResultMessage, | |
| renderToolUseMessage, | |
| renderToolUseRejectedMessage, | |
| } from './UI.js' | |
| const inputSchema = lazySchema(() => | |
| z.strictObject({ | |
| // No parameters needed | |
| }), | |
| ) | |
| type InputSchema = ReturnType<typeof inputSchema> | |
| const outputSchema = lazySchema(() => | |
| z.object({ | |
| message: z.string().describe('Confirmation that plan mode was entered'), | |
| }), | |
| ) | |
| type OutputSchema = ReturnType<typeof outputSchema> | |
| export type Output = z.infer<OutputSchema> | |
| export const EnterPlanModeTool: Tool<InputSchema, Output> = buildTool({ | |
| name: ENTER_PLAN_MODE_TOOL_NAME, | |
| searchHint: 'switch to plan mode to design an approach before coding', | |
| maxResultSizeChars: 100_000, | |
| async description() { | |
| return 'Requests permission to enter plan mode for complex tasks requiring exploration and design' | |
| }, | |
| async prompt() { | |
| return getEnterPlanModeToolPrompt() | |
| }, | |
| get inputSchema(): InputSchema { | |
| return inputSchema() | |
| }, | |
| get outputSchema(): OutputSchema { | |
| return outputSchema() | |
| }, | |
| userFacingName() { | |
| return '' | |
| }, | |
| shouldDefer: true, | |
| isEnabled() { | |
| // When --channels is active, ExitPlanMode is disabled (its approval | |
| // dialog needs the terminal). Disable entry too so plan mode isn't a | |
| // trap the model can enter but never leave. | |
| if ( | |
| (feature('KAIROS') || feature('KAIROS_CHANNELS')) && | |
| getAllowedChannels().length > 0 | |
| ) { | |
| return false | |
| } | |
| return true | |
| }, | |
| isConcurrencySafe() { | |
| return true | |
| }, | |
| isReadOnly() { | |
| return true | |
| }, | |
| renderToolUseMessage, | |
| renderToolResultMessage, | |
| renderToolUseRejectedMessage, | |
| async call(_input, context) { | |
| if (context.agentId) { | |
| throw new Error('EnterPlanMode tool cannot be used in agent contexts') | |
| } | |
| const appState = context.getAppState() | |
| handlePlanModeTransition(appState.toolPermissionContext.mode, 'plan') | |
| // Update the permission mode to 'plan'. prepareContextForPlanMode runs | |
| // the classifier activation side effects when the user's defaultMode is | |
| // 'auto' — see permissionSetup.ts for the full lifecycle. | |
| context.setAppState(prev => ({ | |
| ...prev, | |
| toolPermissionContext: applyPermissionUpdate( | |
| prepareContextForPlanMode(prev.toolPermissionContext), | |
| { type: 'setMode', mode: 'plan', destination: 'session' }, | |
| ), | |
| })) | |
| return { | |
| data: { | |
| message: | |
| 'Entered plan mode. You should now focus on exploring the codebase and designing an implementation approach.', | |
| }, | |
| } | |
| }, | |
| mapToolResultToToolResultBlockParam({ message }, toolUseID) { | |
| const instructions = isPlanModeInterviewPhaseEnabled() | |
| ? `${message} | |
| DO NOT write or edit any files except the plan file. Detailed workflow instructions will follow.` | |
| : `${message} | |
| In plan mode, you should: | |
| 1. Thoroughly explore the codebase to understand existing patterns | |
| 2. Identify similar features and architectural approaches | |
| 3. Consider multiple approaches and their trade-offs | |
| 4. Use AskUserQuestion if you need to clarify the approach | |
| 5. Design a concrete implementation strategy | |
| 6. When ready, use ExitPlanMode to present your plan for approval | |
| Remember: DO NOT write or edit any files yet. This is a read-only exploration and planning phase.` | |
| return { | |
| type: 'tool_result', | |
| content: instructions, | |
| tool_use_id: toolUseID, | |
| } | |
| }, | |
| } satisfies ToolDef<InputSchema, Output>) | |