erosolar-cli 1.7.404 → 1.7.405

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 (48) hide show
  1. package/dist/StringUtils.d.ts +4 -1
  2. package/dist/StringUtils.d.ts.map +1 -1
  3. package/dist/StringUtils.js +8 -2
  4. package/dist/StringUtils.js.map +1 -1
  5. package/dist/capabilities/toolRegistry.js +1 -1
  6. package/dist/capabilities/toolRegistry.js.map +1 -1
  7. package/dist/contracts/schemas/tool-selection.schema.json +7 -1
  8. package/dist/contracts/tools.schema.json +149 -103
  9. package/dist/contracts/v1/toolAccess.d.ts +1 -1
  10. package/dist/contracts/v1/toolAccess.d.ts.map +1 -1
  11. package/dist/runtime/agentController.d.ts.map +1 -1
  12. package/dist/runtime/agentController.js +19 -1
  13. package/dist/runtime/agentController.js.map +1 -1
  14. package/dist/shell/interactiveShell.d.ts.map +1 -1
  15. package/dist/shell/interactiveShell.js +29 -17
  16. package/dist/shell/interactiveShell.js.map +1 -1
  17. package/dist/shell/terminalInput.d.ts +4 -0
  18. package/dist/shell/terminalInput.d.ts.map +1 -1
  19. package/dist/shell/terminalInput.js +28 -9
  20. package/dist/shell/terminalInput.js.map +1 -1
  21. package/dist/shell/terminalInputAdapter.d.ts +1 -0
  22. package/dist/shell/terminalInputAdapter.d.ts.map +1 -1
  23. package/dist/shell/terminalInputAdapter.js +3 -0
  24. package/dist/shell/terminalInputAdapter.js.map +1 -1
  25. package/dist/tools/enhancedCodeIntelligenceTools.js +1 -2
  26. package/dist/tools/enhancedCodeIntelligenceTools.js.map +1 -1
  27. package/dist/tools/fileTools.js +3 -0
  28. package/dist/tools/fileTools.js.map +1 -1
  29. package/dist/tools/frontendTestingTools.js +1 -1
  30. package/dist/tools/frontendTestingTools.js.map +1 -1
  31. package/dist/tools/learnTools.d.ts +2 -0
  32. package/dist/tools/learnTools.d.ts.map +1 -1
  33. package/dist/tools/learnTools.js +4 -0
  34. package/dist/tools/learnTools.js.map +1 -1
  35. package/dist/tools/localExplore.d.ts.map +1 -1
  36. package/dist/tools/localExplore.js +0 -1
  37. package/dist/tools/localExplore.js.map +1 -1
  38. package/dist/tools/notebookEditTools.js.map +1 -1
  39. package/dist/tools/repoChecksTools.js +4 -3
  40. package/dist/tools/repoChecksTools.js.map +1 -1
  41. package/dist/tools/searchTools.js +4 -0
  42. package/dist/tools/searchTools.js.map +1 -1
  43. package/dist/tools/softwareEngineeringTools.d.ts.map +1 -1
  44. package/dist/tools/softwareEngineeringTools.js +1 -0
  45. package/dist/tools/softwareEngineeringTools.js.map +1 -1
  46. package/dist/tools/webTools.d.ts.map +1 -1
  47. package/dist/tools/webTools.js.map +1 -1
  48. package/package.json +3 -3
@@ -902,7 +902,7 @@ export class InteractiveShell {
902
902
  : null;
903
903
  // Stop any active spinner to prevent process hang
904
904
  display.stopThinking(false);
905
- this.stopStreamingHeartbeat();
905
+ this.stopStreamingHeartbeat({ skipRender: true });
906
906
  this.uiUpdates.dispose();
907
907
  this.clearPromptRefreshTimer();
908
908
  this.teardownStatusTracking();
@@ -911,7 +911,9 @@ export class InteractiveShell {
911
911
  // Clear any pending cleanup to prevent hanging
912
912
  this.pendingCleanup = null;
913
913
  // Reset terminal state before disposing adapters
914
- this.terminalInput.exitStreamingScrollRegion({ skipRender: true });
914
+ if (this.terminalInput.isScrollRegionActive()) {
915
+ this.terminalInput.exitStreamingScrollRegion({ skipRender: true });
916
+ }
915
917
  if (this.alternateScreenEnabled) {
916
918
  this.terminalInput.exitAlternateScreen();
917
919
  }
@@ -1021,7 +1023,7 @@ export class InteractiveShell {
1021
1023
  const defaults = buildEnabledToolSet(null);
1022
1024
  if (setsEqual(interaction.selection, defaults)) {
1023
1025
  clearToolSettings();
1024
- display.showInfo('Tool settings cleared. Defaults will be used on the next launch.');
1026
+ display.showInfo('Tool settings cleared. Defaults will be used on the next launch. Next steps: enable any optional suites from the Tools menu or preferences (restart to apply) if you want them available by default.');
1025
1027
  return;
1026
1028
  }
1027
1029
  const ordered = interaction.options
@@ -1765,7 +1767,7 @@ export class InteractiveShell {
1765
1767
  }
1766
1768
  }
1767
1769
  startStreamingHeartbeat(label = 'Streaming') {
1768
- this.stopStreamingHeartbeat();
1770
+ this.stopStreamingHeartbeat({ skipRender: true });
1769
1771
  // Enter global streaming mode - blocks all non-streaming UI output
1770
1772
  enterStreamingMode();
1771
1773
  this.streamingStatusBase = label;
@@ -1801,7 +1803,13 @@ export class InteractiveShell {
1801
1803
  },
1802
1804
  });
1803
1805
  }
