centaurus-cli 2.9.4 → 2.9.6
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/dist/cli-adapter.d.ts +29 -4
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +700 -121
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +7 -0
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/context/context-manager.d.ts +10 -0
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +17 -0
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/handlers/docker-handler.d.ts +7 -1
- package/dist/context/handlers/docker-handler.d.ts.map +1 -1
- package/dist/context/handlers/docker-handler.js +89 -16
- package/dist/context/handlers/docker-handler.js.map +1 -1
- package/dist/context/handlers/ssh-handler.d.ts +47 -1
- package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
- package/dist/context/handlers/ssh-handler.js +546 -73
- package/dist/context/handlers/ssh-handler.js.map +1 -1
- package/dist/context/handlers/wsl-handler.d.ts +5 -1
- package/dist/context/handlers/wsl-handler.d.ts.map +1 -1
- package/dist/context/handlers/wsl-handler.js +24 -6
- package/dist/context/handlers/wsl-handler.js.map +1 -1
- package/dist/context/subshell-handler.d.ts +8 -2
- package/dist/context/subshell-handler.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/services/checkpoint-manager.d.ts +162 -0
- package/dist/services/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/checkpoint-manager.js +926 -0
- package/dist/services/checkpoint-manager.js.map +1 -0
- package/dist/services/local-chat-storage.d.ts +3 -1
- package/dist/services/local-chat-storage.d.ts.map +1 -1
- package/dist/services/local-chat-storage.js +8 -3
- package/dist/services/local-chat-storage.js.map +1 -1
- package/dist/tools/background-command.d.ts.map +1 -1
- package/dist/tools/background-command.js +132 -24
- package/dist/tools/background-command.js.map +1 -1
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +106 -42
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/create-image.d.ts.map +1 -1
- package/dist/tools/create-image.js +43 -18
- package/dist/tools/create-image.js.map +1 -1
- package/dist/tools/file-ops.d.ts.map +1 -1
- package/dist/tools/file-ops.js +12 -12
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/get-diff.d.ts +9 -45
- package/dist/tools/get-diff.d.ts.map +1 -1
- package/dist/tools/get-diff.js +288 -171
- package/dist/tools/get-diff.js.map +1 -1
- package/dist/tools/grep-search.d.ts +1 -1
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +80 -1
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/types.d.ts +3 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/ui/components/App.d.ts +8 -0
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +256 -66
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/ui/components/Breadcrumbs.js +22 -2
- package/dist/ui/components/Breadcrumbs.js.map +1 -1
- package/dist/ui/components/ConfirmPrompt.d.ts +2 -0
- package/dist/ui/components/ConfirmPrompt.d.ts.map +1 -1
- package/dist/ui/components/ConfirmPrompt.js +8 -3
- package/dist/ui/components/ConfirmPrompt.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +6 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +188 -23
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts +2 -0
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/components/InteractiveShell.js +88 -26
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/KeyboardHelp.d.ts.map +1 -1
- package/dist/ui/components/KeyboardHelp.js +14 -6
- package/dist/ui/components/KeyboardHelp.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +35 -16
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/utils/ansi-encoder.d.ts +5 -0
- package/dist/utils/ansi-encoder.d.ts.map +1 -1
- package/dist/utils/ansi-encoder.js +12 -5
- package/dist/utils/ansi-encoder.js.map +1 -1
- package/dist/utils/editor-utils.d.ts +14 -0
- package/dist/utils/editor-utils.d.ts.map +1 -1
- package/dist/utils/editor-utils.js +172 -0
- package/dist/utils/editor-utils.js.map +1 -1
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +2 -1
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/terminal-output.d.ts +3 -1
- package/dist/utils/terminal-output.d.ts.map +1 -1
- package/dist/utils/terminal-output.js +235 -195
- package/dist/utils/terminal-output.js.map +1 -1
- package/package.json +3 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
2
|
import { Box, Text, useInput } from 'ink';
|
|
3
|
-
export const ConfirmPrompt = React.memo(({ message, onYes, onNo, onFeedback, showFeedbackOption = false }) => {
|
|
3
|
+
export const ConfirmPrompt = React.memo(({ message, onYes, onNo, onFeedback, showFeedbackOption = false, warningMessage }) => {
|
|
4
4
|
const [selected, setSelected] = useState('yes');
|
|
5
5
|
useInput((input, key) => {
|
|
6
6
|
if (key.upArrow || key.downArrow) {
|
|
@@ -45,7 +45,11 @@ export const ConfirmPrompt = React.memo(({ message, onYes, onNo, onFeedback, sho
|
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
});
|
|
48
|
-
return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "#ffaa00", paddingX: 1, paddingY: 1 },
|
|
48
|
+
return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: warningMessage ? "#ff6600" : "#ffaa00", paddingX: 1, paddingY: 1 },
|
|
49
|
+
warningMessage && (React.createElement(Box, { marginBottom: 1, borderStyle: "single", borderColor: "#ff3366", paddingX: 1 },
|
|
50
|
+
React.createElement(Text, { color: "#ff3366", bold: true },
|
|
51
|
+
"\u26A0\uFE0F ",
|
|
52
|
+
warningMessage))),
|
|
49
53
|
React.createElement(Box, { marginBottom: 1 },
|
|
50
54
|
React.createElement(Text, { color: "#ffaa00", bold: true }, message)),
|
|
51
55
|
React.createElement(Box, { flexDirection: "column" },
|
|
@@ -64,6 +68,7 @@ export const ConfirmPrompt = React.memo(({ message, onYes, onNo, onFeedback, sho
|
|
|
64
68
|
}, (prevProps, nextProps) => {
|
|
65
69
|
// Only re-render if message or showFeedbackOption changes
|
|
66
70
|
return prevProps.message === nextProps.message &&
|
|
67
|
-
prevProps.showFeedbackOption === nextProps.showFeedbackOption
|
|
71
|
+
prevProps.showFeedbackOption === nextProps.showFeedbackOption &&
|
|
72
|
+
prevProps.warningMessage === nextProps.warningMessage;
|
|
68
73
|
});
|
|
69
74
|
//# sourceMappingURL=ConfirmPrompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmPrompt.js","sourceRoot":"","sources":["../../../src/ui/components/ConfirmPrompt.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfirmPrompt.js","sourceRoot":"","sources":["../../../src/ui/components/ConfirmPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,12 @@ interface InputBoxProps {
|
|
|
30
30
|
subAgentCount?: number;
|
|
31
31
|
aiAutoSuggestEnabled?: boolean;
|
|
32
32
|
sessionCommands?: string[];
|
|
33
|
+
getCheckpoints?: () => Array<{
|
|
34
|
+
id: string;
|
|
35
|
+
prompt: string;
|
|
36
|
+
timestamp: Date;
|
|
37
|
+
}>;
|
|
38
|
+
onSetInputSetup?: (callback: (value: string) => void) => void;
|
|
33
39
|
}
|
|
34
40
|
export declare const InputBox: React.FC<InputBoxProps>;
|
|
35
41
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputBox.d.ts","sourceRoot":"","sources":["../../../src/ui/components/InputBox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAIpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAWzD,OAAO,EAAyC,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAM5G,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,eAAe,EAAE,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IACpE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"InputBox.d.ts","sourceRoot":"","sources":["../../../src/ui/components/InputBox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAIpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAWzD,OAAO,EAAyC,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAM5G,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,eAAe,EAAE,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IACpE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IAC9E,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;CAC/D;AA+CD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAkyE3C,CAAC"}
|
|
@@ -52,7 +52,7 @@ const getVisualLines = (text, width) => {
|
|
|
52
52
|
});
|
|
53
53
|
return visualLines;
|
|
54
54
|
};
|
|
55
|
-
export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...', autoAcceptMode, model, planMode = false, commandMode = false, backgroundMode = false, currentWorkingDirectory, commandHistory = [], onToggleAutoAccept, onToggleCommandMode, onToggleBackgroundMode, isActive = true, subshellContext, subshellContextStack, currentTokens = 0, maxTokens = 1000000, contextLimitReached = false, isShellRunning = false, backgroundTaskCount = 0, initialValue = '', onValueChange, onSetAutoModeSetup, sessionQuotaExhausted = false, sessionQuotaTimeRemaining = '', subAgentCount = 0, aiAutoSuggestEnabled = false, sessionCommands = [] }) => {
|
|
55
|
+
export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...', autoAcceptMode, model, planMode = false, commandMode = false, backgroundMode = false, currentWorkingDirectory, commandHistory = [], onToggleAutoAccept, onToggleCommandMode, onToggleBackgroundMode, isActive = true, subshellContext, subshellContextStack, currentTokens = 0, maxTokens = 1000000, contextLimitReached = false, isShellRunning = false, backgroundTaskCount = 0, initialValue = '', onValueChange, onSetAutoModeSetup, sessionQuotaExhausted = false, sessionQuotaTimeRemaining = '', subAgentCount = 0, aiAutoSuggestEnabled = false, sessionCommands = [], getCheckpoints, onSetInputSetup }) => {
|
|
56
56
|
// Use initialValue for first mount, but manage state internally after that
|
|
57
57
|
const [value, setValueInternal] = useState(initialValue);
|
|
58
58
|
const [cursorOffset, setCursorOffset] = useState(0);
|
|
@@ -152,7 +152,24 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
152
152
|
useEffect(() => {
|
|
153
153
|
CommandHistoryManager.getInstance().load();
|
|
154
154
|
}, []);
|
|
155
|
+
// Register setInput callback for external control (e.g., for revert functionality)
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
if (onSetInputSetup) {
|
|
158
|
+
onSetInputSetup((newValue) => {
|
|
159
|
+
setValue(newValue);
|
|
160
|
+
setCursorOffset(newValue.length);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}, [onSetInputSetup, setValue, setCursorOffset]);
|
|
155
164
|
// Register setIsAutoMode callback for external control (e.g., after background task starts)
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
if (onSetInputSetup) {
|
|
167
|
+
onSetInputSetup((newValue) => {
|
|
168
|
+
setValue(newValue);
|
|
169
|
+
setCursorOffset(newValue.length);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}, [onSetInputSetup, setValue, setCursorOffset]);
|
|
156
173
|
useEffect(() => {
|
|
157
174
|
if (onSetAutoModeSetup) {
|
|
158
175
|
onSetAutoModeSetup((enabled) => {
|
|
@@ -238,7 +255,7 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
238
255
|
else {
|
|
239
256
|
setAutocompleteSuggestion(null);
|
|
240
257
|
}
|
|
241
|
-
}, [value, commandMode, isAutoMode, detectedIntent, currentDir, currentEnvironment]);
|
|
258
|
+
}, [value, commandMode, isAutoMode, detectedIntent, aiAutoSuggestEnabled, currentDir, currentEnvironment]);
|
|
242
259
|
// AI Autocomplete Logic (5-second debounce)
|
|
243
260
|
useEffect(() => {
|
|
244
261
|
// Clear AI suggestion when value changes
|
|
@@ -557,6 +574,13 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
557
574
|
setCursorOffset(newValue.length);
|
|
558
575
|
setSlashAutocompleteVisible(false);
|
|
559
576
|
}
|
|
577
|
+
else if (value.startsWith('/revert ')) {
|
|
578
|
+
// We're selecting a checkpoint from /revert dropdown
|
|
579
|
+
const newValue = `/revert ${selected.name}`;
|
|
580
|
+
setValue(newValue);
|
|
581
|
+
setCursorOffset(newValue.length);
|
|
582
|
+
setSlashAutocompleteVisible(false);
|
|
583
|
+
}
|
|
560
584
|
else if (value.startsWith('/models ') || value.startsWith('/model ')) {
|
|
561
585
|
// We're selecting a models subcommand
|
|
562
586
|
const prefix = value.startsWith('/models ') ? '/models ' : '/model ';
|
|
@@ -758,6 +782,34 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
758
782
|
setSlashAutocompleteVisible(false);
|
|
759
783
|
}
|
|
760
784
|
}
|
|
785
|
+
else if (selected.name === 'revert') {
|
|
786
|
+
// For revert, show checkpoints immediately
|
|
787
|
+
const checkpoints = getCheckpoints ? getCheckpoints() : [];
|
|
788
|
+
if (checkpoints.length === 0) {
|
|
789
|
+
setSlashAutocompleteCommands([{
|
|
790
|
+
name: '(no checkpoints)',
|
|
791
|
+
description: 'Ask AI a question first to create a checkpoint'
|
|
792
|
+
}]);
|
|
793
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
794
|
+
setSlashAutocompleteScrollOffset(0);
|
|
795
|
+
// Keep autocomplete visible
|
|
796
|
+
}
|
|
797
|
+
else {
|
|
798
|
+
const checkpointCommands = checkpoints
|
|
799
|
+
.slice(0, 10)
|
|
800
|
+
.map(cp => {
|
|
801
|
+
const truncatedPrompt = cp.prompt.length > 50 ? cp.prompt.slice(0, 50) + '...' : cp.prompt;
|
|
802
|
+
return {
|
|
803
|
+
name: cp.id,
|
|
804
|
+
description: truncatedPrompt
|
|
805
|
+
};
|
|
806
|
+
});
|
|
807
|
+
setSlashAutocompleteCommands(checkpointCommands);
|
|
808
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
809
|
+
setSlashAutocompleteScrollOffset(0);
|
|
810
|
+
// Keep autocomplete visible
|
|
811
|
+
}
|
|
812
|
+
}
|
|
761
813
|
else {
|
|
762
814
|
setSlashAutocompleteVisible(false);
|
|
763
815
|
}
|
|
@@ -844,7 +896,10 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
844
896
|
}
|
|
845
897
|
// Alt+V: Paste image from clipboard
|
|
846
898
|
// Detect Alt+V on Windows/Linux (key.meta is often Alt on Windows in Ink)
|
|
847
|
-
|
|
899
|
+
// On Mac, we want to support Cmd+V explicitly as requested ("make alt key combinations work with cmd key")
|
|
900
|
+
// Note: Cmd+V is often captured by the terminal for text paste, but if it gets through, we handle it.
|
|
901
|
+
// Option+V on Mac often sends '√', which we also support.
|
|
902
|
+
const isAltV = (key.meta && input === 'v') || (input === '√');
|
|
848
903
|
if (isAltV && !commandMode) {
|
|
849
904
|
// Check clipboard for images asynchronously
|
|
850
905
|
(async () => {
|
|
@@ -872,15 +927,13 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
872
927
|
})();
|
|
873
928
|
return;
|
|
874
929
|
}
|
|
875
|
-
// DELETE WORD BACKWARDS
|
|
876
|
-
//
|
|
877
|
-
//
|
|
878
|
-
//
|
|
879
|
-
// 3. Ctrl + Delete - Works on all platforms (Ctrl+Backspace doesn't work on Windows/Ink)
|
|
880
|
-
// 4. Windows Ctrl+Del sends char code 127
|
|
930
|
+
// DELETE WORD BACKWARDS
|
|
931
|
+
// 1. Ctrl+W
|
|
932
|
+
// 2. Cmd+Backspace (Mac) - often mapped to delete line, but here we treat key.meta as modifier
|
|
933
|
+
// 3. Alt+Backspace (Windows/Linux)
|
|
881
934
|
const isDeleteWord = inputCharCode === 23 || // Ctrl+W
|
|
882
|
-
(key.meta && (key.backspace || key.delete)) || //
|
|
883
|
-
(key.ctrl && key.delete) || // Ctrl+Delete
|
|
935
|
+
(key.meta && (key.backspace || key.delete)) || // Cmd+Backspace (Mac) or Alt+Backspace (Win)
|
|
936
|
+
(key.ctrl && key.delete) || // Ctrl+Delete
|
|
884
937
|
(isWindows && inputCharCode === 127); // Windows: Ctrl+Del sends char 127
|
|
885
938
|
if (isDeleteWord) {
|
|
886
939
|
pushToUndoStack();
|
|
@@ -995,6 +1048,42 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
995
1048
|
setSlashAutocompleteVisible(false);
|
|
996
1049
|
}
|
|
997
1050
|
}
|
|
1051
|
+
else if (newValue.startsWith('/revert ')) {
|
|
1052
|
+
// Checkpoint autocomplete for /revert command
|
|
1053
|
+
const partialId = newValue.slice(8).toLowerCase(); // Remove "/revert "
|
|
1054
|
+
const checkpoints = getCheckpoints ? getCheckpoints() : [];
|
|
1055
|
+
if (checkpoints.length === 0) {
|
|
1056
|
+
// No checkpoints yet - show informative message
|
|
1057
|
+
setSlashAutocompleteCommands([{
|
|
1058
|
+
name: '(no checkpoints)',
|
|
1059
|
+
description: 'Ask AI a question first to create a checkpoint'
|
|
1060
|
+
}]);
|
|
1061
|
+
setSlashAutocompleteVisible(true);
|
|
1062
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1063
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1064
|
+
}
|
|
1065
|
+
else {
|
|
1066
|
+
const matchingCheckpoints = checkpoints
|
|
1067
|
+
.filter(cp => cp.id.toLowerCase().includes(partialId) || cp.prompt.toLowerCase().includes(partialId))
|
|
1068
|
+
.slice(0, 10)
|
|
1069
|
+
.map(cp => {
|
|
1070
|
+
const truncatedPrompt = cp.prompt.length > 50 ? cp.prompt.slice(0, 50) + '...' : cp.prompt;
|
|
1071
|
+
return {
|
|
1072
|
+
name: cp.id,
|
|
1073
|
+
description: truncatedPrompt
|
|
1074
|
+
};
|
|
1075
|
+
});
|
|
1076
|
+
if (matchingCheckpoints.length > 0) {
|
|
1077
|
+
setSlashAutocompleteCommands(matchingCheckpoints);
|
|
1078
|
+
setSlashAutocompleteVisible(true);
|
|
1079
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1080
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1081
|
+
}
|
|
1082
|
+
else {
|
|
1083
|
+
setSlashAutocompleteVisible(false);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
998
1087
|
else if (newValue.match(/^\/workflow\s+(run|view|delete)\s+/) ||
|
|
999
1088
|
newValue.match(/^\/wf\s+(run|view|delete)\s+/)) {
|
|
1000
1089
|
// Workflow name autocomplete (when user types "/workflow run " or similar)
|
|
@@ -1452,8 +1541,18 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1452
1541
|
return;
|
|
1453
1542
|
}
|
|
1454
1543
|
if (key.leftArrow) {
|
|
1455
|
-
if (
|
|
1456
|
-
//
|
|
1544
|
+
if (isMac && key.meta) {
|
|
1545
|
+
// Mac: Cmd+Left -> Start of line (Home)
|
|
1546
|
+
setCursorOffset(0);
|
|
1547
|
+
return;
|
|
1548
|
+
}
|
|
1549
|
+
if (key.ctrl || (!isMac && key.meta)) {
|
|
1550
|
+
// Ctrl+Left (All) or Alt+Left (Win/Linux): Move word backwards
|
|
1551
|
+
// Note: On Mac, Option+Left is the standard for word back, but Ink doesn't expose 'alt'.
|
|
1552
|
+
// Users can use Ctrl+Left or rely on terminal mapping Option to Meta which effectively makes it key.meta
|
|
1553
|
+
// BUT if key.meta is Cmd on Mac, we map that to Home.
|
|
1554
|
+
// So standard Mac "Option+Left" might not work unless it sends Esc sequence or mapped to Ctrl.
|
|
1555
|
+
// We allow Ctrl+Left for Mac users.
|
|
1457
1556
|
let newOffset = cursorOffset;
|
|
1458
1557
|
if (newOffset > 0) {
|
|
1459
1558
|
// Skip whitespace backwards
|
|
@@ -1466,8 +1565,10 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1466
1565
|
}
|
|
1467
1566
|
setCursorOffset(newOffset);
|
|
1468
1567
|
}
|
|
1568
|
+
return;
|
|
1469
1569
|
}
|
|
1470
|
-
|
|
1570
|
+
// Standard Left Arrow
|
|
1571
|
+
if (cursorOffset > 0) {
|
|
1471
1572
|
setCursorOffset(cursorOffset - 1);
|
|
1472
1573
|
}
|
|
1473
1574
|
return;
|
|
@@ -1475,10 +1576,16 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1475
1576
|
if (key.rightArrow) {
|
|
1476
1577
|
// Autocomplete Logic (Only at end of line)
|
|
1477
1578
|
// AI suggestion takes priority over passive suggestion
|
|
1579
|
+
// Autocomplete Logic
|
|
1478
1580
|
const effectiveSuggestion = aiAutocompleteSuggestion || autocompleteSuggestion;
|
|
1479
1581
|
if (effectiveSuggestion && cursorOffset === value.length) {
|
|
1480
|
-
if (key.ctrl) {
|
|
1481
|
-
// Ctrl+Right: Accept FULL suggestion
|
|
1582
|
+
if (key.ctrl || (isMac && key.meta)) {
|
|
1583
|
+
// Ctrl+Right (Win) or Cmd+Right (Mac): Accept FULL suggestion
|
|
1584
|
+
// (Wait, Cmd+Right is usually End of Line on Mac. We should prioritize Navigation over Autocomplete?
|
|
1585
|
+
// Actually, if we are at end of line, End of Line does nothing. So we can use it for accept full?)
|
|
1586
|
+
// Convention: Right Arrow accepts word. Ctrl+Right accepts full?
|
|
1587
|
+
// On Mac, Cmd+Right is End. If at End, it's a no-op for nav.
|
|
1588
|
+
// Let's allow Cmd+Right to accept full IF at end.
|
|
1482
1589
|
setValue(effectiveSuggestion);
|
|
1483
1590
|
setCursorOffset(effectiveSuggestion.length);
|
|
1484
1591
|
setAutocompleteSuggestion(null);
|
|
@@ -1488,17 +1595,16 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1488
1595
|
else {
|
|
1489
1596
|
// Right: Accept NEXT WORD
|
|
1490
1597
|
const remaining = effectiveSuggestion.slice(value.length);
|
|
1491
|
-
// Match next chunk of non-whitespace
|
|
1598
|
+
// Match next chunk of non-whitespace
|
|
1492
1599
|
const match = remaining.match(/^(\s*\S+)/);
|
|
1493
1600
|
if (match) {
|
|
1494
1601
|
const toAdd = match[0];
|
|
1495
1602
|
const newValue = value + toAdd;
|
|
1496
1603
|
setValue(newValue);
|
|
1497
1604
|
setCursorOffset(newValue.length);
|
|
1498
|
-
return;
|
|
1605
|
+
return; // Done
|
|
1499
1606
|
}
|
|
1500
1607
|
else if (remaining.length > 0) {
|
|
1501
|
-
// Fallback: if only whitespace remains or regex fails, take it all
|
|
1502
1608
|
const newValue = value + remaining;
|
|
1503
1609
|
setValue(newValue);
|
|
1504
1610
|
setCursorOffset(newValue.length);
|
|
@@ -1506,6 +1612,29 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1506
1612
|
}
|
|
1507
1613
|
}
|
|
1508
1614
|
}
|
|
1615
|
+
// Navigation Logic
|
|
1616
|
+
if (isMac && key.meta) {
|
|
1617
|
+
// Cmd+Right -> End of line
|
|
1618
|
+
setCursorOffset(value.length);
|
|
1619
|
+
return;
|
|
1620
|
+
}
|
|
1621
|
+
if ((!isMac && key.meta) || key.ctrl) {
|
|
1622
|
+
// Alt+Right (Win) or Ctrl+Right: Word Forward
|
|
1623
|
+
// (Note: Ink uses key.meta for Alt on Windows)
|
|
1624
|
+
let newOffset = cursorOffset;
|
|
1625
|
+
if (newOffset < value.length) {
|
|
1626
|
+
// Skip whitespace forwards
|
|
1627
|
+
while (newOffset < value.length && /\s/.test(value[newOffset])) {
|
|
1628
|
+
newOffset++;
|
|
1629
|
+
}
|
|
1630
|
+
// Skip non-whitespace forwards
|
|
1631
|
+
while (newOffset < value.length && !/\s/.test(value[newOffset])) {
|
|
1632
|
+
newOffset++;
|
|
1633
|
+
}
|
|
1634
|
+
setCursorOffset(newOffset);
|
|
1635
|
+
}
|
|
1636
|
+
return;
|
|
1637
|
+
}
|
|
1509
1638
|
// Navigation Logic (if not completing)
|
|
1510
1639
|
if (key.ctrl || key.meta) {
|
|
1511
1640
|
// Ctrl+Right / Meta+Right (Option+Right): Move word forwards
|
|
@@ -1665,6 +1794,42 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1665
1794
|
setSlashAutocompleteVisible(false);
|
|
1666
1795
|
}
|
|
1667
1796
|
}
|
|
1797
|
+
else if (newValue.startsWith('/revert ')) {
|
|
1798
|
+
// Checkpoint autocomplete for /revert command (on backspace)
|
|
1799
|
+
const partialId = newValue.slice(8).toLowerCase(); // Remove "/revert "
|
|
1800
|
+
const checkpoints = getCheckpoints ? getCheckpoints() : [];
|
|
1801
|
+
if (checkpoints.length === 0) {
|
|
1802
|
+
// No checkpoints yet - show informative message
|
|
1803
|
+
setSlashAutocompleteCommands([{
|
|
1804
|
+
name: '(no checkpoints)',
|
|
1805
|
+
description: 'Ask AI a question first to create a checkpoint'
|
|
1806
|
+
}]);
|
|
1807
|
+
setSlashAutocompleteVisible(true);
|
|
1808
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1809
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1810
|
+
}
|
|
1811
|
+
else {
|
|
1812
|
+
const matchingCheckpoints = checkpoints
|
|
1813
|
+
.filter(cp => cp.id.toLowerCase().includes(partialId) || cp.prompt.toLowerCase().includes(partialId))
|
|
1814
|
+
.slice(0, 10)
|
|
1815
|
+
.map(cp => {
|
|
1816
|
+
const truncatedPrompt = cp.prompt.length > 50 ? cp.prompt.slice(0, 50) + '...' : cp.prompt;
|
|
1817
|
+
return {
|
|
1818
|
+
name: cp.id,
|
|
1819
|
+
description: truncatedPrompt
|
|
1820
|
+
};
|
|
1821
|
+
});
|
|
1822
|
+
if (matchingCheckpoints.length > 0) {
|
|
1823
|
+
setSlashAutocompleteCommands(matchingCheckpoints);
|
|
1824
|
+
setSlashAutocompleteVisible(true);
|
|
1825
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1826
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1827
|
+
}
|
|
1828
|
+
else {
|
|
1829
|
+
setSlashAutocompleteVisible(false);
|
|
1830
|
+
}
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1668
1833
|
else if (newValue.match(/^\/workflow\s+(run|view|delete)\s+/) ||
|
|
1669
1834
|
newValue.match(/^\/wf\s+(run|view|delete)\s+/)) {
|
|
1670
1835
|
// Workflow name autocomplete (when user types "/workflow run " or similar)
|
|
@@ -1984,7 +2149,7 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1984
2149
|
React.createElement(Text, { color: "#666666" }, "CWD: "),
|
|
1985
2150
|
React.createElement(Text, { color: "#00ccff", bold: true }, currentDir)),
|
|
1986
2151
|
React.createElement(Box, null,
|
|
1987
|
-
model && !commandMode && (React.createElement(Box, { marginRight: 1 },
|
|
2152
|
+
model && !commandMode && !backgroundMode && (React.createElement(Box, { marginRight: 1 },
|
|
1988
2153
|
React.createElement(Text, { color: "#666666" }, "Model: "),
|
|
1989
2154
|
React.createElement(Text, { color: "#00ccff" }, model))),
|
|
1990
2155
|
React.createElement(Box, null,
|
|
@@ -2007,7 +2172,7 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
2007
2172
|
React.createElement(Text, { color: "#666666" }, "> "),
|
|
2008
2173
|
renderInput()),
|
|
2009
2174
|
React.createElement(Box, { marginY: 1, justifyContent: "space-between", width: "100%" },
|
|
2010
|
-
React.createElement(Text, { color: "#666666", dimColor: true }, isAutoMode ? ('Ctrl+D to switch modes • Ctrl+T to auto-approve') : backgroundMode ? ('Ctrl+D to switch modes • Commands run in background') : commandMode ? ('Ctrl+D to switch modes • Tab for autocomplete') : ('Ctrl+D to switch modes • Ctrl+T to auto-approve
|
|
2175
|
+
React.createElement(Text, { color: "#666666", dimColor: true }, isAutoMode ? ('Ctrl+D to switch modes • Ctrl+T to auto-approve') : backgroundMode ? ('Ctrl+D to switch modes • Commands run in background') : commandMode ? ('Ctrl+D to switch modes • Tab for autocomplete') : ('Ctrl+D to switch modes • Ctrl+T to auto-approve')),
|
|
2011
2176
|
React.createElement(Box, { gap: 1 },
|
|
2012
2177
|
subAgentCount > 0 && (React.createElement(Text, { color: "#00ccff", bold: true },
|
|
2013
2178
|
"[sub-agent: ",
|
|
@@ -2018,8 +2183,8 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
2018
2183
|
backgroundTaskCount,
|
|
2019
2184
|
"]")),
|
|
2020
2185
|
!commandMode && !backgroundMode && planMode && (React.createElement(Text, { color: "#ffaa00", bold: true }, "[PLANNING]")),
|
|
2021
|
-
!commandMode && autoAcceptMode ? (React.createElement(Text, { color: "#00cc66", bold: true }, "[AUTO-ACCEPT: ON]")) : !commandMode ? (React.createElement(Text, { color: "#666666", dimColor: true }, "[AUTO-ACCEPT: OFF]")) : null,
|
|
2022
|
-
!commandMode && (React.createElement(Box, { marginLeft: 1 },
|
|
2186
|
+
!commandMode && !backgroundMode && autoAcceptMode ? (React.createElement(Text, { color: "#00cc66", bold: true }, "[AUTO-ACCEPT: ON]")) : !commandMode && !backgroundMode ? (React.createElement(Text, { color: "#666666", dimColor: true }, "[AUTO-ACCEPT: OFF]")) : null,
|
|
2187
|
+
!commandMode && !backgroundMode && (React.createElement(Box, { marginLeft: 1 },
|
|
2023
2188
|
React.createElement(ContextWindowIndicator, { currentTokens: currentTokens, maxTokens: maxTokens }))))),
|
|
2024
2189
|
slashAutocompleteVisible && slashMaxVisibleItems > 0 && (React.createElement(SlashCommandAutocomplete, { commands: slashAutocompleteCommands, selectedIndex: slashAutocompleteSelectedIndex, maxVisibleItems: slashMaxVisibleItems, scrollOffset: slashAutocompleteScrollOffset })),
|
|
2025
2190
|
fileTagAutocompleteVisible && (React.createElement(FileTagAutocomplete, { files: fileTagSuggestions, selectedIndex: fileTagSelectedIndex }))));
|