@vybestack/llxprt-code 0.8.0-nightly.260111.af7260fe6 → 0.8.0-nightly.260113.48db4b09b

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 (109) hide show
  1. package/dist/package.json +3 -3
  2. package/dist/src/generated/git-commit.d.ts +1 -1
  3. package/dist/src/generated/git-commit.js +1 -1
  4. package/dist/src/runtime/runtimeSettings.d.ts +1 -0
  5. package/dist/src/runtime/runtimeSettings.js +4 -0
  6. package/dist/src/runtime/runtimeSettings.js.map +1 -1
  7. package/dist/src/ui/AppContainer.js +67 -0
  8. package/dist/src/ui/AppContainer.js.map +1 -1
  9. package/dist/src/ui/commands/profileCommand.js +111 -9
  10. package/dist/src/ui/commands/profileCommand.js.map +1 -1
  11. package/dist/src/ui/commands/profileCommand.test.js +3 -6
  12. package/dist/src/ui/commands/profileCommand.test.js.map +1 -1
  13. package/dist/src/ui/commands/subagentCommand.js +58 -244
  14. package/dist/src/ui/commands/subagentCommand.js.map +1 -1
  15. package/dist/src/ui/commands/test/subagentCommand.schema.test.js +4 -3
  16. package/dist/src/ui/commands/test/subagentCommand.schema.test.js.map +1 -1
  17. package/dist/src/ui/commands/test/subagentCommand.test.js +44 -124
  18. package/dist/src/ui/commands/test/subagentCommand.test.js.map +1 -1
  19. package/dist/src/ui/commands/types.d.ts +43 -2
  20. package/dist/src/ui/commands/types.js.map +1 -1
  21. package/dist/src/ui/components/DialogManager.js +17 -0
  22. package/dist/src/ui/components/DialogManager.js.map +1 -1
  23. package/dist/src/ui/components/ProfileDetailDialog.d.ts +22 -0
  24. package/dist/src/ui/components/ProfileDetailDialog.js +113 -0
  25. package/dist/src/ui/components/ProfileDetailDialog.js.map +1 -0
  26. package/dist/src/ui/components/ProfileInlineEditor.d.ts +16 -0
  27. package/dist/src/ui/components/ProfileInlineEditor.js +216 -0
  28. package/dist/src/ui/components/ProfileInlineEditor.js.map +1 -0
  29. package/dist/src/ui/components/ProfileListDialog.d.ts +26 -0
  30. package/dist/src/ui/components/ProfileListDialog.js +172 -0
  31. package/dist/src/ui/components/ProfileListDialog.js.map +1 -0
  32. package/dist/src/ui/components/ProviderDialog.js +1 -1
  33. package/dist/src/ui/components/ProviderDialog.js.map +1 -1
  34. package/dist/src/ui/components/ProviderModelDialog.js +1 -1
  35. package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
  36. package/dist/src/ui/components/SubagentManagement/ProfileAttachmentWizard.d.ts +24 -0
  37. package/dist/src/ui/components/SubagentManagement/ProfileAttachmentWizard.js +102 -0
  38. package/dist/src/ui/components/SubagentManagement/ProfileAttachmentWizard.js.map +1 -0
  39. package/dist/src/ui/components/SubagentManagement/SubagentCreationWizard.d.ts +14 -0
  40. package/dist/src/ui/components/SubagentManagement/SubagentCreationWizard.js +179 -0
  41. package/dist/src/ui/components/SubagentManagement/SubagentCreationWizard.js.map +1 -0
  42. package/dist/src/ui/components/SubagentManagement/SubagentDeleteDialog.d.ts +15 -0
  43. package/dist/src/ui/components/SubagentManagement/SubagentDeleteDialog.js +47 -0
  44. package/dist/src/ui/components/SubagentManagement/SubagentDeleteDialog.js.map +1 -0
  45. package/dist/src/ui/components/SubagentManagement/SubagentEditForm.d.ts +18 -0
  46. package/dist/src/ui/components/SubagentManagement/SubagentEditForm.js +111 -0
  47. package/dist/src/ui/components/SubagentManagement/SubagentEditForm.js.map +1 -0
  48. package/dist/src/ui/components/SubagentManagement/SubagentListMenu.d.ts +19 -0
  49. package/dist/src/ui/components/SubagentManagement/SubagentListMenu.js +137 -0
  50. package/dist/src/ui/components/SubagentManagement/SubagentListMenu.js.map +1 -0
  51. package/dist/src/ui/components/SubagentManagement/SubagentMainMenu.d.ts +13 -0
  52. package/dist/src/ui/components/SubagentManagement/SubagentMainMenu.js +14 -0
  53. package/dist/src/ui/components/SubagentManagement/SubagentMainMenu.js.map +1 -0
  54. package/dist/src/ui/components/SubagentManagement/SubagentManagerDialog.d.ts +8 -0
  55. package/dist/src/ui/components/SubagentManagement/SubagentManagerDialog.js +293 -0
  56. package/dist/src/ui/components/SubagentManagement/SubagentManagerDialog.js.map +1 -0
  57. package/dist/src/ui/components/SubagentManagement/SubagentShowView.d.ts +15 -0
  58. package/dist/src/ui/components/SubagentManagement/SubagentShowView.js +35 -0
  59. package/dist/src/ui/components/SubagentManagement/SubagentShowView.js.map +1 -0
  60. package/dist/src/ui/components/SubagentManagement/index.d.ts +14 -0
  61. package/dist/src/ui/components/SubagentManagement/index.js +15 -0
  62. package/dist/src/ui/components/SubagentManagement/index.js.map +1 -0
  63. package/dist/src/ui/components/SubagentManagement/types.d.ts +109 -0
  64. package/dist/src/ui/components/SubagentManagement/types.js +77 -0
  65. package/dist/src/ui/components/SubagentManagement/types.js.map +1 -0
  66. package/dist/src/ui/contexts/KeypressContext.js +2 -1
  67. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  68. package/dist/src/ui/contexts/RuntimeContext.d.ts +2 -1
  69. package/dist/src/ui/contexts/RuntimeContext.js +2 -1
  70. package/dist/src/ui/contexts/RuntimeContext.js.map +1 -1
  71. package/dist/src/ui/contexts/UIActionsContext.d.ts +13 -0
  72. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  73. package/dist/src/ui/contexts/UIStateContext.d.ts +21 -0
  74. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  75. package/dist/src/ui/hooks/atCommandProcessor.js +25 -1
  76. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  77. package/dist/src/ui/hooks/atCommandProcessor.test.js +127 -91
  78. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  79. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +5 -0
  80. package/dist/src/ui/hooks/slashCommandProcessor.js +34 -0
  81. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  82. package/dist/src/ui/hooks/useEditorSettings.test.js +3 -0
  83. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -1
  84. package/dist/src/ui/hooks/useFolderTrust.js +1 -1
  85. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  86. package/dist/src/ui/hooks/useProfileManagement.d.ts +40 -0
  87. package/dist/src/ui/hooks/useProfileManagement.js +350 -0
  88. package/dist/src/ui/hooks/useProfileManagement.js.map +1 -0
  89. package/dist/src/ui/hooks/useReactToolScheduler.js +103 -33
  90. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  91. package/dist/src/ui/hooks/useSlashCompletion.test.js +1 -1
  92. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  93. package/dist/src/ui/hooks/useToolScheduler.test.js +322 -220
  94. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  95. package/dist/src/ui/layouts/DefaultAppLayout.js +5 -0
  96. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
  97. package/dist/src/ui/reducers/appReducer.d.ts +5 -2
  98. package/dist/src/ui/reducers/appReducer.js +3 -0
  99. package/dist/src/ui/reducers/appReducer.js.map +1 -1
  100. package/dist/src/ui/reducers/appReducer.test.js +6 -0
  101. package/dist/src/ui/reducers/appReducer.test.js.map +1 -1
  102. package/dist/src/utils/sandbox.d.ts +1 -0
  103. package/dist/src/utils/sandbox.js +22 -20
  104. package/dist/src/utils/sandbox.js.map +1 -1
  105. package/dist/src/utils/sandbox.test.d.ts +6 -0
  106. package/dist/src/utils/sandbox.test.js +176 -0
  107. package/dist/src/utils/sandbox.test.js.map +1 -0
  108. package/dist/tsconfig.build.tsbuildinfo +1 -1
  109. package/package.json +3 -3
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Vybestack LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { useState, useCallback } from 'react';
8
+ import { Box, Text } from 'ink';
9
+ import { Colors } from '../../colors.js';
10
+ import { useKeypress } from '../../hooks/useKeypress.js';
11
+ import { EditField } from './types.js';
12
+ export const SubagentEditForm = ({ subagent, profiles: _profiles, pendingProfile, onSave, onCancel, onSelectProfile, isFocused = true, }) => {
13
+ const [systemPrompt, setSystemPrompt] = useState(subagent.systemPrompt);
14
+ // Use pendingProfile from parent (set after profile wizard) or fall back to original
15
+ const selectedProfile = pendingProfile ?? subagent.profile;
16
+ const [focusedField, setFocusedField] = useState(EditField.SYSTEM_PROMPT);
17
+ const [isEditing, setIsEditing] = useState(false);
18
+ const [isSaving, setIsSaving] = useState(false);
19
+ const [error, setError] = useState(null);
20
+ const hasChanges = systemPrompt !== subagent.systemPrompt ||
21
+ selectedProfile !== subagent.profile;
22
+ const handleSave = useCallback(async () => {
23
+ if (!hasChanges) {
24
+ onCancel();
25
+ return;
26
+ }
27
+ setIsSaving(true);
28
+ setError(null);
29
+ try {
30
+ await onSave(systemPrompt, selectedProfile);
31
+ }
32
+ catch (err) {
33
+ setError(err instanceof Error ? err.message : 'Failed to save');
34
+ setIsSaving(false);
35
+ }
36
+ }, [hasChanges, systemPrompt, selectedProfile, onSave, onCancel]);
37
+ const handleInput = useCallback((char) => {
38
+ if (char === '\n') {
39
+ setSystemPrompt((prev) => prev + '\n');
40
+ }
41
+ else {
42
+ setSystemPrompt((prev) => prev + char);
43
+ }
44
+ }, []);
45
+ const handleBackspace = useCallback(() => {
46
+ setSystemPrompt((prev) => prev.slice(0, -1));
47
+ }, []);
48
+ useKeypress((key) => {
49
+ const input = key.sequence;
50
+ if (isSaving)
51
+ return;
52
+ // Editing mode - capture text
53
+ if (isEditing && focusedField === EditField.SYSTEM_PROMPT) {
54
+ if (key.name === 'escape') {
55
+ setIsEditing(false);
56
+ return;
57
+ }
58
+ if (key.name === 'backspace' || key.name === 'delete') {
59
+ handleBackspace();
60
+ return;
61
+ }
62
+ if (key.name === 'return') {
63
+ handleInput('\n');
64
+ return;
65
+ }
66
+ if (input && !key.ctrl && !key.meta) {
67
+ handleInput(input);
68
+ }
69
+ return;
70
+ }
71
+ // Navigation mode
72
+ if (key.name === 'escape') {
73
+ onCancel();
74
+ return;
75
+ }
76
+ if (key.name === 'up' || key.name === 'down') {
77
+ setFocusedField((prev) => prev === EditField.SYSTEM_PROMPT
78
+ ? EditField.PROFILE
79
+ : EditField.SYSTEM_PROMPT);
80
+ return;
81
+ }
82
+ if (key.name === 'return') {
83
+ if (focusedField === EditField.SYSTEM_PROMPT) {
84
+ setIsEditing(true);
85
+ }
86
+ else if (focusedField === EditField.PROFILE) {
87
+ onSelectProfile();
88
+ }
89
+ return;
90
+ }
91
+ // Quick save with 's'
92
+ if (input === 's') {
93
+ handleSave();
94
+ return;
95
+ }
96
+ // Cancel with 'c'
97
+ if (input === 'c') {
98
+ onCancel();
99
+ return;
100
+ }
101
+ }, { isActive: isFocused && !isSaving });
102
+ // Display prompt preview
103
+ const promptLines = systemPrompt.split('\n');
104
+ const maxLines = 5;
105
+ const displayLines = promptLines.slice(0, maxLines);
106
+ const truncated = `[${systemPrompt.slice(0, 45)}...]`;
107
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: Colors.Foreground, children: "Edit Configuration" }) }), _jsx(Text, { color: Colors.Gray, children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }), error && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "#ff0000", children: error }) })), _jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Box, { children: _jsxs(Text, { color: focusedField === EditField.SYSTEM_PROMPT
108
+ ? '#00ff00'
109
+ : Colors.Foreground, children: [focusedField === EditField.SYSTEM_PROMPT ? '→ ' : ' ', "1 System Prompt"] }) }), _jsxs(Box, { marginLeft: 4, children: [_jsx(Text, { color: Colors.Gray, children: "Current: " }), _jsx(Text, { color: Colors.Foreground, children: truncated })] }), isEditing && focusedField === EditField.SYSTEM_PROMPT && (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "#00ff00", marginLeft: 4, paddingX: 1, children: [displayLines.map((line, idx) => (_jsx(Text, { color: Colors.Foreground, children: line || ' ' }, idx))), promptLines.length > maxLines && (_jsxs(Text, { color: Colors.Gray, children: ["... (", promptLines.length - maxLines, " more lines)"] })), _jsx(Text, { color: "#00ff00", children: "|" }), _jsx(Text, { color: Colors.Gray, children: "[ESC] Done Editing" })] })), !isEditing && focusedField === EditField.SYSTEM_PROMPT && (_jsx(Box, { marginLeft: 4, children: _jsx(Text, { color: Colors.Gray, children: "[Enter] Edit Full Prompt" }) }))] }), _jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Box, { children: _jsxs(Text, { color: focusedField === EditField.PROFILE ? '#00ff00' : Colors.Foreground, children: [focusedField === EditField.PROFILE ? '→ ' : ' ', "2 Profile Assignment"] }) }), _jsxs(Box, { marginLeft: 4, children: [_jsx(Text, { color: Colors.Gray, children: "Current: " }), _jsx(Text, { color: Colors.Foreground, children: selectedProfile }), selectedProfile !== subagent.profile && (_jsx(Text, { color: "#ffff00", children: " (changed)" }))] }), focusedField === EditField.PROFILE && (_jsx(Box, { marginLeft: 4, children: _jsx(Text, { color: Colors.Gray, children: "[Enter] Change Profile" }) }))] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: Colors.Gray, children: "Controls: \u2191\u2193 Navigate Fields [Enter] Toggle Edit" }), _jsx(Text, { color: Colors.Gray, children: " [s] Save [c] Cancel [ESC] Back to list" }), hasChanges && _jsx(Text, { color: "#ffff00", children: "* Unsaved changes" })] }), isSaving && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.Gray, children: "Saving..." }) }))] }));
110
+ };
111
+ //# sourceMappingURL=SubagentEditForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubagentEditForm.js","sourceRoot":"","sources":["../../../../../src/ui/components/SubagentManagement/SubagentEditForm.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAY1D,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAChE,QAAQ,EACR,QAAQ,EAAE,SAAS,EACnB,cAAc,EACd,MAAM,EACN,QAAQ,EACR,eAAe,EACf,SAAS,GAAG,IAAI,GACjB,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxE,qFAAqF;IACrF,MAAM,eAAe,GAAG,cAAc,IAAI,QAAQ,CAAC,OAAO,CAAC;IAC3D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,SAAS,CAAC,aAAa,CACxB,CAAC;IACF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,UAAU,GACd,YAAY,KAAK,QAAQ,CAAC,YAAY;QACtC,eAAe,KAAK,QAAQ,CAAC,OAAO,CAAC;IAEvC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAChE,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,EAAE;QAC/C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,WAAW,CACT,CAAC,GAAG,EAAE,EAAE;QACN,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC3B,IAAI,QAAQ;YAAE,OAAO;QAErB,8BAA8B;QAC9B,IAAI,SAAS,IAAI,YAAY,KAAK,SAAS,CAAC,aAAa,EAAE,CAAC;YAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtD,eAAe,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7C,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,IAAI,KAAK,SAAS,CAAC,aAAa;gBAC9B,CAAC,CAAC,SAAS,CAAC,OAAO;gBACnB,CAAC,CAAC,SAAS,CAAC,aAAa,CAC5B,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,YAAY,KAAK,SAAS,CAAC,aAAa,EAAE,CAAC;gBAC7C,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,YAAY,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC9C,eAAe,EAAE,CAAC;YACpB,CAAC;YACD,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,UAAU,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,SAAS,IAAI,CAAC,QAAQ,EAAE,CACrC,CAAC;IAEF,yBAAyB;IACzB,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC;IACnB,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;IAEtD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,MAAM,CAAC,UAAU,mCAE5B,GACH,EACN,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,qVAEjB,EAEN,KAAK,IAAI,CACR,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,YAAE,KAAK,GAAQ,GAChC,CACP,EAGD,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,GAAG,cACF,MAAC,IAAI,IACH,KAAK,EACH,YAAY,KAAK,SAAS,CAAC,aAAa;gCACtC,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,MAAM,CAAC,UAAU,aAGtB,YAAY,KAAK,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,uBAElD,GACH,EACN,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,aAChB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,0BAAkB,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,UAAU,YAAG,SAAS,GAAQ,IAC9C,EACL,SAAS,IAAI,YAAY,KAAK,SAAS,CAAC,aAAa,IAAI,CACxD,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,SAAS,EACrB,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,CAAC,aAEV,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAC/B,KAAC,IAAI,IAAW,KAAK,EAAE,MAAM,CAAC,UAAU,YACrC,IAAI,IAAI,GAAG,IADH,GAAG,CAEP,CACR,CAAC,EACD,WAAW,CAAC,MAAM,GAAG,QAAQ,IAAI,CAChC,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,sBAChB,WAAW,CAAC,MAAM,GAAG,QAAQ,oBAC9B,CACR,EACD,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,kBAAS,EAC9B,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,mCAA2B,IAC/C,CACP,EACA,CAAC,SAAS,IAAI,YAAY,KAAK,SAAS,CAAC,aAAa,IAAI,CACzD,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,yCAAiC,GACrD,CACP,IACG,EAGN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,GAAG,cACF,MAAC,IAAI,IACH,KAAK,EACH,YAAY,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,aAGnE,YAAY,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,4BAE5C,GACH,EACN,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,aAChB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,0BAAkB,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,UAAU,YAAG,eAAe,GAAQ,EACvD,eAAe,KAAK,QAAQ,CAAC,OAAO,IAAI,CACvC,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,2BAAkB,CACxC,IACG,EACL,YAAY,KAAK,SAAS,CAAC,OAAO,IAAI,CACrC,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,uCAA+B,GACnD,CACP,IACG,EAGN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,2EAEjB,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,wDAAgD,EACvE,UAAU,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,kCAAyB,IACzD,EAEL,QAAQ,IAAI,CACX,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,0BAAkB,GACtC,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import React from 'react';
7
+ import { type SubagentInfo } from './types.js';
8
+ interface SubagentListMenuProps {
9
+ subagents: SubagentInfo[];
10
+ onSelect: (subagent: SubagentInfo) => void;
11
+ onEdit: (subagent: SubagentInfo) => void;
12
+ onAttachProfile: (subagent: SubagentInfo) => void;
13
+ onDelete: (subagent: SubagentInfo) => void;
14
+ onBack: () => void;
15
+ isLoading?: boolean;
16
+ isFocused?: boolean;
17
+ }
18
+ export declare const SubagentListMenu: React.FC<SubagentListMenuProps>;
19
+ export {};
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Vybestack LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { useState, useMemo, useCallback } from 'react';
8
+ import { Box, Text } from 'ink';
9
+ import { Colors } from '../../colors.js';
10
+ import { useKeypress } from '../../hooks/useKeypress.js';
11
+ import { ListFocusMode } from './types.js';
12
+ export const SubagentListMenu = ({ subagents, onSelect, onEdit, onAttachProfile, onDelete, onBack, isLoading = false, isFocused = true, }) => {
13
+ const [searchTerm, setSearchTerm] = useState('');
14
+ const [focusMode, setFocusMode] = useState(ListFocusMode.LIST);
15
+ const [selectedIndex, setSelectedIndex] = useState(0);
16
+ // Filter subagents based on search term
17
+ const filteredSubagents = useMemo(() => {
18
+ if (!searchTerm.trim())
19
+ return subagents;
20
+ const term = searchTerm.toLowerCase();
21
+ return subagents.filter((s) => s.name.toLowerCase().includes(term) ||
22
+ s.profile.toLowerCase().includes(term));
23
+ }, [subagents, searchTerm]);
24
+ // Ensure selected index is valid after filtering
25
+ const safeIndex = useMemo(() => {
26
+ if (filteredSubagents.length === 0)
27
+ return 0;
28
+ return Math.min(selectedIndex, filteredSubagents.length - 1);
29
+ }, [selectedIndex, filteredSubagents.length]);
30
+ const moveSelection = useCallback((delta) => {
31
+ if (filteredSubagents.length === 0)
32
+ return;
33
+ let newIndex = safeIndex + delta;
34
+ if (newIndex < 0)
35
+ newIndex = 0;
36
+ if (newIndex >= filteredSubagents.length)
37
+ newIndex = filteredSubagents.length - 1;
38
+ setSelectedIndex(newIndex);
39
+ }, [safeIndex, filteredSubagents.length]);
40
+ const handleSearchInput = useCallback((char) => {
41
+ setSearchTerm((prev) => prev + char);
42
+ }, []);
43
+ const handleBackspace = useCallback(() => {
44
+ setSearchTerm((prev) => prev.slice(0, -1));
45
+ }, []);
46
+ useKeypress((key) => {
47
+ const input = key.sequence;
48
+ // ESC handling
49
+ if (key.name === 'escape') {
50
+ if (focusMode === ListFocusMode.SEARCH && searchTerm) {
51
+ // Clear search
52
+ setSearchTerm('');
53
+ setFocusMode(ListFocusMode.LIST);
54
+ }
55
+ else if (focusMode === ListFocusMode.SEARCH) {
56
+ // Exit search mode
57
+ setFocusMode(ListFocusMode.LIST);
58
+ }
59
+ else {
60
+ // Back to menu
61
+ onBack();
62
+ }
63
+ return;
64
+ }
65
+ // Tab to activate search
66
+ if (key.name === 'tab' && focusMode === ListFocusMode.LIST) {
67
+ setFocusMode(ListFocusMode.SEARCH);
68
+ return;
69
+ }
70
+ // Tab to switch focus
71
+ if (key.name === 'tab' && focusMode === ListFocusMode.SEARCH) {
72
+ setFocusMode(ListFocusMode.LIST);
73
+ return;
74
+ }
75
+ // Search mode input handling
76
+ if (focusMode === ListFocusMode.SEARCH) {
77
+ if (key.name === 'backspace' || key.name === 'delete') {
78
+ handleBackspace();
79
+ return;
80
+ }
81
+ if (key.name === 'return') {
82
+ setFocusMode(ListFocusMode.LIST);
83
+ return;
84
+ }
85
+ // Type character
86
+ if (input && input.length === 1 && !key.ctrl && !key.meta) {
87
+ handleSearchInput(input);
88
+ }
89
+ return;
90
+ }
91
+ // List navigation mode
92
+ if (focusMode === ListFocusMode.LIST) {
93
+ if (key.name === 'up') {
94
+ moveSelection(-1);
95
+ return;
96
+ }
97
+ if (key.name === 'down') {
98
+ moveSelection(1);
99
+ return;
100
+ }
101
+ if (key.name === 'return' && filteredSubagents.length > 0) {
102
+ onSelect(filteredSubagents[safeIndex]);
103
+ return;
104
+ }
105
+ // Quick actions
106
+ if (input === 'e' && filteredSubagents.length > 0) {
107
+ onEdit(filteredSubagents[safeIndex]);
108
+ return;
109
+ }
110
+ if (input === 'a' && filteredSubagents.length > 0) {
111
+ onAttachProfile(filteredSubagents[safeIndex]);
112
+ return;
113
+ }
114
+ if (input === 'd' && filteredSubagents.length > 0) {
115
+ onDelete(filteredSubagents[safeIndex]);
116
+ return;
117
+ }
118
+ }
119
+ }, { isActive: isFocused && !isLoading });
120
+ if (isLoading) {
121
+ return (_jsx(Box, { flexDirection: "column", children: _jsx(Text, { color: Colors.Gray, children: "Loading subagents..." }) }));
122
+ }
123
+ if (subagents.length === 0) {
124
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: Colors.Foreground, children: "No subagents found. Use 'Create Subagent' to create one." }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.Gray, children: "[ESC] Back to menu" }) })] }));
125
+ }
126
+ // Calculate visible items (viewport)
127
+ const maxVisible = 10;
128
+ const startIndex = Math.max(0, safeIndex - Math.floor(maxVisible / 2));
129
+ const endIndex = Math.min(filteredSubagents.length, startIndex + maxVisible);
130
+ const visibleSubagents = filteredSubagents.slice(startIndex, endIndex);
131
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: Colors.Gray, children: "Search: " }), focusMode === ListFocusMode.SEARCH ? (_jsxs(Text, { color: Colors.Foreground, children: [searchTerm, _jsx(Text, { color: "#00ff00", children: "|" })] })) : (_jsx(Text, { color: Colors.Gray, children: searchTerm || '(press Tab to search)' })), _jsxs(Text, { color: Colors.Gray, children: [' ', "Found ", filteredSubagents.length, searchTerm ? ` of ${subagents.length}` : '', " subagents"] })] }), _jsx(Box, { flexDirection: "column", marginBottom: 1, children: filteredSubagents.length === 0 ? (_jsx(Text, { color: Colors.Gray, children: "No matching subagents" })) : (visibleSubagents.map((subagent, idx) => {
132
+ const actualIndex = startIndex + idx;
133
+ const isSelected = actualIndex === safeIndex && focusMode === ListFocusMode.LIST;
134
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: isSelected ? '#00ff00' : Colors.Foreground, children: [isSelected ? '→ ' : ' ', subagent.name.padEnd(25)] }), _jsx(Text, { color: Colors.Gray, children: subagent.profile })] }, subagent.name));
135
+ })) }), _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: Colors.Gray, children: "Controls: \u2191\u2193 Navigate [Enter] Details [e] Edit" }), _jsx(Text, { color: Colors.Gray, children: " [a] Attach [d] Delete [ESC] Main menu" })] })] }));
136
+ };
137
+ //# sourceMappingURL=SubagentListMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubagentListMenu.js","sourceRoot":"","sources":["../../../../../src/ui/components/SubagentManagement/SubagentListMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import React from 'react';
7
+ import { SubagentView } from './types.js';
8
+ interface SubagentMainMenuProps {
9
+ onSelect: (view: SubagentView) => void;
10
+ isFocused?: boolean;
11
+ }
12
+ export declare const SubagentMainMenu: React.FC<SubagentMainMenuProps>;
13
+ export {};
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { Colors } from '../../colors.js';
4
+ import { RadioButtonSelect } from '../shared/RadioButtonSelect.js';
5
+ import { MENU_ACTIONS } from './types.js';
6
+ export const SubagentMainMenu = ({ onSelect, isFocused = true, }) => {
7
+ const menuItems = MENU_ACTIONS.map((action) => ({
8
+ label: `${action.label.padEnd(20)} - ${action.description}`,
9
+ value: action.value,
10
+ key: action.value,
11
+ }));
12
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: Colors.Foreground, children: "Select an action:" }) }), _jsx(RadioButtonSelect, { items: menuItems, onSelect: onSelect, isFocused: isFocused, showNumbers: true, maxItemsToShow: 10 }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.Gray, children: "Press [ESC] to cancel" }) })] }));
13
+ };
14
+ //# sourceMappingURL=SubagentMainMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubagentMainMenu.js","sourceRoot":"","sources":["../../../../../src/ui/components/SubagentManagement/SubagentMainMenu.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAgB,YAAY,EAAE,MAAM,YAAY,CAAC;AAOxD,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAChE,QAAQ,EACR,SAAS,GAAG,IAAI,GACjB,EAAE,EAAE;IACH,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE;QAC3D,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,EAAE,MAAM,CAAC,KAAK;KAClB,CAAC,CAAC,CAAC;IAEJ,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,MAAM,CAAC,UAAU,kCAE5B,GACH,EAEN,KAAC,iBAAiB,IAChB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,IAAI,EACjB,cAAc,EAAE,EAAE,GAClB,EAEF,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,sCAA8B,GAClD,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import React from 'react';
7
+ import { type SubagentManagerDialogProps } from './types.js';
8
+ export declare const SubagentManagerDialog: React.FC<SubagentManagerDialogProps>;
@@ -0,0 +1,293 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Vybestack LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { useState, useCallback, useEffect } from 'react';
8
+ import { Box, Text } from 'ink';
9
+ import { Colors } from '../../colors.js';
10
+ import { useUIState } from '../../contexts/UIStateContext.js';
11
+ import { SubagentView, } from './types.js';
12
+ import { SubagentListMenu } from './SubagentListMenu.js';
13
+ import { SubagentShowView } from './SubagentShowView.js';
14
+ import { SubagentEditForm } from './SubagentEditForm.js';
15
+ import { SubagentCreationWizard } from './SubagentCreationWizard.js';
16
+ import { ProfileAttachmentWizard } from './ProfileAttachmentWizard.js';
17
+ import { SubagentDeleteDialog } from './SubagentDeleteDialog.js';
18
+ import { SubagentMainMenu } from './SubagentMainMenu.js';
19
+ export const SubagentManagerDialog = ({ onClose, initialView = SubagentView.MENU, initialSubagentName, }) => {
20
+ const uiState = useUIState();
21
+ const { commandContext } = uiState;
22
+ const subagentManager = commandContext?.services?.subagentManager;
23
+ const profileManager = commandContext?.services?.profileManager;
24
+ const [state, setState] = useState({
25
+ currentView: initialView,
26
+ selectedSubagent: null,
27
+ navigationStack: [initialView], // Start with initial view, not menu
28
+ searchTerm: '',
29
+ searchActive: false,
30
+ selectedIndex: 0,
31
+ subagents: [],
32
+ profiles: [],
33
+ isLoading: true,
34
+ error: null,
35
+ });
36
+ // Track pending profile change when selecting from edit form (not yet saved)
37
+ const [pendingProfile, setPendingProfile] = useState(undefined);
38
+ // Load subagents and profiles
39
+ const loadData = useCallback(async () => {
40
+ if (!subagentManager) {
41
+ setState((prev) => ({
42
+ ...prev,
43
+ isLoading: false,
44
+ error: 'SubagentManager not available',
45
+ }));
46
+ return;
47
+ }
48
+ setState((prev) => ({ ...prev, isLoading: true, error: null }));
49
+ try {
50
+ const [subagentNames, profileNames] = await Promise.all([
51
+ subagentManager.listSubagents(),
52
+ profileManager?.listProfiles() ?? Promise.resolve([]),
53
+ ]);
54
+ // Load full subagent configs
55
+ const subagents = await Promise.all(subagentNames.map(async (name) => {
56
+ const config = await subagentManager.loadSubagent(name);
57
+ return config;
58
+ }));
59
+ setState((prev) => ({
60
+ ...prev,
61
+ subagents,
62
+ profiles: profileNames,
63
+ isLoading: false,
64
+ }));
65
+ // If initial subagent specified, select it
66
+ if (initialSubagentName) {
67
+ const found = subagents.find((s) => s.name === initialSubagentName);
68
+ if (found) {
69
+ setState((prev) => ({
70
+ ...prev,
71
+ selectedSubagent: found,
72
+ currentView: initialView,
73
+ }));
74
+ }
75
+ }
76
+ }
77
+ catch (err) {
78
+ setState((prev) => ({
79
+ ...prev,
80
+ isLoading: false,
81
+ error: err instanceof Error ? err.message : 'Failed to load data',
82
+ }));
83
+ }
84
+ }, [subagentManager, profileManager, initialSubagentName, initialView]);
85
+ useEffect(() => {
86
+ loadData();
87
+ }, [loadData]);
88
+ // Navigation helpers
89
+ const navigateTo = useCallback((view, subagent) => {
90
+ setState((prev) => ({
91
+ ...prev,
92
+ currentView: view,
93
+ navigationStack: [...prev.navigationStack, view],
94
+ selectedSubagent: subagent ?? prev.selectedSubagent,
95
+ }));
96
+ }, []);
97
+ const goBack = useCallback(() => {
98
+ setState((prev) => {
99
+ const newStack = prev.navigationStack.slice(0, -1);
100
+ // If stack is empty or only has initial view, close dialog
101
+ if (newStack.length === 0) {
102
+ // Use setTimeout to avoid state update during render
103
+ setTimeout(() => onClose(), 0);
104
+ return prev;
105
+ }
106
+ const prevView = newStack[newStack.length - 1];
107
+ return {
108
+ ...prev,
109
+ currentView: prevView,
110
+ navigationStack: newStack,
111
+ selectedSubagent: prevView === SubagentView.LIST ? null : prev.selectedSubagent,
112
+ };
113
+ });
114
+ }, [onClose]);
115
+ // Handle subagent selection from list
116
+ const handleSubagentSelect = useCallback((subagent) => {
117
+ navigateTo(SubagentView.SHOW, subagent);
118
+ }, [navigateTo]);
119
+ // Handle edit from list or show view
120
+ const handleEdit = useCallback((subagent) => {
121
+ const target = subagent ?? state.selectedSubagent;
122
+ if (target) {
123
+ navigateTo(SubagentView.EDIT, target);
124
+ }
125
+ }, [navigateTo, state.selectedSubagent]);
126
+ // Handle attach profile from list
127
+ const handleAttachProfile = useCallback((subagent) => {
128
+ navigateTo(SubagentView.ATTACH_PROFILE, subagent);
129
+ }, [navigateTo]);
130
+ // Handle select profile from edit form (uses current selected subagent)
131
+ const handleSelectProfileFromEdit = useCallback(() => {
132
+ if (state.selectedSubagent) {
133
+ navigateTo(SubagentView.ATTACH_PROFILE, state.selectedSubagent);
134
+ }
135
+ }, [navigateTo, state.selectedSubagent]);
136
+ // Handle delete from list
137
+ const handleDeleteRequest = useCallback((subagent) => {
138
+ navigateTo(SubagentView.DELETE, subagent);
139
+ }, [navigateTo]);
140
+ // Handle cancel from edit form - clears pending profile
141
+ const handleEditCancel = useCallback(() => {
142
+ setPendingProfile(undefined);
143
+ goBack();
144
+ }, [goBack]);
145
+ // Handle save (edit)
146
+ const handleSave = useCallback(async (systemPrompt, profile) => {
147
+ if (!subagentManager || !state.selectedSubagent)
148
+ return;
149
+ try {
150
+ await subagentManager.saveSubagent(state.selectedSubagent.name, profile, systemPrompt);
151
+ // Clear pending profile after successful save
152
+ setPendingProfile(undefined);
153
+ await loadData();
154
+ goBack();
155
+ }
156
+ catch (err) {
157
+ setState((prev) => ({
158
+ ...prev,
159
+ error: err instanceof Error ? err.message : 'Failed to save subagent',
160
+ }));
161
+ }
162
+ }, [subagentManager, state.selectedSubagent, loadData, goBack]);
163
+ // Handle create
164
+ const handleCreate = useCallback(async (name, systemPrompt, profile) => {
165
+ if (!subagentManager)
166
+ return;
167
+ try {
168
+ await subagentManager.saveSubagent(name, profile, systemPrompt);
169
+ await loadData();
170
+ navigateTo(SubagentView.LIST);
171
+ }
172
+ catch (err) {
173
+ setState((prev) => ({
174
+ ...prev,
175
+ error: err instanceof Error ? err.message : 'Failed to create subagent',
176
+ }));
177
+ }
178
+ }, [subagentManager, loadData, navigateTo]);
179
+ // Handle profile attachment - check if we came from EDIT view
180
+ const handleProfileAttach = useCallback(async (profileName) => {
181
+ if (!state.selectedSubagent)
182
+ return;
183
+ // Check if previous view was EDIT - if so, just set pending profile and go back
184
+ const prevView = state.navigationStack.length >= 2
185
+ ? state.navigationStack[state.navigationStack.length - 2]
186
+ : null;
187
+ if (prevView === SubagentView.EDIT) {
188
+ // Don't save yet - just set pending profile and return to edit form
189
+ setPendingProfile(profileName);
190
+ goBack();
191
+ return;
192
+ }
193
+ // Direct profile attachment from list - save immediately
194
+ if (!subagentManager)
195
+ return;
196
+ try {
197
+ await subagentManager.saveSubagent(state.selectedSubagent.name, profileName, state.selectedSubagent.systemPrompt);
198
+ await loadData();
199
+ goBack();
200
+ }
201
+ catch (err) {
202
+ setState((prev) => ({
203
+ ...prev,
204
+ error: err instanceof Error ? err.message : 'Failed to attach profile',
205
+ }));
206
+ }
207
+ }, [
208
+ subagentManager,
209
+ state.selectedSubagent,
210
+ state.navigationStack,
211
+ loadData,
212
+ goBack,
213
+ ]);
214
+ // Handle delete confirmation
215
+ const handleDeleteConfirm = useCallback(async () => {
216
+ if (!subagentManager || !state.selectedSubagent)
217
+ return;
218
+ try {
219
+ await subagentManager.deleteSubagent(state.selectedSubagent.name);
220
+ await loadData();
221
+ // After delete, close the dialog
222
+ onClose();
223
+ }
224
+ catch (err) {
225
+ setState((prev) => ({
226
+ ...prev,
227
+ error: err instanceof Error ? err.message : 'Failed to delete subagent',
228
+ }));
229
+ }
230
+ }, [subagentManager, state.selectedSubagent, loadData, onClose]);
231
+ // Render current view
232
+ const renderView = () => {
233
+ if (state.isLoading) {
234
+ return _jsx(Text, { color: Colors.Gray, children: "Loading..." });
235
+ }
236
+ if (state.error) {
237
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: "#ff0000", children: ["Error: ", state.error] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.Gray, children: "[ESC] Close" }) })] }));
238
+ }
239
+ switch (state.currentView) {
240
+ case SubagentView.LIST:
241
+ return (_jsx(SubagentListMenu, { subagents: state.subagents, onSelect: handleSubagentSelect, onEdit: handleEdit, onAttachProfile: handleAttachProfile, onDelete: handleDeleteRequest, onBack: goBack, isLoading: state.isLoading, isFocused: true }));
242
+ case SubagentView.SHOW:
243
+ if (!state.selectedSubagent) {
244
+ return _jsx(Text, { color: Colors.Gray, children: "No subagent selected" });
245
+ }
246
+ return (_jsx(SubagentShowView, { subagent: state.selectedSubagent, onEdit: handleEdit, onBack: goBack, isFocused: true }));
247
+ case SubagentView.EDIT:
248
+ if (!state.selectedSubagent) {
249
+ return _jsx(Text, { color: Colors.Gray, children: "No subagent selected" });
250
+ }
251
+ return (_jsx(SubagentEditForm, { subagent: state.selectedSubagent, profiles: state.profiles, pendingProfile: pendingProfile, onSave: handleSave, onCancel: handleEditCancel, onSelectProfile: handleSelectProfileFromEdit, isFocused: true }));
252
+ case SubagentView.CREATE:
253
+ return (_jsx(SubagentCreationWizard, { profiles: state.profiles, onSave: handleCreate, onCancel: goBack, isFocused: true }));
254
+ case SubagentView.ATTACH_PROFILE:
255
+ if (!state.selectedSubagent) {
256
+ return _jsx(Text, { color: Colors.Gray, children: "No subagent selected" });
257
+ }
258
+ return (_jsx(ProfileAttachmentWizard, { subagent: state.selectedSubagent, profiles: state.profiles, onConfirm: handleProfileAttach, onCancel: goBack, isFocused: true }));
259
+ case SubagentView.DELETE:
260
+ if (!state.selectedSubagent) {
261
+ return _jsx(Text, { color: Colors.Gray, children: "No subagent selected" });
262
+ }
263
+ return (_jsx(SubagentDeleteDialog, { subagent: state.selectedSubagent, onConfirm: handleDeleteConfirm, onCancel: goBack, isFocused: true }));
264
+ case SubagentView.MENU:
265
+ return _jsx(SubagentMainMenu, { onSelect: navigateTo, isFocused: true });
266
+ default:
267
+ return _jsx(Text, { color: Colors.Gray, children: "Unknown view" });
268
+ }
269
+ };
270
+ // Get title based on current view
271
+ const getTitle = () => {
272
+ switch (state.currentView) {
273
+ case SubagentView.LIST:
274
+ return 'Subagent List';
275
+ case SubagentView.SHOW:
276
+ return `Subagent: ${state.selectedSubagent?.name ?? ''}`;
277
+ case SubagentView.EDIT:
278
+ return `Edit: ${state.selectedSubagent?.name ?? ''}`;
279
+ case SubagentView.CREATE:
280
+ return 'Create Subagent';
281
+ case SubagentView.ATTACH_PROFILE:
282
+ return `Attach Profile: ${state.selectedSubagent?.name ?? ''}`;
283
+ case SubagentView.DELETE:
284
+ return 'Delete Subagent';
285
+ case SubagentView.MENU:
286
+ return 'Subagent Manager';
287
+ default:
288
+ return 'Subagent';
289
+ }
290
+ };
291
+ return (_jsxs(Box, { borderStyle: "round", borderColor: Colors.Gray, flexDirection: "column", padding: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: Colors.Foreground, children: getTitle() }) }), renderView()] }));
292
+ };
293
+ //# sourceMappingURL=SubagentManagerDialog.js.map