@synaplink/orqlaude 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mcp.json.template +4 -1
- package/README.md +45 -8
- package/dist/__tests__/state.test.js +1 -1
- package/dist/__tests__/state_dir.test.js +13 -0
- package/dist/__tests__/state_dir.test.js.map +1 -1
- package/dist/__tests__/userio.test.d.ts +1 -0
- package/dist/__tests__/userio.test.js +101 -0
- package/dist/__tests__/userio.test.js.map +1 -0
- package/dist/lib/state.d.ts +57 -2
- package/dist/lib/state.js +16 -4
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/state_dir.d.ts +3 -1
- package/dist/lib/state_dir.js +33 -5
- package/dist/lib/state_dir.js.map +1 -1
- package/dist/server.js +3 -1
- package/dist/server.js.map +1 -1
- package/dist/telegram/api.d.ts +20 -0
- package/dist/telegram/api.js +38 -2
- package/dist/telegram/api.js.map +1 -1
- package/dist/telegram/bot.js +6 -1
- package/dist/telegram/bot.js.map +1 -1
- package/dist/telegram/commands.d.ts +5 -1
- package/dist/telegram/commands.js +108 -7
- package/dist/telegram/commands.js.map +1 -1
- package/dist/telegram/notifier.d.ts +3 -11
- package/dist/telegram/notifier.js +103 -24
- package/dist/telegram/notifier.js.map +1 -1
- package/dist/tools/broker.js +26 -16
- package/dist/tools/broker.js.map +1 -1
- package/dist/tools/dispatch.js +13 -3
- package/dist/tools/dispatch.js.map +1 -1
- package/dist/tools/lifecycle.js +38 -3
- package/dist/tools/lifecycle.js.map +1 -1
- package/dist/tools/ping.js +11 -3
- package/dist/tools/ping.js.map +1 -1
- package/dist/tools/planning.js +93 -33
- package/dist/tools/planning.js.map +1 -1
- package/dist/tools/userio.d.ts +4 -0
- package/dist/tools/userio.js +116 -0
- package/dist/tools/userio.js.map +1 -0
- package/package.json +1 -1
package/dist/telegram/api.d.ts
CHANGED
|
@@ -24,9 +24,20 @@ export interface TelegramMessage {
|
|
|
24
24
|
date: number;
|
|
25
25
|
text?: string;
|
|
26
26
|
}
|
|
27
|
+
export interface TelegramCallbackQuery {
|
|
28
|
+
id: string;
|
|
29
|
+
from: TelegramUser;
|
|
30
|
+
data?: string;
|
|
31
|
+
message?: TelegramMessage;
|
|
32
|
+
}
|
|
27
33
|
export interface TelegramUpdate {
|
|
28
34
|
update_id: number;
|
|
29
35
|
message?: TelegramMessage;
|
|
36
|
+
callback_query?: TelegramCallbackQuery;
|
|
37
|
+
}
|
|
38
|
+
export interface InlineKeyboardButton {
|
|
39
|
+
text: string;
|
|
40
|
+
callback_data: string;
|
|
30
41
|
}
|
|
31
42
|
export declare class TelegramApi {
|
|
32
43
|
private readonly token;
|
|
@@ -36,6 +47,15 @@ export declare class TelegramApi {
|
|
|
36
47
|
getUpdates(offset: number, timeoutSec?: number): Promise<TelegramUpdate[]>;
|
|
37
48
|
sendMessage(chatId: number, text: string, opts?: {
|
|
38
49
|
parseMode?: "Markdown" | "HTML";
|
|
50
|
+
inlineKeyboard?: InlineKeyboardButton[][];
|
|
51
|
+
}): Promise<{
|
|
52
|
+
message_id: number;
|
|
53
|
+
}>;
|
|
54
|
+
/** Acknowledge a callback_query so the Telegram client stops the spinner. */
|
|
55
|
+
answerCallbackQuery(callbackQueryId: string, text?: string): Promise<void>;
|
|
56
|
+
/** Edit a previously-sent message — used to mark questions as answered. */
|
|
57
|
+
editMessageText(chatId: number, messageId: number, text: string, opts?: {
|
|
58
|
+
parseMode?: "Markdown" | "HTML";
|
|
39
59
|
}): Promise<void>;
|
|
40
60
|
/** Verify the token works by hitting getMe. Returns the bot's username. */
|
|
41
61
|
getMe(): Promise<{
|
package/dist/telegram/api.js
CHANGED
|
@@ -30,19 +30,55 @@ export class TelegramApi {
|
|
|
30
30
|
return body.result;
|
|
31
31
|
}
|
|
32
32
|
async sendMessage(chatId, text, opts = {}) {
|
|
33
|
+
const body = {
|
|
34
|
+
chat_id: chatId,
|
|
35
|
+
text,
|
|
36
|
+
parse_mode: opts.parseMode,
|
|
37
|
+
disable_web_page_preview: true,
|
|
38
|
+
};
|
|
39
|
+
if (opts.inlineKeyboard) {
|
|
40
|
+
body.reply_markup = { inline_keyboard: opts.inlineKeyboard };
|
|
41
|
+
}
|
|
33
42
|
const res = await fetch(this.endpoint("sendMessage"), {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: { "content-type": "application/json" },
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
const text = await res.text();
|
|
49
|
+
throw new Error(`sendMessage ${res.status}: ${text}`);
|
|
50
|
+
}
|
|
51
|
+
const parsed = (await res.json());
|
|
52
|
+
return { message_id: parsed.result.message_id };
|
|
53
|
+
}
|
|
54
|
+
/** Acknowledge a callback_query so the Telegram client stops the spinner. */
|
|
55
|
+
async answerCallbackQuery(callbackQueryId, text) {
|
|
56
|
+
const res = await fetch(this.endpoint("answerCallbackQuery"), {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: { "content-type": "application/json" },
|
|
59
|
+
body: JSON.stringify({ callback_query_id: callbackQueryId, text }),
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
// Non-fatal: log but don't throw. Telegram will eventually time out the
|
|
63
|
+
// spinner on the client side.
|
|
64
|
+
process.stderr.write(`[orqlaude tg] answerCallbackQuery ${res.status}: ${await res.text()}\n`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Edit a previously-sent message — used to mark questions as answered. */
|
|
68
|
+
async editMessageText(chatId, messageId, text, opts = {}) {
|
|
69
|
+
const res = await fetch(this.endpoint("editMessageText"), {
|
|
34
70
|
method: "POST",
|
|
35
71
|
headers: { "content-type": "application/json" },
|
|
36
72
|
body: JSON.stringify({
|
|
37
73
|
chat_id: chatId,
|
|
74
|
+
message_id: messageId,
|
|
38
75
|
text,
|
|
39
76
|
parse_mode: opts.parseMode,
|
|
40
77
|
disable_web_page_preview: true,
|
|
41
78
|
}),
|
|
42
79
|
});
|
|
43
80
|
if (!res.ok) {
|
|
44
|
-
|
|
45
|
-
throw new Error(`sendMessage ${res.status}: ${body}`);
|
|
81
|
+
process.stderr.write(`[orqlaude tg] editMessageText ${res.status}: ${await res.text()}\n`);
|
|
46
82
|
}
|
|
47
83
|
}
|
|
48
84
|
/** Verify the token works by hitting getMe. Returns the bot's username. */
|
package/dist/telegram/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/telegram/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,IAAI,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/telegram/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,IAAI,GAAG,0BAA0B,CAAC;AAwCxC,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QACxC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,CAAC;IAEO,QAAQ,CAAC,MAAc;QAC7B,OAAO,GAAG,IAAI,OAAO,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,UAAU,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,MAAM,YAAY,UAAU,EAAE,CAAC;QACpF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoE,CAAC;QACnG,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAc,EACd,IAAY,EACZ,OAAuF,EAAE;QAEzF,MAAM,IAAI,GAA4B;YACpC,OAAO,EAAE,MAAM;YACf,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,wBAAwB,EAAE,IAAI;SAC/B,CAAC;QACF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QAC/D,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoD,CAAC;QACrF,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAClD,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,mBAAmB,CAAC,eAAuB,EAAE,IAAa;QAC9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;SACnE,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,wEAAwE;YACxE,8BAA8B;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,eAAe,CACnB,MAAc,EACd,SAAiB,EACjB,IAAY,EACZ,OAA4C,EAAE;QAE9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,SAAS;gBACrB,IAAI;gBACJ,UAAU,EAAE,IAAI,CAAC,SAAS;gBAC1B,wBAAwB,EAAE,IAAI;aAC/B,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,KAAK;QACT,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0C,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IAC/E,CAAC;CACF"}
|
package/dist/telegram/bot.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TelegramApi } from "./api.js";
|
|
2
2
|
import { loadConfig } from "./config.js";
|
|
3
|
-
import { handleCommand } from "./commands.js";
|
|
3
|
+
import { handleCommand, handleCallbackQuery } from "./commands.js";
|
|
4
4
|
import { Notifier } from "./notifier.js";
|
|
5
5
|
/**
|
|
6
6
|
* Bot main loop.
|
|
@@ -58,6 +58,11 @@ export async function runBot(projectDir) {
|
|
|
58
58
|
process.stderr.write(`[command] ${err.message}\n`);
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
|
+
else if (u.callback_query) {
|
|
62
|
+
await handleCallbackQuery(api, u.callback_query, projectDir).catch((err) => {
|
|
63
|
+
process.stderr.write(`[callback] ${err.message}\n`);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
}
|
|
63
68
|
catch (err) {
|
package/dist/telegram/bot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/telegram/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/telegram/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TelegramApi } from "./api.js";
|
|
2
|
-
import type { TelegramMessage } from "./api.js";
|
|
2
|
+
import type { TelegramMessage, TelegramCallbackQuery } from "./api.js";
|
|
3
3
|
/**
|
|
4
4
|
* Telegram command handlers.
|
|
5
5
|
*
|
|
@@ -20,3 +20,7 @@ import type { TelegramMessage } from "./api.js";
|
|
|
20
20
|
* config schema is forward-compatible for multi-project later.
|
|
21
21
|
*/
|
|
22
22
|
export declare function handleCommand(api: TelegramApi, msg: TelegramMessage, projectDir: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Inline-keyboard tap handler. callback_data format: `orq:resp:<shortId>:<optionIdx>`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function handleCallbackQuery(api: TelegramApi, q: TelegramCallbackQuery, projectDir: string): Promise<void>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { StateStore } from "../lib/state.js";
|
|
1
|
+
import { StateStore, findUserResponseRequest } from "../lib/state.js";
|
|
2
2
|
import { snapshotSession } from "../lib/jsonl_tail.js";
|
|
3
3
|
import { loadConfig, saveConfig, isAuthorized } from "./config.js";
|
|
4
|
+
import path from "node:path";
|
|
4
5
|
/**
|
|
5
6
|
* Telegram command handlers.
|
|
6
7
|
*
|
|
@@ -73,7 +74,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
73
74
|
if (text.startsWith("/status")) {
|
|
74
75
|
const planId = text.split(/\s+/)[1];
|
|
75
76
|
if (!planId)
|
|
76
|
-
return api.sendMessage(chatId, "usage: /status <plan_id>");
|
|
77
|
+
return void await api.sendMessage(chatId, "usage: /status <plan_id>");
|
|
77
78
|
try {
|
|
78
79
|
const plan = await stateStore.read((s) => requirePlan(s.plans, planId));
|
|
79
80
|
await api.sendMessage(chatId, await renderStatus(plan, projectDir), { parseMode: "Markdown" });
|
|
@@ -86,7 +87,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
86
87
|
if (text.startsWith("/show")) {
|
|
87
88
|
const planId = text.split(/\s+/)[1];
|
|
88
89
|
if (!planId)
|
|
89
|
-
return api.sendMessage(chatId, "usage: /show <plan_id>");
|
|
90
|
+
return void await api.sendMessage(chatId, "usage: /show <plan_id>");
|
|
90
91
|
try {
|
|
91
92
|
const plan = await stateStore.read((s) => requirePlan(s.plans, planId));
|
|
92
93
|
const json = JSON.stringify(plan, null, 2);
|
|
@@ -100,7 +101,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
100
101
|
if (text.startsWith("/notes")) {
|
|
101
102
|
const planId = text.split(/\s+/)[1];
|
|
102
103
|
if (!planId)
|
|
103
|
-
return api.sendMessage(chatId, "usage: /notes <plan_id>");
|
|
104
|
+
return void await api.sendMessage(chatId, "usage: /notes <plan_id>");
|
|
104
105
|
try {
|
|
105
106
|
const plan = await stateStore.read((s) => requirePlan(s.plans, planId));
|
|
106
107
|
const recent = plan.notes.slice(-10);
|
|
@@ -128,7 +129,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
128
129
|
const [, planId, taskId, ...reasonParts] = parts;
|
|
129
130
|
const reason = reasonParts.join(" ") || "killed from Telegram";
|
|
130
131
|
if (!planId || !taskId)
|
|
131
|
-
return api.sendMessage(chatId, "usage: /kill <plan_id> <task_id> <reason>");
|
|
132
|
+
return void await api.sendMessage(chatId, "usage: /kill <plan_id> <task_id> <reason>");
|
|
132
133
|
try {
|
|
133
134
|
await stateStore.update((s) => {
|
|
134
135
|
const plan = requirePlan(s.plans, planId);
|
|
@@ -139,7 +140,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
139
140
|
task.status = "cancelled";
|
|
140
141
|
}
|
|
141
142
|
else {
|
|
142
|
-
task.stopRequested = { reason, requestedAt: Date.now() };
|
|
143
|
+
task.stopRequested = { reason, requestedAt: Date.now(), kind: "hard" };
|
|
143
144
|
plan.messages.push({
|
|
144
145
|
id: crypto.randomUUID(),
|
|
145
146
|
toSessionId: task.spawnedSessionId,
|
|
@@ -165,7 +166,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
165
166
|
const [, target, ...rest] = text.split(/\s+/);
|
|
166
167
|
const targetId = Number(target);
|
|
167
168
|
if (!Number.isFinite(targetId))
|
|
168
|
-
return api.sendMessage(chatId, "usage: /whitelist <user_id> [label]");
|
|
169
|
+
return void await api.sendMessage(chatId, "usage: /whitelist <user_id> [label]");
|
|
169
170
|
const label = rest.join(" ") || undefined;
|
|
170
171
|
if (!cfg.whitelist.some((w) => w.userId === targetId)) {
|
|
171
172
|
cfg.whitelist.push({ userId: targetId, chatId: targetId, label });
|
|
@@ -174,11 +175,111 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
174
175
|
await api.sendMessage(chatId, `✓ Whitelisted ${targetId}${label ? ` (${label})` : ""}.`);
|
|
175
176
|
return;
|
|
176
177
|
}
|
|
178
|
+
// /respond <short_id> <text> — user replies to a request_user_response
|
|
179
|
+
if (text.startsWith("/respond")) {
|
|
180
|
+
const m = text.match(/^\/respond\s+(\S+)\s+([\s\S]+)$/);
|
|
181
|
+
if (!m)
|
|
182
|
+
return void await api.sendMessage(chatId, "usage: /respond <short_id> <your answer>");
|
|
183
|
+
const [, shortId, answer] = m;
|
|
184
|
+
const store = new StateStore(path.join(projectDir, ".orqlaude"));
|
|
185
|
+
let edited = null;
|
|
186
|
+
const status = await store.update((state) => {
|
|
187
|
+
const found = findUserResponseRequest(state, shortId);
|
|
188
|
+
if (!found)
|
|
189
|
+
return "not_found";
|
|
190
|
+
const { req } = found;
|
|
191
|
+
if (req.response !== undefined)
|
|
192
|
+
return "already_answered";
|
|
193
|
+
if (req.cancelled)
|
|
194
|
+
return "cancelled";
|
|
195
|
+
if (Date.now() > req.timeoutAt)
|
|
196
|
+
return "timed_out";
|
|
197
|
+
req.response = answer;
|
|
198
|
+
req.respondedAt = Date.now();
|
|
199
|
+
if (req.telegramMessageId && req.telegramChatId) {
|
|
200
|
+
edited = { messageId: req.telegramMessageId, chatId: req.telegramChatId };
|
|
201
|
+
}
|
|
202
|
+
return "ok";
|
|
203
|
+
});
|
|
204
|
+
if (status === "ok") {
|
|
205
|
+
await api.sendMessage(chatId, `✓ Response recorded for ${shortId}.`);
|
|
206
|
+
if (edited) {
|
|
207
|
+
await api.editMessageText(edited.chatId, edited.messageId, `✓ Answered (${shortId}): ${truncateForEdit(answer, 150)}`, { parseMode: "Markdown" });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (status === "not_found") {
|
|
211
|
+
await api.sendMessage(chatId, `no request with short_id ${shortId}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
await api.sendMessage(chatId, `request ${shortId}: ${status}`);
|
|
215
|
+
}
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
177
218
|
// Default: unknown command
|
|
178
219
|
if (text.startsWith("/")) {
|
|
179
220
|
await api.sendMessage(chatId, `unknown command. /help for the list.`);
|
|
180
221
|
}
|
|
181
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Inline-keyboard tap handler. callback_data format: `orq:resp:<shortId>:<optionIdx>`.
|
|
225
|
+
*/
|
|
226
|
+
export async function handleCallbackQuery(api, q, projectDir) {
|
|
227
|
+
const cfg = await loadConfig();
|
|
228
|
+
const userId = q.from?.id;
|
|
229
|
+
if (!userId || !isAuthorized(cfg, userId)) {
|
|
230
|
+
await api.answerCallbackQuery(q.id, "Unauthorized.");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const data = q.data ?? "";
|
|
234
|
+
const m = data.match(/^orq:resp:([^:]+):(\d+)$/);
|
|
235
|
+
if (!m) {
|
|
236
|
+
await api.answerCallbackQuery(q.id, "unknown action");
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const [, shortId, idxStr] = m;
|
|
240
|
+
const idx = Number(idxStr);
|
|
241
|
+
const store = new StateStore(path.join(projectDir, ".orqlaude"));
|
|
242
|
+
let answer = null;
|
|
243
|
+
let edited = null;
|
|
244
|
+
const status = await store.update((state) => {
|
|
245
|
+
const found = findUserResponseRequest(state, shortId);
|
|
246
|
+
if (!found)
|
|
247
|
+
return "not_found";
|
|
248
|
+
const { req } = found;
|
|
249
|
+
if (req.response !== undefined)
|
|
250
|
+
return "already_answered";
|
|
251
|
+
if (req.cancelled)
|
|
252
|
+
return "cancelled";
|
|
253
|
+
if (Date.now() > req.timeoutAt)
|
|
254
|
+
return "timed_out";
|
|
255
|
+
if (!req.options || idx >= req.options.length)
|
|
256
|
+
return "bad_option";
|
|
257
|
+
answer = req.options[idx];
|
|
258
|
+
req.response = answer;
|
|
259
|
+
req.respondedAt = Date.now();
|
|
260
|
+
if (req.telegramMessageId && req.telegramChatId) {
|
|
261
|
+
edited = { messageId: req.telegramMessageId, chatId: req.telegramChatId };
|
|
262
|
+
}
|
|
263
|
+
return "ok";
|
|
264
|
+
});
|
|
265
|
+
if (status === "ok" && answer !== null) {
|
|
266
|
+
await api.answerCallbackQuery(q.id, `✓ ${answer}`);
|
|
267
|
+
if (edited) {
|
|
268
|
+
await api.editMessageText(edited.chatId, edited.messageId, `✓ Answered (${shortId}): *${escapeMdLocal(answer)}*`, { parseMode: "Markdown" });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
await api.answerCallbackQuery(q.id, status);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function escapeMdLocal(s) {
|
|
276
|
+
return s.replace(/([_*`\[])/g, "\\$1");
|
|
277
|
+
}
|
|
278
|
+
function truncateForEdit(s, n) {
|
|
279
|
+
if (s.length <= n)
|
|
280
|
+
return s;
|
|
281
|
+
return s.slice(0, n - 1) + "…";
|
|
282
|
+
}
|
|
182
283
|
function requirePlan(plans, planId) {
|
|
183
284
|
const full = plans[planId] ?? Object.values(plans).find((p) => p.id.startsWith(planId));
|
|
184
285
|
if (!full)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/telegram/commands.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/telegram/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,16 +13,8 @@ export declare class Notifier {
|
|
|
13
13
|
tick(): Promise<void>;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
* Escape
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* `_ * ` ` [`. Without escaping these in user-supplied strings, an innocuous
|
|
20
|
-
* branch name like `feature/foo_bar` or a note containing a single `*` makes
|
|
21
|
-
* sendMessage 400 → notifier swallows the error → cursor already advanced →
|
|
22
|
-
* notification permanently lost.
|
|
23
|
-
*
|
|
24
|
-
* URL text (e.g. PR links) is appended raw and not run through this escaper,
|
|
25
|
-
* because backslashing chars in URLs breaks them. Keep URL fragments out of
|
|
26
|
-
* this function's input.
|
|
16
|
+
* Escape Telegram MarkdownV1 reserved chars in user-supplied strings:
|
|
17
|
+
* `_ * ` [`. Backslashing parens / hyphens / dots etc. is unnecessary in
|
|
18
|
+
* V1 (those are syntax only in V2 / MarkdownV2).
|
|
27
19
|
*/
|
|
28
20
|
export declare function escapeMd(s: string): string;
|
|
@@ -7,7 +7,10 @@ const EMPTY_CURSOR = {
|
|
|
7
7
|
taskStatus: {},
|
|
8
8
|
planStatus: {},
|
|
9
9
|
alertedHallucinations: [],
|
|
10
|
+
notifiedUserNotificationIds: [],
|
|
11
|
+
notifiedUserRequestIds: [],
|
|
10
12
|
};
|
|
13
|
+
const URGENCY_EMOJI = { low: "💬", normal: "📢", high: "🚨" };
|
|
11
14
|
export class Notifier {
|
|
12
15
|
projectDir;
|
|
13
16
|
cfg;
|
|
@@ -58,31 +61,38 @@ export class Notifier {
|
|
|
58
61
|
cursor.taskStatus[task.id] = task.status;
|
|
59
62
|
if (plan.notes.length > 0)
|
|
60
63
|
cursor.lastNoteId = plan.notes[plan.notes.length - 1].id;
|
|
64
|
+
for (const n of plan.userNotifications)
|
|
65
|
+
cursor.notifiedUserNotificationIds.push(n.id);
|
|
66
|
+
for (const r of plan.userResponseRequests)
|
|
67
|
+
cursor.notifiedUserRequestIds.push(r.id);
|
|
61
68
|
}
|
|
62
69
|
cursor.initialized = true;
|
|
63
70
|
await this.saveCursor();
|
|
64
71
|
return;
|
|
65
72
|
}
|
|
66
|
-
|
|
73
|
+
// Plain text messages (no inline keyboard).
|
|
74
|
+
const plainMessages = [];
|
|
75
|
+
const questionPushes = [];
|
|
67
76
|
for (const plan of plans) {
|
|
77
|
+
// ---- plan/task status transitions ----
|
|
68
78
|
const prevStatus = cursor.planStatus[plan.id];
|
|
69
79
|
if (prevStatus !== plan.status) {
|
|
70
80
|
if (!prevStatus && plan.status === "draft") {
|
|
71
|
-
|
|
81
|
+
plainMessages.push(`📋 *New plan* \`${plan.id.slice(0, 8)}\` — ${plan.tasks.length} task(s)\n${escapeMd(truncate(plan.rootTask, 100))}`);
|
|
72
82
|
}
|
|
73
83
|
else if (plan.status === "approved" && prevStatus !== "approved") {
|
|
74
|
-
|
|
84
|
+
plainMessages.push(`✅ *Approved* \`${plan.id.slice(0, 8)}\` — spawning ${plan.tasks.length} agents`);
|
|
75
85
|
}
|
|
76
86
|
else if (plan.status === "collected") {
|
|
77
87
|
const total = plan.tasks.length;
|
|
78
88
|
const done = plan.tasks.filter((t) => t.status === "done").length;
|
|
79
|
-
|
|
89
|
+
plainMessages.push(`🎉 *Collected* \`${plan.id.slice(0, 8)}\` — ${done}/${total} tasks done`);
|
|
80
90
|
}
|
|
81
91
|
else if (plan.status === "cancelled_overbudget") {
|
|
82
|
-
|
|
92
|
+
plainMessages.push(`💸 *Auto-cancelled* \`${plan.id.slice(0, 8)}\` — fleet exceeded token budget`);
|
|
83
93
|
}
|
|
84
94
|
else if (plan.status === "cancelled") {
|
|
85
|
-
|
|
95
|
+
plainMessages.push(`❌ *Cancelled* \`${plan.id.slice(0, 8)}\``);
|
|
86
96
|
}
|
|
87
97
|
cursor.planStatus[plan.id] = plan.status;
|
|
88
98
|
}
|
|
@@ -91,18 +101,18 @@ export class Notifier {
|
|
|
91
101
|
if (prev !== task.status) {
|
|
92
102
|
if (task.status === "done") {
|
|
93
103
|
const prSuffix = task.prUrl ? `\n${task.prUrl}` : "";
|
|
94
|
-
|
|
104
|
+
plainMessages.push(`✓ *${escapeMd(truncate(task.title, 60))}* — done${prSuffix}`);
|
|
95
105
|
}
|
|
96
106
|
else if (task.status === "failed") {
|
|
97
|
-
|
|
107
|
+
plainMessages.push(`❌ *${escapeMd(truncate(task.title, 60))}* — failed${task.exitReason ? `\n${escapeMd(task.exitReason)}` : ""}`);
|
|
98
108
|
}
|
|
99
109
|
else if (task.status === "cancelled") {
|
|
100
|
-
|
|
110
|
+
plainMessages.push(`🛑 *${escapeMd(truncate(task.title, 60))}* — cancelled`);
|
|
101
111
|
}
|
|
102
112
|
cursor.taskStatus[task.id] = task.status;
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
|
-
//
|
|
115
|
+
// ---- agent notes ----
|
|
106
116
|
let foundLast = cursor.lastNoteId === null;
|
|
107
117
|
for (const note of plan.notes) {
|
|
108
118
|
if (!foundLast) {
|
|
@@ -112,14 +122,44 @@ export class Notifier {
|
|
|
112
122
|
}
|
|
113
123
|
const taskTitle = plan.tasks.find((t) => t.id === note.taskId)?.title ?? note.taskId.slice(0, 8);
|
|
114
124
|
const blocking = note.blocking ? " 🟡 blocking" : "";
|
|
115
|
-
|
|
125
|
+
plainMessages.push(`📝 *${escapeMd(truncate(taskTitle, 50))}*${blocking}\n${escapeMd(truncate(note.text, 300))}${note.prUrl ? `\n${note.prUrl}` : ""}`);
|
|
116
126
|
cursor.lastNoteId = note.id;
|
|
117
127
|
}
|
|
128
|
+
// ---- v0.4: user notifications ----
|
|
129
|
+
for (const n of plan.userNotifications) {
|
|
130
|
+
if (cursor.notifiedUserNotificationIds.includes(n.id))
|
|
131
|
+
continue;
|
|
132
|
+
const emoji = URGENCY_EMOJI[n.urgency] ?? URGENCY_EMOJI.normal;
|
|
133
|
+
plainMessages.push(`${emoji} ${escapeMd(n.text)}`);
|
|
134
|
+
cursor.notifiedUserNotificationIds.push(n.id);
|
|
135
|
+
}
|
|
136
|
+
// ---- v0.4: user response requests ----
|
|
137
|
+
for (const r of plan.userResponseRequests) {
|
|
138
|
+
if (cursor.notifiedUserRequestIds.includes(r.id))
|
|
139
|
+
continue;
|
|
140
|
+
if (r.cancelled || r.response !== undefined) {
|
|
141
|
+
// Already resolved before we got to it; just record so we don't re-send.
|
|
142
|
+
cursor.notifiedUserRequestIds.push(r.id);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const headline = `❓ *Question from orqlaude* \\(${r.shortId}\\)\n${escapeMd(r.prompt)}`;
|
|
146
|
+
const trailer = r.options
|
|
147
|
+
? ""
|
|
148
|
+
: `\n\nReply with: \`/respond ${r.shortId} <your answer>\``;
|
|
149
|
+
const text = headline + trailer;
|
|
150
|
+
const inlineKeyboard = r.options
|
|
151
|
+
? buildInlineKeyboard(r.shortId, r.options)
|
|
152
|
+
: undefined;
|
|
153
|
+
questionPushes.push({ req: r, text, inlineKeyboard });
|
|
154
|
+
cursor.notifiedUserRequestIds.push(r.id);
|
|
155
|
+
}
|
|
118
156
|
}
|
|
119
|
-
//
|
|
157
|
+
// Persist cursor BEFORE we attempt sends — so a failed network call
|
|
158
|
+
// doesn't cause re-spam on retry.
|
|
120
159
|
await this.saveCursor();
|
|
160
|
+
// Send plain notifications to every whitelisted chat.
|
|
121
161
|
for (const entry of this.cfg.whitelist) {
|
|
122
|
-
for (const msg of
|
|
162
|
+
for (const msg of plainMessages) {
|
|
123
163
|
try {
|
|
124
164
|
await this.api.sendMessage(entry.chatId, msg, { parseMode: "Markdown" });
|
|
125
165
|
}
|
|
@@ -128,20 +168,59 @@ export class Notifier {
|
|
|
128
168
|
}
|
|
129
169
|
}
|
|
130
170
|
}
|
|
171
|
+
// Send question pushes. Persist message_id back into state so the bot
|
|
172
|
+
// can edit on response.
|
|
173
|
+
for (const qp of questionPushes) {
|
|
174
|
+
for (const entry of this.cfg.whitelist) {
|
|
175
|
+
try {
|
|
176
|
+
const { message_id } = await this.api.sendMessage(entry.chatId, qp.text, {
|
|
177
|
+
parseMode: "Markdown",
|
|
178
|
+
inlineKeyboard: qp.inlineKeyboard,
|
|
179
|
+
});
|
|
180
|
+
// Save message_id + chat_id of FIRST whitelisted recipient so the
|
|
181
|
+
// bot can edit the question into a "✓ answered" form on response.
|
|
182
|
+
if (qp.req.telegramMessageId === undefined) {
|
|
183
|
+
await store.update((state) => {
|
|
184
|
+
for (const plan of Object.values(state.plans)) {
|
|
185
|
+
const r = plan.userResponseRequests.find((x) => x.id === qp.req.id);
|
|
186
|
+
if (r) {
|
|
187
|
+
r.telegramMessageId = message_id;
|
|
188
|
+
r.telegramChatId = entry.chatId;
|
|
189
|
+
r.delivered = true;
|
|
190
|
+
r.deliveredAt = Date.now();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
process.stderr.write(`[orqlaude tg notifier] question send to ${entry.chatId} failed: ${err.message}\n`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function buildInlineKeyboard(shortId, options) {
|
|
204
|
+
// Two columns max; one row per pair. callback_data format:
|
|
205
|
+
// orq:resp:<shortId>:<optionIdx>
|
|
206
|
+
// Telegram's callback_data is capped at 64 bytes; shortId (8) + prefix (~10)
|
|
207
|
+
// + index (1-2) is well under.
|
|
208
|
+
const rows = [];
|
|
209
|
+
for (let i = 0; i < options.length; i += 2) {
|
|
210
|
+
const row = [
|
|
211
|
+
{ text: options[i], callback_data: `orq:resp:${shortId}:${i}` },
|
|
212
|
+
];
|
|
213
|
+
if (i + 1 < options.length) {
|
|
214
|
+
row.push({ text: options[i + 1], callback_data: `orq:resp:${shortId}:${i + 1}` });
|
|
215
|
+
}
|
|
216
|
+
rows.push(row);
|
|
131
217
|
}
|
|
218
|
+
return rows;
|
|
132
219
|
}
|
|
133
220
|
/**
|
|
134
|
-
* Escape
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* `_ * ` ` [`. Without escaping these in user-supplied strings, an innocuous
|
|
138
|
-
* branch name like `feature/foo_bar` or a note containing a single `*` makes
|
|
139
|
-
* sendMessage 400 → notifier swallows the error → cursor already advanced →
|
|
140
|
-
* notification permanently lost.
|
|
141
|
-
*
|
|
142
|
-
* URL text (e.g. PR links) is appended raw and not run through this escaper,
|
|
143
|
-
* because backslashing chars in URLs breaks them. Keep URL fragments out of
|
|
144
|
-
* this function's input.
|
|
221
|
+
* Escape Telegram MarkdownV1 reserved chars in user-supplied strings:
|
|
222
|
+
* `_ * ` [`. Backslashing parens / hyphens / dots etc. is unnecessary in
|
|
223
|
+
* V1 (those are syntax only in V2 / MarkdownV2).
|
|
145
224
|
*/
|
|
146
225
|
export function escapeMd(s) {
|
|
147
226
|
return s.replace(/([_*`\[])/g, "\\$1");
|