wave-code 0.14.0 → 0.14.2

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 (71) hide show
  1. package/dist/components/BackgroundTaskManager.d.ts.map +1 -1
  2. package/dist/components/BackgroundTaskManager.js +36 -25
  3. package/dist/components/ChatInterface.js +2 -2
  4. package/dist/components/CompactDisplay.d.ts +9 -0
  5. package/dist/components/CompactDisplay.d.ts.map +1 -0
  6. package/dist/components/{CompressDisplay.js → CompactDisplay.js} +2 -2
  7. package/dist/components/InputBox.d.ts.map +1 -1
  8. package/dist/components/InputBox.js +2 -2
  9. package/dist/components/LoadingIndicator.d.ts +2 -2
  10. package/dist/components/LoadingIndicator.d.ts.map +1 -1
  11. package/dist/components/LoadingIndicator.js +2 -2
  12. package/dist/components/MarketplaceAddForm.d.ts.map +1 -1
  13. package/dist/components/MarketplaceAddForm.js +48 -17
  14. package/dist/components/MarketplaceDetail.d.ts.map +1 -1
  15. package/dist/components/MarketplaceDetail.js +2 -1
  16. package/dist/components/MarketplaceList.d.ts.map +1 -1
  17. package/dist/components/MarketplaceList.js +2 -1
  18. package/dist/components/McpManager.d.ts.map +1 -1
  19. package/dist/components/McpManager.js +22 -27
  20. package/dist/components/MessageBlockItem.js +2 -2
  21. package/dist/components/PluginDetail.d.ts.map +1 -1
  22. package/dist/components/PluginDetail.js +22 -22
  23. package/dist/components/PluginManagerShell.d.ts +1 -0
  24. package/dist/components/PluginManagerShell.d.ts.map +1 -1
  25. package/dist/components/PluginManagerShell.js +2 -2
  26. package/dist/components/PluginManagerTypes.d.ts +2 -2
  27. package/dist/components/PluginManagerTypes.d.ts.map +1 -1
  28. package/dist/contexts/useChat.d.ts +2 -1
  29. package/dist/contexts/useChat.d.ts.map +1 -1
  30. package/dist/contexts/useChat.js +127 -100
  31. package/dist/hooks/usePluginManager.d.ts +3 -1
  32. package/dist/hooks/usePluginManager.d.ts.map +1 -1
  33. package/dist/hooks/usePluginManager.js +16 -7
  34. package/dist/reducers/backgroundTaskManagerReducer.d.ts +43 -0
  35. package/dist/reducers/backgroundTaskManagerReducer.d.ts.map +1 -0
  36. package/dist/reducers/backgroundTaskManagerReducer.js +23 -0
  37. package/dist/reducers/marketplaceAddFormReducer.d.ts +24 -0
  38. package/dist/reducers/marketplaceAddFormReducer.d.ts.map +1 -0
  39. package/dist/reducers/marketplaceAddFormReducer.js +18 -0
  40. package/dist/reducers/mcpManagerReducer.d.ts +16 -0
  41. package/dist/reducers/mcpManagerReducer.d.ts.map +1 -0
  42. package/dist/reducers/mcpManagerReducer.js +15 -0
  43. package/dist/reducers/pluginDetailReducer.d.ts +25 -0
  44. package/dist/reducers/pluginDetailReducer.d.ts.map +1 -0
  45. package/dist/reducers/pluginDetailReducer.js +38 -0
  46. package/dist/utils/usageSummary.d.ts +1 -1
  47. package/dist/utils/usageSummary.d.ts.map +1 -1
  48. package/dist/utils/usageSummary.js +7 -7
  49. package/package.json +2 -2
  50. package/src/components/BackgroundTaskManager.tsx +32 -34
  51. package/src/components/ChatInterface.tsx +3 -3
  52. package/src/components/{CompressDisplay.tsx → CompactDisplay.tsx} +5 -5
  53. package/src/components/InputBox.tsx +7 -1
  54. package/src/components/LoadingIndicator.tsx +5 -5
  55. package/src/components/MarketplaceAddForm.tsx +76 -22
  56. package/src/components/MarketplaceDetail.tsx +4 -0
  57. package/src/components/MarketplaceList.tsx +4 -0
  58. package/src/components/McpManager.tsx +30 -34
  59. package/src/components/MessageBlockItem.tsx +3 -3
  60. package/src/components/PluginDetail.tsx +25 -33
  61. package/src/components/PluginManagerShell.tsx +3 -2
  62. package/src/components/PluginManagerTypes.ts +8 -2
  63. package/src/contexts/useChat.tsx +60 -26
  64. package/src/hooks/usePluginManager.ts +18 -7
  65. package/src/reducers/backgroundTaskManagerReducer.ts +60 -0
  66. package/src/reducers/marketplaceAddFormReducer.ts +35 -0
  67. package/src/reducers/mcpManagerReducer.ts +31 -0
  68. package/src/reducers/pluginDetailReducer.ts +58 -0
  69. package/src/utils/usageSummary.ts +8 -8
  70. package/dist/components/CompressDisplay.d.ts +0 -9
  71. package/dist/components/CompressDisplay.d.ts.map +0 -1
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useRef, useEffect } from "react";
2
+ import { useReducer } from "react";
3
3
  import { Box, Text, useInput } from "ink";
