@dyyz1993/pi-coding-agent 0.69.8 → 0.69.10

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 (37) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/dist/config.d.ts +8 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +47 -2
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +8 -2
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +111 -3
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/extensions/index.d.ts +1 -1
  11. package/dist/core/extensions/index.d.ts.map +1 -1
  12. package/dist/core/extensions/index.js.map +1 -1
  13. package/dist/core/extensions/loader.d.ts.map +1 -1
  14. package/dist/core/extensions/loader.js +2 -1
  15. package/dist/core/extensions/loader.js.map +1 -1
  16. package/dist/core/extensions/runner.d.ts +1 -0
  17. package/dist/core/extensions/runner.d.ts.map +1 -1
  18. package/dist/core/extensions/runner.js +4 -0
  19. package/dist/core/extensions/runner.js.map +1 -1
  20. package/dist/core/extensions/types.d.ts +20 -0
  21. package/dist/core/extensions/types.d.ts.map +1 -1
  22. package/dist/core/extensions/types.js.map +1 -1
  23. package/dist/core/session-manager.d.ts +2 -0
  24. package/dist/core/session-manager.d.ts.map +1 -1
  25. package/dist/core/session-manager.js +5 -2
  26. package/dist/core/session-manager.js.map +1 -1
  27. package/dist/index.d.ts +2 -4
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -2
  30. package/dist/index.js.map +1 -1
  31. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  32. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  33. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  34. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  35. package/examples/extensions/with-deps/package-lock.json +2 -2
  36. package/examples/extensions/with-deps/package.json +1 -1
  37. package/package.json +4 -4
@@ -14,7 +14,8 @@
14
14
  */
15
15
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
16
16
  import { basename, dirname, join, resolve } from "node:path";
17
- import { isContextOverflow, modelsAreEqual, resetApiProviders, supportsXhigh } from "@dyyz1993/pi-ai";
17
+ import { Agent, } from "@dyyz1993/pi-agent-core";
18
+ import { complete, isContextOverflow, modelsAreEqual, resetApiProviders, supportsXhigh } from "@dyyz1993/pi-ai";
18
19
  import { getDocsPath } from "../config.js";
19
20
  import { theme } from "../modes/interactive/theme/theme.js";
20
21
  import { stripFrontmatter } from "../utils/frontmatter.js";
@@ -31,7 +32,7 @@ import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-man
31
32
  import { createSyntheticSourceInfo } from "./source-info.js";
32
33
  import { buildSystemPrompt } from "./system-prompt.js";
33
34
  import { createLocalBashOperations } from "./tools/bash.js";
34
- import { createAllToolDefinitions } from "./tools/index.js";
35
+ import { createAllToolDefinitions, createTool } from "./tools/index.js";
35
36
  import { createToolDefinitionFromAgentTool } from "./tools/tool-definition-wrapper.js";
