@raindrop-ai/wizard 0.0.1 → 0.0.2

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.
Files changed (71) hide show
  1. package/dist/src/docs/claude-agent-sdk.mdx +382 -0
  2. package/dist/src/docs/{typescript.md → typescript.mdx} +8 -4
  3. package/dist/src/docs/vercel-ai-sdk.mdx +769 -0
  4. package/dist/src/lib/agent-interface.d.ts +4 -3
  5. package/dist/src/lib/agent-interface.js +290 -197
  6. package/dist/src/lib/agent-interface.js.map +1 -1
  7. package/dist/src/lib/constants.d.ts +1 -0
  8. package/dist/src/lib/constants.js +1 -0
  9. package/dist/src/lib/constants.js.map +1 -1
  10. package/dist/src/lib/handlers.d.ts +16 -8
  11. package/dist/src/lib/handlers.js +232 -118
  12. package/dist/src/lib/handlers.js.map +1 -1
  13. package/dist/src/lib/integration-testing.d.ts +5 -5
  14. package/dist/src/lib/integration-testing.js +28 -12
  15. package/dist/src/lib/integration-testing.js.map +1 -1
  16. package/dist/src/lib/mcp.d.ts +1 -1
  17. package/dist/src/lib/mcp.js +88 -49
  18. package/dist/src/lib/mcp.js.map +1 -1
  19. package/dist/src/lib/sdk-messages.d.ts +8 -1
  20. package/dist/src/lib/sdk-messages.js +83 -27
  21. package/dist/src/lib/sdk-messages.js.map +1 -1
  22. package/dist/src/lib/wizard.js +16 -20
  23. package/dist/src/lib/wizard.js.map +1 -1
  24. package/dist/src/ui/App.d.ts +5 -4
  25. package/dist/src/ui/App.js +12 -12
  26. package/dist/src/ui/App.js.map +1 -1
  27. package/dist/src/ui/components/ClarifyingQuestionsPrompt.js +4 -2
  28. package/dist/src/ui/components/ClarifyingQuestionsPrompt.js.map +1 -1
  29. package/dist/src/ui/components/ContinuePrompt.d.ts +3 -2
  30. package/dist/src/ui/components/ContinuePrompt.js +4 -4
  31. package/dist/src/ui/components/ContinuePrompt.js.map +1 -1
  32. package/dist/src/ui/components/DiffDisplay.js +16 -6
  33. package/dist/src/ui/components/DiffDisplay.js.map +1 -1
  34. package/dist/src/ui/components/FeedbackSelectPrompt.js +6 -3
  35. package/dist/src/ui/components/FeedbackSelectPrompt.js.map +1 -1
  36. package/dist/src/ui/components/HistoryItemDisplay.d.ts +5 -3
  37. package/dist/src/ui/components/HistoryItemDisplay.js +10 -9
  38. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  39. package/dist/src/ui/components/Logo.js +19 -34
  40. package/dist/src/ui/components/Logo.js.map +1 -1
  41. package/dist/src/ui/components/OrgInfoBox.d.ts +2 -1
  42. package/dist/src/ui/components/OrgInfoBox.js +2 -4
  43. package/dist/src/ui/components/OrgInfoBox.js.map +1 -1
  44. package/dist/src/ui/components/PersistentTextInput.js +13 -11
  45. package/dist/src/ui/components/PersistentTextInput.js.map +1 -1
  46. package/dist/src/ui/components/PromptContainer.js +4 -8
  47. package/dist/src/ui/components/PromptContainer.js.map +1 -1
  48. package/dist/src/ui/components/ToolApprovalPrompt.js +4 -4
  49. package/dist/src/ui/components/ToolApprovalPrompt.js.map +1 -1
  50. package/dist/src/ui/components/WriteKeyDisplay.d.ts +1 -1
  51. package/dist/src/ui/components/WriteKeyDisplay.js +1 -1
  52. package/dist/src/ui/components/WriteKeyDisplay.js.map +1 -1
  53. package/dist/src/ui/contexts/WizardContext.d.ts +13 -5
  54. package/dist/src/ui/contexts/WizardContext.js +60 -20
  55. package/dist/src/ui/contexts/WizardContext.js.map +1 -1
  56. package/dist/src/ui/render.js +49 -5
  57. package/dist/src/ui/render.js.map +1 -1
  58. package/dist/src/ui/types.d.ts +4 -2
  59. package/dist/src/ui/types.js.map +1 -1
  60. package/dist/src/utils/oauth.js +0 -4
  61. package/dist/src/utils/oauth.js.map +1 -1
  62. package/dist/src/utils/session.d.ts +1 -0
  63. package/dist/src/utils/session.js +40 -1
  64. package/dist/src/utils/session.js.map +1 -1
  65. package/dist/src/utils/ui.d.ts +7 -2
  66. package/dist/src/utils/ui.js +9 -2
  67. package/dist/src/utils/ui.js.map +1 -1
  68. package/package.json +2 -1
  69. package/dist/src/docs/vercel-ai-sdk.md +0 -304
  70. /package/dist/src/docs/{browser.md → browser.mdx} +0 -0
  71. /package/dist/src/docs/{python.md → python.mdx} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ClarifyingQuestionsPrompt.js","sourceRoot":"","sources":["../../../../src/ui/components/ClarifyingQuestionsPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Clarifying questions prompt component.\n * Displays questions from the AskUserQuestion tool and collects answers.\n * Styled with a stepper progress bar showing question headers.\n * Features inline text input for the \"Type something\" option.\n */\n\nimport React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { useWizard } from '../contexts/WizardContext.js';\nimport { PromptContainer } from './PromptContainer.js';\nimport type {\n ClarifyingQuestionsProps,\n ClarifyingQuestionsResult,\n ClarifyingQuestion,\n} from '../types.js';\n\ninterface ClarifyingQuestionsPromptComponentProps {\n props: ClarifyingQuestionsProps;\n}\n\ninterface ListItem {\n label: string;\n value: string;\n description?: string;\n}\n\n/**\n * Stepper progress bar component showing question headers with status indicators.\n */\nfunction StepperProgress({\n questions,\n currentIndex,\n answers,\n}: {\n questions: ClarifyingQuestion[];\n currentIndex: number;\n answers: Record<string, string>;\n}): React.ReactElement {\n // Add \"Submit\" as the final step\n const steps = [...questions.map((q) => q.header), 'Submit'];\n\n return (\n <Box marginBottom={1}>\n {steps.map((header, idx) => {\n const isCompleted =\n idx < currentIndex ||\n (idx < questions.length && answers[questions[idx].question]);\n const isCurrent = idx === currentIndex;\n\n // Determine the marker\n let marker: string;\n if (isCompleted && !isCurrent) {\n marker = '✓';\n } else if (isCurrent) {\n marker = '●';\n } else {\n marker = '○';\n }\n\n // Determine colors\n const markerColor = isCompleted ? 'green' : isCurrent ? 'cyan' : 'gray';\n const textColor = isCurrent ? 'cyan' : isCompleted ? undefined : 'gray';\n const textDim = !isCurrent && !isCompleted;\n\n return (\n <Box key={idx}>\n {/* Connector line before (except first) */}\n {idx > 0 && <Text color=\"gray\"> ━━━ </Text>}\n {/* Marker and label */}\n <Box>\n <Text color={markerColor}>{marker}</Text>\n <Text color={textColor} dimColor={textDim}>\n {' '}\n {header}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\n/**\n * Clarifying questions prompt for the AskUserQuestion tool.\n * Supports single-select, multi-select, and inline free-text input.\n */\nexport function ClarifyingQuestionsPrompt({\n props,\n}: ClarifyingQuestionsPromptComponentProps): React.ReactElement {\n const { questions } = props;\n const { state, actions } = useWizard();\n const { resolvePending, addItem } = actions;\n const { agentState } = state;\n\n // Track current question index\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\n // Track answers for each question\n const [answers, setAnswers] = useState<Record<string, string>>({});\n // Track multi-select selections for current question\n const [multiSelections, setMultiSelections] = useState<string[]>([]);\n // Track highlighted item index\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n // Track custom text value for \"Type something\" option\n const [customText, setCustomText] = useState('');\n // Track if we're in typing mode (when Type something is selected and user is typing)\n const [isTypingMode, setIsTypingMode] = useState(false);\n // Track if we're in review mode (after all questions answered)\n const [isReviewMode, setIsReviewMode] = useState(false);\n // Track highlighted option in review mode (0 = Submit, 1 = Cancel)\n const [reviewHighlightedIndex, setReviewHighlightedIndex] = useState(0);\n\n const currentQuestion = questions[currentQuestionIndex];\n const isLastQuestion = currentQuestionIndex === questions.length - 1;\n const isMultiSelect = currentQuestion?.multiSelect ?? false;\n\n // Get regular option values (needed before handleCustomTextSubmit)\n const regularOptionValues = useMemo(() => {\n if (!currentQuestion) return new Set<string>();\n return new Set(currentQuestion.options.map((opt) => opt.label));\n }, [currentQuestion]);\n\n // Get custom entries (values in multiSelections that aren't regular options)\n const customEntries = useMemo(() => {\n return multiSelections.filter((v) => !regularOptionValues.has(v));\n }, [multiSelections, regularOptionValues]);\n\n // Build list items for current question\n const items: ListItem[] = useMemo(() => {\n if (!currentQuestion) return [];\n\n const questionItems: ListItem[] = currentQuestion.options.map((opt) => ({\n label: opt.label,\n value: opt.label,\n description: opt.description,\n }));\n\n // Add \"Type something\" option for free-text input\n questionItems.push({\n label: 'Type something',\n value: '__OTHER__',\n });\n\n // Add \"Submit\" option for multi-select (always visible)\n if (isMultiSelect) {\n questionItems.push({\n label: 'Submit',\n value: '__SUBMIT__',\n });\n }\n\n return questionItems;\n }, [currentQuestion, isMultiSelect, multiSelections]);\n\n // Auto-enter typing mode when \"Type something\" is highlighted\n useEffect(() => {\n // Only auto-enter typing mode if:\n // 1. Not already in typing mode\n // 2. Not in review mode\n // 3. \"Type something\" is highlighted\n // 4. No custom entries exist yet (for multi-select)\n if (\n !isTypingMode &&\n !isReviewMode &&\n items[highlightedIndex]?.value === '__OTHER__' &&\n customEntries.length === 0\n ) {\n setIsTypingMode(true);\n }\n }, [\n highlightedIndex,\n items,\n isTypingMode,\n isReviewMode,\n customEntries.length,\n ]);\n\n // Move to next question or go to review\n const proceedToNext = useCallback(\n (answer: string) => {\n const newAnswers = {\n ...answers,\n [currentQuestion.question]: answer,\n };\n setAnswers(newAnswers);\n\n if (isLastQuestion) {\n // All questions answered, go to review mode\n setIsReviewMode(true);\n setReviewHighlightedIndex(0);\n } else {\n // Move to next question\n setCurrentQuestionIndex((idx) => idx + 1);\n setMultiSelections([]);\n setHighlightedIndex(0);\n setCustomText('');\n setIsTypingMode(false);\n }\n },\n [answers, currentQuestion, isLastQuestion],\n );\n\n // Submit final answers\n const submitAnswers = useCallback(() => {\n // Add history item showing questions and answers\n addItem({\n type: 'clarifying-questions-result',\n text: \"User answered Raindrop wizard's questions:\",\n questionsAndAnswers: questions.map((q) => ({\n question: q.question,\n answer: answers[q.question] || '(no answer)',\n })),\n });\n\n const result: ClarifyingQuestionsResult = {\n questions,\n answers,\n };\n resolvePending(result);\n }, [questions, answers, resolvePending, addItem]);\n\n // Cancel and return empty answers, interrupting the agent\n const cancelAnswers = useCallback(() => {\n // Add history item indicating user declined\n addItem({\n type: 'declined-questions',\n text: 'User declined to answer questions',\n });\n\n // Interrupt the agent\n if (agentState.queryHandle?.interrupt) {\n void agentState.queryHandle.interrupt();\n }\n\n const result: ClarifyingQuestionsResult = {\n questions,\n answers: {},\n };\n resolvePending(result);\n }, [questions, resolvePending, addItem, agentState.queryHandle]);\n\n // Handle custom text submission from TextInput\n const handleCustomTextSubmit = useCallback(\n (value: string) => {\n if (!value.trim()) return;\n\n const trimmedValue = value.trim();\n\n if (isMultiSelect) {\n // Multi-select: Replace any existing custom entries with the new value\n // This ensures only the latest typed value is kept, not multiple versions\n if (multiSelections.includes(trimmedValue)) {\n // Same value already exists - toggle it off\n setMultiSelections((prev) => prev.filter((v) => v !== trimmedValue));\n } else {\n // New value - remove old custom entries and add the new one\n setMultiSelections((prev) => {\n const withoutOldCustom = prev.filter((v) =>\n regularOptionValues.has(v),\n );\n return [...withoutOldCustom, trimmedValue];\n });\n }\n // Don't clear text - keep it for further editing or submit\n } else {\n // Single-select: Submit immediately with the typed value\n proceedToNext(trimmedValue);\n }\n },\n [isMultiSelect, multiSelections, regularOptionValues, proceedToNext],\n );\n\n // Handle keyboard navigation and selection\n useInput((input, key) => {\n // Ctrl+C always cancels/declines questions (no matter what mode we're in)\n if (key.ctrl && input === 'c') {\n cancelAnswers();\n return;\n }\n\n // Review mode has its own navigation\n if (isReviewMode) {\n if (key.escape) {\n // Go back to last question\n setIsReviewMode(false);\n setHighlightedIndex(0);\n return;\n }\n if (key.upArrow) {\n setReviewHighlightedIndex((idx) => Math.max(0, idx - 1));\n return;\n }\n if (key.downArrow) {\n setReviewHighlightedIndex((idx) => Math.min(1, idx + 1));\n return;\n }\n if (key.return) {\n if (reviewHighlightedIndex === 0) {\n submitAnswers();\n } else {\n cancelAnswers();\n }\n return;\n }\n return;\n }\n\n // Escape handling - always active\n if (key.escape) {\n if (isTypingMode) {\n // Exit typing mode\n setIsTypingMode(false);\n } else if (currentQuestionIndex > 0) {\n // Go back to previous question\n setCurrentQuestionIndex((idx) => idx - 1);\n setMultiSelections([]);\n setHighlightedIndex(0);\n setCustomText('');\n } else {\n // On first question, cancel entirely\n cancelAnswers();\n }\n return;\n }\n\n // Arrow keys - exit typing mode and navigate\n if (key.upArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) => Math.max(0, idx - 1));\n return;\n }\n if (key.downArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) => Math.min(items.length - 1, idx + 1));\n return;\n }\n\n // Skip other keys when typing - TextInput handles them\n if (isTypingMode) {\n return;\n }\n\n // Enter to select\n if (key.return) {\n const selectedItem = items[highlightedIndex];\n if (!selectedItem) return;\n\n if (selectedItem.value === '__OTHER__') {\n if (isMultiSelect && customEntries.length > 0) {\n // Already has custom entries - toggle (clear) them to uncheck\n setMultiSelections((prev) =>\n prev.filter((v) => !customEntries.includes(v)),\n );\n setCustomText('');\n return;\n }\n // No custom entries yet - enter typing mode\n setIsTypingMode(true);\n return;\n }\n\n if (selectedItem.value === '__SUBMIT__') {\n // Submit with all checked selections only\n if (multiSelections.length > 0) {\n proceedToNext(multiSelections.join(', '));\n }\n return;\n }\n\n if (isMultiSelect) {\n // Toggle selection for multi-select\n setMultiSelections((prev) => {\n if (prev.includes(selectedItem.value)) {\n return prev.filter((v) => v !== selectedItem.value);\n }\n return [...prev, selectedItem.value];\n });\n } else {\n // Single select - proceed immediately\n proceedToNext(selectedItem.value);\n }\n }\n });\n\n // Render a single list item\n const renderItem = (item: ListItem, index: number) => {\n const isHighlighted = index === highlightedIndex;\n const isSelected = multiSelections.includes(item.value);\n const isTypeOption = item.value === '__OTHER__';\n const isSubmitOption = item.value === '__SUBMIT__';\n const displayNumber = index + 1;\n\n // Indicator (removed for cleaner UI)\n const indicator = ' ';\n\n // For \"Type something\" option with inline text input\n if (isTypeOption) {\n // Show checkbox only for multi-select\n const hasCustomEntries = customEntries.length > 0;\n const checkbox = isMultiSelect\n ? hasCustomEntries\n ? '[✓] '\n : '[ ] '\n : '';\n\n return (\n <Box key={item.value}>\n <Text color={isHighlighted ? 'cyan' : undefined}>\n {indicator}\n {displayNumber}. {checkbox}\n </Text>\n {isTypingMode || customText ? (\n <TextInput\n value={customText}\n onChange={setCustomText}\n onSubmit={handleCustomTextSubmit}\n focus={isTypingMode}\n placeholder=\"\"\n />\n ) : (\n <Text color={isHighlighted ? 'cyan' : undefined}>{item.label}</Text>\n )}\n </Box>\n );\n }\n\n // Submit option\n if (isSubmitOption) {\n const canSubmit = multiSelections.length > 0;\n const textColor = isHighlighted\n ? 'cyan'\n : !canSubmit\n ? 'gray'\n : 'green';\n // Calculate spacing to align with checkbox brackets (same as \"N. \" where N is the number)\n const numberSpacing = `${displayNumber}. `;\n return (\n <Box key={item.value}>\n <Text color={textColor} bold>\n {indicator}\n {' '.repeat(numberSpacing.length)}Submit\n </Text>\n </Box>\n );\n }\n\n // Regular option - show checkbox for multi-select mode\n const checkbox = isMultiSelect ? (isSelected ? '[✓] ' : '[ ] ') : '';\n\n return (\n <Box key={item.value} flexDirection=\"column\">\n <Text color={isHighlighted ? 'cyan' : undefined}>\n {indicator}\n {displayNumber}. {checkbox}\n {item.label}\n </Text>\n {item.description && (\n <Box marginLeft={4}>\n <Text dimColor>{item.description}</Text>\n </Box>\n )}\n </Box>\n );\n };\n\n if (!currentQuestion && !isReviewMode) {\n return (\n <Box>\n <Text color=\"red\">No questions to display</Text>\n </Box>\n );\n }\n\n // Review mode - show all answers and confirm\n if (isReviewMode) {\n return (\n <PromptContainer>\n {/* Stepper progress bar - show Submit as current */}\n <StepperProgress\n questions={questions}\n currentIndex={questions.length}\n answers={answers}\n />\n\n {/* Review header */}\n <Box marginBottom={1}>\n <Text bold>Review your answers</Text>\n </Box>\n\n {/* List all questions and answers */}\n <Box flexDirection=\"column\" marginBottom={1}>\n {questions.map((q) => (\n <Box key={q.question} flexDirection=\"column\" marginLeft={1}>\n <Box>\n <Text color=\"blue\">● </Text>\n <Text>{q.question}</Text>\n </Box>\n <Box marginLeft={2}>\n <Text color=\"green\">\n {answers[q.question] || '(no answer)'}\n </Text>\n </Box>\n </Box>\n ))}\n </Box>\n\n {/* Confirmation prompt */}\n <Box marginBottom={1}>\n <Text>Ready to submit your answers?</Text>\n </Box>\n\n {/* Submit/Cancel options */}\n <Box flexDirection=\"column\">\n <Box>\n <Text\n color={reviewHighlightedIndex === 0 ? 'cyan' : 'green'}\n bold\n >\n {reviewHighlightedIndex === 0 ? '› ' : ' '}1. Submit answers\n </Text>\n </Box>\n <Box>\n <Text color={reviewHighlightedIndex === 1 ? 'cyan' : undefined}>\n {reviewHighlightedIndex === 1 ? '› ' : ' '}2. Cancel\n </Text>\n </Box>\n </Box>\n </PromptContainer>\n );\n }\n\n return (\n <PromptContainer>\n {/* Stepper progress bar */}\n <StepperProgress\n questions={questions}\n currentIndex={currentQuestionIndex}\n answers={answers}\n />\n\n {/* Question text */}\n <Box marginBottom={1}>\n <Text>{currentQuestion.question}</Text>\n </Box>\n\n {/* Options list */}\n <Box flexDirection=\"column\">\n {items.map((item, index) => renderItem(item, index))}\n </Box>\n </PromptContainer>\n );\n}\n\nexport default ClarifyingQuestionsPrompt;\n"]}