4
4
  import { usePluginManagerContext } from "../contexts/PluginManagerContext.js";
5
+ import { pluginDetailReducer, } from "../reducers/pluginDetailReducer.js";
5
6
  const SCOPES = [
6
7
  { id: "project", label: "Install for all collaborators (project scope)" },
7
8
  { id: "user", label: "Install for you (user scope)" },
@@ -9,17 +10,10 @@ const SCOPES = [
9
10
  ];
10
11
  export const PluginDetail = () => {
11
12
  const { state, discoverablePlugins, installedPlugins, actions } = usePluginManagerContext();
12
- const [selectedScopeIndex, setSelectedScopeIndex] = useState(0);
13
- const [selectedActionIndex, setSelectedActionIndex] = useState(0);
14
- // Keep refs in sync with state to avoid stale closures in useInput
15
- const selectedScopeIndexRef = useRef(selectedScopeIndex);
16
- const selectedActionIndexRef = useRef(selectedActionIndex);
17
- useEffect(() => {
18
- selectedScopeIndexRef.current = selectedScopeIndex;
19
- }, [selectedScopeIndex]);
20
- useEffect(() => {
21
- selectedActionIndexRef.current = selectedActionIndex;
22
- }, [selectedActionIndex]);
13
+ const [detailState, dispatch] = useReducer(pluginDetailReducer, {
14
+ selectedScopeIndex: 0,
15
+ selectedActionIndex: 0,
16
+ });
23
17
  const plugin = discoverablePlugins.find((p) => `${p.name}@${p.marketplace}` === state.selectedId) ||
24
18
  installedPlugins.find((p) => `${p.name}@${p.marketplace}` === state.selectedId);
25
19
  const INSTALLED_ACTIONS = [
@@ -33,16 +27,22 @@ export const PluginDetail = () => {
33
27
  actions.setView(isFromDiscover ? "DISCOVER" : "INSTALLED");
34
28
  }
35
29
  else if (key.upArrow) {
36
- setSelectedActionIndex((prev) => prev > 0 ? prev - 1 : INSTALLED_ACTIONS.length - 1);
37
- setSelectedScopeIndex((prev) => prev > 0 ? prev - 1 : SCOPES.length - 1);
30
+ dispatch({
31
+ type: "MOVE_ACTION_UP",
32
+ maxIndex: INSTALLED_ACTIONS.length - 1,
33
+ });
34
+ dispatch({ type: "MOVE_SCOPE_UP", maxIndex: SCOPES.length - 1 });
38
35
  }
39
36
  else if (key.downArrow) {
40
- setSelectedActionIndex((prev) => prev < INSTALLED_ACTIONS.length - 1 ? prev + 1 : 0);
41
- setSelectedScopeIndex((prev) => prev < SCOPES.length - 1 ? prev + 1 : 0);
37
+ dispatch({
38
+ type: "MOVE_ACTION_DOWN",
39
+ maxIndex: INSTALLED_ACTIONS.length - 1,
40
+ });
41
+ dispatch({ type: "MOVE_SCOPE_DOWN", maxIndex: SCOPES.length - 1 });
42
42
  }
43
43
  else if (key.return && plugin && !state.isLoading) {
44
44
  if (isInstalledAndEnabled) {
45
- const action = INSTALLED_ACTIONS[selectedActionIndexRef.current].id;
45
+ const action = INSTALLED_ACTIONS[detailState.selectedActionIndex].id;
46
46
  if (action === "uninstall") {
47
47
  actions.uninstallPlugin(plugin.name, plugin.marketplace);
48
48
  }
@@ -51,24 +51,24 @@ export const PluginDetail = () => {
51
51
  }
52
52
  }
53
53
  else {
54
- actions.installPlugin(plugin.name, plugin.marketplace, SCOPES[selectedScopeIndexRef.current].id);
54
+ actions.installPlugin(plugin.name, plugin.marketplace, SCOPES[detailState.selectedScopeIndex].id);
55
55
  }
56
56
  }
57
57
  });
58
58
  if (!plugin) {
59
59
  return (_jsx(Box, { children: _jsx(Text, { color: "red", children: "Plugin not found." }) }));
60
60
  }
61
- return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: plugin.name }), _jsxs(Text, { dimColor: true, children: [" @", plugin.marketplace] })] }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: "description" in plugin ? plugin.description : "" }) }), plugin.version && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: ["Version: ", _jsx(Text, { color: "blue", children: plugin.version })] }) })), state.isLoading && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "yellow", children: "\u231B Processing operation..." }) })), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [isInstalledAndEnabled ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Plugin Actions:" }), INSTALLED_ACTIONS.map((action, index) => (_jsxs(Text, { color: index === selectedActionIndex
61
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: plugin.name }), _jsxs(Text, { dimColor: true, children: [" @", plugin.marketplace] })] }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: "description" in plugin ? plugin.description : "" }) }), plugin.version && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: ["Version: ", _jsx(Text, { color: "blue", children: plugin.version })] }) })), state.isLoading && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "yellow", children: "\u231B Processing operation..." }) })), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [isInstalledAndEnabled ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Plugin Actions:" }), INSTALLED_ACTIONS.map((action, index) => (_jsxs(Text, { color: index === detailState.selectedActionIndex
62
62
  ? state.isLoading
63
63
  ? "gray"
64
64
  : "yellow"
65
- : undefined, children: [index === selectedActionIndex ? "> " : " ", action.label] }, action.id))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: state.isLoading
65
+ : undefined, children: [index === detailState.selectedActionIndex ? "> " : " ", action.label] }, action.id))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: state.isLoading
66
66
  ? "Please wait..."
