@hyperspaceng/neural-coding-agent 0.61.6 → 0.63.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 (162) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +2 -2
  3. package/dist/cli/file-processor.d.ts.map +1 -1
  4. package/dist/cli/file-processor.js +4 -0
  5. package/dist/cli/file-processor.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +10 -3
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +60 -46
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/export-html/index.d.ts +2 -2
  11. package/dist/core/export-html/index.d.ts.map +1 -1
  12. package/dist/core/export-html/index.js +2 -2
  13. package/dist/core/export-html/index.js.map +1 -1
  14. package/dist/core/export-html/tool-renderer.d.ts +2 -2
  15. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  16. package/dist/core/export-html/tool-renderer.js +41 -16
  17. package/dist/core/export-html/tool-renderer.js.map +1 -1
  18. package/dist/core/extensions/index.d.ts +3 -2
  19. package/dist/core/extensions/index.d.ts.map +1 -1
  20. package/dist/core/extensions/index.js.map +1 -1
  21. package/dist/core/extensions/loader.d.ts.map +1 -1
  22. package/dist/core/extensions/loader.js +12 -2
  23. package/dist/core/extensions/loader.js.map +1 -1
  24. package/dist/core/extensions/runner.d.ts +4 -7
  25. package/dist/core/extensions/runner.d.ts.map +1 -1
  26. package/dist/core/extensions/runner.js +27 -38
  27. package/dist/core/extensions/runner.js.map +1 -1
  28. package/dist/core/extensions/types.d.ts +44 -9
  29. package/dist/core/extensions/types.d.ts.map +1 -1
  30. package/dist/core/extensions/types.js.map +1 -1
  31. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  32. package/dist/core/extensions/wrapper.js +2 -8
  33. package/dist/core/extensions/wrapper.js.map +1 -1
  34. package/dist/core/index.d.ts +1 -0
  35. package/dist/core/index.d.ts.map +1 -1
  36. package/dist/core/index.js +1 -0
  37. package/dist/core/index.js.map +1 -1
  38. package/dist/core/output-guard.d.ts +6 -0
  39. package/dist/core/output-guard.d.ts.map +1 -0
  40. package/dist/core/output-guard.js +59 -0
  41. package/dist/core/output-guard.js.map +1 -0
  42. package/dist/core/package-manager.d.ts +1 -0
  43. package/dist/core/package-manager.d.ts.map +1 -1
  44. package/dist/core/package-manager.js +27 -8
  45. package/dist/core/package-manager.js.map +1 -1
  46. package/dist/core/prompt-templates.d.ts +2 -1
  47. package/dist/core/prompt-templates.d.ts.map +1 -1
  48. package/dist/core/prompt-templates.js +30 -32
  49. package/dist/core/prompt-templates.js.map +1 -1
  50. package/dist/core/resource-loader.d.ts +6 -5
  51. package/dist/core/resource-loader.d.ts.map +1 -1
  52. package/dist/core/resource-loader.js +136 -108
  53. package/dist/core/resource-loader.js.map +1 -1
  54. package/dist/core/sdk.d.ts +1 -1
  55. package/dist/core/sdk.d.ts.map +1 -1
  56. package/dist/core/sdk.js.map +1 -1
  57. package/dist/core/skills.d.ts +2 -1
  58. package/dist/core/skills.d.ts.map +1 -1
  59. package/dist/core/skills.js +25 -1
  60. package/dist/core/skills.js.map +1 -1
  61. package/dist/core/slash-commands.d.ts +2 -3
  62. package/dist/core/slash-commands.d.ts.map +1 -1
  63. package/dist/core/slash-commands.js.map +1 -1
  64. package/dist/core/source-info.d.ts +18 -0
  65. package/dist/core/source-info.d.ts.map +1 -0
  66. package/dist/core/source-info.js +19 -0
  67. package/dist/core/source-info.js.map +1 -0
  68. package/dist/core/system-prompt.d.ts.map +1 -1
  69. package/dist/core/system-prompt.js +3 -38
  70. package/dist/core/system-prompt.js.map +1 -1
  71. package/dist/core/tools/bash.d.ts +19 -9
  72. package/dist/core/tools/bash.d.ts.map +1 -1
  73. package/dist/core/tools/bash.js +151 -59
  74. package/dist/core/tools/bash.js.map +1 -1
  75. package/dist/core/tools/edit.d.ts +14 -2
  76. package/dist/core/tools/edit.d.ts.map +1 -1
  77. package/dist/core/tools/edit.js +92 -21
  78. package/dist/core/tools/edit.js.map +1 -1
  79. package/dist/core/tools/find.d.ts +11 -4
  80. package/dist/core/tools/find.d.ts.map +1 -1
  81. package/dist/core/tools/find.js +76 -27
  82. package/dist/core/tools/find.js.map +1 -1
  83. package/dist/core/tools/grep.d.ts +15 -4
  84. package/dist/core/tools/grep.d.ts.map +1 -1
  85. package/dist/core/tools/grep.js +83 -29
  86. package/dist/core/tools/grep.js.map +1 -1
  87. package/dist/core/tools/index.d.ts +57 -19
  88. package/dist/core/tools/index.d.ts.map +1 -1
  89. package/dist/core/tools/index.js +50 -26
  90. package/dist/core/tools/index.js.map +1 -1
  91. package/dist/core/tools/ls.d.ts +9 -3
  92. package/dist/core/tools/ls.d.ts.map +1 -1
  93. package/dist/core/tools/ls.js +67 -13
  94. package/dist/core/tools/ls.js.map +1 -1
  95. package/dist/core/tools/read.d.ts +10 -3
  96. package/dist/core/tools/read.d.ts.map +1 -1
  97. package/dist/core/tools/read.js +110 -51
  98. package/dist/core/tools/read.js.map +1 -1
  99. package/dist/core/tools/render-utils.d.ts +21 -0
  100. package/dist/core/tools/render-utils.d.ts.map +1 -0
  101. package/dist/core/tools/render-utils.js +49 -0
  102. package/dist/core/tools/render-utils.js.map +1 -0
  103. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  104. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  105. package/dist/core/tools/tool-definition-wrapper.js +30 -0
  106. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  107. package/dist/core/tools/write.d.ts +9 -3
  108. package/dist/core/tools/write.d.ts.map +1 -1
  109. package/dist/core/tools/write.js +162 -27
  110. package/dist/core/tools/write.js.map +1 -1
  111. package/dist/index.d.ts +3 -2
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +2 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/main.d.ts.map +1 -1
  116. package/dist/main.js +29 -9
  117. package/dist/main.js.map +1 -1
  118. package/dist/modes/interactive/components/tool-execution.d.ts +15 -40
  119. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  120. package/dist/modes/interactive/components/tool-execution.js +126 -679
  121. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  122. package/dist/modes/interactive/interactive-mode.d.ts +4 -11
  123. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  124. package/dist/modes/interactive/interactive-mode.js +144 -92
  125. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  126. package/dist/modes/interactive/theme/theme.d.ts +3 -0
  127. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  128. package/dist/modes/interactive/theme/theme.js +14 -0
  129. package/dist/modes/interactive/theme/theme.js.map +1 -1
  130. package/dist/modes/print-mode.d.ts.map +1 -1
  131. package/dist/modes/print-mode.js +5 -11
  132. package/dist/modes/print-mode.js.map +1 -1
  133. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  134. package/dist/modes/rpc/rpc-mode.js +27 -20
  135. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  136. package/dist/modes/rpc/rpc-types.d.ts +3 -4
  137. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  138. package/dist/modes/rpc/rpc-types.js.map +1 -1
  139. package/dist/utils/image-resize.d.ts +5 -5
  140. package/dist/utils/image-resize.d.ts.map +1 -1
  141. package/dist/utils/image-resize.js +45 -94
  142. package/dist/utils/image-resize.js.map +1 -1
  143. package/docs/extensions.md +72 -32
  144. package/docs/tui.md +2 -2
  145. package/examples/extensions/built-in-tool-renderer.ts +8 -8
  146. package/examples/extensions/commands.ts +3 -3
  147. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  148. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  149. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  150. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  151. package/examples/extensions/minimal-mode.ts +14 -14
  152. package/examples/extensions/question.ts +2 -2
  153. package/examples/extensions/questionnaire.ts +2 -2
  154. package/examples/extensions/subagent/index.ts +2 -2
  155. package/examples/extensions/todo.ts +2 -2
  156. package/examples/extensions/truncated-tool.ts +2 -2
  157. package/examples/extensions/with-deps/package-lock.json +2 -2
  158. package/examples/extensions/with-deps/package.json +1 -1
  159. package/examples/sdk/04-skills.ts +8 -2
  160. package/examples/sdk/08-prompt-templates.ts +2 -1
  161. package/examples/sdk/12-full-control.ts +0 -1
  162. package/package.json +4 -4