1
+ {"version":3,"file":"ClarifyingQuestionsPrompt.js","sourceRoot":"","sources":["../../../../src/ui/components/ClarifyingQuestionsPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Clarifying questions prompt component.\n * Displays questions from the AskUserQuestion tool and collects answers.\n * Styled with a stepper progress bar showing question headers.\n * Features inline text input for the \"Type something\" option.\n */\n\nimport React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { useWizard } from '../contexts/WizardContext.js';\nimport { PromptContainer } from './PromptContainer.js';\nimport type {\n ClarifyingQuestionsProps,\n ClarifyingQuestionsResult,\n ClarifyingQuestion,\n} from '../types.js';\n\ninterface ClarifyingQuestionsPromptComponentProps {\n props: ClarifyingQuestionsProps;\n}\n\ninterface ListItem {\n label: string;\n value: string;\n description?: string;\n}\n\n/**\n * Stepper progress bar component showing question headers with status indicators.\n */\nfunction StepperProgress({\n questions,\n currentIndex,\n answers,\n}: {\n questions: ClarifyingQuestion[];\n currentIndex: number;\n answers: Record<string, string>;\n}): React.ReactElement {\n // Add \"Submit\" as the final step\n const steps = [...questions.map((q) => q.header), 'Submit'];\n\n return (\n <Box marginBottom={1}>\n {steps.map((header, idx) => {\n const isCompleted =\n idx < currentIndex ||\n (idx < questions.length && answers[questions[idx].question]);\n const isCurrent = idx === currentIndex;\n\n // Determine the marker\n let marker: string;\n if (isCompleted && !isCurrent) {\n marker = '✓';\n } else if (isCurrent) {\n marker = '●';\n } else {\n marker = '○';\n }\n\n // Determine colors\n const markerColor = isCompleted ? 'green' : isCurrent ? 'cyan' : 'gray';\n const textColor = isCurrent ? 'cyan' : isCompleted ? undefined : 'gray';\n const textDim = !isCurrent && !isCompleted;\n\n return (\n <Box key={idx}>\n {/* Connector line before (except first) */}\n {idx > 0 && <Text color=\"gray\"> ━━━ </Text>}\n {/* Marker and label */}\n <Box>\n <Text color={markerColor}>{marker}</Text>\n <Text color={textColor} dimColor={textDim}>\n {' '}\n {header}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\n/**\n * Clarifying questions prompt for the AskUserQuestion tool.\n * Supports single-select, multi-select, and inline free-text input.\n */\nexport function ClarifyingQuestionsPrompt({\n props,\n}: ClarifyingQuestionsPromptComponentProps): React.ReactElement {\n const { questions } = props;\n const { state, actions } = useWizard();\n const { resolvePending, addItem } = actions;\n const { agentState, terminalSize } = state;\n\n // Track current question index\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\n // Track answers for each question\n const [answers, setAnswers] = useState<Record<string, string>>({});\n // Track multi-select selections for current question\n const [multiSelections, setMultiSelections] = useState<string[]>([]);\n // Track highlighted item index\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n // Track custom text value for \"Type something\" option\n const [customText, setCustomText] = useState('');\n // Track if we're in typing mode (when Type something is selected and user is typing)\n const [isTypingMode, setIsTypingMode] = useState(false);\n // Track if we're in review mode (after all questions answered)\n const [isReviewMode, setIsReviewMode] = useState(false);\n // Track highlighted option in review mode (0 = Submit, 1 = Cancel)\n const [reviewHighlightedIndex, setReviewHighlightedIndex] = useState(0);\n\n const currentQuestion = questions[currentQuestionIndex];\n const isLastQuestion = currentQuestionIndex === questions.length - 1;\n const isMultiSelect = currentQuestion?.multiSelect ?? false;\n\n // Get regular option values (needed before handleCustomTextSubmit)\n const regularOptionValues = useMemo(() => {\n if (!currentQuestion) return new Set<string>();\n return new Set(currentQuestion.options.map((opt) => opt.label));\n }, [currentQuestion]);\n\n // Get custom entries (values in multiSelections that aren't regular options)\n const customEntries = useMemo(() => {\n return multiSelections.filter((v) => !regularOptionValues.has(v));\n }, [multiSelections, regularOptionValues]);\n\n // Build list items for current question\n const items: ListItem[] = useMemo(() => {\n if (!currentQuestion) return [];\n\n const questionItems: ListItem[] = currentQuestion.options.map((opt) => ({\n label: opt.label,\n value: opt.label,\n description: opt.description,\n }));\n\n // Add \"Type something\" option for free-text input\n questionItems.push({\n label: 'Type something',\n value: '__OTHER__',\n });\n\n // Add \"Submit\" option for multi-select (always visible)\n if (isMultiSelect) {\n questionItems.push({\n label: 'Submit',\n value: '__SUBMIT__',\n });\n }\n\n return questionItems;\n }, [currentQuestion, isMultiSelect, multiSelections]);\n\n // Auto-enter typing mode when \"Type something\" is highlighted\n useEffect(() => {\n // Only auto-enter typing mode if:\n // 1. Not already in typing mode\n // 2. Not in review mode\n // 3. \"Type something\" is highlighted\n // 4. No custom entries exist yet (for multi-select)\n if (\n !isTypingMode &&\n !isReviewMode &&\n items[highlightedIndex]?.value === '__OTHER__' &&\n customEntries.length === 0\n ) {\n setIsTypingMode(true);\n }\n }, [\n highlightedIndex,\n items,\n isTypingMode,\n isReviewMode,\n customEntries.length,\n ]);\n\n // Move to next question or go to review\n const proceedToNext = useCallback(\n (answer: string) => {\n const newAnswers = {\n ...answers,\n [currentQuestion.question]: answer,\n };\n setAnswers(newAnswers);\n\n if (isLastQuestion) {\n // All questions answered, go to review mode\n setIsReviewMode(true);\n setReviewHighlightedIndex(0);\n } else {\n // Move to next question\n setCurrentQuestionIndex((idx) => idx + 1);\n setMultiSelections([]);\n setHighlightedIndex(0);\n setCustomText('');\n setIsTypingMode(false);\n }\n },\n [answers, currentQuestion, isLastQuestion],\n );\n\n // Submit final answers\n const submitAnswers = useCallback(() => {\n // Add history item showing questions and answers\n addItem({\n type: 'clarifying-questions-result',\n text: \"User answered Raindrop wizard's questions:\",\n questionsAndAnswers: questions.map((q) => ({\n question: q.question,\n answer: answers[q.question] || '(no answer)',\n })),\n });\n\n const result: ClarifyingQuestionsResult = {\n questions,\n answers,\n };\n resolvePending(result);\n }, [questions, answers, resolvePending, addItem]);\n\n // Cancel and return empty answers, interrupting the agent\n const cancelAnswers = useCallback(() => {\n // Add history item indicating user declined\n addItem({\n type: 'declined-questions',\n text: 'User declined to answer questions',\n });\n\n // Interrupt the agent\n if (agentState.queryHandle?.interrupt) {\n void agentState.queryHandle.interrupt();\n }\n\n const result: ClarifyingQuestionsResult = {\n questions,\n answers: {},\n };\n resolvePending(result);\n }, [questions, resolvePending, addItem, agentState.queryHandle]);\n\n // Handle custom text submission from TextInput\n const handleCustomTextSubmit = useCallback(\n (value: string) => {\n if (!value.trim()) return;\n\n const trimmedValue = value.trim();\n\n if (isMultiSelect) {\n // Multi-select: Replace any existing custom entries with the new value\n // This ensures only the latest typed value is kept, not multiple versions\n if (multiSelections.includes(trimmedValue)) {\n // Same value already exists - toggle it off\n setMultiSelections((prev) => prev.filter((v) => v !== trimmedValue));\n } else {\n // New value - remove old custom entries and add the new one\n setMultiSelections((prev) => {\n const withoutOldCustom = prev.filter((v) =>\n regularOptionValues.has(v),\n );\n return [...withoutOldCustom, trimmedValue];\n });\n }\n // Don't clear text - keep it for further editing or submit\n } else {\n // Single-select: Submit immediately with the typed value\n proceedToNext(trimmedValue);\n }\n },\n [isMultiSelect, multiSelections, regularOptionValues, proceedToNext],\n );\n\n // Handle keyboard navigation and selection\n useInput((input, key) => {\n // Ctrl+C always cancels/declines questions (no matter what mode we're in)\n if (key.ctrl && input === 'c') {\n cancelAnswers();\n return;\n }\n\n // Review mode has its own navigation\n if (isReviewMode) {\n if (key.escape) {\n // Go back to last question\n setIsReviewMode(false);\n setHighlightedIndex(0);\n return;\n }\n if (key.upArrow) {\n setReviewHighlightedIndex((idx) => Math.max(0, idx - 1));\n return;\n }\n if (key.downArrow) {\n setReviewHighlightedIndex((idx) => Math.min(1, idx + 1));\n return;\n }\n if (key.return) {\n if (reviewHighlightedIndex === 0) {\n submitAnswers();\n } else {\n cancelAnswers();\n }\n return;\n }\n return;\n }\n\n // Escape handling - always active\n if (key.escape) {\n if (isTypingMode) {\n // Exit typing mode\n setIsTypingMode(false);\n } else if (currentQuestionIndex > 0) {\n // Go back to previous question\n setCurrentQuestionIndex((idx) => idx - 1);\n setMultiSelections([]);\n setHighlightedIndex(0);\n setCustomText('');\n } else {\n // On first question, cancel entirely\n cancelAnswers();\n }\n return;\n }\n\n // Arrow keys - exit typing mode and navigate\n if (key.upArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) => Math.max(0, idx - 1));\n return;\n }\n if (key.downArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) => Math.min(items.length - 1, idx + 1));\n return;\n }\n\n // Skip other keys when typing - TextInput handles them\n if (isTypingMode) {\n return;\n }\n\n // Enter to select\n if (key.return) {\n const selectedItem = items[highlightedIndex];\n if (!selectedItem) return;\n\n if (selectedItem.value === '__OTHER__') {\n if (isMultiSelect && customEntries.length > 0) {\n // Already has custom entries - toggle (clear) them to uncheck\n setMultiSelections((prev) =>\n prev.filter((v) => !customEntries.includes(v)),\n );\n setCustomText('');\n return;\n }\n // No custom entries yet - enter typing mode\n setIsTypingMode(true);\n return;\n }\n\n if (selectedItem.value === '__SUBMIT__') {\n // Submit with all checked selections only\n if (multiSelections.length > 0) {\n proceedToNext(multiSelections.join(', '));\n }\n return;\n }\n\n if (isMultiSelect) {\n // Toggle selection for multi-select\n setMultiSelections((prev) => {\n if (prev.includes(selectedItem.value)) {\n return prev.filter((v) => v !== selectedItem.value);\n }\n return [...prev, selectedItem.value];\n });\n } else {\n // Single select - proceed immediately\n proceedToNext(selectedItem.value);\n }\n }\n });\n\n // Render a single list item\n const renderItem = (item: ListItem, index: number) => {\n const isHighlighted = index === highlightedIndex;\n const isSelected = multiSelections.includes(item.value);\n const isTypeOption = item.value === '__OTHER__';\n const isSubmitOption = item.value === '__SUBMIT__';\n const displayNumber = index + 1;\n\n // Indicator (removed for cleaner UI)\n const indicator = ' ';\n\n // For \"Type something\" option with inline text input\n if (isTypeOption) {\n // Show checkbox only for multi-select\n const hasCustomEntries = customEntries.length > 0;\n const checkbox = isMultiSelect\n ? hasCustomEntries\n ? '[✓] '\n : '[ ] '\n : '';\n const optionNumber = `${displayNumber}. `;\n const inputWidth = Math.max(\n 1,\n terminalSize.width - indicator.length - optionNumber.length - checkbox.length,\n );\n\n return (\n <Box key={item.value} width={terminalSize.width}>\n <Text color={isHighlighted ? 'cyan' : undefined}>\n {indicator}\n {optionNumber}\n {checkbox}\n </Text>\n {isTypingMode || customText ? (\n <Box width={inputWidth}>\n <TextInput\n value={customText}\n onChange={setCustomText}\n onSubmit={handleCustomTextSubmit}\n focus={isTypingMode}\n placeholder=\"\"\n />\n </Box>\n ) : (\n <Box width={inputWidth}>\n <Text color={isHighlighted ? 'cyan' : undefined} wrap=\"truncate-end\">\n {item.label}\n </Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // Submit option\n if (isSubmitOption) {\n const canSubmit = multiSelections.length > 0;\n const textColor = isHighlighted\n ? 'cyan'\n : !canSubmit\n ? 'gray'\n : 'green';\n // Calculate spacing to align with checkbox brackets (same as \"N. \" where N is the number)\n const numberSpacing = `${displayNumber}. `;\n return (\n <Box key={item.value}>\n <Text color={textColor} bold>\n {indicator}\n {' '.repeat(numberSpacing.length)}Submit\n </Text>\n </Box>\n );\n }\n\n // Regular option - show checkbox for multi-select mode\n const checkbox = isMultiSelect ? (isSelected ? '[✓] ' : '[ ] ') : '';\n\n return (\n <Box key={item.value} flexDirection=\"column\">\n <Text color={isHighlighted ? 'cyan' : undefined}>\n {indicator}\n {displayNumber}. {checkbox}\n {item.label}\n </Text>\n {item.description && (\n <Box marginLeft={4}>\n <Text dimColor>{item.description}</Text>\n </Box>\n )}\n </Box>\n );\n };\n\n if (!currentQuestion && !isReviewMode) {\n return (\n <Box>\n <Text color=\"red\">No questions to display</Text>\n </Box>\n );\n }\n\n // Review mode - show all answers and confirm\n if (isReviewMode) {\n return (\n <PromptContainer>\n {/* Stepper progress bar - show Submit as current */}\n <StepperProgress\n questions={questions}\n currentIndex={questions.length}\n answers={answers}\n />\n\n {/* Review header */}\n <Box marginBottom={1}>\n <Text bold>Review your answers</Text>\n </Box>\n\n {/* List all questions and answers */}\n <Box flexDirection=\"column\" marginBottom={1}>\n {questions.map((q) => (\n <Box key={q.question} flexDirection=\"column\" marginLeft={1}>\n <Box>\n <Text color=\"blue\">● </Text>\n <Text>{q.question}</Text>\n </Box>\n <Box marginLeft={2}>\n <Text color=\"green\">\n {answers[q.question] || '(no answer)'}\n </Text>\n </Box>\n </Box>\n ))}\n </Box>\n\n {/* Confirmation prompt */}\n <Box marginBottom={1}>\n <Text>Ready to submit your answers?</Text>\n </Box>\n\n {/* Submit/Cancel options */}\n <Box flexDirection=\"column\">\n <Box>\n <Text\n color={reviewHighlightedIndex === 0 ? 'cyan' : 'green'}\n bold\n >\n {reviewHighlightedIndex === 0 ? '› ' : ' '}1. Submit answers\n </Text>\n </Box>\n <Box>\n <Text color={reviewHighlightedIndex === 1 ? 'cyan' : undefined}>\n {reviewHighlightedIndex === 1 ? '› ' : ' '}2. Cancel\n </Text>\n </Box>\n </Box>\n </PromptContainer>\n );\n }\n\n return (\n <PromptContainer>\n {/* Stepper progress bar */}\n <StepperProgress\n questions={questions}\n currentIndex={currentQuestionIndex}\n answers={answers}\n />\n\n {/* Question text */}\n <Box marginBottom={1}>\n <Text>{currentQuestion.question}</Text>\n </Box>\n\n {/* Options list */}\n <Box flexDirection=\"column\">\n {items.map((item, index) => renderItem(item, index))}\n </Box>\n </PromptContainer>\n );\n}\n\nexport default ClarifyingQuestionsPrompt;\n"]}
@@ -6,9 +6,10 @@ import React from 'react';
6
6
  interface ContinuePromptProps {
7
7
  message: string;
8
8
  buttonLabel?: string;
9
+ anyKey?: boolean;
9
10
  }
