@ע-ה-דכו-ע שדרוג נוסף
עשיתי שיוצג שם הכרטיסייה שמשם ההתראה
const https = require("https");
const os = require("os");
const fs = require("fs");
const path = require("path");
const TOPIC = "claude";
const SERVER_NAME = "server";
const VSCODE_HOST = "ssh-remote+shmuel";
const event = process.argv[2] || "event";
const messages = {
stop: "Claude סיים לענות",
permission: "Claude מבקש הרשאה",
question: "Claude שואל שאלה",
subagent: "סוכן משנה סיים לעבוד"
};
function titleFromLogs(sessionId) {
if (!sessionId) return null;
const base = path.join(os.homedir(), ".vscode-server", "data", "logs");
const files = [];
(function walk(dir) {
try {
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
const p = path.join(dir, e.name);
if (e.isDirectory()) walk(p);
else if (/Claude VSCode.*\.log$/.test(e.name)) files.push(p);
}
} catch (_) { }
})(base);
files.sort((a, b) => {
try { return fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs; } catch (_) { return 0; }
});
const re = new RegExp('"sessionId":"' + sessionId + '"[^}]*?"title":"((?:[^"\\\\]|\\\\.)*)"', 'g');
for (const f of files.slice(0, 10)) {
let txt;
try { txt = fs.readFileSync(f, "utf8"); } catch (_) { continue; }
let m, last = null;
while ((m = re.exec(txt)) !== null) last = m[1];
if (last) {
try { return JSON.parse('"' + last + '"'); } catch (_) { return last; }
}
}
return null;
}
function resolveSessionName(sessionId, cwd) {
const fromLog = titleFromLogs(sessionId);
if (fromLog) return fromLog;
if (sessionId) {
try {
const dir = path.join(os.homedir(), ".claude", "sessions");
for (const file of fs.readdirSync(dir)) {
if (!file.endsWith(".json")) continue;
try {
const data = JSON.parse(fs.readFileSync(path.join(dir, file), "utf8"));
if (data.sessionId === sessionId && data.name) return data.name;
} catch (_) { }
}
} catch (_) { }
}
if (cwd) return path.basename(cwd);
if (sessionId) return sessionId.slice(0, 8);
return SERVER_NAME;
}
function send(stdin) {
let sessionId = "";
let cwd = "";
try {
const data = JSON.parse(stdin || "{}");
sessionId = data.session_id || data.sessionId || "";
cwd = data.cwd || "";
} catch (_) { }
const name = resolveSessionName(sessionId, cwd);
const body = messages[event] || `אירוע: ${event}`;
const clickPath = cwd || "";
const payload = JSON.stringify({
topic: TOPIC,
title: name,
message: `${body}\n${SERVER_NAME}`,
click: `vscode://vscode-remote/${VSCODE_HOST}${clickPath}`,
priority: event === "permission" || event === "question" ? 4 : 3,
tags: [event === "stop" ? "white_check_mark" : "bell"]
});
const req = https.request({
hostname: "ntfy.sh",
path: "/",
method: "POST",
headers: {
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(payload)
}
});
req.on("error", () => { });
req.write(payload);
req.end();
}
let input = "";
let done = false;
function finish() {
if (done) return;
done = true;
send(input);
}
try {
process.stdin.setEncoding("utf8");
process.stdin.on("data", (chunk) => { input += chunk; });
process.stdin.on("end", finish);
process.stdin.on("error", finish);
setTimeout(finish, 800);
} catch (_) {
finish();
}