wave-code 0.6.5 → 0.7.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 (101) hide show
  1. package/dist/cli.d.ts +1 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/commands/plugin/disable.d.ts.map +1 -1
  5. package/dist/commands/plugin/disable.js +3 -10
  6. package/dist/commands/plugin/enable.d.ts.map +1 -1
  7. package/dist/commands/plugin/enable.js +3 -10
  8. package/dist/commands/plugin/install.d.ts.map +1 -1
  9. package/dist/commands/plugin/install.js +4 -11
  10. package/dist/commands/plugin/list.d.ts.map +1 -1
  11. package/dist/commands/plugin/list.js +5 -39
  12. package/dist/commands/plugin/marketplace.js +9 -9
  13. package/dist/commands/plugin/uninstall.d.ts.map +1 -1
  14. package/dist/commands/plugin/uninstall.js +4 -17
  15. package/dist/commands/plugin/update.js +3 -3
  16. package/dist/components/App.d.ts +1 -0
  17. package/dist/components/App.d.ts.map +1 -1
  18. package/dist/components/App.js +4 -4
  19. package/dist/components/BackgroundTaskManager.d.ts.map +1 -1
  20. package/dist/components/BackgroundTaskManager.js +34 -18
  21. package/dist/components/ChatInterface.d.ts.map +1 -1
  22. package/dist/components/ChatInterface.js +28 -15
  23. package/dist/components/ConfirmationDetails.d.ts +1 -0
  24. package/dist/components/ConfirmationDetails.d.ts.map +1 -1
  25. package/dist/components/ConfirmationDetails.js +7 -14
  26. package/dist/components/ConfirmationSelector.d.ts +1 -0
  27. package/dist/components/ConfirmationSelector.d.ts.map +1 -1
  28. package/dist/components/ConfirmationSelector.js +164 -117
  29. package/dist/components/DiffDisplay.d.ts +1 -0
  30. package/dist/components/DiffDisplay.d.ts.map +1 -1
  31. package/dist/components/DiffDisplay.js +94 -36
  32. package/dist/components/HistorySearch.d.ts.map +1 -1
  33. package/dist/components/HistorySearch.js +26 -20
  34. package/dist/components/Markdown.d.ts.map +1 -1
  35. package/dist/components/Markdown.js +3 -1
  36. package/dist/components/McpManager.d.ts.map +1 -1
  37. package/dist/components/McpManager.js +49 -52
  38. package/dist/components/MessageBlockItem.d.ts +9 -0
  39. package/dist/components/MessageBlockItem.d.ts.map +1 -0
  40. package/dist/components/MessageBlockItem.js +11 -0
  41. package/dist/components/MessageList.d.ts +2 -4
  42. package/dist/components/MessageList.d.ts.map +1 -1
  43. package/dist/components/MessageList.js +28 -23
  44. package/dist/components/PluginDetail.d.ts.map +1 -1
  45. package/dist/components/PluginDetail.js +19 -22
  46. package/dist/components/SessionSelector.d.ts.map +1 -1
  47. package/dist/components/SessionSelector.js +8 -5
  48. package/dist/components/TaskList.d.ts.map +1 -1
  49. package/dist/components/TaskList.js +2 -5
  50. package/dist/components/ToolDisplay.d.ts.map +1 -1
  51. package/dist/components/ToolDisplay.js +1 -1
  52. package/dist/contexts/useChat.d.ts +1 -0
  53. package/dist/contexts/useChat.d.ts.map +1 -1
  54. package/dist/contexts/useChat.js +20 -3
  55. package/dist/hooks/usePluginManager.d.ts.map +1 -1
  56. package/dist/hooks/usePluginManager.js +20 -39
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +16 -0
  59. package/dist/print-cli.d.ts +1 -0
  60. package/dist/print-cli.d.ts.map +1 -1
  61. package/dist/print-cli.js +2 -1
  62. package/dist/utils/highlightUtils.d.ts +2 -0
  63. package/dist/utils/highlightUtils.d.ts.map +1 -0
  64. package/dist/utils/highlightUtils.js +69 -0
  65. package/dist/utils/toolParameterTransforms.d.ts +2 -6
  66. package/dist/utils/toolParameterTransforms.d.ts.map +1 -1
  67. package/dist/utils/toolParameterTransforms.js +10 -14
  68. package/package.json +4 -2
  69. package/src/cli.tsx +3 -0
  70. package/src/commands/plugin/disable.ts +3 -17
  71. package/src/commands/plugin/enable.ts +3 -17
  72. package/src/commands/plugin/install.ts +4 -18
  73. package/src/commands/plugin/list.ts +5 -55
  74. package/src/commands/plugin/marketplace.ts +9 -9
  75. package/src/commands/plugin/uninstall.ts +4 -26
  76. package/src/commands/plugin/update.ts +3 -3
  77. package/src/components/App.tsx +10 -2
  78. package/src/components/BackgroundTaskManager.tsx +69 -44
  79. package/src/components/ChatInterface.tsx +35 -23
  80. package/src/components/ConfirmationDetails.tsx +13 -15
  81. package/src/components/ConfirmationSelector.tsx +207 -128
  82. package/src/components/DiffDisplay.tsx +164 -75
  83. package/src/components/HistorySearch.tsx +31 -25
  84. package/src/components/Markdown.tsx +3 -1
  85. package/src/components/McpManager.tsx +51 -59
  86. package/src/components/MessageBlockItem.tsx +83 -0
  87. package/src/components/MessageList.tsx +55 -52
  88. package/src/components/PluginDetail.tsx +30 -31
  89. package/src/components/SessionSelector.tsx +8 -5
  90. package/src/components/TaskList.tsx +2 -5
  91. package/src/components/ToolDisplay.tsx +5 -1
  92. package/src/contexts/useChat.tsx +22 -2
  93. package/src/hooks/usePluginManager.ts +21 -57
  94. package/src/index.ts +17 -0
  95. package/src/print-cli.ts +3 -0
  96. package/src/utils/highlightUtils.ts +76 -0
  97. package/src/utils/toolParameterTransforms.ts +11 -20
  98. package/dist/components/MessageItem.d.ts +0 -8
  99. package/dist/components/MessageItem.d.ts.map +0 -1
  100. package/dist/components/MessageItem.js +0 -13
  101. package/src/components/MessageItem.tsx +0 -81
