@codex-infinity/pi-infinity 0.61.2 → 0.62.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 (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 +133 -107
  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 +154 -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 +161 -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 +120 -670
  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 +1 -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.
@@ -85,9 +86,10 @@ export class AgentSession {
85
86
  // Extension system
86
87
  this._extensionRunner = undefined;
87
88
  this._turnIndex = 0;
88
- this._baseToolRegistry = new Map();
89
+ this._baseToolDefinitions = new Map();
89
90
  // Tool registry for extension getTools/setTools
90
91
  this._toolRegistry = new Map();
92
+ this._toolDefinitions = new Map();
91
93
  this._toolPromptSnippets = new Map();
92
94
  this._toolPromptGuidelines = new Map();
93
95
  // Base system prompt (without extension appends) - used to apply fresh appends each turn
@@ -481,15 +483,19 @@ export class AgentSession {
481
483
  return this.agent.state.tools.map((t) => t.name);
482
484
  }
483
485
  /**
484
- * Get all configured tools with name, description, and parameter schema.
486
+ * Get all configured tools with name, description, parameter schema, and source metadata.
485
487
  */
486
488
  getAllTools() {
487
- return Array.from(this._toolRegistry.values()).map((t) => ({
488
- name: t.name,
489
- description: t.description,
490
- parameters: t.parameters,
489
+ return Array.from(this._toolDefinitions.values()).map(({ definition, sourceInfo }) => ({
490
+ name: definition.name,
491
+ description: definition.description,
492
+ parameters: definition.parameters,
493
+ sourceInfo,
491
494
  }));
492
495
  }
496
+ getToolDefinition(name) {
497
+ return this._toolDefinitions.get(name)?.definition;
498
+ }
493
499
  /**
494
500
  * Set active tools by name.
495
501
  * Only tools in the registry can be enabled. Unknown tool names are ignored.
@@ -1644,36 +1650,24 @@ export class AgentSession {
1644
1650
  this.agent.setModel(refreshedModel);
1645
1651
  }
1646
1652
  _bindExtensionCore(runner) {
1647
- const normalizeLocation = (source) => {
1648
- if (source === "user" || source === "project" || source === "path") {
1649
- return source;
1650
- }
1651
- return undefined;
1652
- };
1653
- const reservedBuiltins = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));
1654
1653
  const getCommands = () => {
1655
- const extensionCommands = runner
1656
- .getRegisteredCommandsWithPaths()
1657
- .filter(({ command }) => !reservedBuiltins.has(command.name))
1658
- .map(({ command, extensionPath }) => ({
1659
- name: command.name,
1654
+ const extensionCommands = runner.getRegisteredCommands().map((command) => ({
1655
+ name: command.invocationName,
1660
1656
  description: command.description,
1661
1657
  source: "extension",
1662
- path: extensionPath,
1658
+ sourceInfo: command.sourceInfo,
1663
1659
  }));
1664
1660
  const templates = this.promptTemplates.map((template) => ({
1665
1661
  name: template.name,
1666
1662
  description: template.description,
1667
1663
  source: "prompt",
1668
- location: normalizeLocation(template.source),
1669
- path: template.filePath,
1664
+ sourceInfo: template.sourceInfo,
1670
1665
  }));
1671
1666
  const skills = this._resourceLoader.getSkills().skills.map((skill) => ({
1672
1667
  name: `skill:${skill.name}`,
1673
1668
  description: skill.description,
1674
1669
  source: "skill",
1675
- location: normalizeLocation(skill.source),
1676
- path: skill.filePath,
1670
+ sourceInfo: skill.sourceInfo,
1677
1671
  }));
1678
1672
  return [...extensionCommands, ...templates, ...skills];
1679
1673
  };
@@ -1761,24 +1755,44 @@ export class AgentSession {
1761
1755
  const registeredTools = this._extensionRunner?.getAllRegisteredTools() ?? [];
1762
1756
  const allCustomTools = [
1763
1757
  ...registeredTools,
1764
- ...this._customTools.map((def) => ({ definition: def, extensionPath: "<sdk>" })),
1758
+ ...this._customTools.map((definition) => ({
1759
+ definition,
1760
+ sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" }),
1761
+ })),
1765
1762
  ];
1766
- this._toolPromptSnippets = new Map(allCustomTools
1767
- .map((registeredTool) => {
1768
- const snippet = this._normalizePromptSnippet(registeredTool.definition.promptSnippet);
1769
- return snippet ? [registeredTool.definition.name, snippet] : undefined;
1763
+ const definitionRegistry = new Map(Array.from(this._baseToolDefinitions.entries()).map(([name, definition]) => [
1764
+ name,
1765
+ {
1766
+ definition,
1767
+ sourceInfo: createSyntheticSourceInfo(`<builtin:${name}>`, { source: "builtin" }),
1768
+ },
1769
+ ]));
1770
+ for (const tool of allCustomTools) {
1771
+ definitionRegistry.set(tool.definition.name, {
1772
+ definition: tool.definition,
1773
+ sourceInfo: tool.sourceInfo,
1774
+ });
1775
+ }
1776
+ this._toolDefinitions = definitionRegistry;
1777
+ this._toolPromptSnippets = new Map(Array.from(definitionRegistry.values())
1778
+ .map(({ definition }) => {
1779
+ const snippet = this._normalizePromptSnippet(definition.promptSnippet);
1780
+ return snippet ? [definition.name, snippet] : undefined;
1770
1781
  })
1771
1782
  .filter((entry) => entry !== undefined));
1772
- this._toolPromptGuidelines = new Map(allCustomTools
1773
- .map((registeredTool) => {
1774
- const guidelines = this._normalizePromptGuidelines(registeredTool.definition.promptGuidelines);
1775
- return guidelines.length > 0 ? [registeredTool.definition.name, guidelines] : undefined;
1783
+ this._toolPromptGuidelines = new Map(Array.from(definitionRegistry.values())
1784
+ .map(({ definition }) => {
1785
+ const guidelines = this._normalizePromptGuidelines(definition.promptGuidelines);
1786
+ return guidelines.length > 0 ? [definition.name, guidelines] : undefined;
1776
1787
  })
1777
1788
  .filter((entry) => entry !== undefined));
1778
1789
  const wrappedExtensionTools = this._extensionRunner
1779
1790
  ? wrapRegisteredTools(allCustomTools, this._extensionRunner)
1780
1791
  : [];
1781
- const toolRegistry = new Map(this._baseToolRegistry);
1792
+ const toolRegistry = new Map(Array.from(this._baseToolDefinitions.values()).map((definition) => [
1793
+ definition.name,
1794
+ wrapToolDefinition(definition),
1795
+ ]));
1782
1796
  for (const tool of wrappedExtensionTools) {
1783
1797
  toolRegistry.set(tool.name, tool);
1784
1798
  }
@@ -1803,13 +1817,16 @@ export class AgentSession {
1803
1817
  _buildRuntime(options) {
1804
1818
  const autoResizeImages = this.settingsManager.getImageAutoResize();
1805
1819
  const shellCommandPrefix = this.settingsManager.getShellCommandPrefix();
1806
- const baseTools = this._baseToolsOverride
1807
- ? this._baseToolsOverride
1808
- : createAllTools(this._cwd, {
1820
+ const baseToolDefinitions = this._baseToolsOverride
1821
+ ? Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name, tool]) => [
1822
+ name,
1823
+ createToolDefinitionFromAgentTool(tool),
1824
+ ]))
1825
+ : createAllToolDefinitions(this._cwd, {
1809
1826
  read: { autoResizeImages },
1810
1827
  bash: { commandPrefix: shellCommandPrefix },
1811
1828
  });
1812
- this._baseToolRegistry = new Map(Object.entries(baseTools).map(([name, tool]) => [name, tool]));
1829
+ this._baseToolDefinitions = new Map(Object.entries(baseToolDefinitions).map(([name, tool]) => [name, tool]));
1813
1830
  const extensionsResult = this._resourceLoader.getExtensions();
1814
1831
  if (options.flagValues) {
1815
1832
  for (const [name, value] of options.flagValues) {
@@ -2526,13 +2543,10 @@ export class AgentSession {
2526
2543
  async exportToHtml(outputPath) {
2527
2544
  const themeName = this.settingsManager.getTheme();
2528
2545
  // Create tool renderer if we have an extension runner (for custom tool HTML rendering)
2529
- let toolRenderer;
2530
- if (this._extensionRunner) {
2531
- toolRenderer = createToolHtmlRenderer({
2532
- getToolDefinition: (name) => this._extensionRunner.getToolDefinition(name),
2533
- theme,
2534
- });
2535
- }
2546
+ const toolRenderer = createToolHtmlRenderer({
2547
+ getToolDefinition: (name) => this.getToolDefinition(name),
2548
+ theme,
2549
+ });
2536
2550
  return await exportSessionToHtml(this.sessionManager, this.state, {
2537
2551
  outputPath,
2538
2552
  themeName,