wave-code 0.7.2 → 0.8.0

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 (102) hide show
  1. package/dist/cli.d.ts +2 -4
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +24 -52
  4. package/dist/components/App.d.ts +3 -4
  5. package/dist/components/App.d.ts.map +1 -1
  6. package/dist/components/App.js +49 -6
  7. package/dist/components/BangDisplay.d.ts +9 -0
  8. package/dist/components/BangDisplay.d.ts.map +1 -0
  9. package/dist/components/{CommandOutputDisplay.js → BangDisplay.js} +1 -1
  10. package/dist/components/ChatInterface.d.ts.map +1 -1
  11. package/dist/components/ChatInterface.js +3 -2
  12. package/dist/components/CommandSelector.d.ts.map +1 -1
  13. package/dist/components/CommandSelector.js +18 -2
  14. package/dist/components/ConfirmationSelector.d.ts.map +1 -1
  15. package/dist/components/ConfirmationSelector.js +105 -8
  16. package/dist/components/HelpView.d.ts.map +1 -1
  17. package/dist/components/HelpView.js +2 -0
  18. package/dist/components/InputBox.d.ts.map +1 -1
  19. package/dist/components/InputBox.js +9 -3
  20. package/dist/components/MarketplaceAddForm.d.ts.map +1 -1
  21. package/dist/components/MarketplaceAddForm.js +13 -6
  22. package/dist/components/MarketplaceDetail.d.ts.map +1 -1
  23. package/dist/components/MarketplaceDetail.js +8 -3
  24. package/dist/components/MessageBlockItem.js +2 -2
  25. package/dist/components/MessageList.d.ts +4 -1
  26. package/dist/components/MessageList.d.ts.map +1 -1
  27. package/dist/components/MessageList.js +15 -8
  28. package/dist/components/PluginDetail.d.ts.map +1 -1
  29. package/dist/components/PluginDetail.js +14 -3
  30. package/dist/components/PluginManagerShell.d.ts.map +1 -1
  31. package/dist/components/PluginManagerShell.js +3 -3
  32. package/dist/components/PluginManagerTypes.d.ts +2 -0
  33. package/dist/components/PluginManagerTypes.d.ts.map +1 -1
  34. package/dist/components/SessionSelector.d.ts.map +1 -1
  35. package/dist/components/SessionSelector.js +5 -5
  36. package/dist/components/StatusCommand.d.ts +6 -0
  37. package/dist/components/StatusCommand.d.ts.map +1 -0
  38. package/dist/components/StatusCommand.js +28 -0
  39. package/dist/components/WorktreeExitPrompt.d.ts +13 -0
  40. package/dist/components/WorktreeExitPrompt.d.ts.map +1 -0
  41. package/dist/components/WorktreeExitPrompt.js +26 -0
  42. package/dist/contexts/useChat.d.ts +9 -5
  43. package/dist/contexts/useChat.d.ts.map +1 -1
  44. package/dist/contexts/useChat.js +38 -8
  45. package/dist/contracts/status.d.ts +8 -0
  46. package/dist/contracts/status.d.ts.map +1 -0
  47. package/dist/contracts/status.js +1 -0
  48. package/dist/hooks/useInputManager.d.ts +2 -0
  49. package/dist/hooks/useInputManager.d.ts.map +1 -1
  50. package/dist/hooks/useInputManager.js +12 -0
  51. package/dist/hooks/usePluginManager.d.ts.map +1 -1
  52. package/dist/hooks/usePluginManager.js +41 -13
  53. package/dist/hooks/useTasks.js +2 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +53 -4
  56. package/dist/managers/InputManager.d.ts +6 -0
  57. package/dist/managers/InputManager.d.ts.map +1 -1
  58. package/dist/managers/InputManager.js +32 -13
  59. package/dist/print-cli.d.ts +2 -4
  60. package/dist/print-cli.d.ts.map +1 -1
  61. package/dist/print-cli.js +31 -2
  62. package/dist/session-selector-cli.d.ts +3 -1
  63. package/dist/session-selector-cli.d.ts.map +1 -1
  64. package/dist/session-selector-cli.js +2 -2
  65. package/dist/types.d.ts +11 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +1 -0
  68. package/dist/utils/worktree.d.ts +23 -0
  69. package/dist/utils/worktree.d.ts.map +1 -0
  70. package/dist/utils/worktree.js +135 -0
  71. package/package.json +2 -2
  72. package/src/cli.tsx +36 -59
  73. package/src/components/App.tsx +99 -11
  74. package/src/components/{CommandOutputDisplay.tsx → BangDisplay.tsx} +4 -4
  75. package/src/components/ChatInterface.tsx +8 -0
  76. package/src/components/CommandSelector.tsx +18 -1
  77. package/src/components/ConfirmationSelector.tsx +118 -9
  78. package/src/components/HelpView.tsx +2 -0
  79. package/src/components/InputBox.tsx +11 -1
  80. package/src/components/MarketplaceAddForm.tsx +21 -8
  81. package/src/components/MarketplaceDetail.tsx +19 -4
  82. package/src/components/MessageBlockItem.tsx +3 -3
  83. package/src/components/MessageList.tsx +47 -23
  84. package/src/components/PluginDetail.tsx +30 -6
  85. package/src/components/PluginManagerShell.tsx +24 -6
  86. package/src/components/PluginManagerTypes.ts +2 -0
  87. package/src/components/SessionSelector.tsx +33 -16
  88. package/src/components/StatusCommand.tsx +94 -0
  89. package/src/components/WorktreeExitPrompt.tsx +86 -0
  90. package/src/contexts/useChat.tsx +57 -13
  91. package/src/contracts/status.ts +7 -0
  92. package/src/hooks/useInputManager.ts +12 -0
  93. package/src/hooks/usePluginManager.ts +47 -13
  94. package/src/hooks/useTasks.ts +2 -2
  95. package/src/index.ts +71 -12
  96. package/src/managers/InputManager.ts +37 -15
  97. package/src/print-cli.ts +48 -5
  98. package/src/session-selector-cli.tsx +6 -2
  99. package/src/types.ts +11 -0
  100. package/src/utils/worktree.ts +164 -0
  101. package/dist/components/CommandOutputDisplay.d.ts +0 -9
  102. package/dist/components/CommandOutputDisplay.d.ts.map +0 -1