package/dist/cli.d.ts CHANGED
@@ -3,6 +3,7 @@ export interface CliOptions {
3
3
  continueLastSession?: boolean;
4
4
  bypassPermissions?: boolean;
5
5
  pluginDirs?: string[];
6
+ tools?: string[];
6
7
  }
7
8
  export declare function startCli(options: CliOptions): Promise<void>;
8
9
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8EjE"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFjE"}
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import { render } from "ink";
3
3
  import { App } from "./components/App.js";
4
4
  import { cleanupLogs } from "./utils/logger.js";
5
5
  export async function startCli(options) {
6
- const { restoreSessionId, continueLastSession, bypassPermissions, pluginDirs, } = options;
6
+ const { restoreSessionId, continueLastSession, bypassPermissions, pluginDirs, tools, } = options;
7
7
  // Continue with ink-based UI for normal mode
8
8
  // Global cleanup tracker
9
9
  let isCleaningUp = false;
@@ -45,7 +45,7 @@ export async function startCli(options) {
45
45
  cleanup();
46
46
  });
47
47
  // Render the application
48
- const { unmount } = render(_jsx(App, { restoreSessionId: restoreSessionId, continueLastSession: continueLastSession, bypassPermissions: bypassPermissions, pluginDirs: pluginDirs }));
48
+ const { unmount } = render(_jsx(App, { restoreSessionId: restoreSessionId, continueLastSession: continueLastSession, bypassPermissions: bypassPermissions, pluginDirs: pluginDirs, tools: tools }));
49
49
  // Store unmount function for cleanup when process exits normally
