wave-code 0.2.1 → 0.5.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.
- package/dist/commands/plugin/disable.d.ts +2 -1
- package/dist/commands/plugin/disable.d.ts.map +1 -1
- package/dist/commands/plugin/disable.js +3 -2
- package/dist/commands/plugin/enable.d.ts +2 -1
- package/dist/commands/plugin/enable.d.ts.map +1 -1
- package/dist/commands/plugin/enable.js +3 -2
- package/dist/commands/plugin/install.d.ts +2 -1
- package/dist/commands/plugin/install.d.ts.map +1 -1
- package/dist/commands/plugin/list.d.ts.map +1 -1
- package/dist/commands/plugin/list.js +15 -3
- package/dist/commands/plugin/marketplace.d.ts +3 -0
- package/dist/commands/plugin/marketplace.d.ts.map +1 -1
- package/dist/commands/plugin/marketplace.js +15 -1
- package/dist/commands/plugin/uninstall.d.ts +4 -0
- package/dist/commands/plugin/uninstall.d.ts.map +1 -0
- package/dist/commands/plugin/uninstall.js +29 -0
- package/dist/commands/plugin/update.d.ts +4 -0
- package/dist/commands/plugin/update.d.ts.map +1 -0
- package/dist/commands/plugin/update.js +15 -0
- package/dist/components/ChatInterface.d.ts.map +1 -1
- package/dist/components/ChatInterface.js +2 -2
- package/dist/components/CommandSelector.d.ts.map +1 -1
- package/dist/components/CommandSelector.js +9 -3
- package/dist/components/Confirmation.d.ts.map +1 -1
- package/dist/components/Confirmation.js +73 -20
- package/dist/components/DiffDisplay.d.ts +0 -1
- package/dist/components/DiffDisplay.d.ts.map +1 -1
- package/dist/components/DiffDisplay.js +38 -59
- package/dist/components/DiscoverView.d.ts +3 -0
- package/dist/components/DiscoverView.d.ts.map +1 -0
- package/dist/components/DiscoverView.js +25 -0
- package/dist/components/FileSelector.js +1 -1
- package/dist/components/HistorySearch.d.ts +8 -0
- package/dist/components/HistorySearch.d.ts.map +1 -0
- package/dist/components/HistorySearch.js +67 -0
- package/dist/components/InputBox.d.ts +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +29 -19
- package/dist/components/InstalledView.d.ts +3 -0
- package/dist/components/InstalledView.d.ts.map +1 -0
- package/dist/components/InstalledView.js +30 -0
- package/dist/components/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown.js +24 -10
- package/dist/components/MarketplaceAddForm.d.ts +3 -0
- package/dist/components/MarketplaceAddForm.d.ts.map +1 -0
- package/dist/components/MarketplaceAddForm.js +26 -0
- package/dist/components/MarketplaceDetail.d.ts +3 -0
- package/dist/components/MarketplaceDetail.d.ts.map +1 -0
- package/dist/components/MarketplaceDetail.js +38 -0
- package/dist/components/MarketplaceList.d.ts +9 -0
- package/dist/components/MarketplaceList.d.ts.map +1 -0
- package/dist/components/MarketplaceList.js +16 -0
- package/dist/components/MarketplaceView.d.ts +3 -0
- package/dist/components/MarketplaceView.d.ts.map +1 -0
- package/dist/components/MarketplaceView.js +28 -0
- package/dist/components/PlanDisplay.d.ts.map +1 -1
- package/dist/components/PlanDisplay.js +2 -2
- package/dist/components/PluginDetail.d.ts +3 -0
- package/dist/components/PluginDetail.d.ts.map +1 -0
- package/dist/components/PluginDetail.js +63 -0
- package/dist/components/PluginList.d.ts +14 -0
- package/dist/components/PluginList.d.ts.map +1 -0
- package/dist/components/PluginList.js +12 -0
- package/dist/components/PluginManagerShell.d.ts +5 -0
- package/dist/components/PluginManagerShell.d.ts.map +1 -0
- package/dist/components/PluginManagerShell.js +89 -0
- package/dist/components/PluginManagerTypes.d.ts +33 -0
- package/dist/components/PluginManagerTypes.d.ts.map +1 -0
- package/dist/components/PluginManagerTypes.js +1 -0
- package/dist/components/RewindCommand.d.ts +9 -0
- package/dist/components/RewindCommand.d.ts.map +1 -0
- package/dist/components/RewindCommand.js +42 -0
- package/dist/components/SessionSelector.d.ts +11 -0
- package/dist/components/SessionSelector.d.ts.map +1 -0
- package/dist/components/SessionSelector.js +38 -0
- package/dist/components/SubagentBlock.d.ts.map +1 -1
- package/dist/components/SubagentBlock.js +24 -1
- package/dist/components/TaskManager.d.ts +6 -0
- package/dist/components/TaskManager.d.ts.map +1 -0
- package/dist/components/TaskManager.js +114 -0
- package/dist/components/ToolResultDisplay.d.ts.map +1 -1
- package/dist/components/ToolResultDisplay.js +2 -1
- package/dist/contexts/PluginManagerContext.d.ts +4 -0
- package/dist/contexts/PluginManagerContext.d.ts.map +1 -0
- package/dist/contexts/PluginManagerContext.js +9 -0
- package/dist/contexts/useChat.d.ts +7 -4
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +37 -12
- package/dist/hooks/useInputManager.d.ts +8 -16
- package/dist/hooks/useInputManager.d.ts.map +1 -1
- package/dist/hooks/useInputManager.js +39 -55
- package/dist/hooks/usePluginManager.d.ts +3 -0
- package/dist/hooks/usePluginManager.d.ts.map +1 -0
- package/dist/hooks/usePluginManager.js +227 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +150 -177
- package/dist/managers/InputManager.d.ts +18 -26
- package/dist/managers/InputManager.d.ts.map +1 -1
- package/dist/managers/InputManager.js +93 -119
- package/dist/plugin-manager-cli.d.ts +6 -0
- package/dist/plugin-manager-cli.d.ts.map +1 -0
- package/dist/plugin-manager-cli.js +12 -0
- package/dist/session-selector-cli.d.ts +2 -0
- package/dist/session-selector-cli.d.ts.map +1 -0
- package/dist/session-selector-cli.js +25 -0
- package/package.json +9 -5
- package/src/commands/plugin/disable.ts +7 -3
- package/src/commands/plugin/enable.ts +7 -3
- package/src/commands/plugin/install.ts +2 -1
- package/src/commands/plugin/list.ts +21 -3
- package/src/commands/plugin/marketplace.ts +17 -1
- package/src/commands/plugin/uninstall.ts +39 -0
- package/src/commands/plugin/update.ts +19 -0
- package/src/components/ChatInterface.tsx +2 -1
- package/src/components/CommandSelector.tsx +10 -3
- package/src/components/Confirmation.tsx +115 -25
- package/src/components/DiffDisplay.tsx +60 -106
- package/src/components/DiscoverView.tsx +31 -0
- package/src/components/FileSelector.tsx +1 -1
- package/src/components/HistorySearch.tsx +148 -0
- package/src/components/InputBox.tsx +51 -34
- package/src/components/InstalledView.tsx +61 -0
- package/src/components/Markdown.tsx +44 -28
- package/src/components/MarketplaceAddForm.tsx +39 -0
- package/src/components/MarketplaceDetail.tsx +79 -0
- package/src/components/MarketplaceList.tsx +52 -0
- package/src/components/MarketplaceView.tsx +43 -0
- package/src/components/PlanDisplay.tsx +14 -19
- package/src/components/PluginDetail.tsx +147 -0
- package/src/components/PluginList.tsx +51 -0
- package/src/components/PluginManagerShell.tsx +189 -0
- package/src/components/PluginManagerTypes.ts +47 -0
- package/src/components/RewindCommand.tsx +114 -0
- package/src/components/SessionSelector.tsx +127 -0
- package/src/components/SubagentBlock.tsx +34 -1
- package/src/components/{BashShellManager.tsx → TaskManager.tsx} +79 -75
- package/src/components/ToolResultDisplay.tsx +6 -2
- package/src/contexts/PluginManagerContext.ts +15 -0
- package/src/contexts/useChat.tsx +51 -20
- package/src/hooks/useInputManager.ts +39 -71
- package/src/hooks/usePluginManager.ts +302 -0
- package/src/index.ts +241 -280
- package/src/managers/InputManager.ts +113 -162
- package/src/plugin-manager-cli.tsx +13 -0
- package/src/session-selector-cli.tsx +37 -0
- package/dist/components/BashHistorySelector.d.ts +0 -11
- package/dist/components/BashHistorySelector.d.ts.map +0 -1
- package/dist/components/BashHistorySelector.js +0 -93
- package/dist/components/BashShellManager.d.ts +0 -6
- package/dist/components/BashShellManager.d.ts.map +0 -1
- package/dist/components/BashShellManager.js +0 -116
- package/dist/hooks/usePagination.d.ts +0 -20
- package/dist/hooks/usePagination.d.ts.map +0 -1
- package/dist/hooks/usePagination.js +0 -168
- package/src/components/BashHistorySelector.tsx +0 -181
- package/src/hooks/usePagination.ts +0 -203
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/disable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/disable.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,EACN,MAAM,gBAAgB,CAAC;AAExB,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,iBAwBA"}
|
|
@@ -8,9 +8,10 @@ export async function disablePluginCommand(argv) {
|
|
|
8
8
|
configurationService,
|
|
9
9
|
pluginManager,
|
|
10
10
|
});
|
|
11
|
+
const scope = argv.scope || scopeManager.findPluginScope(argv.plugin) || "user";
|
|
11
12
|
try {
|
|
12
|
-
await scopeManager.disablePlugin(
|
|
13
|
-
console.log(`Successfully disabled plugin: ${argv.plugin} in ${
|
|
13
|
+
await scopeManager.disablePlugin(scope, argv.plugin);
|
|
14
|
+
console.log(`Successfully disabled plugin: ${argv.plugin} in ${scope} scope`);
|
|
14
15
|
process.exit(0);
|
|
15
16
|
}
|
|
16
17
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/enable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/enable.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,EACN,MAAM,gBAAgB,CAAC;AAExB,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,iBAwBA"}
|
|
@@ -8,9 +8,10 @@ export async function enablePluginCommand(argv) {
|
|
|
8
8
|
configurationService,
|
|
9
9
|
pluginManager,
|
|
10
10
|
});
|
|
11
|
+
const scope = argv.scope || scopeManager.findPluginScope(argv.plugin) || "user";
|
|
11
12
|
try {
|
|
12
|
-
await scopeManager.enablePlugin(
|
|
13
|
-
console.log(`Successfully enabled plugin: ${argv.plugin} in ${
|
|
13
|
+
await scopeManager.enablePlugin(scope, argv.plugin);
|
|
14
|
+
console.log(`Successfully enabled plugin: ${argv.plugin} in ${scope} scope`);
|
|
14
15
|
process.exit(0);
|
|
15
16
|
}
|
|
16
17
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,EACN,MAAM,gBAAgB,CAAC;AAExB,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,iBA+BA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/list.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/list.ts"],"names":[],"mappings":"AAOA,wBAAsB,kBAAkB,kBA0EvC"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import { MarketplaceService, ConfigurationService } from "wave-agent-sdk";
|
|
1
|
+
import { MarketplaceService, ConfigurationService, PluginScopeManager, PluginManager, } from "wave-agent-sdk";
|
|
2
2
|
export async function listPluginsCommand() {
|
|
3
|
-
const marketplaceService = new MarketplaceService();
|
|
4
3
|
const configurationService = new ConfigurationService();
|
|
4
|
+
const marketplaceService = new MarketplaceService();
|
|
5
5
|
const workdir = process.cwd();
|
|
6
|
+
const pluginManager = new PluginManager({
|
|
7
|
+
workdir,
|
|
8
|
+
configurationService,
|
|
9
|
+
});
|
|
10
|
+
const pluginScopeManager = new PluginScopeManager({
|
|
11
|
+
workdir,
|
|
12
|
+
configurationService,
|
|
13
|
+
pluginManager,
|
|
14
|
+
});
|
|
6
15
|
try {
|
|
7
16
|
const installedPlugins = await marketplaceService.getInstalledPlugins();
|
|
8
17
|
const marketplaces = await marketplaceService.listMarketplaces();
|
|
@@ -13,12 +22,14 @@ export async function listPluginsCommand() {
|
|
|
13
22
|
try {
|
|
14
23
|
const manifest = await marketplaceService.loadMarketplaceManifest(marketplaceService.getMarketplacePath(m));
|
|
15
24
|
manifest.plugins.forEach((p) => {
|
|
25
|
+
const pluginId = `${p.name}@${m.name}`;
|
|
16
26
|
const installed = installedPlugins.plugins.find((ip) => ip.name === p.name && ip.marketplace === m.name);
|
|
17
27
|
allMarketplacePlugins.push({
|
|
18
28
|
name: p.name,
|
|
19
29
|
marketplace: m.name,
|
|
20
30
|
installed: !!installed,
|
|
21
31
|
version: installed?.version,
|
|
32
|
+
scope: pluginScopeManager.findPluginScope(pluginId) || undefined,
|
|
22
33
|
});
|
|
23
34
|
});
|
|
24
35
|
}
|
|
@@ -40,7 +51,8 @@ export async function listPluginsCommand() {
|
|
|
40
51
|
: "disabled"
|
|
41
52
|
: "not installed";
|
|
42
53
|
const versionStr = p.version ? ` v${p.version}` : "";
|
|
43
|
-
|
|
54
|
+
const scopeStr = p.scope ? ` (${p.scope})` : "";
|
|
55
|
+
console.log(`- ${pluginId}${versionStr}${scopeStr} [${status}]`);
|
|
44
56
|
});
|
|
45
57
|
}
|
|
46
58
|
process.exit(0);
|
|
@@ -2,6 +2,9 @@ export declare function addMarketplaceCommand(argv: {
|
|
|
2
2
|
input: string;
|
|
3
3
|
}): Promise<void>;
|
|
4
4
|
export declare function listMarketplacesCommand(): Promise<void>;
|
|
5
|
+
export declare function removeMarketplaceCommand(argv: {
|
|
6
|
+
name: string;
|
|
7
|
+
}): Promise<void>;
|
|
5
8
|
export declare function updateMarketplaceCommand(argv: {
|
|
6
9
|
name?: string;
|
|
7
10
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/marketplace.ts"],"names":[],"mappings":"AAEA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,iBAsBlE;AAED,wBAAsB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/marketplace.ts"],"names":[],"mappings":"AAEA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,iBAsBlE;AAED,wBAAsB,uBAAuB,kBA8B5C;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,iBAWpE;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,iBAgBrE"}
|
|
@@ -44,7 +44,8 @@ export async function listMarketplacesCommand() {
|
|
|
44
44
|
else {
|
|
45
45
|
sourceInfo = source.url + (source.ref ? `#${source.ref}` : "");
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
const builtinLabel = m.isBuiltin ? " [builtin]" : "";
|
|
48
|
+
console.log(`- ${m.name}${builtinLabel}: ${sourceInfo} (${m.source.source})`);
|
|
48
49
|
});
|
|
49
50
|
}
|
|
50
51
|
process.exit(0);
|
|
@@ -55,6 +56,19 @@ export async function listMarketplacesCommand() {
|
|
|
55
56
|
process.exit(1);
|
|
56
57
|
}
|
|
57
58
|
}
|
|
59
|
+
export async function removeMarketplaceCommand(argv) {
|
|
60
|
+
const service = new MarketplaceService();
|
|
61
|
+
try {
|
|
62
|
+
await service.removeMarketplace(argv.name);
|
|
63
|
+
console.log(`Successfully removed marketplace: ${argv.name}`);
|
|
64
|
+
process.exit(0);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
68
|
+
console.error(`Failed to remove marketplace: ${message}`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
58
72
|
export async function updateMarketplaceCommand(argv) {
|
|
59
73
|
const service = new MarketplaceService();
|
|
60
74
|
try {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/uninstall.ts"],"names":[],"mappings":"AAOA,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,iBA+BpE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { MarketplaceService, ConfigurationService, PluginManager, PluginScopeManager, } from "wave-agent-sdk";
|
|
2
|
+
export async function uninstallPluginCommand(argv) {
|
|
3
|
+
const marketplaceService = new MarketplaceService();
|
|
4
|
+
const workdir = process.cwd();
|
|
5
|
+
try {
|
|
6
|
+
await marketplaceService.uninstallPlugin(argv.plugin, workdir);
|
|
7
|
+
console.log(`Successfully uninstalled plugin: ${argv.plugin}`);
|
|
8
|
+
const configurationService = new ConfigurationService();
|
|
9
|
+
const pluginManager = new PluginManager({ workdir });
|
|
10
|
+
const scopeManager = new PluginScopeManager({
|
|
11
|
+
workdir,
|
|
12
|
+
configurationService,
|
|
13
|
+
pluginManager,
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
await scopeManager.removePluginFromAllScopes(argv.plugin);
|
|
17
|
+
console.log(`Cleaned up plugin configuration from all scopes`);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
console.warn(`Warning: Could not clean up all plugin configurations: ${error instanceof Error ? error.message : String(error)}`);
|
|
21
|
+
}
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
26
|
+
console.error(`Failed to uninstall plugin: ${message}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/update.ts"],"names":[],"mappings":"AAEA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,iBAgBjE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MarketplaceService } from "wave-agent-sdk";
|
|
2
|
+
export async function updatePluginCommand(argv) {
|
|
3
|
+
const marketplaceService = new MarketplaceService();
|
|
4
|
+
try {
|
|
5
|
+
const updated = await marketplaceService.updatePlugin(argv.plugin);
|
|
6
|
+
console.log(`Successfully updated plugin: ${updated.name} v${updated.version} from ${updated.marketplace}`);
|
|
7
|
+
console.log(`Cache path: ${updated.cachePath}`);
|
|
8
|
+
process.exit(0);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
12
|
+
console.error(`Failed to update plugin: ${message}`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAqEjC,CAAC"}
|
|
@@ -5,8 +5,8 @@ import { InputBox } from "./InputBox.js";
|
|
|
5
5
|
import { Confirmation } from "./Confirmation.js";
|
|
6
6
|
import { useChat } from "../contexts/useChat.js";
|
|
7
7
|
export const ChatInterface = () => {
|
|
8
|
-
const { messages, isLoading, isCommandRunning, userInputHistory, isCompressing, sendMessage, abortMessage, saveMemory, mcpServers, connectMcpServer, disconnectMcpServer, isExpanded, sessionId, latestTotalTokens, slashCommands, hasSlashCommand, isConfirmationVisible, confirmingTool, handleConfirmationDecision, handleConfirmationCancel, } = useChat();
|
|
8
|
+
const { messages, isLoading, isCommandRunning, userInputHistory, isCompressing, sendMessage, abortMessage, saveMemory, mcpServers, connectMcpServer, disconnectMcpServer, isExpanded, sessionId, latestTotalTokens, slashCommands, hasSlashCommand, isConfirmationVisible, confirmingTool, handleConfirmationDecision, handleConfirmationCancel, rewindId, } = useChat();
|
|
9
9
|
if (!sessionId)
|
|
10
10
|
return null;
|
|
11
|
-
return (_jsxs(Box, { flexDirection: "column", height: "100%", paddingY: 1, paddingRight: 1, children: [_jsx(MessageList, { messages: messages, isLoading: isLoading, isCommandRunning: isCommandRunning, isCompressing: isCompressing, latestTotalTokens: latestTotalTokens, isExpanded: isExpanded }, String(isExpanded) + sessionId), isConfirmationVisible && (_jsx(Confirmation, { toolName: confirmingTool.name, toolInput: confirmingTool.input, suggestedPrefix: confirmingTool.suggestedPrefix, hidePersistentOption: confirmingTool.hidePersistentOption, isExpanded: isExpanded, onDecision: handleConfirmationDecision, onCancel: handleConfirmationCancel, onAbort: abortMessage })), !isConfirmationVisible && !isExpanded && (_jsx(InputBox, { isLoading: isLoading, isCommandRunning: isCommandRunning, userInputHistory: userInputHistory, sendMessage: sendMessage, abortMessage: abortMessage, saveMemory: saveMemory, mcpServers: mcpServers, connectMcpServer: connectMcpServer, disconnectMcpServer: disconnectMcpServer, slashCommands: slashCommands, hasSlashCommand: hasSlashCommand }))] }));
|
|
11
|
+
return (_jsxs(Box, { flexDirection: "column", height: "100%", paddingY: 1, paddingRight: 1, children: [_jsx(MessageList, { messages: messages, isLoading: isLoading, isCommandRunning: isCommandRunning, isCompressing: isCompressing, latestTotalTokens: latestTotalTokens, isExpanded: isExpanded }, String(isExpanded) + sessionId + rewindId), isConfirmationVisible && (_jsx(Confirmation, { toolName: confirmingTool.name, toolInput: confirmingTool.input, suggestedPrefix: confirmingTool.suggestedPrefix, hidePersistentOption: confirmingTool.hidePersistentOption, isExpanded: isExpanded, onDecision: handleConfirmationDecision, onCancel: handleConfirmationCancel, onAbort: abortMessage })), !isConfirmationVisible && !isExpanded && (_jsx(InputBox, { isLoading: isLoading, isCommandRunning: isCommandRunning, userInputHistory: userInputHistory, sendMessage: sendMessage, abortMessage: abortMessage, saveMemory: saveMemory, mcpServers: mcpServers, connectMcpServer: connectMcpServer, disconnectMcpServer: disconnectMcpServer, slashCommands: slashCommands, hasSlashCommand: hasSlashCommand }))] }));
|
|
12
12
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandSelector.d.ts","sourceRoot":"","sources":["../../src/components/CommandSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"CommandSelector.d.ts","sourceRoot":"","sources":["../../src/components/CommandSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAwBnD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAwH1D,CAAC"}
|
|
@@ -3,9 +3,9 @@ import { useState } from "react";
|
|
|
3
3
|
import { Box, Text, useInput } from "ink";
|
|
4
4
|
const AVAILABLE_COMMANDS = [
|
|
5
5
|
{
|
|
6
|
-
id: "
|
|
7
|
-
name: "
|
|
8
|
-
description: "View and manage background
|
|
6
|
+
id: "tasks",
|
|
7
|
+
name: "tasks",
|
|
8
|
+
description: "View and manage background tasks (shells and subagents)",
|
|
9
9
|
handler: () => { }, // Handler here won't be used, actual processing is in the hook
|
|
10
10
|
},
|
|
11
11
|
{
|
|
@@ -14,6 +14,12 @@ const AVAILABLE_COMMANDS = [
|
|
|
14
14
|
description: "View and manage MCP servers",
|
|
15
15
|
handler: () => { }, // Handler here won't be used, actual processing is in the hook
|
|
16
16
|
},
|
|
17
|
+
{
|
|
18
|
+
id: "rewind",
|
|
19
|
+
name: "rewind",
|
|
20
|
+
description: "Revert conversation and file changes to a previous checkpoint",
|
|
21
|
+
handler: () => { }, // Handler here won't be used, actual processing is in the hook
|
|
22
|
+
},
|
|
17
23
|
];
|
|
18
24
|
export const CommandSelector = ({ searchQuery, onSelect, onInsert, onCancel, commands = [], // Default to empty array
|
|
19
25
|
}) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Confirmation.d.ts","sourceRoot":"","sources":["../../src/components/Confirmation.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,gBAAgB,CAAC;AAmD/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"Confirmation.d.ts","sourceRoot":"","sources":["../../src/components/Confirmation.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,gBAAgB,CAAC;AAmD/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AASD,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8fpD,CAAC"}
|
|
@@ -40,6 +40,7 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
40
40
|
const [state, setState] = useState({
|
|
41
41
|
selectedOption: "allow",
|
|
42
42
|
alternativeText: "",
|
|
43
|
+
alternativeCursorPosition: 0,
|
|
43
44
|
hasUserInput: false,
|
|
44
45
|
});
|
|
45
46
|
// Specialized state for AskUserQuestion
|
|
@@ -48,6 +49,7 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
48
49
|
const [selectedOptionIndices, setSelectedOptionIndices] = useState(new Set());
|
|
49
50
|
const [userAnswers, setUserAnswers] = useState({});
|
|
50
51
|
const [otherText, setOtherText] = useState("");
|
|
52
|
+
const [otherCursorPosition, setOtherCursorPosition] = useState(0);
|
|
51
53
|
const questions = toolInput?.questions || [];
|
|
52
54
|
const currentQuestion = questions[currentQuestionIndex];
|
|
53
55
|
const getAutoOptionText = () => {
|
|
@@ -107,6 +109,7 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
107
109
|
setSelectedOptionIndex(0);
|
|
108
110
|
setSelectedOptionIndices(new Set());
|
|
109
111
|
setOtherText("");
|
|
112
|
+
setOtherCursorPosition(0);
|
|
110
113
|
}
|
|
111
114
|
else {
|
|
112
115
|
// All questions answered
|
|
@@ -150,11 +153,34 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
150
153
|
return;
|
|
151
154
|
}
|
|
152
155
|
if (isOtherFocused) {
|
|
156
|
+
if (key.leftArrow) {
|
|
157
|
+
setOtherCursorPosition((prev) => Math.max(0, prev - 1));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (key.rightArrow) {
|
|
161
|
+
setOtherCursorPosition((prev) => Math.min(otherText.length, prev + 1));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
153
164
|
if (key.backspace || key.delete) {
|
|
154
|
-
|
|
165
|
+
if (otherCursorPosition > 0) {
|
|
166
|
+
setOtherText((prev) => {
|
|
167
|
+
const next = prev.slice(0, otherCursorPosition - 1) +
|
|
168
|
+
prev.slice(otherCursorPosition);
|
|
169
|
+
return next;
|
|
170
|
+
});
|
|
171
|
+
setOtherCursorPosition((prev) => prev - 1);
|
|
172
|
+
}
|
|
173
|
+
return;
|
|
155
174
|
}
|
|
156
|
-
|
|
157
|
-
setOtherText((prev) =>
|
|
175
|
+
if (input && !key.ctrl && !key.meta) {
|
|
176
|
+
setOtherText((prev) => {
|
|
177
|
+
const next = prev.slice(0, otherCursorPosition) +
|
|
178
|
+
input +
|
|
179
|
+
prev.slice(otherCursorPosition);
|
|
180
|
+
return next;
|
|
181
|
+
});
|
|
182
|
+
setOtherCursorPosition((prev) => prev + input.length);
|
|
183
|
+
return;
|
|
158
184
|
}
|
|
159
185
|
return;
|
|
160
186
|
}
|
|
@@ -173,7 +199,7 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
173
199
|
else if (state.selectedOption === "auto") {
|
|
174
200
|
if (toolName === BASH_TOOL_NAME) {
|
|
175
201
|
const rule = suggestedPrefix
|
|
176
|
-
? `Bash(${suggestedPrefix}
|
|
202
|
+
? `Bash(${suggestedPrefix}*)`
|
|
177
203
|
: `Bash(${toolInput?.command})`;
|
|
178
204
|
onDecision({
|
|
179
205
|
behavior: "allow",
|
|
@@ -198,6 +224,22 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
198
224
|
}
|
|
199
225
|
return;
|
|
200
226
|
}
|
|
227
|
+
if (state.selectedOption === "alternative") {
|
|
228
|
+
if (key.leftArrow) {
|
|
229
|
+
setState((prev) => ({
|
|
230
|
+
...prev,
|
|
231
|
+
alternativeCursorPosition: Math.max(0, prev.alternativeCursorPosition - 1),
|
|
232
|
+
}));
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (key.rightArrow) {
|
|
236
|
+
setState((prev) => ({
|
|
237
|
+
...prev,
|
|
238
|
+
alternativeCursorPosition: Math.min(prev.alternativeText.length, prev.alternativeCursorPosition + 1),
|
|
239
|
+
}));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
201
243
|
// Handle arrow keys for navigation
|
|
202
244
|
if (key.upArrow) {
|
|
203
245
|
setState((prev) => {
|
|
@@ -230,30 +272,42 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
230
272
|
// Handle text input for alternative option
|
|
231
273
|
if (input && !key.ctrl && !key.meta && !("alt" in key && key.alt)) {
|
|
232
274
|
// Focus on alternative option when user starts typing
|
|
233
|
-
setState((prev) => ({
|
|
234
|
-
selectedOption: "alternative",
|
|
235
|
-
alternativeText: prev.alternativeText + input,
|
|
236
|
-
hasUserInput: true,
|
|
237
|
-
}));
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
// Handle backspace and delete (same behavior - delete one character)
|
|
241
|
-
if (key.backspace || key.delete) {
|
|
242
275
|
setState((prev) => {
|
|
243
|
-
const
|
|
276
|
+
const nextText = prev.alternativeText.slice(0, prev.alternativeCursorPosition) +
|
|
277
|
+
input +
|
|
278
|
+
prev.alternativeText.slice(prev.alternativeCursorPosition);
|
|
244
279
|
return {
|
|
245
280
|
...prev,
|
|
246
281
|
selectedOption: "alternative",
|
|
247
|
-
alternativeText:
|
|
248
|
-
|
|
282
|
+
alternativeText: nextText,
|
|
283
|
+
alternativeCursorPosition: prev.alternativeCursorPosition + input.length,
|
|
284
|
+
hasUserInput: true,
|
|
249
285
|
};
|
|
250
286
|
});
|
|
251
287
|
return;
|
|
252
288
|
}
|
|
289
|
+
// Handle backspace and delete
|
|
290
|
+
if (key.backspace || key.delete) {
|
|
291
|
+
setState((prev) => {
|
|
292
|
+
if (prev.alternativeCursorPosition > 0) {
|
|
293
|
+
const nextText = prev.alternativeText.slice(0, prev.alternativeCursorPosition - 1) +
|
|
294
|
+
prev.alternativeText.slice(prev.alternativeCursorPosition);
|
|
295
|
+
return {
|
|
296
|
+
...prev,
|
|
297
|
+
selectedOption: "alternative",
|
|
298
|
+
alternativeText: nextText,
|
|
299
|
+
alternativeCursorPosition: prev.alternativeCursorPosition - 1,
|
|
300
|
+
hasUserInput: nextText.length > 0,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
return prev;
|
|
304
|
+
});
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
253
307
|
});
|
|
254
308
|
const placeholderText = "Type here to tell Wave what to do differently";
|
|
255
309
|
const showPlaceholder = state.selectedOption === "alternative" && !state.hasUserInput;
|
|
256
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "yellow", borderBottom: false, borderLeft: false, borderRight: false, paddingTop: 1, children: [_jsxs(Text, { color: "yellow", bold: true, children: ["Tool: ", toolName] }), _jsx(Text, { color: "yellow", children: getActionDescription(toolName, toolInput) }), _jsx(DiffDisplay, { toolName: toolName, parameters: JSON.stringify(toolInput)
|
|
310
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "yellow", borderBottom: false, borderLeft: false, borderRight: false, paddingTop: 1, children: [_jsxs(Text, { color: "yellow", bold: true, children: ["Tool: ", toolName] }), _jsx(Text, { color: "yellow", children: getActionDescription(toolName, toolInput) }), _jsx(DiffDisplay, { toolName: toolName, parameters: JSON.stringify(toolInput) }), toolName === ASK_USER_QUESTION_TOOL_NAME &&
|
|
257
311
|
currentQuestion &&
|
|
258
312
|
!isExpanded && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Box, { backgroundColor: getHeaderColor(currentQuestion.header), paddingX: 1, marginRight: 1, children: _jsx(Text, { color: "black", bold: true, children: currentQuestion.header.slice(0, 12).toUpperCase() }) }), _jsx(Text, { bold: true, children: currentQuestion.question })] }), _jsx(Box, { flexDirection: "column", children: (() => {
|
|
259
313
|
const isMultiSelect = !!currentQuestion.multiSelect;
|
|
@@ -264,12 +318,11 @@ export const Confirmation = ({ toolName, toolInput, suggestedPrefix, hidePersist
|
|
|
264
318
|
: isSelected;
|
|
265
319
|
const isOther = index === currentQuestion.options.length;
|
|
266
320
|
const isRecommended = !isOther && option.isRecommended;
|
|
267
|
-
return (_jsx(Box, { children: _jsxs(Text, { color: isSelected ? "black" : "white", backgroundColor: isSelected ? "yellow" : undefined, children: [isSelected ? "> " : " ", isMultiSelect ? (isChecked ? "[x] " : "[ ] ") : "", option.label, isRecommended && (_jsxs(Text, { color: "green", bold: true, children: [" ", "(Recommended)"] })), option.description ? ` - ${option.description}` : "", isOther && isSelected && (_jsxs(Text, { children: [":", " ", otherText || (_jsx(Text, { color: "gray", dimColor: true, children: "[Type your answer...]" }))] }))] }) }, index));
|
|
321
|
+
return (_jsx(Box, { children: _jsxs(Text, { color: isSelected ? "black" : "white", backgroundColor: isSelected ? "yellow" : undefined, children: [isSelected ? "> " : " ", isMultiSelect ? (isChecked ? "[x] " : "[ ] ") : "", option.label, isRecommended && (_jsxs(Text, { color: "green", bold: true, children: [" ", "(Recommended)"] })), option.description ? ` - ${option.description}` : "", isOther && isSelected && (_jsxs(Text, { children: [":", " ", otherText ? (_jsxs(_Fragment, { children: [otherText.slice(0, otherCursorPosition), _jsx(Text, { backgroundColor: "white", color: "black", children: otherText[otherCursorPosition] || " " }), otherText.slice(otherCursorPosition + 1)] })) : (_jsx(Text, { color: "gray", dimColor: true, children: "[Type your answer...]" }))] }))] }) }, index));
|
|
268
322
|
});
|
|
269
323
|
})() }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Question ", currentQuestionIndex + 1, " of ", questions.length, " \u2022", currentQuestion.multiSelect ? " Space to toggle •" : "", " Use \u2191\u2193 to navigate \u2022 Enter to confirm"] }) })] })), toolName !== ASK_USER_QUESTION_TOOL_NAME &&
|
|
270
324
|
toolName === EXIT_PLAN_MODE_TOOL_NAME &&
|
|
271
325
|
!!toolInput?.plan_content && (_jsx(PlanDisplay, { plan: toolInput.plan_content, isExpanded: isExpanded })), toolName !== ASK_USER_QUESTION_TOOL_NAME && !isExpanded && (_jsxs(_Fragment, { children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "Do you want to proceed?" }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Box, { children: _jsxs(Text, { color: state.selectedOption === "allow" ? "black" : "white", backgroundColor: state.selectedOption === "allow" ? "yellow" : undefined, bold: state.selectedOption === "allow", children: [state.selectedOption === "allow" ? "> " : " ", toolName === EXIT_PLAN_MODE_TOOL_NAME
|
|
272
326
|
? "Yes, proceed with default mode"
|
|
273
|
-
: "Yes"] }) }, "allow-option"), !hidePersistentOption && (_jsx(Box, { children: _jsxs(Text, { color: state.selectedOption === "auto" ? "black" : "white", backgroundColor: state.selectedOption === "auto" ? "yellow" : undefined, bold: state.selectedOption === "auto", children: [state.selectedOption === "auto" ? "> " : " ", getAutoOptionText()] }) }, "auto-option")), _jsx(Box, { children: _jsxs(Text, { color: state.selectedOption === "alternative" ? "black" : "white", backgroundColor: state.selectedOption === "alternative" ? "yellow" : undefined, bold: state.selectedOption === "alternative", children: [state.selectedOption === "alternative" ? "> " : " ", showPlaceholder ? (_jsx(Text, { color: "gray", dimColor: true, children: placeholderText })) : (_jsx(Text, { children: state.alternativeText ||
|
|
274
|
-
"Type here to tell Wave what to do differently" }))] }) }, "alternative-option")] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Use \u2191\u2193 to navigate \u2022 ESC to cancel" }) })] }))] }));
|
|
327
|
+
: "Yes"] }) }, "allow-option"), !hidePersistentOption && (_jsx(Box, { children: _jsxs(Text, { color: state.selectedOption === "auto" ? "black" : "white", backgroundColor: state.selectedOption === "auto" ? "yellow" : undefined, bold: state.selectedOption === "auto", children: [state.selectedOption === "auto" ? "> " : " ", getAutoOptionText()] }) }, "auto-option")), _jsx(Box, { children: _jsxs(Text, { color: state.selectedOption === "alternative" ? "black" : "white", backgroundColor: state.selectedOption === "alternative" ? "yellow" : undefined, bold: state.selectedOption === "alternative", children: [state.selectedOption === "alternative" ? "> " : " ", showPlaceholder ? (_jsx(Text, { color: "gray", dimColor: true, children: placeholderText })) : (_jsx(Text, { children: state.alternativeText ? (_jsxs(_Fragment, { children: [state.alternativeText.slice(0, state.alternativeCursorPosition), _jsx(Text, { backgroundColor: "white", color: "black", children: state.alternativeText[state.alternativeCursorPosition] || " " }), state.alternativeText.slice(state.alternativeCursorPosition + 1)] })) : ("Type here to tell Wave what to do differently") }))] }) }, "alternative-option")] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Use \u2191\u2193 to navigate \u2022 ESC to cancel" }) })] }))] }));
|
|
275
328
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiffDisplay.d.ts","sourceRoot":"","sources":["../../src/components/DiffDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAUvC,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"DiffDisplay.d.ts","sourceRoot":"","sources":["../../src/components/DiffDisplay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAUvC,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA4OlD,CAAC"}
|