fix(abiba): backport EADDRINUSE handler + private message to format to TS source
CI / validate (pull_request) Failing after 1s

This commit is contained in:
Abiba (pi)
2026-06-24 13:27:19 +00:00
parent 676a94459c
commit 866f8fdeae
2 changed files with 13 additions and 2 deletions
+1
View File
@@ -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"
+12 -2
View File
@@ -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<void> {
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<string, unknown>
}
});
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 <email> <message>",
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";