@nocoo/pew 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +179 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts +38 -0
  5. package/dist/commands/init.d.ts.map +1 -0
  6. package/dist/commands/init.js +73 -0
  7. package/dist/commands/init.js.map +1 -0
  8. package/dist/commands/notify.d.ts +11 -0
  9. package/dist/commands/notify.d.ts.map +1 -0
  10. package/dist/commands/notify.js +28 -0
  11. package/dist/commands/notify.js.map +1 -0
  12. package/dist/commands/session-upload.d.ts +6 -22
  13. package/dist/commands/session-upload.d.ts.map +1 -1
  14. package/dist/commands/session-upload.js +12 -144
  15. package/dist/commands/session-upload.js.map +1 -1
  16. package/dist/commands/status.d.ts +4 -0
  17. package/dist/commands/status.d.ts.map +1 -1
  18. package/dist/commands/status.js +1 -0
  19. package/dist/commands/status.js.map +1 -1
  20. package/dist/commands/uninstall.d.ts +39 -0
  21. package/dist/commands/uninstall.d.ts.map +1 -0
  22. package/dist/commands/uninstall.js +107 -0
  23. package/dist/commands/uninstall.js.map +1 -0
  24. package/dist/commands/upload-engine.d.ts +63 -0
  25. package/dist/commands/upload-engine.d.ts.map +1 -0
  26. package/dist/commands/upload-engine.js +164 -0
  27. package/dist/commands/upload-engine.js.map +1 -0
  28. package/dist/commands/upload.d.ts +5 -21
  29. package/dist/commands/upload.d.ts.map +1 -1
  30. package/dist/commands/upload.js +11 -144
  31. package/dist/commands/upload.js.map +1 -1
  32. package/dist/notifier/claude-hook.d.ts +18 -0
  33. package/dist/notifier/claude-hook.d.ts.map +1 -0
  34. package/dist/notifier/claude-hook.js +226 -0
  35. package/dist/notifier/claude-hook.js.map +1 -0
  36. package/dist/notifier/codex-notifier.d.ts +19 -0
  37. package/dist/notifier/codex-notifier.d.ts.map +1 -0
  38. package/dist/notifier/codex-notifier.js +258 -0
  39. package/dist/notifier/codex-notifier.js.map +1 -0
  40. package/dist/notifier/coordinator.d.ts +29 -0
  41. package/dist/notifier/coordinator.d.ts.map +1 -0
  42. package/dist/notifier/coordinator.js +176 -0
  43. package/dist/notifier/coordinator.js.map +1 -0
  44. package/dist/notifier/gemini-hook.d.ts +18 -0
  45. package/dist/notifier/gemini-hook.d.ts.map +1 -0
  46. package/dist/notifier/gemini-hook.js +243 -0
  47. package/dist/notifier/gemini-hook.js.map +1 -0
  48. package/dist/notifier/notify-handler.d.ts +41 -0
  49. package/dist/notifier/notify-handler.d.ts.map +1 -0
  50. package/dist/notifier/notify-handler.js +172 -0
  51. package/dist/notifier/notify-handler.js.map +1 -0
  52. package/dist/notifier/openclaw-hook.d.ts +28 -0
  53. package/dist/notifier/openclaw-hook.d.ts.map +1 -0
  54. package/dist/notifier/openclaw-hook.js +272 -0
  55. package/dist/notifier/openclaw-hook.js.map +1 -0
  56. package/dist/notifier/opencode-plugin.d.ts +20 -0
  57. package/dist/notifier/opencode-plugin.d.ts.map +1 -0
  58. package/dist/notifier/opencode-plugin.js +106 -0
  59. package/dist/notifier/opencode-plugin.js.map +1 -0
  60. package/dist/notifier/paths.d.ts +21 -0
  61. package/dist/notifier/paths.d.ts.map +1 -0
  62. package/dist/notifier/paths.js +36 -0
  63. package/dist/notifier/paths.js.map +1 -0
  64. package/dist/notifier/registry.d.ts +21 -0
  65. package/dist/notifier/registry.d.ts.map +1 -0
  66. package/dist/notifier/registry.js +145 -0
  67. package/dist/notifier/registry.js.map +1 -0
  68. package/dist/storage/base-queue.d.ts +40 -0
  69. package/dist/storage/base-queue.d.ts.map +1 -0
  70. package/dist/storage/base-queue.js +89 -0
  71. package/dist/storage/base-queue.js.map +1 -0
  72. package/dist/storage/local-queue.d.ts +4 -24
  73. package/dist/storage/local-queue.d.ts.map +1 -1
  74. package/dist/storage/local-queue.js +5 -64
  75. package/dist/storage/local-queue.js.map +1 -1
  76. package/dist/storage/session-queue.d.ts +3 -21
  77. package/dist/storage/session-queue.d.ts.map +1 -1
  78. package/dist/storage/session-queue.js +4 -58
  79. package/dist/storage/session-queue.js.map +1 -1
  80. package/dist/utils/paths.d.ts +4 -0
  81. package/dist/utils/paths.d.ts.map +1 -1
  82. package/dist/utils/paths.js +4 -0
  83. package/dist/utils/paths.js.map +1 -1
  84. package/package.json +1 -1