10
11
  /**
11
- * Continue button prompt that waits for Enter key
12
+ * Continue button prompt that waits for Enter key (or any key if anyKey is true)
12
13
  */
13
- export declare function ContinuePrompt({ message, buttonLabel, }: ContinuePromptProps): React.ReactElement;
14
+ export declare function ContinuePrompt({ message, buttonLabel, anyKey, }: ContinuePromptProps): React.ReactElement;
14
15
  export default ContinuePrompt;
@@ -4,16 +4,16 @@ import { useWizardActions } from '../contexts/WizardContext.js';
4
4
  import { CANCEL_SYMBOL } from '../cancellation.js';
5
5
  import { PromptContainer } from './PromptContainer.js';
6
6
  /**
7
- * Continue button prompt that waits for Enter key
7
+ * Continue button prompt that waits for Enter key (or any key if anyKey is true)
8
8
  */
9
- export function ContinuePrompt({ message, buttonLabel = 'Continue', }) {
10
- const { resolvePending, addItem } = useWizardActions();
9
+ export function ContinuePrompt({ message, buttonLabel = 'Continue', anyKey = false, }) {
10
+ const { resolvePending } = useWizardActions();
11
11
  useInput((input, key) => {
12
12
  if (key.ctrl && input === 'c') {
13
13
  resolvePending(CANCEL_SYMBOL);
14
14
  return;
15
15
  }
16
- if (key.return) {
16
+ if (anyKey || key.return) {
17
17
  resolvePending(true);
18
18
  }
19
19
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ContinuePrompt.js","sourceRoot":"","sources":["../../../../src/ui/components/ContinuePrompt.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAOvD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,WAAW,GAAG,UAAU,GACJ;IACpB,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAEvD,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,eAAe,cACd,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,6BACnB,GAAG,IACA,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,OAAO,GAAQ,IAC/B,GACU,CACnB,CAAC;AACJ,CAAC;AAED,eAAe,cAAc,CAAC","sourcesContent":["/**\n * Continue button prompt component.\n * Shows a message and waits for user to press Enter to continue.\n */\n\nimport React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useWizardActions } from '../contexts/WizardContext.js';\nimport { CANCEL_SYMBOL } from '../cancellation.js';\nimport { PromptContainer } from './PromptContainer.js';\n\ninterface ContinuePromptProps {\n message: string;\n buttonLabel?: string;\n}\n\n/**\n * Continue button prompt that waits for Enter key\n */\nexport function ContinuePrompt({\n message,\n buttonLabel = 'Continue',\n}: ContinuePromptProps): React.ReactElement {\n const { resolvePending, addItem } = useWizardActions();\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n resolvePending(CANCEL_SYMBOL);\n return;\n }\n\n if (key.return) {\n resolvePending(true);\n }\n });\n\n return (\n <PromptContainer>\n <Box>\n <Text color=\"cyan\" bold>\n ›{' '}\n </Text>\n <Text color=\"cyan\">{message}</Text>\n </Box>\n </PromptContainer>\n );\n}\n\nexport default ContinuePrompt;\n"]}
1
+ {"version":3,"file":"ContinuePrompt.js","sourceRoot":"","sources":["../../../../src/ui/components/ContinuePrompt.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAQvD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,WAAW,GAAG,UAAU,EACxB,MAAM,GAAG,KAAK,GACM;IACpB,MAAM,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE9C,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACzB,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,eAAe,cACd,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,6BACnB,GAAG,IACA,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,OAAO,GAAQ,IAC/B,GACU,CACnB,CAAC;AACJ,CAAC;AAED,eAAe,cAAc,CAAC","sourcesContent":["/**\n * Continue button prompt component.\n * Shows a message and waits for user to press Enter to continue.\n */\n\nimport React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useWizardActions } from '../contexts/WizardContext.js';\nimport { CANCEL_SYMBOL } from '../cancellation.js';\nimport { PromptContainer } from './PromptContainer.js';\n\ninterface ContinuePromptProps {\n message: string;\n buttonLabel?: string;\n anyKey?: boolean;\n}\n\n/**\n * Continue button prompt that waits for Enter key (or any key if anyKey is true)\n */\nexport function ContinuePrompt({\n message,\n buttonLabel = 'Continue',\n anyKey = false,\n}: ContinuePromptProps): React.ReactElement {\n const { resolvePending } = useWizardActions();\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n resolvePending(CANCEL_SYMBOL);\n return;\n }\n\n if (anyKey || key.return) {\n resolvePending(true);\n }\n });\n\n return (\n <PromptContainer>\n <Box>\n <Text color=\"cyan\" bold>\n ›{' '}\n </Text>\n <Text color=\"cyan\">{message}</Text>\n </Box>\n </PromptContainer>\n );\n}\n\nexport default ContinuePrompt;\n"]}
@@ -4,7 +4,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  * Renders unified diff format with syntax highlighting.
5
5
  */
6
6
  import { useMemo } from 'react';
7
- import { Box, Text, useStdout } from 'ink';
7
+ import { Box, Text } from 'ink';
8
+ import { useWizardState } from '../contexts/WizardContext.js';
8
9
  /**
9
10
  * Parse unified diff format into structured lines
10
11
  */
@@ -65,8 +66,8 @@ function parseDiff(diffContent) {
65
66
  * Display a unified diff with colored lines
66
67
  */
67
68
  export function DiffDisplay({ diffContent, fileName, maxHeight, }) {
68
- const { stdout } = useStdout();
69
- const terminalWidth = stdout?.columns || 80;
69
+ const { terminalSize } = useWizardState();
70
+ const terminalWidth = terminalSize.width;
70
71
  const parsedLines = useMemo(() => {
71
72
  if (!diffContent || typeof diffContent !== 'string') {
72
73
  return [];
@@ -80,6 +81,15 @@ export function DiffDisplay({ diffContent, fileName, maxHeight, }) {
80
81
  .map((l) => l.lineNumber));
81
82
  }, [parsedLines]);
82
83
  const gutterWidth = Math.max(4, maxLineNum.toString().length + 1);
84
+ // Calculate available width for content (terminal width - gutter - symbols)
85
+ // Gutter: gutterWidth chars, Symbol: " + " or " - " (3 chars), margin: 2 chars
86
+ const maxContentWidth = Math.max(20, terminalWidth - gutterWidth - 5);
87
+ // Truncate long lines to fit terminal width
88
+ const truncateContent = (content) => {
89
+ if (content.length <= maxContentWidth)
90
+ return content;
91
+ return content.substring(0, maxContentWidth - 3) + '...';
92
+ };
83
93
  if (parsedLines.length === 0) {
84
94
  return (_jsx(Box, { children: _jsx(Text, { dimColor: true, children: "No changes to display" }) }));
85
95
  }
@@ -96,11 +106,11 @@ export function DiffDisplay({ diffContent, fileName, maxHeight, }) {
96
106
  case 'hunk':
97
107
  return (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "cyan", children: line.content }) }, key));
98
108
  case 'add':
99
- return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: (line.lineNumber?.toString() || '').padStart(gutterWidth) }), _jsxs(Text, { color: "green", backgroundColor: "greenBright", children: [' ', "+", ' '] }), _jsx(Text, { color: "green", children: line.content })] }, key));
109
+ return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: (line.lineNumber?.toString() || '').padStart(gutterWidth) }), _jsxs(Text, { color: "green", backgroundColor: "greenBright", children: [' ', "+", ' '] }), _jsx(Text, { color: "green", children: truncateContent(line.content) })] }, key));
100
110
  case 'del':
