tellrun 1.3.8 → 2.0.1

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.
@@ -1,16 +1,22 @@
1
1
  import { realpathSync, statSync } from "node:fs";
2
2
  import { isAbsolute } from "node:path";
3
3
  import { setTimeout } from "node:timers/promises";
4
+ import { AttachmentError, maxAttachmentBytes } from "../storage/attachments.js";
4
5
  /** 接收消息只保存必要状态;任务执行独立串行运行,控制命令始终可用。 */
5
6
  export function createRelayService(options) {
6
7
  let stopping = false;
8
+ /** 当前任务的附件准备可独立取消,不能阻塞停止指令或拖住服务退出。 */
9
+ let inputPreparation;
7
10
  /** 菜单查询独立于任务,关停时取消查询并等待退出后再关闭存储。 */
8
11
  const modelLoading = new AbortController();
9
- /** 状态的模型与版本查询复用独立工作循环,不阻塞入站审批和停止指令。 */
10
- const statusQueries = [];
12
+ /** 状态与会话请求立即执行;工作循环统一接收结果并等待退出。 */
13
+ const controlQueries = [];
14
+ /** 会话变更确认前暂缓新任务,避免接口等待期间把消息发往旧会话。 */
15
+ let changingSession = false;
11
16
  /** 状态查询与历史结果共用面向用户的状态名称。 */
12
17
  const statuses = {
13
18
  queued: "Queued",
19
+ preparing: "Downloading attachments",
14
20
  dispatching: "Connecting",
15
21
  running: "Running",
16
22
  cancelling: "Stopping",
@@ -25,11 +31,8 @@ export function createRelayService(options) {
25
31
  async handleMessage(message) {
26
32
  if (stopping)
27
33
  throw new Error("Service stopping. Message not accepted.");
28
- let statusQuery;
34
+ let controlQuery;
29
35
  const reply = options.store.accept(message, (channel) => {
30
- /** 未指定目录时沿用服务启动目录,并随消息一同保存,后续可用 /cwd 切换。 */
31
- if (!channel.cwd)
32
- options.store.setSession(channel.id, realpathSync(process.cwd()));
33
36
  const task = options.store.activeTask();
34
37
  if (message.content.type === "permissions" || message.content.type === "model")
35
38
  return options.store.chooseOption(channel.id, message.content);
@@ -39,11 +42,58 @@ export function createRelayService(options) {
39
42
  if (answer !== undefined || message.content.type === "interaction")
40
43
  return answer;
41
44
  }
45
+ if (changingSession &&
46
+ (message.content.type === "text" ||
47
+ message.content.type === "attachments" ||
48
+ message.content.type === "session" ||
49
+ (message.content.type === "command" &&
50
+ (["new", "list", "update"].includes(message.content.name) ||
51
+ (message.content.name === "cwd" && message.content.args)))))
52
+ return "Session change in progress. Wait for confirmation, then resend your message.";
53
+ /** 新建命令和会话按钮共用切换保护,仅在接口确认后保存选择。 */
54
+ if (message.content.type === "session" ||
55
+ (message.content.type === "command" && message.content.name === "new")) {
56
+ if (task)
57
+ return "Wait for the task to finish, or use /stop first.";
58
+ const { content } = message;
59
+ const snapshot = structuredClone(channel);
60
+ controlQuery = async () => {
61
+ changingSession = true;
62
+ let session;
63
+ try {
64
+ session =
65
+ content.type === "command"
66
+ ? await options.agent.createSession({
67
+ cwd: snapshot.cwd,
68
+ name: content.args,
69
+ model: snapshot.model,
70
+ permissionMode: snapshot.permissionMode,
71
+ }, modelLoading.signal)
72
+ : await options.agent.readSession(snapshot.cwd, content.id, modelLoading.signal);
73
+ }
74
+ catch (error) {
75
+ if (!stopping)
76
+ options.store.reply(snapshot.id, error instanceof Error && error.message.startsWith("Codex ")
77
+ ? error.message
78
+ : "Cannot change sessions. Current session unchanged. Check /list before retrying.");
79
+ return;
80
+ }
81
+ finally {
82
+ changingSession = false;
83
+ }
84
+ /** 接口成功后才更新绑定;存储错误交给工作循环处理。 */
85
+ if (!stopping)
86
+ options.store.setSession(snapshot.id, snapshot.cwd, session.id, `${content.type === "command" ? "New session" : "Switched session"}: ${session.label}\nID: ${session.id}\nDirectory: ${snapshot.cwd}`);
87
+ };
88
+ return;
89
+ }
42
90
  if (message.content.type === "command") {
43
91
  switch (message.content.name) {
44
92
  case "start":
45
93
  case "help":
46
- return "Tellrun ready.\nSend text to chat with Codex. New messages add to the running task.\n/cwd <path> — Set directory; start a new session\n/new — New session, same directory\n/model — Select model and reasoning effort\n/permissions — Select permission mode\n/status — Status and update check\n/update — Ask Codex to upgrade Tellrun\n/last — Last result\n/stop — Stop task and pause\n/resume — Accept new tasks\nUse buttons for approvals. Approvals wait for your response. Answer questions with buttons or replies. Questions expire within 10 minutes.";
94
+ return "Tellrun ready.\nSend text, photos, or files to Codex (up to 20 MB per attachment). Add a caption to describe your task. New messages add to the running task.\n/cwd <path> — Set directory; start a new session\n/new [name] — Create and select a new session\n/list — Show up to 10 recent sessions; tap to switch\n/model — Select model and reasoning effort\n/permissions — Select permission mode\n/cron — Manage scheduled tasks\n/status — Status and update check\n/update — Ask Codex to upgrade Tellrun\n/last — Last result\n/stop — Stop task and pause\n/resume — Accept new tasks\nWait for the task to finish before creating or switching sessions.";
95
+ case "cron":
96
+ return options.store.handleCron(channel.id, message.content.args);
47
97
  case "model":
48
98
  if (message.content.args)
49
99
  return "Use /model to choose a model with the buttons.";
@@ -55,11 +105,11 @@ export function createRelayService(options) {
55
105
  case "status": {
56
106
  /** 查询期间保存请求时的选择,后续切换不会改写这次状态快照。 */
57
107
  const snapshot = structuredClone(channel);
58
- statusQuery = async () => {
108
+ controlQuery = async () => {
59
109
  /** 未选择时读取有效配置;读取失败仅回退到明确保存的模型与档位。 */
60
110
  const describe = async (selection) => {
61
111
  try {
62
- return await options.agent.describeModel(selection.cwd ?? process.cwd(), selection, modelLoading.signal);
112
+ return await options.agent.describeModel(selection.cwd, selection, modelLoading.signal);
63
113
  }
64
114
  catch {
65
115
  return selection.model && selection.reasoningEffort
@@ -100,7 +150,7 @@ export function createRelayService(options) {
100
150
  const upgradeHint = update?.available
101
151
  ? `\n\nSend /update to ask ${options.agent.name} to upgrade Tellrun.`
102
152
  : "";
103
- options.store.reply(snapshot.id, `Service: connected\nTellrun: ${options.updates.version}${versionSuffix}\n${options.agent.name}: ${options.agent.version}\nDirectory: ${snapshot.cwd}\nModel: ${formatModel(model)}${showTaskModel ? `\nTask model: ${formatModel(taskModel)}` : ""}\nPermissions: ${options.agent.permissionModes.find((mode) => mode.id === snapshot.permissionMode)?.label ?? snapshot.permissionMode ?? options.agent.permissionModes[0]?.label ?? "Not set"}${task && task.permissionMode !== snapshot.permissionMode ? `\nTask permissions: ${options.agent.permissionModes.find((mode) => mode.id === task.permissionMode)?.label ?? task.permissionMode ?? options.agent.permissionModes[0]?.label ?? "Not set"}` : ""}\nTask: ${task ? `#${task.id} ${statuses[task.status]}` : "idle"}${task?.interactions.length ? `\nPending: ${task.interactions.map((item) => `${item.kind === "approval" ? "Approval" : "Question"}${item.blocking ? " (waiting)" : " (task running)"}`).join(", ")}` : ""}${upgradeHint}`);
153
+ options.store.reply(snapshot.id, `Service: connected\nTellrun: ${options.updates.version}${versionSuffix}\n${options.agent.name}: ${options.agent.version}\nDirectory: ${snapshot.cwd}${task && task.cwd !== snapshot.cwd ? `\nTask directory: ${task.cwd}` : ""}\nSession: ${snapshot.sessionId ?? "Not started"}\nModel: ${formatModel(model)}${showTaskModel ? `\nTask model: ${formatModel(taskModel)}` : ""}\nPermissions: ${options.agent.permissionModes.find((mode) => mode.id === snapshot.permissionMode)?.label ?? snapshot.permissionMode ?? options.agent.permissionModes[0]?.label ?? "Not set"}${task && task.permissionMode !== snapshot.permissionMode ? `\nTask permissions: ${options.agent.permissionModes.find((mode) => mode.id === task.permissionMode)?.label ?? task.permissionMode ?? options.agent.permissionModes[0]?.label ?? "Not set"}` : ""}\nTask: ${task ? `#${task.id} ${statuses[task.status]}${task.cron ? ` · Cron #${task.cron.id}` : ""}` : "idle"}${task?.interactions.length ? `\nPending: ${task.interactions.map((item) => `${item.kind === "approval" ? "Approval" : "Question"}${item.blocking ? " (waiting)" : " (task running)"}`).join(", ")}` : ""}${upgradeHint}`);
104
154
  };
105
155
  return;
106
156
  }
@@ -131,14 +181,36 @@ export function createRelayService(options) {
131
181
  return "Cannot access directory. Check the path and permissions.";
132
182
  }
133
183
  if (cwd !== channel.cwd)
134
- options.store.setSession(channel.id, cwd);
184
+ options.store.setSession(channel.id, cwd, null);
135
185
  return `Directory: ${cwd}\n${channel.paused ? "Paused. Send /resume to continue." : "Send a task to Codex."}`;
136
186
  }
137
- case "new":
138
- if (task)
139
- return "Wait for the task to finish, or use /stop first.";
140
- options.store.setSession(channel.id, channel.cwd);
141
- return `New session.\nDirectory: ${channel.cwd}${channel.paused ? "\nPaused. Send /resume to continue." : ""}`;
187
+ case "list": {
188
+ if (message.content.args)
189
+ return "Use /list without arguments.";
190
+ const snapshot = structuredClone(channel);
191
+ controlQuery = async () => {
192
+ let sessions;
193
+ try {
194
+ sessions = await options.agent.listSessions(snapshot.cwd, modelLoading.signal);
195
+ }
196
+ catch {
197
+ if (!stopping)
198
+ options.store.reply(snapshot.id, "Cannot load sessions. Try /list again.");
199
+ return;
200
+ }
201
+ if (!stopping)
202
+ options.store.reply(snapshot.id, sessions.length
203
+ ? "Tap a session to switch."
204
+ : "No sessions yet. Create one with /new [name].", {
205
+ /** 当前会话标记与名称一起作为按钮文本。 */
206
+ sessions: sessions.map((session) => ({
207
+ ...session,
208
+ label: `${session.id === snapshot.sessionId ? "✓ " : ""}${session.label}`,
209
+ })),
210
+ });
211
+ };
212
+ return;
213
+ }
142
214
  case "stop":
143
215
  options.store.setPaused(channel.id, true);
144
216
  if (!task || task.channelId !== channel.id)
@@ -153,61 +225,88 @@ export function createRelayService(options) {
153
225
  case "last": {
154
226
  const last = options.store.lastTask(channel.id);
155
227
  return last
156
- ? `Task #${last.id} ${statuses[last.status]}\n${last.result ?? "No result yet."}`
228
+ ? `Task #${last.id}${last.cron ? ` · Cron #${last.cron.id}` : ""} ${statuses[last.status]}\n${last.result ?? "No result yet."}`
157
229
  : "No tasks yet.";
158
230
  }
159
231
  default:
160
232
  return "Unknown command. See /help.";
161
233
  }
162
234
  }
163
- if (message.content.type !== "text")
164
- return "Text messages only. See /help.";
235
+ if (message.content.type !== "text" && message.content.type !== "attachments")
236
+ return "Send text, a photo, or a file. See /help.";
165
237
  if (channel.paused)
166
238
  return "Paused. Check /last, then /resume to send a new task.";
167
- if (!message.content.text.trim())
239
+ const attachments = message.content.type === "attachments" ? message.content.attachments : [];
240
+ if (attachments.some((attachment) => attachment.size !== null && attachment.size > maxAttachmentBytes))
241
+ return "Attachment exceeds the 20 MB download limit. Send a smaller file.";
242
+ if (!message.content.text.trim() && !attachments.length)
168
243
  return "Send a task description.";
169
244
  if (task) {
170
245
  if (task.channelId !== channel.id)
171
246
  return `Task #${task.id} is running in another chat. Message not sent.`;
172
247
  if (task.status === "cancelling")
173
248
  return "Task stopping. Wait for its result.";
174
- options.store.appendTaskInput(task.id, message.content.text);
249
+ options.store.appendTaskInput(task.id, message.content.text, attachments);
175
250
  return;
176
251
  }
177
- options.store.createTask(channel, message.content.text);
252
+ options.store.createTask(channel, message.content.text, attachments);
178
253
  });
179
- /** 只有入站去重记录保存成功后才查询;重复的 /status 不会重复入队。 */
180
- if (statusQuery)
181
- statusQueries.push(statusQuery);
254
+ /** 只有入站去重记录保存成功后才执行;重复事件不会重复创建或切换会话。 */
255
+ if (controlQuery) {
256
+ const query = controlQuery();
257
+ controlQueries.push(query);
258
+ /** 错误由工作循环等待原 Promise 时传播,提前标记避免未处理拒绝。 */
259
+ void query.catch(() => { });
260
+ }
182
261
  /** 只有选择和停止状态落盘后才影响运行时;回调答复不承担提交职责。 */
183
- if (((message.content.type === "command" && message.content.name === "stop") ||
184
- (message.content.type === "interaction" && message.content.action === "stop")) &&
185
- options.store.activeTask()?.status === "cancelling")
186
- options.agent.stop();
262
+ if ((message.content.type === "command" && message.content.name === "stop") ||
263
+ (message.content.type === "interaction" && message.content.action === "stop")) {
264
+ const active = options.store.activeTask();
265
+ if (!active || active.status === "cancelling")
266
+ inputPreparation?.abort();
267
+ if (active?.status === "cancelling")
268
+ options.agent.stop();
269
+ }
187
270
  return reply;
188
271
  },
189
- /** 慢模型列表请求不占用入站或任务循环;迟到结果由菜单 ID 校验丢弃。 */
272
+ /** 模型、状态和会话请求不占用入站或任务循环,关停后丢弃迟到结果。 */
190
273
  async loadModels(source) {
191
- while (!stopping) {
192
- const query = statusQueries.shift();
193
- if (query) {
194
- await query();
195
- continue;
196
- }
197
- const menu = options.store.pendingModels(source);
198
- if (!menu) {
199
- await setTimeout(100);
200
- continue;
201
- }
202
- let models;
203
- try {
204
- models = await options.agent.listModels(menu.cwd, modelLoading.signal);
205
- }
206
- catch {
207
- /** 查询失败只提示重新打开菜单,不影响任务和已有选择。 */
274
+ try {
275
+ while (!stopping) {
276
+ const query = controlQueries.shift();
277
+ if (query) {
278
+ await query;
279
+ continue;
280
+ }
281
+ const menu = options.store.pendingModels(source);
282
+ if (!menu) {
283
+ await setTimeout(100);
284
+ continue;
285
+ }
286
+ let models;
287
+ try {
288
+ models = await options.agent.listModels(menu.cwd, modelLoading.signal);
289
+ }
290
+ catch {
291
+ /** 查询失败只提示重新打开菜单,不影响任务和已有选择。 */
292
+ }
293
+ if (!stopping)
294
+ options.store.fillModels(menu.channelId, menu.id, models);
208
295
  }
209
- if (!stopping)
210
- options.store.fillModels(menu.channelId, menu.id, models);
296
+ }
297
+ finally {
298
+ modelLoading.abort();
299
+ await Promise.allSettled(controlQueries);
300
+ }
301
+ },
302
+ /** 调度独立于执行和菜单查询;启动先跳过离线时段,再按持久化时间触发。 */
303
+ async schedule(source) {
304
+ if (stopping)
305
+ return;
306
+ options.store.recoverCrons(source);
307
+ while (!stopping) {
308
+ options.store.tickCrons(source);
309
+ await setTimeout(1_000);
211
310
  }
212
311
  },
213
312
  /** 领取任务后再次检查目录;运行结果与最终回复在同一个快照中保存。 */
@@ -229,11 +328,42 @@ export function createRelayService(options) {
229
328
  });
230
329
  continue;
231
330
  }
331
+ const preparing = new AbortController();
332
+ inputPreparation = preparing;
333
+ let attachments = [];
334
+ if (task.status === "preparing") {
335
+ try {
336
+ attachments = await options.prepareAttachments(task.attachments, preparing.signal);
337
+ if (stopping)
338
+ return;
339
+ if (preparing.signal.aborted || !options.store.markDispatching(task.id))
340
+ continue;
341
+ }
342
+ catch (error) {
343
+ if (stopping)
344
+ return;
345
+ options.store.finishTask(task.id, {
346
+ status: preparing.signal.aborted ? "cancelled" : "failed",
347
+ text: preparing.signal.aborted
348
+ ? "Stopped before starting."
349
+ : error instanceof AttachmentError
350
+ ? error.message
351
+ : "Cannot prepare attachments. Resend them to try again.",
352
+ });
353
+ continue;
354
+ }
355
+ finally {
356
+ if (inputPreparation === preparing)
357
+ inputPreparation = undefined;
358
+ }
359
+ }
360
+ inputPreparation = preparing;
232
361
  let finished = false;
233
362
  const running = options.agent
234
363
  .run({
235
364
  cwd: task.cwd,
236
365
  prompt: task.prompt,
366
+ attachments,
237
367
  sessionId: task.sessionId,
238
368
  runId: task.runId,
239
369
  permissionMode: task.permissionMode,
@@ -246,11 +376,13 @@ export function createRelayService(options) {
246
376
  options.agent.stop();
247
377
  },
248
378
  onText: (text) => options.store.setDraft(task.id, text),
379
+ onNotice: (text) => options.store.reply(task.channelId, `Task #${task.id}\n${text}`),
249
380
  onInteraction: (request) => options.store.addInteraction(task.id, request),
250
381
  onInteractionClosed: (id, reason) => options.store.closeInteraction(id, reason),
251
382
  })
252
383
  .finally(() => {
253
384
  finished = true;
385
+ preparing.abort();
254
386
  });
255
387
  /** 补充输入独立于入站处理和任务完成等待,慢 RPC 不阻塞 /status 与 /stop。 */
256
388
  const steering = (async () => {
@@ -262,11 +394,19 @@ export function createRelayService(options) {
262
394
  }
263
395
  let error;
264
396
  try {
265
- await options.agent.steer(input.text);
397
+ const attachments = await options.prepareAttachments(input.attachments, preparing.signal);
398
+ if (finished || stopping)
399
+ return;
400
+ if (!options.store.markTaskInputSending(task.id, input.index))
401
+ continue;
402
+ await options.agent.steer(input.text, attachments);
266
403
  }
267
404
  catch (cause) {
405
+ if (finished || stopping)
406
+ return;
268
407
  error =
269
- cause instanceof Error && cause.message.startsWith("Codex ")
408
+ cause instanceof AttachmentError ||
409
+ (cause instanceof Error && cause.message.startsWith("Codex "))
270
410
  ? cause.message
271
411
  : "Submission unconfirmed. Not retried; check the session before resending.";
272
412
  }
@@ -278,7 +418,7 @@ export function createRelayService(options) {
278
418
  while (!finished && !stopping) {
279
419
  const interaction = options.store.claimInteraction(task.id);
280
420
  if (interaction) {
281
- const submitted = options.agent.respond(interaction.id, interaction.answer);
421
+ const submitted = await options.agent.respond(interaction.id, interaction.answer);
282
422
  options.store.closeInteraction(interaction.id, submitted
283
423
  ? "Submitted. Waiting for results."
284
424
  : "Request closed or delivery unconfirmed. Check /status.");
@@ -300,12 +440,18 @@ export function createRelayService(options) {
300
440
  });
301
441
  throw error;
302
442
  }
443
+ finally {
444
+ preparing.abort();
445
+ if (inputPreparation === preparing)
446
+ inputPreparation = undefined;
447
+ }
303
448
  }
304
449
  },
305
450
  /** 服务退出只断开客户端;后台任务继续运行,重启后按已保存轮次接回。 */
306
451
  stop() {
307
452
  stopping = true;
308
453
  modelLoading.abort();
454
+ inputPreparation?.abort();
309
455
  options.agent.disconnect();
310
456
  },
311
457
  };
@@ -1 +1 @@
1
- {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/core/relay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/core/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { get } from "node:https";
3
+ import { AttachmentError, createAttachmentLoader, maxAttachmentBytes, } from "../storage/attachments.js";
4
+ /** Telegram 每条消息只有一个附件;photo 数组是同一图片的不同尺寸。 */
5
+ export function telegramAttachments(message) {
6
+ const photo = message.photo?.reduce((largest, candidate) => !largest || candidate.width * candidate.height > largest.width * largest.height
7
+ ? candidate
8
+ : largest, undefined);
9
+ const file = photo ?? message.document;
10
+ return file
11
+ ? [
12
+ {
13
+ id: randomUUID(),
14
+ fileId: file.file_id,
15
+ name: photo ? "photo.jpg" : (message.document?.file_name ?? "attachment"),
16
+ kind: photo ? "image" : "file",
17
+ size: file.file_size ?? null,
18
+ },
19
+ ]
20
+ : [];
21
+ }
22
+ /** 复用 Telegram 连接的代理和凭据;下载链接只存在于传输层,不写入状态或回复。 */
23
+ export function createTelegramAttachmentLoader(api, token, agent) {
24
+ return createAttachmentLoader({
25
+ async download(attachment, signal) {
26
+ const file = await api.getFile(attachment.fileId, signal);
27
+ if (file.file_size !== undefined && file.file_size > maxAttachmentBytes)
28
+ throw new AttachmentError("Attachment exceeds the 20 MB download limit.");
29
+ if (!file.file_path ||
30
+ file.file_path.split("/").some((part) => !part || part === "." || part === ".."))
31
+ throw new AttachmentError("Attachment is unavailable. Resend it to try again.");
32
+ const path = file.file_path.split("/").map(encodeURIComponent).join("/");
33
+ return new Promise((resolve, reject) => {
34
+ const request = get(`https://api.telegram.org/file/bot${token}/${path}`, { agent, signal }, (response) => {
35
+ response.on("error", reject);
36
+ if (response.statusCode !== 200) {
37
+ response.destroy();
38
+ reject(new AttachmentError("Attachment download failed. Resend it to try again."));
39
+ return;
40
+ }
41
+ if (Number(response.headers["content-length"]) > maxAttachmentBytes) {
42
+ response.destroy();
43
+ reject(new AttachmentError("Attachment exceeds the 20 MB download limit."));
44
+ return;
45
+ }
46
+ resolve(response);
47
+ });
48
+ request.on("error", reject);
49
+ });
50
+ },
51
+ });
52
+ }
53
+ //# sourceMappingURL=telegram-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-files.js","sourceRoot":"","sources":["../../src/im/telegram-files.ts"],"names":[],"mappings":"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"}