tellrun 1.2.0 → 1.2.4

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.
@@ -20,7 +20,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
20
20
  const polling = new AbortController();
21
21
  let started = false;
22
22
  /** 输入提示与流式草稿只发送最新状态,避免自动重发已过期的内容。 */
23
- bot.api.config.use((prev, method, payload, signal) => ["sendChatAction", "sendMessageDraft"].includes(method)
23
+ bot.api.config.use((prev, method, payload, signal) => ["sendChatAction", "sendMessageDraft", "answerCallbackQuery"].includes(method)
24
24
  ? prev(method, payload, signal)
25
25
  : autoRetry({ maxRetryAttempts: 2, maxDelaySeconds: 5, rethrowHttpErrors: true })(prev, method, payload, signal));
26
26
  /** 超时覆盖整次调用及重试;grammY 的旧 signal 类型与 Node 原生接口兼容。 */
@@ -28,7 +28,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
28
28
  AbortSignal.any([
29
29
  AbortSignal.timeout(method === "getUpdates"
30
30
  ? 40_000
31
- : ["sendChatAction", "sendMessageDraft"].includes(method)
31
+ : ["sendChatAction", "sendMessageDraft", "answerCallbackQuery"].includes(method)
32
32
  ? 4_000
33
33
  : 15_000),
34
34
  ...([
@@ -37,6 +37,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
37
37
  "getUpdates",
38
38
  "sendChatAction",
39
39
  "sendMessageDraft",
40
+ "answerCallbackQuery",
40
41
  ].includes(method)
41
42
  ? [polling.signal]
42
43
  : []),
@@ -48,13 +49,17 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
48
49
  }
49
50
  });
50
51
  bot.on("message", async (ctx) => {
51
- const command = ctx.message.text === undefined
52
+ let command = ctx.message.text === undefined
52
53
  ? undefined
53
54
  : ctx.message.entities?.find((entity) => entity.type === "bot_command" && entity.offset === 0);
54
55
  const [name, target] = command
55
56
  ? (ctx.message.text?.slice(1, command.length).split("@") ?? [])
56
57
  : [];
57
- if (target !== undefined && target.toLowerCase() !== ctx.me.username?.toLowerCase())
58
+ /** 问题回复可包含绝对路径等斜杠文本;已知控制命令仍优先处理。 */
59
+ if (ctx.message.reply_to_message?.from?.id === ctx.me.id &&
60
+ !["start", "help", "cwd", "new", "status", "last", "stop", "resume"].includes(name ?? ""))
61
+ command = undefined;
62
+ if (command && target !== undefined && target.toLowerCase() !== ctx.me.username?.toLowerCase())
58
63
  return;
59
64
  await handleMessage({
60
65
  channel: {
@@ -71,10 +76,46 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
71
76
  args: ctx.message.text?.slice(command.length).trim() ?? "",
72
77
  }
73
78
  : ctx.message.text !== undefined
74
- ? { type: "text", text: ctx.message.text }
79
+ ? {
80
+ type: "text",
81
+ text: ctx.message.text,
82
+ ...(ctx.message.reply_to_message?.from?.id === ctx.me.id
83
+ ? { replyToMessageId: ctx.message.reply_to_message.message_id }
84
+ : {}),
85
+ }
75
86
  : { type: "unsupported" },
76
87
  });
77
88
  });
89
+ /** 先保存选择,再关闭客户端等待提示;答复回调失败不能撤销或重发已保存的决定。 */
90
+ bot.on("callback_query:data", async (ctx) => {
91
+ const match = ctx.callbackQuery.data.match(/^i:([0-9a-f-]{36}):(accept|decline|stop|q(\d+)_(\d+))$/);
92
+ let reply = "Button expired.";
93
+ if (match?.[1] && ctx.chat && ctx.callbackQuery.message) {
94
+ reply =
95
+ (await handleMessage({
96
+ channel: {
97
+ platform: "telegram",
98
+ accountId: String(ctx.me.id),
99
+ chatId: String(ctx.chat.id),
100
+ userId: String(ctx.from.id),
101
+ },
102
+ eventId: String(ctx.update.update_id),
103
+ content: {
104
+ type: "interaction",
105
+ id: match[1],
106
+ action: match[3] !== undefined ? "option" : match[2],
107
+ messageId: ctx.callbackQuery.message.message_id,
108
+ ...(match[3] !== undefined
109
+ ? { questionIndex: Number(match[3]), optionIndex: Number(match[4]) }
110
+ : {}),
111
+ },
112
+ })) ?? "Received.";
113
+ }
114
+ /** 回调提示不占用入站循环,慢网络下 /status 和 /stop 仍能立即处理。 */
115
+ void ctx.answerCallbackQuery({ text: reply }).catch((error) => {
116
+ logger.warn({ errorType: error instanceof Error ? error.name : "UnknownError" }, "Callback acknowledgement failed; saved choice remains valid");
117
+ });
118
+ });
78
119
  /** 原始网络错误可能带 Token,只记录类别和错误码。 */
