wave-code 0.13.6 → 0.14.1

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 (80) 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.d.ts.map +1 -1
  4. package/dist/components/ChatInterface.js +1 -1
  5. package/dist/components/ConfirmationSelector.d.ts +0 -1
  6. package/dist/components/ConfirmationSelector.d.ts.map +1 -1
  7. package/dist/components/ConfirmationSelector.js +111 -259
  8. package/dist/components/InputBox.d.ts.map +1 -1
  9. package/dist/components/InputBox.js +2 -2
  10. package/dist/components/MarketplaceAddForm.d.ts.map +1 -1
  11. package/dist/components/MarketplaceAddForm.js +48 -17
  12. package/dist/components/MarketplaceDetail.d.ts.map +1 -1
  13. package/dist/components/MarketplaceDetail.js +2 -1
  14. package/dist/components/MarketplaceList.d.ts.map +1 -1
  15. package/dist/components/MarketplaceList.js +2 -1
  16. package/dist/components/McpManager.d.ts.map +1 -1
  17. package/dist/components/McpManager.js +22 -27
  18. package/dist/components/MessageList.d.ts.map +1 -1
  19. package/dist/components/MessageList.js +4 -6
  20. package/dist/components/PluginDetail.d.ts.map +1 -1
  21. package/dist/components/PluginDetail.js +22 -22
  22. package/dist/components/PluginManagerShell.d.ts +1 -0
  23. package/dist/components/PluginManagerShell.d.ts.map +1 -1
  24. package/dist/components/PluginManagerShell.js +2 -2
  25. package/dist/components/PluginManagerTypes.d.ts +2 -2
  26. package/dist/components/PluginManagerTypes.d.ts.map +1 -1
  27. package/dist/components/TaskNotificationMessage.js +1 -1
  28. package/dist/contexts/useChat.d.ts +1 -0
  29. package/dist/contexts/useChat.d.ts.map +1 -1
  30. package/dist/contexts/useChat.js +128 -102
  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/managers/inputHandlers.d.ts.map +1 -1
  35. package/dist/managers/inputHandlers.js +6 -9
  36. package/dist/managers/inputReducer.d.ts +6 -0
  37. package/dist/managers/inputReducer.d.ts.map +1 -1
  38. package/dist/managers/inputReducer.js +15 -0
  39. package/dist/reducers/backgroundTaskManagerReducer.d.ts +43 -0
  40. package/dist/reducers/backgroundTaskManagerReducer.d.ts.map +1 -0
  41. package/dist/reducers/backgroundTaskManagerReducer.js +23 -0
  42. package/dist/reducers/confirmationReducer.d.ts +26 -0
  43. package/dist/reducers/confirmationReducer.d.ts.map +1 -0
  44. package/dist/reducers/confirmationReducer.js +45 -0
  45. package/dist/reducers/marketplaceAddFormReducer.d.ts +24 -0
  46. package/dist/reducers/marketplaceAddFormReducer.d.ts.map +1 -0
  47. package/dist/reducers/marketplaceAddFormReducer.js +18 -0
  48. package/dist/reducers/mcpManagerReducer.d.ts +16 -0
  49. package/dist/reducers/mcpManagerReducer.d.ts.map +1 -0
  50. package/dist/reducers/mcpManagerReducer.js +15 -0
  51. package/dist/reducers/pluginDetailReducer.d.ts +25 -0
  52. package/dist/reducers/pluginDetailReducer.d.ts.map +1 -0
  53. package/dist/reducers/pluginDetailReducer.js +38 -0
  54. package/dist/reducers/questionReducer.d.ts +69 -0
  55. package/dist/reducers/questionReducer.d.ts.map +1 -0
  56. package/dist/reducers/questionReducer.js +195 -0
  57. package/package.json +2 -2
  58. package/src/components/BackgroundTaskManager.tsx +32 -34
  59. package/src/components/ChatInterface.tsx +0 -1
  60. package/src/components/ConfirmationSelector.tsx +122 -304
  61. package/src/components/InputBox.tsx +7 -1
  62. package/src/components/MarketplaceAddForm.tsx +76 -22
  63. package/src/components/MarketplaceDetail.tsx +4 -0
  64. package/src/components/MarketplaceList.tsx +4 -0
  65. package/src/components/McpManager.tsx +30 -34
  66. package/src/components/MessageList.tsx +10 -14
  67. package/src/components/PluginDetail.tsx +25 -33
  68. package/src/components/PluginManagerShell.tsx +3 -2
  69. package/src/components/PluginManagerTypes.ts +8 -2
  70. package/src/components/TaskNotificationMessage.tsx +1 -1
  71. package/src/contexts/useChat.tsx +57 -24
  72. package/src/hooks/usePluginManager.ts +18 -7
  73. package/src/managers/inputHandlers.ts +6 -8
  74. package/src/managers/inputReducer.ts +19 -0
  75. package/src/reducers/backgroundTaskManagerReducer.ts +60 -0
  76. package/src/reducers/confirmationReducer.ts +74 -0
  77. package/src/reducers/marketplaceAddFormReducer.ts +35 -0
  78. package/src/reducers/mcpManagerReducer.ts +31 -0
  79. package/src/reducers/pluginDetailReducer.ts +58 -0
  80. package/src/reducers/questionReducer.ts +251 -0