67
- : "Use ↑/↓ to select, Enter to confirm" }) })] })) : (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Select Installation Scope:" }), SCOPES.map((scope, index) => (_jsxs(Text, { color: index === selectedScopeIndex
67
+ : "Use ↑/↓ to select, Enter to confirm" }) })] })) : (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Select Installation Scope:" }), SCOPES.map((scope, index) => (_jsxs(Text, { color: index === detailState.selectedScopeIndex
68
68
  ? state.isLoading
69
69
  ? "gray"
70
70
  : "green"
71
- : undefined, children: [index === selectedScopeIndex ? "> " : " ", scope.label] }, scope.id))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: state.isLoading
71
+ : undefined, children: [index === detailState.selectedScopeIndex ? "> " : " ", scope.label] }, scope.id))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: state.isLoading
72
72
  ? "Please wait..."
73
73
  : "Use ↑/↓ to select, Enter to install" }) })] })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press Esc to go back" }) })] })] }));
74
74
  };
@@ -2,5 +2,6 @@ import React from "react";
2
2
  export declare const PluginManagerShell: React.FC<{
3
3
  children?: React.ReactNode;
4
4
  onCancel?: () => void;
5
+ onPluginInstalled?: () => void;
5
6
  }>;
6
7
  //# sourceMappingURL=PluginManagerShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PluginManagerShell.d.ts","sourceRoot":"","sources":["../../src/components/PluginManagerShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAkMA,CAAC"}