101
- return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: ''.padStart(gutterWidth) }), _jsxs(Text, { color: "red", backgroundColor: "redBright", children: [' ', "-", ' '] }), _jsx(Text, { color: "red", children: line.content })] }, key));
111
+ return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: ''.padStart(gutterWidth) }), _jsxs(Text, { color: "red", backgroundColor: "redBright", children: [' ', "-", ' '] }), _jsx(Text, { color: "red", children: truncateContent(line.content) })] }, key));
102
112
  case 'context':
103
- return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: (line.lineNumber?.toString() || '').padStart(gutterWidth) }), _jsx(Text, { children: " " }), _jsx(Text, { children: line.content })] }, key));
113
+ return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: (line.lineNumber?.toString() || '').padStart(gutterWidth) }), _jsx(Text, { children: " " }), _jsx(Text, { children: truncateContent(line.content) })] }, key));
104
114
  default:
105
115
  return null;
106
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DiffDisplay.js","sourceRoot":"","sources":["../../../../src/ui/components/DiffDisplay.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Diff display component for showing file changes.\n * Renders unified diff format with syntax highlighting.\n */\n\nimport React, { useMemo } from 'react';\nimport { Box, Text, useStdout } from 'ink';\n\ninterface DiffLine {\n type: 'add' | 'del' | 'context' | 'hunk' | 'header';\n lineNumber?: number;\n content: string;\n}\n\ninterface DiffDisplayProps {\n /** The diff content in unified diff format */\n diffContent: string;\n /** The filename being modified */\n fileName?: string;\n /** Maximum height in lines (for scrollable content) */\n maxHeight?: number;\n}\n\n/**\n * Parse unified diff format into structured lines\n */\nfunction parseDiff(diffContent: string): DiffLine[] {\n const lines = diffContent.split('\\n');\n const result: DiffLine[] = [];\n let newLineNumber = 0;\n const hunkHeaderRegex = /^@@ -\\d+,?\\d* \\+(\\d+),?\\d* @@/;\n\n for (const line of lines) {\n // Skip git header lines\n if (line.startsWith('diff --git') || line.startsWith('index ')) {\n continue;\n }\n\n // File header lines\n if (line.startsWith('--- ') || line.startsWith('+++ ')) {\n // result.push({ type: 'header', content: line }); // Skip file header lines\n continue;\n }\n\n // Hunk header\n const hunkMatch = line.match(hunkHeaderRegex);\n if (hunkMatch) {\n newLineNumber = parseInt(hunkMatch[1], 10) - 1;\n result.push({ type: 'hunk', content: line });\n continue;\n }\n\n // Added line\n if (line.startsWith('+')) {\n newLineNumber++;\n result.push({\n type: 'add',\n lineNumber: newLineNumber,\n content: line.substring(1),\n });\n continue;\n }\n\n // Deleted line\n if (line.startsWith('-')) {\n result.push({\n type: 'del',\n content: line.substring(1),\n });\n continue;\n }\n\n // Context line\n if (line.startsWith(' ')) {\n newLineNumber++;\n result.push({\n type: 'context',\n lineNumber: newLineNumber,\n content: line.substring(1),\n });\n continue;\n }\n }\n\n return result;\n}\n\n/**\n * Display a unified diff with colored lines\n */\nexport function DiffDisplay({\n diffContent,\n fileName,\n maxHeight,\n}: DiffDisplayProps): React.ReactElement {\n const { stdout } = useStdout();\n const terminalWidth = stdout?.columns || 80;\n\n const parsedLines = useMemo(() => {\n if (!diffContent || typeof diffContent !== 'string') {\n return [];\n }\n return parseDiff(diffContent);\n }, [diffContent]);\n\n // Calculate gutter width based on max line number\n const maxLineNum = useMemo(() => {\n return Math.max(\n 0,\n ...parsedLines\n .filter((l) => l.lineNumber !== undefined)\n .map((l) => l.lineNumber as number),\n );\n }, [parsedLines]);\n const gutterWidth = Math.max(4, maxLineNum.toString().length + 1);\n\n if (parsedLines.length === 0) {\n return (\n <Box>\n <Text dimColor>No changes to display</Text>\n </Box>\n );\n }\n\n // Limit lines if maxHeight is specified\n const displayLines = maxHeight\n ? parsedLines.slice(0, maxHeight)\n : parsedLines;\n const truncated = maxHeight && parsedLines.length > maxHeight;\n\n return (\n <Box flexDirection=\"column\" width={terminalWidth}>\n {/* File name header */}\n {fileName && (\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {fileName}\n </Text>\n </Box>\n )}\n\n {/* Diff lines */}\n {displayLines.map((line, index) => {\n const key = `diff-line-${index}`;\n\n switch (line.type) {\n case 'header':\n return (\n <Box key={key}>\n <Text dimColor>{line.content}</Text>\n </Box>\n );\n\n case 'hunk':\n return (\n <Box key={key} marginTop={1}>\n <Text color=\"cyan\">{line.content}</Text>\n </Box>\n );\n\n case 'add':\n return (\n <Box key={key}>\n <Text dimColor>\n {(line.lineNumber?.toString() || '').padStart(gutterWidth)}\n </Text>\n <Text color=\"green\" backgroundColor=\"greenBright\">\n {' '}\n +{' '}\n </Text>\n <Text color=\"green\">{line.content}</Text>\n </Box>\n );\n\n case 'del':\n return (\n <Box key={key}>\n <Text dimColor>{''.padStart(gutterWidth)}</Text>\n <Text color=\"red\" backgroundColor=\"redBright\">\n {' '}\n -{' '}\n </Text>\n <Text color=\"red\">{line.content}</Text>\n </Box>\n );\n\n case 'context':\n return (\n <Box key={key}>\n <Text dimColor>\n {(line.lineNumber?.toString() || '').padStart(gutterWidth)}\n </Text>\n <Text> </Text>\n <Text>{line.content}</Text>\n </Box>\n );\n\n default:\n return null;\n }\n })}\n\n {/* Truncation indicator */}\n {truncated && (\n <Box marginTop={1}>\n <Text dimColor>\n ... {parsedLines.length - (maxHeight || 0)} more lines\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\nexport default DiffDisplay;\n"]}
1
+ {"version":3,"file":"DiffDisplay.js","sourceRoot":"","sources":["../../../../src/ui/components/DiffDisplay.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Diff display component for showing file changes.\n * Renders unified diff format with syntax highlighting.\n */\n\nimport React, { useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport { useWizardState } from '../contexts/WizardContext.js';\n\ninterface DiffLine {\n type: 'add' | 'del' | 'context' | 'hunk' | 'header';\n lineNumber?: number;\n content: string;\n}\n\ninterface DiffDisplayProps {\n /** The diff content in unified diff format */\n diffContent: string;\n /** The filename being modified */\n fileName?: string;\n /** Maximum height in lines (for scrollable content) */\n maxHeight?: number;\n}\n\n/**\n * Parse unified diff format into structured lines\n */\nfunction parseDiff(diffContent: string): DiffLine[] {\n const lines = diffContent.split('\\n');\n const result: DiffLine[] = [];\n let newLineNumber = 0;\n const hunkHeaderRegex = /^@@ -\\d+,?\\d* \\+(\\d+),?\\d* @@/;\n\n for (const line of lines) {\n // Skip git header lines\n if (line.startsWith('diff --git') || line.startsWith('index ')) {\n continue;\n }\n\n // File header lines\n if (line.startsWith('--- ') || line.startsWith('+++ ')) {\n // result.push({ type: 'header', content: line }); // Skip file header lines\n continue;\n }\n\n // Hunk header\n const hunkMatch = line.match(hunkHeaderRegex);\n if (hunkMatch) {\n newLineNumber = parseInt(hunkMatch[1], 10) - 1;\n result.push({ type: 'hunk', content: line });\n continue;\n }\n\n // Added line\n if (line.startsWith('+')) {\n newLineNumber++;\n result.push({\n type: 'add',\n lineNumber: newLineNumber,\n content: line.substring(1),\n });\n continue;\n }\n\n // Deleted line\n if (line.startsWith('-')) {\n result.push({\n type: 'del',\n content: line.substring(1),\n });\n continue;\n }\n\n // Context line\n if (line.startsWith(' ')) {\n newLineNumber++;\n result.push({\n type: 'context',\n lineNumber: newLineNumber,\n content: line.substring(1),\n });\n continue;\n }\n }\n\n return result;\n}\n\n/**\n * Display a unified diff with colored lines\n */\nexport function DiffDisplay({\n diffContent,\n fileName,\n maxHeight,\n}: DiffDisplayProps): React.ReactElement {\n const { terminalSize } = useWizardState();\n const terminalWidth = terminalSize.width;\n\n const parsedLines = useMemo(() => {\n if (!diffContent || typeof diffContent !== 'string') {\n return [];\n }\n return parseDiff(diffContent);\n }, [diffContent]);\n\n // Calculate gutter width based on max line number\n const maxLineNum = useMemo(() => {\n return Math.max(\n 0,\n ...parsedLines\n .filter((l) => l.lineNumber !== undefined)\n .map((l) => l.lineNumber as number),\n );\n }, [parsedLines]);\n const gutterWidth = Math.max(4, maxLineNum.toString().length + 1);\n\n // Calculate available width for content (terminal width - gutter - symbols)\n // Gutter: gutterWidth chars, Symbol: \" + \" or \" - \" (3 chars), margin: 2 chars\n const maxContentWidth = Math.max(20, terminalWidth - gutterWidth - 5);\n\n // Truncate long lines to fit terminal width\n const truncateContent = (content: string): string => {\n if (content.length <= maxContentWidth) return content;\n return content.substring(0, maxContentWidth - 3) + '...';\n };\n\n if (parsedLines.length === 0) {\n return (\n <Box>\n <Text dimColor>No changes to display</Text>\n </Box>\n );\n }\n\n // Limit lines if maxHeight is specified\n const displayLines = maxHeight\n ? parsedLines.slice(0, maxHeight)\n : parsedLines;\n const truncated = maxHeight && parsedLines.length > maxHeight;\n\n return (\n <Box flexDirection=\"column\" width={terminalWidth}>\n {/* File name header */}\n {fileName && (\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {fileName}\n </Text>\n </Box>\n )}\n\n {/* Diff lines */}\n {displayLines.map((line, index) => {\n const key = `diff-line-${index}`;\n\n switch (line.type) {\n case 'header':\n return (\n <Box key={key}>\n <Text dimColor>{line.content}</Text>\n </Box>\n );\n\n case 'hunk':\n return (\n <Box key={key} marginTop={1}>\n <Text color=\"cyan\">{line.content}</Text>\n </Box>\n );\n\n case 'add':\n return (\n <Box key={key}>\n <Text dimColor>\n {(line.lineNumber?.toString() || '').padStart(gutterWidth)}\n </Text>\n <Text color=\"green\" backgroundColor=\"greenBright\">\n {' '}\n +{' '}\n </Text>\n <Text color=\"green\">{truncateContent(line.content)}</Text>\n </Box>\n );\n\n case 'del':\n return (\n <Box key={key}>\n <Text dimColor>{''.padStart(gutterWidth)}</Text>\n <Text color=\"red\" backgroundColor=\"redBright\">\n {' '}\n -{' '}\n </Text>\n <Text color=\"red\">{truncateContent(line.content)}</Text>\n </Box>\n );\n\n case 'context':\n return (\n <Box key={key}>\n <Text dimColor>\n {(line.lineNumber?.toString() || '').padStart(gutterWidth)}\n </Text>\n <Text> </Text>\n <Text>{truncateContent(line.content)}</Text>\n </Box>\n );\n\n default:\n return null;\n }\n })}\n\n {/* Truncation indicator */}\n {truncated && (\n <Box marginTop={1}>\n <Text dimColor>\n ... {parsedLines.length - (maxHeight || 0)} more lines\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\nexport default DiffDisplay;\n"]}
@@ -15,8 +15,9 @@ import { CANCEL_SYMBOL } from '../cancellation.js';
15
15
  * Can be used standalone (resolves via WizardContext) or embedded (via onResult callback).
16
16
  */
17
17
  export function FeedbackSelectPrompt({ options, onResult, standalone = true, }) {
18
- const { actions } = useWizard();
18
+ const { actions, state } = useWizard();
19
19
  const { resolvePending, addItem } = actions;
20
+ const { terminalSize } = state;
20
21
  const [highlightedIndex, setHighlightedIndex] = useState(0);
21
22
  const [isTypingMode, setIsTypingMode] = useState(false);
22
23
  const [customText, setCustomText] = useState('');
@@ -120,12 +121,14 @@ export function FeedbackSelectPrompt({ options, onResult, standalone = true, })
120
121
  return (_jsxs(PromptContainer, { children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: options.message }) }), _jsx(Box, { flexDirection: "column", children: options.options.map((option, index) => {
121
122
  const isHighlighted = index === highlightedIndex;
122
123
  const isTextOption = option.allowTextInput;
124
+ const optionPrefix = `${index + 1}. `;
125
+ const optionContentWidth = Math.max(1, terminalSize.width - optionPrefix.length);
123
126
  // Text input option in typing mode
124
127
  if (isTextOption && isTypingMode && index === highlightedIndex) {
125
- return (_jsxs(Box, { children: [_jsxs(Text, { color: "cyan", children: [index + 1, ".", ' '] }), _jsx(TextInput, { value: customText, onChange: setCustomText, onSubmit: handleTextSubmit, focus: true, placeholder: "" })] }, index));
128
+ return (_jsxs(Box, { width: terminalSize.width, children: [_jsx(Text, { color: "cyan", children: optionPrefix }), _jsx(Box, { width: optionContentWidth, children: _jsx(TextInput, { value: customText, onChange: setCustomText, onSubmit: handleTextSubmit, focus: true, placeholder: "" }) })] }, index));
126
129
  }
127
130
  // Regular option display
128
- return (_jsx(Box, { children: _jsxs(Text, { color: isHighlighted ? 'cyan' : undefined, children: [index + 1, ". ", option.label] }) }, index));
131
+ return (_jsx(Box, { width: terminalSize.width, children: _jsxs(Text, { color: isHighlighted ? 'cyan' : undefined, wrap: "truncate-end", children: [optionPrefix, option.label] }) }, index));
129
132
  }) })] }));
