diff --git a/packages/coding-agent/src/core/gateway/runtime.ts b/packages/coding-agent/src/core/gateway/runtime.ts index 33994f7..0161700 100644 --- a/packages/coding-agent/src/core/gateway/runtime.ts +++ b/packages/coding-agent/src/core/gateway/runtime.ts @@ -195,6 +195,10 @@ export class GatewayRuntime { return new Promise((resolve) => { managedSession.queue.push({ ...queuedMessage, resolve }); + this.logSession( + managedSession, + `queued source=${queuedMessage.request.source ?? "extension"} depth=${managedSession.queue.length}`, + ); this.emitState(managedSession); void this.processNext(managedSession); }); @@ -274,6 +278,21 @@ export class GatewayRuntime { return session ? this.createSnapshot(session) : undefined; } + private summarizeText(text: string, maxLength = 96): string { + const singleLine = text.replace(/\s+/g, " ").trim(); + if (singleLine.length <= maxLength) { + return singleLine; + } + return `${singleLine.slice(0, maxLength)}...`; + } + + private logSession( + managedSession: ManagedGatewaySession, + message: string, + ): void { + this.log(`[session] session=${managedSession.sessionKey} ${message}`); + } + private async getOrLoadExistingSession( sessionKey: string, ): Promise { @@ -353,6 +372,10 @@ export class GatewayRuntime { managedSession.processing = true; managedSession.lastActiveAt = Date.now(); + this.logSession( + managedSession, + `processing source=${queued.request.source ?? "extension"} remaining=${managedSession.queue.length}`, + ); this.emitState(managedSession); try { @@ -425,6 +448,7 @@ export class GatewayRuntime { switch (event.type) { case "turn_start": managedSession.lastActiveAt = Date.now(); + this.logSession(managedSession, "turn_start"); this.emit(managedSession, { type: "turn_start", sessionKey: managedSession.sessionKey, @@ -432,6 +456,7 @@ export class GatewayRuntime { return; case "turn_end": managedSession.lastActiveAt = Date.now(); + this.logSession(managedSession, "turn_end"); this.emit(managedSession, { type: "turn_end", sessionKey: managedSession.sessionKey, @@ -476,6 +501,10 @@ export class GatewayRuntime { managedSession.lastActiveAt = Date.now(); if (event.message.role === "assistant") { managedSession.activeAssistantMessage = null; + this.logSession( + managedSession, + `assistant_complete text="${this.summarizeText(extractMessageText(event.message))}"`, + ); this.emit(managedSession, { type: "message_complete", sessionKey: managedSession.sessionKey, @@ -499,6 +528,10 @@ export class GatewayRuntime { return; case "tool_execution_start": managedSession.lastActiveAt = Date.now(); + this.logSession( + managedSession, + `tool_start name=${event.toolName} call=${event.toolCallId}`, + ); this.emit(managedSession, { type: "tool_start", sessionKey: managedSession.sessionKey, @@ -531,6 +564,10 @@ export class GatewayRuntime { timestamp: Date.now(), }, ]; + this.logSession( + managedSession, + `tool_complete name=${event.toolName} call=${event.toolCallId} ok=${!event.isError}`, + ); this.emit(managedSession, { type: "tool_complete", sessionKey: managedSession.sessionKey, @@ -656,8 +693,6 @@ export class GatewayRuntime { return; } - this.log(`[http] --> ${method} ${path}`); - if (method === "GET" && path === "/ready") { this.requireAuth(request, response); if (response.writableEnded) return; @@ -1101,9 +1136,6 @@ export class GatewayRuntime { statusCode: number, payload: unknown, ): void { - if (statusCode >= 400) { - this.log(`[http] <-- ${statusCode} ${JSON.stringify(payload)}`); - } response.statusCode = statusCode; response.setHeader("content-type", "application/json; charset=utf-8"); response.end(JSON.stringify(payload)); diff --git a/scripts/bundle-sandbox-builtins.mjs b/scripts/bundle-sandbox-builtins.mjs new file mode 100644 index 0000000..979ee81 --- /dev/null +++ b/scripts/bundle-sandbox-builtins.mjs @@ -0,0 +1,53 @@ +import { mkdir } from "node:fs/promises"; +import path from "node:path"; +import { build } from "esbuild"; + +const sourceRoot = process.env.PI_BUILTIN_EXTENSIONS_SRC + ? path.resolve(process.env.PI_BUILTIN_EXTENSIONS_SRC) + : path.resolve(process.cwd(), "packages"); +const outputRoot = process.env.PI_BUILTIN_EXTENSIONS_OUT + ? path.resolve(process.env.PI_BUILTIN_EXTENSIONS_OUT) + : path.resolve(process.cwd(), ".tmp/builtins"); + +const entries = [ + { + name: "pi-channels", + entry: path.join(sourceRoot, "pi-channels", "src", "index.ts"), + }, + { + name: "pi-teams", + entry: path.join(sourceRoot, "pi-teams", "extensions", "index.ts"), + }, + { + name: "pi-grind", + entry: path.join(sourceRoot, "pi-grind", "src", "index.ts"), + }, +]; + +const external = [ + "@mariozechner/pi-agent-core", + "@mariozechner/pi-ai", + "@mariozechner/pi-ai/oauth", + "@mariozechner/pi-coding-agent", + "@mariozechner/pi-tui", + "@sinclair/typebox", +]; + +await mkdir(outputRoot, { recursive: true }); + +for (const { name, entry } of entries) { + const outdir = path.join(outputRoot, name); + await mkdir(outdir, { recursive: true }); + await build({ + entryPoints: [entry], + outfile: path.join(outdir, "index.js"), + bundle: true, + format: "esm", + platform: "node", + target: "node22", + sourcemap: false, + logLevel: "info", + external, + }); + console.log(`Bundled ${name} -> ${path.join(outdir, "index.js")}`); +}