@@ -6,17 +6,38 @@ export function usePluginManager() {
6
6
  selectedId: null,
7
7
  isLoading: true,
8
8
  error: null,
9
+ successMessage: null,
9
10
  searchQuery: "",
10
11
  });
11
12
  const [marketplaces, setMarketplaces] = useState([]);
12
13
  const [installedPlugins, setInstalledPlugins] = useState([]);
13
14
  const [discoverablePlugins, setDiscoverablePlugins] = useState([]);
14
15
  const pluginCore = useMemo(() => new PluginCore(), []);
16
+ const clearPluginFeedback = useCallback(() => {
17
+ setState((prev) => ({
18
+ ...prev,
19
+ error: null,
20
+ successMessage: null,
21
+ }));
22
+ }, []);
23
+ const setSuccessMessage = useCallback((message) => {
24
+ setState((prev) => ({
25
+ ...prev,
26
+ successMessage: message,
27
+ error: null,
28
+ }));
29
+ setTimeout(() => {
30
+ setState((prev) => ({
31
+ ...prev,
32
+ successMessage: prev.successMessage === message ? null : prev.successMessage,
33
+ }));
34
+ }, 5000);
35
+ }, [setState]);
15
36
  const refresh = useCallback(async () => {
37
+ clearPluginFeedback();
16
38
  setState((prev) => ({
17
39
  ...prev,
18
40
  isLoading: true,
19
- error: null,
20
41
  }));
21
42
  try {
22
43
  const [mks, installed, enabledMap] = await Promise.all([
@@ -78,14 +99,15 @@ export function usePluginManager() {
78
99
  setState((prev) => ({ ...prev, selectedId: id }));
79
100
  }, []);
80
101
  const addMarketplace = useCallback(async (source) => {
102
+ clearPluginFeedback();
81
103
  setState((prev) => ({
82
104
  ...prev,
83
105
  isLoading: true,
84
- error: null,
85
106
  }));
86
107
  try {
87
108
  await pluginCore.addMarketplace(source);
88
109
  await refresh();
110
+ setSuccessMessage(`Marketplace added successfully`);
89
111
  }
90
112
  catch (error) {
91
113
  setState((prev) => ({
@@ -94,16 +116,17 @@ export function usePluginManager() {
94
116
  error: error instanceof Error ? error.message : String(error),
95
117
  }));
96
118
  }
97
- }, [pluginCore, refresh]);
119
+ }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
98
120
  const removeMarketplace = useCallback(async (name) => {
121
+ clearPluginFeedback();
99
122
  setState((prev) => ({
100
123
  ...prev,
101
124
  isLoading: true,
102
- error: null,
103
125
  }));
104
126
  try {
105
127
  await pluginCore.removeMarketplace(name);
106
128
  await refresh();
129
+ setSuccessMessage(`Marketplace '${name}' removed successfully`);
107
130
  }
108
131
  catch (error) {
109
132
  setState((prev) => ({
@@ -112,16 +135,17 @@ export function usePluginManager() {
112
135
  error: error instanceof Error ? error.message : String(error),
113
136
  }));
114
137
  }
115
- }, [pluginCore, refresh]);
138
+ }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
116
139
  const updateMarketplace = useCallback(async (name) => {
140
+ clearPluginFeedback();
117
141
  setState((prev) => ({
118
142
  ...prev,
119
143
  isLoading: true,
120
- error: null,
121
144
  }));
122
145
  try {
123
146
  await pluginCore.updateMarketplace(name);
124
147
  await refresh();
148
+ setSuccessMessage(`Marketplace '${name}' updated successfully`);
125
149
  }
126
150
  catch (error) {
127
151
  setState((prev) => ({
@@ -130,17 +154,18 @@ export function usePluginManager() {
130
154
  error: error instanceof Error ? error.message : String(error),
131
155
  }));
132
156
  }
133
- }, [pluginCore, refresh]);
157
+ }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
134
158
  const installPlugin = useCallback(async (name, marketplace, scope = "project") => {
159
+ clearPluginFeedback();
135
160
  setState((prev) => ({
136
161
  ...prev,
137
162
  isLoading: true,
138
- error: null,
139
163
  }));
140
164
  try {
141
165
  const pluginId = `${name}@${marketplace}`;
142
166
  await pluginCore.installPlugin(pluginId, scope);
143
167
  await refresh();
168
+ setSuccessMessage(`Plugin '${name}' installed successfully`);
144
169
  }
145
170
  catch (error) {
146
171
  setState((prev) => ({
@@ -149,17 +174,18 @@ export function usePluginManager() {
149
174
  error: error instanceof Error ? error.message : String(error),
150
175
  }));
151
176
  }
152
- }, [pluginCore, refresh]);
177
+ }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
153
178
  const uninstallPlugin = useCallback(async (name, marketplace) => {
179
+ clearPluginFeedback();
154
180
  setState((prev) => ({
155
181
  ...prev,
156
182
  isLoading: true,
157
- error: null,
158
183
  }));
159
184
  try {
160
185
  const pluginId = `${name}@${marketplace}`;
161
186
  await pluginCore.uninstallPlugin(pluginId);
162
187
  await refresh();
188
+ setSuccessMessage(`Plugin '${name}' uninstalled successfully`);
163
189
  }
164
190
  catch (error) {
165
191
  setState((prev) => ({
@@ -168,17 +194,18 @@ export function usePluginManager() {
168
194
  error: error instanceof Error ? error.message : String(error),
169
195
  }));
170
196
  }
171
- }, [pluginCore, refresh]);
197
+ }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
172
198
  const updatePlugin = useCallback(async (name, marketplace) => {
199
+ clearPluginFeedback();
173
200
  setState((prev) => ({
174
201
  ...prev,
175
202
  isLoading: true,
176
- error: null,
177
203
  }));
178
204
  try {
179
205
  const pluginId = `${name}@${marketplace}`;
180
206
  await pluginCore.updatePlugin(pluginId);
181
207
  await refresh();
208
+ setSuccessMessage(`Plugin '${name}' updated successfully`);
182
209
  }
183
210
  catch (error) {
184
211
  setState((prev) => ({
@@ -187,7 +214,7 @@ export function usePluginManager() {
187
214
  error: error instanceof Error ? error.message : String(error),
188
215
  }));
189
216
  }
190
- }, [pluginCore, refresh]);
217
+ }, [pluginCore, refresh, clearPluginFeedback, setSuccessMessage]);
191
218
  return {
192
219
  state,
193
220
  marketplaces,
@@ -203,6 +230,7 @@ export function usePluginManager() {
203
230
  uninstallPlugin,
204
231
  updatePlugin,
205
232
  refresh,
233
+ clearPluginFeedback,
206
234
  },
207
235
  };
208
236
  }
@@ -1,5 +1,5 @@
1
1
  import { useChat } from "../contexts/useChat.js";
2
2
  export const useTasks = () => {
3
- const { sessionTasks } = useChat();
4
- return sessionTasks;
3
+ const { tasks } = useChat();
4
+ return tasks;
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,wBAAsB,IAAI,kBAmRzB;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,wBAAsB,IAAI,kBAqUzB;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,19 @@
1
1
  import yargs from "yargs";
2
2
  import { hideBin } from "yargs/helpers";
3
3
  import { startCli } from "./cli.js";
4
+ import { generateRandomName } from "wave-agent-sdk";
5
+ import { createWorktree } from "./utils/worktree.js";
6
+ import path from "path";
7
+ import { readFileSync } from "fs";
8
+ import { fileURLToPath } from "url";
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ const packageJsonPath = path.resolve(__dirname, "../package.json");
11
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
12
+ const version = packageJson.version;
4
13
  // Export main function for external use
5
14
  export async function main() {
6
15
  try {
16
+ const originalCwd = process.cwd();
7
17
  const argv = await yargs(hideBin(process.argv))
8
18
  .option("restore", {
9
19
  alias: "r",
@@ -16,6 +26,12 @@ export async function main() {
16
26
  description: "Continue from last session",
17
27
  type: "boolean",
18
28
  global: false,
29
+ })
30
+ .option("worktree", {
31
+ alias: "w",
32
+ description: "Start session in a git worktree (optional name)",
33
+ type: "string",
34
+ global: false,
19
35
  })
20
36
  .option("print", {
21
37
  alias: "p",
@@ -44,6 +60,11 @@ export async function main() {
44
60
  description: 'Specify a comma-separated list of tools to enable (e.g., \'Bash,Read,Write\'). Use "" to disable all, "default" for all.',
45
61
  type: "string",
46
62
  global: false,
63
+ })
64
+ .option("model", {
65
+ description: "Specify the AI model to use",
66
+ type: "string",
67
+ global: false,
47
68
  })
48
69
  .command("plugin", "Manage plugins and marketplaces", (yargs) => {
49
70
  return yargs
@@ -149,13 +170,29 @@ export async function main() {
149
170
  return tools.split(",").map((t) => t.trim());
150
171
  };
151
172
  const tools = parseTools(argv.tools);
173
+ // Resolve plugin directories to absolute paths before any worktree logic
174
+ const pluginDirs = argv.pluginDir?.map((dir) => path.resolve(originalCwd, dir));
175
+ let worktreeSession;
176
+ if (argv.worktree !== undefined ||
177
+ process.argv.includes("-w") ||
178
+ process.argv.includes("--worktree")) {
179
+ let name = argv.worktree;
180
+ if (!name || name === "") {
181
+ name = generateRandomName();
182
+ }
183
+ worktreeSession = createWorktree(name, originalCwd);
184
+ }
185
+ const workdir = worktreeSession?.path || originalCwd;
186
+ if (worktreeSession) {
187
+ process.chdir(workdir);
188
+ }
152
189
  // Handle restore session command
153
190
  if (argv.restore === "" ||
154
191
  (process.argv.includes("-r") && argv.restore === undefined) ||
155
192
  (process.argv.includes("--restore") && argv.restore === undefined)) {
156
193
  // Interactive session selection
157
194
  const { startSessionSelectorCli } = await import("./session-selector-cli.js");
158
- const selectedSessionId = await startSessionSelectorCli();
195
+ const selectedSessionId = await startSessionSelectorCli({ workdir });
159
196
  if (!selectedSessionId) {
160
197
  return;
161
198
  }
@@ -163,8 +200,12 @@ export async function main() {
163
200
  return startCli({
164
201
  restoreSessionId: selectedSessionId,
165
202
  bypassPermissions: argv.dangerouslySkipPermissions,
166
- pluginDirs: argv.pluginDir,
203
+ pluginDirs,
167
204
  tools,
205
+ worktreeSession,
206
+ workdir,
207
+ version,
208
+ model: argv.model,
168
209
  });
169
210
  }
170
211
  // Handle print mode directly
@@ -176,16 +217,24 @@ export async function main() {
176
217
  message: argv.print,
177
218
  showStats: argv.showStats,
178
219
  bypassPermissions: argv.dangerouslySkipPermissions,
179
- pluginDirs: argv.pluginDir,
220
+ pluginDirs,
180
221
  tools,
222
+ worktreeSession,
223
+ workdir,
224
+ version,
225
+ model: argv.model,
181
226
  });
182
227
  }
183
228
  await startCli({
184
229
  restoreSessionId: argv.restore,
185
230
  continueLastSession: argv.continue,
186
231
  bypassPermissions: argv.dangerouslySkipPermissions,
187
- pluginDirs: argv.pluginDir,
232
+ pluginDirs,
188
233
  tools,
234
+ worktreeSession,
235
+ workdir,
236
+ version,
237
+ model: argv.model,
189
238
  });
190
239
  }
191
240
  catch (error) {
@@ -16,6 +16,7 @@ export interface InputManagerCallbacks {
16
16
  onMcpManagerStateChange?: (show: boolean) => void;
17
17
  onRewindManagerStateChange?: (show: boolean) => void;
18
18
  onHelpStateChange?: (show: boolean) => void;
19
+ onStatusCommandStateChange?: (show: boolean) => void;
19
20
  onImagesStateChange?: (images: AttachedImage[]) => void;
20
21
  onSendMessage?: (content: string, images?: Array<{
21
22
  path: string;
@@ -23,6 +24,7 @@ export interface InputManagerCallbacks {
23
24
  }>) => void | Promise<void>;
24
25
  onHasSlashCommand?: (commandId: string) => boolean;
25
26
  onAbortMessage?: () => void;
27
+ onClearMessages?: () => void;
26
28
  onBackgroundCurrentTask?: () => void;
27
29
  onResetHistoryNavigation?: () => void;
28
30
  onPermissionModeChange?: (mode: PermissionMode) => void;
@@ -53,6 +55,7 @@ export declare class InputManager {
53
55
  private showMcpManager;
54
56
  private showRewindManager;
55
57
  private showHelp;
58
+ private showStatusCommand;
56
59
  private permissionMode;
57
60
  private selectorJustUsed;
58
61
  private callbacks;
@@ -122,7 +125,10 @@ export declare class InputManager {
122
125
  setShowRewindManager(show: boolean): void;
123
126
  getShowHelp(): boolean;
124
127
  setShowHelp(show: boolean): void;
128
+ getShowStatusCommand(): boolean;
129
+ setShowStatusCommand(show: boolean): void;
125
130
  getPermissionMode(): PermissionMode;
131
+ isAnySelectorOrManagerActive(): boolean;
126
132
  setPermissionMode(mode: PermissionMode): void;
127
133
  cyclePermissionMode(): void;
128
134
  handleSubmit(attachedImages: Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAEL,cAAc,EACd,MAAM,EAEP,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;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,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,KAC/C,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,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IACrC,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,sBAAsB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IAEvB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,cAAc,CAAa;IAGnC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,uBAAuB,CAA+B;IAG9D,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,kBAAkB,CAAc;IAGxC,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,kBAAkB,CAAc;IAGxC,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,0BAA0B,CAAa;IAC/C,OAAO,CAAC,SAAS,CAAkB;IAGnC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,WAAW,CAAkC;IAGrD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAa;IAGnC,OAAO,CAAC,yBAAyB,CAAkB;IACnD,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,iBAAiB,CAAkB;IAG3C,OAAO,CAAC,cAAc,CAA6B;IAGnD,OAAO,CAAC,gBAAgB,CAAkB;IAE1C,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,SAAS,GAAE,qBAA0B;IAMjD,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAQzD,YAAY,IAAI,MAAM;IAItB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKhC,iBAAiB,IAAI,MAAM;IAI3B,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQzC,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,IAAI,GAC9D,IAAI;IAeP,kBAAkB,CAChB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,IAAI,GAC9D,IAAI;IAiBP,UAAU,IAAI,IAAI;IAOlB,cAAc,IAAI,IAAI;IAItB,eAAe,IAAI,IAAI;YAKT,WAAW;IAsBzB,OAAO,CAAC,oBAAoB;IAc5B,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiB5C,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClC,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IA4BD,sBAAsB,IAAI,IAAI;IAS9B,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IASnD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ/C,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS7C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;QACpC,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IAqED,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;QACpC,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IA0BD,yBAAyB,IAAI,IAAI;IAQjC,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAStD,oBAAoB,IAAI,OAAO;IAI/B,uBAAuB,IAAI,OAAO;IAIlC,oBAAoB;;;;;;IASpB,uBAAuB;;;;;IASvB,OAAO,CAAC,qCAAqC;IAkB7C,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqB1C,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAOpD,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgBhD,gBAAgB,IAAI,IAAI;IAKxB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAoErC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa;IAY5D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOlC,WAAW,IAAI,IAAI;IAKnB,iBAAiB,IAAI,aAAa,EAAE;IAI9B,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAsB1C,4BAA4B,IAAI,OAAO;IAIvC,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKjD,iBAAiB,IAAI,OAAO;IAI5B,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKtC,oBAAoB,IAAI,OAAO;IAI/B,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKzC,WAAW,IAAI,OAAO;IAItB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKhC,oBAAoB,IAAI,OAAO;IAI/B,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAMzC,iBAAiB,IAAI,cAAc;IAInC,4BAA4B,IAAI,OAAO;IAavC,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAI7C,mBAAmB,IAAI,IAAI;IAerB,YAAY,CAChB,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACrE,SAAS,GAAE,OAAe,EAC1B,gBAAgB,GAAE,OAAe,GAChC,OAAO,CAAC,IAAI,CAAC;IA2ChB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO;IAkDrD,qBAAqB,IAAI,IAAI;IAM7B,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7C,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ/C,yBAAyB,IAAI,IAAI;IAO3B,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACrE,SAAS,GAAE,OAAe,EAC1B,gBAAgB,GAAE,OAAe,EACjC,WAAW,CAAC,EAAE,MAAM,IAAI,GACvB,OAAO,CAAC,OAAO,CAAC;IAkFb,WAAW,CACf,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACrE,SAAS,GAAE,OAAe,EAC1B,gBAAgB,GAAE,OAAe,EACjC,WAAW,CAAC,EAAE,MAAM,IAAI,GACvB,OAAO,CAAC,OAAO,CAAC;IAsEnB,OAAO,IAAI,IAAI;CAUhB"}
@@ -34,6 +34,7 @@ export class InputManager {
34
34
  this.showMcpManager = false;
35
35
  this.showRewindManager = false;
36
36
  this.showHelp = false;
37
+ this.showStatusCommand = false;
37
38
  // Permission mode state
38
39
  this.permissionMode = "default";
39
40
  // Flag to prevent handleInput conflicts when selector selection occurs
@@ -208,7 +209,11 @@ export class InputManager {
208
209
  }
209
210
  // If not an agent command or execution failed, check local commands
210
211
  if (!commandExecuted) {
211
- if (command === "tasks") {
212
+ if (command === "clear") {
213
+ this.callbacks.onClearMessages?.();
214
+ commandExecuted = true;
215
+ }
216
+ else if (command === "tasks") {
212
217
  this.setShowBackgroundTaskManager(true);
213
218
  commandExecuted = true;
214
219
  }
@@ -224,6 +229,10 @@ export class InputManager {
224
229
  this.setShowHelp(true);
225
230
  commandExecuted = true;
226
231
  }
232
+ else if (command === "status") {
233
+ this.setShowStatusCommand(true);
234
+ commandExecuted = true;
235
+ }
227
236
  }
228
237
  })();
229
238
  this.handleCancelCommandSelect();
@@ -473,10 +482,27 @@ export class InputManager {
473
482
  this.showHelp = show;
474
483
  this.callbacks.onHelpStateChange?.(show);
475
484
  }
485
+ getShowStatusCommand() {
486
+ return this.showStatusCommand;
487
+ }
488
+ setShowStatusCommand(show) {
489
+ this.showStatusCommand = show;
490
+ this.callbacks.onStatusCommandStateChange?.(show);
491
+ }
476
492
  // Permission mode methods
477
493
  getPermissionMode() {
478
494
  return this.permissionMode;
479
495
  }
496
+ isAnySelectorOrManagerActive() {
497
+ return (this.showFileSelector ||
498
+ this.showCommandSelector ||
499
+ this.showHistorySearch ||
500
+ this.showBackgroundTaskManager ||
501
+ this.showMcpManager ||
502
+ this.showRewindManager ||
503
+ this.showHelp ||
504
+ this.showStatusCommand);
505
+ }
480
506
  setPermissionMode(mode) {
481
507
  this.permissionMode = mode;
482
508
  }
@@ -664,9 +690,7 @@ export class InputManager {
664
690
  // Handle interrupt request - use Esc key to interrupt AI request or command
665
691
  if (key.escape &&
666
692
  (isLoading || isCommandRunning) &&
667
- !this.showBackgroundTaskManager &&
668
- !this.showMcpManager &&
669
- !this.showRewindManager) {
693
+ !this.isAnySelectorOrManagerActive()) {
670
694
  // Unified interrupt for AI message generation and command execution
671
695
  this.callbacks.onAbortMessage?.();
672
696
  return true;
@@ -678,18 +702,13 @@ export class InputManager {
678
702
  return true;
679
703
  }
680
704
  // Check if any selector is active
681
- if (this.showFileSelector ||
682
- this.showCommandSelector ||
683
- this.showHistorySearch ||
684
- this.showBackgroundTaskManager ||
685
- this.showMcpManager ||
686
- this.showRewindManager ||
687
- this.showHelp) {
705
+ if (this.isAnySelectorOrManagerActive()) {
688
706
  if (this.showBackgroundTaskManager ||
689
707
  this.showMcpManager ||
690
708
  this.showRewindManager ||
691
- this.showHelp) {
692
- // Task manager, MCP manager, Rewind and Help don't need to handle input, handled by component itself
709
+ this.showHelp ||
710
+ this.showStatusCommand) {
711
+ // Task manager, MCP manager, Rewind, Help and Status don't need to handle input, handled by component itself
693
712
  // Return true to indicate we've "handled" it (by ignoring it) so it doesn't leak to normal input
694
713
  return true;
695
714
  }
@@ -1,11 +1,9 @@
1
- export interface PrintCliOptions {
1
+ import { BaseAppProps } from "./types.js";
2
+ export interface PrintCliOptions extends BaseAppProps {
2
3
  restoreSessionId?: string;
3
4
  continueLastSession?: boolean;
4
5
  message?: string;
5
6
  showStats?: boolean;
6
- bypassPermissions?: boolean;
7
- pluginDirs?: string[];
8
- tools?: string[];
9
7
  }
10
8
  export declare function startPrintCli(options: PrintCliOptions): Promise<void>;
11
9
  //# sourceMappingURL=print-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgK3E"}
1
+ {"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsM3E"}
package/dist/print-cli.js CHANGED
@@ -1,5 +1,6 @@
1
- import { Agent } from "wave-agent-sdk";
1
+ import { Agent, hasUncommittedChanges, hasNewCommits, getDefaultRemoteBranch, } from "wave-agent-sdk";
2
2
  import { displayUsageSummary } from "./utils/usageSummary.js";
3
+ import { removeWorktree } from "./utils/worktree.js";
3
4
  function displayTimingInfo(startTime, showStats) {
4
5
  // Skip timing info in test environment or if stats are disabled
5
6
  if (process.env.NODE_ENV === "test" || process.env.VITEST || !showStats) {
@@ -13,7 +14,7 @@ function displayTimingInfo(startTime, showStats) {
13
14
  }
14
15
  export async function startPrintCli(options) {
15
16
  const startTime = new Date();
16
- const { restoreSessionId, continueLastSession, message, showStats = false, bypassPermissions, pluginDirs, tools, } = options;
17
+ const { restoreSessionId, continueLastSession, message, showStats = false, bypassPermissions, pluginDirs, tools, worktreeSession, workdir, model, } = options;
17
18
  if ((!message || message.trim() === "") &&
18
19
  !continueLastSession &&
19
20
  !restoreSessionId) {
@@ -98,6 +99,8 @@ export async function startPrintCli(options) {
98
99
  permissionMode: bypassPermissions ? "bypassPermissions" : undefined,
99
100
  plugins: pluginDirs?.map((path) => ({ type: "local", path })),
100
101
  tools,
102
+ workdir,
103
+ model,
101
104
  // 保持流式模式以获得更好的命令行用户体验
102
105
  });
103
106
  // Send message if provided and not empty
@@ -119,6 +122,19 @@ export async function startPrintCli(options) {
119
122
  displayTimingInfo(startTime, showStats);
120
123
  // Destroy agent and exit after sendMessage completes
121
124
  await agent.destroy();
125
+ // Handle worktree cleanup for print mode
126
+ if (worktreeSession) {
127
+ const cwd = workdir || worktreeSession.path;
128
+ const baseBranch = getDefaultRemoteBranch(cwd);
129
+ const hasChanges = hasUncommittedChanges(cwd);
130
+ const hasCommits = hasNewCommits(cwd, baseBranch);
131
+ if (!hasChanges && !hasCommits) {
132
+ removeWorktree(worktreeSession);
133
+ }
134
+ else {
135
+ process.stdout.write(`\n⚠️ Worktree '${worktreeSession.name}' has changes or commits. Keeping it at: ${worktreeSession.path}\n`);
136
+ }
137
+ }
122
138
  process.exit(0);
123
139
  }
124
140
  catch (error) {
@@ -138,6 +154,19 @@ export async function startPrintCli(options) {
138
154
  // Display timing information even on error
139
155
  displayTimingInfo(startTime, showStats);
140
156
  await agent.destroy();
157
+ // Handle worktree cleanup for print mode even on error
158
+ if (worktreeSession) {
159
+ const cwd = workdir || worktreeSession.path;
160
+ const baseBranch = getDefaultRemoteBranch(cwd);
161
+ const hasChanges = hasUncommittedChanges(cwd);
162
+ const hasCommits = hasNewCommits(cwd, baseBranch);
163
+ if (!hasChanges && !hasCommits) {
164
+ removeWorktree(worktreeSession);
165
+ }
166
+ else {
167
+ process.stdout.write(`\n⚠️ Worktree '${worktreeSession.name}' has changes or commits. Keeping it at: ${worktreeSession.path}\n`);
168
+ }
169
+ }
141
170
  }
142
171
  process.exit(1);
143
172
  }
@@ -1,2 +1,4 @@
1
- export declare function startSessionSelectorCli(): Promise<string | null>;
1
+ export declare function startSessionSelectorCli({ workdir, }?: {
2
+ workdir?: string;
3
+ }): Promise<string | null>;
2
4
  //# sourceMappingURL=session-selector-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-selector-cli.d.ts","sourceRoot":"","sources":["../src/session-selector-cli.tsx"],"names":[],"mappings":"AAKA,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BtE"}
1
+ {"version":3,"file":"session-selector-cli.d.ts","sourceRoot":"","sources":["../src/session-selector-cli.tsx"],"names":[],"mappings":"AAKA,wBAAsB,uBAAuB,CAAC,EAC5C,OAAO,GACR,GAAE;IACD,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+B9B"}
@@ -2,8 +2,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { render, Box } from "ink";
3
3
  import { listSessions, truncateContent } from "wave-agent-sdk";
4
4
  import { SessionSelector } from "./components/SessionSelector.js";
5
- export async function startSessionSelectorCli() {
6
- const currentWorkdir = process.cwd();
5
+ export async function startSessionSelectorCli({ workdir, } = {}) {
6
+ const currentWorkdir = workdir || process.cwd();
7
7
  const sessions = await listSessions(currentWorkdir);
8
8
  if (sessions.length === 0) {
9
9
  console.log(`No sessions found for workdir: ${currentWorkdir}`);
@@ -0,0 +1,11 @@
1
+ import { WorktreeSession } from "./utils/worktree.js";
2
+ export interface BaseAppProps {
3
+ bypassPermissions?: boolean;
4
+ pluginDirs?: string[];
5
+ tools?: string[];
6
+ worktreeSession?: WorktreeSession;
7
+ workdir?: string;
8
+ version?: string;
9
+ model?: string;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ export interface WorktreeSession {
2
+ name: string;
3
+ path: string;
4
+ branch: string;
5
+ repoRoot: string;
6
+ hasUncommittedChanges: boolean;
7
+ hasNewCommits: boolean;
8
+ isNew: boolean;
9
+ }
10
+ export declare const WORKTREE_DIR = ".wave/worktrees";
11
+ /**
12
+ * Create a new git worktree
13
+ * @param name Worktree name
14
+ * @param cwd Current working directory
15
+ * @returns Worktree session details
16
+ */
17
+ export declare function createWorktree(name: string, cwd: string): WorktreeSession;
18
+ /**
19
+ * Remove a git worktree and its associated branch
20
+ * @param session Worktree session details
21
+ */
22
+ export declare function removeWorktree(session: WorktreeSession): void;
23
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/utils/worktree.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAyEzE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CA6D7D"}