79
120
  function logFailure(error) {
80
121
  let cause = error instanceof BotError ? error.error : error;
@@ -130,11 +171,15 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
130
171
  /** 只有入站状态保存成功才推进确认位置;重投按已保存的事件标识去重。 */
131
172
  let offset = 0;
132
173
  while (!polling.signal.aborted) {
133
- for (const update of await bot.api.getUpdates({
174
+ const updates = await bot.api.getUpdates({
134
175
  offset,
135
176
  timeout: 30,
136
- allowed_updates: ["message"],
137
- })) {
177
+ allowed_updates: ["message", "callback_query"],
178
+ });
179
+ if (polling.signal.aborted)
180
+ return;
181
+ store.confirmUpdates(String(bot.botInfo.id), offset, updates.length === 0);
182
+ for (const update of updates) {
138
183
  if (polling.signal.aborted)
139
184
  return;
140
185
  await bot.handleUpdate(update);
@@ -146,7 +191,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
146
191
  let nextDraftAt = 0;
147
192
  let sentDraft;
148
193
  while (!polling.signal.aborted) {
149
- const reply = store.pendingReply(String(bot.botInfo.id), String(config.ownerId));
194
+ const reply = store.claimReply(String(bot.botInfo.id), String(config.ownerId));
150
195
  if (!reply) {
151
196
  const draft = store.pendingDraft(String(bot.botInfo.id), String(config.ownerId));
152
197
  if (draft &&
@@ -185,8 +230,49 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
185
230
  continue;
186
231
  }
187
232
  try {
188
- await bot.api.sendMessage(reply.chatId, reply.text);
189
- store.removeReply(reply.id);
233
+ if (reply.messageId) {
234
+ await bot.api.editMessageText(reply.chatId, reply.messageId, reply.text, {
235
+ reply_markup: { inline_keyboard: [] },
236
+ });
237
+ store.removeReply(reply.id);
238
+ }
239
+ else {
240
+ const interaction = reply.interaction;
241
+ const sent = await bot.api.sendMessage(reply.chatId, reply.text, {
242
+ ...(reply.promptEnd &&
243
+ interaction?.status === "pending" &&
244
+ interaction.expiresAt > Date.now()
245
+ ? {
246
+ reply_markup: {
247
+ inline_keyboard: [
248
+ ...(interaction.kind === "approval"
249
+ ? interaction.choices.map((choice) => [
250
+ {
251
+ text: choice === "accept" ? "Allow once" : "Decline",
252
+ callback_data: `i:${interaction.id}:${choice}`,
253
+ },
254
+ ])
255
+ : (interaction.questions[reply.questionIndex ?? -1]?.options ?? []).map((option, index) => [
256
+ {
257
+ text: `${index + 1}. ${[...option.label].slice(0, 50).join("")}`,
258
+ callback_data: `i:${interaction.id}:q${reply.questionIndex}_${index}`,
259
+ },
260
+ ])),
261
+ [{ text: "Stop", callback_data: `i:${interaction.id}:stop` }],
262
+ ],
263
+ },
264
+ }
265
+ : {}),
266
+ });
267
+ store.removeReply(reply.id, {
268
+ messageId: sent.message_id,
269
+ text: reply.text,
270
+ ...(reply.interactionId ? { interactionId: reply.interactionId } : {}),
271
+ ...(reply.questionIndex !== undefined
272
+ ? { questionIndex: reply.questionIndex }
273
+ : {}),
274
+ });
275
+ }
190
276
  /** 普通消息会清除客户端草稿;任务仍执行时允许再次显示最新内容。 */
191
277
  sentDraft = undefined;
192
278
  }
@@ -206,7 +292,7 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
206
292
  ? error.parameters.retry_after
207
293
  : Math.min(60, 2 ** Math.min(reply.attempts, 6)));
208
294
  logger.warn({ outboxId: reply.id, permanent, errorType: error.name }, permanent
209
- ? "Telegram rejected reply permanently; removed from queue. Result kept."
295
+ ? "Telegram rejected reply permanently; removed from queue."
210
296
  : "Telegram reply failed; saved for retry");
211
297
  }
212
298
  }
@@ -215,7 +301,8 @@ export function createTelegramConnection(config, handleMessage, store, logger) {
215
301
  let nextTypingAt = 0;
216
302
  while (!polling.signal.aborted) {
217
303
  if (Date.now() >= nextTypingAt &&
218
- ["dispatching", "running"].includes(store.activeTask()?.status ?? "")) {
304
+ ["dispatching", "running"].includes(store.activeTask()?.status ?? "") &&
305
+ !store.activeTask()?.interactions.some((item) => item.blocking)) {
219
306
  nextTypingAt = Date.now() + 4_000;
220
307
  try {
221
308
  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);
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { join } from "node:path";
2
+ import { appDirectory } from "./config.js";
3
+ import { manageLaunchdService } from "./launchd.js";
4
+ import { manageSystemdService } from "./systemd.js";
5
+ /** 按当前系统选择后台管理器,不加载任务状态或消息连接。 */
6
+ export async function manageService(action, options = {}) {
7
+ if (action === "status")
8
+ console.log(`Config: ${join(appDirectory, "config.json")}\nState: ${join(appDirectory, "state.json")}`);
9
+ if (process.platform === "darwin")
10
+ return manageLaunchdService(action, options);
11
+ if (process.platform === "linux")
12
+ return manageSystemdService(action, options);
13
+ throw new Error("Background mode requires Linux or macOS. Use tellrun run instead.");
14
+ }
15
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAQpD,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAqB,EAAE,OAAO,GAAmB,EAAE;IACrF,IAAI,MAAM,KAAK,QAAQ;QACrB,OAAO,CAAC,GAAG,CACT,WAAW,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAC3F,CAAC;IACJ,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/E,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;AACvF,CAAC"}