centaurus-cli 2.9.3 → 2.9.4
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 +72 -8
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +607 -141
- package/dist/cli-adapter.js.map +1 -1
- package/dist/commands/CommandParser.d.ts +1 -1
- package/dist/commands/CommandParser.d.ts.map +1 -1
- package/dist/commands/CommandParser.js +113 -0
- package/dist/commands/CommandParser.js.map +1 -1
- package/dist/config/slash-commands.d.ts +2 -0
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +28 -0
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/context/context-manager.d.ts +1 -1
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +3 -1
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/handlers/docker-handler.d.ts +9 -0
- package/dist/context/handlers/docker-handler.d.ts.map +1 -1
- package/dist/context/handlers/docker-handler.js +99 -10
- package/dist/context/handlers/docker-handler.js.map +1 -1
- package/dist/context/handlers/ssh-handler.d.ts +20 -0
- package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
- package/dist/context/handlers/ssh-handler.js +129 -1
- package/dist/context/handlers/ssh-handler.js.map +1 -1
- package/dist/context/subshell-handler.d.ts +15 -0
- package/dist/context/subshell-handler.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js +33 -11
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.js +1 -1
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/warpify-detector.d.ts +43 -0
- package/dist/services/warpify-detector.d.ts.map +1 -0
- package/dist/services/warpify-detector.js +203 -0
- package/dist/services/warpify-detector.js.map +1 -0
- package/dist/services/workflow-storage.d.ts +72 -0
- package/dist/services/workflow-storage.d.ts.map +1 -0
- package/dist/services/workflow-storage.js +239 -0
- package/dist/services/workflow-storage.js.map +1 -0
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +14 -0
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/enter-remote-session.d.ts +13 -0
- package/dist/tools/enter-remote-session.d.ts.map +1 -0
- package/dist/tools/enter-remote-session.js +226 -0
- package/dist/tools/enter-remote-session.js.map +1 -0
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +9 -2
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/grep-search.d.ts +104 -31
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +699 -430
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/workflow-tool.d.ts +11 -0
- package/dist/tools/workflow-tool.d.ts.map +1 -0
- package/dist/tools/workflow-tool.js +87 -0
- package/dist/tools/workflow-tool.js.map +1 -0
- package/dist/types/workflow.d.ts +110 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +8 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/ui/components/App.d.ts +10 -1
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +117 -4
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/Breadcrumbs.d.ts +4 -3
- package/dist/ui/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/ui/components/Breadcrumbs.js +60 -54
- package/dist/ui/components/Breadcrumbs.js.map +1 -1
- package/dist/ui/components/ConnectionStatusMessage.js +2 -2
- package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +1 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +168 -2
- 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 +13 -3
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +164 -25
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/WorkflowCreatorScreen.d.ts +25 -0
- package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +1 -0
- package/dist/ui/components/WorkflowCreatorScreen.js +164 -0
- package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -0
- 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/package.json +1 -1
|
@@ -1,62 +1,68 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
|
+
const getContextBreadcrumbs = (context) => {
|
|
4
|
+
// Get breadcrumbs from handler if available
|
|
5
|
+
if (context.handler?.getBreadcrumbs) {
|
|
6
|
+
const crumbs = context.handler.getBreadcrumbs();
|
|
7
|
+
if (crumbs.length > 0)
|
|
8
|
+
return crumbs;
|
|
9
|
+
}
|
|
10
|
+
// Default logic based on type
|
|
11
|
+
const typeColors = {
|
|
12
|
+
ssh: 'cyan',
|
|
13
|
+
wsl: 'yellow',
|
|
14
|
+
docker: 'blue',
|
|
15
|
+
local: 'gray'
|
|
16
|
+
};
|
|
17
|
+
const info = {
|
|
18
|
+
label: context.type,
|
|
19
|
+
color: typeColors[context.type] || 'cyan'
|
|
20
|
+
};
|
|
21
|
+
// Enhance label with metadata
|
|
22
|
+
if (context.type === 'ssh' && context.metadata.username) {
|
|
23
|
+
info.label = `${context.metadata.username}@${context.metadata.hostname || 'host'}`;
|
|
24
|
+
}
|
|
25
|
+
else if (context.type === 'wsl' && context.metadata.distroName) {
|
|
26
|
+
info.label = `wsl:${context.metadata.distroName}`;
|
|
27
|
+
}
|
|
28
|
+
else if (context.type === 'docker' && context.metadata.containerId) {
|
|
29
|
+
info.label = `docker:${context.metadata.containerId.substring(0, 8)}`;
|
|
30
|
+
}
|
|
31
|
+
return [info];
|
|
32
|
+
};
|
|
3
33
|
/**
|
|
4
|
-
* Breadcrumbs component displays the current subshell context
|
|
5
|
-
* Shows visual indicators for
|
|
34
|
+
* Breadcrumbs component displays the current subshell context stack
|
|
35
|
+
* Shows visual indicators for nested environments relative to local
|
|
6
36
|
*/
|
|
7
|
-
export const Breadcrumbs = ({ context }) => {
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
37
|
+
export const Breadcrumbs = ({ context, stack }) => {
|
|
38
|
+
// Use stack if available, otherwise fallback to single context
|
|
39
|
+
let contexts = stack || (context ? [context] : []);
|
|
40
|
+
// Filter out local context if it's the base of a remote stack (standard case)
|
|
41
|
+
// We only want to show the "remote path"
|
|
42
|
+
if (contexts.length > 1 && contexts[0].type === 'local') {
|
|
43
|
+
contexts = contexts.slice(1);
|
|
11
44
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (breadcrumbs.length === 0) {
|
|
16
|
-
const defaultBreadcrumbs = [];
|
|
17
|
-
// Add type breadcrumb with appropriate color
|
|
18
|
-
const typeColors = {
|
|
19
|
-
ssh: 'cyan',
|
|
20
|
-
wsl: 'yellow',
|
|
21
|
-
docker: 'blue',
|
|
22
|
-
};
|
|
23
|
-
defaultBreadcrumbs.push({
|
|
24
|
-
label: context.type,
|
|
25
|
-
color: typeColors[context.type] || 'cyan',
|
|
26
|
-
});
|
|
27
|
-
// Add hostname/username for SSH
|
|
28
|
-
if (context.type === 'ssh' && context.metadata.username && context.metadata.hostname) {
|
|
29
|
-
defaultBreadcrumbs.push({
|
|
30
|
-
label: `${context.metadata.username}@${context.metadata.hostname}`,
|
|
31
|
-
color: 'cyan',
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
// Add distribution name for WSL
|
|
35
|
-
if (context.type === 'wsl' && context.metadata.distroName) {
|
|
36
|
-
defaultBreadcrumbs.push({
|
|
37
|
-
label: context.metadata.distroName,
|
|
38
|
-
color: 'yellow',
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
// Add container ID for Docker
|
|
42
|
-
if (context.type === 'docker' && context.metadata.containerId) {
|
|
43
|
-
defaultBreadcrumbs.push({
|
|
44
|
-
label: context.metadata.containerId.substring(0, 12), // Show first 12 chars like Docker CLI
|
|
45
|
-
color: 'blue',
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
return (React.createElement(Box, { marginRight: 1 }, defaultBreadcrumbs.map((crumb, i) => (React.createElement(Box, { key: i, marginRight: 1 },
|
|
49
|
-
React.createElement(Text, { color: crumb.color || 'cyan', bold: true },
|
|
50
|
-
"[",
|
|
51
|
-
crumb.label,
|
|
52
|
-
"]"))))));
|
|
45
|
+
else if (contexts.length === 1 && contexts[0].type === 'local') {
|
|
46
|
+
// If we're just local, render nothing (InputBox handles CWD)
|
|
47
|
+
return null;
|
|
53
48
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
49
|
+
if (contexts.length === 0)
|
|
50
|
+
return null;
|
|
51
|
+
return (React.createElement(Box, { marginRight: 1 }, contexts.map((ctx, ctxIndex) => {
|
|
52
|
+
const crumbs = getContextBreadcrumbs(ctx);
|
|
53
|
+
return (React.createElement(Box, { key: ctx.sessionId || ctxIndex, flexDirection: "row" },
|
|
54
|
+
ctxIndex > 0 && (React.createElement(Box, { marginX: 1 },
|
|
55
|
+
React.createElement(Text, { color: "gray" }, "\u203A"))),
|
|
56
|
+
crumbs.map((info, crumbIndex) => {
|
|
57
|
+
// Only bold the very last item of the very last context
|
|
58
|
+
const isLast = ctxIndex === contexts.length - 1 && crumbIndex === crumbs.length - 1;
|
|
59
|
+
return (React.createElement(Box, { key: `${ctxIndex}-${crumbIndex}`, flexDirection: "row" },
|
|
60
|
+
crumbIndex > 0 && React.createElement(Box, { width: 1 }),
|
|
61
|
+
React.createElement(Text, { color: info.color || 'cyan', bold: isLast },
|
|
62
|
+
"[",
|
|
63
|
+
info.label,
|
|
64
|
+
"]")));
|
|
65
|
+
})));
|
|
66
|
+
})));
|
|
61
67
|
};
|
|
62
68
|
//# sourceMappingURL=Breadcrumbs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumbs.js","sourceRoot":"","sources":["../../../src/ui/components/Breadcrumbs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.js","sourceRoot":"","sources":["../../../src/ui/components/Breadcrumbs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ export const ConnectionStatusMessage = React.memo(({ status }) => {
|
|
|
21
21
|
React.createElement(Text, { color: "#00ccff" },
|
|
22
22
|
React.createElement(Spinner, { type: "dots" })),
|
|
23
23
|
React.createElement(Text, { color: "#9945FF" },
|
|
24
|
-
"
|
|
24
|
+
" Tunnelling to ",
|
|
25
25
|
getTypeLabel(),
|
|
26
26
|
" environment..."))));
|
|
27
27
|
}
|
|
@@ -31,7 +31,7 @@ export const ConnectionStatusMessage = React.memo(({ status }) => {
|
|
|
31
31
|
React.createElement(Box, null,
|
|
32
32
|
React.createElement(Text, { color: "#00cc66", bold: true }, "\u2713"),
|
|
33
33
|
React.createElement(Text, { color: "#00cc66" },
|
|
34
|
-
"
|
|
34
|
+
" Established Wormhole to ",
|
|
35
35
|
getTypeLabel(),
|
|
36
36
|
" environment"),
|
|
37
37
|
status.connectionString && (React.createElement(Text, { color: "#666666" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionStatusMessage.js","sourceRoot":"","sources":["../../../src/ui/components/ConnectionStatusMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAalC;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA2C,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IACrG,MAAM,YAAY,GAAG,GAAG,EAAE;QACtB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;YACzB,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC;YACzB,KAAK,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC/B,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC;QAChC,CAAC;IACL,CAAC,CAAC;IAEF,mCAAmC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,CACH,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAC,YAAY;YACtH,oBAAC,GAAG;gBACA,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;oBAAC,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAAO;gBACpD,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;;oBAAiB,YAAY,EAAE;sCAAuB,CACzE,CACJ,CACT,CAAC;IACN,CAAC;IAED,2CAA2C;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,CACH,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAC,YAAY;YACtH,oBAAC,GAAG;gBACA,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,mBAAS;gBACnC,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;;
|
|
1
|
+
{"version":3,"file":"ConnectionStatusMessage.js","sourceRoot":"","sources":["../../../src/ui/components/ConnectionStatusMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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;CAC5B;AA+CD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAqnE3C,CAAC"}
|
|
@@ -14,6 +14,7 @@ import { filterCommands } from '../../config/slash-commands.js';
|
|
|
14
14
|
import { getClipboardImages } from '../../services/clipboard-service.js';
|
|
15
15
|
import { useTerminalDimensions, TERMINAL_HEIGHT_CONSTANTS } from '../../hooks/useTerminalDimensions.js';
|
|
16
16
|
import { AIAutocompleteAgent, AI_AUTOCOMPLETE_DEBOUNCE_MS } from '../../services/ai-autocomplete-agent.js';
|
|
17
|
+
import { workflowStorage } from '../../services/workflow-storage.js';
|
|
17
18
|
const getVisualLines = (text, width) => {
|
|
18
19
|
const logicalLines = text.split('\n');
|
|
19
20
|
const visualLines = [];
|
|
@@ -51,7 +52,7 @@ const getVisualLines = (text, width) => {
|
|
|
51
52
|
});
|
|
52
53
|
return visualLines;
|
|
53
54
|
};
|
|
54
|
-
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, 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 = [] }) => {
|
|
55
56
|
// Use initialValue for first mount, but manage state internally after that
|
|
56
57
|
const [value, setValueInternal] = useState(initialValue);
|
|
57
58
|
const [cursorOffset, setCursorOffset] = useState(0);
|
|
@@ -564,6 +565,68 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
564
565
|
setCursorOffset(newValue.length);
|
|
565
566
|
setSlashAutocompleteVisible(false);
|
|
566
567
|
}
|
|
568
|
+
else if (value.startsWith('/workflow new ') || value.startsWith('/wf new ')) {
|
|
569
|
+
// We're in workflow new subcommand mode (manual or learn-workflow)
|
|
570
|
+
const prefix = value.startsWith('/workflow new ') ? '/workflow new ' : '/wf new ';
|
|
571
|
+
const newValue = `${prefix}${selected.name}`;
|
|
572
|
+
setValue(newValue);
|
|
573
|
+
setCursorOffset(newValue.length);
|
|
574
|
+
setSlashAutocompleteVisible(false);
|
|
575
|
+
}
|
|
576
|
+
else if (value.startsWith('/workflow ') || value.startsWith('/wf ')) {
|
|
577
|
+
// Check if we're in workflow name selection mode (after run/view/delete)
|
|
578
|
+
const workflowNameMatch = value.match(/^\/(?:workflow|wf)\s+(run|view|delete)\s+/);
|
|
579
|
+
if (workflowNameMatch) {
|
|
580
|
+
// We're selecting a workflow name
|
|
581
|
+
const prefix = value.match(/^\/(?:workflow|wf)\s+(?:run|view|delete)\s+/)?.[0] || '';
|
|
582
|
+
const newValue = `${prefix}${selected.name}`;
|
|
583
|
+
setValue(newValue);
|
|
584
|
+
setCursorOffset(newValue.length);
|
|
585
|
+
setSlashAutocompleteVisible(false);
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
// We're selecting a workflow subcommand
|
|
589
|
+
const prefix = value.startsWith('/workflow ') ? '/workflow ' : '/wf ';
|
|
590
|
+
const newValue = `${prefix}${selected.name} `;
|
|
591
|
+
setValue(newValue);
|
|
592
|
+
setCursorOffset(newValue.length);
|
|
593
|
+
// For run/view/delete, show workflow names immediately
|
|
594
|
+
if (selected.name === 'run' || selected.name === 'view' || selected.name === 'delete') {
|
|
595
|
+
const workflows = workflowStorage.list();
|
|
596
|
+
const matchingWorkflows = workflows
|
|
597
|
+
.slice(0, 10)
|
|
598
|
+
.map(wf => ({
|
|
599
|
+
name: wf.name,
|
|
600
|
+
description: wf.description || `${wf.stepCount} step${wf.stepCount !== 1 ? 's' : ''}`
|
|
601
|
+
}));
|
|
602
|
+
if (matchingWorkflows.length > 0) {
|
|
603
|
+
setSlashAutocompleteCommands(matchingWorkflows);
|
|
604
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
605
|
+
setSlashAutocompleteScrollOffset(0);
|
|
606
|
+
// Keep autocomplete visible
|
|
607
|
+
}
|
|
608
|
+
else {
|
|
609
|
+
setSlashAutocompleteVisible(false);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
else if (selected.name === 'new') {
|
|
613
|
+
// For 'new' subcommand, show manual/learn-workflow options
|
|
614
|
+
const subcommandMatches = filterCommands('workflow new ');
|
|
615
|
+
if (subcommandMatches.length > 0) {
|
|
616
|
+
setSlashAutocompleteCommands(subcommandMatches);
|
|
617
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
618
|
+
setSlashAutocompleteScrollOffset(0);
|
|
619
|
+
// Keep autocomplete visible for next level
|
|
620
|
+
}
|
|
621
|
+
else {
|
|
622
|
+
setSlashAutocompleteVisible(false);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
setSlashAutocompleteVisible(false);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
567
630
|
else if (value.startsWith('/settings auto-suggest ')) {
|
|
568
631
|
// We're selecting an auto-suggest option (on/off)
|
|
569
632
|
const newValue = `/settings auto-suggest ${selected.name}`;
|
|
@@ -683,6 +746,18 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
683
746
|
setSlashAutocompleteVisible(false);
|
|
684
747
|
}
|
|
685
748
|
}
|
|
749
|
+
else if (selected.name === 'workflow' || selected.name === 'wf') {
|
|
750
|
+
const subcommandMatches = filterCommands('workflow ');
|
|
751
|
+
if (subcommandMatches.length > 0) {
|
|
752
|
+
setSlashAutocompleteCommands(subcommandMatches);
|
|
753
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
754
|
+
setSlashAutocompleteScrollOffset(0);
|
|
755
|
+
// Keep autocomplete visible for subcommands
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
setSlashAutocompleteVisible(false);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
686
761
|
else {
|
|
687
762
|
setSlashAutocompleteVisible(false);
|
|
688
763
|
}
|
|
@@ -920,6 +995,59 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
920
995
|
setSlashAutocompleteVisible(false);
|
|
921
996
|
}
|
|
922
997
|
}
|
|
998
|
+
else if (newValue.match(/^\/workflow\s+(run|view|delete)\s+/) ||
|
|
999
|
+
newValue.match(/^\/wf\s+(run|view|delete)\s+/)) {
|
|
1000
|
+
// Workflow name autocomplete (when user types "/workflow run " or similar)
|
|
1001
|
+
// This MUST come before the /workflow subcommand check since it's more specific
|
|
1002
|
+
const match = newValue.match(/^\/(?:workflow|wf)\s+(?:run|view|delete)\s+(.*)$/);
|
|
1003
|
+
const partialName = match ? match[1].toLowerCase() : '';
|
|
1004
|
+
const workflows = workflowStorage.list();
|
|
1005
|
+
const matchingWorkflows = workflows
|
|
1006
|
+
.filter(wf => wf.name.toLowerCase().includes(partialName))
|
|
1007
|
+
.slice(0, 10)
|
|
1008
|
+
.map(wf => ({
|
|
1009
|
+
name: wf.name,
|
|
1010
|
+
description: wf.description || `${wf.stepCount} step${wf.stepCount !== 1 ? 's' : ''}`
|
|
1011
|
+
}));
|
|
1012
|
+
if (matchingWorkflows.length > 0) {
|
|
1013
|
+
setSlashAutocompleteCommands(matchingWorkflows);
|
|
1014
|
+
setSlashAutocompleteVisible(true);
|
|
1015
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1016
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1017
|
+
}
|
|
1018
|
+
else {
|
|
1019
|
+
setSlashAutocompleteVisible(false);
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
else if (newValue.match(/^\/workflow\s+new\s+/) ||
|
|
1023
|
+
newValue.match(/^\/wf\s+new\s+/)) {
|
|
1024
|
+
// Workflow new subcommand autocomplete (manual, learn-workflow)
|
|
1025
|
+
const fullQuery = newValue.slice(1);
|
|
1026
|
+
const matches = filterCommands(fullQuery);
|
|
1027
|
+
if (matches.length > 0) {
|
|
1028
|
+
setSlashAutocompleteCommands(matches);
|
|
1029
|
+
setSlashAutocompleteVisible(true);
|
|
1030
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1031
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1032
|
+
}
|
|
1033
|
+
else {
|
|
1034
|
+
setSlashAutocompleteVisible(false);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
else if (newValue.startsWith('/workflow ') || newValue.startsWith('/wf ')) {
|
|
1038
|
+
// Workflow subcommands (when user types "/workflow " or "/wf ")
|
|
1039
|
+
const fullQuery = newValue.slice(1);
|
|
1040
|
+
const matches = filterCommands(fullQuery);
|
|
1041
|
+
if (matches.length > 0) {
|
|
1042
|
+
setSlashAutocompleteCommands(matches);
|
|
1043
|
+
setSlashAutocompleteVisible(true);
|
|
1044
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1045
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1046
|
+
}
|
|
1047
|
+
else {
|
|
1048
|
+
setSlashAutocompleteVisible(false);
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
923
1051
|
else {
|
|
924
1052
|
setSlashAutocompleteVisible(false);
|
|
925
1053
|
}
|
|
@@ -1537,6 +1665,44 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1537
1665
|
setSlashAutocompleteVisible(false);
|
|
1538
1666
|
}
|
|
1539
1667
|
}
|
|
1668
|
+
else if (newValue.match(/^\/workflow\s+(run|view|delete)\s+/) ||
|
|
1669
|
+
newValue.match(/^\/wf\s+(run|view|delete)\s+/)) {
|
|
1670
|
+
// Workflow name autocomplete (when user types "/workflow run " or similar)
|
|
1671
|
+
// This MUST come before the /workflow subcommand check since it's more specific
|
|
1672
|
+
const match = newValue.match(/^\/(?:workflow|wf)\s+(?:run|view|delete)\s+(.*)$/);
|
|
1673
|
+
const partialName = match ? match[1].toLowerCase() : '';
|
|
1674
|
+
const workflows = workflowStorage.list();
|
|
1675
|
+
const matchingWorkflows = workflows
|
|
1676
|
+
.filter(wf => wf.name.toLowerCase().includes(partialName))
|
|
1677
|
+
.slice(0, 10)
|
|
1678
|
+
.map(wf => ({
|
|
1679
|
+
name: wf.name,
|
|
1680
|
+
description: wf.description || `${wf.stepCount} step${wf.stepCount !== 1 ? 's' : ''}`
|
|
1681
|
+
}));
|
|
1682
|
+
if (matchingWorkflows.length > 0) {
|
|
1683
|
+
setSlashAutocompleteCommands(matchingWorkflows);
|
|
1684
|
+
setSlashAutocompleteVisible(true);
|
|
1685
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1686
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1687
|
+
}
|
|
1688
|
+
else {
|
|
1689
|
+
setSlashAutocompleteVisible(false);
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
else if (newValue.startsWith('/workflow ') || newValue.startsWith('/wf ')) {
|
|
1693
|
+
// Workflow subcommands (when user types "/workflow " or "/wf ")
|
|
1694
|
+
const fullQuery = newValue.slice(1); // Remove leading "/", pass "workflow <subquery>" to filterCommands
|
|
1695
|
+
const matches = filterCommands(fullQuery);
|
|
1696
|
+
if (matches.length > 0) {
|
|
1697
|
+
setSlashAutocompleteCommands(matches);
|
|
1698
|
+
setSlashAutocompleteVisible(true);
|
|
1699
|
+
setSlashAutocompleteSelectedIndex(0);
|
|
1700
|
+
setSlashAutocompleteScrollOffset(0);
|
|
1701
|
+
}
|
|
1702
|
+
else {
|
|
1703
|
+
setSlashAutocompleteVisible(false);
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1540
1706
|
else {
|
|
1541
1707
|
setSlashAutocompleteVisible(false);
|
|
1542
1708
|
}
|
|
@@ -1814,7 +1980,7 @@ export const InputBox = React.memo(({ onSubmit, placeholder = 'Ask anything...',
|
|
|
1814
1980
|
"#257aa5ff", paddingX: 1, paddingY: 0, width: "100%" },
|
|
1815
1981
|
React.createElement(Box, { marginY: 1, justifyContent: "space-between", width: "100%" },
|
|
1816
1982
|
React.createElement(Box, null,
|
|
1817
|
-
subshellContext && subshellContext.type !== 'local' && (React.createElement(Breadcrumbs, { context: subshellContext })),
|
|
1983
|
+
subshellContext && subshellContext.type !== 'local' && (React.createElement(Breadcrumbs, { context: subshellContext, stack: subshellContextStack })),
|
|
1818
1984
|
React.createElement(Text, { color: "#666666" }, "CWD: "),
|
|
1819
1985
|
React.createElement(Text, { color: "#00ccff", bold: true }, currentDir)),
|
|
1820
1986
|
React.createElement(Box, null,
|