@raindrop-ai/wizard 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +47 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +117 -0
- package/dist/bin.js.map +1 -0
- package/dist/src/docs/browser.md +105 -0
- package/dist/src/docs/python.md +618 -0
- package/dist/src/docs/typescript.md +584 -0
- package/dist/src/docs/vercel-ai-sdk.md +304 -0
- package/dist/src/lib/agent-interface.d.ts +46 -0
- package/dist/src/lib/agent-interface.js +292 -0
- package/dist/src/lib/agent-interface.js.map +1 -0
- package/dist/src/lib/agent-prompts.d.ts +10 -0
- package/dist/src/lib/agent-prompts.js +49 -0
- package/dist/src/lib/agent-prompts.js.map +1 -0
- package/dist/src/lib/config.d.ts +39 -0
- package/dist/src/lib/config.js +549 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/constants.d.ts +27 -0
- package/dist/src/lib/constants.js +165 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/handlers.d.ts +68 -0
- package/dist/src/lib/handlers.js +420 -0
- package/dist/src/lib/handlers.js.map +1 -0
- package/dist/src/lib/integration-testing.d.ts +44 -0
- package/dist/src/lib/integration-testing.js +123 -0
- package/dist/src/lib/integration-testing.js.map +1 -0
- package/dist/src/lib/mcp.d.ts +14 -0
- package/dist/src/lib/mcp.js +134 -0
- package/dist/src/lib/mcp.js.map +1 -0
- package/dist/src/lib/sdk-messages.d.ts +17 -0
- package/dist/src/lib/sdk-messages.js +278 -0
- package/dist/src/lib/sdk-messages.js.map +1 -0
- package/dist/src/lib/wizard.d.ts +6 -0
- package/dist/src/lib/wizard.js +131 -0
- package/dist/src/lib/wizard.js.map +1 -0
- package/dist/src/run.d.ts +8 -0
- package/dist/src/run.js +53 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/ui/App.d.ts +15 -0
- package/dist/src/ui/App.js +27 -0
- package/dist/src/ui/App.js.map +1 -0
- package/dist/src/ui/cancellation.d.ts +14 -0
- package/dist/src/ui/cancellation.js +17 -0
- package/dist/src/ui/cancellation.js.map +1 -0
- package/dist/src/ui/components/ClarifyingQuestionsPrompt.d.ts +17 -0
- package/dist/src/ui/components/ClarifyingQuestionsPrompt.js +359 -0
- package/dist/src/ui/components/ClarifyingQuestionsPrompt.js.map +1 -0
- package/dist/src/ui/components/ContinuePrompt.d.ts +14 -0
- package/dist/src/ui/components/ContinuePrompt.js +23 -0
- package/dist/src/ui/components/ContinuePrompt.js.map +1 -0
- package/dist/src/ui/components/DiffDisplay.d.ts +18 -0
- package/dist/src/ui/components/DiffDisplay.js +110 -0
- package/dist/src/ui/components/DiffDisplay.js.map +1 -0
- package/dist/src/ui/components/FeedbackSelectPrompt.d.ts +20 -0
- package/dist/src/ui/components/FeedbackSelectPrompt.js +132 -0
- package/dist/src/ui/components/FeedbackSelectPrompt.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.d.ts +14 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +140 -0
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -0
- package/dist/src/ui/components/Logo.d.ts +10 -0
- package/dist/src/ui/components/Logo.js +47 -0
- package/dist/src/ui/components/Logo.js.map +1 -0
- package/dist/src/ui/components/OrgInfoBox.d.ts +11 -0
- package/dist/src/ui/components/OrgInfoBox.js +16 -0
- package/dist/src/ui/components/OrgInfoBox.js.map +1 -0
- package/dist/src/ui/components/PendingPrompt.d.ts +18 -0
- package/dist/src/ui/components/PendingPrompt.js +57 -0
- package/dist/src/ui/components/PendingPrompt.js.map +1 -0
- package/dist/src/ui/components/PersistentTextInput.d.ts +21 -0
- package/dist/src/ui/components/PersistentTextInput.js +117 -0
- package/dist/src/ui/components/PersistentTextInput.js.map +1 -0
- package/dist/src/ui/components/PlanApprovalPrompt.d.ts +19 -0
- package/dist/src/ui/components/PlanApprovalPrompt.js +62 -0
- package/dist/src/ui/components/PlanApprovalPrompt.js.map +1 -0
- package/dist/src/ui/components/PromptContainer.d.ts +14 -0
- package/dist/src/ui/components/PromptContainer.js +18 -0
- package/dist/src/ui/components/PromptContainer.js.map +1 -0
- package/dist/src/ui/components/SelectPrompt.d.ts +14 -0
- package/dist/src/ui/components/SelectPrompt.js +62 -0
- package/dist/src/ui/components/SelectPrompt.js.map +1 -0
- package/dist/src/ui/components/SpinnerDisplay.d.ts +13 -0
- package/dist/src/ui/components/SpinnerDisplay.js +11 -0
- package/dist/src/ui/components/SpinnerDisplay.js.map +1 -0
- package/dist/src/ui/components/ToolApprovalPrompt.d.ts +14 -0
- package/dist/src/ui/components/ToolApprovalPrompt.js +142 -0
- package/dist/src/ui/components/ToolApprovalPrompt.js.map +1 -0
- package/dist/src/ui/components/ToolCallDisplay.d.ts +14 -0
- package/dist/src/ui/components/ToolCallDisplay.js +83 -0
- package/dist/src/ui/components/ToolCallDisplay.js.map +1 -0
- package/dist/src/ui/components/WriteKeyDisplay.d.ts +15 -0
- package/dist/src/ui/components/WriteKeyDisplay.js +13 -0
- package/dist/src/ui/components/WriteKeyDisplay.js.map +1 -0
- package/dist/src/ui/contexts/WizardContext.d.ts +210 -0
- package/dist/src/ui/contexts/WizardContext.js +362 -0
- package/dist/src/ui/contexts/WizardContext.js.map +1 -0
- package/dist/src/ui/hooks/useCancellation.d.ts +15 -0
- package/dist/src/ui/hooks/useCancellation.js +25 -0
- package/dist/src/ui/hooks/useCancellation.js.map +1 -0
- package/dist/src/ui/render.d.ts +34 -0
- package/dist/src/ui/render.js +94 -0
- package/dist/src/ui/render.js.map +1 -0
- package/dist/src/ui/types.d.ts +184 -0
- package/dist/src/ui/types.js +6 -0
- package/dist/src/ui/types.js.map +1 -0
- package/dist/src/utils/clack-utils.d.ts +13 -0
- package/dist/src/utils/clack-utils.js +131 -0
- package/dist/src/utils/clack-utils.js.map +1 -0
- package/dist/src/utils/debug.d.ts +13 -0
- package/dist/src/utils/debug.js +47 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/environment.d.ts +5 -0
- package/dist/src/utils/environment.js +131 -0
- package/dist/src/utils/environment.js.map +1 -0
- package/dist/src/utils/logging.d.ts +9 -0
- package/dist/src/utils/logging.js +38 -0
- package/dist/src/utils/logging.js.map +1 -0
- package/dist/src/utils/oauth.d.ts +12 -0
- package/dist/src/utils/oauth.js +497 -0
- package/dist/src/utils/oauth.js.map +1 -0
- package/dist/src/utils/package-json-types.d.ts +44 -0
- package/dist/src/utils/package-json-types.js +6 -0
- package/dist/src/utils/package-json-types.js.map +1 -0
- package/dist/src/utils/package-json.d.ts +19 -0
- package/dist/src/utils/package-json.js +22 -0
- package/dist/src/utils/package-json.js.map +1 -0
- package/dist/src/utils/session.d.ts +2 -0
- package/dist/src/utils/session.js +87 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/types.d.ts +61 -0
- package/dist/src/utils/types.js +2 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/utils/ui.d.ts +120 -0
- package/dist/src/utils/ui.js +164 -0
- package/dist/src/utils/ui.js.map +1 -0
- package/package.json +140 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback select prompt component.
|
|
3
|
+
* A reusable select prompt where one option can enable inline text input.
|
|
4
|
+
* Used by PlanApprovalPrompt and test-server for "yes/no with feedback" patterns.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import type { FeedbackSelectOptions, FeedbackSelectResult } from '../types.js';
|
|
8
|
+
interface FeedbackSelectPromptProps<T> {
|
|
9
|
+
options: FeedbackSelectOptions<T>;
|
|
10
|
+
/** Optional callback for when result is ready (used by PlanApprovalPrompt) */
|
|
11
|
+
onResult?: (result: FeedbackSelectResult<T>) => void;
|
|
12
|
+
/** If true, this component manages its own resolution via WizardContext */
|
|
13
|
+
standalone?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Feedback select prompt that supports inline text input for specific options.
|
|
17
|
+
* Can be used standalone (resolves via WizardContext) or embedded (via onResult callback).
|
|
18
|
+
*/
|
|
19
|
+
export declare function FeedbackSelectPrompt<T>({ options, onResult, standalone, }: FeedbackSelectPromptProps<T>): React.ReactElement;
|
|
20
|
+
export default FeedbackSelectPrompt;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Feedback select prompt component.
|
|
4
|
+
* A reusable select prompt where one option can enable inline text input.
|
|
5
|
+
* Used by PlanApprovalPrompt and test-server for "yes/no with feedback" patterns.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
8
|
+
import { Box, Text, useInput } from 'ink';
|
|
9
|
+
import TextInput from 'ink-text-input';
|
|
10
|
+
import { useWizard } from '../contexts/WizardContext.js';
|
|
11
|
+
import { PromptContainer } from './PromptContainer.js';
|
|
12
|
+
import { CANCEL_SYMBOL } from '../cancellation.js';
|
|
13
|
+
/**
|
|
14
|
+
* Feedback select prompt that supports inline text input for specific options.
|
|
15
|
+
* Can be used standalone (resolves via WizardContext) or embedded (via onResult callback).
|
|
16
|
+
*/
|
|
17
|
+
export function FeedbackSelectPrompt({ options, onResult, standalone = true, }) {
|
|
18
|
+
const { actions } = useWizard();
|
|
19
|
+
const { resolvePending, addItem } = actions;
|
|
20
|
+
const [highlightedIndex, setHighlightedIndex] = useState(0);
|
|
21
|
+
const [isTypingMode, setIsTypingMode] = useState(false);
|
|
22
|
+
const [customText, setCustomText] = useState('');
|
|
23
|
+
// Auto-enter typing mode when a text input option is highlighted
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const selectedOption = options.options[highlightedIndex];
|
|
26
|
+
if (!isTypingMode && selectedOption?.allowTextInput) {
|
|
27
|
+
setIsTypingMode(true);
|
|
28
|
+
}
|
|
29
|
+
}, [highlightedIndex, options.options, isTypingMode]);
|
|
30
|
+
// Handle submitting a result
|
|
31
|
+
const submitResult = useCallback((result) => {
|
|
32
|
+
if (onResult) {
|
|
33
|
+
// Embedded mode - call the callback
|
|
34
|
+
onResult(result);
|
|
35
|
+
}
|
|
36
|
+
else if (standalone) {
|
|
37
|
+
// Standalone mode - resolve via context
|
|
38
|
+
// Only add to history if skipHistory is not true
|
|
39
|
+
if (!options.skipHistory) {
|
|
40
|
+
addItem({
|
|
41
|
+
type: 'select-result',
|
|
42
|
+
text: options.message,
|
|
43
|
+
label: result.type === 'option'
|
|
44
|
+
? options.options.find((o) => o.value === result.value)?.label ||
|
|
45
|
+
String(result.value)
|
|
46
|
+
: result.value,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
resolvePending(result);
|
|
50
|
+
}
|
|
51
|
+
}, [onResult, standalone, addItem, resolvePending, options]);
|
|
52
|
+
// Handle selecting a regular option
|
|
53
|
+
const handleOptionSelect = useCallback((option) => {
|
|
54
|
+
submitResult({ type: 'option', value: option.value });
|
|
55
|
+
}, [submitResult]);
|
|
56
|
+
// Handle submitting text input
|
|
57
|
+
const handleTextSubmit = useCallback((text) => {
|
|
58
|
+
if (!text.trim())
|
|
59
|
+
return;
|
|
60
|
+
submitResult({ type: 'text', value: text.trim() });
|
|
61
|
+
}, [submitResult]);
|
|
62
|
+
// Handle keyboard input
|
|
63
|
+
useInput((input, key) => {
|
|
64
|
+
// Handle Ctrl+C cancellation
|
|
65
|
+
if (key.ctrl && input === 'c') {
|
|
66
|
+
if (onResult) {
|
|
67
|
+
// Embedded mode (e.g., plan approval) - treat as rejection/interrupt
|
|
68
|
+
submitResult({ type: 'text', value: 'interrupted' });
|
|
69
|
+
}
|
|
70
|
+
else if (standalone) {
|
|
71
|
+
// Standalone mode - cancel via CANCEL_SYMBOL
|
|
72
|
+
if (!options.skipHistory) {
|
|
73
|
+
addItem({
|
|
74
|
+
type: 'select-result',
|
|
75
|
+
text: options.message,
|
|
76
|
+
label: '(cancelled)',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
resolvePending(CANCEL_SYMBOL);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Escape handling
|
|
84
|
+
if (key.escape) {
|
|
85
|
+
if (isTypingMode) {
|
|
86
|
+
setIsTypingMode(false);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Arrow navigation - must come before isTypingMode check so arrows can exit typing mode
|
|
91
|
+
if (key.upArrow) {
|
|
92
|
+
if (isTypingMode) {
|
|
93
|
+
setIsTypingMode(false);
|
|
94
|
+
}
|
|
95
|
+
setHighlightedIndex((idx) => Math.max(0, idx - 1));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (key.downArrow) {
|
|
99
|
+
if (isTypingMode) {
|
|
100
|
+
setIsTypingMode(false);
|
|
101
|
+
}
|
|
102
|
+
setHighlightedIndex((idx) => Math.min(options.options.length - 1, idx + 1));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Skip other keys when typing - TextInput handles them
|
|
106
|
+
if (isTypingMode) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Enter to select
|
|
110
|
+
if (key.return) {
|
|
111
|
+
const selected = options.options[highlightedIndex];
|
|
112
|
+
if (selected.allowTextInput) {
|
|
113
|
+
setIsTypingMode(true);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
handleOptionSelect(selected);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, { isActive: true });
|
|
120
|
+
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
|
+
const isHighlighted = index === highlightedIndex;
|
|
122
|
+
const isTextOption = option.allowTextInput;
|
|
123
|
+
// Text input option in typing mode
|
|
124
|
+
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));
|
|
126
|
+
}
|
|
127
|
+
// Regular option display
|
|
128
|
+
return (_jsx(Box, { children: _jsxs(Text, { color: isHighlighted ? 'cyan' : undefined, children: [index + 1, ". ", option.label] }) }, index));
|
|
129
|
+
}) })] }));
|
|
130
|
+
}
|
|
131
|
+
export default FeedbackSelectPrompt;
|
|
132
|
+
//# sourceMappingURL=FeedbackSelectPrompt.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component to display a completed history item in the Static section.
|
|
3
|
+
* Each item type has its own styled rendering.
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import type { HistoryItem } from '../contexts/WizardContext.js';
|
|
7
|
+
interface HistoryItemDisplayProps {
|
|
8
|
+
item: HistoryItem;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Renders a single history item based on its type
|
|
12
|
+
*/
|
|
13
|
+
export declare function HistoryItemDisplay({ item, }: HistoryItemDisplayProps): React.ReactElement;
|
|
14
|
+
export default HistoryItemDisplay;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Component to display a completed history item in the Static section.
|
|
4
|
+
* Each item type has its own styled rendering.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { Box, Text, useStdout } from 'ink';
|
|
8
|
+
import Markdown from '@inkkit/ink-markdown';
|
|
9
|
+
import { Logo } from './Logo.js';
|
|
10
|
+
import { ToolCallDisplay } from './ToolCallDisplay.js';
|
|
11
|
+
import { WriteKeyDisplay } from './WriteKeyDisplay.js';
|
|
12
|
+
import { OrgInfoBox } from './OrgInfoBox.js';
|
|
13
|
+
/**
|
|
14
|
+
* Renders a single history item based on its type
|
|
15
|
+
*/
|
|
16
|
+
export function HistoryItemDisplay({ item, }) {
|
|
17
|
+
const { stdout } = useStdout();
|
|
18
|
+
const terminalWidth = React.useMemo(() => stdout?.columns || 80, [stdout?.columns]);
|
|
19
|
+
switch (item.type) {
|
|
20
|
+
case 'logo':
|
|
21
|
+
return _jsx(Logo, {});
|
|
22
|
+
case 'outro':
|
|
23
|
+
return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u2514\u2500" }), _jsxs(Text, { children: [" ", item.text] })] }));
|
|
24
|
+
case 'note':
|
|
25
|
+
return _jsx(NoteDisplay, { text: item.text, title: item.title });
|
|
26
|
+
case 'cancel':
|
|
27
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "red", children: "\u25CF" }), _jsxs(Text, { color: "red", children: [" ", item.text] })] }));
|
|
28
|
+
case 'response':
|
|
29
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "white", children: "\u25CF" }), _jsxs(Text, { color: "white", children: [" ", item.text] })] }));
|
|
30
|
+
case 'warning':
|
|
31
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "yellow", children: "\u25CF" }), _jsxs(Text, { color: "yellow", children: [" ", item.text] })] }));
|
|
32
|
+
case 'error':
|
|
33
|
+
return _jsx(ErrorDisplay, { text: item.text });
|
|
34
|
+
case 'success':
|
|
35
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u25CF" }), _jsxs(Text, { children: [" ", item.text] })] }));
|
|
36
|
+
case 'step':
|
|
37
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "white", children: "\u25CF" }), _jsxs(Text, { children: [" ", item.text] })] }));
|
|
38
|
+
case 'phase':
|
|
39
|
+
return (_jsx(Box, { children: _jsx(Text, { backgroundColor: "#C6C7FF", children: item.text }) }));
|
|
40
|
+
case 'select-result':
|
|
41
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u203A" }), _jsxs(Text, { children: [" ", item.text] })] }), item.label && (_jsxs(Box, { marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: "\u2514\u2500 " }), _jsx(Text, { color: "cyan", children: item.label })] }))] }));
|
|
42
|
+
case 'text-result':
|
|
43
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u203A" }), _jsxs(Text, { children: [" ", item.text] })] }), item.label && (_jsxs(Box, { marginLeft: 2, children: [_jsx(Text, { dimColor: true, children: "\u2514\u2500 " }), _jsx(Text, { color: "cyan", children: item.label })] }))] }));
|
|
44
|
+
case 'spinner-result':
|
|
45
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u2713" }), _jsxs(Text, { children: [" ", item.text] })] }));
|
|
46
|
+
case 'tool-call':
|
|
47
|
+
if (item.toolCall) {
|
|
48
|
+
return _jsx(ToolCallDisplay, { toolCall: item.toolCall });
|
|
49
|
+
}
|
|
50
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u25CF" }), _jsxs(Text, { children: [" ", item.text] })] }));
|
|
51
|
+
case 'agent-message':
|
|
52
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "magenta", children: "\u25C6 " }), _jsx(Markdown, { showSectionPrefix: false, children: item.text })] }));
|
|
53
|
+
case 'user-message':
|
|
54
|
+
return (_jsx(Box, { children: _jsxs(Text, { backgroundColor: "#4A4A4A", color: "white", children: [" \u203A ", item.text, " "] }) }));
|
|
55
|
+
case 'clarifying-questions-result':
|
|
56
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "white", children: "\u25CF " }), _jsx(Text, { children: item.text })] }), item.questionsAndAnswers && item.questionsAndAnswers.map((qa, i) => {
|
|
57
|
+
const isLast = i === item.questionsAndAnswers.length - 1;
|
|
58
|
+
const prefix = isLast ? '└' : '├';
|
|
59
|
+
return (_jsxs(Box, { marginLeft: 2, children: [_jsxs(Text, { dimColor: true, children: [prefix, " \u00B7 "] }), _jsx(Text, { children: qa.question }), _jsx(Text, { dimColor: true, children: " \u2192 " }), _jsx(Text, { color: "green", children: qa.answer })] }, i));
|
|
60
|
+
})] }));
|
|
61
|
+
case 'declined-questions':
|
|
62
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "yellow", children: "\u23FA " }), _jsx(Text, { children: item.text })] }));
|
|
63
|
+
case 'received-event':
|
|
64
|
+
if (item.receivedEvent) {
|
|
65
|
+
return _jsx(ReceivedEventDisplay, { event: item.receivedEvent });
|
|
66
|
+
}
|
|
67
|
+
return (_jsx(Box, { children: _jsx(Text, { children: item.text }) }));
|
|
68
|
+
case 'plan-review':
|
|
69
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "green", children: '─'.repeat(terminalWidth) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: item.text }) }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: "Here is the Raindrop wizard's plan:" }) }), item.planContent && (_jsx(Box, { marginBottom: 1, flexDirection: "column", children: _jsx(PlanContentDisplay, { content: item.planContent }) }))] }));
|
|
70
|
+
case 'plan-approved':
|
|
71
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u2713" }), _jsxs(Text, { children: [" ", item.text] })] }));
|
|
72
|
+
case 'plan-rejected':
|
|
73
|
+
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
|
+
case 'org-info':
|
|
75
|
+
if (item.orgName && item.writeKey) {
|
|
76
|
+
return _jsx(OrgInfoBox, { orgName: item.orgName, writeKey: item.writeKey });
|
|
77
|
+
}
|
|
78
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "white", children: "\u25CF " }), _jsx(Text, { children: item.text })] }));
|
|
79
|
+
case 'write-key':
|
|
80
|
+
if (item.writeKey) {
|
|
81
|
+
return _jsx(WriteKeyDisplay, { writeKey: item.writeKey, label: item.label });
|
|
82
|
+
}
|
|
83
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "white", children: "\u25CF " }), _jsx(Text, { children: item.text })] }));
|
|
84
|
+
default:
|
|
85
|
+
return (_jsx(Box, { children: _jsx(Text, { children: item.text }) }));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Display plan content - let Markdown component handle everything including tables
|
|
90
|
+
*/
|
|
91
|
+
function PlanContentDisplay({ content }) {
|
|
92
|
+
return (_jsx(Box, { children: _jsx(Markdown, { showSectionPrefix: false, children: content }) }));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Truncate text to a maximum length with ellipsis
|
|
96
|
+
*/
|
|
97
|
+
function truncate(text, maxLength) {
|
|
98
|
+
if (!text)
|
|
99
|
+
return 'N/A';
|
|
100
|
+
if (text.length <= maxLength)
|
|
101
|
+
return text;
|
|
102
|
+
return text.substring(0, maxLength) + '...';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Display for received events from the API
|
|
106
|
+
*/
|
|
107
|
+
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 })] })] })] }));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Note display with optional title and tree-style formatting
|
|
113
|
+
*/
|
|
114
|
+
function NoteDisplay({ text, title, }) {
|
|
115
|
+
const lines = text.split('\n');
|
|
116
|
+
if (title) {
|
|
117
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u250C\u2500" }), _jsxs(Text, { bold: true, children: [" ", title] })] }), lines.map((line, i) => {
|
|
118
|
+
const prefix = i === lines.length - 1 ? '└─' : '├─';
|
|
119
|
+
return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: prefix }), _jsxs(Text, { dimColor: true, children: [" ", line] })] }, i));
|
|
120
|
+
})] }));
|
|
121
|
+
}
|
|
122
|
+
return (_jsx(Box, { flexDirection: "column", children: lines.map((line, i) => (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "\u2502 " }), _jsx(Text, { dimColor: true, children: line })] }, i))) }));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Error display with automatic truncation for long messages
|
|
126
|
+
*/
|
|
127
|
+
function ErrorDisplay({ text }) {
|
|
128
|
+
const MAX_LINES = 15;
|
|
129
|
+
const lines = text.split('\n');
|
|
130
|
+
const truncated = lines.length > MAX_LINES;
|
|
131
|
+
const displayLines = truncated ? lines.slice(0, MAX_LINES) : lines;
|
|
132
|
+
// For single-line errors, display inline
|
|
133
|
+
if (lines.length === 1) {
|
|
134
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "red", children: "\u25CF" }), _jsxs(Text, { color: "red", children: [" ", text] })] }));
|
|
135
|
+
}
|
|
136
|
+
// For multi-line errors, display as a block with potential truncation
|
|
137
|
+
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
|
+
}
|
|
139
|
+
export default HistoryItemDisplay;
|
|
140
|
+
//# sourceMappingURL=HistoryItemDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HistoryItemDisplay.js","sourceRoot":"","sources":["../../../../src/ui/components/HistoryItemDisplay.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Component to display a completed history item in the Static section.\n * Each item type has its own styled rendering.\n */\n\nimport React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport Markdown from '@inkkit/ink-markdown';\nimport type { HistoryItem, ReceivedEventData } from '../contexts/WizardContext.js';\nimport { Logo } from './Logo.js';\nimport { ToolCallDisplay } from './ToolCallDisplay.js';\nimport { WriteKeyDisplay } from './WriteKeyDisplay.js';\nimport { OrgInfoBox } from './OrgInfoBox.js';\n\ninterface HistoryItemDisplayProps {\n item: HistoryItem;\n}\n\n/**\n * Renders a single history item based on its type\n */\nexport function HistoryItemDisplay({\n item,\n}: HistoryItemDisplayProps): React.ReactElement {\n const { stdout } = useStdout();\n const terminalWidth = React.useMemo(\n () => stdout?.columns || 80,\n [stdout?.columns],\n );\n\n switch (item.type) {\n case 'logo':\n return <Logo />;\n\n case 'outro':\n return (\n <Box>\n <Text dimColor>└─</Text>\n <Text> {item.text}</Text>\n </Box>\n );\n\n case 'note':\n return <NoteDisplay text={item.text} title={item.title} />;\n\n case 'cancel':\n return (\n <Box>\n <Text color=\"red\">●</Text>\n <Text color=\"red\"> {item.text}</Text>\n </Box>\n );\n\n case 'response':\n return (\n <Box>\n <Text color=\"white\">●</Text>\n <Text color=\"white\"> {item.text}</Text>\n </Box>\n );\n\n case 'warning':\n return (\n <Box>\n <Text color=\"yellow\">●</Text>\n <Text color=\"yellow\"> {item.text}</Text>\n </Box>\n );\n\n case 'error':\n return <ErrorDisplay text={item.text} />;\n\n case 'success':\n return (\n <Box>\n <Text color=\"green\">●</Text>\n <Text> {item.text}</Text>\n </Box>\n );\n\n case 'step':\n return (\n <Box>\n <Text color=\"white\">●</Text>\n <Text> {item.text}</Text>\n </Box>\n );\n\n case 'phase':\n return (\n <Box>\n <Text backgroundColor=\"#C6C7FF\">{item.text}</Text>\n </Box>\n );\n\n case 'select-result':\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">›</Text>\n <Text> {item.text}</Text>\n </Box>\n {item.label && (\n <Box marginLeft={2}>\n <Text dimColor>└─ </Text>\n <Text color=\"cyan\">{item.label}</Text>\n </Box>\n )}\n </Box>\n );\n\n case 'text-result':\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">›</Text>\n <Text> {item.text}</Text>\n </Box>\n {item.label && (\n <Box marginLeft={2}>\n <Text dimColor>└─ </Text>\n <Text color=\"cyan\">{item.label}</Text>\n </Box>\n )}\n </Box>\n );\n\n case 'spinner-result':\n return (\n <Box>\n <Text color=\"green\">✓</Text>\n <Text> {item.text}</Text>\n </Box>\n );\n\n case 'tool-call':\n if (item.toolCall) {\n return <ToolCallDisplay toolCall={item.toolCall} />;\n }\n return (\n <Box>\n <Text color=\"cyan\">●</Text>\n <Text> {item.text}</Text>\n </Box>\n );\n\n case 'agent-message':\n return (\n <Box>\n <Text color=\"magenta\">◆ </Text>\n <Markdown showSectionPrefix={false}>{item.text}</Markdown>\n </Box>\n );\n\n case 'user-message':\n return (\n <Box>\n <Text backgroundColor=\"#4A4A4A\" color=\"white\"> › {item.text} </Text>\n </Box>\n );\n\n case 'clarifying-questions-result':\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"white\">● </Text>\n <Text>{item.text}</Text>\n </Box>\n {item.questionsAndAnswers && item.questionsAndAnswers.map((qa, i) => {\n const isLast = i === item.questionsAndAnswers!.length - 1;\n const prefix = isLast ? '└' : '├';\n return (\n <Box key={i} marginLeft={2}>\n <Text dimColor>{prefix} · </Text>\n <Text>{qa.question}</Text>\n <Text dimColor> → </Text>\n <Text color=\"green\">{qa.answer}</Text>\n </Box>\n );\n })}\n </Box>\n );\n\n case 'declined-questions':\n return (\n <Box>\n <Text color=\"yellow\">⏺ </Text>\n <Text>{item.text}</Text>\n </Box>\n );\n\n case 'received-event':\n if (item.receivedEvent) {\n return <ReceivedEventDisplay event={item.receivedEvent} />;\n }\n return (\n <Box>\n <Text>{item.text}</Text>\n </Box>\n );\n\n case 'plan-review':\n return (\n <Box flexDirection=\"column\">\n <Text color=\"green\">{'─'.repeat(terminalWidth)}</Text>\n <Box marginBottom={1}>\n <Text bold>{item.text}</Text>\n </Box>\n <Box marginBottom={1}>\n <Text>Here is the Raindrop wizard's plan:</Text>\n </Box>\n {item.planContent && (\n <Box marginBottom={1} flexDirection=\"column\">\n <PlanContentDisplay content={item.planContent} />\n </Box>\n )}\n </Box>\n );\n\n case 'plan-approved':\n return (\n <Box>\n <Text color=\"green\">✓</Text>\n <Text> {item.text}</Text>\n </Box>\n );\n\n case 'plan-rejected':\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"red\">●</Text>\n <Text color=\"red\"> {item.text}</Text>\n </Box>\n {item.label && (\n <Box marginLeft={2}>\n <Text dimColor>└─ </Text>\n <Text color=\"red\">{item.label}</Text>\n </Box>\n )}\n </Box>\n );\n\n case 'org-info':\n if (item.orgName && item.writeKey) {\n return <OrgInfoBox orgName={item.orgName} writeKey={item.writeKey} />;\n }\n return (\n <Box>\n <Text color=\"white\">● </Text>\n <Text>{item.text}</Text>\n </Box>\n );\n\n case 'write-key':\n if (item.writeKey) {\n return <WriteKeyDisplay writeKey={item.writeKey} label={item.label} />;\n }\n return (\n <Box>\n <Text color=\"white\">● </Text>\n <Text>{item.text}</Text>\n </Box>\n );\n\n default:\n return (\n <Box>\n <Text>{item.text}</Text>\n </Box>\n );\n }\n}\n\n/**\n * Display plan content - let Markdown component handle everything including tables\n */\nfunction PlanContentDisplay({ content }: { content: string }): React.ReactElement {\n return (\n <Box>\n <Markdown showSectionPrefix={false}>{content}</Markdown>\n </Box>\n );\n}\n\n/**\n * Truncate text to a maximum length with ellipsis\n */\nfunction truncate(text: string | undefined, maxLength: number): string {\n if (!text) return 'N/A';\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + '...';\n}\n\n/**\n * Display for received events from the API\n */\nfunction ReceivedEventDisplay({\n event,\n}: {\n event: ReceivedEventData;\n}): React.ReactElement {\n const eventUrl = `https://app.raindrop.ai/home?event=${event.id}`;\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box>\n <Text color=\"cyan\">◆ </Text>\n <Text bold color=\"cyan\">{event.eventName}</Text>\n </Box>\n <Box marginLeft={2} flexDirection=\"column\">\n <Box>\n <Text dimColor>Timestamp: </Text>\n <Text>{event.timestamp || 'N/A'}</Text>\n </Box>\n <Box>\n <Text dimColor>Model: </Text>\n <Text color=\"yellow\">{event.model || 'N/A'}</Text>\n </Box>\n <Box>\n <Text dimColor>User: </Text>\n <Text>{event.userId || 'N/A'}</Text>\n </Box>\n <Box>\n <Text dimColor>Input: </Text>\n <Text color=\"green\">{truncate(event.input, 80)}</Text>\n </Box>\n <Box>\n <Text dimColor>Output: </Text>\n <Text color=\"white\">{truncate(event.output, 80)}</Text>\n </Box>\n <Box>\n <Text dimColor>View: </Text>\n <Text color=\"blue\">{eventUrl}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\n/**\n * Note display with optional title and tree-style formatting\n */\nfunction NoteDisplay({\n text,\n title,\n}: {\n text: string;\n title?: string;\n}): React.ReactElement {\n const lines = text.split('\\n');\n\n if (title) {\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text dimColor>┌─</Text>\n <Text bold> {title}</Text>\n </Box>\n {lines.map((line, i) => {\n const prefix = i === lines.length - 1 ? '└─' : '├─';\n return (\n <Box key={i}>\n <Text dimColor>{prefix}</Text>\n <Text dimColor> {line}</Text>\n </Box>\n );\n })}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Box key={i}>\n <Text dimColor>│ </Text>\n <Text dimColor>{line}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n\n/**\n * Error display with automatic truncation for long messages\n */\nfunction ErrorDisplay({ text }: { text: string }): React.ReactElement {\n const MAX_LINES = 15;\n const lines = text.split('\\n');\n const truncated = lines.length > MAX_LINES;\n const displayLines = truncated ? lines.slice(0, MAX_LINES) : lines;\n\n // For single-line errors, display inline\n if (lines.length === 1) {\n return (\n <Box>\n <Text color=\"red\">●</Text>\n <Text color=\"red\"> {text}</Text>\n </Box>\n );\n }\n\n // For multi-line errors, display as a block with potential truncation\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"red\">●</Text>\n <Text color=\"red\"> Error:</Text>\n </Box>\n <Box flexDirection=\"column\" marginLeft={2}>\n {displayLines.map((line, i) => (\n <Box key={i}>\n <Text color=\"red\">{line}</Text>\n </Box>\n ))}\n {truncated && (\n <Box marginTop={1}>\n <Text dimColor>... {lines.length - MAX_LINES} more lines</Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\nexport default HistoryItemDisplay;\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Logo component for the Raindrop wizard
|
|
4
|
+
* Displays the ASCII art logo using Ink
|
|
5
|
+
*/
|
|
6
|
+
import { Text } from 'ink';
|
|
7
|
+
const LOGO = `
|
|
8
|
+
|
|
9
|
+
.##########+
|
|
10
|
+
-###########.
|
|
11
|
+
-###########.
|
|
12
|
+
....-############+.....
|
|
13
|
+
+#######################+
|
|
14
|
+
+########################
|
|
15
|
+
#########################
|
|
16
|
+
#########################
|
|
17
|
+
+#################################+.
|
|
18
|
+
###################################.
|
|
19
|
+
###################################.
|
|
20
|
+
###################################.
|
|
21
|
+
.-++######################################+-.
|
|
22
|
+
.#############################################.
|
|
23
|
+
.#############################################.
|
|
24
|
+
.#############################################.
|
|
25
|
+
.################################+ #####.
|
|
26
|
+
.################################- #####.
|
|
27
|
+
.################################ #####.
|
|
28
|
+
+##############################. +#####
|
|
29
|
+
.#############################. .#####.
|
|
30
|
+
.###########################. .######.
|
|
31
|
+
.####################.... .######.
|
|
32
|
+
.##################- .+######.
|
|
33
|
+
.+################- .+#######.
|
|
34
|
+
.###############- .-########..
|
|
35
|
+
.##############+--+###########.
|
|
36
|
+
+#######################+
|
|
37
|
+
..+###############+-.
|
|
38
|
+
..---..
|
|
39
|
+
`;
|
|
40
|
+
/**
|
|
41
|
+
* Display the Raindrop logo
|
|
42
|
+
*/
|
|
43
|
+
export function Logo() {
|
|
44
|
+
return _jsx(Text, { color: "cyan", children: LOGO });
|
|
45
|
+
}
|
|
46
|
+
export default Logo;
|
|
47
|
+
//# sourceMappingURL=Logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logo.js","sourceRoot":"","sources":["../../../../src/ui/components/Logo.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAG3B,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEAgCqD,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,IAAI;IAClB,OAAO,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,IAAI,GAAQ,CAAC;AAC1C,CAAC;AAED,eAAe,IAAI,CAAC","sourcesContent":["/**\n * Logo component for the Raindrop wizard\n * Displays the ASCII art logo using Ink\n */\n\nimport { Text } from 'ink';\nimport React from 'react';\n\nconst LOGO = ` \n \n .##########+ \n -###########. \n -###########. \n ....-############+..... \n +#######################+ \n +######################## \n ######################### \n ######################### \n +#################################+. \n ###################################. \n ###################################. \n ###################################. \n .-++######################################+-. \n .#############################################. \n .#############################################. \n .#############################################. \n .################################+ #####. \n .################################- #####. \n .################################ #####. \n +##############################. +##### \n .#############################. .#####. \n .###########################. .######. \n .####################.... .######. \n .##################- .+######. \n .+################- .+#######. \n .###############- .-########.. \n .##############+--+###########. \n +#######################+ \n ..+###############+-. \n ..---.. \n `;\n\n/**\n * Display the Raindrop logo\n */\nexport function Logo(): React.ReactElement {\n return <Text color=\"cyan\">{LOGO}</Text>;\n}\n\nexport default Logo;\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beautiful box display for organization name and write key.
|
|
3
|
+
* Shows after login in the wizard flow.
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
interface OrgInfoBoxProps {
|
|
7
|
+
orgName: string;
|
|
8
|
+
writeKey: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function OrgInfoBox({ orgName, writeKey, }: OrgInfoBoxProps): React.ReactElement;
|
|
11
|
+
export default OrgInfoBox;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Beautiful box display for organization name and write key.
|
|
4
|
+
* Shows after login in the wizard flow.
|
|
5
|
+
*/
|
|
6
|
+
import { Box, Text, useStdout } from 'ink';
|
|
7
|
+
export function OrgInfoBox({ orgName, writeKey, }) {
|
|
8
|
+
const { stdout } = useStdout();
|
|
9
|
+
const terminalWidth = stdout?.columns || 80;
|
|
10
|
+
// Account for border (2) + paddingX (2*2) = 6 chars of chrome
|
|
11
|
+
const innerWidth = Math.max(terminalWidth - 6, 20);
|
|
12
|
+
const divider = '─'.repeat(innerWidth);
|
|
13
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1, children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "Organization Name " }), _jsxs(Text, { color: "white", bold: true, children: [' ', orgName] })] }), _jsx(Text, { dimColor: true, children: divider }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: "RAINDROP_WRITE_KEY" }), _jsxs(Text, { color: "green", children: [' ', writeKey] })] })] }));
|
|
14
|
+
}
|
|
15
|
+
export default OrgInfoBox;
|
|
16
|
+
//# sourceMappingURL=OrgInfoBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrgInfoBox.js","sourceRoot":"","sources":["../../../../src/ui/components/OrgInfoBox.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAQ3C,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,GACQ;IAChB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAC5C,8DAA8D;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEvC,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,aAEX,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,yCAA0B,EACxC,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,mBACrB,GAAG,EACH,OAAO,IACH,IACH,EAEN,KAAC,IAAI,IAAC,QAAQ,kBAAE,OAAO,GAAQ,EAE/B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,yCAA0B,EACxC,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAChB,GAAG,EACH,QAAQ,IACJ,IACH,IACF,CACP,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC","sourcesContent":["/**\n * Beautiful box display for organization name and write key.\n * Shows after login in the wizard flow.\n */\n\nimport { Box, Text, useStdout } from 'ink';\nimport React from 'react';\n\ninterface OrgInfoBoxProps {\n orgName: string;\n writeKey: string;\n}\n\nexport function OrgInfoBox({\n orgName,\n writeKey,\n}: OrgInfoBoxProps): React.ReactElement {\n const { stdout } = useStdout();\n const terminalWidth = stdout?.columns || 80;\n // Account for border (2) + paddingX (2*2) = 6 chars of chrome\n const innerWidth = Math.max(terminalWidth - 6, 20);\n const divider = '─'.repeat(innerWidth);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={2}\n paddingY={1}\n >\n <Box>\n <Text dimColor>Organization Name </Text>\n <Text color=\"white\" bold>\n {' '}\n {orgName}\n </Text>\n </Box>\n\n <Text dimColor>{divider}</Text>\n\n <Box>\n <Text dimColor>RAINDROP_WRITE_KEY</Text>\n <Text color=\"green\">\n {' '}\n {writeKey}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport default OrgInfoBox;\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component to render the currently active prompt or spinner.
|
|
3
|
+
* This re-renders frequently during streaming/active operations.
|
|
4
|
+
*
|
|
5
|
+
* Only one input component is visible at a time - this component routes
|
|
6
|
+
* to the appropriate prompt based on pendingItem.type.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import type { PendingItem } from '../contexts/WizardContext.js';
|
|
10
|
+
interface PendingPromptProps {
|
|
11
|
+
item: PendingItem;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Routes to the appropriate prompt component based on type.
|
|
15
|
+
* Ensures only one input component is visible at a time.
|
|
16
|
+
*/
|
|
17
|
+
export declare const PendingPrompt: React.NamedExoticComponent<PendingPromptProps>;
|
|
18
|
+
export default PendingPrompt;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Component to render the currently active prompt or spinner.
|
|
4
|
+
* This re-renders frequently during streaming/active operations.
|
|
5
|
+
*
|
|
6
|
+
* Only one input component is visible at a time - this component routes
|
|
7
|
+
* to the appropriate prompt based on pendingItem.type.
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import { Box, Text } from 'ink';
|
|
11
|
+
import { SelectPrompt } from './SelectPrompt.js';
|
|
12
|
+
import { SpinnerDisplay } from './SpinnerDisplay.js';
|
|
13
|
+
import { PersistentTextInput } from './PersistentTextInput.js';
|
|
14
|
+
import { ToolApprovalPrompt } from './ToolApprovalPrompt.js';
|
|
15
|
+
import { ClarifyingQuestionsPrompt } from './ClarifyingQuestionsPrompt.js';
|
|
16
|
+
import { PlanApprovalPrompt } from './PlanApprovalPrompt.js';
|
|
17
|
+
import { FeedbackSelectPrompt } from './FeedbackSelectPrompt.js';
|
|
18
|
+
import { ContinuePrompt } from './ContinuePrompt.js';
|
|
19
|
+
/**
|
|
20
|
+
* Routes to the appropriate prompt component based on type.
|
|
21
|
+
* Ensures only one input component is visible at a time.
|
|
22
|
+
*/
|
|
23
|
+
export const PendingPrompt = React.memo(function PendingPrompt({ item, }) {
|
|
24
|
+
switch (item.type) {
|
|
25
|
+
case 'select':
|
|
26
|
+
return _jsx(SelectPrompt, { options: item.props });
|
|
27
|
+
case 'text': {
|
|
28
|
+
// Use PersistentTextInput for text prompts (spinner is managed separately)
|
|
29
|
+
const textOptions = item.props;
|
|
30
|
+
const persistentProps = {
|
|
31
|
+
message: textOptions.message,
|
|
32
|
+
placeholder: textOptions.placeholder,
|
|
33
|
+
defaultValue: textOptions.defaultValue || textOptions.initialValue,
|
|
34
|
+
validate: textOptions.validate,
|
|
35
|
+
};
|
|
36
|
+
return _jsx(PersistentTextInput, { props: persistentProps });
|
|
37
|
+
}
|
|
38
|
+
case 'spinner':
|
|
39
|
+
return (_jsx(SpinnerDisplay, { message: item.props.message }));
|
|
40
|
+
case 'persistent-input':
|
|
41
|
+
return _jsx(PersistentTextInput, { props: item.props });
|
|
42
|
+
case 'tool-approval':
|
|
43
|
+
return _jsx(ToolApprovalPrompt, { props: item.props });
|
|
44
|
+
case 'clarifying-questions':
|
|
45
|
+
return (_jsx(ClarifyingQuestionsPrompt, { props: item.props }));
|
|
46
|
+
case 'plan-approval':
|
|
47
|
+
return _jsx(PlanApprovalPrompt, { props: item.props });
|
|
48
|
+
case 'feedback-select':
|
|
49
|
+
return (_jsx(FeedbackSelectPrompt, { options: item.props }));
|
|
50
|
+
case 'continue':
|
|
51
|
+
return _jsx(ContinuePrompt, { ...item.props });
|
|
52
|
+
default:
|
|
53
|
+
return (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["Unknown prompt type: ", item.type] }) }));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
export default PendingPrompt;
|
|
57
|
+
//# sourceMappingURL=PendingPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PendingPrompt.js","sourceRoot":"","sources":["../../../../src/ui/components/PendingPrompt.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAgBrD;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,aAAa,CAAC,EAC7D,IAAI,GACe;IACnB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,KAAC,YAAY,IAAC,OAAO,EAAE,IAAI,CAAC,KAA+B,GAAI,CAAC;QAEzE,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,2EAA2E;YAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAoB,CAAC;YAC9C,MAAM,eAAe,GAAyB;gBAC5C,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,WAAW,EAAE,WAAW,CAAC,WAAW;gBACpC,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,YAAY;gBAClE,QAAQ,EAAE,WAAW,CAAC,QAAQ;aAC/B,CAAC;YACF,OAAO,KAAC,mBAAmB,IAAC,KAAK,EAAE,eAAe,GAAI,CAAC;QACzD,CAAC;QAED,KAAK,SAAS;YACZ,OAAO,CACL,KAAC,cAAc,IAAC,OAAO,EAAG,IAAI,CAAC,KAA6B,CAAC,OAAO,GAAI,CACzE,CAAC;QAEJ,KAAK,kBAAkB;YACrB,OAAO,KAAC,mBAAmB,IAAC,KAAK,EAAE,IAAI,CAAC,KAA6B,GAAI,CAAC;QAE5E,KAAK,eAAe;YAClB,OAAO,KAAC,kBAAkB,IAAC,KAAK,EAAE,IAAI,CAAC,KAA0B,GAAI,CAAC;QAExE,KAAK,sBAAsB;YACzB,OAAO,CACL,KAAC,yBAAyB,IACxB,KAAK,EAAE,IAAI,CAAC,KAAiC,GAC7C,CACH,CAAC;QAEJ,KAAK,eAAe;YAClB,OAAO,KAAC,kBAAkB,IAAC,KAAK,EAAE,IAAI,CAAC,KAA0B,GAAI,CAAC;QAExE,KAAK,iBAAiB;YACpB,OAAO,CACL,KAAC,oBAAoB,IACnB,OAAO,EAAE,IAAI,CAAC,KAAuC,GACrD,CACH,CAAC;QAEJ,KAAK,UAAU;YACb,OAAO,KAAC,cAAc,OAAM,IAAI,CAAC,KAA+B,GAAI,CAAC;QAEvE;YACE,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,sCAAuB,IAAI,CAAC,IAAI,IAAQ,GACrD,CACP,CAAC;IACN,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,aAAa,CAAC","sourcesContent":["/**\n * Component to render the currently active prompt or spinner.\n * This re-renders frequently during streaming/active operations.\n *\n * Only one input component is visible at a time - this component routes\n * to the appropriate prompt based on pendingItem.type.\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { PendingItem } from '../contexts/WizardContext.js';\nimport { SelectPrompt } from './SelectPrompt.js';\nimport { SpinnerDisplay } from './SpinnerDisplay.js';\nimport { PersistentTextInput } from './PersistentTextInput.js';\nimport { ToolApprovalPrompt } from './ToolApprovalPrompt.js';\nimport { ClarifyingQuestionsPrompt } from './ClarifyingQuestionsPrompt.js';\nimport { PlanApprovalPrompt } from './PlanApprovalPrompt.js';\nimport { FeedbackSelectPrompt } from './FeedbackSelectPrompt.js';\nimport { ContinuePrompt } from './ContinuePrompt.js';\nimport type {\n SelectOptions,\n TextOptions,\n PersistentInputProps,\n ToolApprovalProps,\n ClarifyingQuestionsProps,\n PlanApprovalProps,\n FeedbackSelectOptions,\n ContinuePromptOptions,\n} from '../types.js';\n\ninterface PendingPromptProps {\n item: PendingItem;\n}\n\n/**\n * Routes to the appropriate prompt component based on type.\n * Ensures only one input component is visible at a time.\n */\nexport const PendingPrompt = React.memo(function PendingPrompt({\n item,\n}: PendingPromptProps): React.ReactElement {\n switch (item.type) {\n case 'select':\n return <SelectPrompt options={item.props as SelectOptions<unknown>} />;\n\n case 'text': {\n // Use PersistentTextInput for text prompts (spinner is managed separately)\n const textOptions = item.props as TextOptions;\n const persistentProps: PersistentInputProps = {\n message: textOptions.message,\n placeholder: textOptions.placeholder,\n defaultValue: textOptions.defaultValue || textOptions.initialValue,\n validate: textOptions.validate,\n };\n return <PersistentTextInput props={persistentProps} />;\n }\n\n case 'spinner':\n return (\n <SpinnerDisplay message={(item.props as { message: string }).message} />\n );\n\n case 'persistent-input':\n return <PersistentTextInput props={item.props as PersistentInputProps} />;\n\n case 'tool-approval':\n return <ToolApprovalPrompt props={item.props as ToolApprovalProps} />;\n\n case 'clarifying-questions':\n return (\n <ClarifyingQuestionsPrompt\n props={item.props as ClarifyingQuestionsProps}\n />\n );\n\n case 'plan-approval':\n return <PlanApprovalPrompt props={item.props as PlanApprovalProps} />;\n\n case 'feedback-select':\n return (\n <FeedbackSelectPrompt\n options={item.props as FeedbackSelectOptions<unknown>}\n />\n );\n\n case 'continue':\n return <ContinuePrompt {...(item.props as ContinuePromptOptions)} />;\n\n default:\n return (\n <Box>\n <Text color=\"red\">Unknown prompt type: {item.type}</Text>\n </Box>\n );\n }\n});\n\nexport default PendingPrompt;\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified text input component for the wizard.
|
|
3
|
+
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
* 1. Callback mode: Uses onSubmit/onInterrupt callbacks (for persistent input during agent execution)
|
|
6
|
+
* 2. Context mode: Uses resolvePending from WizardContext (for standalone text prompts)
|
|
7
|
+
*
|
|
8
|
+
* Note: Spinner is managed separately via ui.spinner() - this component is just the input.
|
|
9
|
+
*/
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import type { PersistentInputProps } from '../types.js';
|
|
12
|
+
interface PersistentTextInputComponentProps {
|
|
13
|
+
props: PersistentInputProps;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Unified text input component.
|
|
17
|
+
* - With callbacks (onSubmit/onInterrupt): Uses callbacks for submit/interrupt
|
|
18
|
+
* - Without callbacks: Uses resolvePending from context (text prompt mode)
|
|
19
|
+
*/
|
|
20
|
+
export declare function PersistentTextInput({ props, }: PersistentTextInputComponentProps): React.ReactElement;
|
|
21
|
+
export default PersistentTextInput;
|