@@ -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
+ 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
+ },
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
+ 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
+ }
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
+ setIsCompressing(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 () => {
@@ -357,6 +383,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
357
383
  if (currentConfirmation) {
358
384
  currentConfirmation.reject();
359
385
  }
386
+ agentRef.current?.abortMessage();
360
387
  hideConfirmation();
361
388
  }, [currentConfirmation, hideConfirmation]);
362
389
  const backgroundCurrentTask = useCallback(() => {
@@ -429,10 +456,8 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
429
456
  setIsTaskListVisible((prev) => !prev);
430
457
  }
431
458
  // Handle ESC key to cancel confirmation
432
- if (key.escape) {
433
- if (isConfirmationVisible) {
434
- handleConfirmationCancel();
435
- }
459
+ if (key.escape && isConfirmationVisible) {
460
+ handleConfirmationCancel();
436
461
  }
437
462
  });
438
463
  const contextValue = {
@@ -482,6 +507,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
482
507
  workingDirectory,
483
508
  version,
484
509
  workdir,
510
+ recreateAgent,
485
511
  };
486
512
  return (_jsx(ChatContext.Provider, { value: contextValue, children: children }));
487
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) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"inputHandlers.d.ts","sourceRoot":"","sources":["../../src/managers/inputHandlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputHandlers.d.ts","sourceRoot":"","sources":["../../src/managers/inputHandlers.ts"],"names":[],"mappings":"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"}
@@ -198,15 +198,12 @@ export const handlePasteInput = (state, dispatch, callbacks, input) => {
198
198
  inputString.includes("\n") ||
199
199
  inputString.includes("\r");
200
200
  if (isPasteOperation) {
201
- if (!state.isPasting) {
202
- dispatch({
203
- type: "START_PASTE",
204
- payload: { buffer: inputString, cursorPosition: state.cursorPosition },
205
- });
206
- }
207
- else {
208
- dispatch({ type: "APPEND_PASTE_BUFFER", payload: inputString });
209
- }
201
+ // Dispatch a single action type; the reducer determines start vs append
202
+ // by checking pasteBuffer, avoiding stale state issues
203
+ dispatch({
204
+ type: "APPEND_PASTE_CHUNK",
205
+ payload: { chunk: inputString, cursorPosition: state.cursorPosition },
206
+ });
210
207
  }
211
208
  else {
212
209
  let char = inputString;
@@ -175,6 +175,12 @@ export type InputAction = {
175
175
  } | {
176
176
  type: "APPEND_PASTE_BUFFER";
177
177
  payload: string;
178
+ } | {
179
+ type: "APPEND_PASTE_CHUNK";
180
+ payload: {
181
+ chunk: string;
182
+ cursorPosition: number;
183
+ };
178
184
  } | {
179
185
  type: "END_PASTE";
180
186
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"inputReducer.d.ts","sourceRoot":"","sources":["../../src/managers/inputReducer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputReducer.d.ts","sourceRoot":"","sources":["../../src/managers/inputReducer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,cAAc,EACd,MAAM,EACN,WAAW,EACX,OAAO,EACR,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,yBAAyB,CAAC,EAAE,CAC1B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;IACV,4BAA4B,CAAC,EAAE,CAC7B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;IACV,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,kCAAkC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACxD,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EAClD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACjC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IACrC,sBAAsB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC;QACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,yBAAyB,EAAE,OAAO,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B,EAAE,MAAM,CAAC;IACnC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,eAAO,MAAM,YAAY,EAAE,UAuC1B,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,0BAA0B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,yBAAyB,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,yBAAyB,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,0BAA0B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,kCAAkC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,8BAA8B,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChD;IACE,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,GACD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IACE,IAAI,EAAE,kCAAkC,CAAC;IACzC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,GACD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,0BAA0B,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;CAAE,CAAC;AAE1D,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,UAAU,CAgWZ"}
@@ -244,6 +244,21 @@ export function inputReducer(state, action) {
244
244
  cursorPosition: 0,
245
245
  historyIndex: -1,
246
246
  };
247
+ case "APPEND_PASTE_CHUNK": {
248
+ // The reducer determines if this is a new paste or a continuation
249
+ // by checking if pasteBuffer is already set. This avoids the
250
+ // handler needing to track isPasting state, which can be stale
251
+ // when multiple dispatches fire before React state updates.
252
+ const isNewPaste = !state.pasteBuffer;
253
+ return {
254
+ ...state,
255
+ isPasting: true,
256
+ pasteBuffer: state.pasteBuffer + action.payload.chunk,
257
+ initialPasteCursorPosition: isNewPaste
258
+ ? action.payload.cursorPosition
259
+ : state.initialPasteCursorPosition,
260
+ };
261
+ }
247
262
  case "START_PASTE":
248
263
  return {
249
264
  ...state,
@@ -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,26 @@
1
+ import type { PermissionDecision } from "wave-agent-sdk";
2
+ export interface ConfirmationState {
3
+ selectedOption: "clear" | "auto" | "allow" | "alternative";
4
+ alternativeText: string;
5
+ alternativeCursorPosition: number;
6
+ hasUserInput: boolean;
7
+ decision: PermissionDecision | null;
8
+ }
9
+ export type ConfirmationAction = {
10
+ type: "SELECT_OPTION";
11
+ option: ConfirmationState["selectedOption"];
12
+ } | {
13
+ type: "INSERT_TEXT";
14
+ text: string;
15
+ } | {
16
+ type: "BACKSPACE";
17
+ } | {
18
+ type: "MOVE_CURSOR_LEFT";
19
+ } | {
20
+ type: "MOVE_CURSOR_RIGHT";
21
+ } | {
22
+ type: "CONFIRM";
23
+ decision: PermissionDecision;
24
+ };
25
+ export declare function confirmationReducer(state: ConfirmationState, action: ConfirmationAction): ConfirmationState;
26
+ //# sourceMappingURL=confirmationReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmationReducer.d.ts","sourceRoot":"","sources":["../../src/reducers/confirmationReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,EAAE,MAAM,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEtD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,kBAAkB,GACzB,iBAAiB,CAoDnB"}
@@ -0,0 +1,45 @@
1
+ export function confirmationReducer(state, action) {
2
+ switch (action.type) {
3
+ case "SELECT_OPTION":
4
+ return { ...state, selectedOption: action.option };
5
+ case "INSERT_TEXT": {
6
+ const nextText = state.alternativeText.slice(0, state.alternativeCursorPosition) +
7
+ action.text +
8
+ state.alternativeText.slice(state.alternativeCursorPosition);
9
+ return {
10
+ ...state,
11
+ selectedOption: "alternative",
12
+ alternativeText: nextText,
13
+ alternativeCursorPosition: state.alternativeCursorPosition + action.text.length,
14
+ hasUserInput: true,
15
+ };
16
+ }
17
+ case "BACKSPACE": {
18
+ if (state.alternativeCursorPosition <= 0)
19
+ return state;
20
+ const nextText = state.alternativeText.slice(0, state.alternativeCursorPosition - 1) +
21
+ state.alternativeText.slice(state.alternativeCursorPosition);
22
+ return {
23
+ ...state,
24
+ selectedOption: "alternative",
25
+ alternativeText: nextText,
26
+ alternativeCursorPosition: state.alternativeCursorPosition - 1,
27
+ hasUserInput: nextText.length > 0,
28
+ };
29
+ }
30
+ case "MOVE_CURSOR_LEFT":
31
+ return {
32
+ ...state,
33
+ alternativeCursorPosition: Math.max(0, state.alternativeCursorPosition - 1),
34
+ };
35
+ case "MOVE_CURSOR_RIGHT":
36
+ return {
37
+ ...state,
38
+ alternativeCursorPosition: Math.min(state.alternativeText.length, state.alternativeCursorPosition + 1),
39
+ };
40
+ case "CONFIRM":
41
+ return { ...state, decision: action.decision };
42
+ default:
43
+ return state;
44
+ }
45
+ }
@@ -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
+ }