@@ -0,0 +1,243 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ const EVENT_NAME = "SessionEnd";
4
+ const SOURCE = "gemini-cli";
5
+ const HOOK_NAME = "pew-tracker";
6
+ const MATCHER = "exit|clear|logout|prompt_input_exit|other";
7
+ export async function installGeminiHook(opts) {
8
+ const fs = opts.fs ?? { readFile, writeFile, mkdir };
9
+ const command = buildGeminiHookCommand(opts.notifyPath);
10
+ const loaded = await loadSettings(opts.settingsPath, fs);
11
+ if (loaded.status === "invalid") {
12
+ return {
13
+ source: SOURCE,
14
+ action: "skip",
15
+ changed: false,
16
+ detail: "Invalid Gemini settings.json",
17
+ };
18
+ }
19
+ const settings = loaded.settings ?? {};
20
+ const tools = normalizeObject(settings.tools);
21
+ const hooks = normalizeObject(settings.hooks);
22
+ const entries = normalizeArray(hooks[EVENT_NAME]);
23
+ let changed = tools.enableHooks !== true;
24
+ const nextEntries = entries.map((entry) => {
25
+ const normalized = normalizeEntry(entry, command);
26
+ if (normalized !== entry)
27
+ changed = true;
28
+ return normalized;
29
+ });
30
+ if (!hasHook(nextEntries, command)) {
31
+ nextEntries.push({
32
+ matcher: MATCHER,
33
+ hooks: [{ name: HOOK_NAME, type: "command", command }],
34
+ });
35
+ changed = true;
36
+ }
37
+ if (!changed) {
38
+ return {
39
+ source: SOURCE,
40
+ action: "install",
41
+ changed: false,
42
+ detail: "Gemini hook already installed",
43
+ };
44
+ }
45
+ const nextSettings = {
46
+ ...settings,
47
+ tools: {
48
+ ...tools,
49
+ enableHooks: true,
50
+ },
51
+ hooks: {
52
+ ...hooks,
53
+ [EVENT_NAME]: nextEntries,
54
+ },
55
+ };
56
+ const backupPath = await writeSettings(opts.settingsPath, nextSettings, loaded.raw, fs);
57
+ return {
58
+ source: SOURCE,
59
+ action: "install",
60
+ changed: true,
61
+ detail: "Gemini hook installed",
62
+ backupPath: backupPath ?? undefined,
63
+ };
64
+ }
65
+ export async function uninstallGeminiHook(opts) {
66
+ const fs = opts.fs ?? { readFile, writeFile, mkdir };
67
+ const command = buildGeminiHookCommand(opts.notifyPath);
68
+ const loaded = await loadSettings(opts.settingsPath, fs);
69
+ if (loaded.status === "missing") {
70
+ return {
71
+ source: SOURCE,
72
+ action: "skip",
73
+ changed: false,
74
+ detail: "Gemini settings.json not found",
75
+ };
76
+ }
77
+ if (loaded.status === "invalid" || !loaded.settings) {
78
+ return {
79
+ source: SOURCE,
80
+ action: "skip",
81
+ changed: false,
82
+ detail: "Invalid Gemini settings.json",
83
+ };
84
+ }
85
+ const settings = loaded.settings;
86
+ const hooks = normalizeObject(settings.hooks);
87
+ const entries = normalizeArray(hooks[EVENT_NAME]);
88
+ let removed = false;
89
+ const nextEntries = entries
90
+ .map((entry) => {
91
+ const stripped = stripHook(entry, command);
92
+ if (stripped !== entry)
93
+ removed = true;
94
+ return stripped;
95
+ })
96
+ .filter(Boolean);
97
+ if (!removed) {
98
+ return {
99
+ source: SOURCE,
100
+ action: "skip",
101
+ changed: false,
102
+ detail: "Gemini hook not installed",
103
+ };
104
+ }
105
+ const nextHooks = { ...hooks };
106
+ if (nextEntries.length > 0)
107
+ nextHooks[EVENT_NAME] = nextEntries;
108
+ else
109
+ delete nextHooks[EVENT_NAME];
110
+ const nextSettings = { ...settings };
111
+ if (Object.keys(nextHooks).length > 0)
112
+ nextSettings.hooks = nextHooks;
113
+ else
114
+ delete nextSettings.hooks;
115
+ const backupPath = await writeSettings(opts.settingsPath, nextSettings, loaded.raw, fs);
116
+ return {
117
+ source: SOURCE,
118
+ action: "uninstall",
119
+ changed: true,
120
+ detail: "Gemini hook removed",
121
+ backupPath: backupPath ?? undefined,
122
+ };
123
+ }
124
+ export async function getGeminiHookStatus(opts) {
125
+ const fs = opts.fs ?? { readFile, writeFile, mkdir };
126
+ const loaded = await loadSettings(opts.settingsPath, fs);
127
+ if (loaded.status === "missing")
128
+ return "not-installed";
129
+ if (loaded.status === "invalid" || !loaded.settings)
130
+ return "error";
131
+ return hasHook(normalizeArray(normalizeObject(loaded.settings.hooks)[EVENT_NAME]), buildGeminiHookCommand(opts.notifyPath))
132
+ ? "installed"
133
+ : "not-installed";
134
+ }
135
+ function buildGeminiHookCommand(notifyPath) {
136
+ return `/usr/bin/env node ${quoteArg(notifyPath)} --source=${SOURCE}`;
137
+ }
138
+ async function loadSettings(settingsPath, fs) {
139
+ try {
140
+ const raw = await fs.readFile(settingsPath, "utf8");
141
+ try {
142
+ const parsed = JSON.parse(raw);
143
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
144
+ return { status: "invalid", settings: null, raw };
145
+ }
146
+ return { status: "ok", settings: parsed, raw };
147
+ }
148
+ catch {
149
+ return { status: "invalid", settings: null, raw };
150
+ }
151
+ }
152
+ catch (err) {
153
+ if (err?.code === "ENOENT") {
154
+ return { status: "missing", settings: null, raw: null };
155
+ }
156
+ throw err;
157
+ }
158
+ }
159
+ function normalizeObject(value) {
160
+ return value && typeof value === "object" && !Array.isArray(value)
161
+ ? { ...value }
162
+ : {};
163
+ }
164
+ function normalizeArray(value) {
165
+ return Array.isArray(value)
166
+ ? value.filter((entry) => Boolean(entry && typeof entry === "object"))
167
+ : [];
168
+ }
169
+ function normalizeEntry(entry, command) {
170
+ const hooks = Array.isArray(entry.hooks) ? entry.hooks : null;
171
+ if (!hooks)
172
+ return entry;
173
+ let changed = entry.matcher !== MATCHER;
174
+ const nextHooks = hooks.map((hook) => {
175
+ if (!hook || typeof hook !== "object")
176
+ return hook;
177
+ const hookObject = hook;
178
+ if (!matchesHook(hookObject, command))
179
+ return hookObject;
180
+ const nextHook = { ...hookObject };
181
+ if (nextHook.name !== HOOK_NAME) {
182
+ nextHook.name = HOOK_NAME;
183
+ changed = true;
184
+ }
185
+ if (nextHook.type !== "command") {
186
+ nextHook.type = "command";
187
+ changed = true;
188
+ }
189
+ if (nextHook.command !== command) {
190
+ nextHook.command = command;
191
+ changed = true;
192
+ }
193
+ return nextHook;
194
+ });
195
+ if (!changed)
196
+ return entry;
197
+ return { ...entry, matcher: MATCHER, hooks: nextHooks };
198
+ }
199
+ function stripHook(entry, command) {
200
+ const hooks = Array.isArray(entry.hooks) ? entry.hooks : null;
201
+ if (!hooks)
202
+ return entry;
203
+ const nextHooks = hooks.filter((hook) => {
204
+ if (!hook || typeof hook !== "object")
205
+ return true;
206
+ return !matchesHook(hook, command);
207
+ });
208
+ if (nextHooks.length === hooks.length)
209
+ return entry;
210
+ if (nextHooks.length === 0)
211
+ return null;
212
+ return { ...entry, hooks: nextHooks };
213
+ }
214
+ function hasHook(entries, command) {
215
+ return entries.some((entry) => {
216
+ const hooks = Array.isArray(entry.hooks) ? entry.hooks : [];
217
+ return hooks.some((hook) => {
218
+ if (!hook || typeof hook !== "object")
219
+ return false;
220
+ return matchesHook(hook, command);
221
+ });
222
+ });
223
+ }
224
+ function matchesHook(hook, command) {
225
+ return hook.command === command || hook.name === HOOK_NAME;
226
+ }
227
+ async function writeSettings(settingsPath, settings, previousRaw, fs) {
228
+ await fs.mkdir(dirname(settingsPath), { recursive: true });
229
+ const backupPath = previousRaw !== null
230
+ ? `${settingsPath}.bak.${new Date().toISOString().replace(/[:.]/g, "-")}`
231
+ : null;
232
+ if (backupPath && previousRaw !== null) {
233
+ await fs.writeFile(backupPath, previousRaw, "utf8");
234
+ }
235
+ await fs.writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}\n`, "utf8");
236
+ return backupPath;
237
+ }
238
+ function quoteArg(value) {
239
+ if (/^[A-Za-z0-9_\-./:@]+$/.test(value))
240
+ return value;
241
+ return `"${value.replace(/"/g, '\\"')}"`;
242
+ }
243
+ //# sourceMappingURL=gemini-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-hook.js","sourceRoot":"","sources":["../../src/notifier/gemini-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface BuildNotifyHandlerOptions {
2
+ stateDir: string;
3
+ pewBin: string;
4
+ }
5
+ interface WriteNotifyHandlerFs {
6
+ readFile: (path: string, encoding: BufferEncoding) => Promise<string>;
7
+ writeFile: (path: string, data: string, encoding: BufferEncoding) => Promise<unknown>;
8
+ mkdir: (path: string, options: {
9
+ recursive: boolean;
10
+ }) => Promise<unknown>;
11
+ }
12
+ interface RemoveNotifyHandlerFs {
13
+ readFile: (path: string, encoding: BufferEncoding) => Promise<string>;
14
+ unlink: (path: string) => Promise<unknown>;
15
+ }
16
+ export interface WriteNotifyHandlerOptions {
17
+ binDir: string;
18
+ source: string;
19
+ fs?: WriteNotifyHandlerFs;
20
+ now?: () => string;
21
+ }
22
+ export interface RemoveNotifyHandlerOptions {
23
+ notifyPath: string;
24
+ fs?: RemoveNotifyHandlerFs;
25
+ }
26
+ export declare const NOTIFY_HANDLER_MARKER = "PEW_NOTIFY_HANDLER";
27
+ export declare function buildNotifyHandler(opts: BuildNotifyHandlerOptions): string;
28
+ export declare function writeNotifyHandler(opts: WriteNotifyHandlerOptions): Promise<{
29
+ changed: boolean;
30
+ path: string;
31
+ backupPath?: string;
32
+ }>;
33
+ export declare function removeNotifyHandler(opts: RemoveNotifyHandlerOptions): Promise<{
34
+ changed: boolean;
35
+ path: string;
36
+ detail: string;
37
+ warnings?: string[];
38
+ }>;
39
+ export declare function resolvePewBin(): Promise<string>;
40
+ export {};
41
+ //# sourceMappingURL=notify-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify-handler.d.ts","sourceRoot":"","sources":["../../src/notifier/notify-handler.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5E;AAED,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,qBAAqB,CAAC;CAC5B;AAED,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAE1D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAmF1E;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BlE;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgClF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAmBrD"}
@@ -0,0 +1,172 @@
1
+ import { access, mkdir, readFile, unlink, writeFile } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import { execFile } from "node:child_process";
4
+ import { dirname, join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ export const NOTIFY_HANDLER_MARKER = "PEW_NOTIFY_HANDLER";
8
+ export function buildNotifyHandler(opts) {
9
+ const { stateDir, pewBin } = opts;
10
+ return `#!/usr/bin/env node
11
+ // ${NOTIFY_HANDLER_MARKER} — Auto-generated, do not edit
12
+ "use strict";
13
+
14
+ const { appendFileSync, readFileSync, mkdirSync, existsSync } = require("node:fs");
15
+ const { join, resolve } = require("node:path");
16
+ const { spawn } = require("node:child_process");
17
+ const { homedir } = require("node:os");
18
+
19
+ const STATE_DIR = ${JSON.stringify(stateDir)};
20
+ const PEW_BIN = ${JSON.stringify(pewBin)};
21
+ const SELF_PATH = resolve(__filename);
22
+ const HOME_DIR = homedir();
23
+
24
+ const rawArgs = process.argv.slice(2);
25
+ let source = "";
26
+ const payloadArgs = [];
27
+ for (let i = 0; i < rawArgs.length; i++) {
28
+ const arg = rawArgs[i];
29
+ if (arg === "--source") {
30
+ source = rawArgs[i + 1] || source;
31
+ i += 1;
32
+ continue;
33
+ }
34
+ if (arg.startsWith("--source=")) {
35
+ source = arg.slice("--source=".length) || source;
36
+ continue;
37
+ }
38
+ payloadArgs.push(arg);
39
+ }
40
+
41
+ try {
42
+ mkdirSync(STATE_DIR, { recursive: true });
43
+ appendFileSync(join(STATE_DIR, "notify.signal"), "\\n", "utf8");
44
+ } catch (_) {}
45
+
46
+ const bin = existsSync(PEW_BIN) ? PEW_BIN : "npx";
47
+ const args = bin === PEW_BIN
48
+ ? ["notify", "--source=" + source, ...payloadArgs]
49
+ : ["@nocoo/pew", "notify", "--source=" + source, ...payloadArgs];
50
+
51
+ try {
52
+ const child = spawn(bin, args, {
53
+ detached: true,
54
+ stdio: "ignore",
55
+ env: { ...process.env },
56
+ });
57
+ child.unref();
58
+ } catch (_) {}
59
+
60
+ if (source === "codex") {
61
+ try {
62
+ const original = JSON.parse(
63
+ readFileSync(join(STATE_DIR, "codex_notify_original.json"), "utf8"),
64
+ );
65
+ const cmd = Array.isArray(original && original.notify) ? original.notify : null;
66
+ if (cmd && cmd.length > 0 && !isSelfNotify(cmd)) {
67
+ const child = spawn(cmd[0], cmd.slice(1), {
68
+ detached: true,
69
+ stdio: "ignore",
70
+ env: { ...process.env },
71
+ });
72
+ child.unref();
73
+ }
74
+ } catch (_) {}
75
+ }
76
+
77
+ process.exit(0);
78
+
79
+ function isSelfNotify(cmd) {
80
+ return cmd.some((part) => {
81
+ if (typeof part !== "string") return false;
82
+ if (!part.includes("notify.cjs")) return false;
83
+ const resolved = part.startsWith("~/")
84
+ ? join(HOME_DIR, part.slice(2))
85
+ : resolve(part);
86
+ return resolved === SELF_PATH;
87
+ });
88
+ }
89
+ `;
90
+ }
91
+ export async function writeNotifyHandler(opts) {
92
+ const fs = opts.fs ?? { readFile, writeFile, mkdir };
93
+ const now = opts.now ?? (() => new Date().toISOString());
94
+ const notifyPath = join(opts.binDir, "notify.cjs");
95
+ await fs.mkdir(opts.binDir, { recursive: true });
96
+ let existing = null;
97
+ try {
98
+ existing = await fs.readFile(notifyPath, "utf8");
99
+ }
100
+ catch (err) {
101
+ if (err?.code !== "ENOENT")
102
+ throw err;
103
+ }
104
+ if (existing === opts.source) {
105
+ return { changed: false, path: notifyPath };
106
+ }
107
+ let backupPath;
108
+ if (existing !== null) {
109
+ backupPath = `${notifyPath}.bak.${now().replace(/[:.]/g, "-")}`;
110
+ await fs.writeFile(backupPath, existing, "utf8");
111
+ }
112
+ await fs.writeFile(notifyPath, opts.source, "utf8");
113
+ return { changed: true, path: notifyPath, backupPath };
114
+ }
115
+ export async function removeNotifyHandler(opts) {
116
+ const fs = opts.fs ?? { readFile, unlink };
117
+ let existing;
118
+ try {
119
+ existing = await fs.readFile(opts.notifyPath, "utf8");
120
+ }
121
+ catch (err) {
122
+ if (err?.code === "ENOENT") {
123
+ return {
124
+ changed: false,
125
+ path: opts.notifyPath,
126
+ detail: "notify.cjs not found",
127
+ };
128
+ }
129
+ throw err;
130
+ }
131
+ if (!existing.includes(NOTIFY_HANDLER_MARKER)) {
132
+ return {
133
+ changed: false,
134
+ path: opts.notifyPath,
135
+ detail: "notify.cjs did not match pew marker",
136
+ warnings: ["File does not contain pew marker"],
137
+ };
138
+ }
139
+ await fs.unlink(opts.notifyPath);
140
+ return {
141
+ changed: true,
142
+ path: opts.notifyPath,
143
+ detail: "notify.cjs removed",
144
+ };
145
+ }
146
+ export async function resolvePewBin() {
147
+ const fromArgv = typeof process.argv[1] === "string" ? join(dirname(process.argv[1]), "pew") : null;
148
+ if (fromArgv && (await isExecutable(fromArgv))) {
149
+ return fromArgv;
150
+ }
151
+ try {
152
+ const result = await execFileAsync("which", ["pew"]);
153
+ const candidate = result.stdout.trim();
154
+ if (candidate && (await isExecutable(candidate))) {
155
+ return candidate;
156
+ }
157
+ }
158
+ catch {
159
+ // Fall through to the final error.
160
+ }
161
+ throw new Error("Unable to resolve pew binary. Ensure `pew` is available in PATH.");
162
+ }
163
+ async function isExecutable(filePath) {
164
+ try {
165
+ await access(filePath, constants.X_OK);
166
+ return true;
167
+ }
168
+ catch {
169
+ return false;
170
+ }
171
+ }
172
+ //# sourceMappingURL=notify-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify-handler.js","sourceRoot":"","sources":["../../src/notifier/notify-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type SpawnSyncOptions } from "node:child_process";
2
+ import type { NotifierOperationResult, NotifierStatus } from "@pew/core";
3
+ interface OpenClawHookFs {
4
+ readFile: (path: string, encoding: BufferEncoding) => Promise<string>;
5
+ writeFile: (path: string, data: string, encoding: BufferEncoding) => Promise<unknown>;
6
+ mkdir: (path: string, options: {
7
+ recursive: boolean;
8
+ }) => Promise<unknown>;
9
+ rm: (path: string, options: {
10
+ recursive: boolean;
11
+ force: boolean;
12
+ }) => Promise<unknown>;
13
+ }
14
+ interface SpawnResult {
15
+ status: number | null;
16
+ }
17
+ export interface OpenClawHookOptions {
18
+ pluginBaseDir: string;
19
+ notifyPath: string;
20
+ openclawConfigPath: string;
21
+ fs?: OpenClawHookFs;
22
+ spawn?: (cmd: string, args: string[], opts?: SpawnSyncOptions) => SpawnResult;
23
+ }
24
+ export declare function installOpenClawHook(opts: OpenClawHookOptions): Promise<NotifierOperationResult>;
25
+ export declare function uninstallOpenClawHook(opts: OpenClawHookOptions): Promise<NotifierOperationResult>;
26
+ export declare function getOpenClawHookStatus(opts: OpenClawHookOptions): Promise<NotifierStatus>;
27
+ export {};
28
+ //# sourceMappingURL=openclaw-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-hook.d.ts","sourceRoot":"","sources":["../../src/notifier/openclaw-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEzE,UAAU,cAAc;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACzF;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,WAAW,CAAC;CAC/E;AAKD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAoDlC;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAyElC;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,cAAc,CAAC,CAsBzB"}