Commit e16b76f79a98
2026-02-16 15:03:10
1 parent
76fed6d
Changed files (2)
src
pi
tools
src/pi/tools/logging.ts
@@ -0,0 +1,48 @@
+/**
+ * Tool logging wrapper
+ * Wraps tools to add execution logging
+ */
+
+import type { AgentTool } from "@mariozechner/pi-agent-core";
+
+/**
+ * Wrap a tool with logging
+ */
+export function withLogging(tool: AgentTool, debug: boolean = false): AgentTool {
+ if (!debug) {
+ return tool; // No wrapping if debug disabled
+ }
+
+ return {
+ ...tool,
+ execute: async (toolCallId, params, signal, onUpdate) => {
+ const startTime = Date.now();
+
+ console.log(`[Tool:${tool.name}] Starting execution`);
+ console.log(`[Tool:${tool.name}] Parameters:`, JSON.stringify(params, null, 2));
+
+ try {
+ const result = await tool.execute(toolCallId, params, signal, onUpdate);
+
+ const elapsed = Date.now() - startTime;
+ const resultText = result.content
+ .filter((c: any) => c.type === "text")
+ .map((c: any) => c.text)
+ .join(" ");
+
+ console.log(`[Tool:${tool.name}] Completed in ${elapsed}ms`);
+ console.log(`[Tool:${tool.name}] Result preview: ${resultText.slice(0, 100)}${resultText.length > 100 ? "..." : ""}`);
+
+ if (result.details) {
+ console.log(`[Tool:${tool.name}] Details:`, JSON.stringify(result.details, null, 2));
+ }
+
+ return result;
+ } catch (error) {
+ const elapsed = Date.now() - startTime;
+ console.error(`[Tool:${tool.name}] Failed after ${elapsed}ms:`, error);
+ throw error;
+ }
+ },
+ };
+}
src/pi/agent-wrapper.ts
@@ -32,11 +32,18 @@ export class XmppAgent {
private agent: Agent;
private currentModel: Model<any>;
private tools: AgentTool[];
+ private debug: boolean;
- constructor(jid: string, defaultModel: Model<any>, tools: AgentTool[] = []) {
+ constructor(jid: string, defaultModel: Model<any>, tools: AgentTool[] = [], debug: boolean = false) {
this.jid = jid;
this.currentModel = defaultModel;
this.tools = tools;
+ this.debug = debug;
+
+ if (debug) {
+ console.log(`[Agent:${jid}] Created with model: ${defaultModel.provider}/${defaultModel.id}`);
+ console.log(`[Agent:${jid}] Tools available: ${tools.map(t => t.name).join(", ")}`);
+ }
// Initialize Pi Agent
this.agent = new Agent({
@@ -47,6 +54,18 @@ export class XmppAgent {
messages: [],
},
});
+
+ // Subscribe to agent events for logging
+ if (debug) {
+ this.agent.subscribe((event) => {
+ if (event.type === "turn_start") {
+ console.log(`[Agent:${jid}] Turn started`);
+ } else if (event.type === "turn_end") {
+ const toolCalls = event.toolResults?.length || 0;
+ console.log(`[Agent:${jid}] Turn ended (${toolCalls} tool calls)`);
+ }
+ });
+ }
}
/**
@@ -54,8 +73,13 @@ export class XmppAgent {
* Handles slash commands and model prefixes
*/
async processMessage(body: string): Promise<string> {
+ const startTime = Date.now();
+
// Handle slash commands
if (body.startsWith("/")) {
+ if (this.debug) {
+ console.log(`[Agent:${this.jid}] Processing slash command: ${body}`);
+ }
return this.handleCommand(body);
}
@@ -66,16 +90,30 @@ export class XmppAgent {
if (prefix) {
const newModel = getModelByPrefix(prefix);
if (newModel) {
+ if (this.debug) {
+ console.log(`[Agent:${this.jid}] Switching model: ${this.currentModel.provider}/${this.currentModel.id} → ${newModel.provider}/${newModel.id}`);
+ }
this.currentModel = newModel;
this.agent.setModel(newModel);
}
}
+ if (this.debug) {
+ console.log(`[Agent:${this.jid}] Processing message with model: ${this.currentModel.provider}/${this.currentModel.id}`);
+ }
+
// Send message to agent
await this.agent.prompt(content);
// Get last assistant message
- return this.getLastAssistantMessage();
+ const response = this.getLastAssistantMessage();
+
+ const elapsed = Date.now() - startTime;
+ if (this.debug) {
+ console.log(`[Agent:${this.jid}] Response generated in ${elapsed}ms (${response.length} chars)`);
+ }
+
+ return response;
}
/**