






























@@ -1724,6 +1724,91 @@ describe("resolvePluginTools optional tools", () => {
17241724expect(factory).toHaveBeenCalledTimes(2);
17251725});
172617261727+it("executes the matching cached plugin tool when unnamed factories share declared names", async () => {
1728+const alphaFactory = vi.fn(() => ({
1729+ ...makeTool("implicit_alpha"),
1730+async execute() {
1731+return { content: [{ type: "text", text: "implicit-alpha-ok" }] };
1732+},
1733+}));
1734+const betaFactory = vi.fn(() => ({
1735+ ...makeTool("implicit_beta"),
1736+async execute() {
1737+return { content: [{ type: "text", text: "implicit-beta-ok" }] };
1738+},
1739+}));
1740+setRegistry([
1741+{
1742+pluginId: "implicit-owner",
1743+optional: false,
1744+source: "/tmp/implicit-owner.js",
1745+names: [],
1746+declaredNames: ["implicit_alpha", "implicit_beta"],
1747+factory: alphaFactory,
1748+},
1749+{
1750+pluginId: "implicit-owner",
1751+optional: false,
1752+source: "/tmp/implicit-owner.js",
1753+names: [],
1754+declaredNames: ["implicit_alpha", "implicit_beta"],
1755+factory: betaFactory,
1756+},
1757+]);
1758+1759+const first = resolvePluginTools(createResolveToolsParams());
1760+const second = resolvePluginTools(createResolveToolsParams());
1761+const betaTool = second.find((tool) => tool.name === "implicit_beta");
1762+1763+expectResolvedToolNames(first, ["implicit_alpha", "implicit_beta"]);
1764+expectResolvedToolNames(second, ["implicit_alpha", "implicit_beta"]);
1765+await expect(betaTool?.execute("call", {}, undefined)).resolves.toEqual({
1766+content: [{ type: "text", text: "implicit-beta-ok" }],
1767+});
1768+expect(alphaFactory).toHaveBeenCalledTimes(2);
1769+expect(betaFactory).toHaveBeenCalledTimes(2);
1770+});
1771+1772+it("does not invoke unrelated named factories before cached unnamed tool fallback", async () => {
1773+const namedFactory = vi.fn(() => makeTool("unrelated_tool"));
1774+const implicitFactory = vi.fn(() => ({
1775+ ...makeTool("implicit_tool"),
1776+async execute() {
1777+return { content: [{ type: "text", text: "implicit-ok" }] };
1778+},
1779+}));
1780+setRegistry([
1781+{
1782+pluginId: "implicit-owner",
1783+optional: false,
1784+source: "/tmp/implicit-owner.js",
1785+names: ["unrelated_tool"],
1786+declaredNames: ["unrelated_tool"],
1787+factory: namedFactory,
1788+},
1789+{
1790+pluginId: "implicit-owner",
1791+optional: false,
1792+source: "/tmp/implicit-owner.js",
1793+names: [],
1794+declaredNames: ["implicit_tool"],
1795+factory: implicitFactory,
1796+},
1797+]);
1798+1799+resolvePluginTools(createResolveToolsParams());
1800+const cachedTools = resolvePluginTools(createResolveToolsParams());
1801+namedFactory.mockClear();
1802+implicitFactory.mockClear();
1803+1804+const implicitTool = cachedTools.find((tool) => tool.name === "implicit_tool");
1805+await expect(implicitTool?.execute("call", {}, undefined)).resolves.toEqual({
1806+content: [{ type: "text", text: "implicit-ok" }],
1807+});
1808+expect(namedFactory).not.toHaveBeenCalled();
1809+expect(implicitFactory).toHaveBeenCalledTimes(1);
1810+});
1811+17271812it("skips factory-returned tools outside the manifest tool contract", () => {
17281813const registry = setRegistry([
17291814{
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。