1804
- stopStreamingHeartbeat() {
1806
+ stopStreamingHeartbeat(options = {}) {
1807
+ const skipRender = !!options.skipRender;
1808
+ const streamingActive = this.isStreamingUiActive();
1809
+ const scrollRegionActive = this.terminalInput.isScrollRegionActive();
1810
+ if (!streamingActive && !scrollRegionActive) {
1811
+ return;
1812
+ }
1805
1813
  // Exit global streaming mode - allows UI to render again
1806
1814
  exitStreamingMode();
1807
1815
  // Preserve final elapsed time before clearing heartbeat start
@@ -1809,7 +1817,7 @@ export class InteractiveShell {
1809
1817
  this.lastStreamingElapsedSeconds = Math.max(0, Math.floor((Date.now() - this.streamingHeartbeatStart) / 1000));
1810
1818
  }
1811
1819
  // Exit scroll region mode
1812
- this.terminalInput.exitStreamingScrollRegion();
1820
+ this.terminalInput.exitStreamingScrollRegion({ skipRender });
1813
1821
  this.uiUpdates.stopHeartbeat('streaming');
1814
1822
  this.streamingHeartbeatStart = null;
1815
1823
  this.streamingHeartbeatFrame = 0;
@@ -1822,7 +1830,9 @@ export class InteractiveShell {
1822
1830
  // Clear streaming status from display
1823
1831
  display.updateStreamingStatus(null);
1824
1832
  // Force refresh to update the input area now that streaming has ended
1825
- this.refreshStatusLine(true);
1833
+ if (!skipRender) {
1834
+ this.refreshStatusLine(true);
1835
+ }
1826
1836
  }
1827
1837
  buildStreamingStatus(label, _elapsedSeconds) {
1828
1838
  // Model + elapsed time already live in the pinned meta header; keep the streaming
@@ -5391,7 +5401,7 @@ export class InteractiveShell {
5391
5401
  }
5392
5402
  display.stopThinking(false);
5393
5403
  this.uiUpdates.setMode('processing');
5394
- this.stopStreamingHeartbeat();
5404
+ this.stopStreamingHeartbeat({ skipRender: true });
5395
5405
  this.isProcessing = false;
5396
5406
  this.terminalInput.setStreaming(false);
5397
5407
  this.uiAdapter.endProcessing('Ready for prompts');
@@ -6020,7 +6030,8 @@ What's the next action?`;
6020
6030
  if (thinking) {
6021
6031
  this.presentThoughtProcess(thinking, enriched, {
6022
6032
  wasStreamed: metadata.wasStreamed,
6023
- renderWhenStreamed: !blocksActive && Boolean(metadata.wasStreamed),
6033
+ // Always render the thought block immediately when present so it appears first.
6034
+ renderWhenStreamed: true,
6024
6035
  });
6025
6036
  }
6026
6037
  if (metadata.isFinal) {
@@ -6028,8 +6039,8 @@ What's the next action?`;
6028
6039
  this.finalizeAssistantStream();
6029
6040
  }
6030
6041
  const body = responseContent || content;
6031
- const shouldRenderResponse = Boolean(body && (!metadata.wasStreamed || !blocksActive || !streamRendered));
6032
- if (shouldRenderResponse) {
6042
+ // Always render the final response body even if it already streamed.
6043
+ if (body) {
6033
6044
  this.renderAssistantContent('response', body, { ...enriched, isFinal: true });
6034
6045
  }
6035
6046
  this.renderToolUsageSummary({ ...enriched, isFinal: true });
@@ -6115,7 +6126,7 @@ What's the next action?`;
6115
6126
  // Update UI to show operation was cancelled
6116
6127
  display.showWarning('Operation cancelled.');
6117
6128
  this.uiUpdates.setMode('processing');
6118
- this.stopStreamingHeartbeat();
6129
+ this.stopStreamingHeartbeat({ skipRender: true });
6119
6130
  this.updateStatusMessage(null);
6120
6131
  this.terminalInput.setStreaming(false);
6121
6132
  this.renderPromptArea();
@@ -6220,20 +6231,21 @@ What's the next action?`;
6220
6231
  buildThinkingDirective() {
6221
6232
  switch (this.thinkingMode) {
6222
6233
  case 'concise':
6223
- return 'Concise thinking mode is enabled: respond directly with the final answer and skip <thinking> blocks unless the user explicitly asks for your reasoning.';
6234
+ return 'Concise thinking mode: respond directly with the final answer and skip <thinking> blocks unless the user explicitly asks for reasoning.';
6224
6235
  case 'extended':
6225
6236
  return [
6226
- 'Extended thinking mode is enabled. Format every reply as:',
6237
+ 'Extended thinking mode: include a <thinking> block followed by a <response> block.',
6227
6238
  '<thinking>',
6228
- 'Detailed multi-step reasoning (reference tool runs/files when relevant, keep secrets redacted, no code blocks unless citing filenames).',
6239
+ 'Brief, structured reasoning (cite tools/files when relevant; no secrets).',
6229
6240
  '</thinking>',
6230
6241
  '<response>',
6231
- 'Final answer with actionable next steps and any code/commands requested.',
6242
+ 'Final answer with requested code/commands and next steps.',
6232
6243
  '</response>',
6233
6244
  ].join('\n');
6234
6245
  case 'balanced':
6235
6246
  default:
6236
- return 'Balanced thinking mode: include a short <thinking>...</thinking> block before <response> when the reasoning is non-trivial; skip it for simple answers.';
6247
+ // Balanced is the default; avoid injecting extra prompt text to keep context lean.
6248
+ return null;
6237
6249
  }
6238
6250
  }
6239
6251
  buildDisplayMetadata(metadata) {