@dyyz1993/pi-coding-agent 0.69.9 → 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.
- package/dist/core/agent-session.d.ts +8 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +111 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +1 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +4 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +20 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- 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 {
|
|
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();
|