36
37
  /**
37
38
  * Parse a skill block from message text.
@@ -1622,6 +1623,7 @@ export class AgentSession {
1622
1623
  if (bindings.registerChannel !== undefined) {
1623
1624
  this._registerChannel = bindings.registerChannel;
1624
1625
  this._extensionRunner.flushPendingChannels(bindings.registerChannel);
1626
+ this._extensionRunner.updateRegisterChannel(bindings.registerChannel);
1625
1627
  }
1626
1628
  this._applyExtensionBindings(this._extensionRunner);
1627
1629
  await this._extensionRunner.emit(this._sessionStartEvent);
@@ -1728,7 +1730,8 @@ export class AgentSession {
1728
1730
  });
1729
1731
  },
1730
1732
  appendEntry: (customType, data) => {
1731
- this.sessionManager.appendCustomEntry(customType, data);
1733
+ const id = this.sessionManager.appendCustomEntry(customType, data);
1734
+ this._emit({ type: "custom_entry", customType, data, id });
1732
1735
  },
1733
1736
  setSessionName: (name) => {
1734
1737
  this.sessionManager.appendSessionInfo(name);
@@ -1756,6 +1759,7 @@ export class AgentSession {
1756
1759
  ((name) => {
1757
1760
  throw new Error(`registerChannel("${name}") is only available in RPC mode`);
1758
1761
  }),
1762
+ callLLM: (options) => this.callLLM(options),
1759
1763
  }, {
1760
1764
  getModel: () => this.model,
1761
1765
  isIdle: () => !this.isStreaming,
@@ -1790,6 +1794,110 @@ export class AgentSession {
1790
1794
  },
1791
1795
  });
1792
1796
  }
1797
+ async callLLM(options) {
1798
+ const model = this.model;
1799
+ if (!model)
1800
+ throw new Error("No model selected");
1801
+ const auth = await this._modelRegistry.getApiKeyAndHeaders(model);
1802
+ if (!auth?.ok) {
1803
+ throw new Error(auth?.error ?? `No API key configured for ${model.provider}`);
1804
+ }
1805
+ if (!auth.apiKey) {
1806
+ throw new Error(`No API key configured for ${model.provider}`);
1807
+ }
1808
+ if (options.signal?.aborted) {
1809
+ throw new Error("Aborted");
1810
+ }
1811
+ const messages = options.messages.map((m) => ({
1812
+ role: m.role,
1813
+ content: [{ type: "text", text: m.content }],
1814
+ timestamp: Date.now(),
1815
+ }));
1816
+ if (!options.tools || options.tools.length === 0) {
1817
+ const context = {
1818
+ systemPrompt: options.systemPrompt,
1819
+ messages,
1820
+ };
1821
+ const response = await complete(model, context, {
1822
+ apiKey: auth.apiKey,
1823
+ headers: auth.headers,
1824
+ maxTokens: options.maxTokens,
1825
+ signal: options.signal,
1826
+ });
1827
+ return response.content
1828
+ .filter((c) => c.type === "text")
1829
+ .map((c) => c.text)
1830
+ .join("\n");
1831
+ }
1832
+ const toolInstances = options.tools
1833
+ .map((name) => {
1834
+ try {
1835
+ const registered = this._toolRegistry.get(name);
1836
+ if (registered)
1837
+ return registered;
1838
+ return createTool(name, this._cwd);
1839
+ }
1840
+ catch {
1841
+ return undefined;
1842
+ }
1843
+ })
1844
+ .filter((t) => t !== undefined);
1845
+ if (toolInstances.length === 0) {
1846
+ const context = {
1847
+ systemPrompt: options.systemPrompt,
1848
+ messages,
1849
+ };
1850
+ const response = await complete(model, context, {
1851
+ apiKey: auth.apiKey,
1852
+ headers: auth.headers,
1853
+ maxTokens: options.maxTokens,
1854
+ signal: options.signal,
1855
+ });
1856
+ return response.content
1857
+ .filter((c) => c.type === "text")
1858
+ .map((c) => c.text)
1859
+ .join("\n");
1860
+ }
1861
+ const agent = new Agent({
1862
+ getApiKey: () => auth.apiKey,
1863
+ initialState: {
1864
+ systemPrompt: options.systemPrompt ?? "",
1865
+ model,
1866
+ thinkingLevel: "off",
1867
+ tools: toolInstances,
1868
+ messages: [],
1869
+ },
1870
+ });
1871
+ if (options.signal?.aborted) {
1872
+ throw new Error("Aborted");
1873
+ }
1874
+ let resultText = "";
1875
+ const unsub = agent.subscribe((event) => {
1876
+ if (event.type === "message_end" && "message" in event) {
1877
+ const msg = event.message;
1878
+ if (msg.role === "assistant") {
1879
+ const content = msg.content;
1880
+ if (Array.isArray(content)) {
1881
+ resultText = content
1882
+ .filter((c) => c.type === "text")
1883
+ .map((c) => c.text)
1884
+ .join("\n");
1885
+ }
1886
+ }
1887
+ }
1888
+ });
1889
+ try {
1890
+ await agent.prompt({
1891
+ role: "user",
1892
+ content: [{ type: "text", text: options.messages[0]?.content ?? "" }],
1893
+ timestamp: Date.now(),
1894
+ });
1895
+ }
1896
+ finally {
1897
+ unsub();
1898
+ }
1899
+ return resultText;
1900
+ }
1793
1901
  _refreshToolRegistry(options) {
1794
1902
  const previousRegistryNames = new Set(this._toolRegistry.keys());
1795
1903
  const previousActiveToolNames = this.getActiveToolNames();