@laststance/claude-plugin-dashboard 0.2.3 → 0.3.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 (58) hide show
  1. package/README.md +7 -1
  2. package/dist/app.d.ts +7 -1
  3. package/dist/app.js +544 -262
  4. package/dist/cli.js +60 -67
  5. package/dist/components/ComponentBadges.d.ts +0 -9
  6. package/dist/components/ComponentBadges.js +0 -33
  7. package/dist/components/ComponentDetail.d.ts +32 -0
  8. package/dist/components/ComponentDetail.js +106 -0
  9. package/dist/components/ComponentList.d.ts +87 -0
  10. package/dist/components/ComponentList.js +287 -0
  11. package/dist/components/HelpOverlay.js +1 -0
  12. package/dist/components/KeyHints.d.ts +1 -0
  13. package/dist/components/KeyHints.js +33 -29
  14. package/dist/components/MarketplaceActionMenu.d.ts +41 -0
  15. package/dist/components/MarketplaceActionMenu.js +68 -0
  16. package/dist/components/MarketplaceDetail.d.ts +10 -3
  17. package/dist/components/MarketplaceDetail.js +10 -4
  18. package/dist/components/PluginDetail.d.ts +19 -3
  19. package/dist/components/PluginDetail.js +56 -6
  20. package/dist/components/PluginList.js +19 -7
  21. package/dist/services/componentService.d.ts +10 -31
  22. package/dist/services/componentService.js +19 -174
  23. package/dist/services/components/hookService.d.ts +17 -0
  24. package/dist/services/components/hookService.js +45 -0
  25. package/dist/services/components/index.d.ts +41 -0
  26. package/dist/services/components/index.js +126 -0
  27. package/dist/services/components/markdownService.d.ts +39 -0
  28. package/dist/services/components/markdownService.js +147 -0
  29. package/dist/services/components/serverService.d.ts +28 -0
  30. package/dist/services/components/serverService.js +69 -0
  31. package/dist/services/components/skillService.d.ts +48 -0
  32. package/dist/services/components/skillService.js +164 -0
  33. package/dist/services/components/utils.d.ts +23 -0
  34. package/dist/services/components/utils.js +42 -0
  35. package/dist/services/marketplaceActionsService.d.ts +17 -0
  36. package/dist/services/marketplaceActionsService.js +18 -0
  37. package/dist/services/pluginActionsService.d.ts +31 -2
  38. package/dist/services/pluginActionsService.js +65 -6
  39. package/dist/services/pluginService.js +78 -2
  40. package/dist/store/index.d.ts +46 -0
  41. package/dist/store/index.js +47 -0
  42. package/dist/store/slices/marketplaceSlice.d.ts +344 -0
  43. package/dist/store/slices/marketplaceSlice.js +152 -0
  44. package/dist/store/slices/pluginSlice.d.ts +1544 -0
  45. package/dist/store/slices/pluginSlice.js +191 -0
  46. package/dist/store/slices/uiSlice.d.ts +147 -0
  47. package/dist/store/slices/uiSlice.js +126 -0
  48. package/dist/tabs/DiscoverTab.d.ts +8 -2
  49. package/dist/tabs/DiscoverTab.js +2 -2
  50. package/dist/tabs/EnabledTab.d.ts +8 -2
  51. package/dist/tabs/EnabledTab.js +3 -3
  52. package/dist/tabs/ErrorsTab.js +1 -1
  53. package/dist/tabs/InstalledTab.d.ts +8 -2
  54. package/dist/tabs/InstalledTab.js +3 -3
  55. package/dist/tabs/MarketplacesTab.d.ts +15 -2
  56. package/dist/tabs/MarketplacesTab.js +13 -4
  57. package/dist/types/index.d.ts +157 -5
  58. package/package.json +10 -3
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Plugin actions service for install/uninstall operations
3
- * Executes `claude plugin install/uninstall` as subprocess
2
+ * Plugin actions service for install/uninstall/update operations
3
+ * Executes `claude plugin install/uninstall/update` as subprocess
4
4
  */
5
5
  import { spawn } from 'node:child_process';
