grinders-farm 0.3.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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +135 -0
  3. package/SKILL.md +142 -0
  4. package/dist/scripts/generate-tiles.d.ts +2 -0
  5. package/dist/scripts/generate-tiles.d.ts.map +1 -0
  6. package/dist/scripts/generate-tiles.js +138 -0
  7. package/dist/scripts/generate-tiles.js.map +1 -0
  8. package/dist/src/adapters/auto-worker.d.ts +2 -0
  9. package/dist/src/adapters/auto-worker.d.ts.map +1 -0
  10. package/dist/src/adapters/auto-worker.js +79 -0
  11. package/dist/src/adapters/auto-worker.js.map +1 -0
  12. package/dist/src/adapters/daemon.d.ts +6 -0
  13. package/dist/src/adapters/daemon.d.ts.map +1 -0
  14. package/dist/src/adapters/daemon.js +6 -0
  15. package/dist/src/adapters/daemon.js.map +1 -0
  16. package/dist/src/adapters/image-server.d.ts +2 -0
  17. package/dist/src/adapters/image-server.d.ts.map +1 -0
  18. package/dist/src/adapters/image-server.js +90 -0
  19. package/dist/src/adapters/image-server.js.map +1 -0
  20. package/dist/src/adapters/oneshot.d.ts +2 -0
  21. package/dist/src/adapters/oneshot.d.ts.map +1 -0
  22. package/dist/src/adapters/oneshot.js +36 -0
  23. package/dist/src/adapters/oneshot.js.map +1 -0
  24. package/dist/src/adapters/terminal.d.ts +2 -0
  25. package/dist/src/adapters/terminal.d.ts.map +1 -0
  26. package/dist/src/adapters/terminal.js +70 -0
  27. package/dist/src/adapters/terminal.js.map +1 -0
  28. package/dist/src/game/crops.d.ts +8 -0
  29. package/dist/src/game/crops.d.ts.map +1 -0
  30. package/dist/src/game/crops.js +71 -0
  31. package/dist/src/game/crops.js.map +1 -0
  32. package/dist/src/game/engine.d.ts +15 -0
  33. package/dist/src/game/engine.d.ts.map +1 -0
  34. package/dist/src/game/engine.js +236 -0
  35. package/dist/src/game/engine.js.map +1 -0
  36. package/dist/src/game/farm.d.ts +12 -0
  37. package/dist/src/game/farm.d.ts.map +1 -0
  38. package/dist/src/game/farm.js +387 -0
  39. package/dist/src/game/farm.js.map +1 -0
  40. package/dist/src/game/types.d.ts +70 -0
  41. package/dist/src/game/types.d.ts.map +1 -0
  42. package/dist/src/game/types.js +23 -0
  43. package/dist/src/game/types.js.map +1 -0
  44. package/dist/src/index.d.ts +9 -0
  45. package/dist/src/index.d.ts.map +1 -0
  46. package/dist/src/index.js +8 -0
  47. package/dist/src/index.js.map +1 -0
  48. package/dist/src/local-auto.d.ts +13 -0
  49. package/dist/src/local-auto.d.ts.map +1 -0
  50. package/dist/src/local-auto.js +239 -0
  51. package/dist/src/local-auto.js.map +1 -0
  52. package/dist/src/notify/openclaw-delivery.d.ts +36 -0
  53. package/dist/src/notify/openclaw-delivery.d.ts.map +1 -0
  54. package/dist/src/notify/openclaw-delivery.js +104 -0
  55. package/dist/src/notify/openclaw-delivery.js.map +1 -0
  56. package/dist/src/notify/openclaw-push.d.ts +49 -0
  57. package/dist/src/notify/openclaw-push.d.ts.map +1 -0
  58. package/dist/src/notify/openclaw-push.js +451 -0
  59. package/dist/src/notify/openclaw-push.js.map +1 -0
  60. package/dist/src/render/ansi-renderer.d.ts +6 -0
  61. package/dist/src/render/ansi-renderer.d.ts.map +1 -0
  62. package/dist/src/render/ansi-renderer.js +41 -0
  63. package/dist/src/render/ansi-renderer.js.map +1 -0
  64. package/dist/src/render/image-renderer.d.ts +3 -0
  65. package/dist/src/render/image-renderer.d.ts.map +1 -0
  66. package/dist/src/render/image-renderer.js +174 -0
  67. package/dist/src/render/image-renderer.js.map +1 -0
  68. package/dist/src/render/text-renderer.d.ts +3 -0
  69. package/dist/src/render/text-renderer.d.ts.map +1 -0
  70. package/dist/src/render/text-renderer.js +73 -0
  71. package/dist/src/render/text-renderer.js.map +1 -0
  72. package/dist/src/storage/local-storage.d.ts +15 -0
  73. package/dist/src/storage/local-storage.d.ts.map +1 -0
  74. package/dist/src/storage/local-storage.js +115 -0
  75. package/dist/src/storage/local-storage.js.map +1 -0
  76. package/package.json +44 -0
  77. package/src/notify/notify.json.example +3 -0