130
133
  }
131
134
  export default FeedbackSelectPrompt;
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackSelectPrompt.js","sourceRoot":"","sources":["../../../../src/ui/components/FeedbackSelectPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Feedback select prompt component.\n * A reusable select prompt where one option can enable inline text input.\n * Used by PlanApprovalPrompt and test-server for \"yes/no with feedback\" patterns.\n */\n\nimport React, { useState, useCallback, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { useWizard } from '../contexts/WizardContext.js';\nimport { PromptContainer } from './PromptContainer.js';\nimport { CANCEL_SYMBOL } from '../cancellation.js';\nimport type {\n FeedbackSelectOptions,\n FeedbackSelectResult,\n FeedbackSelectOption,\n} from '../types.js';\n\ninterface FeedbackSelectPromptProps<T> {\n options: FeedbackSelectOptions<T>;\n /** Optional callback for when result is ready (used by PlanApprovalPrompt) */\n onResult?: (result: FeedbackSelectResult<T>) => void;\n /** If true, this component manages its own resolution via WizardContext */\n standalone?: boolean;\n}\n\n/**\n * Feedback select prompt that supports inline text input for specific options.\n * Can be used standalone (resolves via WizardContext) or embedded (via onResult callback).\n */\nexport function FeedbackSelectPrompt<T>({\n options,\n onResult,\n standalone = true,\n}: FeedbackSelectPromptProps<T>): React.ReactElement {\n const { actions } = useWizard();\n const { resolvePending, addItem } = actions;\n\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const [isTypingMode, setIsTypingMode] = useState(false);\n const [customText, setCustomText] = useState('');\n\n // Auto-enter typing mode when a text input option is highlighted\n useEffect(() => {\n const selectedOption = options.options[highlightedIndex];\n if (!isTypingMode && selectedOption?.allowTextInput) {\n setIsTypingMode(true);\n }\n }, [highlightedIndex, options.options, isTypingMode]);\n\n // Handle submitting a result\n const submitResult = useCallback(\n (result: FeedbackSelectResult<T>) => {\n if (onResult) {\n // Embedded mode - call the callback\n onResult(result);\n } else if (standalone) {\n // Standalone mode - resolve via context\n // Only add to history if skipHistory is not true\n if (!options.skipHistory) {\n addItem({\n type: 'select-result',\n text: options.message,\n label:\n result.type === 'option'\n ? options.options.find((o) => o.value === result.value)?.label ||\n String(result.value)\n : result.value,\n });\n }\n resolvePending(result);\n }\n },\n [onResult, standalone, addItem, resolvePending, options],\n );\n\n // Handle selecting a regular option\n const handleOptionSelect = useCallback(\n (option: FeedbackSelectOption<T>) => {\n submitResult({ type: 'option', value: option.value });\n },\n [submitResult],\n );\n\n // Handle submitting text input\n const handleTextSubmit = useCallback(\n (text: string) => {\n if (!text.trim()) return;\n submitResult({ type: 'text', value: text.trim() });\n },\n [submitResult],\n );\n\n // Handle keyboard input\n useInput(\n (input, key) => {\n // Handle Ctrl+C cancellation\n if (key.ctrl && input === 'c') {\n if (onResult) {\n // Embedded mode (e.g., plan approval) - treat as rejection/interrupt\n submitResult({ type: 'text', value: 'interrupted' });\n } else if (standalone) {\n // Standalone mode - cancel via CANCEL_SYMBOL\n if (!options.skipHistory) {\n addItem({\n type: 'select-result',\n text: options.message,\n label: '(cancelled)',\n });\n }\n resolvePending(CANCEL_SYMBOL);\n }\n return;\n }\n\n // Escape handling\n if (key.escape) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n return;\n }\n\n // Arrow navigation - must come before isTypingMode check so arrows can exit typing mode\n if (key.upArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) => Math.max(0, idx - 1));\n return;\n }\n if (key.downArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) =>\n Math.min(options.options.length - 1, idx + 1),\n );\n return;\n }\n\n // Skip other keys when typing - TextInput handles them\n if (isTypingMode) {\n return;\n }\n\n // Enter to select\n if (key.return) {\n const selected = options.options[highlightedIndex];\n if (selected.allowTextInput) {\n setIsTypingMode(true);\n } else {\n handleOptionSelect(selected);\n }\n }\n },\n { isActive: true },\n );\n\n return (\n <PromptContainer>\n {/* Message */}\n <Box marginBottom={1}>\n <Text>{options.message}</Text>\n </Box>\n\n {/* Options */}\n <Box flexDirection=\"column\">\n {options.options.map((option, index) => {\n const isHighlighted = index === highlightedIndex;\n const isTextOption = option.allowTextInput;\n\n // Text input option in typing mode\n if (isTextOption && isTypingMode && index === highlightedIndex) {\n return (\n <Box key={index}>\n <Text color=\"cyan\">\n {index + 1}.{' '}\n </Text>\n <TextInput\n value={customText}\n onChange={setCustomText}\n onSubmit={handleTextSubmit}\n focus={true}\n placeholder=\"\"\n />\n </Box>\n );\n }\n\n // Regular option display\n return (\n <Box key={index}>\n <Text color={isHighlighted ? 'cyan' : undefined}>\n {index + 1}. {option.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n </PromptContainer>\n );\n}\n\nexport default FeedbackSelectPrompt;\n"]}
1
+ {"version":3,"file":"FeedbackSelectPrompt.js","sourceRoot":"","sources":["../../../../src/ui/components/FeedbackSelectPrompt.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Feedback select prompt component.\n * A reusable select prompt where one option can enable inline text input.\n * Used by PlanApprovalPrompt and test-server for \"yes/no with feedback\" patterns.\n */\n\nimport React, { useState, useCallback, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { useWizard } from '../contexts/WizardContext.js';\nimport { PromptContainer } from './PromptContainer.js';\nimport { CANCEL_SYMBOL } from '../cancellation.js';\nimport type {\n FeedbackSelectOptions,\n FeedbackSelectResult,\n FeedbackSelectOption,\n} from '../types.js';\n\ninterface FeedbackSelectPromptProps<T> {\n options: FeedbackSelectOptions<T>;\n /** Optional callback for when result is ready (used by PlanApprovalPrompt) */\n onResult?: (result: FeedbackSelectResult<T>) => void;\n /** If true, this component manages its own resolution via WizardContext */\n standalone?: boolean;\n}\n\n/**\n * Feedback select prompt that supports inline text input for specific options.\n * Can be used standalone (resolves via WizardContext) or embedded (via onResult callback).\n */\nexport function FeedbackSelectPrompt<T>({\n options,\n onResult,\n standalone = true,\n}: FeedbackSelectPromptProps<T>): React.ReactElement {\n const { actions, state } = useWizard();\n const { resolvePending, addItem } = actions;\n const { terminalSize } = state;\n\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const [isTypingMode, setIsTypingMode] = useState(false);\n const [customText, setCustomText] = useState('');\n\n // Auto-enter typing mode when a text input option is highlighted\n useEffect(() => {\n const selectedOption = options.options[highlightedIndex];\n if (!isTypingMode && selectedOption?.allowTextInput) {\n setIsTypingMode(true);\n }\n }, [highlightedIndex, options.options, isTypingMode]);\n\n // Handle submitting a result\n const submitResult = useCallback(\n (result: FeedbackSelectResult<T>) => {\n if (onResult) {\n // Embedded mode - call the callback\n onResult(result);\n } else if (standalone) {\n // Standalone mode - resolve via context\n // Only add to history if skipHistory is not true\n if (!options.skipHistory) {\n addItem({\n type: 'select-result',\n text: options.message,\n label:\n result.type === 'option'\n ? options.options.find((o) => o.value === result.value)?.label ||\n String(result.value)\n : result.value,\n });\n }\n resolvePending(result);\n }\n },\n [onResult, standalone, addItem, resolvePending, options],\n );\n\n // Handle selecting a regular option\n const handleOptionSelect = useCallback(\n (option: FeedbackSelectOption<T>) => {\n submitResult({ type: 'option', value: option.value });\n },\n [submitResult],\n );\n\n // Handle submitting text input\n const handleTextSubmit = useCallback(\n (text: string) => {\n if (!text.trim()) return;\n submitResult({ type: 'text', value: text.trim() });\n },\n [submitResult],\n );\n\n // Handle keyboard input\n useInput(\n (input, key) => {\n // Handle Ctrl+C cancellation\n if (key.ctrl && input === 'c') {\n if (onResult) {\n // Embedded mode (e.g., plan approval) - treat as rejection/interrupt\n submitResult({ type: 'text', value: 'interrupted' });\n } else if (standalone) {\n // Standalone mode - cancel via CANCEL_SYMBOL\n if (!options.skipHistory) {\n addItem({\n type: 'select-result',\n text: options.message,\n label: '(cancelled)',\n });\n }\n resolvePending(CANCEL_SYMBOL);\n }\n return;\n }\n\n // Escape handling\n if (key.escape) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n return;\n }\n\n // Arrow navigation - must come before isTypingMode check so arrows can exit typing mode\n if (key.upArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) => Math.max(0, idx - 1));\n return;\n }\n if (key.downArrow) {\n if (isTypingMode) {\n setIsTypingMode(false);\n }\n setHighlightedIndex((idx) =>\n Math.min(options.options.length - 1, idx + 1),\n );\n return;\n }\n\n // Skip other keys when typing - TextInput handles them\n if (isTypingMode) {\n return;\n }\n\n // Enter to select\n if (key.return) {\n const selected = options.options[highlightedIndex];\n if (selected.allowTextInput) {\n setIsTypingMode(true);\n } else {\n handleOptionSelect(selected);\n }\n }\n },\n { isActive: true },\n );\n\n return (\n <PromptContainer>\n {/* Message */}\n <Box marginBottom={1}>\n <Text>{options.message}</Text>\n </Box>\n\n {/* Options */}\n <Box flexDirection=\"column\">\n {options.options.map((option, index) => {\n const isHighlighted = index === highlightedIndex;\n const isTextOption = option.allowTextInput;\n const optionPrefix = `${index + 1}. `;\n const optionContentWidth = Math.max(\n 1,\n terminalSize.width - optionPrefix.length,\n );\n\n // Text input option in typing mode\n if (isTextOption && isTypingMode && index === highlightedIndex) {\n return (\n <Box key={index} width={terminalSize.width}>\n <Text color=\"cyan\">{optionPrefix}</Text>\n <Box width={optionContentWidth}>\n <TextInput\n value={customText}\n onChange={setCustomText}\n onSubmit={handleTextSubmit}\n focus={true}\n placeholder=\"\"\n />\n </Box>\n </Box>\n );\n }\n\n // Regular option display\n return (\n <Box key={index} width={terminalSize.width}>\n <Text color={isHighlighted ? 'cyan' : undefined} wrap=\"truncate-end\">\n {optionPrefix}\n {option.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n </PromptContainer>\n );\n}\n\nexport default FeedbackSelectPrompt;\n"]}
@@ -1,14 +1,16 @@
1
1
  /**
2
- * Component to display a completed history item in the Static section.
2
+ * Component to display a completed history item in the history section.
3
3
  * Each item type has its own styled rendering.
4
4
  */
