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.
Files changed (92) hide show
  1. package/dist/cli-adapter.d.ts +72 -8
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +607 -141
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/commands/CommandParser.d.ts +1 -1
  6. package/dist/commands/CommandParser.d.ts.map +1 -1
  7. package/dist/commands/CommandParser.js +113 -0
  8. package/dist/commands/CommandParser.js.map +1 -1
  9. package/dist/config/slash-commands.d.ts +2 -0
  10. package/dist/config/slash-commands.d.ts.map +1 -1
  11. package/dist/config/slash-commands.js +28 -0
  12. package/dist/config/slash-commands.js.map +1 -1
  13. package/dist/context/context-manager.d.ts +1 -1
  14. package/dist/context/context-manager.d.ts.map +1 -1
  15. package/dist/context/context-manager.js +3 -1
  16. package/dist/context/context-manager.js.map +1 -1
  17. package/dist/context/handlers/docker-handler.d.ts +9 -0
  18. package/dist/context/handlers/docker-handler.d.ts.map +1 -1
  19. package/dist/context/handlers/docker-handler.js +99 -10
  20. package/dist/context/handlers/docker-handler.js.map +1 -1
  21. package/dist/context/handlers/ssh-handler.d.ts +20 -0
  22. package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
  23. package/dist/context/handlers/ssh-handler.js +129 -1
  24. package/dist/context/handlers/ssh-handler.js.map +1 -1
  25. package/dist/context/subshell-handler.d.ts +15 -0
  26. package/dist/context/subshell-handler.d.ts.map +1 -1
  27. package/dist/index.js +10 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/services/ai-service-client.d.ts.map +1 -1
  30. package/dist/services/ai-service-client.js +33 -11
  31. package/dist/services/ai-service-client.js.map +1 -1
  32. package/dist/services/api-client.js +1 -1
  33. package/dist/services/api-client.js.map +1 -1
  34. package/dist/services/warpify-detector.d.ts +43 -0
  35. package/dist/services/warpify-detector.d.ts.map +1 -0
  36. package/dist/services/warpify-detector.js +203 -0
  37. package/dist/services/warpify-detector.js.map +1 -0
  38. package/dist/services/workflow-storage.d.ts +72 -0
  39. package/dist/services/workflow-storage.d.ts.map +1 -0
  40. package/dist/services/workflow-storage.js +239 -0
  41. package/dist/services/workflow-storage.js.map +1 -0
  42. package/dist/tools/command.d.ts.map +1 -1
  43. package/dist/tools/command.js +14 -0
  44. package/dist/tools/command.js.map +1 -1
  45. package/dist/tools/enter-remote-session.d.ts +13 -0
  46. package/dist/tools/enter-remote-session.d.ts.map +1 -0
  47. package/dist/tools/enter-remote-session.js +226 -0
  48. package/dist/tools/enter-remote-session.js.map +1 -0
  49. package/dist/tools/find-files.d.ts.map +1 -1
  50. package/dist/tools/find-files.js +9 -2
  51. package/dist/tools/find-files.js.map +1 -1
  52. package/dist/tools/grep-search.d.ts +104 -31
  53. package/dist/tools/grep-search.d.ts.map +1 -1
  54. package/dist/tools/grep-search.js +699 -430
  55. package/dist/tools/grep-search.js.map +1 -1
  56. package/dist/tools/workflow-tool.d.ts +11 -0
  57. package/dist/tools/workflow-tool.d.ts.map +1 -0
  58. package/dist/tools/workflow-tool.js +87 -0
  59. package/dist/tools/workflow-tool.js.map +1 -0
  60. package/dist/types/workflow.d.ts +110 -0
  61. package/dist/types/workflow.d.ts.map +1 -0
  62. package/dist/types/workflow.js +8 -0
  63. package/dist/types/workflow.js.map +1 -0
  64. package/dist/ui/components/App.d.ts +10 -1
  65. package/dist/ui/components/App.d.ts.map +1 -1
  66. package/dist/ui/components/App.js +117 -4
  67. package/dist/ui/components/App.js.map +1 -1
  68. package/dist/ui/components/Breadcrumbs.d.ts +4 -3
  69. package/dist/ui/components/Breadcrumbs.d.ts.map +1 -1
  70. package/dist/ui/components/Breadcrumbs.js +60 -54
  71. package/dist/ui/components/Breadcrumbs.js.map +1 -1
  72. package/dist/ui/components/ConnectionStatusMessage.js +2 -2
  73. package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
  74. package/dist/ui/components/InputBox.d.ts +1 -0
  75. package/dist/ui/components/InputBox.d.ts.map +1 -1
  76. package/dist/ui/components/InputBox.js +168 -2
  77. package/dist/ui/components/InputBox.js.map +1 -1
  78. package/dist/ui/components/InteractiveShell.d.ts +2 -0
  79. package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
  80. package/dist/ui/components/InteractiveShell.js +13 -3
  81. package/dist/ui/components/InteractiveShell.js.map +1 -1
  82. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  83. package/dist/ui/components/ToolExecutionMessage.js +164 -25
  84. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  85. package/dist/ui/components/WorkflowCreatorScreen.d.ts +25 -0
  86. package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +1 -0
  87. package/dist/ui/components/WorkflowCreatorScreen.js +164 -0
  88. package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -0
  89. package/dist/utils/input-classifier.d.ts.map +1 -1
  90. package/dist/utils/input-classifier.js +2 -1
  91. package/dist/utils/input-classifier.js.map +1 -1
  92. 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 SSH, WSL, and Docker environments
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
- // Don't show breadcrumbs for local context
9
- if (context.type === 'local') {
10
- return null;
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
- // Get breadcrumbs from handler if available
13
- const breadcrumbs = context.handler?.getBreadcrumbs?.() || [];
14
- // If no breadcrumbs from handler, create default ones based on context type
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
- // Render breadcrumbs from handler
55
- return (React.createElement(Box, { marginRight: 1 }, breadcrumbs.map((crumb, i) => (React.createElement(Box, { key: i, marginRight: 1 },
56
- React.createElement(Text, { color: crumb.color || 'cyan', bold: true },
57
- "[",
58
- crumb.label,
59
- crumb.value ? `: ${crumb.value}` : '',
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":"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"}
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
- " Connecting to ",
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
- " Connected to ",
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":"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"}
1
+ {"version":3,"file":"ConnectionStatusMessage.js","sourceRoot":"","sources":["../../../src/ui/components/ConnectionStatusMessage.tsx"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ interface InputBoxProps {
16
16
  onToggleBackgroundMode?: () => void;
17
17
  isActive?: boolean;
18
18
  subshellContext?: SubshellContext;
19
+ subshellContextStack?: SubshellContext[];
19
20
  currentTokens?: number;
20
21
  maxTokens?: number;
21
22
  contextLimitReached?: boolean;
@@ -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;AAK5G,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,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,CAw9D3C,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,