tellrun 1.2.0 → 1.2.5

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.
@@ -2,6 +2,18 @@ import { Agent } from "node:https";
2
2
  import { setTimeout } from "node:timers/promises";
3
3
  import { autoRetry } from "@grammyjs/auto-retry";
4
4
  import { Bot, BotError, GrammyError, HttpError } from "grammy";
5
+ /** 默认菜单和控制命令识别共用定义,菜单说明统一使用英文。 */
6
+ const commands = [
7
+ { command: "start", description: "Show usage instructions" },
8
+ { command: "help", description: "Show available commands" },
9
+ { command: "cwd", description: "Show or change the working directory" },
10
+ { command: "new", description: "Start a new conversation" },
11
+ { command: "permissions", description: "Select the permission mode for future tasks" },
12
+ { command: "status", description: "Show session and task status" },
13
+ { command: "last", description: "Show the latest task result" },
14
+ { command: "stop", description: "Stop the current task and pause" },
15
+ { command: "resume", description: "Accept new tasks" },
16
+ ];
5
17
  /** Telegram 连接器负责鉴权、消息转换与发送,业务逻辑交给统一处理入口。 */
6
18
  export function createTelegramConnection(config, handleMessage, store, logger) {
7
19
  /** 默认继承终端代理;显式配置使用优先级更高的小写变量,保留 NO_PROXY 规则。 */
@@ -20,7 +32,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
20
32
  const polling = new AbortController();
21
33
  let started = false;
22
34
  /** 输入提示与流式草稿只发送最新状态,避免自动重发已过期的内容。 */
23
- bot.api.config.use((prev, method, payload, signal) => ["sendChatAction", "sendMessageDraft"].includes(method)
35
+ bot.api.config.use((prev, method, payload, signal) => ["sendChatAction", "sendMessageDraft", "answerCallbackQuery"].includes(method)
24
36
  ? prev(method, payload, signal)
25
37
  : autoRetry({ maxRetryAttempts: 2, maxDelaySeconds: 5, rethrowHttpErrors: true })(prev, method, payload, signal));
26
38
  /** 超时覆盖整次调用及重试;grammY 的旧 signal 类型与 Node 原生接口兼容。 */
@@ -28,15 +40,18 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
28
40
  AbortSignal.any([
29
41
  AbortSignal.timeout(method === "getUpdates"
30
42
  ? 40_000
31
- : ["sendChatAction", "sendMessageDraft"].includes(method)
43
+ : ["sendChatAction", "sendMessageDraft", "answerCallbackQuery"].includes(method)
32
44
  ? 4_000
33
45
  : 15_000),
34
46
  ...([
35
47
  "getMe",
36
48
  "getWebhookInfo",
49
+ "setMyCommands",
50
+ "setChatMenuButton",
37
51
  "getUpdates",
38
52
  "sendChatAction",
39
53
  "sendMessageDraft",
54
+ "answerCallbackQuery",
40
55
  ].includes(method)
41
56
  ? [polling.signal]
42
57
  : []),
@@ -48,13 +63,17 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
48
63
  }
49
64
  });
50
65
  bot.on("message", async (ctx) => {
51
- const command = ctx.message.text === undefined
66
+ let command = ctx.message.text === undefined
52
67
  ? undefined
53
68
  : ctx.message.entities?.find((entity) => entity.type === "bot_command" && entity.offset === 0);
54
69
  const [name, target] = command
55
70
  ? (ctx.message.text?.slice(1, command.length).split("@") ?? [])
56
71
  : [];
57
- if (target !== undefined && target.toLowerCase() !== ctx.me.username?.toLowerCase())
72
+ /** 问题回复可包含绝对路径等斜杠文本;已知控制命令仍优先处理。 */
73
+ if (ctx.message.reply_to_message?.from?.id === ctx.me.id &&
74
+ !commands.some((item) => item.command === name))
75
+ command = undefined;
76
+ if (command && target !== undefined && target.toLowerCase() !== ctx.me.username?.toLowerCase())
58
77
  return;
59
78
  await handleMessage({
60
79
  channel: {
@@ -71,10 +90,56 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
71
90
  args: ctx.message.text?.slice(command.length).trim() ?? "",
72
91
  }
73
92
  : ctx.message.text !== undefined
74
- ? { type: "text", text: ctx.message.text }
93
+ ? {
94
+ type: "text",
95
+ text: ctx.message.text,
96
+ ...(ctx.message.reply_to_message?.from?.id === ctx.me.id
97
+ ? { replyToMessageId: ctx.message.reply_to_message.message_id }
98
+ : {}),
99
+ }
75
100
  : { type: "unsupported" },
76
101
  });
77
102
  });
103
+ /** 先保存选择,再关闭客户端等待提示;答复回调失败不能撤销或重发已保存的决定。 */
104
+ bot.on("callback_query:data", async (ctx) => {
105
+ const match = ctx.callbackQuery.data.match(/^i:([0-9a-f-]{36}):(accept|decline|stop|q(\d+)_(\d+))$/);
106
+ const permissions = ctx.callbackQuery.data.match(/^p:([0-9a-f-]{36}):(\d+)$/);
107
+ let reply = "Button expired.";
108
+ if ((match?.[1] || permissions?.[1]) && ctx.chat && ctx.callbackQuery.message) {
109
+ reply =
110
+ (await handleMessage({
111
+ channel: {
112
+ platform: "telegram",
113
+ accountId: String(ctx.me.id),
114
+ chatId: String(ctx.chat.id),
115
+ userId: String(ctx.from.id),
116
+ },
117
+ eventId: String(ctx.update.update_id),
118
+ content: permissions?.[1]
119
+ ? {
120
+ type: "permissions",
121
+ id: permissions[1],
122
+ optionIndex: Number(permissions[2]),
123
+ messageId: ctx.callbackQuery.message.message_id,
124
+ }
125
+ : {
126
+ type: "interaction",
127
+ id: match?.[1] ?? "",
128
+ action: match?.[3] !== undefined
129
+ ? "option"
130
+ : match?.[2],
131
+ messageId: ctx.callbackQuery.message.message_id,
132
+ ...(match?.[3] !== undefined
133
+ ? { questionIndex: Number(match[3]), optionIndex: Number(match[4]) }
134
+ : {}),
135
+ },
136
+ })) ?? "Received.";
137
+ }
138
+ /** 回调提示不占用入站循环,慢网络下 /status 和 /stop 仍能立即处理。 */
139
+ void ctx.answerCallbackQuery({ text: reply }).catch((error) => {
140
+ logger.warn({ errorType: error instanceof Error ? error.name : "UnknownError" }, "Callback acknowledgement failed; saved choice remains valid");
141
+ });
142
+ });
78
143
  /** 原始网络错误可能带 Token,只记录类别和错误码。 */
79
144
  function logFailure(error) {
80
145
  let cause = error instanceof BotError ? error.error : error;
@@ -92,7 +157,10 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
92
157
  ? "Telegram polling conflict. Check other instances or webhook."
93
158
  : cause instanceof GrammyError && cause.error_code === 401
94
159
  ? "Telegram authentication failed. Check bot token."
95
- : "Telegram or storage error. Stopping service.");
160
+ : error instanceof HttpError ||
161
+ (error instanceof BotError && error.error instanceof HttpError)
162
+ ? "Telegram connection failed. Check your network or set telegram.proxyUrl in ~/.tellrun/config.json."
163
+ : "Telegram or storage error. Stopping service.");
96
164
  }
