tellrun 1.1.2 → 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.
- package/README.md +35 -91
- package/README.zh-CN.md +35 -91
- package/dist/agents/codex-interaction.js +126 -0
- package/dist/agents/codex-interaction.js.map +1 -0
- package/dist/agents/codex.js +132 -9
- package/dist/agents/codex.js.map +1 -1
- package/dist/cli.js +11 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/relay.js +33 -9
- package/dist/core/relay.js.map +1 -1
- package/dist/im/telegram.js +100 -13
- package/dist/im/telegram.js.map +1 -1
- package/dist/launchd.js +212 -0
- package/dist/launchd.js.map +1 -0
- package/dist/logger.js +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/main.js +27 -2
- package/dist/main.js.map +1 -1
- package/dist/service.js +15 -0
- package/dist/service.js.map +1 -0
- package/dist/storage/lock.js +78 -0
- package/dist/storage/lock.js.map +1 -0
- package/dist/storage/schema.js +37 -0
- package/dist/storage/schema.js.map +1 -1
- package/dist/storage/store.js +278 -98
- package/dist/storage/store.js.map +1 -1
- package/dist/systemd.js +1 -7
- package/dist/systemd.js.map +1 -1
- package/docs/architecture.md +86 -67
- package/docs/prd.md +10 -8
- package/package.json +2 -2
package/dist/im/telegram.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
? {
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
189
|
-
|
|
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.
|
|
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");
|
package/dist/im/telegram.js.map
CHANGED
|
@@ -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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"}
|
package/dist/launchd.js
ADDED
|
@@ -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
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,
|
|
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
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/service.js
ADDED
|
@@ -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"}
|