@@ -0,0 +1,239 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ /** Project root (grinders-farm repo), resolved from this file under `src/`. */
7
+ export const PROJECT_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
8
+ const DATA_DIR = path.join(os.homedir(), ".grinders-farm");
9
+ export const AUTO_PID_FILE = path.join(DATA_DIR, "auto.pid");
10
+ export const AUTO_CONFIG_FILE = path.join(DATA_DIR, "auto.config.json");
11
+ function isProcessRunning(pid) {
12
+ try {
13
+ process.kill(pid, 0);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ function listRunningAutoWorkerPids() {
21
+ try {
22
+ const ps = spawnSync("ps", ["-Ao", "pid,command"], {
23
+ encoding: "utf8",
24
+ maxBuffer: 4 * 1024 * 1024,
25
+ });
26
+ const out = (ps.stdout ?? "").trim();
27
+ if (!out)
28
+ return [];
29
+ const pids = new Set();
30
+ for (const line of out.split("\n")) {
31
+ if (!line.includes("src/adapters/auto-worker.ts"))
32
+ continue;
33
+ const m = line.trim().match(/^(\d+)\s+/);
34
+ if (!m)
35
+ continue;
36
+ const pid = parseInt(m[1], 10);
37
+ if (!Number.isFinite(pid) || pid === process.pid)
38
+ continue;
39
+ pids.add(pid);
40
+ }
41
+ return Array.from(pids.values()).sort((a, b) => a - b);
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ }
47
+ function resolveOpenclawBinForWorker() {
48
+ const fromEnv = process.env.OPENCLAW_BIN?.trim();
49
+ if (fromEnv)
50
+ return fromEnv;
51
+ const which = spawnSync("sh", ["-lc", "command -v openclaw"], {
52
+ encoding: "utf8",
53
+ maxBuffer: 1024 * 1024,
54
+ });
55
+ const fromWhich = (which.stdout ?? "").trim();
56
+ if (fromWhich)
57
+ return fromWhich;
58
+ const candidates = [
59
+ process.env.OPENCLAW_PATH?.trim(),
60
+ process.env.NVM_BIN ? path.join(process.env.NVM_BIN, "openclaw") : "",
61
+ "/opt/homebrew/bin/openclaw",
62
+ "/usr/local/bin/openclaw",
63
+ ]
64
+ .map((p) => (p ?? "").trim())
65
+ .filter(Boolean);
66
+ for (const p of candidates) {
67
+ try {
68
+ fs.accessSync(p, fs.constants.X_OK);
69
+ return p;
70
+ }
71
+ catch {
72
+ // keep trying
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ function removeStalePidFile() {
78
+ if (!fs.existsSync(AUTO_PID_FILE))
79
+ return;
80
+ const raw = fs.readFileSync(AUTO_PID_FILE, "utf8").trim();
81
+ const pid = parseInt(raw, 10);
82
+ if (!Number.isFinite(pid) || !isProcessRunning(pid)) {
83
+ try {
84
+ fs.unlinkSync(AUTO_PID_FILE);
85
+ }
86
+ catch {
87
+ /* ignore */
88
+ }
89
+ try {
90
+ if (fs.existsSync(AUTO_CONFIG_FILE))
91
+ fs.unlinkSync(AUTO_CONFIG_FILE);
92
+ }
93
+ catch {
94
+ /* ignore */
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * 与 `startLocalAuto` 相同,但指定游戏仓库根目录(供 OpenClaw 插件使用,gameRoot 含 `src/adapters/oneshot.ts`)。
100
+ */
101
+ export async function startLocalAutoAtRoot(gameRoot, intervalSec) {
102
+ removeStalePidFile();
103
+ const runningPids = listRunningAutoWorkerPids();
104
+ if (runningPids.length > 0) {
105
+ return {
106
+ success: false,
107
+ message: `自动推进已在运行中 (PID ${runningPids.join(", ")})。用 "stop" 停止`,
108
+ };
109
+ }
110
+ if (fs.existsSync(AUTO_PID_FILE)) {
111
+ const pid = parseInt(fs.readFileSync(AUTO_PID_FILE, "utf8").trim(), 10);
112
+ if (Number.isFinite(pid) && isProcessRunning(pid)) {
113
+ return { success: false, message: `自动推进已在运行中 (PID ${pid})。用 "stop" 停止` };
114
+ }
115
+ }
116
+ const worker = path.join(gameRoot, "src/adapters/auto-worker.ts");
117
+ const resolvedOpenclawBin = resolveOpenclawBinForWorker();
118
+ const child = spawn("npx", ["tsx", worker, String(intervalSec)], {
119
+ cwd: gameRoot,
120
+ detached: true,
121
+ stdio: "ignore",
122
+ env: {
123
+ ...process.env,
124
+ ...(resolvedOpenclawBin ? { OPENCLAW_BIN: resolvedOpenclawBin } : {}),
125
+ },
126
+ });
127
+ child.unref();
128
+ for (let i = 0; i < 50; i++) {
129
+ await new Promise((resolve) => setTimeout(resolve, 50));
130
+ if (fs.existsSync(AUTO_PID_FILE)) {
131
+ const pid = fs.readFileSync(AUTO_PID_FILE, "utf8").trim();
132
+ const human = intervalSec >= 3600 ? `每 ${Math.round(intervalSec / 3600)} 小时` : `每 ${intervalSec} 秒`;
133
+ return {
134
+ success: true,
135
+ message: [
136
+ "🤖 本地自动推进已启动(不经 OpenClaw / 不经模型)",
137
+ `${human} 推进一天 · 后台 PID ${pid}`,
138
+ "用 \"stop\" 停止;用 \"farm\" 随时查看农场",
139
+ ].join("\n"),
140
+ };
141
+ }
142
+ }
143
+ return {
144
+ success: false,
145
+ message: "自动推进进程未在预期时间内就绪。请确认已安装 Node,且本目录可运行:npx tsx src/adapters/auto-worker.ts",
146
+ };
147
+ }
148
+ export async function startLocalAuto(intervalSec) {
149
+ return startLocalAutoAtRoot(PROJECT_ROOT, intervalSec);
150
+ }
151
+ export function stopLocalAuto() {
152
+ removeStalePidFile();
153
+ const runningPids = listRunningAutoWorkerPids();
154
+ if (runningPids.length === 0 && !fs.existsSync(AUTO_PID_FILE))
155
+ return { success: false, message: "自动推进未在运行" };
156
+ let pidFromFile = null;
157
+ if (fs.existsSync(AUTO_PID_FILE)) {
158
+ const raw = fs.readFileSync(AUTO_PID_FILE, "utf8").trim();
159
+ const pid = parseInt(raw, 10);
160
+ if (Number.isFinite(pid))
161
+ pidFromFile = pid;
162
+ }
163
+ const allPids = new Set(runningPids);
164
+ if (pidFromFile && isProcessRunning(pidFromFile))
165
+ allPids.add(pidFromFile);
166
+ if (allPids.size === 0) {
167
+ try {
168
+ if (fs.existsSync(AUTO_PID_FILE))
169
+ fs.unlinkSync(AUTO_PID_FILE);
170
+ if (fs.existsSync(AUTO_CONFIG_FILE))
171
+ fs.unlinkSync(AUTO_CONFIG_FILE);
172
+ }
173
+ catch {
174
+ /* ignore */
175
+ }
176
+ return { success: false, message: "自动推进未在运行(进程已结束,已清理)" };
177
+ }
178
+ const failed = [];
179
+ for (const pid of allPids) {
180
+ try {
181
+ process.kill(pid, "SIGTERM");
182
+ }
183
+ catch (err) {
184
+ const msg = err instanceof Error ? err.message : String(err);
185
+ failed.push({ pid, reason: msg });
186
+ }
187
+ }
188
+ try {
189
+ fs.unlinkSync(AUTO_PID_FILE);
190
+ }
191
+ catch {
192
+ /* ignore */
193
+ }
194
+ try {
195
+ if (fs.existsSync(AUTO_CONFIG_FILE))
196
+ fs.unlinkSync(AUTO_CONFIG_FILE);
197
+ }
198
+ catch {
199
+ /* ignore */
200
+ }
201
+ const stopped = Array.from(allPids).filter((pid) => !failed.some((f) => f.pid === pid));
202
+ if (failed.length > 0) {
203
+ return {
204
+ success: false,
205
+ message: `已停止部分自动推进进程(成功: ${stopped.join(", ") || "无"};失败: ${failed.map((f) => `${f.pid}:${f.reason}`).join("; ")})`,
206
+ };
207
+ }
208
+ return { success: true, message: `🛑 已停止自动推进 (PID ${stopped.join(", ")} 已结束)` };
209
+ }
210
+ export function getLocalAutoStatus() {
211
+ removeStalePidFile();
212
+ if (!fs.existsSync(AUTO_PID_FILE)) {
213
+ return { success: true, message: "💤 自动推进: 未运行\n用 \"start\" 启动(固定每 20 秒推进一天)" };
214
+ }
215
+ const pid = parseInt(fs.readFileSync(AUTO_PID_FILE, "utf8").trim(), 10);
216
+ if (!Number.isFinite(pid) || !isProcessRunning(pid)) {
217
+ return { success: true, message: "💤 自动推进: 未运行(残留文件已忽略)" };
218
+ }
219
+ let intervalHint = "";
220
+ try {
221
+ if (fs.existsSync(AUTO_CONFIG_FILE)) {
222
+ const cfg = JSON.parse(fs.readFileSync(AUTO_CONFIG_FILE, "utf8"));
223
+ if (typeof cfg.intervalSec === "number") {
224
+ intervalHint =
225
+ cfg.intervalSec >= 3600
226
+ ? `间隔约 ${Math.round(cfg.intervalSec / 3600)} 小时`
227
+ : `间隔 ${cfg.intervalSec} 秒`;
228
+ }
229
+ }
230
+ }
231
+ catch {
232
+ /* ignore */
233
+ }
234
+ return {
235
+ success: true,
236
+ message: ["🤖 自动推进: 运行中", `PID ${pid}${intervalHint ? ` · ${intervalHint}` : ""}`, "用 \"stop\" 停止"].join("\n"),
237
+ };
238
+ }
239
+ //# sourceMappingURL=local-auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-auto.js","sourceRoot":"","sources":["../../src/local-auto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /** 由 OpenClaw 插件在用户执行 /farm 时写入,无需手填 target。 */
2
+ export declare const OPENCLAW_DELIVERY_PATH: string;
3
+ export declare const OPENCLAW_DELIVERIES_PATH: string;
4
+ export interface OpenclawDeliveryFile {
5
+ channel: string;
6
+ accountId?: string;
7
+ target: string;
8
+ threadId?: string | number;
9
+ /** Web 控制端推送用,对应 `openclaw gateway call chat.inject` 的 sessionKey */
10
+ sessionKey?: string;
11
+ }
12
+ export declare function loadOpenclawDelivery(): OpenclawDeliveryFile | null;
13
+ export declare function loadOpenclawDeliveries(): OpenclawDeliveryFile[];
14
+ /** OpenClaw 插件在 /farm 命令里调用:把当前会话写成推送目标(用户无需手配)。 */
15
+ export declare function saveOpenclawDeliveryFromBridge(ctx: {
16
+ channel?: string;
17
+ channelId?: string;
18
+ accountId?: string;
19
+ to?: string;
20
+ from?: string;
21
+ senderId?: string;
22
+ messageThreadId?: string | number;
23
+ }): boolean;
24
+ /**
25
+ * 入站消息自动绑定推送。
26
+ * - `openclaw-delivery.json`:仅在首次缺失时写入(兼容单目标)
27
+ * - `openclaw-deliveries.json`:每次都会去重追加(多目标 fan-out)
28
+ */
29
+ export declare function trySaveOpenclawDeliveryFromInboundClaim(event: {
30
+ channel: string;
31
+ accountId?: string;
32
+ conversationId?: string;
33
+ senderId?: string;
34
+ threadId?: string | number;
35
+ }): boolean;
36
+ //# sourceMappingURL=openclaw-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-delivery.d.ts","sourceRoot":"","sources":["../../../src/notify/openclaw-delivery.ts"],"names":[],"mappings":"AAIA,gDAAgD;AAChD,eAAO,MAAM,sBAAsB,QAAsE,CAAC;AAC1G,eAAO,MAAM,wBAAwB,QAAwE,CAAC;AAE9G,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAkCD,wBAAgB,oBAAoB,IAAI,oBAAoB,GAAG,IAAI,CAQlE;AAED,wBAAgB,sBAAsB,IAAI,oBAAoB,EAAE,CAY/D;AAED,oDAAoD;AACpD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC,GAAG,OAAO,CAcV;AAED;;;;GAIG;AACH,wBAAgB,uCAAuC,CAAC,KAAK,EAAE;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,GAAG,OAAO,CAgBV"}
@@ -0,0 +1,104 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ /** 由 OpenClaw 插件在用户执行 /farm 时写入,无需手填 target。 */
5
+ export const OPENCLAW_DELIVERY_PATH = path.join(os.homedir(), ".grinders-farm", "openclaw-delivery.json");
6
+ export const OPENCLAW_DELIVERIES_PATH = path.join(os.homedir(), ".grinders-farm", "openclaw-deliveries.json");
7
+ function normalizeDelivery(raw) {
8
+ if (!raw || typeof raw !== "object")
9
+ return null;
10
+ const r = raw;
11
+ const target = typeof r.target === "string" ? r.target.trim() : "";
12
+ const channel = typeof r.channel === "string" ? r.channel.trim() : "";
13
+ if (!target || !channel)
14
+ return null;
15
+ return {
16
+ channel,
17
+ target,
18
+ ...(typeof r.accountId === "string" && r.accountId.trim() ? { accountId: r.accountId.trim() } : {}),
19
+ ...(r.threadId != null ? { threadId: r.threadId } : {}),
20
+ ...(typeof r.sessionKey === "string" && r.sessionKey.trim() ? { sessionKey: r.sessionKey.trim() } : {}),
21
+ };
22
+ }
23
+ function deliveryKey(entry) {
24
+ const channel = entry.channel.trim().toLowerCase();
25
+ const account = entry.accountId?.trim() ?? "";
26
+ const target = entry.target.trim();
27
+ const thread = entry.threadId == null ? "" : String(entry.threadId);
28
+ const session = entry.sessionKey?.trim() ?? "";
29
+ return [channel, account, target, thread, session].join("|");
30
+ }
31
+ function persistOpenclawDeliveryList(payload) {
32
+ const existing = loadOpenclawDeliveries();
33
+ const key = deliveryKey(payload);
34
+ const next = existing.filter((entry) => deliveryKey(entry) !== key);
35
+ next.push(payload);
36
+ fs.writeFileSync(OPENCLAW_DELIVERIES_PATH, JSON.stringify(next, null, 2), "utf8");
37
+ }
38
+ export function loadOpenclawDelivery() {
39
+ if (!fs.existsSync(OPENCLAW_DELIVERY_PATH))
40
+ return null;
41
+ try {
42
+ const raw = JSON.parse(fs.readFileSync(OPENCLAW_DELIVERY_PATH, "utf8"));
43
+ return normalizeDelivery(raw);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ export function loadOpenclawDeliveries() {
50
+ if (!fs.existsSync(OPENCLAW_DELIVERIES_PATH)) {
51
+ const one = loadOpenclawDelivery();
52
+ return one ? [one] : [];
53
+ }
54
+ try {
55
+ const raw = JSON.parse(fs.readFileSync(OPENCLAW_DELIVERIES_PATH, "utf8"));
56
+ if (!Array.isArray(raw))
57
+ return [];
58
+ return raw.map((entry) => normalizeDelivery(entry)).filter((entry) => entry != null);
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ }
64
+ /** OpenClaw 插件在 /farm 命令里调用:把当前会话写成推送目标(用户无需手配)。 */
65
+ export function saveOpenclawDeliveryFromBridge(ctx) {
66
+ const channel = (ctx.channel ?? ctx.channelId)?.toString().trim();
67
+ const target = (ctx.to ?? ctx.from ?? ctx.senderId)?.toString().trim();
68
+ if (!target || !channel)
69
+ return false;
70
+ const payload = {
71
+ channel,
72
+ target,
73
+ ...(ctx.accountId?.trim() ? { accountId: ctx.accountId.trim() } : {}),
74
+ ...(ctx.messageThreadId != null ? { threadId: ctx.messageThreadId } : {}),
75
+ };
76
+ fs.mkdirSync(path.dirname(OPENCLAW_DELIVERY_PATH), { recursive: true });
77
+ fs.writeFileSync(OPENCLAW_DELIVERY_PATH, JSON.stringify(payload, null, 2), "utf8");
78
+ persistOpenclawDeliveryList(payload);
79
+ return true;
80
+ }
81
+ /**
82
+ * 入站消息自动绑定推送。
83
+ * - `openclaw-delivery.json`:仅在首次缺失时写入(兼容单目标)
84
+ * - `openclaw-deliveries.json`:每次都会去重追加(多目标 fan-out)
85
+ */
86
+ export function trySaveOpenclawDeliveryFromInboundClaim(event) {
87
+ const target = event.conversationId?.trim() || event.senderId?.trim();
88
+ const channel = event.channel?.trim();
89
+ if (!target || !channel)
90
+ return false;
91
+ const payload = {
92
+ channel,
93
+ target,
94
+ ...(event.accountId?.trim() ? { accountId: event.accountId.trim() } : {}),
95
+ ...(event.threadId != null ? { threadId: event.threadId } : {}),
96
+ };
97
+ if (!fs.existsSync(OPENCLAW_DELIVERY_PATH)) {
98
+ fs.mkdirSync(path.dirname(OPENCLAW_DELIVERY_PATH), { recursive: true });
99
+ fs.writeFileSync(OPENCLAW_DELIVERY_PATH, JSON.stringify(payload, null, 2), "utf8");
100
+ }
101
+ persistOpenclawDeliveryList(payload);
102
+ return true;
103
+ }
104
+ //# sourceMappingURL=openclaw-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-delivery.js","sourceRoot":"","sources":["../../../src/notify/openclaw-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export declare const NOTIFY_CONFIG_PATH: string;
2
+ /**
3
+ * 推送目标。日常只需:
4
+ * - 环境变量 `GRINDERS_FARM_NOTIFY_TARGET`,或
5
+ * - `~/.grinders-farm/notify.json` 里只写 `"target": "..."` 即可。
6
+ * 其余字段均为可选(多账号、指定频道等)。
7
+ */
8
+ export interface NotifyConfig {
9
+ enabled: boolean;
10
+ target?: string;
11
+ targets?: NotifyTarget[];
12
+ channel?: string;
13
+ account?: string;
14
+ attachImage?: boolean;
15
+ onAutoAdvance?: boolean;
16
+ messagePrefix?: string;
17
+ }
18
+ export interface NotifyTarget {
19
+ target: string;
20
+ channel?: string;
21
+ account?: string;
22
+ threadId?: string | number;
23
+ sessionKey?: string;
24
+ }
25
+ /**
26
+ * 优先级:环境变量 → OpenClaw 插件写入的会话投递(~/.grinders-farm/openclaw-delivery.json)→ notify.json
27
+ */
28
+ export declare function loadNotifyConfig(): NotifyConfig | null;
29
+ /** `openclaw message send` 不支持 webchat;Web 控制端改用 Gateway `chat.inject` */
30
+ export declare function isUnsupportedOpenclawMessageChannel(channel?: string): boolean;
31
+ /**
32
+ * Web 控制端:向会话追加一条「助手」消息并广播到 WebChat(不经 message send)。
33
+ * 默认 `agent:<GRINDERS_FARM_AGENT_ID||main>:main`,与 `openclaw sessions` 中主会话一致。
34
+ */
35
+ export declare function resolveWebchatSessionKey(): string;
36
+ export interface PushFarmSnapshotOptions {
37
+ dryRun?: boolean;
38
+ }
39
+ export interface PushFarmSnapshotResult {
40
+ ok: boolean;
41
+ message: string;
42
+ }
43
+ /**
44
+ * Renders current farm, then runs `openclaw message send` (no LLM).
45
+ * Web 控制端(webchat)使用 `openclaw gateway call chat.inject`。
46
+ */
47
+ export declare function pushFarmSnapshot(opts?: PushFarmSnapshotOptions): Promise<PushFarmSnapshotResult>;
48
+ export declare function shouldNotifyOnAutoAdvance(): boolean;
49
+ //# sourceMappingURL=openclaw-push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-push.d.ts","sourceRoot":"","sources":["../../../src/notify/openclaw-push.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,kBAAkB,QAA2D,CAAC;AAI3F;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuFD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAEtD;AAED,0EAA0E;AAC1E,wBAAgB,mCAAmC,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAG7E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD;AAiJD,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAmED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0HtG;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAInD"}