5
5
  import React from 'react';
6
6
  import type { HistoryItem } from '../contexts/WizardContext.js';
7
7
  interface HistoryItemDisplayProps {
8
8
  item: HistoryItem;
9
+ terminalWidth: number;
9
10
  }
10
11
  /**
11
12
  * Renders a single history item based on its type
12
13
  */
13
- export declare function HistoryItemDisplay({ item, }: HistoryItemDisplayProps): React.ReactElement;
14
- export default HistoryItemDisplay;
14
+ export declare function HistoryItemDisplay({ item, terminalWidth, }: HistoryItemDisplayProps): React.ReactElement;
15
+ export declare const MemoizedHistoryItemDisplay: React.MemoExoticComponent<typeof HistoryItemDisplay>;
16
+ export default MemoizedHistoryItemDisplay;
@@ -1,11 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * Component to display a completed history item in the Static section.
3
+ * Component to display a completed history item in the history section.
4
4
  * Each item type has its own styled rendering.
5
5
  */
6
6
  import React from 'react';
7
- import { Box, Text, useStdout } from 'ink';
7
+ import { Box, Text } from 'ink';
8
8
  import Markdown from '@inkkit/ink-markdown';
9
+ import Link from 'ink-link';
9
10
  import { Logo } from './Logo.js';
