codex-anywhere 0.1.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/CONTRIBUTING.md +98 -0
- package/LICENSE +73 -0
- package/README.md +163 -0
- package/dist/agentMessageStreams.d.ts +3 -0
- package/dist/agentMessageStreams.d.ts.map +1 -0
- package/dist/agentMessageStreams.js +10 -0
- package/dist/agentMessageStreams.js.map +1 -0
- package/dist/app.d.ts +17 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +18 -0
- package/dist/app.js.map +1 -0
- package/dist/approval.d.ts +12 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +42 -0
- package/dist/approval.js.map +1 -0
- package/dist/bootstrap.d.ts +22 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +31 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/bridge.d.ts +22 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +2861 -0
- package/dist/bridge.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +58 -0
- package/dist/cli.js.map +1 -0
- package/dist/codexAppServer.d.ts +13 -0
- package/dist/codexAppServer.d.ts.map +1 -0
- package/dist/codexAppServer.js +115 -0
- package/dist/codexAppServer.js.map +1 -0
- package/dist/configuration.d.ts +17 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +27 -0
- package/dist/configuration.js.map +1 -0
- package/dist/harnessState.d.ts +15 -0
- package/dist/harnessState.d.ts.map +1 -0
- package/dist/harnessState.js +55 -0
- package/dist/harnessState.js.map +1 -0
- package/dist/harnessStateCli.d.ts +3 -0
- package/dist/harnessStateCli.d.ts.map +1 -0
- package/dist/harnessStateCli.js +13 -0
- package/dist/harnessStateCli.js.map +1 -0
- package/dist/interactive.d.ts +8 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +24 -0
- package/dist/interactive.js.map +1 -0
- package/dist/localCommandInteractions.d.ts +22 -0
- package/dist/localCommandInteractions.d.ts.map +1 -0
- package/dist/localCommandInteractions.js +412 -0
- package/dist/localCommandInteractions.js.map +1 -0
- package/dist/omxCommands.d.ts +10 -0
- package/dist/omxCommands.d.ts.map +1 -0
- package/dist/omxCommands.js +146 -0
- package/dist/omxCommands.js.map +1 -0
- package/dist/onboarding.d.ts +3 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +41 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +22 -0
- package/dist/paths.js.map +1 -0
- package/dist/persistence.d.ts +6 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +61 -0
- package/dist/persistence.js.map +1 -0
- package/dist/preflight.d.ts +3 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +25 -0
- package/dist/preflight.js.map +1 -0
- package/dist/service.d.ts +58 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +322 -0
- package/dist/service.js.map +1 -0
- package/dist/sessions.d.ts +7 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +20 -0
- package/dist/sessions.js.map +1 -0
- package/dist/slashCommands.d.ts +13 -0
- package/dist/slashCommands.d.ts.map +1 -0
- package/dist/slashCommands.js +150 -0
- package/dist/slashCommands.js.map +1 -0
- package/dist/telegram.d.ts +21 -0
- package/dist/telegram.d.ts.map +1 -0
- package/dist/telegram.js +103 -0
- package/dist/telegram.js.map +1 -0
- package/dist/telegramFormatting.d.ts +18 -0
- package/dist/telegramFormatting.d.ts.map +1 -0
- package/dist/telegramFormatting.js +380 -0
- package/dist/telegramFormatting.js.map +1 -0
- package/dist/threadState.d.ts +3 -0
- package/dist/threadState.d.ts.map +1 -0
- package/dist/threadState.js +28 -0
- package/dist/threadState.js.map +1 -0
- package/dist/turnControls.d.ts +7 -0
- package/dist/turnControls.d.ts.map +1 -0
- package/dist/turnControls.js +20 -0
- package/dist/turnControls.js.map +1 -0
- package/dist/types.d.ts +121 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +62 -0
package/dist/telegram.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export class TelegramBotApi {
|
|
2
|
+
#baseUrl;
|
|
3
|
+
constructor(token) {
|
|
4
|
+
this.#baseUrl = `https://api.telegram.org/bot${token}`;
|
|
5
|
+
}
|
|
6
|
+
async getMe() {
|
|
7
|
+
return (await this.#request("getMe", {}));
|
|
8
|
+
}
|
|
9
|
+
async setMyCommands(commands) {
|
|
10
|
+
await this.#request("setMyCommands", { commands });
|
|
11
|
+
}
|
|
12
|
+
async getUpdates(offset, timeoutSeconds) {
|
|
13
|
+
const payload = {
|
|
14
|
+
timeout: timeoutSeconds,
|
|
15
|
+
allowed_updates: ["message", "callback_query"],
|
|
16
|
+
};
|
|
17
|
+
if (offset !== null) {
|
|
18
|
+
payload.offset = offset;
|
|
19
|
+
}
|
|
20
|
+
return (await this.#request("getUpdates", payload));
|
|
21
|
+
}
|
|
22
|
+
async getFile(fileId) {
|
|
23
|
+
return (await this.#request("getFile", {
|
|
24
|
+
file_id: fileId,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
async downloadFile(filePath) {
|
|
28
|
+
const response = await fetch(`${this.#baseUrl.replace("/bot", "/file/bot")}/${filePath}`);
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`Telegram file download failed: ${response.status}`);
|
|
31
|
+
}
|
|
32
|
+
return Buffer.from(await response.arrayBuffer());
|
|
33
|
+
}
|
|
34
|
+
async sendChatAction(chatId, action) {
|
|
35
|
+
await this.#request("sendChatAction", {
|
|
36
|
+
chat_id: chatId,
|
|
37
|
+
action,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async sendMessage(chatId, text, replyMarkup, parseMode) {
|
|
41
|
+
const payload = {
|
|
42
|
+
chat_id: chatId,
|
|
43
|
+
text,
|
|
44
|
+
};
|
|
45
|
+
if (replyMarkup) {
|
|
46
|
+
payload.reply_markup = replyMarkup;
|
|
47
|
+
}
|
|
48
|
+
if (parseMode) {
|
|
49
|
+
payload.parse_mode = parseMode;
|
|
50
|
+
}
|
|
51
|
+
return (await this.#request("sendMessage", payload));
|
|
52
|
+
}
|
|
53
|
+
async editMessageText(chatId, messageId, text, replyMarkup, parseMode) {
|
|
54
|
+
const payload = {
|
|
55
|
+
chat_id: chatId,
|
|
56
|
+
message_id: messageId,
|
|
57
|
+
text,
|
|
58
|
+
};
|
|
59
|
+
if (replyMarkup) {
|
|
60
|
+
payload.reply_markup = replyMarkup;
|
|
61
|
+
}
|
|
62
|
+
if (parseMode) {
|
|
63
|
+
payload.parse_mode = parseMode;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
await this.#request("editMessageText", payload);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error instanceof Error && error.message.includes("message is not modified")) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async answerCallbackQuery(callbackQueryId, text) {
|
|
76
|
+
await this.#request("answerCallbackQuery", {
|
|
77
|
+
callback_query_id: callbackQueryId,
|
|
78
|
+
text,
|
|
79
|
+
show_alert: false,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async deleteMessage(chatId, messageId) {
|
|
83
|
+
await this.#request("deleteMessage", {
|
|
84
|
+
chat_id: chatId,
|
|
85
|
+
message_id: messageId,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async #request(method, payload) {
|
|
89
|
+
const response = await fetch(`${this.#baseUrl}/${method}`, {
|
|
90
|
+
method: "POST",
|
|
91
|
+
headers: {
|
|
92
|
+
"content-type": "application/json",
|
|
93
|
+
},
|
|
94
|
+
body: JSON.stringify(payload),
|
|
95
|
+
});
|
|
96
|
+
const body = (await response.json());
|
|
97
|
+
if (!response.ok || !body.ok) {
|
|
98
|
+
throw new Error(body.description ?? `Telegram request failed for ${method}`);
|
|
99
|
+
}
|
|
100
|
+
return body.result;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=telegram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { JsonObject } from "./types.js";
|
|
2
|
+
export type TelegramParseMode = "HTML";
|
|
3
|
+
export declare function formatApprovalPromptHtml(method: string, params: JsonObject, items: Map<string, JsonObject>): string;
|
|
4
|
+
export declare function formatCommandCompletionHtml(item: JsonObject, verbose?: boolean): string;
|
|
5
|
+
export declare function formatFileChangeCompletionHtml(item: JsonObject, verbose?: boolean): string;
|
|
6
|
+
export declare function formatTurnCompletionHtml(status: string, errorMessage: string | null): string | null;
|
|
7
|
+
export declare function formatPendingInputActionHtml(kind: "queued" | "starting" | "steered" | "armed", input?: JsonObject[] | null): string;
|
|
8
|
+
export declare function renderAssistantTextHtml(text: string): string;
|
|
9
|
+
/** Telegram message text limit with safety margin (API max is 4096). */
|
|
10
|
+
export declare const TELEGRAM_TEXT_LIMIT = 3900;
|
|
11
|
+
/**
|
|
12
|
+
* Split a long text into chunks that each fit within the Telegram message
|
|
13
|
+
* limit. Tries to break at section boundaries (headings, horizontal rules,
|
|
14
|
+
* paragraph breaks, newlines) so each chunk reads naturally.
|
|
15
|
+
*/
|
|
16
|
+
export declare function splitTelegramChunks(text: string, limit?: number): string[];
|
|
17
|
+
export declare function escapeTelegramHtml(text: string): string;
|
|
18
|
+
//# sourceMappingURL=telegramFormatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegramFormatting.d.ts","sourceRoot":"","sources":["../src/telegramFormatting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAC7B,MAAM,CA8BR;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,UAAQ,GAAG,MAAM,CA0BrF;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,UAAQ,GAAG,MAAM,CAgBxF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAWnG;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,EACjD,KAAK,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,GAC1B,MAAM,CAwBR;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6B5D;AAED,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAsB,GAAG,MAAM,EAAE,CA2CvF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
export function formatApprovalPromptHtml(method, params, items) {
|
|
2
|
+
const reason = asString(params.reason) ?? "no reason provided";
|
|
3
|
+
if (method === "item/commandExecution/requestApproval") {
|
|
4
|
+
return [
|
|
5
|
+
`<b>Codex wants approval to run a command.</b>`,
|
|
6
|
+
`command: <code>${escapeTelegramHtml(asString(params.command) ?? "<unknown>")}</code>`,
|
|
7
|
+
`cwd: <code>${escapeTelegramHtml(asString(params.cwd) ?? "<unknown>")}</code>`,
|
|
8
|
+
`reason: ${escapeTelegramHtml(reason)}`,
|
|
9
|
+
].join("\n");
|
|
10
|
+
}
|
|
11
|
+
if (method === "item/fileChange/requestApproval") {
|
|
12
|
+
const itemId = asString(params.itemId);
|
|
13
|
+
const item = itemId ? items.get(itemId) : undefined;
|
|
14
|
+
const paths = collectChangePaths(item).slice(0, 5);
|
|
15
|
+
return [
|
|
16
|
+
`<b>Codex wants approval to apply file changes.</b>`,
|
|
17
|
+
paths.length > 0
|
|
18
|
+
? `paths:\n${paths.map((path) => `<code>${escapeTelegramHtml(path)}</code>`).join("\n")}`
|
|
19
|
+
: "paths: (paths unavailable)",
|
|
20
|
+
`reason: ${escapeTelegramHtml(reason)}`,
|
|
21
|
+
].join("\n");
|
|
22
|
+
}
|
|
23
|
+
const permissions = escapeTelegramHtml(JSON.stringify(params.permissions ?? {}, null, 2));
|
|
24
|
+
return [
|
|
25
|
+
`<b>Codex wants additional permissions.</b>`,
|
|
26
|
+
`reason: ${escapeTelegramHtml(reason)}`,
|
|
27
|
+
`<pre>${permissions}</pre>`,
|
|
28
|
+
].join("\n\n");
|
|
29
|
+
}
|
|
30
|
+
export function formatCommandCompletionHtml(item, verbose = false) {
|
|
31
|
+
const command = asString(item.command) ?? "<unknown>";
|
|
32
|
+
const status = asString(item.status) ?? "unknown";
|
|
33
|
+
const exitCode = item.exitCode;
|
|
34
|
+
const aggregatedOutput = asString(item.aggregatedOutput);
|
|
35
|
+
const succeeded = status === "completed" && (typeof exitCode !== "number" || exitCode === 0);
|
|
36
|
+
const summary = summarizeCommand(command);
|
|
37
|
+
if (succeeded && !verbose) {
|
|
38
|
+
const detail = summary.detail ? ` ${escapeTelegramHtml(summary.detail)}` : "";
|
|
39
|
+
return `<b>${escapeTelegramHtml(summary.title)}</b>${detail}`;
|
|
40
|
+
}
|
|
41
|
+
const parts = [
|
|
42
|
+
`<b>${escapeTelegramHtml(summary.title)}</b>`,
|
|
43
|
+
`<code>${escapeTelegramHtml(command)}</code>`,
|
|
44
|
+
`status: <code>${escapeTelegramHtml(status)}</code>`,
|
|
45
|
+
];
|
|
46
|
+
if (typeof exitCode === "number") {
|
|
47
|
+
parts.push(`exit code: <code>${exitCode}</code>`);
|
|
48
|
+
}
|
|
49
|
+
if (aggregatedOutput) {
|
|
50
|
+
parts.push("", `<pre>${escapeTelegramHtml(aggregatedOutput.slice(-1500))}</pre>`);
|
|
51
|
+
}
|
|
52
|
+
return parts.join("\n");
|
|
53
|
+
}
|
|
54
|
+
export function formatFileChangeCompletionHtml(item, verbose = false) {
|
|
55
|
+
const status = asString(item.status) ?? "unknown";
|
|
56
|
+
const paths = collectChangePaths(item).slice(0, 5);
|
|
57
|
+
const totalChanges = Array.isArray(item.changes) ? item.changes.length : paths.length;
|
|
58
|
+
const succeeded = status === "completed";
|
|
59
|
+
if (succeeded && !verbose) {
|
|
60
|
+
return `<b>${escapeTelegramHtml(summarizeFileChanges(paths, totalChanges))}</b>`;
|
|
61
|
+
}
|
|
62
|
+
return [
|
|
63
|
+
`<b>File change ${escapeTelegramHtml(status)}</b>`,
|
|
64
|
+
paths.length > 0
|
|
65
|
+
? paths.map((path) => `<code>${escapeTelegramHtml(path)}</code>`).join("\n")
|
|
66
|
+
: "No paths reported.",
|
|
67
|
+
].join("\n");
|
|
68
|
+
}
|
|
69
|
+
export function formatTurnCompletionHtml(status, errorMessage) {
|
|
70
|
+
if (status === "completed") {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
if (status === "failed") {
|
|
74
|
+
return [
|
|
75
|
+
`<b>Turn failed</b>`,
|
|
76
|
+
`error: ${escapeTelegramHtml(errorMessage ?? "unknown error")}`,
|
|
77
|
+
].join("\n");
|
|
78
|
+
}
|
|
79
|
+
return `<b>Turn ${escapeTelegramHtml(status)}</b>`;
|
|
80
|
+
}
|
|
81
|
+
export function formatPendingInputActionHtml(kind, input) {
|
|
82
|
+
if (kind === "armed") {
|
|
83
|
+
return [
|
|
84
|
+
"<b>Queue Next armed</b>",
|
|
85
|
+
"Your next message will queue for a new turn.",
|
|
86
|
+
].join("\n");
|
|
87
|
+
}
|
|
88
|
+
const summary = summarizeInput(input ?? []);
|
|
89
|
+
const title = kind === "queued"
|
|
90
|
+
? "Queued"
|
|
91
|
+
: kind === "starting"
|
|
92
|
+
? "Starting queued turn"
|
|
93
|
+
: "Steering turn";
|
|
94
|
+
const lines = [`<b>${title}</b>`];
|
|
95
|
+
if (summary.preview) {
|
|
96
|
+
lines.push(escapeTelegramHtml(summary.preview));
|
|
97
|
+
}
|
|
98
|
+
if (summary.attachments) {
|
|
99
|
+
lines.push(`+${escapeTelegramHtml(summary.attachments)}`);
|
|
100
|
+
}
|
|
101
|
+
return lines.join("\n");
|
|
102
|
+
}
|
|
103
|
+
export function renderAssistantTextHtml(text) {
|
|
104
|
+
const parts = [];
|
|
105
|
+
let cursor = 0;
|
|
106
|
+
while (cursor < text.length) {
|
|
107
|
+
if (text.startsWith("```", cursor)) {
|
|
108
|
+
const rendered = renderCodeFence(text, cursor);
|
|
109
|
+
parts.push(rendered.html);
|
|
110
|
+
cursor = rendered.nextCursor;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (text[cursor] === "`") {
|
|
114
|
+
const rendered = renderInlineCode(text, cursor);
|
|
115
|
+
parts.push(rendered.html);
|
|
116
|
+
cursor = rendered.nextCursor;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const nextFence = text.indexOf("```", cursor);
|
|
120
|
+
const nextInline = text.indexOf("`", cursor);
|
|
121
|
+
const nextMarker = [nextFence, nextInline]
|
|
122
|
+
.filter((index) => index >= 0)
|
|
123
|
+
.reduce((smallest, index) => Math.min(smallest, index), text.length);
|
|
124
|
+
parts.push(renderPlainMarkdown(text.slice(cursor, nextMarker)));
|
|
125
|
+
cursor = nextMarker;
|
|
126
|
+
}
|
|
127
|
+
return parts.join("");
|
|
128
|
+
}
|
|
129
|
+
/** Telegram message text limit with safety margin (API max is 4096). */
|
|
130
|
+
export const TELEGRAM_TEXT_LIMIT = 3900;
|
|
131
|
+
/**
|
|
132
|
+
* Split a long text into chunks that each fit within the Telegram message
|
|
133
|
+
* limit. Tries to break at section boundaries (headings, horizontal rules,
|
|
134
|
+
* paragraph breaks, newlines) so each chunk reads naturally.
|
|
135
|
+
*/
|
|
136
|
+
export function splitTelegramChunks(text, limit = TELEGRAM_TEXT_LIMIT) {
|
|
137
|
+
if (text.length <= limit)
|
|
138
|
+
return [text];
|
|
139
|
+
const chunks = [];
|
|
140
|
+
let remaining = text;
|
|
141
|
+
while (remaining.length > limit) {
|
|
142
|
+
const window = remaining.slice(0, limit);
|
|
143
|
+
let splitAt = -1;
|
|
144
|
+
// Prefer heading boundary (\n# )
|
|
145
|
+
const headingIdx = window.lastIndexOf("\n#");
|
|
146
|
+
if (headingIdx > limit * 0.2) {
|
|
147
|
+
splitAt = headingIdx;
|
|
148
|
+
}
|
|
149
|
+
// Then horizontal rule (\n---)
|
|
150
|
+
if (splitAt === -1) {
|
|
151
|
+
const hrIdx = window.lastIndexOf("\n---");
|
|
152
|
+
if (hrIdx > limit * 0.2)
|
|
153
|
+
splitAt = hrIdx;
|
|
154
|
+
}
|
|
155
|
+
// Then paragraph break (\n\n)
|
|
156
|
+
if (splitAt === -1) {
|
|
157
|
+
const paraIdx = window.lastIndexOf("\n\n");
|
|
158
|
+
if (paraIdx > limit * 0.2)
|
|
159
|
+
splitAt = paraIdx;
|
|
160
|
+
}
|
|
161
|
+
// Then any newline
|
|
162
|
+
if (splitAt === -1) {
|
|
163
|
+
const nlIdx = window.lastIndexOf("\n");
|
|
164
|
+
if (nlIdx > limit * 0.2)
|
|
165
|
+
splitAt = nlIdx;
|
|
166
|
+
}
|
|
167
|
+
// Hard break as last resort
|
|
168
|
+
if (splitAt === -1)
|
|
169
|
+
splitAt = limit;
|
|
170
|
+
chunks.push(remaining.slice(0, splitAt).trimEnd());
|
|
171
|
+
remaining = remaining.slice(splitAt).replace(/^\n+/, "");
|
|
172
|
+
}
|
|
173
|
+
if (remaining.trim())
|
|
174
|
+
chunks.push(remaining.trim());
|
|
175
|
+
return chunks;
|
|
176
|
+
}
|
|
177
|
+
export function escapeTelegramHtml(text) {
|
|
178
|
+
return text
|
|
179
|
+
.replaceAll("&", "&")
|
|
180
|
+
.replaceAll("<", "<")
|
|
181
|
+
.replaceAll(">", ">");
|
|
182
|
+
}
|
|
183
|
+
function collectChangePaths(item) {
|
|
184
|
+
const changes = Array.isArray(item?.changes) ? item.changes : [];
|
|
185
|
+
return changes
|
|
186
|
+
.map((entry) => entry && typeof entry === "object" && "path" in entry ? String(entry.path) : null)
|
|
187
|
+
.filter((entry) => Boolean(entry));
|
|
188
|
+
}
|
|
189
|
+
function asString(value) {
|
|
190
|
+
return typeof value === "string" ? value : null;
|
|
191
|
+
}
|
|
192
|
+
function summarizeInput(input) {
|
|
193
|
+
const texts = input
|
|
194
|
+
.filter((entry) => entry.type === "text")
|
|
195
|
+
.map((entry) => asString(entry.text))
|
|
196
|
+
.filter((entry) => Boolean(entry))
|
|
197
|
+
.join(" ")
|
|
198
|
+
.trim();
|
|
199
|
+
const imageCount = input.filter((entry) => entry.type === "localImage" || entry.type === "image").length;
|
|
200
|
+
const mentionCount = input.filter((entry) => entry.type === "mention").length;
|
|
201
|
+
const attachmentParts = [];
|
|
202
|
+
if (imageCount > 0) {
|
|
203
|
+
attachmentParts.push(`${imageCount} image${imageCount === 1 ? "" : "s"}`);
|
|
204
|
+
}
|
|
205
|
+
if (mentionCount > 0) {
|
|
206
|
+
attachmentParts.push(`${mentionCount} mention${mentionCount === 1 ? "" : "s"}`);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
preview: texts ? truncateText(texts, 140) : null,
|
|
210
|
+
attachments: attachmentParts.length > 0 ? attachmentParts.join(", ") : null,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function truncateText(text, maxLength) {
|
|
214
|
+
if (text.length <= maxLength) {
|
|
215
|
+
return text;
|
|
216
|
+
}
|
|
217
|
+
return `${text.slice(0, maxLength - 1)}…`;
|
|
218
|
+
}
|
|
219
|
+
function summarizeCommand(command) {
|
|
220
|
+
const normalized = command.trim();
|
|
221
|
+
if (/\brg\b/.test(normalized)) {
|
|
222
|
+
return {
|
|
223
|
+
title: "Searched codebase",
|
|
224
|
+
detail: summarizeQuotedArg(normalized) ?? "Searched repository text",
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (/\bsed\b/.test(normalized) || /\bcat\b/.test(normalized) || /\bhead\b/.test(normalized) || /\btail\b/.test(normalized)) {
|
|
228
|
+
return {
|
|
229
|
+
title: "Read file content",
|
|
230
|
+
detail: summarizePathLikeArg(normalized) ?? "Viewed file or log output",
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (/\bgit\b/.test(normalized)) {
|
|
234
|
+
return {
|
|
235
|
+
title: "Checked git state",
|
|
236
|
+
detail: summarizeGitCommand(normalized),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (/\b(test|vitest|jest|pytest|cargo test|go test)\b/.test(normalized)) {
|
|
240
|
+
return {
|
|
241
|
+
title: "Ran tests",
|
|
242
|
+
detail: "Executed test command",
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
if (/\b(tsc|typecheck|mypy|pyright)\b/.test(normalized)) {
|
|
246
|
+
return {
|
|
247
|
+
title: "Ran typecheck",
|
|
248
|
+
detail: "Checked project types",
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
if (/\b(build|compile)\b/.test(normalized)) {
|
|
252
|
+
return {
|
|
253
|
+
title: "Built project",
|
|
254
|
+
detail: "Executed build command",
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
title: "Command finished",
|
|
259
|
+
detail: summarizeQuotedArg(normalized) ?? "Executed shell command",
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function summarizeFileChanges(paths, totalChanges) {
|
|
263
|
+
if (paths.length === 0) {
|
|
264
|
+
return totalChanges === 1 ? "Updated 1 file" : `Updated ${totalChanges} files`;
|
|
265
|
+
}
|
|
266
|
+
if (paths.length === 1) {
|
|
267
|
+
return `Updated ${paths[0]}`;
|
|
268
|
+
}
|
|
269
|
+
return `Updated ${paths[0]} and ${totalChanges - 1} more file${totalChanges - 1 === 1 ? "" : "s"}`;
|
|
270
|
+
}
|
|
271
|
+
function summarizeGitCommand(command) {
|
|
272
|
+
if (command.includes("status")) {
|
|
273
|
+
return "Read working tree status";
|
|
274
|
+
}
|
|
275
|
+
if (command.includes("diff")) {
|
|
276
|
+
return "Inspected git diff";
|
|
277
|
+
}
|
|
278
|
+
if (command.includes("rev-parse")) {
|
|
279
|
+
return "Resolved repository metadata";
|
|
280
|
+
}
|
|
281
|
+
return "Executed git command";
|
|
282
|
+
}
|
|
283
|
+
function summarizeQuotedArg(command) {
|
|
284
|
+
const quoted = /["']([^"']{1,120})["']/.exec(command);
|
|
285
|
+
return quoted?.[1] ?? null;
|
|
286
|
+
}
|
|
287
|
+
function summarizePathLikeArg(command) {
|
|
288
|
+
const match = /([~/.A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)/.exec(command);
|
|
289
|
+
return match?.[1] ?? null;
|
|
290
|
+
}
|
|
291
|
+
// Render a plain-text markdown segment (not inside code fences/spans).
|
|
292
|
+
// Handles ATX headings, horizontal rules, bullet lists, and **bold** markers.
|
|
293
|
+
function renderPlainMarkdown(text) {
|
|
294
|
+
const lines = text.split("\n");
|
|
295
|
+
return lines
|
|
296
|
+
.map((line, idx) => {
|
|
297
|
+
// Horizontal rules: ---, ***, ___
|
|
298
|
+
if (/^[\s]*[-*_]{3,}\s*$/.test(line)) {
|
|
299
|
+
return "———";
|
|
300
|
+
}
|
|
301
|
+
// ATX headings: # … / ## … / ### …
|
|
302
|
+
const headingMatch = /^(#{1,3}) (.+)$/.exec(line);
|
|
303
|
+
if (headingMatch) {
|
|
304
|
+
const prefix = idx > 0 ? "\n" : "";
|
|
305
|
+
return `${prefix}<b>${renderBoldMarkdown(headingMatch[2])}</b>`;
|
|
306
|
+
}
|
|
307
|
+
// Unordered list items: - … / * …
|
|
308
|
+
const bulletMatch = /^(\s*)[*-] (.+)$/.exec(line);
|
|
309
|
+
if (bulletMatch) {
|
|
310
|
+
const indent = bulletMatch[1].length > 0 ? " " : "";
|
|
311
|
+
return `${indent}• ${renderBoldMarkdown(bulletMatch[2])}`;
|
|
312
|
+
}
|
|
313
|
+
// Ordered list items: 1. …
|
|
314
|
+
const orderedMatch = /^(\s*)(\d+)\. (.+)$/.exec(line);
|
|
315
|
+
if (orderedMatch) {
|
|
316
|
+
const indent = orderedMatch[1].length > 0 ? " " : "";
|
|
317
|
+
return `${indent}${orderedMatch[2]}. ${renderBoldMarkdown(orderedMatch[3])}`;
|
|
318
|
+
}
|
|
319
|
+
return renderBoldMarkdown(line);
|
|
320
|
+
})
|
|
321
|
+
.join("\n");
|
|
322
|
+
}
|
|
323
|
+
// Render **bold** markers within a single line of plain text.
|
|
324
|
+
function renderBoldMarkdown(text) {
|
|
325
|
+
let result = "";
|
|
326
|
+
let i = 0;
|
|
327
|
+
let plainStart = 0;
|
|
328
|
+
const flush = (end) => {
|
|
329
|
+
if (end > plainStart) {
|
|
330
|
+
result += escapeTelegramHtml(text.slice(plainStart, end));
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
while (i < text.length) {
|
|
334
|
+
if (text[i] === "*" && text[i + 1] === "*") {
|
|
335
|
+
const closeIdx = text.indexOf("**", i + 2);
|
|
336
|
+
if (closeIdx > i + 1) {
|
|
337
|
+
flush(i);
|
|
338
|
+
result += `<b>${escapeTelegramHtml(text.slice(i + 2, closeIdx))}</b>`;
|
|
339
|
+
i = closeIdx + 2;
|
|
340
|
+
plainStart = i;
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
i++;
|
|
345
|
+
}
|
|
346
|
+
flush(i);
|
|
347
|
+
return result;
|
|
348
|
+
}
|
|
349
|
+
function renderCodeFence(text, cursor) {
|
|
350
|
+
let contentStart = cursor + 3;
|
|
351
|
+
while (contentStart < text.length && text[contentStart] !== "\n" && text[contentStart] !== "\r") {
|
|
352
|
+
contentStart += 1;
|
|
353
|
+
}
|
|
354
|
+
if (contentStart < text.length) {
|
|
355
|
+
if (text[contentStart] === "\r" && text[contentStart + 1] === "\n") {
|
|
356
|
+
contentStart += 2;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
contentStart += 1;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
contentStart = cursor + 3;
|
|
364
|
+
}
|
|
365
|
+
const fenceEnd = text.indexOf("```", contentStart);
|
|
366
|
+
const end = fenceEnd >= 0 ? fenceEnd : text.length;
|
|
367
|
+
return {
|
|
368
|
+
html: `<pre>${escapeTelegramHtml(text.slice(contentStart, end))}</pre>`,
|
|
369
|
+
nextCursor: fenceEnd >= 0 ? fenceEnd + 3 : text.length,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function renderInlineCode(text, cursor) {
|
|
373
|
+
const end = text.indexOf("`", cursor + 1);
|
|
374
|
+
const close = end >= 0 ? end : text.length;
|
|
375
|
+
return {
|
|
376
|
+
html: `<code>${escapeTelegramHtml(text.slice(cursor + 1, close))}</code>`,
|
|
377
|
+
nextCursor: end >= 0 ? end + 1 : text.length,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=telegramFormatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegramFormatting.js","sourceRoot":"","sources":["../src/telegramFormatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threadState.d.ts","sourceRoot":"","sources":["../src/threadState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,GACjC,MAAM,GAAG,IAAI,CAYf"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function reconcileActiveTurnIdFromThreadRead(thread, currentActiveTurnId) {
|
|
2
|
+
const inProgressTurnId = getInProgressTurnId(thread);
|
|
3
|
+
if (inProgressTurnId) {
|
|
4
|
+
return inProgressTurnId;
|
|
5
|
+
}
|
|
6
|
+
const status = thread?.status;
|
|
7
|
+
if (status?.type === "active") {
|
|
8
|
+
return currentActiveTurnId;
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
function getInProgressTurnId(thread) {
|
|
13
|
+
const turns = Array.isArray(thread?.turns) ? thread.turns : [];
|
|
14
|
+
for (let index = turns.length - 1; index >= 0; index -= 1) {
|
|
15
|
+
const turn = turns[index];
|
|
16
|
+
if (!isJsonObject(turn)) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (turn.status === "inProgress" && typeof turn.id === "string") {
|
|
20
|
+
return turn.id;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function isJsonObject(value) {
|
|
26
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=threadState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threadState.js","sourceRoot":"","sources":["../src/threadState.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mCAAmC,CACjD,MAA8B,EAC9B,mBAAkC;IAElC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,MAAgC,CAAC;IACxD,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,MAA8B;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type TurnControlAction = "steer" | "queue" | "cancel" | "interrupt";
|
|
2
|
+
export declare function formatTurnControlCallbackData(action: TurnControlAction, turnId: string): string;
|
|
3
|
+
export declare function parseTurnControlCallbackData(data: string): {
|
|
4
|
+
action: TurnControlAction;
|
|
5
|
+
turnId: string;
|
|
6
|
+
} | null;
|
|
7
|
+
//# sourceMappingURL=turnControls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnControls.d.ts","sourceRoot":"","sources":["../src/turnControls.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE3E,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,MAAM,GACb,MAAM,CAER;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CActD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const TURN_CONTROL_PREFIX = "tc";
|
|
2
|
+
export function formatTurnControlCallbackData(action, turnId) {
|
|
3
|
+
return `${TURN_CONTROL_PREFIX}:${action}:${turnId}`;
|
|
4
|
+
}
|
|
5
|
+
export function parseTurnControlCallbackData(data) {
|
|
6
|
+
const parts = data.split(":");
|
|
7
|
+
if (parts.length !== 3 || parts[0] !== TURN_CONTROL_PREFIX) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const action = parts[1];
|
|
11
|
+
const turnId = parts[2];
|
|
12
|
+
if (!turnId || (action !== "steer" && action !== "queue" && action !== "cancel" && action !== "interrupt")) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
action,
|
|
17
|
+
turnId,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=turnControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnControls.js","sourceRoot":"","sources":["../src/turnControls.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAIjC,MAAM,UAAU,6BAA6B,CAC3C,MAAyB,EACzB,MAAc;IAEd,OAAO,GAAG,mBAAmB,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW,CAAC,EAAE,CAAC;QAC3G,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC"}
|