50
50
  process.on("exit", () => {
51
51
  if (!appUnmounted) {
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/disable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,iBAeA"}
@@ -1,16 +1,9 @@
1
- import { ConfigurationService, PluginManager, PluginScopeManager, } from "wave-agent-sdk";
1
+ import { PluginCore } from "wave-agent-sdk";
2
2
  export async function disablePluginCommand(argv) {
3
3
  const workdir = process.cwd();
4
- const configurationService = new ConfigurationService();
5
- const pluginManager = new PluginManager({ workdir });
6
- const scopeManager = new PluginScopeManager({
7
- workdir,
8
- configurationService,
9
- pluginManager,
10
- });
11
- const scope = argv.scope || scopeManager.findPluginScope(argv.plugin) || "user";
4
+ const pluginCore = new PluginCore(workdir);
12
5
  try {
13
- await scopeManager.disablePlugin(scope, argv.plugin);
6
+ const scope = await pluginCore.disablePlugin(argv.plugin, argv.scope);
14
7
  console.log(`Successfully disabled plugin: ${argv.plugin} in ${scope} scope`);
15
8
  process.exit(0);
16
9
  }
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/enable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,iBAeA"}
@@ -1,16 +1,9 @@
1
- import { ConfigurationService, PluginManager, PluginScopeManager, } from "wave-agent-sdk";
1
+ import { PluginCore } from "wave-agent-sdk";
2
2
  export async function enablePluginCommand(argv) {
3
3
  const workdir = process.cwd();
4
- const configurationService = new ConfigurationService();
5
- const pluginManager = new PluginManager({ workdir });
6
- const scopeManager = new PluginScopeManager({
7
- workdir,
8
- configurationService,
9
- pluginManager,
10
- });
11
- const scope = argv.scope || scopeManager.findPluginScope(argv.plugin) || "user";
4
+ const pluginCore = new PluginCore(workdir);
12
5
  try {
13
- await scopeManager.enablePlugin(scope, argv.plugin);
6
+ const scope = await pluginCore.enablePlugin(argv.plugin, argv.scope);
14
7
  console.log(`Successfully enabled plugin: ${argv.plugin} in ${scope} scope`);
15
8
  process.exit(0);
16
9
  }
@@ -1 +1 @@
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
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEnD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,iBAuBA"}
@@ -1,21 +1,14 @@
1
- import { MarketplaceService, ConfigurationService, PluginManager, PluginScopeManager, } from "wave-agent-sdk";
1
+ import { PluginCore } from "wave-agent-sdk";
2
2
  export async function installPluginCommand(argv) {
3
- const marketplaceService = new MarketplaceService();
4
3
  const workdir = process.cwd();
4
+ const pluginCore = new PluginCore(workdir);
5
5
  try {
6
- const installed = await marketplaceService.installPlugin(argv.plugin);
6
+ const installed = await pluginCore.installPlugin(argv.plugin);
7
7
  console.log(`Successfully installed plugin: ${installed.name} v${installed.version} from ${installed.marketplace}`);
8
8
  console.log(`Cache path: ${installed.cachePath}`);
9
9
  if (argv.scope) {
10
- const configurationService = new ConfigurationService();
11
- const pluginManager = new PluginManager({ workdir });
12
- const scopeManager = new PluginScopeManager({
13
- workdir,
14
- configurationService,
15
- pluginManager,
16
- });
17
10
  const pluginId = `${installed.name}@${installed.marketplace}`;
18
- await scopeManager.enablePlugin(argv.scope, pluginId);
11
+ await pluginCore.enablePlugin(pluginId, argv.scope);
19
12
  console.log(`Plugin ${pluginId} enabled in ${argv.scope} scope`);
20
13
  }
21
14
  process.exit(0);
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/list.ts"],"names":[],"mappings":"AAOA,wBAAsB,kBAAkB,kBA0EvC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/list.ts"],"names":[],"mappings":"AAEA,wBAAsB,kBAAkB,kBA6BvC"}
@@ -1,48 +1,14 @@
1
- import { MarketplaceService, ConfigurationService, PluginScopeManager, PluginManager, } from "wave-agent-sdk";
1
+ import { PluginCore } from "wave-agent-sdk";
2
2
  export async function listPluginsCommand() {
3
- const configurationService = new ConfigurationService();
4
- const marketplaceService = new MarketplaceService();
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
- });
3
+ const pluginCore = new PluginCore(process.cwd());
15
4
  try {
16
- const installedPlugins = await marketplaceService.getInstalledPlugins();
17
- const marketplaces = await marketplaceService.listMarketplaces();
18
- const mergedEnabled = configurationService.getMergedEnabledPlugins(workdir);
19
- // Collect all plugins from all marketplaces
20
- const allMarketplacePlugins = [];
21
- for (const m of marketplaces) {
22
- try {
23
- const manifest = await marketplaceService.loadMarketplaceManifest(marketplaceService.getMarketplacePath(m));
24
- manifest.plugins.forEach((p) => {
25
- const pluginId = `${p.name}@${m.name}`;
26
- const installed = installedPlugins.plugins.find((ip) => ip.name === p.name && ip.marketplace === m.name);
27
- allMarketplacePlugins.push({
28
- name: p.name,
29
- marketplace: m.name,
30
- installed: !!installed,
31
- version: installed?.version,
32
- scope: pluginScopeManager.findPluginScope(pluginId) || undefined,
33
- });
34
- });
35
- }
36
- catch {
37
- // Skip marketplaces that fail to load
38
- }
39
- }
40
- if (allMarketplacePlugins.length === 0) {
5
+ const { plugins, mergedEnabled } = await pluginCore.listPlugins();
6
+ if (plugins.length === 0) {
41
7
  console.log("No plugins found in registered marketplaces.");
42
8
  }
43
9
  else {
44
10
  console.log("Plugins:");
45
- allMarketplacePlugins.forEach((p) => {
11
+ plugins.forEach((p) => {
46
12
  const pluginId = `${p.name}@${p.marketplace}`;
47
13
  const isEnabled = mergedEnabled[pluginId] !== false;
48
14
  const status = p.installed
@@ -1,8 +1,8 @@
1
- import { MarketplaceService } from "wave-agent-sdk";
1
+ import { PluginCore } from "wave-agent-sdk";
2
2
  export async function addMarketplaceCommand(argv) {
3
- const service = new MarketplaceService();
3
+ const pluginCore = new PluginCore(process.cwd());
4
4
  try {
5
- const marketplace = await service.addMarketplace(argv.input);
5
+ const marketplace = await pluginCore.addMarketplace(argv.input);
6
6
  const source = marketplace.source;
7
7
  let sourceInfo = "";
8
8
  if (source.source === "directory") {
@@ -24,9 +24,9 @@ export async function addMarketplaceCommand(argv) {
24
24
  }
25
25
  }
26
26
  export async function listMarketplacesCommand() {
27
- const service = new MarketplaceService();
27
+ const pluginCore = new PluginCore(process.cwd());
28
28
  try {
29
- const marketplaces = await service.listMarketplaces();
29
+ const marketplaces = await pluginCore.listMarketplaces();
30
30
  if (marketplaces.length === 0) {
31
31
  console.log("No marketplaces registered.");
32
32
  }
@@ -57,9 +57,9 @@ export async function listMarketplacesCommand() {
57
57
  }
58
58
  }
59
59
  export async function removeMarketplaceCommand(argv) {
60
- const service = new MarketplaceService();
60
+ const pluginCore = new PluginCore(process.cwd());
61
61
  try {
62
- await service.removeMarketplace(argv.name);
62
+ await pluginCore.removeMarketplace(argv.name);
63
63
  console.log(`Successfully removed marketplace: ${argv.name}`);
64
64
  process.exit(0);
65
65
  }
@@ -70,12 +70,12 @@ export async function removeMarketplaceCommand(argv) {
70
70
  }
71
71
  }
72
72
  export async function updateMarketplaceCommand(argv) {
73
- const service = new MarketplaceService();
73
+ const pluginCore = new PluginCore(process.cwd());
74
74
  try {
75
75
  console.log(argv.name
76
76
  ? `Updating marketplace: ${argv.name}...`
77
77
  : "Updating all marketplaces...");
78
- await service.updateMarketplace(argv.name);
78
+ await pluginCore.updateMarketplace(argv.name);
79
79
  console.log("Successfully updated.");
80
80
  process.exit(0);
81
81
  }
@@ -1 +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"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/uninstall.ts"],"names":[],"mappings":"AAEA,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,iBAcpE"}
@@ -1,24 +1,11 @@
1
- import { MarketplaceService, ConfigurationService, PluginManager, PluginScopeManager, } from "wave-agent-sdk";
1
+ import { PluginCore } from "wave-agent-sdk";
2
2
  export async function uninstallPluginCommand(argv) {
3
- const marketplaceService = new MarketplaceService();
4
3
  const workdir = process.cwd();
4
+ const pluginCore = new PluginCore(workdir);
5
5
  try {
6
- await marketplaceService.uninstallPlugin(argv.plugin, workdir);
6
+ await pluginCore.uninstallPlugin(argv.plugin);
7
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
- }
8
+ console.log(`Cleaned up plugin configuration from all scopes`);
22
9
  process.exit(0);
23
10
  }
24
11
  catch (error) {
@@ -1,8 +1,8 @@
1
- import { MarketplaceService } from "wave-agent-sdk";
1
+ import { PluginCore } from "wave-agent-sdk";
2
2
  export async function updatePluginCommand(argv) {
3
- const marketplaceService = new MarketplaceService();
3
+ const pluginCore = new PluginCore(process.cwd());
4
4
  try {
5
- const updated = await marketplaceService.updatePlugin(argv.plugin);
5
+ const updated = await pluginCore.updatePlugin(argv.plugin);
6
6
  console.log(`Successfully updated plugin: ${updated.name} v${updated.version} from ${updated.marketplace}`);
7
7
  console.log(`Cache path: ${updated.cachePath}`);
8
8
  process.exit(0);
@@ -4,6 +4,7 @@ interface AppProps {
4
4
  continueLastSession?: boolean;
5
5
  bypassPermissions?: boolean;
6
6
  pluginDirs?: string[];
7
+ tools?: string[];
7
8
  }
8
9
  export declare const App: React.FC<AppProps>;
9
10
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,UAAU,QAAQ;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AA4DD,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAiBlC,CAAC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,UAAU,QAAQ;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAiED,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAmBlC,CAAC"}
@@ -4,8 +4,8 @@ import { useStdout } from "ink";
4
4
  import { ChatInterface } from "./ChatInterface.js";
5
5
  import { ChatProvider, useChat } from "../contexts/useChat.js";
6
6
  import { AppProvider } from "../contexts/useAppConfig.js";
7
- const AppWithProviders = ({ bypassPermissions, pluginDirs }) => {
8
- return (_jsx(ChatProvider, { bypassPermissions: bypassPermissions, pluginDirs: pluginDirs, children: _jsx(ChatInterfaceWithRemount, {}) }));
7
+ const AppWithProviders = ({ bypassPermissions, pluginDirs, tools }) => {
8
+ return (_jsx(ChatProvider, { bypassPermissions: bypassPermissions, pluginDirs: pluginDirs, tools: tools, children: _jsx(ChatInterfaceWithRemount, {}) }));
9
9
  };
10
10
  const ChatInterfaceWithRemount = () => {
11
11
  const { stdout } = useStdout();
@@ -43,6 +43,6 @@ const ChatInterfaceWithRemount = () => {
43
43
  ]);
44
44
  return _jsx(ChatInterface, {}, remountKey);
45
45
  };
46
- export const App = ({ restoreSessionId, continueLastSession, bypassPermissions, pluginDirs, }) => {
47
- return (_jsx(AppProvider, { restoreSessionId: restoreSessionId, continueLastSession: continueLastSession, children: _jsx(AppWithProviders, { bypassPermissions: bypassPermissions, pluginDirs: pluginDirs }) }));
46
+ export const App = ({ restoreSessionId, continueLastSession, bypassPermissions, pluginDirs, tools, }) => {
47
+ return (_jsx(AppProvider, { restoreSessionId: restoreSessionId, continueLastSession: continueLastSession, children: _jsx(AppWithProviders, { bypassPermissions: bypassPermissions, pluginDirs: pluginDirs, tools: tools }) }));
48
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BackgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/components/BackgroundTaskManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAcnD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CA6StE,CAAC"}
1
+ {"version":3,"file":"BackgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/components/BackgroundTaskManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAcnD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAsUtE,CAAC"}
@@ -6,6 +6,7 @@ export const BackgroundTaskManager = ({ onCancel, }) => {
6
6
  const { backgroundTasks, getBackgroundTaskOutput, stopBackgroundTask } = useChat();
7
7
  const [tasks, setTasks] = useState([]);
8
8
  const [selectedIndex, setSelectedIndex] = useState(0);
9
+ const MAX_VISIBLE_ITEMS = 3;
9
10
  const [viewMode, setViewMode] = useState("list");
10
11
  const [detailTaskId, setDetailTaskId] = useState(null);
11
12
  const [detailOutput, setDetailOutput] = useState(null);
@@ -43,15 +44,21 @@ export const BackgroundTaskManager = ({ onCancel, }) => {
43
44
  const stopTask = (taskId) => {
44
45
  stopBackgroundTask(taskId);
45
46
  };
47
+ // Calculate visible window
48
+ const startIndex = Math.max(0, Math.min(selectedIndex - Math.floor(MAX_VISIBLE_ITEMS / 2), Math.max(0, tasks.length - MAX_VISIBLE_ITEMS)));
49
+ const visibleTasks = tasks.slice(startIndex, startIndex + MAX_VISIBLE_ITEMS);
46
50
  useInput((input, key) => {
47
51
  if (viewMode === "list") {
48
52
  // List mode navigation
49
53
  if (key.return) {
50
- if (tasks.length > 0 && selectedIndex < tasks.length) {
51
- const selectedTask = tasks[selectedIndex];
52
- setDetailTaskId(selectedTask.id);
53
- setViewMode("detail");
54
- }
54
+ setSelectedIndex((prev) => {
55
+ if (tasks.length > 0 && prev < tasks.length) {
56
+ const selectedTask = tasks[prev];
57
+ setDetailTaskId(selectedTask.id);
58
+ setViewMode("detail");
59
+ }
60
+ return prev;
61
+ });
55
62
  return;
56
63
  }
57
64
  if (key.escape) {
@@ -59,18 +66,23 @@ export const BackgroundTaskManager = ({ onCancel, }) => {
59
66
  return;
60
67
  }
61
68
  if (key.upArrow) {
62
- setSelectedIndex(Math.max(0, selectedIndex - 1));
69
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
63
70
  return;
64
71
  }
65
72
  if (key.downArrow) {
66
- setSelectedIndex(Math.min(tasks.length - 1, selectedIndex + 1));
73
+ setSelectedIndex((prev) => Math.min(tasks.length - 1, prev + 1));
67
74
  return;
68
75
  }
69
- if (input === "k" && tasks.length > 0 && selectedIndex < tasks.length) {
70
- const selectedTask = tasks[selectedIndex];
71
- if (selectedTask.status === "running") {
72
- stopTask(selectedTask.id);
73
- }
76
+ if (input === "k") {
77
+ setSelectedIndex((prev) => {
78
+ if (tasks.length > 0 && prev < tasks.length) {
79
+ const selectedTask = tasks[prev];
80
+ if (selectedTask.status === "running") {
81
+ stopTask(selectedTask.id);
82
+ }
83
+ }
84
+ return prev;
85
+ });
74
86
  return;
75
87
  }
76
88
  }
@@ -105,10 +117,14 @@ export const BackgroundTaskManager = ({ onCancel, }) => {
105
117
  if (tasks.length === 0) {
106
118
  return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", borderBottom: false, borderLeft: false, borderRight: false, paddingTop: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "Background Tasks" }), _jsx(Text, { children: "No background tasks found" }), _jsx(Text, { dimColor: true, children: "Press Escape to close" })] }));
107
119
  }
108
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", borderBottom: false, borderLeft: false, borderRight: false, paddingTop: 1, gap: 1, children: [_jsx(Box, { children: _jsx(Text, { color: "cyan", bold: true, children: "Background Tasks" }) }), _jsx(Text, { dimColor: true, children: "Select a task to view details" }), tasks.map((task, index) => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: index === selectedIndex ? "black" : "white", backgroundColor: index === selectedIndex ? "cyan" : undefined, children: [index === selectedIndex ? "▶ " : " ", index + 1, ". [", task.id, "] ", task.type, task.description ? `: ${task.description}` : "", _jsxs(Text, { color: task.status === "running"
109
- ? "green"
110
- : task.status === "completed"
111
- ? "blue"
112
- : "red", children: [" ", "(", task.status, ")"] })] }), index === selectedIndex && (_jsx(Box, { marginLeft: 4, flexDirection: "column", children: _jsxs(Text, { color: "gray", dimColor: true, children: ["Started: ", formatTime(task.startTime), task.runtime !== undefined &&
113
- ` | Runtime: ${formatDuration(task.runtime)}`, task.exitCode !== undefined && ` | Exit: ${task.exitCode}`] }) }))] }, task.id))), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["\u2191/\u2193 to select \u00B7 Enter to view \u00B7", " ", tasks[selectedIndex]?.status === "running" ? "k to stop · " : "", "Esc to close"] }) })] }));
120
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", borderBottom: false, borderLeft: false, borderRight: false, paddingTop: 1, gap: 1, children: [_jsx(Box, { children: _jsx(Text, { color: "cyan", bold: true, children: "Background Tasks" }) }), _jsx(Text, { dimColor: true, children: "Select a task to view details" }), _jsx(Box, { flexDirection: "column", children: visibleTasks.map((task, index) => {
121
+ const actualIndex = startIndex + index;
122
+ const isSelected = actualIndex === selectedIndex;
123
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: isSelected ? "black" : "white", backgroundColor: isSelected ? "cyan" : undefined, children: [isSelected ? "▶ " : " ", actualIndex + 1, ". [", task.id, "] ", task.type, task.description ? `: ${task.description}` : "", _jsxs(Text, { color: task.status === "running"
124
+ ? "green"
125
+ : task.status === "completed"
126
+ ? "blue"
127
+ : "red", children: [" ", "(", task.status, ")"] })] }), isSelected && (_jsx(Box, { marginLeft: 4, flexDirection: "column", children: _jsxs(Text, { color: "gray", dimColor: true, children: ["Started: ", formatTime(task.startTime), task.runtime !== undefined &&
128
+ ` | Runtime: ${formatDuration(task.runtime)}`, task.exitCode !== undefined && ` | Exit: ${task.exitCode}`] }) }))] }, task.id));
129
+ }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["\u2191/\u2193 to select \u00B7 Enter to view \u00B7", " ", tasks[selectedIndex]?.status === "running" ? "k to stop · " : "", "Esc to close"] }) })] }));
114
130
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAYrD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAyHjC,CAAC"}
1
+ {"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAYtE,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAqIjC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useCallback } from "react";
2
+ import { useState, useCallback, useLayoutEffect } from "react";
3
3
  import { Box, useStdout } from "ink";
4
4
  import { MessageList } from "./MessageList.js";
5
5
  import { InputBox } from "./InputBox.js";
@@ -10,38 +10,51 @@ import { ConfirmationSelector } from "./ConfirmationSelector.js";
10
10
  import { useChat } from "../contexts/useChat.js";
11
11
  export const ChatInterface = () => {
12
12
  const { stdout } = useStdout();
13
- const [isDetailsTooTall, setIsDetailsTooTall] = useState(false);
13
+ const [detailsHeight, setDetailsHeight] = useState(0);
14
+ const [selectorHeight, setSelectorHeight] = useState(0);
15
+ const [isConfirmationTooTall, setIsConfirmationTooTall] = useState(false);
14
16
  const { messages, isLoading, isCommandRunning, isCompressing, sendMessage, abortMessage, mcpServers, connectMcpServer, disconnectMcpServer, isExpanded, sessionId, latestTotalTokens, slashCommands, hasSlashCommand, isConfirmationVisible, confirmingTool, handleConfirmationDecision, handleConfirmationCancel: originalHandleConfirmationCancel, setWasLastDetailsTooTall, } = useChat();
15
- const handleHeightMeasured = useCallback((height) => {
17
+ const handleDetailsHeightMeasured = useCallback((height) => {
18
+ setDetailsHeight(height);
19
+ }, []);
20
+ const handleSelectorHeightMeasured = useCallback((height) => {
21
+ setSelectorHeight(height);
22
+ }, []);
23
+ useLayoutEffect(() => {
16
24
  const terminalHeight = stdout?.rows || 24;
17
- if (height > terminalHeight - 10) {
18
- setIsDetailsTooTall(true);
25
+ const totalHeight = detailsHeight + selectorHeight;
26
+ if (totalHeight > terminalHeight) {
27
+ setIsConfirmationTooTall(true);
19
28
  }
20
29
  else {
21
- setIsDetailsTooTall(false);
30
+ setIsConfirmationTooTall(false);
22
31
  }
23
- }, [stdout?.rows]);
32
+ }, [detailsHeight, selectorHeight, stdout?.rows]);
24
33
  const handleConfirmationCancel = useCallback(() => {
25
- if (isDetailsTooTall) {
34
+ if (isConfirmationTooTall) {
26
35
  setWasLastDetailsTooTall((prev) => prev + 1);
27
- setIsDetailsTooTall(false);
36
+ setIsConfirmationTooTall(false);
28
37
  }
29
38
  originalHandleConfirmationCancel();
30
39
  }, [
31
- isDetailsTooTall,
40
+ isConfirmationTooTall,
32
41
  originalHandleConfirmationCancel,
33
42
  setWasLastDetailsTooTall,
34
43
  ]);
35
44
  const wrappedHandleConfirmationDecision = useCallback((decision) => {
36
- if (isDetailsTooTall) {
45
+ if (isConfirmationTooTall) {
37
46
  setWasLastDetailsTooTall((prev) => prev + 1);
38
- setIsDetailsTooTall(false);
47
+ setIsConfirmationTooTall(false);
39
48
  }
40
49
  handleConfirmationDecision(decision);
41
- }, [isDetailsTooTall, handleConfirmationDecision, setWasLastDetailsTooTall]);
50
+ }, [
51
+ isConfirmationTooTall,
52
+ handleConfirmationDecision,
53
+ setWasLastDetailsTooTall,
54
+ ]);
42
55
  if (!sessionId)
43
56
  return null;
44
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(MessageList, { messages: messages, isLoading: isLoading, isCommandRunning: isCommandRunning, isExpanded: isExpanded, forceStaticLastMessage: isDetailsTooTall }), (isLoading || isCommandRunning || isCompressing) &&
57
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(MessageList, { messages: messages, isExpanded: isExpanded, hideDynamicBlocks: isConfirmationVisible }), (isLoading || isCommandRunning || isCompressing) &&
45
58
  !isConfirmationVisible &&
46
- !isExpanded && (_jsx(LoadingIndicator, { isLoading: isLoading, isCommandRunning: isCommandRunning, isCompressing: isCompressing, latestTotalTokens: latestTotalTokens })), !isConfirmationVisible && !isExpanded && _jsx(TaskList, {}), isConfirmationVisible && (_jsxs(_Fragment, { children: [_jsx(ConfirmationDetails, { toolName: confirmingTool.name, toolInput: confirmingTool.input, isExpanded: isExpanded, onHeightMeasured: handleHeightMeasured }), _jsx(ConfirmationSelector, { toolName: confirmingTool.name, toolInput: confirmingTool.input, suggestedPrefix: confirmingTool.suggestedPrefix, hidePersistentOption: confirmingTool.hidePersistentOption, isExpanded: isExpanded, onDecision: wrappedHandleConfirmationDecision, onCancel: handleConfirmationCancel, onAbort: abortMessage })] })), !isConfirmationVisible && !isExpanded && (_jsx(InputBox, { isLoading: isLoading, isCommandRunning: isCommandRunning, sendMessage: sendMessage, abortMessage: abortMessage, mcpServers: mcpServers, connectMcpServer: connectMcpServer, disconnectMcpServer: disconnectMcpServer, slashCommands: slashCommands, hasSlashCommand: hasSlashCommand }))] }));
59
+ !isExpanded && (_jsx(LoadingIndicator, { isLoading: isLoading, isCommandRunning: isCommandRunning, isCompressing: isCompressing, latestTotalTokens: latestTotalTokens })), !isConfirmationVisible && !isExpanded && _jsx(TaskList, {}), isConfirmationVisible && (_jsxs(_Fragment, { children: [_jsx(ConfirmationDetails, { toolName: confirmingTool.name, toolInput: confirmingTool.input, isExpanded: isExpanded, onHeightMeasured: handleDetailsHeightMeasured, isStatic: isConfirmationTooTall }), _jsx(ConfirmationSelector, { toolName: confirmingTool.name, toolInput: confirmingTool.input, suggestedPrefix: confirmingTool.suggestedPrefix, hidePersistentOption: confirmingTool.hidePersistentOption, isExpanded: isExpanded, onDecision: wrappedHandleConfirmationDecision, onCancel: handleConfirmationCancel, onAbort: abortMessage, onHeightMeasured: handleSelectorHeightMeasured })] })), !isConfirmationVisible && !isExpanded && (_jsx(InputBox, { isLoading: isLoading, isCommandRunning: isCommandRunning, sendMessage: sendMessage, abortMessage: abortMessage, mcpServers: mcpServers, connectMcpServer: connectMcpServer, disconnectMcpServer: disconnectMcpServer, slashCommands: slashCommands, hasSlashCommand: hasSlashCommand }))] }));
47
60
  };