10
11
  import { ToolCallDisplay } from './ToolCallDisplay.js';
11
12
  import { WriteKeyDisplay } from './WriteKeyDisplay.js';
@@ -13,9 +14,7 @@ import { OrgInfoBox } from './OrgInfoBox.js';
13
14
  /**
14
15
  * Renders a single history item based on its type
15
16
  */
16
- export function HistoryItemDisplay({ item, }) {
17
- const { stdout } = useStdout();
18
- const terminalWidth = React.useMemo(() => stdout?.columns || 80, [stdout?.columns]);
17
+ export function HistoryItemDisplay({ item, terminalWidth, }) {
19
18
  switch (item.type) {
20
19
  case 'logo':
21
20
  return _jsx(Logo, {});
@@ -73,7 +72,7 @@ export function HistoryItemDisplay({ item, }) {
73
72
  return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "red", children: "\u25CF" }), _jsxs(Text, { color: "red", children: [" ", item.text] })] }), item.label && (_jsxs(Box, { marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: "\u2514\u2500 " }), _jsx(Text, { color: "red", children: item.label })] }))] }));
74
73
  case 'org-info':
75
74
  if (item.orgName && item.writeKey) {
76
- return _jsx(OrgInfoBox, { orgName: item.orgName, writeKey: item.writeKey });
75
+ return (_jsx(OrgInfoBox, { orgName: item.orgName, writeKey: item.writeKey, terminalWidth: terminalWidth }));
77
76
  }