@@ -27,9 +27,10 @@ import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
27
27
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
28
28
  import { expandPromptTemplate } from "./prompt-templates.js";
29
29
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
30
- import { BUILTIN_SLASH_COMMANDS } from "./slash-commands.js";
30
+ import { createSyntheticSourceInfo } from "./source-info.js";
31
31
  import { buildSystemPrompt } from "./system-prompt.js";
32
- import { createAllTools } from "./tools/index.js";
32
+ import { createAllToolDefinitions } from "./tools/index.js";
33
+ import { createToolDefinitionFromAgentTool, wrapToolDefinition } from "./tools/tool-definition-wrapper.js";
33
34
  /**
34
35
  * Parse a skill block from message text.
35
36
  * Returns null if the text doesn't contain a skill block.
@@ -89,7 +90,7 @@ export class AgentSession {
89
90
  _turnIndex = 0;
90
91
  _resourceLoader;
91
92
  _customTools;
92
- _baseToolRegistry = new Map();
93
+ _baseToolDefinitions = new Map();
93
94
  _cwd;
94
95
  _extensionRunnerRef;
95
96
  _initialActiveToolNames;
@@ -103,6 +104,7 @@ export class AgentSession {
103
104
  _modelRegistry;
104
105
  // Tool registry for extension getTools/setTools
105
106
  _toolRegistry = new Map();
107
+ _toolDefinitions = new Map();
106
108
  _toolPromptSnippets = new Map();
107
109
  _toolPromptGuidelines = new Map();
108
110
  // Base system prompt (without extension appends) - used to apply fresh appends each turn
@@ -493,15 +495,19 @@ export class AgentSession {
493
495
  return this.agent.state.tools.map((t) => t.name);
494
496
  }
495
497
  /**
496
- * Get all configured tools with name, description, and parameter schema.
498
+ * Get all configured tools with name, description, parameter schema, and source metadata.
497
499
  */