1
+ {"version":3,"file":"PluginManagerShell.d.ts","sourceRoot":"","sources":["../../src/components/PluginManagerShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,CAkMA,CAAC"}
@@ -8,8 +8,8 @@ import { MarketplaceDetail } from "./MarketplaceDetail.js";
8
8
  import { PluginDetail } from "./PluginDetail.js";
9
9
  import { MarketplaceAddForm } from "./MarketplaceAddForm.js";
10
10
  import { PluginManagerContext } from "../contexts/PluginManagerContext.js";
11
- export const PluginManagerShell = ({ children, onCancel }) => {
12
- const pluginManager = usePluginManager();
11
+ export const PluginManagerShell = ({ children, onCancel, onPluginInstalled }) => {
12
+ const pluginManager = usePluginManager({ onPluginInstalled });
13
13
  const { state, actions, discoverablePlugins } = pluginManager;
14
14
  const setView = (view) => {
15
15
  if (view !== "PLUGIN_DETAIL" &&
@@ -22,8 +22,8 @@ export interface PluginManagerContextType {
22
22
  actions: {
23
23
  setView: (view: ViewType) => void;
24
24
  setSelectedId: (id: string | null) => void;
25
- addMarketplace: (source: string) => Promise<void>;
26
- removeMarketplace: (name: string) => Promise<void>;
25
+ addMarketplace: (source: string, scope?: "user" | "project" | "local") => Promise<void>;
26
+ removeMarketplace: (name: string, scope?: "user" | "project" | "local") => Promise<void>;
27
27
  updateMarketplace: (name: string) => Promise<void>;
28
28
  installPlugin: (name: string, marketplace: string, scope?: "user" | "project" | "local") => Promise<void>;
29
29
  uninstallPlugin: (name: string, marketplace: string) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"PluginManagerTypes.d.ts","sourceRoot":"","sources":["../../src/components/PluginManagerTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,WAAW,GACX,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,QAAQ,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,gBAAgB,EAAE,CAAC,eAAe,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,EAAE,CAAC;IAC7D,mBAAmB,EAAE,CAAC,sBAAsB,GAAG;QAC7C,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,EAAE,CAAC;IACL,OAAO,EAAE;QACP,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;QAClC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;QAC3C,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,aAAa,EAAE,CACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACnE,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,mBAAmB,EAAE,MAAM,IAAI,CAAC;KACjC,CAAC;CACH"}
1
+ {"version":3,"file":"PluginManagerTypes.d.ts","sourceRoot":"","sources":["../../src/components/PluginManagerTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,WAAW,GACX,cAAc,GACd,eAAe,GACf,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,QAAQ,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,gBAAgB,EAAE,CAAC,eAAe,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,EAAE,CAAC;IAC7D,mBAAmB,EAAE,CAAC,sBAAsB,GAAG;QAC7C,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,EAAE,CAAC;IACL,OAAO,EAAE;QACP,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;QAClC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;QAC3C,cAAc,EAAE,CACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,iBAAiB,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,aAAa,EAAE,CACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACnE,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,mBAAmB,EAAE,MAAM,IAAI,CAAC;KACjC,CAAC;CACH"}
@@ -5,7 +5,7 @@ export interface ChatContextType {
5
5
  messages: Message[];
6
6
  isLoading: boolean;
7
7
  isCommandRunning: boolean;
8
- isCompressing: boolean;
8
+ isCompacting: boolean;
9
9
  isExpanded: boolean;
10
10
  isTaskListVisible: boolean;
11
11
  setIsTaskListVisible: (visible: boolean) => void;
@@ -65,6 +65,7 @@ export interface ChatContextType {
65
65
  workingDirectory: string;
66
66
  version?: string;
67
67
  workdir?: string;
68
+ recreateAgent: () => void;
68
69
  }
69
70
  export declare const useChat: () => ChatContextType;
70
71
  export interface ChatProviderProps extends BaseAppProps {
@@ -1 +1 @@
1
- {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"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"}
@@ -48,7 +48,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
48
48
  const [latestTotalTokens, setlatestTotalTokens] = useState(0);
49
49
  const [sessionId, setSessionId] = useState("");
50
50
  const [isCommandRunning, setIsCommandRunning] = useState(false);
51
- const [isCompressing, setIsCompressing] = useState(false);
51
+ const [isCompacting, setIsCompacting] = useState(false);
52
52
  const [currentModel, setCurrentModelState] = useState("");
53
53
  const [configuredModels, setConfiguredModels] = useState([]);
54
54
  const [queuedMessages, setQueuedMessages] = useState([]);
@@ -114,105 +114,103 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
114
114
  });
115
115
  }, []);
116
116
  // Initialize AI manager
117
- useEffect(() => {
118
- const initializeAgent = async () => {
119
- const callbacks = {
120
- onMessagesChange: () => {
121
- throttledSetMessages();
122
- },
123
- onServersChange: (servers) => {
124
- setMcpServers([...servers]);
125
- },
126
- onSessionIdChange: (sessionId) => {
127
- setSessionId(sessionId);
128
- },
129
- onLatestTotalTokensChange: (tokens) => {
130
- throttledSetTokens(tokens);
131
- },
132
- onCompressionStateChange: (isCompressingState) => {
133
- setIsCompressing(isCompressingState);
134
- },
135
- onBackgroundTasksChange: (tasks) => {
136
- setBackgroundTasks([...tasks]);
137
- },
138
- onTasksChange: (tasks) => {
139
- setTasks([...tasks]);
140
- },
141
- onPermissionModeChange: (mode) => {
142
- setPermissionModeState(mode);
143
- },
144
- onModelChange: (model) => {
145
- setCurrentModelState(model);
146
- },
147
- onConfiguredModelsChange: (models) => {
148
- setConfiguredModels(models);
149
- },
150
- onLoadingChange: (loading) => {
151
- setIsLoading(loading);
152
- },
153
- onCommandRunningChange: (running) => {
154
- setIsCommandRunning(running);
155
- },
156
- onQueuedMessagesChange: (messages) => {
157
- setQueuedMessages([...messages]);
158
- },
159
- };
160
- try {
161
- // Create the permission callback inside the try block to access showConfirmation
162
- const permissionCallback = async (context) => {
163
- try {
164
- return await showConfirmation(context.toolName, context.toolInput, context.suggestedPrefix, context.hidePersistentOption, context.planContent);
165
- }
166
- catch {
167
- // If confirmation was cancelled or failed, deny the operation
168
- return {
169
- behavior: "deny",
170
- message: OPERATION_CANCELLED_BY_USER,
171
- };
172
- }
173
- };
174
- const agent = await Agent.create({
175
- callbacks,
176
- restoreSessionId,
177
- continueLastSession,
178
- logger,
179
- permissionMode: initialPermissionMode ||
180
- (bypassPermissions ? "bypassPermissions" : undefined),
181
- canUseTool: permissionCallback,
182
- stream: true,
183
- plugins: pluginDirs?.map((path) => ({ type: "local", path })),
184
- tools,
185
- allowedTools,
186
- disallowedTools,
187
- workdir,
188
- worktreeName: worktreeSession?.name,
189
- isNewWorktree: worktreeSession?.isNew,
190
- model,
191
- });
192
- agentRef.current = agent;
193
- // Get initial state
194
- setSessionId(agent.sessionId);
195
- setMessages(agent.messages);
196
- setIsLoading(agent.isLoading);
197
- setlatestTotalTokens(agent.latestTotalTokens);
198
- setIsCommandRunning(agent.isCommandRunning);
199
- setIsCompressing(agent.isCompressing);
200
- setPermissionModeState(agent.getPermissionMode());
201
- setWorkingDirectory(agent.workingDirectory);
202
- setCurrentModelState(agent.getModelConfig().model);
203
- setConfiguredModels(agent.getConfiguredModels());
204
- // Get initial MCP servers state
205
- const mcpServers = agent.getMcpServers?.() || [];
206
- setMcpServers(mcpServers);
207
- // Get initial commands
208
- const agentSlashCommands = agent.getSlashCommands?.() || [];
209
- setSlashCommands(agentSlashCommands);
210
- }
211
- catch (error) {
212
- console.error("Failed to initialize AI manager:", error);
213
- }
117
+ const initializeAgent = useCallback(async (restoreSessionIdOverride) => {
118
+ const effectiveRestoreSessionId = restoreSessionIdOverride ?? restoreSessionId;
119
+ const callbacks = {
120
+ onMessagesChange: () => {
121
+ throttledSetMessages();
122
+ },
123
+ onServersChange: (servers) => {
124
+ setMcpServers([...servers]);
125
+ },
126
+ onSessionIdChange: (sessionId) => {
127
+ setSessionId(sessionId);
128
+ },
129
+ onLatestTotalTokensChange: (tokens) => {
130
+ throttledSetTokens(tokens);
131
+ },
132
+ onCompactionStateChange: (isCompactingState) => {
133
+ setIsCompacting(isCompactingState);
134
+ },
135
+ onBackgroundTasksChange: (tasks) => {
136
+ setBackgroundTasks([...tasks]);
137
+ },
138
+ onTasksChange: (tasks) => {
139
+ setTasks([...tasks]);
140
+ },
141
+ onPermissionModeChange: (mode) => {
142
+ setPermissionModeState(mode);
143
+ },
144
+ onModelChange: (model) => {
145
+ setCurrentModelState(model);
146
+ },
147
+ onConfiguredModelsChange: (models) => {
148
+ setConfiguredModels(models);
149
+ },
150
+ onLoadingChange: (loading) => {
151
+ setIsLoading(loading);
152
+ },
153
+ onCommandRunningChange: (running) => {
154
+ setIsCommandRunning(running);
155
+ },
156
+ onQueuedMessagesChange: (messages) => {
157
+ setQueuedMessages([...messages]);
158
+ },
214
159
  };
215
- initializeAgent();
160
+ try {
161
+ // Create the permission callback inside the try block to access showConfirmation
162
+ const permissionCallback = async (context) => {
163
+ try {
164
+ return await showConfirmation(context.toolName, context.toolInput, context.suggestedPrefix, context.hidePersistentOption, context.planContent);
165
+ }
166
+ catch {
167
+ // If confirmation was cancelled or failed, deny the operation
168
+ return {
169
+ behavior: "deny",
170
+ message: OPERATION_CANCELLED_BY_USER,
171
+ };
172
+ }
173
+ };
174
+ const agent = await Agent.create({
175
+ callbacks,
176
+ restoreSessionId: effectiveRestoreSessionId,
177
+ continueLastSession,
178
+ logger,
179
+ permissionMode: initialPermissionMode ||
180
+ (bypassPermissions ? "bypassPermissions" : undefined),
181
+ canUseTool: permissionCallback,
182
+ stream: true,
183
+ plugins: pluginDirs?.map((path) => ({ type: "local", path })),
184
+ tools,
185
+ allowedTools,
186
+ disallowedTools,
187
+ workdir,
188
+ worktreeName: worktreeSession?.name,
189
+ isNewWorktree: worktreeSession?.isNew,
190
+ model,
191
+ });
192
+ agentRef.current = agent;
193
+ // Get initial state
194
+ setSessionId(agent.sessionId);
195
+ setMessages(agent.messages);
196
+ setIsLoading(agent.isLoading);
197
+ setlatestTotalTokens(agent.latestTotalTokens);
198
+ setIsCommandRunning(agent.isCommandRunning);
199
+ setIsCompacting(agent.isCompacting);
200
+ setPermissionModeState(agent.getPermissionMode());
201
+ setWorkingDirectory(agent.workingDirectory);
202
+ setCurrentModelState(agent.getModelConfig().model);
203
+ setConfiguredModels(agent.getConfiguredModels());
204
+ // Get initial MCP servers state
205
+ const mcpServers = agent.getMcpServers?.() || [];
206
+ setMcpServers(mcpServers);
207
+ // Get initial commands
208
+ const agentSlashCommands = agent.getSlashCommands?.() || [];
209
+ setSlashCommands(agentSlashCommands);
210
+ }
211
+ catch (error) {
212
+ console.error("Failed to initialize AI manager:", error);
213
+ }
216
214
  }, [
217
215
  restoreSessionId,
218
216
  continueLastSession,
@@ -229,6 +227,34 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
229
227
  throttledSetMessages,
230
228
  throttledSetTokens,
231
229
  ]);
230
+ // Recreate agent (e.g. after plugin install) — destroys current agent and reinitializes
231
+ const recreateAgent = useCallback(() => {
232
+ const currentSessionId = agentRef.current?.sessionId;
233
+ if (agentRef.current) {
234
+ try {
235
+ agentRef.current.destroy();
236
+ }
237
+ catch {
238
+ // Ignore destroy errors
239
+ }
240
+ }
241
+ agentRef.current = null;
242
+ setMessages([]);
243
+ setMcpServers([]);
244
+ setSlashCommands([]);
245
+ setSessionId("");
246
+ setIsLoading(false);
247
+ setlatestTotalTokens(0);
248
+ setIsCommandRunning(false);
249
+ setIsCompacting(false);
250
+ if (currentSessionId) {
251
+ initializeAgent(currentSessionId);
252
+ }
253
+ }, [initializeAgent]);
254
+ // Run initial agent creation
255
+ useEffect(() => {
256
+ initializeAgent();
257
+ }, [initializeAgent]);
232
258
  // Cleanup on unmount
233
259
  useEffect(() => {
234
260
  return () => {
@@ -451,7 +477,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
451
477
  configuredModels,
452
478
  getConfiguredModels,
453
479
  setModel,
454
- isCompressing,
480
+ isCompacting,
455
481
  mcpServers,
456
482
  connectMcpServer,
457
483
  disconnectMcpServer,
@@ -481,6 +507,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
481
507
  workingDirectory,
482
508
  version,
483
509
  workdir,
510
+ recreateAgent,
484
511
  };
485
512
  return (_jsx(ChatContext.Provider, { value: contextValue, children: children }));
486
513
  };
@@ -1,3 +1,5 @@
1
1
  import { PluginManagerContextType } from "../components/PluginManagerTypes.js";
2
- export declare function usePluginManager(): PluginManagerContextType;
2
+ export declare function usePluginManager(options?: {
3
+ onPluginInstalled?: () => void;
4
+ }): PluginManagerContextType;
3
5
  //# sourceMappingURL=usePluginManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePluginManager.d.ts","sourceRoot":"","sources":["../../src/hooks/usePluginManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,wBAAwB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,wBAAgB,gBAAgB,IAAI,wBAAwB,CAuT3D"}
1
+ {"version":3,"file":"usePluginManager.d.ts","sourceRoot":"","sources":["../../src/hooks/usePluginManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,wBAAwB,EACzB,MAAM,qCAAqC,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IACzC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,GAAG,wBAAwB,CAgU3B"}
@@ -1,6 +1,6 @@
1
1
  import { useState, useCallback, useEffect, useMemo } from "react";
2
2
  import { PluginCore, } from "wave-agent-sdk";
3
- export function usePluginManager() {
3
+ export function usePluginManager(options) {
4
4
  const [state, setState] = useState({
5
5
  currentView: "DISCOVER",
6
6
  selectedId: null,
@@ -98,16 +98,20 @@ export function usePluginManager() {
98
98
  const setSelectedId = useCallback((id) => {
99
99
  setState((prev) => ({ ...prev, selectedId: id }));
100
100
  }, []);
101
- const addMarketplace = useCallback(async (source) => {
101
+ const addMarketplace = useCallback(async (source, scope = "user") => {
102
102
  clearPluginFeedback();
103
103
  setState((prev) => ({
104
104
  ...prev,
105
105
  isLoading: true,
106
106
  }));
107
107
  try {
108
- await pluginCore.addMarketplace(source);
108
+ await pluginCore.addMarketplace(source, scope);
109
109
  await refresh();
110
- setSuccessMessage(`Marketplace added successfully`);
110
+ setSuccessMessage(`Marketplace added successfully (${scope} scope)`);
111
+ setState((prev) => ({
112
+ ...prev,
113
+ currentView: "MARKETPLACES",
114
+ }));
111
115
  }
112
116
  catch (error) {
113
117
  setState((prev) => ({
@@ -117,16 +121,20 @@ export function usePluginManager() {
117
121
  }));
118
122
  }
119
123
  }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
120
- const removeMarketplace = useCallback(async (name) => {
124
+ const removeMarketplace = useCallback(async (name, scope) => {
121
125
  clearPluginFeedback();
122
126
  setState((prev) => ({
123
127
  ...prev,
124
128
  isLoading: true,
125
129
  }));
126
130
  try {
127
- await pluginCore.removeMarketplace(name);
131
+ await pluginCore.removeMarketplace(name, scope);
128
132
  await refresh();
129
133
  setSuccessMessage(`Marketplace '${name}' removed successfully`);
134
+ setState((prev) => ({
135
+ ...prev,
136
+ currentView: "MARKETPLACES",
137
+ }));
130
138
  }
131
139
  catch (error) {
132
140
  setState((prev) => ({
@@ -166,6 +174,7 @@ export function usePluginManager() {
166
174
  await pluginCore.installPlugin(pluginId, scope);
167
175
  await refresh();
168
176
  setSuccessMessage(`Plugin '${name}' installed successfully`);
177
+ options?.onPluginInstalled?.();
169
178
  }
170
179
  catch (error) {
171
180
  setState((prev) => ({
@@ -174,7 +183,7 @@ export function usePluginManager() {
174
183
  error: error instanceof Error ? error.message : String(error),
175
184
  }));
176
185
  }
177
- }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
186
+ }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage, options]);
178
187
  const uninstallPlugin = useCallback(async (name, marketplace) => {
179
188
  clearPluginFeedback();
180
189
  setState((prev) => ({
@@ -0,0 +1,43 @@
1
+ export interface Task {
2
+ id: string;
3
+ type: string;
4
+ description?: string;
5
+ status: "running" | "completed" | "failed" | "killed";
6
+ startTime: number;
7
+ exitCode?: number;
8
+ runtime?: number;
9
+ outputPath?: string;
10
+ }
11
+ export interface DetailOutput {
12
+ stdout: string;
13
+ stderr: string;
14
+ status: string;
15
+ outputPath?: string;
16
+ }
17
+ export interface BackgroundTaskManagerState {
18
+ tasks: Task[];
19
+ selectedIndex: number;
20
+ viewMode: "list" | "detail";
21
+ detailTaskId: string | null;
22
+ detailOutput: DetailOutput | null;
23
+ }
24
+ export type BackgroundTaskManagerAction = {
25
+ type: "SET_TASKS";
26
+ tasks: Task[];
27
+ } | {
28
+ type: "SELECT_INDEX";
29
+ index: number;
30
+ } | {
31
+ type: "SET_VIEW_MODE";
32
+ mode: "list" | "detail";
33
+ } | {
34
+ type: "SET_DETAIL_TASK_ID";
35
+ id: string | null;
36
+ } | {
37
+ type: "SET_DETAIL_OUTPUT";
38
+ output: DetailOutput | null;
39
+ } | {
40
+ type: "RESET_DETAIL";
41
+ };
42
+ export declare function backgroundTaskManagerReducer(state: BackgroundTaskManagerState, action: BackgroundTaskManagerAction): BackgroundTaskManagerState;
43
+ //# sourceMappingURL=backgroundTaskManagerReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundTaskManagerReducer.d.ts","sourceRoot":"","sources":["../../src/reducers/backgroundTaskManagerReducer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AAE7B,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,0BAA0B,EACjC,MAAM,EAAE,2BAA2B,GAClC,0BAA0B,CAsB5B"}
@@ -0,0 +1,23 @@
1
+ export function backgroundTaskManagerReducer(state, action) {
2
+ switch (action.type) {
3
+ case "SET_TASKS":
4
+ return { ...state, tasks: action.tasks };
5
+ case "SELECT_INDEX":
6
+ return { ...state, selectedIndex: action.index };
7
+ case "SET_VIEW_MODE":
8
+ return { ...state, viewMode: action.mode };
9
+ case "SET_DETAIL_TASK_ID":
10
+ return { ...state, detailTaskId: action.id };
11
+ case "SET_DETAIL_OUTPUT":
12
+ return { ...state, detailOutput: action.output };
13
+ case "RESET_DETAIL":
14
+ return {
15
+ ...state,
16
+ viewMode: "list",
17
+ detailTaskId: null,
18
+ detailOutput: null,
19
+ };
20
+ default:
21
+ return state;
22
+ }
23
+ }
@@ -0,0 +1,24 @@
1
+ export interface MarketplaceAddFormState {
2
+ source: string;
3
+ scopeIndex: number;
4
+ step: "source" | "scope";
5
+ }
6
+ export type MarketplaceAddFormAction = {
7
+ type: "SET_SOURCE";
8
+ source: string;
9
+ } | {
10
+ type: "SET_SCOPE_INDEX";
11
+ index: number;
12
+ } | {
13
+ type: "SET_STEP";
14
+ step: "source" | "scope";
15
+ } | {
16
+ type: "INSERT_CHAR";
17
+ text: string;
18
+ } | {
19
+ type: "DELETE_CHAR";
20
+ } | {
21
+ type: "BACK_TO_SOURCE";
22
+ };
23
+ export declare function marketplaceAddFormReducer(state: MarketplaceAddFormState, action: MarketplaceAddFormAction): MarketplaceAddFormState;
24
+ //# sourceMappingURL=marketplaceAddFormReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplaceAddFormReducer.d.ts","sourceRoot":"","sources":["../../src/reducers/marketplaceAddFormReducer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,wBAAwB,GAC/B,uBAAuB,CAiBzB"}
@@ -0,0 +1,18 @@
1
+ export function marketplaceAddFormReducer(state, action) {
2
+ switch (action.type) {
3
+ case "SET_SOURCE":
4
+ return { ...state, source: action.source };
5
+ case "SET_SCOPE_INDEX":
6
+ return { ...state, scopeIndex: action.index };
7
+ case "SET_STEP":
8
+ return { ...state, step: action.step };
9
+ case "INSERT_CHAR":
10
+ return { ...state, source: state.source + action.text };
11
+ case "DELETE_CHAR":
12
+ return { ...state, source: state.source.slice(0, -1) };
13
+ case "BACK_TO_SOURCE":
14
+ return { ...state, step: "source" };
15
+ default:
16
+ return state;
17
+ }
18
+ }