78
77
  return (_jsxs(Box, { children: [_jsx(Text, { color: "white", children: "\u25CF " }), _jsx(Text, { children: item.text })] }));
79
78
  case 'write-key':
@@ -105,8 +104,8 @@ function truncate(text, maxLength) {
105
104
  * Display for received events from the API
106
105
  */
107
106
  function ReceivedEventDisplay({ event, }) {
108
- const eventUrl = `https://app.raindrop.ai/home?event=${event.id}`;
109
- return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u25C6 " }), _jsx(Text, { bold: true, color: "cyan", children: event.eventName })] }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Timestamp: " }), _jsx(Text, { children: event.timestamp || 'N/A' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Model: " }), _jsx(Text, { color: "yellow", children: event.model || 'N/A' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "User: " }), _jsx(Text, { children: event.userId || 'N/A' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Input: " }), _jsx(Text, { color: "green", children: truncate(event.input, 80) })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Output: " }), _jsx(Text, { color: "white", children: truncate(event.output, 80) })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "View: " }), _jsx(Text, { color: "blue", children: eventUrl })] })] })] }));
107
+ const eventUrl = `https://app.raindrop.ai/home?event=${encodeURIComponent(event.id)}`;
108
+ return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u25C6 " }), _jsx(Text, { bold: true, color: "cyan", children: event.eventName })] }), _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Timestamp: " }), _jsx(Text, { children: event.timestamp || 'N/A' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Model: " }), _jsx(Text, { color: "yellow", children: event.model || 'N/A' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "User: " }), _jsx(Text, { children: event.userId || 'N/A' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Input: " }), _jsx(Text, { color: "green", children: truncate(event.input, 80) })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Output: " }), _jsx(Text, { color: "white", children: truncate(event.output, 80) })] }), event.toolCallNames && event.toolCallNames.length > 0 && (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Tool Calls: " }), _jsx(Text, { color: "magenta", children: truncate(event.toolCallNames.join(', '), 80) })] })), _jsx(Box, { children: _jsx(Link, { url: eventUrl, children: _jsx(Text, { color: "blue", children: "See it on Raindrop" }) }) })] })] }));
110
109
  }
111
110
  /**
112
111
  * Note display with optional title and tree-style formatting
@@ -136,5 +135,7 @@ function ErrorDisplay({ text }) {
136
135
  // For multi-line errors, display as a block with potential truncation
137
136
  return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "red", children: "\u25CF" }), _jsx(Text, { color: "red", children: " Error:" })] }), _jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [displayLines.map((line, i) => (_jsx(Box, { children: _jsx(Text, { color: "red", children: line }) }, i))), truncated && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["... ", lines.length - MAX_LINES, " more lines"] }) }))] })] }));
138
137
  }
139
- export default HistoryItemDisplay;
138
+ export const MemoizedHistoryItemDisplay = React.memo(HistoryItemDisplay, (prevProps, nextProps) => prevProps.item === nextProps.item &&
139
+ prevProps.terminalWidth === nextProps.terminalWidth);
140
+ export default MemoizedHistoryItemDisplay;
140
141
  //# sourceMappingURL=HistoryItemDisplay.js.map