@synaplink/orqlaude 0.5.2 → 0.5.6
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 +25 -6
- package/dist/__tests__/desktop_config.test.d.ts +1 -0
- package/dist/__tests__/desktop_config.test.js +110 -0
- package/dist/__tests__/desktop_config.test.js.map +1 -0
- package/dist/__tests__/paths.test.d.ts +1 -0
- package/dist/__tests__/paths.test.js +55 -0
- package/dist/__tests__/paths.test.js.map +1 -0
- package/dist/__tests__/v05.test.js +6 -2
- package/dist/__tests__/v05.test.js.map +1 -1
- package/dist/__tests__/v053.test.d.ts +1 -0
- package/dist/__tests__/v053.test.js +89 -0
- package/dist/__tests__/v053.test.js.map +1 -0
- package/dist/cli.js +118 -0
- package/dist/cli.js.map +1 -1
- package/dist/lib/desktop_config.d.ts +66 -0
- package/dist/lib/desktop_config.js +126 -0
- package/dist/lib/desktop_config.js.map +1 -0
- package/dist/lib/spawn_cli.d.ts +79 -0
- package/dist/lib/spawn_cli.js +211 -0
- package/dist/lib/spawn_cli.js.map +1 -0
- package/dist/lib/state.d.ts +10 -6
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/state_dir.d.ts +15 -0
- package/dist/lib/state_dir.js +56 -1
- package/dist/lib/state_dir.js.map +1 -1
- package/dist/lib/telegram_status.d.ts +24 -0
- package/dist/lib/telegram_status.js +87 -0
- package/dist/lib/telegram_status.js.map +1 -0
- package/dist/server.js +1 -1
- package/dist/telegram/api.d.ts +0 -20
- package/dist/telegram/api.js +0 -32
- package/dist/telegram/api.js.map +1 -1
- package/dist/telegram/bot.js +56 -6
- package/dist/telegram/bot.js.map +1 -1
- package/dist/telegram/notifier.js +10 -98
- package/dist/telegram/notifier.js.map +1 -1
- package/dist/tools/broker.js +47 -1
- package/dist/tools/broker.js.map +1 -1
- package/dist/tools/dispatch.js +74 -20
- package/dist/tools/dispatch.js.map +1 -1
- package/dist/tools/ping.js +16 -2
- package/dist/tools/ping.js.map +1 -1
- package/dist/tools/userio.js +40 -9
- package/dist/tools/userio.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/state_dir.d.ts
CHANGED
|
@@ -12,3 +12,18 @@ export declare function resolveStateDir(): StateDirResolution;
|
|
|
12
12
|
* multiple times.
|
|
13
13
|
*/
|
|
14
14
|
export declare function resolveAndEnsureStateDir(): Promise<StateDirResolution>;
|
|
15
|
+
/**
|
|
16
|
+
* Compare two filesystem paths for equivalence, accounting for:
|
|
17
|
+
* • symlinks (resolved via realpath when the path exists)
|
|
18
|
+
* • case-insensitive filesystems on macOS / Windows (HFS+/APFS/NTFS default)
|
|
19
|
+
* • redundant `./` and `../` segments (path.normalize)
|
|
20
|
+
*
|
|
21
|
+
* Returns true if both paths point at the same on-disk location, even when
|
|
22
|
+
* neither directory has been created yet.
|
|
23
|
+
*
|
|
24
|
+
* v0.5.6: used by `orql tg start`'s state-dir mismatch check. The previous
|
|
25
|
+
* raw string comparison yelled at users whose PWD differed from cwd only
|
|
26
|
+
* in case (e.g. typing `cd /users/.../documents/crm` against a directory
|
|
27
|
+
* stored on disk as `Documents/crm`).
|
|
28
|
+
*/
|
|
29
|
+
export declare function pathsEquivalent(a: string, b: string): boolean;
|
package/dist/lib/state_dir.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { promises as fs, statSync, readFileSync, accessSync, constants } from "node:fs";
|
|
1
|
+
import { promises as fs, statSync, readFileSync, accessSync, realpathSync, existsSync, constants } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import crypto from "node:crypto";
|
|
@@ -141,4 +141,59 @@ export async function resolveAndEnsureStateDir() {
|
|
|
141
141
|
}
|
|
142
142
|
return r;
|
|
143
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Compare two filesystem paths for equivalence, accounting for:
|
|
146
|
+
* • symlinks (resolved via realpath when the path exists)
|
|
147
|
+
* • case-insensitive filesystems on macOS / Windows (HFS+/APFS/NTFS default)
|
|
148
|
+
* • redundant `./` and `../` segments (path.normalize)
|
|
149
|
+
*
|
|
150
|
+
* Returns true if both paths point at the same on-disk location, even when
|
|
151
|
+
* neither directory has been created yet.
|
|
152
|
+
*
|
|
153
|
+
* v0.5.6: used by `orql tg start`'s state-dir mismatch check. The previous
|
|
154
|
+
* raw string comparison yelled at users whose PWD differed from cwd only
|
|
155
|
+
* in case (e.g. typing `cd /users/.../documents/crm` against a directory
|
|
156
|
+
* stored on disk as `Documents/crm`).
|
|
157
|
+
*/
|
|
158
|
+
export function pathsEquivalent(a, b) {
|
|
159
|
+
const normA = path.resolve(a);
|
|
160
|
+
const normB = path.resolve(b);
|
|
161
|
+
// Fast path: identical after normalization.
|
|
162
|
+
if (normA === normB)
|
|
163
|
+
return true;
|
|
164
|
+
// Try realpath if both (or their nearest existing ancestors) resolve to
|
|
165
|
+
// the same canonical location.
|
|
166
|
+
const realA = safeRealpathOfExistingPrefix(normA);
|
|
167
|
+
const realB = safeRealpathOfExistingPrefix(normB);
|
|
168
|
+
if (realA && realB && realA === realB)
|
|
169
|
+
return true;
|
|
170
|
+
// Case-insensitive fallback on platforms where the filesystem usually is.
|
|
171
|
+
if (process.platform === "darwin" || process.platform === "win32") {
|
|
172
|
+
return normA.toLowerCase() === normB.toLowerCase();
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Walk up from `p` until we find an existing ancestor; realpath that, then
|
|
178
|
+
* re-attach the trailing unresolved segments. Lets us compare paths whose
|
|
179
|
+
* leaves don't yet exist on disk (e.g. a not-yet-created state dir).
|
|
180
|
+
*/
|
|
181
|
+
function safeRealpathOfExistingPrefix(p) {
|
|
182
|
+
let cur = p;
|
|
183
|
+
const tail = [];
|
|
184
|
+
while (cur && cur !== path.dirname(cur)) {
|
|
185
|
+
if (existsSync(cur)) {
|
|
186
|
+
try {
|
|
187
|
+
const real = realpathSync(cur);
|
|
188
|
+
return tail.length > 0 ? path.join(real, ...tail.reverse()) : real;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
tail.push(path.basename(cur));
|
|
195
|
+
cur = path.dirname(cur);
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
144
199
|
//# sourceMappingURL=state_dir.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state_dir.js","sourceRoot":"","sources":["../../src/lib/state_dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"state_dir.js","sourceRoot":"","sources":["../../src/lib/state_dir.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick "is Telegram alive" probe for inclusion in ping / notify_user /
|
|
3
|
+
* request_user_response responses.
|
|
4
|
+
*
|
|
5
|
+
* Three signals, oldest to newest:
|
|
6
|
+
* 1. config file at ~/.orqlaude/telegram.json exists + parses + has a
|
|
7
|
+
* bot token + has at least one whitelist entry → "configured"
|
|
8
|
+
* 2. notifier cursor at <project>/.orqlaude/telegram-cursor.json exists
|
|
9
|
+
* and has initialized=true → "started"
|
|
10
|
+
* 3. notifier cursor's last-write mtime is fresh (< 30s ago) → "active"
|
|
11
|
+
*
|
|
12
|
+
* We don't try to confirm Telegram's API is reachable — that'd require an
|
|
13
|
+
* extra HTTP call per ping. The three-step check covers the realistic
|
|
14
|
+
* failure modes (token missing, bot never started, bot crashed).
|
|
15
|
+
*/
|
|
16
|
+
export type TgStatus = "unconfigured" | "configured" | "started" | "active" | "stale";
|
|
17
|
+
export interface TgStatusInfo {
|
|
18
|
+
status: TgStatus;
|
|
19
|
+
hasToken: boolean;
|
|
20
|
+
whitelistSize: number;
|
|
21
|
+
notifierLastTickMsAgo: number | null;
|
|
22
|
+
notes: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare function probeTelegramStatus(stateDir: string): Promise<TgStatusInfo>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { promises as fs, existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
const CONFIG_PATH = path.join(os.homedir(), ".orqlaude", "telegram.json");
|
|
5
|
+
export async function probeTelegramStatus(stateDir) {
|
|
6
|
+
const notes = [];
|
|
7
|
+
// 1. Config.
|
|
8
|
+
let hasToken = false;
|
|
9
|
+
let whitelistSize = 0;
|
|
10
|
+
if (!existsSync(CONFIG_PATH)) {
|
|
11
|
+
return {
|
|
12
|
+
status: "unconfigured",
|
|
13
|
+
hasToken: false,
|
|
14
|
+
whitelistSize: 0,
|
|
15
|
+
notifierLastTickMsAgo: null,
|
|
16
|
+
notes: [`No Telegram config at ${CONFIG_PATH}. Run \`orql tg setup\` first.`],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const raw = await fs.readFile(CONFIG_PATH, "utf8");
|
|
21
|
+
const cfg = JSON.parse(raw);
|
|
22
|
+
hasToken = Boolean(cfg.botToken && cfg.botToken.length > 10);
|
|
23
|
+
whitelistSize = Array.isArray(cfg.whitelist) ? cfg.whitelist.length : 0;
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return {
|
|
27
|
+
status: "unconfigured",
|
|
28
|
+
hasToken: false,
|
|
29
|
+
whitelistSize: 0,
|
|
30
|
+
notifierLastTickMsAgo: null,
|
|
31
|
+
notes: [`Telegram config exists but couldn't be parsed: ${err.message}`],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (!hasToken) {
|
|
35
|
+
return { status: "unconfigured", hasToken: false, whitelistSize, notifierLastTickMsAgo: null, notes: ["Token missing in config; run `orql tg setup`."] };
|
|
36
|
+
}
|
|
37
|
+
if (whitelistSize === 0) {
|
|
38
|
+
notes.push("Whitelist is empty — no one will receive notifications. Run `orql tg whitelist <user_id> --owner`.");
|
|
39
|
+
}
|
|
40
|
+
// 2. Notifier cursor existence (started?).
|
|
41
|
+
const cursorPath = path.join(stateDir, "telegram-cursor.json");
|
|
42
|
+
if (!existsSync(cursorPath)) {
|
|
43
|
+
return {
|
|
44
|
+
status: "configured",
|
|
45
|
+
hasToken,
|
|
46
|
+
whitelistSize,
|
|
47
|
+
notifierLastTickMsAgo: null,
|
|
48
|
+
notes: [...notes, `Config OK but the bot hasn't started yet — run \`orql tg start\` in the project root.`],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
let initialized = false;
|
|
52
|
+
let lastTickMsAgo = null;
|
|
53
|
+
try {
|
|
54
|
+
const raw = await fs.readFile(cursorPath, "utf8");
|
|
55
|
+
const cursor = JSON.parse(raw);
|
|
56
|
+
initialized = Boolean(cursor.initialized);
|
|
57
|
+
const stat = await fs.stat(cursorPath);
|
|
58
|
+
lastTickMsAgo = Date.now() - stat.mtimeMs;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
/* unreadable; treat as just-started */
|
|
62
|
+
}
|
|
63
|
+
if (!initialized) {
|
|
64
|
+
return { status: "started", hasToken, whitelistSize, notifierLastTickMsAgo: lastTickMsAgo, notes: [...notes, "Bot started but not yet initialized."] };
|
|
65
|
+
}
|
|
66
|
+
// 3. Activity check.
|
|
67
|
+
if (lastTickMsAgo !== null && lastTickMsAgo > 30_000) {
|
|
68
|
+
return {
|
|
69
|
+
status: "stale",
|
|
70
|
+
hasToken,
|
|
71
|
+
whitelistSize,
|
|
72
|
+
notifierLastTickMsAgo: lastTickMsAgo,
|
|
73
|
+
notes: [
|
|
74
|
+
...notes,
|
|
75
|
+
`Notifier cursor hasn't ticked in ${Math.round(lastTickMsAgo / 1000)}s. The bot process may have died — restart with \`orql tg start\`.`,
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
status: "active",
|
|
81
|
+
hasToken,
|
|
82
|
+
whitelistSize,
|
|
83
|
+
notifierLastTickMsAgo: lastTickMsAgo,
|
|
84
|
+
notes,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=telegram_status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram_status.js","sourceRoot":"","sources":["../../src/lib/telegram_status.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
package/dist/telegram/api.d.ts
CHANGED
|
@@ -53,26 +53,6 @@ export declare class TelegramApi {
|
|
|
53
53
|
}>;
|
|
54
54
|
/** Acknowledge a callback_query so the Telegram client stops the spinner. */
|
|
55
55
|
answerCallbackQuery(callbackQueryId: string, text?: string): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Stream a partial draft message. Telegram animates updates that share the
|
|
58
|
-
* same `draft_id`, and the draft is ephemeral (~30s) — so when the stream
|
|
59
|
-
* is complete, follow up with a real `sendMessage` to persist the final
|
|
60
|
-
* content in the chat.
|
|
61
|
-
*
|
|
62
|
-
* Returns `{ ok: true }` on success, or `{ ok: false, status, body }` so
|
|
63
|
-
* callers can fall back to `editMessageText` on older Bot API servers that
|
|
64
|
-
* don't yet support drafts.
|
|
65
|
-
*/
|
|
66
|
-
sendMessageDraft(chatId: number, draftId: number, text: string, opts?: {
|
|
67
|
-
parseMode?: "Markdown" | "HTML";
|
|
68
|
-
messageThreadId?: number;
|
|
69
|
-
}): Promise<{
|
|
70
|
-
ok: true;
|
|
71
|
-
} | {
|
|
72
|
-
ok: false;
|
|
73
|
-
status: number;
|
|
74
|
-
body: string;
|
|
75
|
-
}>;
|
|
76
56
|
/** Edit a previously-sent message — used to mark questions as answered. */
|
|
77
57
|
editMessageText(chatId: number, messageId: number, text: string, opts?: {
|
|
78
58
|
parseMode?: "Markdown" | "HTML";
|
package/dist/telegram/api.js
CHANGED
|
@@ -64,38 +64,6 @@ export class TelegramApi {
|
|
|
64
64
|
process.stderr.write(`[orqlaude tg] answerCallbackQuery ${res.status}: ${await res.text()}\n`);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
/**
|
|
68
|
-
* Stream a partial draft message. Telegram animates updates that share the
|
|
69
|
-
* same `draft_id`, and the draft is ephemeral (~30s) — so when the stream
|
|
70
|
-
* is complete, follow up with a real `sendMessage` to persist the final
|
|
71
|
-
* content in the chat.
|
|
72
|
-
*
|
|
73
|
-
* Returns `{ ok: true }` on success, or `{ ok: false, status, body }` so
|
|
74
|
-
* callers can fall back to `editMessageText` on older Bot API servers that
|
|
75
|
-
* don't yet support drafts.
|
|
76
|
-
*/
|
|
77
|
-
async sendMessageDraft(chatId, draftId, text, opts = {}) {
|
|
78
|
-
if (!Number.isInteger(draftId) || draftId === 0) {
|
|
79
|
-
throw new Error("draftId must be a non-zero integer");
|
|
80
|
-
}
|
|
81
|
-
const body = {
|
|
82
|
-
chat_id: chatId,
|
|
83
|
-
draft_id: draftId,
|
|
84
|
-
text,
|
|
85
|
-
parse_mode: opts.parseMode,
|
|
86
|
-
};
|
|
87
|
-
if (opts.messageThreadId !== undefined)
|
|
88
|
-
body.message_thread_id = opts.messageThreadId;
|
|
89
|
-
const res = await fetch(this.endpoint("sendMessageDraft"), {
|
|
90
|
-
method: "POST",
|
|
91
|
-
headers: { "content-type": "application/json" },
|
|
92
|
-
body: JSON.stringify(body),
|
|
93
|
-
});
|
|
94
|
-
if (!res.ok) {
|
|
95
|
-
return { ok: false, status: res.status, body: await res.text() };
|
|
96
|
-
}
|
|
97
|
-
return { ok: true };
|
|
98
|
-
}
|
|
99
67
|
/** Edit a previously-sent message — used to mark questions as answered. */
|
|
100
68
|
async editMessageText(chatId, messageId, text, opts = {}) {
|
|
101
69
|
const res = await fetch(this.endpoint("editMessageText"), {
|
package/dist/telegram/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/telegram/api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/telegram/api.ts"],"names":[],"mappings":"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"}
|
package/dist/telegram/bot.js
CHANGED
|
@@ -2,6 +2,11 @@ import { TelegramApi } from "./api.js";
|
|
|
2
2
|
import { loadConfig } from "./config.js";
|
|
3
3
|
import { handleCommand, handleCallbackQuery } from "./commands.js";
|
|
4
4
|
import { Notifier } from "./notifier.js";
|
|
5
|
+
import { StateStore } from "../lib/state.js";
|
|
6
|
+
import { resolveStateDir, pathsEquivalent } from "../lib/state_dir.js";
|
|
7
|
+
import { style } from "../lib/style.js";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
5
10
|
/**
|
|
6
11
|
* Bot main loop.
|
|
7
12
|
*
|
|
@@ -19,14 +24,59 @@ export async function runBot(projectDir) {
|
|
|
19
24
|
}
|
|
20
25
|
const api = new TelegramApi(cfg.botToken);
|
|
21
26
|
const me = await api.getMe();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
// v0.5.4: print a self-diagnostic block so a mismatch between the MCP
|
|
28
|
+
// server's state dir and the bot's watched dir is immediately visible.
|
|
29
|
+
// This is the single most common cause of "I called notify_user but
|
|
30
|
+
// nothing arrived" — the MCP server runs with cwd=/ → state goes to
|
|
31
|
+
// ~/.orqlaude/projects/root-..., but the bot was started from a real
|
|
32
|
+
// project directory and watches that project's .orqlaude/ instead.
|
|
33
|
+
const stateDir = path.join(projectDir, ".orqlaude");
|
|
34
|
+
const stateFile = path.join(stateDir, "orqlaude-state.json");
|
|
35
|
+
const stateExists = existsSync(stateFile);
|
|
36
|
+
let planCount = 0;
|
|
37
|
+
let pendingNotifications = 0;
|
|
38
|
+
if (stateExists) {
|
|
39
|
+
try {
|
|
40
|
+
const store = new StateStore(stateDir);
|
|
41
|
+
const stats = await store.read((s) => {
|
|
42
|
+
const plans = Object.values(s.plans);
|
|
43
|
+
const pending = plans.reduce((acc, p) => acc + p.userNotifications.filter((n) => !n.delivered).length, 0);
|
|
44
|
+
return { count: plans.length, pending };
|
|
45
|
+
});
|
|
46
|
+
planCount = stats.count;
|
|
47
|
+
pendingNotifications = stats.pending;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* malformed state; leave counts at 0 */
|
|
51
|
+
}
|
|
26
52
|
}
|
|
27
|
-
|
|
28
|
-
|
|
53
|
+
// Where would the MCP server REALLY put state if it were launched right now?
|
|
54
|
+
const wouldBeStateDir = resolveStateDir();
|
|
55
|
+
process.stdout.write(`${style.coral("◆ orqlaude tg")} — running\n`);
|
|
56
|
+
process.stdout.write(` ${style.sand("bot:")} @${me.username} (id ${me.id})\n`);
|
|
57
|
+
process.stdout.write(` ${style.sand("watching:")} ${projectDir}\n`);
|
|
58
|
+
process.stdout.write(` ${style.sand("state:")} ${stateFile} ${stateExists ? style.coral("(exists)") : style.crimson("(missing)")}\n`);
|
|
59
|
+
if (stateExists) {
|
|
60
|
+
process.stdout.write(` ${planCount} plan(s), ${pendingNotifications} pending notification(s)\n`);
|
|
61
|
+
}
|
|
62
|
+
process.stdout.write(` ${style.sand("whitelist:")} ${cfg.whitelist.length} user(s), owner=${cfg.ownerId ?? "none"}\n`);
|
|
63
|
+
// v0.5.6: only warn when the two paths really point to different
|
|
64
|
+
// directories. macOS / Windows are case-insensitive, so /Documents/crm
|
|
65
|
+
// and /documents/crm refer to the same inode and shouldn't trigger the
|
|
66
|
+
// warning. `pathsEquivalent` handles realpath + case-insensitivity.
|
|
67
|
+
if (!pathsEquivalent(wouldBeStateDir.path, stateDir)) {
|
|
68
|
+
process.stdout.write(`\n ${style.crimson("⚠ STATE-DIR MISMATCH:")} an MCP server starting from this dir would resolve to:\n` +
|
|
69
|
+
` ${wouldBeStateDir.path}\n` +
|
|
70
|
+
` (source: ${wouldBeStateDir.source})\n` +
|
|
71
|
+
` If your orqlaude MCP is launched with a different cwd (cwd=/ is common in MCP hosts), it's writing\n` +
|
|
72
|
+
` state to ITS resolved dir, not this one. Set ORQLAUDE_STATE_DIR in the MCP server's .mcp.json env block\n` +
|
|
73
|
+
` to ${stateDir} so they share state.\n\n`);
|
|
74
|
+
}
|
|
75
|
+
if (cfg.whitelist.length === 0 && !cfg.ownerId) {
|
|
76
|
+
process.stdout.write(` ${style.crimson("NO whitelist yet.")} Have your user message /start to learn your id, then run\n` +
|
|
77
|
+
` ${style.coral(`orql tg whitelist <id> --owner`)}\n`);
|
|
29
78
|
}
|
|
79
|
+
process.stdout.write(`\n${style.dim("polling for updates…")}\n`);
|
|
30
80
|
const notifier = new Notifier(projectDir, cfg, api);
|
|
31
81
|
// Notifier loop runs concurrently.
|
|
32
82
|
const stopFlag = { stopped: false };
|
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,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/telegram/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,21 +2,9 @@ import { promises as fs } from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { StateStore } from "../lib/state.js";
|
|
4
4
|
import { agnetLabel } from "../lib/agnet.js";
|
|
5
|
-
/** Minimum interval between edits
|
|
6
|
-
*
|
|
7
|
-
* sendMessageDraft is designed for streaming so we use a shorter throttle. */
|
|
5
|
+
/** Minimum interval between edits to a streaming message (Telegram caps
|
|
6
|
+
* editMessageText at ~1/sec per chat; we use 1.5s for headroom). */
|
|
8
7
|
const STREAM_EDIT_THROTTLE_MS = 1500;
|
|
9
|
-
const STREAM_DRAFT_THROTTLE_MS = 400;
|
|
10
|
-
/**
|
|
11
|
-
* Derive a stable, non-zero 48-bit integer draft_id from a stream UUID. Same
|
|
12
|
-
* stream UUID always yields the same draft_id, so a restart of the notifier
|
|
13
|
-
* can pick up an in-flight stream and continue animating it.
|
|
14
|
-
*/
|
|
15
|
-
function streamDraftId(streamId) {
|
|
16
|
-
const hex = streamId.replace(/-/g, "").slice(0, 12); // 48 bits, safely in MAX_SAFE_INTEGER
|
|
17
|
-
const n = parseInt(hex, 16);
|
|
18
|
-
return n === 0 ? 1 : n;
|
|
19
|
-
}
|
|
20
8
|
const EMPTY_CURSOR = {
|
|
21
9
|
initialized: false,
|
|
22
10
|
lastNoteId: null,
|
|
@@ -195,20 +183,12 @@ export class Notifier {
|
|
|
195
183
|
}
|
|
196
184
|
}
|
|
197
185
|
}
|
|
198
|
-
// ----
|
|
186
|
+
// ---- stream handling (edit-based, v0.5.4+) ----
|
|
199
187
|
//
|
|
200
|
-
//
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
// persist the final content.
|
|
205
|
-
// 2. "edit" (fallback): sendMessage once + editMessageText for each
|
|
206
|
-
// update. Used when sendMessageDraft is unavailable on the bot's
|
|
207
|
-
// Telegram server.
|
|
208
|
-
//
|
|
209
|
-
// We probe draft on first attempt; if it fails (404 / method not found),
|
|
210
|
-
// we switch the stream's transport to "edit" and stick with it for the
|
|
211
|
-
// rest of its lifecycle.
|
|
188
|
+
// sendMessageDraft was tried in v0.5.1 but didn't reliably exist in the
|
|
189
|
+
// standard Bot API, so we're back to the original v0.5.0 transport:
|
|
190
|
+
// one sendMessage to open the message, then editMessageText for each
|
|
191
|
+
// update, with a final edit to add the ✓ marker on stream end.
|
|
212
192
|
for (const plan of plans) {
|
|
213
193
|
for (const stream of plan.userStreams) {
|
|
214
194
|
const isNew = !cursor.notifiedUserStreamIds.includes(stream.id);
|
|
@@ -216,81 +196,13 @@ export class Notifier {
|
|
|
216
196
|
const justEnded = stream.status === "ended" && !stream.finalSent;
|
|
217
197
|
if (!isNew && !hasNewContent && !justEnded)
|
|
218
198
|
continue;
|
|
219
|
-
// Throttle
|
|
220
|
-
const throttle = stream.transport === "edit" ? STREAM_EDIT_THROTTLE_MS : STREAM_DRAFT_THROTTLE_MS;
|
|
199
|
+
// Throttle to stay under Telegram's edit rate limit (~1/sec).
|
|
221
200
|
const now = Date.now();
|
|
222
|
-
if (!isNew && !justEnded && stream.lastEditedAt && now - stream.lastEditedAt <
|
|
201
|
+
if (!isNew && !justEnded && stream.lastEditedAt && now - stream.lastEditedAt < STREAM_EDIT_THROTTLE_MS) {
|
|
223
202
|
continue;
|
|
224
203
|
}
|
|
225
|
-
const draftId = stream.draftId ?? streamDraftId(stream.id);
|
|
226
|
-
if (!stream.draftId) {
|
|
227
|
-
// First touch — record draft id.
|
|
228
|
-
await store.update((state) => {
|
|
229
|
-
for (const p of Object.values(state.plans)) {
|
|
230
|
-
const s = p.userStreams.find((x) => x.id === stream.id);
|
|
231
|
-
if (s)
|
|
232
|
-
s.draftId = draftId;
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
204
|
for (const entry of this.cfg.whitelist) {
|
|
237
|
-
|
|
238
|
-
// the first call probe.
|
|
239
|
-
const transport = stream.transport ?? "draft";
|
|
240
|
-
if (transport === "draft") {
|
|
241
|
-
// Draft path. text="" on initial empty content gives the
|
|
242
|
-
// Telegram "Thinking…" placeholder.
|
|
243
|
-
const text = formatStreamMessage(stream);
|
|
244
|
-
const result = await this.api.sendMessageDraft(entry.chatId, draftId, text, { parseMode: "Markdown" });
|
|
245
|
-
if (!result.ok) {
|
|
246
|
-
// Server doesn't support drafts (or other failure). Switch to
|
|
247
|
-
// edit fallback for the rest of this stream's life.
|
|
248
|
-
process.stderr.write(`[orqlaude tg stream] sendMessageDraft failed (${result.status}); falling back to edit. body=${result.body.slice(0, 200)}\n`);
|
|
249
|
-
await store.update((state) => {
|
|
250
|
-
for (const p of Object.values(state.plans)) {
|
|
251
|
-
const s = p.userStreams.find((x) => x.id === stream.id);
|
|
252
|
-
if (s)
|
|
253
|
-
s.transport = "edit";
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
// Now do the edit-path open in this same tick.
|
|
257
|
-
await openOrEditEditMode(this.api, store, stream, entry.chatId, justEnded);
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
// Draft sent. Record delivery state.
|
|
261
|
-
await store.update((state) => {
|
|
262
|
-
for (const p of Object.values(state.plans)) {
|
|
263
|
-
const s = p.userStreams.find((x) => x.id === stream.id);
|
|
264
|
-
if (s) {
|
|
265
|
-
s.transport = "draft";
|
|
266
|
-
s.telegramChatId = s.telegramChatId ?? entry.chatId;
|
|
267
|
-
s.lastDeliveredContent = text;
|
|
268
|
-
s.lastEditedAt = Date.now();
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
// On end: persist the final message via sendMessage and mark.
|
|
273
|
-
if (justEnded) {
|
|
274
|
-
try {
|
|
275
|
-
await this.api.sendMessage(entry.chatId, formatStreamEnded(stream), { parseMode: "Markdown" });
|
|
276
|
-
await store.update((state) => {
|
|
277
|
-
for (const p of Object.values(state.plans)) {
|
|
278
|
-
const s = p.userStreams.find((x) => x.id === stream.id);
|
|
279
|
-
if (s)
|
|
280
|
-
s.finalSent = true;
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
catch (err) {
|
|
285
|
-
process.stderr.write(`[orqlaude tg stream] final persist failed: ${err.message}\n`);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
// Edit path.
|
|
292
|
-
await openOrEditEditMode(this.api, store, stream, entry.chatId, justEnded);
|
|
293
|
-
}
|
|
205
|
+
await openOrEditEditMode(this.api, store, stream, entry.chatId, justEnded);
|
|
294
206
|
}
|
|
295
207
|
if (isNew)
|
|
296
208
|
cursor.notifiedUserStreamIds.push(stream.id);
|