97
165
  return {
98
166
  /** 核实机器人身份后才启动任务,初始化不消费 Telegram 消息。 */
@@ -105,6 +173,11 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
105
173
  logger.error("Webhook configured. Remove it before starting long polling.");
106
174
  throw new Error("Bot has an active webhook.");
107
175
  }
176
+ /** 注册默认语言的命令列表,并让默认菜单按钮打开命令菜单。 */
177
+ await bot.api.setMyCommands(commands);
178
+ await bot.api.setChatMenuButton({ menu_button: { type: "commands" } });
179
+ if (polling.signal.aborted)
180
+ return;
108
181
  return {
109
182
  platform: "telegram",
110
183
  accountId: String(bot.botInfo.id),
@@ -130,11 +203,15 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
130
203
  /** 只有入站状态保存成功才推进确认位置;重投按已保存的事件标识去重。 */
131
204
  let offset = 0;
132
205
  while (!polling.signal.aborted) {
133
- for (const update of await bot.api.getUpdates({
206
+ const updates = await bot.api.getUpdates({
134
207
  offset,
135
208
  timeout: 30,
136
- allowed_updates: ["message"],
137
- })) {
209
+ allowed_updates: ["message", "callback_query"],
210
+ });
211
+ if (polling.signal.aborted)
212
+ return;
213
+ store.confirmUpdates(String(bot.botInfo.id), offset, updates.length === 0);
214
+ for (const update of updates) {
138
215
  if (polling.signal.aborted)
139
216
  return;
140
217
  await bot.handleUpdate(update);
@@ -146,7 +223,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
146
223
  let nextDraftAt = 0;
147
224
  let sentDraft;
148
225
  while (!polling.signal.aborted) {
149
- const reply = store.pendingReply(String(bot.botInfo.id), String(config.ownerId));
226
+ const reply = store.claimReply(String(bot.botInfo.id), String(config.ownerId));
150
227
  if (!reply) {
151
228
  const draft = store.pendingDraft(String(bot.botInfo.id), String(config.ownerId));
152
229
  if (draft &&
@@ -185,8 +262,66 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
185
262
  continue;
186
263
  }
187
264
  try {
188
- await bot.api.sendMessage(reply.chatId, reply.text);
189
- store.removeReply(reply.id);
265
+ if (reply.messageId) {
266
+ await bot.api.editMessageText(reply.chatId, reply.messageId, reply.text, {
267
+ reply_markup: { inline_keyboard: [] },
268
+ });
269
+ store.removeReply(reply.id);
270
+ }
271
+ else {
272
+ const interaction = reply.interaction;
273
+ const sent = await bot.api.sendMessage(reply.chatId, reply.text, {
274
+ ...(reply.promptEnd &&
275
+ reply.permissionMenu &&
276
+ reply.permissionMenu.expiresAt > Date.now()
277
+ ? {
278
+ reply_markup: {
279
+ inline_keyboard: reply.permissionMenu.options.map((option, index) => [
280
+ {
281
+ text: `${index + 1}. ${[...option.label].slice(0, 50).join("")}`,
282
+ callback_data: `p:${reply.permissionMenu?.id}:${index}`,
283
+ },
284
+ ]),
285
+ },
286
+ }
287
+ : reply.promptEnd &&
288
+ interaction?.status === "pending" &&
289
+ interaction.expiresAt > Date.now()
290
+ ? {
291
+ reply_markup: {
292
+ inline_keyboard: [
293
+ ...(interaction.kind === "approval"
294
+ ? interaction.choices.map((choice) => [
295
+ {
296
+ text: choice === "accept" ? "Allow once" : "Decline",
297
+ callback_data: `i:${interaction.id}:${choice}`,
298
+ },
299
+ ])
300
+ : (interaction.questions[reply.questionIndex ?? -1]?.options ??
301
+ []).map((option, index) => [
302
+ {
303
+ text: `${index + 1}. ${[...option.label].slice(0, 50).join("")}`,
304
+ callback_data: `i:${interaction.id}:q${reply.questionIndex}_${index}`,
305
+ },
306
+ ])),
307
+ [{ text: "Stop", callback_data: `i:${interaction.id}:stop` }],
308
+ ],
309
+ },
310
+ }
311
+ : {}),
312
+ });
313
+ store.removeReply(reply.id, {
314
+ messageId: sent.message_id,
315
+ text: reply.text,
316
+ ...(reply.interactionId ? { interactionId: reply.interactionId } : {}),
317
+ ...(reply.questionIndex !== undefined
318
+ ? { questionIndex: reply.questionIndex }
319
+ : {}),
320
+ ...(reply.promptEnd && reply.permissionMenuId
321
+ ? { permissionMenuId: reply.permissionMenuId }
322
+ : {}),
323
+ });
324
+ }
190
325
  /** 普通消息会清除客户端草稿;任务仍执行时允许再次显示最新内容。 */
191
326
  sentDraft = undefined;
192
327
  }
@@ -206,7 +341,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
206
341
  ? error.parameters.retry_after
207
342
  : Math.min(60, 2 ** Math.min(reply.attempts, 6)));
208
343
  logger.warn({ outboxId: reply.id, permanent, errorType: error.name }, permanent
209
- ? "Telegram rejected reply permanently; removed from queue. Result kept."
344
+ ? "Telegram rejected reply permanently; removed from queue."
210
345
  : "Telegram reply failed; saved for retry");
211
346
  }
212
347
  }
@@ -215,7 +350,8 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
215
350
  let nextTypingAt = 0;
216
351
  while (!polling.signal.aborted) {
217
352
  if (Date.now() >= nextTypingAt &&
218
- ["dispatching", "running"].includes(store.activeTask()?.status ?? "")) {
353
+ ["dispatching", "running"].includes(store.activeTask()?.status ?? "") &&
354
+ !store.activeTask()?.interactions.some((item) => item.blocking)) {
219
355
  nextTypingAt = Date.now() + 4_000;
220
356
  try {
221
357
  await bot.api.sendChatAction(config.ownerId, "typing");
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/im/telegram.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/im/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { chmodSync, existsSync, mkdirSync, readFileSync, readlinkSync, renameSync, rmSync, symlinkSync, writeFileSync, } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, isAbsolute, join } from "node:path";
5
+ import { setTimeout } from "node:timers/promises";
6
+ import { fileURLToPath } from "node:url";
7
+ import { promisify } from "node:util";
8
+ import { appDirectory, loadConfig } from "./config.js";
9
+ import { acquireLock } from "./storage/lock.js";
10
+ /** 当前用户的服务标识;登录入口只链接到本应用保存的定义。 */
11
+ const label = "io.github.chaoyue1998.tellrun";
12
+ /** 只把明确不存在的服务或登录域视为未加载,不转发原始系统错误。 */
13
+ async function launchctl(...args) {
14
+ try {
15
+ const { stdout } = await promisify(execFile)("/bin/launchctl", args, {
16
+ timeout: 50_000,
17
+ maxBuffer: 4_194_304,
18
+ });
19
+ return stdout;
20
+ }
21
+ catch (error) {
22
+ if (args[0] === "print" &&
23
+ error instanceof Error &&
24
+ "stderr" in error &&
25
+ typeof error.stderr === "string" &&
26
+ /Could not find (service|domain)/.test(error.stderr))
27
+ return undefined;
28
+ throw new Error(`launchctl ${args[0]} failed. Check tellrun logs and your login session.`);
29
+ }
30
+ }
31
+ /** 使用 GUI 登录域运行用户服务;退出终端不停止,注销用户后由 launchd 停止。 */
32
+ export async function manageLaunchdService(action, options) {
33
+ const domain = `gui/${process.getuid?.()}`;
34
+ const target = `${domain}/${label}`;
35
+ const plist = join(appDirectory, "tellrun.plist");
36
+ const loginFile = join(homedir(), "Library", "LaunchAgents", `${label}.plist`);
37
+ const readyFile = join(appDirectory, "launchd.ready");
38
+ const logFile = join(appDirectory, "tellrun.log");
39
+ if (action === "logs") {
40
+ if (!existsSync(logFile)) {
41
+ console.log("No service logs yet.");
42
+ return;
43
+ }
44
+ await new Promise((resolve, reject) => {
45
+ const child = spawn("/usr/bin/tail", ["-n", "100", ...(options.follow ? ["-F"] : []), logFile], {
46
+ stdio: "inherit",
47
+ });
48
+ child.on("error", () => reject(new Error("Cannot open service logs.")));
49
+ child.on("close", (code, signal) => {
50
+ if (code === 0 || signal === "SIGINT")
51
+ resolve();
52
+ else
53
+ reject(new Error("Cannot read service logs. Check file permissions."));
54
+ });
55
+ });
56
+ return;
57
+ }
58
+ /** 启停操作串行,避免并发重启删除另一进程刚写入的就绪标记。 */
59
+ let release;
60
+ if (action !== "status") {
61
+ mkdirSync(appDirectory, { recursive: true, mode: 0o700 });
62
+ chmodSync(appDirectory, 0o700);
63
+ try {
64
+ release = acquireLock(join(appDirectory, "launchd"));
65
+ }
66
+ catch {
67
+ throw new Error("Service command busy or storage unavailable. Check ~/.tellrun/ and retry.");
68
+ }
69
+ }
70
+ try {
71
+ let enabled = false;
72
+ try {
73
+ if (readlinkSync(loginFile) !== plist)
74
+ throw new Error("Unrelated login item.");
75
+ enabled = true;
76
+ }
77
+ catch (error) {
78
+ if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
79
+ throw new Error(`Login item already exists. Check ${loginFile}.`);
80
+ }
81
+ const state = await launchctl("print", target);
82
+ const pid = Number(state?.match(/^\tpid = (\d+)$/m)?.[1] ?? 0);
83
+ /** 进程存在不代表连接成功;就绪标记必须属于 launchd 当前报告的 PID。 */
84
+ function ready(currentPid) {
85
+ if (!currentPid)
86
+ return false;
87
+ try {
88
+ return readFileSync(readyFile, "utf8") === String(currentPid);
89
+ }
90
+ catch (error) {
91
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
92
+ return false;
93
+ throw new Error("Cannot read service readiness. Check ~/.tellrun/ permissions.");
94
+ }
95
+ }
96
+ if (action === "status") {
97
+ console.log(`Service: ${ready(pid) ? "running" : pid ? "starting" : state ? "waiting" : existsSync(plist) ? "stopped" : "not installed"}\nPID: ${pid}\nAt login: ${enabled ? "enabled" : "disabled"}\nLogs: ${logFile}`);
98
+ return;
99
+ }
100
+ /** bootout 阻止故障重启,再等待旧进程实际退出,确保重新启动时不会争抢状态锁。 */
101
+ async function unload() {
102
+ if (state)
103
+ await launchctl("bootout", target);
104
+ const deadline = Date.now() + 50_000;
105
+ while (pid) {
106
+ try {
107
+ process.kill(pid, 0);
108
+ }
109
+ catch (error) {
110
+ if (error instanceof Error && "code" in error && error.code === "ESRCH")
111
+ break;
112
+ throw new Error("Cannot confirm service exit. Check tellrun status.");
113
+ }
114
+ if (Date.now() >= deadline)
115
+ throw new Error("Service did not stop in time. Check tellrun status and logs.");
116
+ await setTimeout(100);
117
+ }
118
+ rmSync(readyFile, { force: true });
119
+ }
120
+ if (action === "stop" || action === "uninstall") {
121
+ await unload();
122
+ if (action === "uninstall") {
123
+ if (enabled)
124
+ rmSync(loginFile);
125
+ rmSync(plist, { force: true });
126
+ console.log("Service removed. Config, state, and logs kept.");
127
+ }
128
+ else
129
+ console.log("Service stopped.");
130
+ return;
131
+ }
132
+ const config = loadConfig({});
133
+ if (!isAbsolute(config.codexPath) || !existsSync(config.codexPath))
134
+ throw new Error("Background mode needs an absolute Codex path. Run tellrun setup.");
135
+ const entry = fileURLToPath(new URL("./cli.js", import.meta.url));
136
+ if (!existsSync(entry))
137
+ throw new Error("CLI build missing. Run npm run build, then node dist/cli.js.");
138
+ if (!state && !(await launchctl("print", domain)))
139
+ throw new Error("Log in to the Mac desktop, then retry. Or use tellrun run.");
140
+ const temporary = `${plist}.${process.pid}.tmp`;
141
+ try {
142
+ /** 原生 plutil 转义 XML 路径;凭据留在 config.json,不写入参数或服务环境。 */
143
+ writeFileSync(temporary, JSON.stringify({
144
+ Label: label,
145
+ ProgramArguments: [process.execPath, entry, "run"],
146
+ WorkingDirectory: homedir(),
147
+ EnvironmentVariables: {
148
+ TELLRUN_LAUNCHD: "1",
149
+ PATH: [
150
+ dirname(process.execPath),
151
+ dirname(config.codexPath),
152
+ "/opt/homebrew/bin",
153
+ "/usr/local/bin",
154
+ "/usr/bin",
155
+ "/bin",
156
+ "/usr/sbin",
157
+ "/sbin",
158
+ ].join(":"),
159
+ },
160
+ RunAtLoad: true,
161
+ KeepAlive: { SuccessfulExit: false },
162
+ ThrottleInterval: 5,
163
+ ExitTimeOut: 45,
164
+ AbandonProcessGroup: false,
165
+ Umask: 0o077,
166
+ StandardOutPath: logFile,
167
+ StandardErrorPath: logFile,
168
+ }), { mode: 0o600, flag: "wx" });
169
+ await promisify(execFile)("/usr/bin/plutil", ["-convert", "xml1", temporary], {
170
+ timeout: 5_000,
171
+ });
172
+ chmodSync(temporary, 0o600);
173
+ renameSync(temporary, plist);
174
+ }
175
+ finally {
176
+ rmSync(temporary, { force: true });
177
+ }
178
+ writeFileSync(logFile, "", { mode: 0o600, flag: "a" });
179
+ chmodSync(logFile, 0o600);
180
+ if (options.enable && !enabled) {
181
+ mkdirSync(dirname(loginFile), { recursive: true });
182
+ symlinkSync(plist, loginFile);
183
+ enabled = true;
184
+ }
185
+ await launchctl("enable", target);
186
+ if (action === "restart" || !pid) {
187
+ await unload();
188
+ await launchctl("bootstrap", domain, plist);
189
+ }
190
+ /** 等待初始化只读取状态,提前释放控制锁,允许另一终端停止尚未就绪的服务。 */
191
+ release?.();
192
+ release = undefined;
193
+ /** 最多等待一分钟初始化;旧标记或仅有 PID 都不能作为启动成功的依据。 */
194
+ const deadline = Date.now() + 60_000;
195
+ while (Date.now() < deadline) {
196
+ const current = await launchctl("print", target);
197
+ if (!current)
198
+ throw new Error("Service exited before it was ready. Check tellrun logs.");
199
+ if (ready(Number(current.match(/^\tpid = (\d+)$/m)?.[1] ?? 0))) {
200
+ console.log(action === "restart" ? "Service restarted." : "Service started.");
201
+ console.log(`At login: ${enabled ? "enabled" : "disabled"}. Use tellrun status or tellrun logs.`);
202
+ return;
203
+ }
204
+ await setTimeout(250);
205
+ }
206
+ throw new Error("Service not ready. Check tellrun logs.");
207
+ }
208
+ finally {
209
+ release?.();
210
+ }
211
+ }
212
+ //# sourceMappingURL=launchd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
package/dist/logger.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { pino } from "pino";
2
- /** 创建结构化日志;调用方只记录标识和阶段,不传入配置、正文或原始 API 错误。 */
2
+ /** 只记录服务启停与故障诊断,不传入任务正文、配置或原始 API 错误。 */
3
3
  export function createLogger() {
4
4
  return pino({
5
5
  name: "tellrun",
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,8CAA8C;AAC9C,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,eAAe;gBACf,OAAO;gBACP,oBAAoB;gBACpB,eAAe;gBACf,QAAQ;gBACR,iBAAiB;gBACjB,SAAS;gBACT,sBAAsB;gBACtB,iBAAiB;gBACjB,UAAU;aACX;YACD,MAAM,EAAE,YAAY;SACrB;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,yCAAyC;AACzC,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,eAAe;gBACf,OAAO;gBACP,oBAAoB;gBACpB,eAAe;gBACf,QAAQ;gBACR,iBAAiB;gBACjB,SAAS;gBACT,sBAAsB;gBACtB,iBAAiB;gBACjB,UAAU;aACX;YACD,MAAM,EAAE,YAAY;SACrB;KACF,CAAC,CAAC;AACL,CAAC"}
package/dist/main.js CHANGED
@@ -1,24 +1,44 @@
1
1
  import { execFile } from "node:child_process";
2
+ import { readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
2
4
  import { promisify } from "node:util";
3
5
  import { createCodexAgent } from "./agents/codex.js";
4
- import { loadConfig } from "./config.js";
6
+ import { appDirectory, loadConfig } from "./config.js";
5
7
  import { createRelayService } from "./core/relay.js";
6
8
  import { createTelegramConnection } from "./im/telegram.js";
7
9
  import { createLogger } from "./logger.js";
8
10
  import { openStore } from "./storage/store.js";
9
11
  /** 启动日志在配置校验前可用,避免将无效配置直接输出。 */
10
12
  const logger = createLogger();
13
+ /** launchd 没有 systemd 的就绪通知;临时标记只用于核对当前服务 PID。 */
14
+ const readyFile = process.platform === "darwin" && process.env.TELLRUN_LAUNCHD === "1"
15
+ ? join(appDirectory, "launchd.ready")
16
+ : undefined;
11
17
  let store;
12
18
  let im;
13
19
  let relay;
14
20
  let running = [];
15
21
  let phase = "Loading config";
16
22
  let stopping = false;
23
+ /** 只清理本进程写入的就绪标记;清理失败不阻止任务和连接关停。 */
24
+ function clearReady() {
25
+ if (!readyFile)
26
+ return;
27
+ try {
28
+ if (readFileSync(readyFile, "utf8") === String(process.pid))
29
+ rmSync(readyFile);
30
+ }
31
+ catch (error) {
32
+ if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
33
+ logger.warn("Cannot clear service readiness.");
34
+ }
35
+ }
17
36
  /** 两种退出信号共用关停入口;主流程等待消息处理和 Agent 退出后释放状态锁。 */
18
37
  function stop() {
19
38
  if (stopping)
20
39
  return;
21
40
  stopping = true;
41
+ clearReady();
22
42
  logger.info("Stopping service");
23
43
  im?.stop();
24
44
  relay?.stop();
@@ -29,11 +49,13 @@ try {
29
49
  const config = loadConfig();
30
50
  phase = "Loading state";
31
51
  store = openStore();
52
+ if (readyFile)
53
+ rmSync(readyFile, { force: true });
32
54
  phase = "Checking agent";
33
55
  const agent = await createCodexAgent(config.codexPath);
34
56
  logger.info({ agent: agent.name, version: agent.version }, "Agent CLI ready");
35
57
  if (!stopping) {
36
- relay = createRelayService({ store, agent, logger });
58
+ relay = createRelayService({ store, agent });
37
59
  im = createTelegramConnection(config.telegram, relay.handleMessage, store, logger);
38
60
  phase = "Connecting Telegram";
39
61
  const source = await im.initialize();
@@ -45,6 +67,8 @@ try {
45
67
  timeout: 5_000,
46
68
  });
47
69
  }
70
+ if (readyFile)
71
+ writeFileSync(readyFile, String(process.pid), { mode: 0o600 });
48
72
  phase = "Processing messages";
49
73
  running = [im.start(), relay.run(source)];
50
74
  await Promise.all(running);
@@ -66,6 +90,7 @@ catch (error) {
66
90
  : "Service failed");
67
91
  }
68
92
  finally {
93
+ clearReady();
69
94
  im?.stop();
70
95
  relay?.stop();
71
96
  await Promise.allSettled(running);