498
500
  getAllTools() {
499
- return Array.from(this._toolRegistry.values()).map((t) => ({
500
- name: t.name,
501
- description: t.description,
502
- parameters: t.parameters,
501
+ return Array.from(this._toolDefinitions.values()).map(({ definition, sourceInfo }) => ({
502
+ name: definition.name,
503
+ description: definition.description,
504
+ parameters: definition.parameters,
505
+ sourceInfo,
503
506
  }));
504
507
  }
508
+ getToolDefinition(name) {
509
+ return this._toolDefinitions.get(name)?.definition;
510
+ }
505
511
  /**
506
512
  * Set active tools by name.
507
513
  * Only tools in the registry can be enabled. Unknown tool names are ignored.
@@ -1656,36 +1662,24 @@ export class AgentSession {
1656
1662
  this.agent.setModel(refreshedModel);
1657
1663
  }
1658
1664
  _bindExtensionCore(runner) {
1659
- const normalizeLocation = (source) => {
1660
- if (source === "user" || source === "project" || source === "path") {
1661
- return source;
1662
- }
1663
- return undefined;
1664
- };
1665
- const reservedBuiltins = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));
1666
1665
  const getCommands = () => {
1667
- const extensionCommands = runner
1668
- .getRegisteredCommandsWithPaths()
1669
- .filter(({ command }) => !reservedBuiltins.has(command.name))
1670
- .map(({ command, extensionPath }) => ({
1671
- name: command.name,
1666
+ const extensionCommands = runner.getRegisteredCommands().map((command) => ({
1667
+ name: command.invocationName,
1672
1668
  description: command.description,
1673
1669
  source: "extension",
1674
- path: extensionPath,
1670
+ sourceInfo: command.sourceInfo,
1675
1671
  }));
1676
1672
  const templates = this.promptTemplates.map((template) => ({
1677
1673
  name: template.name,
1678
1674
  description: template.description,
1679
1675
  source: "prompt",
1680
- location: normalizeLocation(template.source),
1681
- path: template.filePath,
1676
+ sourceInfo: template.sourceInfo,
1682
1677
  }));
1683
1678
  const skills = this._resourceLoader.getSkills().skills.map((skill) => ({
1684
1679
  name: `skill:${skill.name}`,
1685
1680
  description: skill.description,
1686
1681
  source: "skill",
1687
- location: normalizeLocation(skill.source),
1688
- path: skill.filePath,
1682
+ sourceInfo: skill.sourceInfo,
1689
1683
  }));
1690
1684
  return [...extensionCommands, ...templates, ...skills];
1691
1685
  };
@@ -1773,24 +1767,44 @@ export class AgentSession {
1773
1767
  const registeredTools = this._extensionRunner?.getAllRegisteredTools() ?? [];
1774
1768
  const allCustomTools = [
1775
1769
  ...registeredTools,
1776
- ...this._customTools.map((def) => ({ definition: def, extensionPath: "<sdk>" })),
1770
+ ...this._customTools.map((definition) => ({
1771
+ definition,
1772
+ sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" }),
1773
+ })),
1777
1774
  ];
1778
- this._toolPromptSnippets = new Map(allCustomTools
1779
- .map((registeredTool) => {
1780
- const snippet = this._normalizePromptSnippet(registeredTool.definition.promptSnippet);
1781
- return snippet ? [registeredTool.definition.name, snippet] : undefined;
1775
+ const definitionRegistry = new Map(Array.from(this._baseToolDefinitions.entries()).map(([name, definition]) => [
1776
+ name,
1777
+ {
1778
+ definition,
1779
+ sourceInfo: createSyntheticSourceInfo(`<builtin:${name}>`, { source: "builtin" }),
1780
+ },
1781
+ ]));
1782
+ for (const tool of allCustomTools) {
1783
+ definitionRegistry.set(tool.definition.name, {
1784
+ definition: tool.definition,
1785
+ sourceInfo: tool.sourceInfo,
1786
+ });
1787
+ }
1788
+ this._toolDefinitions = definitionRegistry;
1789
+ this._toolPromptSnippets = new Map(Array.from(definitionRegistry.values())
1790
+ .map(({ definition }) => {
1791
+ const snippet = this._normalizePromptSnippet(definition.promptSnippet);
1792
+ return snippet ? [definition.name, snippet] : undefined;
1782
1793
  })
1783
1794
  .filter((entry) => entry !== undefined));
1784
- this._toolPromptGuidelines = new Map(allCustomTools
1785
- .map((registeredTool) => {
1786
- const guidelines = this._normalizePromptGuidelines(registeredTool.definition.promptGuidelines);
1787
- return guidelines.length > 0 ? [registeredTool.definition.name, guidelines] : undefined;
1795
+ this._toolPromptGuidelines = new Map(Array.from(definitionRegistry.values())
1796
+ .map(({ definition }) => {
1797
+ const guidelines = this._normalizePromptGuidelines(definition.promptGuidelines);
1798
+ return guidelines.length > 0 ? [definition.name, guidelines] : undefined;
1788
1799
  })
1789
1800
  .filter((entry) => entry !== undefined));
1790
1801
  const wrappedExtensionTools = this._extensionRunner
1791
1802
  ? wrapRegisteredTools(allCustomTools, this._extensionRunner)
1792
1803
  : [];
1793
- const toolRegistry = new Map(this._baseToolRegistry);
1804
+ const toolRegistry = new Map(Array.from(this._baseToolDefinitions.values()).map((definition) => [
1805
+ definition.name,
1806
+ wrapToolDefinition(definition),
1807
+ ]));
1794
1808
  for (const tool of wrappedExtensionTools) {
1795
1809
  toolRegistry.set(tool.name, tool);
1796
1810
  }
@@ -1815,13 +1829,16 @@ export class AgentSession {
1815
1829
  _buildRuntime(options) {
1816
1830
  const autoResizeImages = this.settingsManager.getImageAutoResize();
1817
1831
  const shellCommandPrefix = this.settingsManager.getShellCommandPrefix();
1818
- const baseTools = this._baseToolsOverride
1819
- ? this._baseToolsOverride
1820
- : createAllTools(this._cwd, {
1832
+ const baseToolDefinitions = this._baseToolsOverride
1833
+ ? Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name, tool]) => [
1834
+ name,
1835
+ createToolDefinitionFromAgentTool(tool),
1836
+ ]))
1837
+ : createAllToolDefinitions(this._cwd, {
1821
1838
  read: { autoResizeImages },
1822
1839
  bash: { commandPrefix: shellCommandPrefix },
1823
1840
  });
1824
- this._baseToolRegistry = new Map(Object.entries(baseTools).map(([name, tool]) => [name, tool]));
1841
+ this._baseToolDefinitions = new Map(Object.entries(baseToolDefinitions).map(([name, tool]) => [name, tool]));
1825
1842
  const extensionsResult = this._resourceLoader.getExtensions();
1826
1843
  if (options.flagValues) {
1827
1844
  for (const [name, value] of options.flagValues) {
@@ -2500,13 +2517,10 @@ export class AgentSession {
2500
2517
  async exportToHtml(outputPath) {
2501
2518
  const themeName = this.settingsManager.getTheme();
2502
2519
  // Create tool renderer if we have an extension runner (for custom tool HTML rendering)
2503
- let toolRenderer;
2504
- if (this._extensionRunner) {
2505
- toolRenderer = createToolHtmlRenderer({
2506
- getToolDefinition: (name) => this._extensionRunner.getToolDefinition(name),
2507
- theme,
2508
- });
2509
- }
2520
+ const toolRenderer = createToolHtmlRenderer({
2521
+ getToolDefinition: (name) => this.getToolDefinition(name),
2522
+ theme,
2523
+ });
2510
2524
  return await exportSessionToHtml(this.sessionManager, this.state, {
2511
2525
  outputPath,
2512
2526
  themeName,