source dump of claude code
at main 93 lines 14 kB view raw
1import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'; 2import * as React from 'react'; 3import type { Message, ProgressMessage } from 'src/types/message.js'; 4import { extractTag } from 'src/utils/messages.js'; 5import type { ThemeName } from 'src/utils/theme.js'; 6import type { z } from 'zod/v4'; 7import { FallbackToolUseErrorMessage } from '../../components/FallbackToolUseErrorMessage.js'; 8import { FilePathLink } from '../../components/FilePathLink.js'; 9import { HighlightedCode } from '../../components/HighlightedCode.js'; 10import { MessageResponse } from '../../components/MessageResponse.js'; 11import { NotebookEditToolUseRejectedMessage } from '../../components/NotebookEditToolUseRejectedMessage.js'; 12import { Box, Text } from '../../ink.js'; 13import type { Tools } from '../../Tool.js'; 14import { getDisplayPath } from '../../utils/file.js'; 15import type { inputSchema, Output } from './NotebookEditTool.js'; 16export function getToolUseSummary(input: Partial<z.infer<ReturnType<typeof inputSchema>>> | undefined): string | null { 17 if (!input?.notebook_path) { 18 return null; 19 } 20 return getDisplayPath(input.notebook_path); 21} 22export function renderToolUseMessage({ 23 notebook_path, 24 cell_id, 25 new_source, 26 cell_type, 27 edit_mode 28}: Partial<z.infer<ReturnType<typeof inputSchema>>>, { 29 verbose 30}: { 31 verbose: boolean; 32}): React.ReactNode { 33 if (!notebook_path || !new_source || !cell_type) { 34 return null; 35 } 36 const displayPath = verbose ? notebook_path : getDisplayPath(notebook_path); 37 if (verbose) { 38 return <> 39 <FilePathLink filePath={notebook_path}>{displayPath}</FilePathLink> 40 {`@${cell_id}, content: ${new_source.slice(0, 30)}…, cell_type: ${cell_type}, edit_mode: ${edit_mode ?? 'replace'}`} 41 </>; 42 } 43 return <> 44 <FilePathLink filePath={notebook_path}>{displayPath}</FilePathLink> 45 {`@${cell_id}`} 46 </>; 47} 48export function renderToolUseRejectedMessage(input: z.infer<ReturnType<typeof inputSchema>>, { 49 verbose 50}: { 51 columns?: number; 52 messages?: Message[]; 53 progressMessagesForMessage?: ProgressMessage[]; 54 theme?: ThemeName; 55 tools?: Tools; 56 verbose: boolean; 57}): React.ReactNode { 58 return <NotebookEditToolUseRejectedMessage notebook_path={input.notebook_path} cell_id={input.cell_id} new_source={input.new_source} cell_type={input.cell_type} edit_mode={input.edit_mode} verbose={verbose} />; 59} 60export function renderToolUseErrorMessage(result: ToolResultBlockParam['content'], { 61 verbose 62}: { 63 verbose: boolean; 64}): React.ReactNode { 65 if (!verbose && typeof result === 'string' && extractTag(result, 'tool_use_error')) { 66 return <MessageResponse> 67 <Text color="error">Error editing notebook</Text> 68 </MessageResponse>; 69 } 70 return <FallbackToolUseErrorMessage result={result} verbose={verbose} />; 71} 72export function renderToolResultMessage({ 73 cell_id, 74 new_source, 75 error 76}: Output): React.ReactNode { 77 if (error) { 78 return <MessageResponse> 79 <Text color="error">{error}</Text> 80 </MessageResponse>; 81 } 82 return <MessageResponse> 83 <Box flexDirection="column"> 84 <Text> 85 Updated cell <Text bold>{cell_id}</Text>: 86 </Text> 87 <Box marginLeft={2}> 88 <HighlightedCode code={new_source} filePath="notebook.py" /> 89 </Box> 90 </Box> 91 </MessageResponse>; 92} 93//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUb29sUmVzdWx0QmxvY2tQYXJhbSIsIlJlYWN0IiwiTWVzc2FnZSIsIlByb2dyZXNzTWVzc2FnZSIsImV4dHJhY3RUYWciLCJUaGVtZU5hbWUiLCJ6IiwiRmFsbGJhY2tUb29sVXNlRXJyb3JNZXNzYWdlIiwiRmlsZVBhdGhMaW5rIiwiSGlnaGxpZ2h0ZWRDb2RlIiwiTWVzc2FnZVJlc3BvbnNlIiwiTm90ZWJvb2tFZGl0VG9vbFVzZVJlamVjdGVkTWVzc2FnZSIsIkJveCIsIlRleHQiLCJUb29scyIsImdldERpc3BsYXlQYXRoIiwiaW5wdXRTY2hlbWEiLCJPdXRwdXQiLCJnZXRUb29sVXNlU3VtbWFyeSIsImlucHV0IiwiUGFydGlhbCIsImluZmVyIiwiUmV0dXJuVHlwZSIsIm5vdGVib29rX3BhdGgiLCJyZW5kZXJUb29sVXNlTWVzc2FnZSIsImNlbGxfaWQiLCJuZXdfc291cmNlIiwiY2VsbF90eXBlIiwiZWRpdF9tb2RlIiwidmVyYm9zZSIsIlJlYWN0Tm9kZSIsImRpc3BsYXlQYXRoIiwic2xpY2UiLCJyZW5kZXJUb29sVXNlUmVqZWN0ZWRNZXNzYWdlIiwiY29sdW1ucyIsIm1lc3NhZ2VzIiwicHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UiLCJ0aGVtZSIsInRvb2xzIiwicmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSIsInJlc3VsdCIsInJlbmRlclRvb2xSZXN1bHRNZXNzYWdlIiwiZXJyb3IiXSwic291cmNlcyI6WyJVSS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUb29sUmVzdWx0QmxvY2tQYXJhbSB9IGZyb20gJ0BhbnRocm9waWMtYWkvc2RrL3Jlc291cmNlcy9pbmRleC5tanMnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUHJvZ3Jlc3NNZXNzYWdlIH0gZnJvbSAnc3JjL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQgeyBleHRyYWN0VGFnIH0gZnJvbSAnc3JjL3V0aWxzL21lc3NhZ2VzLmpzJ1xuaW1wb3J0IHR5cGUgeyBUaGVtZU5hbWUgfSBmcm9tICdzcmMvdXRpbHMvdGhlbWUuanMnXG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tICd6b2QvdjQnXG5pbXBvcnQgeyBGYWxsYmFja1Rvb2xVc2VFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0ZhbGxiYWNrVG9vbFVzZUVycm9yTWVzc2FnZS5qcydcbmltcG9ydCB7IEZpbGVQYXRoTGluayB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvRmlsZVBhdGhMaW5rLmpzJ1xuaW1wb3J0IHsgSGlnaGxpZ2h0ZWRDb2RlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9IaWdobGlnaHRlZENvZGUuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL01lc3NhZ2VSZXNwb25zZS5qcydcbmltcG9ydCB7IE5vdGVib29rRWRpdFRvb2xVc2VSZWplY3RlZE1lc3NhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL05vdGVib29rRWRpdFRvb2xVc2VSZWplY3RlZE1lc3NhZ2UuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgdHlwZSB7IFRvb2xzIH0gZnJvbSAnLi4vLi4vVG9vbC5qcydcbmltcG9ydCB7IGdldERpc3BsYXlQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcydcbmltcG9ydCB0eXBlIHsgaW5wdXRTY2hlbWEsIE91dHB1dCB9IGZyb20gJy4vTm90ZWJvb2tFZGl0VG9vbC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xVc2VTdW1tYXJ5KFxuICBpbnB1dDogUGFydGlhbDx6LmluZmVyPFJldHVyblR5cGU8dHlwZW9mIGlucHV0U2NoZW1hPj4+IHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghaW5wdXQ/Lm5vdGVib29rX3BhdGgpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiBnZXREaXNwbGF5UGF0aChpbnB1dC5ub3RlYm9va19wYXRoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVG9vbFVzZU1lc3NhZ2UoXG4gIHtcbiAgICBub3RlYm9va19wYXRoLFxuICAgIGNlbGxfaWQsXG4gICAgbmV3X3NvdXJjZSxcbiAgICBjZWxsX3R5cGUsXG4gICAgZWRpdF9tb2RlLFxuICB9OiBQYXJ0aWFsPHouaW5mZXI8UmV0dXJuVHlwZTx0eXBlb2YgaW5wdXRTY2hlbWE+Pj4sXG4gIHsgdmVyYm9zZSB9OiB7IHZlcmJvc2U6IGJvb2xlYW4gfSxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghbm90ZWJvb2tfcGF0aCB8fCAhbmV3X3NvdXJjZSB8fCAhY2VsbF90eXBlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBkaXNwbGF5UGF0aCA9IHZlcmJvc2UgPyBub3RlYm9va19wYXRoIDogZ2V0RGlzcGxheVBhdGgobm90ZWJvb2tfcGF0aClcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPEZpbGVQYXRoTGluayBmaWxlUGF0aD17bm90ZWJvb2tfcGF0aH0+e2Rpc3BsYXlQYXRofTwvRmlsZVBhdGhMaW5rPlxuICAgICAgICB7YEAke2NlbGxfaWR9LCBjb250ZW50OiAke25ld19zb3VyY2Uuc2xpY2UoMCwgMzApfeKApiwgY2VsbF90eXBlOiAke2NlbGxfdHlwZX0sIGVkaXRfbW9kZTogJHtlZGl0X21vZGUgPz8gJ3JlcGxhY2UnfWB9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPEZpbGVQYXRoTGluayBmaWxlUGF0aD17bm90ZWJvb2tfcGF0aH0+e2Rpc3BsYXlQYXRofTwvRmlsZVBhdGhMaW5rPlxuICAgICAge2BAJHtjZWxsX2lkfWB9XG4gICAgPC8+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VSZWplY3RlZE1lc3NhZ2UoXG4gIGlucHV0OiB6LmluZmVyPFJldHVyblR5cGU8dHlwZW9mIGlucHV0U2NoZW1hPj4sXG4gIHtcbiAgICB2ZXJib3NlLFxuICB9OiB7XG4gICAgY29sdW1ucz86IG51bWJlclxuICAgIG1lc3NhZ2VzPzogTWVzc2FnZVtdXG4gICAgcHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2U/OiBQcm9ncmVzc01lc3NhZ2VbXVxuICAgIHRoZW1lPzogVGhlbWVOYW1lXG4gICAgdG9vbHM/OiBUb29sc1xuICAgIHZlcmJvc2U6IGJvb2xlYW5cbiAgfSxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPE5vdGVib29rRWRpdFRvb2xVc2VSZWplY3RlZE1lc3NhZ2VcbiAgICAgIG5vdGVib29rX3BhdGg9e2lucHV0Lm5vdGVib29rX3BhdGh9XG4gICAgICBjZWxsX2lkPXtpbnB1dC5jZWxsX2lkfVxuICAgICAgbmV3X3NvdXJjZT17aW5wdXQubmV3X3NvdXJjZX1cbiAgICAgIGNlbGxfdHlwZT17aW5wdXQuY2VsbF90eXBlfVxuICAgICAgZWRpdF9tb2RlPXtpbnB1dC5lZGl0X21vZGV9XG4gICAgICB2ZXJib3NlPXt2ZXJib3NlfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UoXG4gIHJlc3VsdDogVG9vbFJlc3VsdEJsb2NrUGFyYW1bJ2NvbnRlbnQnXSxcbiAgeyB2ZXJib3NlIH06IHsgdmVyYm9zZTogYm9vbGVhbiB9LFxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgaWYgKFxuICAgICF2ZXJib3NlICYmXG4gICAgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiZcbiAgICBleHRyYWN0VGFnKHJlc3VsdCwgJ3Rvb2xfdXNlX2Vycm9yJylcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNZXNzYWdlUmVzcG9uc2U+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiZXJyb3JcIj5FcnJvciBlZGl0aW5nIG5vdGVib29rPC9UZXh0PlxuICAgICAgPC9NZXNzYWdlUmVzcG9uc2U+XG4gICAgKVxuICB9XG4gIHJldHVybiA8RmFsbGJhY2tUb29sVXNlRXJyb3JNZXNzYWdlIHJlc3VsdD17cmVzdWx0fSB2ZXJib3NlPXt2ZXJib3NlfSAvPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2Uoe1xuICBjZWxsX2lkLFxuICBuZXdfc291cmNlLFxuICBlcnJvcixcbn06IE91dHB1dCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmIChlcnJvcikge1xuICAgIHJldHVybiAoXG4gICAgICA8TWVzc2FnZVJlc3BvbnNlPlxuICAgICAgICA8VGV4dCBjb2xvcj1cImVycm9yXCI+e2Vycm9yfTwvVGV4dD5cbiAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPE1lc3NhZ2VSZXNwb25zZT5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICA8VGV4dD5cbiAgICAgICAgICBVcGRhdGVkIGNlbGwgPFRleHQgYm9sZD57Y2VsbF9pZH08L1RleHQ+OlxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxCb3ggbWFyZ2luTGVmdD17Mn0+XG4gICAgICAgICAgPEhpZ2hsaWdodGVkQ29kZSBjb2RlPXtuZXdfc291cmNlfSBmaWxlUGF0aD1cIm5vdGVib29rLnB5XCIgLz5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L0JveD5cbiAgICA8L01lc3NhZ2VSZXNwb25zZT5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxjQUFjQSxvQkFBb0IsUUFBUSx1Q0FBdUM7QUFDakYsT0FBTyxLQUFLQyxLQUFLLE1BQU0sT0FBTztBQUM5QixjQUFjQyxPQUFPLEVBQUVDLGVBQWUsUUFBUSxzQkFBc0I7QUFDcEUsU0FBU0MsVUFBVSxRQUFRLHVCQUF1QjtBQUNsRCxjQUFjQyxTQUFTLFFBQVEsb0JBQW9CO0FBQ25ELGNBQWND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