69 lines
2.4 KiB
JavaScript
69 lines
2.4 KiB
JavaScript
export const SwayNotificationCenter = async ({ project, client, $, directory, worktree }) => {
|
|
console.log("SwayNC notification plugin initialized");
|
|
|
|
return {
|
|
event: async ({ event }) => {
|
|
if (event.type === "session.idle") {
|
|
const pid = process.pid;
|
|
const dir = directory || worktree || "unknown";
|
|
const iconPath = `${process.env.HOME}/.config/opencode/opencode.png`;
|
|
|
|
try {
|
|
const clientsJson = await $`hyprctl clients -j`.text();
|
|
const clients = JSON.parse(clientsJson);
|
|
|
|
const opencodeWindow = clients.find(c =>
|
|
c.pid === pid ||
|
|
(c.title && c.title.toLowerCase().includes("opencode"))
|
|
);
|
|
|
|
const windowAddress = opencodeWindow?.address || "";
|
|
|
|
const notifyCmd = [
|
|
"notify-send",
|
|
"-a", "OpenCode",
|
|
"-u", "normal",
|
|
"-i", iconPath,
|
|
"-h", `string:x-opencode-window:${windowAddress}`,
|
|
"-h", `string:x-opencode-dir:${dir}`,
|
|
"-A", `focus=Focus Window`,
|
|
"OpenCode Ready",
|
|
`Waiting for input\nDirectory: ${dir}`
|
|
];
|
|
|
|
if (windowAddress) {
|
|
// Run notify-send as detached background process
|
|
import("child_process").then(({ spawn }) => {
|
|
const child = spawn(notifyCmd[0], notifyCmd.slice(1), {
|
|
detached: true,
|
|
stdio: 'ignore'
|
|
});
|
|
child.unref();
|
|
|
|
// Handle the response in the background
|
|
let output = '';
|
|
if (child.stdout) {
|
|
child.stdout.on('data', (data) => {
|
|
output += data.toString();
|
|
});
|
|
child.on('close', () => {
|
|
if (output.trim() === "focus" && windowAddress) {
|
|
$`hyprctl dispatch focuswindow address:${windowAddress}`.catch(() => {});
|
|
}
|
|
});
|
|
}
|
|
}).catch(() => {});
|
|
} else {
|
|
// Run without action button, no need to wait
|
|
$`${notifyCmd.filter(arg => !arg.startsWith('focus'))}`.catch(() => {});
|
|
}
|
|
} catch (error) {
|
|
console.error("Notification error:", error);
|
|
|
|
await $`notify-send -a "OpenCode" -u normal -i ${iconPath} "OpenCode Ready" "Waiting for input in ${dir}"`;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
};
|