From 866f8fdeae61a3cbb0623906fec6593836dda747 Mon Sep 17 00:00:00 2001 From: "Abiba (pi)" Date: Wed, 24 Jun 2026 13:27:19 +0000 Subject: [PATCH] fix(abiba): backport EADDRINUSE handler + private message to format to TS source --- pi-zulip-extension/package-lock.json | 1 + pi-zulip-extension/src/index.ts | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pi-zulip-extension/package-lock.json b/pi-zulip-extension/package-lock.json index b2364e6..8467a49 100644 --- a/pi-zulip-extension/package-lock.json +++ b/pi-zulip-extension/package-lock.json @@ -2668,6 +2668,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/pi-zulip-extension/src/index.ts b/pi-zulip-extension/src/index.ts index 7824f05..1825624 100644 --- a/pi-zulip-extension/src/index.ts +++ b/pi-zulip-extension/src/index.ts @@ -14,6 +14,7 @@ import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent"; import { createClient } from "zulip-js"; import { spawnSync } from "node:child_process"; + import http from "node:http"; import fs from "node:fs"; import path from "node:path"; @@ -201,7 +202,8 @@ async function createZulipQueue(config: ZulipConfig) { }): Promise { const formBody = new URLSearchParams(); formBody.append("type", params.type); - formBody.append("to", String(params.to)); + // Zulip API: private messages need JSON array of user IDs, stream messages accept string/number + formBody.append("to", params.type === "private" ? JSON.stringify([params.to]) : String(params.to)); if (params.subject) formBody.append("subject", params.subject); formBody.append("content", params.content); @@ -259,6 +261,14 @@ function startHealthServer(port: number, getState: () => Record } }); + server.on("error", (err: any) => { + if (err.code === "EADDRINUSE") { + console.warn(`[zulip-ext] Port :${port} already in use — skipping health endpoint`); + } else { + console.error(`[zulip-ext] Health server error:`, err.message); + } + }); + server.listen(port, "127.0.0.1", () => { console.log(`[zulip-ext] Health endpoint on :${port}`); }); @@ -597,7 +607,7 @@ export default async function (pi: ExtensionAPI) { // Usage: /zulip-send-test "targetEmail" "message body" pi.registerCommand("zulip-send-test", { description: "Send a test message to Zulip user: /zulip-send-test ", - handler: async (args: string, ctx: ExtensionCommandContext) => { + handler: async (args: string, ctx: ExtensionContext) => { const parts = args.trim().match(/^([^\s]+)\s+(.+)$/); const targetEmail = parts?.[1] ?? config.agent.owner_email; const message = parts?.[2] ?? "Test message from pi Zulip extension";