6
6
  /**
@@ -20,12 +20,51 @@ export function uninstallPlugin(pluginId) {
20
20
  return executePluginAction('uninstall', pluginId);
21
21
  }
22
22
  /**
23
- * Execute a plugin command (install/uninstall)
24
- * @param action - 'install' or 'uninstall'
23
+ * Update a plugin via Claude CLI
25
24
  * @param pluginId - Plugin identifier
26
25
  * @returns Promise resolving to action result
27
26
  */
28
- function executePluginAction(action, pluginId) {
27
+ export function updatePlugin(pluginId) {
28
+ return executePluginAction('update', pluginId);
29
+ }
30
+ /**
31
+ * Update all plugins sequentially
32
+ * @param pluginIds - Array of plugin identifiers to update
33
+ * @param onProgress - Optional callback for progress reporting
34
+ * @returns Promise resolving to bulk update result
35
+ * @example
36
+ * const result = await updateAllPlugins(['ctx7@official', 'sup@official'], (cur, total, id) => {
37
+ * console.log(`Updating (${cur}/${total}): ${id}...`)
38
+ * })
39
+ */
40
+ export async function updateAllPlugins(pluginIds, onProgress) {
41
+ const results = [];
42
+ for (let i = 0; i < pluginIds.length; i++) {
43
+ const pluginId = pluginIds[i];
44
+ onProgress?.(i + 1, pluginIds.length, pluginId);
45
+ const result = await updatePlugin(pluginId);
46
+ results.push({ pluginId, result });
47
+ }
48
+ return {
49
+ total: pluginIds.length,
50
+ succeeded: results.filter((r) => r.result.success).length,
51
+ failed: results.filter((r) => !r.result.success).length,
52
+ results,
53
+ };
54
+ }
55
+ /** Timeout for subprocess operations (60 seconds) */
56
+ const SUBPROCESS_TIMEOUT_MS = 60_000;
57
+ /**
58
+ * Execute a plugin command (install/uninstall/update) with a timeout guard
59
+ * @param action - 'install', 'uninstall', or 'update'
60
+ * @param pluginId - Plugin identifier
61
+ * @param timeoutMs - Timeout in milliseconds (default: 60s)
62
+ * @returns Promise resolving to action result
63
+ * @example
64
+ * const result = await executePluginAction('install', 'my-plugin@marketplace')
65
+ * // => { success: true, message: 'Installed my-plugin@marketplace' }
66
+ */
67
+ function executePluginAction(action, pluginId, timeoutMs = SUBPROCESS_TIMEOUT_MS) {
29
68
  return new Promise((resolve) => {
30
69
  const child = spawn('claude', ['plugin', action, pluginId], {
31
70
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -33,6 +72,18 @@ function executePluginAction(action, pluginId) {
33
72
  });
34
73
  let stdout = '';
35
74
  let stderr = '';
75
+ let settled = false;
76
+ const timer = setTimeout(() => {
77
+ if (settled)
78
+ return;
79
+ settled = true;
80
+ child.kill('SIGTERM');
81
+ resolve({
82
+ success: false,
83
+ message: `Timed out ${action}ing ${pluginId}`,
84
+ error: `Process did not complete within ${timeoutMs / 1000}s`,
85
+ });
86
+ }, timeoutMs);
36
87
  child.stdout?.on('data', (data) => {
37
88
  stdout += data.toString();
38
89
  });
@@ -40,10 +91,14 @@ function executePluginAction(action, pluginId) {
40
91
  stderr += data.toString();
41
92
  });
42
93
  child.on('close', (code) => {
94
+ if (settled)
95
+ return;
96
+ settled = true;
97
+ clearTimeout(timer);
43
98
  if (code === 0) {
44
99
  resolve({
45
100
  success: true,
46
- message: `${action === 'install' ? 'Installed' : 'Uninstalled'} ${pluginId}`,
101
+ message: `${action === 'install' ? 'Installed' : action === 'uninstall' ? 'Uninstalled' : 'Updated'} ${pluginId}`,
47
102
  });
48
103
  }
49
104
  else {
@@ -55,6 +110,10 @@ function executePluginAction(action, pluginId) {
55
110
  }
56
111
  });
57
112
  child.on('error', (err) => {
113
+ if (settled)
114
+ return;
115
+ settled = true;
116
+ clearTimeout(timer);
58
117
  resolve({
59
118
  success: false,
60
119
  message: 'Failed to execute claude command',
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { readJsonFile, directoryExists, listDirectories, } from './fileService.js';
6
6
  import { getEnabledPlugins } from './settingsService.js';
7
- import { detectPluginComponents } from './componentService.js';
7
+ import { detectPluginComponents, detectComponentsDetailed, } from './componentService.js';
8
8
  import { PATHS, getMarketplaceJsonPath } from '../utils/paths.js';
9
9
  /**
10
10
  * Load all plugins from all marketplaces
@@ -45,10 +45,20 @@ export function loadAllPlugins() {
45
45
  for (const plugin of manifest.plugins) {
46
46
  const pluginId = `${plugin.name}@${marketplace}`;
47
47
  const installedEntry = installedMap.get(pluginId);
48
- // Detect components for installed plugins
48
+ // Detect components for installed plugins (counts)
49
49
  const components = installedEntry
50
50
  ? detectPluginComponents(installedEntry.installPath)
51
51
  : undefined;
52
+ // Detect detailed components
53
+ // - For installed: read from file system (names + descriptions)
54
+ // - For not installed: parse from marketplace JSON (names only)
55
+ let componentsDetailed;
56
+ if (installedEntry) {
57
+ componentsDetailed = detectComponentsDetailed(installedEntry.installPath);
58
+ }
59
+ else {
60
+ componentsDetailed = parseMarketplaceComponents(plugin);
61
+ }
52
62
  plugins.push({
53
63
  id: pluginId,
54
64
  name: plugin.name,
@@ -67,6 +77,7 @@ export function loadAllPlugins() {
67
77
  isLocal: installedEntry?.isLocal,
68
78
  gitCommitSha: installedEntry?.gitCommitSha,
69
79
  components,
80
+ componentsDetailed,
70
81
  });
71
82
  }
72
83
  }
@@ -120,6 +131,7 @@ export function loadMarketplaces() {
120
131
  installLocation: data.installLocation,
121
132
  lastUpdated: data.lastUpdated,
122
133
  pluginCount,
134
+ autoUpdate: data.autoUpdate ?? false,
123
135
  });
124
136
  }
125
137
  // Sort by plugin count (descending)
@@ -208,3 +220,67 @@ export function getPluginStatistics() {
208
220
  marketplaces: marketplaces.length,
209
221
  };
210
222
  }
223
+ /**
224
+ * Parse component names from marketplace plugin entry
225
+ * Extracts component names from skills[], agents[], commands[] arrays
226
+ * @param plugin - Marketplace plugin entry
227
+ * @returns Detailed components with names only (no descriptions)
228
+ * @example
229
+ * parseMarketplaceComponents({ skills: ['./skills/xlsx', './skills/docx'] })
230
+ * // => { skills: [{ name: 'xlsx', type: 'skill' }, { name: 'docx', type: 'skill' }] }
231
+ */
232
+ function parseMarketplaceComponents(plugin) {
233
+ const detailed = {};
234
+ // Parse skills array (e.g., ["./skills/xlsx", "./skills/docx"])
235
+ if (plugin.skills && Array.isArray(plugin.skills)) {
236
+ const skills = plugin.skills
237
+ .map((skillPath) => extractComponentName(skillPath, 'skill'))
238
+ .filter((item) => item !== null);
239
+ if (skills.length > 0) {
240
+ detailed.skills = skills;
241
+ }
242
+ }
243
+ // Parse agents array (if available in marketplace)
244
+ if (plugin.agents && Array.isArray(plugin.agents)) {
245
+ const agents = plugin.agents
246
+ .map((agentPath) => extractComponentName(agentPath, 'agent'))
247
+ .filter((item) => item !== null);
248
+ if (agents.length > 0) {
249
+ detailed.agents = agents;
250
+ }
251
+ }
252
+ // Parse commands array (if available in marketplace)
253
+ if (plugin.commands && Array.isArray(plugin.commands)) {
254
+ const commands = plugin.commands
255
+ .map((cmdPath) => extractComponentName(cmdPath, 'command'))
256
+ .filter((item) => item !== null);
257
+ if (commands.length > 0) {
258
+ detailed.commands = commands;
259
+ }
260
+ }
261
+ // Return undefined if no components found
262
+ if (Object.keys(detailed).length === 0) {
263
+ return undefined;
264
+ }
265
+ return detailed;
266
+ }
267
+ /**
268
+ * Extract component name from path string
269
+ * @param pathStr - Path like "./skills/xlsx" or just "xlsx"
270
+ * @param type - Component type
271
+ * @returns ComponentInfo or null if invalid
272
+ */
273
+ function extractComponentName(pathStr, type) {
274
+ if (typeof pathStr !== 'string' || !pathStr.trim()) {
275
+ return null;
276
+ }
277
+ // Extract basename from path
278
+ // "./skills/xlsx" -> "xlsx"
279
+ // "xlsx" -> "xlsx"
280
+ const parts = pathStr.split('/');
281
+ const name = parts[parts.length - 1]?.trim();
282
+ if (!name) {
283
+ return null;
284
+ }
285
+ return { name, type };
286
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Redux store configuration for Claude Code Plugin Dashboard
3
+ * Combines all slices and exports typed hooks
4
+ */
5
+ import { type TypedUseSelectorHook } from 'react-redux';
6
+ /**
7
+ * Configure the Redux store with all slices
8
+ */
9
+ export declare const store: import("@reduxjs/toolkit").EnhancedStore<{
10
+ ui: import("./slices/uiSlice.js").UiState;
11
+ plugins: import("./slices/pluginSlice.js").PluginState;
12
+ marketplaces: import("./slices/marketplaceSlice.js").MarketplaceState;
13
+ }, import("@reduxjs/toolkit").UnknownAction, import("@reduxjs/toolkit").Tuple<[import("@reduxjs/toolkit").StoreEnhancer<{
14
+ dispatch: import("@reduxjs/toolkit").ThunkDispatch<{
15
+ ui: import("./slices/uiSlice.js").UiState;
16
+ plugins: import("./slices/pluginSlice.js").PluginState;
17
+ marketplaces: import("./slices/marketplaceSlice.js").MarketplaceState;
18
+ }, undefined, import("@reduxjs/toolkit").UnknownAction>;
19
+ }>, import("@reduxjs/toolkit").StoreEnhancer]>>;
20
+ /**
21
+ * Store types for TypeScript
22
+ */
23
+ export type RootState = ReturnType<typeof store.getState>;
24
+ export type AppDispatch = typeof store.dispatch;
25
+ /**
26
+ * Typed hooks for use throughout the app
27
+ */
28
+ export declare const useAppDispatch: () => AppDispatch;
29
+ export declare const useAppSelector: TypedUseSelectorHook<RootState>;
30
+ /**
31
+ * Create a new store instance (useful for testing)
32
+ */
33
+ export declare function createStore(): import("@reduxjs/toolkit").EnhancedStore<{
34
+ ui: import("./slices/uiSlice.js").UiState;
35
+ plugins: import("./slices/pluginSlice.js").PluginState;
36
+ marketplaces: import("./slices/marketplaceSlice.js").MarketplaceState;
37
+ }, import("@reduxjs/toolkit").UnknownAction, import("@reduxjs/toolkit").Tuple<[import("@reduxjs/toolkit").StoreEnhancer<{
38
+ dispatch: import("@reduxjs/toolkit").ThunkDispatch<{
39
+ ui: import("./slices/uiSlice.js").UiState;
40
+ plugins: import("./slices/pluginSlice.js").PluginState;
41
+ marketplaces: import("./slices/marketplaceSlice.js").MarketplaceState;
42
+ }, undefined, import("@reduxjs/toolkit").UnknownAction>;
43
+ }>, import("@reduxjs/toolkit").StoreEnhancer]>>;
44
+ export * from './slices/uiSlice.js';
45
+ export * from './slices/pluginSlice.js';
46
+ export * from './slices/marketplaceSlice.js';
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Redux store configuration for Claude Code Plugin Dashboard
3
+ * Combines all slices and exports typed hooks
4
+ */
5
+ import { configureStore } from '@reduxjs/toolkit';
6
+ import { useDispatch, useSelector, } from 'react-redux';
7
+ import uiReducer from './slices/uiSlice.js';
8
+ import pluginReducer from './slices/pluginSlice.js';
9
+ import marketplaceReducer from './slices/marketplaceSlice.js';
10
+ /**
11
+ * Configure the Redux store with all slices
12
+ */
13
+ export const store = configureStore({
14
+ reducer: {
15
+ ui: uiReducer,
16
+ plugins: pluginReducer,
17
+ marketplaces: marketplaceReducer,
18
+ },
19
+ // Ink uses context that might not be serializable
20
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware({
21
+ serializableCheck: false,
22
+ }),
23
+ });
24
+ /**
25
+ * Typed hooks for use throughout the app
26
+ */
27
+ export const useAppDispatch = useDispatch;
28
+ export const useAppSelector = useSelector;
29
+ /**
30
+ * Create a new store instance (useful for testing)
31
+ */
32
+ export function createStore() {
33
+ return configureStore({
34
+ reducer: {
35
+ ui: uiReducer,
36
+ plugins: pluginReducer,
37
+ marketplaces: marketplaceReducer,
38
+ },
39
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware({
40
+ serializableCheck: false,
41
+ }),
42
+ });
43
+ }
44
+ // Re-export slice actions for convenience
45
+ export * from './slices/uiSlice.js';
46
+ export * from './slices/pluginSlice.js';
47
+ export * from './slices/marketplaceSlice.js';
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Marketplace state slice for marketplace data and operations
3
+ * Handles marketplace list, dialogs, and marketplace operations
4
+ */
5
+ import { type PayloadAction } from '@reduxjs/toolkit';
6
+ import type { Marketplace } from '../../types/index.js';
7
+ /**
8
+ * Marketplace operation type
9
+ */
10
+ export type MarketplaceOperation = 'idle' | 'adding' | 'removing' | 'updating';
11
+ /**
12
+ * Marketplace-specific state
13
+ */
14
+ export interface MarketplaceState {
15
+ marketplaces: Marketplace[];
16
+ marketplaceOperation: MarketplaceOperation;
17
+ operationMarketplaceId: string | null;
18
+ confirmRemoveMarketplace: boolean;
19
+ showAddMarketplaceDialog: boolean;
20
+ addMarketplaceError: string | null;
21
+ showMarketplaceActionMenu: boolean;
22
+ actionMenuSelectedIndex: number;
23
+ }
24
+ /**
25
+ * Get display message for marketplace operation status
26
+ * @param operation - The marketplace operation type
27
+ * @param marketplaceId - Optional marketplace identifier
28
+ * @returns Display message for the operation
29
+ */
30
+ export declare function getMarketplaceOperationMessage(operation: MarketplaceOperation, marketplaceId?: string | null): string;
31
+ /**
32
+ * Marketplace slice with reducers for all marketplace-related state changes
33
+ */
34
+ export declare const marketplaceSlice: import("@reduxjs/toolkit").Slice<MarketplaceState, {
35
+ /**
36
+ * Set the marketplaces list
37
+ */
38
+ setMarketplaces: (state: {
39
+ marketplaces: {
40
+ id: string;
41
+ name: string;
42
+ source: {
43
+ source: "git" | "github";
44
+ url?: string | undefined;
45
+ repo?: string | undefined;
46
+ };
47
+ installLocation: string;
48
+ lastUpdated: string;
49
+ pluginCount?: number | undefined;
50
+ autoUpdate?: boolean | undefined;
51
+ }[];
52
+ marketplaceOperation: MarketplaceOperation;
53
+ operationMarketplaceId: string | null;
54
+ confirmRemoveMarketplace: boolean;
55
+ showAddMarketplaceDialog: boolean;
56
+ addMarketplaceError: string | null;
57
+ showMarketplaceActionMenu: boolean;
58
+ actionMenuSelectedIndex: number;
59
+ }, action: PayloadAction<Marketplace[]>) => void;
60
+ /**
61
+ * Start a marketplace operation
62
+ */
63
+ startMarketplaceOperation: (state: {
64
+ marketplaces: {
65
+ id: string;
66
+ name: string;
67
+ source: {
68
+ source: "git" | "github";
69
+ url?: string | undefined;
70
+ repo?: string | undefined;
71
+ };
72
+ installLocation: string;
73
+ lastUpdated: string;
74
+ pluginCount?: number | undefined;
75
+ autoUpdate?: boolean | undefined;
76
+ }[];
77
+ marketplaceOperation: MarketplaceOperation;
78
+ operationMarketplaceId: string | null;
79
+ confirmRemoveMarketplace: boolean;
80
+ showAddMarketplaceDialog: boolean;
81
+ addMarketplaceError: string | null;
82
+ showMarketplaceActionMenu: boolean;
83
+ actionMenuSelectedIndex: number;
84
+ }, action: PayloadAction<{
85
+ operation: "adding" | "removing" | "updating";
86
+ marketplaceId?: string;
87
+ }>) => void;
88
+ /**
89
+ * End the current marketplace operation
90
+ */
91
+ endMarketplaceOperation: (state: {
92
+ marketplaces: {
93
+ id: string;
94
+ name: string;
95
+ source: {
96
+ source: "git" | "github";
97
+ url?: string | undefined;
98
+ repo?: string | undefined;
99
+ };
100
+ installLocation: string;
101
+ lastUpdated: string;
102
+ pluginCount?: number | undefined;
103
+ autoUpdate?: boolean | undefined;
104
+ }[];
105
+ marketplaceOperation: MarketplaceOperation;
106
+ operationMarketplaceId: string | null;
107
+ confirmRemoveMarketplace: boolean;
108
+ showAddMarketplaceDialog: boolean;
109
+ addMarketplaceError: string | null;
110
+ showMarketplaceActionMenu: boolean;
111
+ actionMenuSelectedIndex: number;
112
+ }) => void;
113
+ /**
114
+ * Show remove marketplace confirmation dialog
115
+ */
116
+ showConfirmRemoveMarketplace: (state: {
117
+ marketplaces: {
118
+ id: string;
119
+ name: string;
120
+ source: {
121
+ source: "git" | "github";
122
+ url?: string | undefined;
123
+ repo?: string | undefined;
124
+ };
125
+ installLocation: string;
126
+ lastUpdated: string;
127
+ pluginCount?: number | undefined;
128
+ autoUpdate?: boolean | undefined;
129
+ }[];
130
+ marketplaceOperation: MarketplaceOperation;
131
+ operationMarketplaceId: string | null;
132
+ confirmRemoveMarketplace: boolean;
133
+ showAddMarketplaceDialog: boolean;
134
+ addMarketplaceError: string | null;
135
+ showMarketplaceActionMenu: boolean;
136
+ actionMenuSelectedIndex: number;
137
+ }, action: PayloadAction<string>) => void;
138
+ /**
139
+ * Hide remove marketplace confirmation dialog
140
+ */
141
+ hideConfirmRemoveMarketplace: (state: {
142
+ marketplaces: {
143
+ id: string;
144
+ name: string;
145
+ source: {
146
+ source: "git" | "github";
147
+ url?: string | undefined;
148
+ repo?: string | undefined;
149
+ };
150
+ installLocation: string;
151
+ lastUpdated: string;
152
+ pluginCount?: number | undefined;
153
+ autoUpdate?: boolean | undefined;
154
+ }[];
155
+ marketplaceOperation: MarketplaceOperation;
156
+ operationMarketplaceId: string | null;
157
+ confirmRemoveMarketplace: boolean;
158
+ showAddMarketplaceDialog: boolean;
159
+ addMarketplaceError: string | null;
160
+ showMarketplaceActionMenu: boolean;
161
+ actionMenuSelectedIndex: number;
162
+ }) => void;
163
+ /**
164
+ * Show add marketplace dialog
165
+ */
166
+ showAddMarketplaceDialog: (state: {
167
+ marketplaces: {
168
+ id: string;
169
+ name: string;
170
+ source: {
171
+ source: "git" | "github";
172
+ url?: string | undefined;
173
+ repo?: string | undefined;
174
+ };
175
+ installLocation: string;
176
+ lastUpdated: string;
177
+ pluginCount?: number | undefined;
178
+ autoUpdate?: boolean | undefined;
179
+ }[];
180
+ marketplaceOperation: MarketplaceOperation;
181
+ operationMarketplaceId: string | null;
182
+ confirmRemoveMarketplace: boolean;
183
+ showAddMarketplaceDialog: boolean;
184
+ addMarketplaceError: string | null;
185
+ showMarketplaceActionMenu: boolean;
186
+ actionMenuSelectedIndex: number;
187
+ }) => void;
188
+ /**
189
+ * Hide add marketplace dialog
190
+ */
191
+ hideAddMarketplaceDialog: (state: {
192
+ marketplaces: {
193
+ id: string;
194
+ name: string;
195
+ source: {
196
+ source: "git" | "github";
197
+ url?: string | undefined;
198
+ repo?: string | undefined;
199
+ };
200
+ installLocation: string;
201
+ lastUpdated: string;
202
+ pluginCount?: number | undefined;
203
+ autoUpdate?: boolean | undefined;
204
+ }[];
205
+ marketplaceOperation: MarketplaceOperation;
206
+ operationMarketplaceId: string | null;
207
+ confirmRemoveMarketplace: boolean;
208
+ showAddMarketplaceDialog: boolean;
209
+ addMarketplaceError: string | null;
210
+ showMarketplaceActionMenu: boolean;
211
+ actionMenuSelectedIndex: number;
212
+ }) => void;
213
+ /**
214
+ * Set add marketplace error
215
+ */
216
+ setAddMarketplaceError: (state: {
217
+ marketplaces: {
218
+ id: string;
219
+ name: string;
220
+ source: {
221
+ source: "git" | "github";
222
+ url?: string | undefined;
223
+ repo?: string | undefined;
224
+ };
225
+ installLocation: string;
226
+ lastUpdated: string;
227
+ pluginCount?: number | undefined;
228
+ autoUpdate?: boolean | undefined;
229
+ }[];
230
+ marketplaceOperation: MarketplaceOperation;
231
+ operationMarketplaceId: string | null;
232
+ confirmRemoveMarketplace: boolean;
233
+ showAddMarketplaceDialog: boolean;
234
+ addMarketplaceError: string | null;
235
+ showMarketplaceActionMenu: boolean;
236
+ actionMenuSelectedIndex: number;
237
+ }, action: PayloadAction<string | null>) => void;
238
+ /**
239
+ * Show marketplace action menu
240
+ */
241
+ showMarketplaceActionMenu: (state: {
242
+ marketplaces: {
243
+ id: string;
244
+ name: string;
245
+ source: {
246
+ source: "git" | "github";
247
+ url?: string | undefined;
248
+ repo?: string | undefined;
249
+ };
250
+ installLocation: string;
251
+ lastUpdated: string;
252
+ pluginCount?: number | undefined;
253
+ autoUpdate?: boolean | undefined;
254
+ }[];
255
+ marketplaceOperation: MarketplaceOperation;
256
+ operationMarketplaceId: string | null;
257
+ confirmRemoveMarketplace: boolean;
258
+ showAddMarketplaceDialog: boolean;
259
+ addMarketplaceError: string | null;
260
+ showMarketplaceActionMenu: boolean;
261
+ actionMenuSelectedIndex: number;
262
+ }) => void;
263
+ /**
264
+ * Hide marketplace action menu
265
+ */
266
+ hideMarketplaceActionMenu: (state: {
267
+ marketplaces: {
268
+ id: string;
269
+ name: string;
270
+ source: {
271
+ source: "git" | "github";
272
+ url?: string | undefined;
273
+ repo?: string | undefined;
274
+ };
275
+ installLocation: string;
276
+ lastUpdated: string;
277
+ pluginCount?: number | undefined;
278
+ autoUpdate?: boolean | undefined;
279
+ }[];
280
+ marketplaceOperation: MarketplaceOperation;
281
+ operationMarketplaceId: string | null;
282
+ confirmRemoveMarketplace: boolean;
283
+ showAddMarketplaceDialog: boolean;
284
+ addMarketplaceError: string | null;
285
+ showMarketplaceActionMenu: boolean;
286
+ actionMenuSelectedIndex: number;
287
+ }) => void;
288
+ /**
289
+ * Set action menu selected index
290
+ */
291
+ setActionMenuIndex: (state: {
292
+ marketplaces: {
293
+ id: string;
294
+ name: string;
295
+ source: {
296
+ source: "git" | "github";
297
+ url?: string | undefined;
298
+ repo?: string | undefined;
299
+ };
300
+ installLocation: string;
301
+ lastUpdated: string;
302
+ pluginCount?: number | undefined;
303
+ autoUpdate?: boolean | undefined;
304
+ }[];
305
+ marketplaceOperation: MarketplaceOperation;
306
+ operationMarketplaceId: string | null;
307
+ confirmRemoveMarketplace: boolean;
308
+ showAddMarketplaceDialog: boolean;
309
+ addMarketplaceError: string | null;
310
+ showMarketplaceActionMenu: boolean;
311
+ actionMenuSelectedIndex: number;
312
+ }, action: PayloadAction<number>) => void;
313
+ /**
314
+ * Move action menu selection up or down
315
+ */
316
+ moveActionMenuSelection: (state: {
317
+ marketplaces: {
318
+ id: string;
319
+ name: string;
320
+ source: {
321
+ source: "git" | "github";
322
+ url?: string | undefined;
323
+ repo?: string | undefined;
324
+ };
325
+ installLocation: string;
326
+ lastUpdated: string;
327
+ pluginCount?: number | undefined;
328
+ autoUpdate?: boolean | undefined;
329
+ }[];
330
+ marketplaceOperation: MarketplaceOperation;
331
+ operationMarketplaceId: string | null;
332
+ confirmRemoveMarketplace: boolean;
333
+ showAddMarketplaceDialog: boolean;
334
+ addMarketplaceError: string | null;
335
+ showMarketplaceActionMenu: boolean;
336
+ actionMenuSelectedIndex: number;
337
+ }, action: PayloadAction<"up" | "down">) => void;
338
+ }, "marketplaces", "marketplaces", import("@reduxjs/toolkit").SliceSelectors<MarketplaceState>>;
339
+ export declare const setMarketplaces: import("@reduxjs/toolkit").ActionCreatorWithPayload<Marketplace[], "marketplaces/setMarketplaces">, startMarketplaceOperation: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
340
+ operation: "adding" | "removing" | "updating";
341
+ marketplaceId?: string;
342
+ }, "marketplaces/startMarketplaceOperation">, endMarketplaceOperation: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"marketplaces/endMarketplaceOperation">, showConfirmRemoveMarketplace: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "marketplaces/showConfirmRemoveMarketplace">, hideConfirmRemoveMarketplace: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"marketplaces/hideConfirmRemoveMarketplace">, showAddMarketplaceDialog: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"marketplaces/showAddMarketplaceDialog">, hideAddMarketplaceDialog: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"marketplaces/hideAddMarketplaceDialog">, setAddMarketplaceError: import("@reduxjs/toolkit").ActionCreatorWithPayload<string | null, "marketplaces/setAddMarketplaceError">, showMarketplaceActionMenu: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"marketplaces/showMarketplaceActionMenu">, hideMarketplaceActionMenu: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"marketplaces/hideMarketplaceActionMenu">, setActionMenuIndex: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "marketplaces/setActionMenuIndex">, moveActionMenuSelection: import("@reduxjs/toolkit").ActionCreatorWithPayload<"up" | "down", "marketplaces/moveActionMenuSelection">;
343
+ declare const _default: import("@reduxjs/toolkit").Reducer<MarketplaceState>;
344
+ export default _default;