@@ -4,6 +4,7 @@ export interface ConfirmationDetailsProps {
4
4
  toolInput?: Record<string, unknown>;
5
5
  isExpanded?: boolean;
6
6
  onHeightMeasured?: (height: number) => void;
7
+ isStatic?: boolean;
7
8
  }
8
9
  export declare const ConfirmationDetails: React.FC<ConfirmationDetailsProps>;
9
10
  //# sourceMappingURL=ConfirmationDetails.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmationDetails.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmationDetails.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4C,MAAM,OAAO,CAAC;AA2CjE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAuDlE,CAAC"}
1
+ {"version":3,"file":"ConfirmationDetails.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmationDetails.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkC,MAAM,OAAO,CAAC;AAqCvD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA0DlE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { useLayoutEffect, useRef, useState } from "react";
2
+ import { useLayoutEffect, useRef } from "react";
3
3
  import { Box, Text, useStdout, measureElement, Static } from "ink";
4
- import { BASH_TOOL_NAME, EDIT_TOOL_NAME, MULTI_EDIT_TOOL_NAME, DELETE_FILE_TOOL_NAME, WRITE_TOOL_NAME, EXIT_PLAN_MODE_TOOL_NAME, ASK_USER_QUESTION_TOOL_NAME, } from "wave-agent-sdk";
4
+ import { BASH_TOOL_NAME, EDIT_TOOL_NAME, WRITE_TOOL_NAME, EXIT_PLAN_MODE_TOOL_NAME, ASK_USER_QUESTION_TOOL_NAME, } from "wave-agent-sdk";
5
5
  import { DiffDisplay } from "./DiffDisplay.js";
6
6
  import { PlanDisplay } from "./PlanDisplay.js";
7
7
  // Helper function to generate descriptive action text
@@ -14,10 +14,6 @@ const getActionDescription = (toolName, toolInput) => {
14
14
  return `Execute command: ${toolInput.command || "unknown command"}`;
15
15
  case EDIT_TOOL_NAME:
16
16
  return `Edit file: ${toolInput.file_path || "unknown file"}`;
17
- case MULTI_EDIT_TOOL_NAME:
18
- return `Edit multiple sections in: ${toolInput.file_path || "unknown file"}`;
19
- case DELETE_FILE_TOOL_NAME:
20
- return `Delete file: ${toolInput.target_file || "unknown file"}`;
21
17
  case WRITE_TOOL_NAME:
22
18
  return `Write to file: ${toolInput.file_path || "unknown file"}`;
23
19
  case EXIT_PLAN_MODE_TOOL_NAME:
@@ -28,21 +24,18 @@ const getActionDescription = (toolName, toolInput) => {
28
24
  return "Execute operation";
29
25
  }
30
26
  };
31
- export const ConfirmationDetails = ({ toolName, toolInput, isExpanded = false, onHeightMeasured, }) => {
27
+ export const ConfirmationDetails = ({ toolName, toolInput, isExpanded = false, onHeightMeasured, isStatic = false, }) => {
32
28
  const { stdout } = useStdout();
33
- const [isStatic, setIsStatic] = useState(false);
34
29
  const boxRef = useRef(null);
30
+ const startLineNumber = toolInput?.startLineNumber ??
31
+ (toolName === WRITE_TOOL_NAME ? 1 : undefined);
35
32
  useLayoutEffect(() => {
36
33
  if (boxRef.current) {
37
34
  const { height } = measureElement(boxRef.current);
38
- const terminalHeight = stdout?.rows || 24;
39
- if (height > terminalHeight - 10) {
40
- setIsStatic(true);
41
- }
42
35
  onHeightMeasured?.(height);
43
36
  }
44
- }, [stdout?.rows, onHeightMeasured]);
45
- const content = (_jsxs(Box, { ref: boxRef, 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 &&
37
+ }, [stdout?.rows, onHeightMeasured, toolInput, isExpanded]);
38
+ const content = (_jsxs(Box, { ref: boxRef, flexDirection: "column", borderStyle: "single", borderColor: "yellow", borderBottom: false, borderLeft: false, borderRight: false, 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), startLineNumber: startLineNumber }), toolName !== ASK_USER_QUESTION_TOOL_NAME &&
46
39
  toolName === EXIT_PLAN_MODE_TOOL_NAME &&
47
40
  !!toolInput?.plan_content && (_jsx(PlanDisplay, { plan: toolInput.plan_content, isExpanded: isExpanded }))] }));
48
41
  if (isStatic) {
@@ -9,6 +9,7 @@ export interface ConfirmationSelectorProps {
9
9
  onDecision: (decision: PermissionDecision) => void;
10
10
  onCancel: () => void;
11
11
  onAbort: () => void;
12
+ onHeightMeasured?: (height: number) => void;
12
13
  }
13
14
  export declare const ConfirmationSelector: React.FC<ConfirmationSelectorProps>;
14
15
  //# sourceMappingURL=ConfirmationSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmationSelector.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmationSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,gBAAgB,CAAC;AAgB/E,MAAM,WAAW,yBAAyB;IACxC,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,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAwapE,CAAC"}
1
+ {"version":3,"file":"ConfirmationSelector.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmationSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4C,MAAM,OAAO,CAAC;AAEjE,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,gBAAgB,CAAC;AAgB/E,MAAM,WAAW,yBAAyB;IACxC,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;IACpB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AASD,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAsfpE,CAAC"}