clanker-agent/packages/coding-agent/test/agent-session-dynamic-tools.test.ts
Harivansh Rathi 0250f72976 move pi-mono into companion-cloud as apps/companion-os
- Copy all pi-mono source into apps/companion-os/
- Update Dockerfile to COPY pre-built binary instead of downloading from GitHub Releases
- Update deploy-staging.yml to build pi from source (bun compile) before Docker build
- Add apps/companion-os/** to path triggers
- No more cross-repo dispatch needed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 09:22:50 -08:00

90 lines
2.8 KiB
TypeScript

import { existsSync, mkdirSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { getModel } from "@mariozechner/pi-ai";
import { Type } from "@sinclair/typebox";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { DefaultResourceLoader } from "../src/core/resource-loader.js";
import { createAgentSession } from "../src/core/sdk.js";
import { SessionManager } from "../src/core/session-manager.js";
import { SettingsManager } from "../src/core/settings-manager.js";
describe("AgentSession dynamic tool registration", () => {
let tempDir: string;
let agentDir: string;
beforeEach(() => {
tempDir = join(
tmpdir(),
`pi-dynamic-tool-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
);
agentDir = join(tempDir, "agent");
mkdirSync(agentDir, { recursive: true });
});
afterEach(() => {
if (tempDir && existsSync(tempDir)) {
rmSync(tempDir, { recursive: true, force: true });
}
});
it("refreshes tool registry when tools are registered after initialization", async () => {
const settingsManager = SettingsManager.create(tempDir, agentDir);
const sessionManager = SessionManager.inMemory();
const resourceLoader = new DefaultResourceLoader({
cwd: tempDir,
agentDir,
settingsManager,
extensionFactories: [
(pi) => {
pi.on("session_start", () => {
pi.registerTool({
name: "dynamic_tool",
label: "Dynamic Tool",
description: "Tool registered from session_start",
promptSnippet: "Run dynamic test behavior",
promptGuidelines: [
"Use dynamic_tool when the user asks for dynamic behavior tests.",
],
parameters: Type.Object({}),
execute: async () => ({
content: [{ type: "text", text: "ok" }],
details: {},
}),
});
});
},
],
});
await resourceLoader.reload();
const { session } = await createAgentSession({
cwd: tempDir,
agentDir,
model: getModel("anthropic", "claude-sonnet-4-5")!,
settingsManager,
sessionManager,
resourceLoader,
});
expect(session.getAllTools().map((tool) => tool.name)).not.toContain(
"dynamic_tool",
);
await session.bindExtensions({});
expect(session.getAllTools().map((tool) => tool.name)).toContain(
"dynamic_tool",
);
expect(session.getActiveToolNames()).toContain("dynamic_tool");
expect(session.systemPrompt).toContain(
"- dynamic_tool: Run dynamic test behavior",
);
expect(session.systemPrompt).toContain(
"- Use dynamic_tool when the user asks for dynamic behavior tests.",
);
session.dispose();
});
});