@prestyj/cli 4.6.3 → 4.10.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.
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +11 -10
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/mcp.js +1 -1
- package/dist/cli/shared.d.ts +12 -0
- package/dist/cli/shared.d.ts.map +1 -1
- package/dist/cli/shared.js +31 -6
- package/dist/cli/shared.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -62
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -14
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -17
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-compaction.test.js +1 -1
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +6 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -58
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -254
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/auto-update.d.ts +4 -26
- package/dist/core/auto-update.d.ts.map +1 -1
- package/dist/core/auto-update.js +12 -237
- package/dist/core/auto-update.js.map +1 -1
- package/dist/core/claude-code-version.d.ts +1 -9
- package/dist/core/claude-code-version.d.ts.map +1 -1
- package/dist/core/claude-code-version.js +2 -105
- package/dist/core/claude-code-version.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +2 -2
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/file-lock.d.ts +1 -5
- package/dist/core/file-lock.d.ts.map +1 -1
- package/dist/core/file-lock.js +2 -75
- package/dist/core/file-lock.js.map +1 -1
- package/dist/core/logger.d.ts +4 -17
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +21 -110
- package/dist/core/logger.js.map +1 -1
- package/dist/core/lsp/client.d.ts +63 -0
- package/dist/core/lsp/client.d.ts.map +1 -0
- package/dist/core/lsp/client.js +215 -0
- package/dist/core/lsp/client.js.map +1 -0
- package/dist/core/lsp/format.d.ts +12 -0
- package/dist/core/lsp/format.d.ts.map +1 -0
- package/dist/core/lsp/format.js +30 -0
- package/dist/core/lsp/format.js.map +1 -0
- package/dist/core/lsp/format.test.d.ts +2 -0
- package/dist/core/lsp/format.test.d.ts.map +1 -0
- package/dist/core/lsp/format.test.js +56 -0
- package/dist/core/lsp/format.test.js.map +1 -0
- package/dist/core/lsp/integration.test.d.ts +2 -0
- package/dist/core/lsp/integration.test.d.ts.map +1 -0
- package/dist/core/lsp/integration.test.js +60 -0
- package/dist/core/lsp/integration.test.js.map +1 -0
- package/dist/core/lsp/jsonrpc.d.ts +32 -0
- package/dist/core/lsp/jsonrpc.d.ts.map +1 -0
- package/dist/core/lsp/jsonrpc.js +141 -0
- package/dist/core/lsp/jsonrpc.js.map +1 -0
- package/dist/core/lsp/jsonrpc.test.d.ts +2 -0
- package/dist/core/lsp/jsonrpc.test.d.ts.map +1 -0
- package/dist/core/lsp/jsonrpc.test.js +127 -0
- package/dist/core/lsp/jsonrpc.test.js.map +1 -0
- package/dist/core/lsp/manager.d.ts +40 -0
- package/dist/core/lsp/manager.d.ts.map +1 -0
- package/dist/core/lsp/manager.js +135 -0
- package/dist/core/lsp/manager.js.map +1 -0
- package/dist/core/lsp/manager.test.d.ts +2 -0
- package/dist/core/lsp/manager.test.d.ts.map +1 -0
- package/dist/core/lsp/manager.test.js +119 -0
- package/dist/core/lsp/manager.test.js.map +1 -0
- package/dist/core/lsp/servers.d.ts +45 -0
- package/dist/core/lsp/servers.d.ts.map +1 -0
- package/dist/core/lsp/servers.js +247 -0
- package/dist/core/lsp/servers.js.map +1 -0
- package/dist/core/mcp/defaults.d.ts +1 -1
- package/dist/core/mcp/defaults.js +1 -1
- package/dist/core/mcp/store.d.ts +1 -1
- package/dist/core/mcp/store.test.js +1 -1
- package/dist/core/mcp/store.test.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -75
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +4 -344
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/oauth/anthropic.d.ts +1 -3
- package/dist/core/oauth/anthropic.d.ts.map +1 -1
- package/dist/core/oauth/anthropic.js +2 -96
- package/dist/core/oauth/anthropic.js.map +1 -1
- package/dist/core/oauth/gemini.d.ts +1 -3
- package/dist/core/oauth/gemini.d.ts.map +1 -1
- package/dist/core/oauth/gemini.js +2 -385
- package/dist/core/oauth/gemini.js.map +1 -1
- package/dist/core/oauth/kimi.d.ts +1 -45
- package/dist/core/oauth/kimi.d.ts.map +1 -1
- package/dist/core/oauth/kimi.js +2 -277
- package/dist/core/oauth/kimi.js.map +1 -1
- package/dist/core/oauth/openai.d.ts +1 -3
- package/dist/core/oauth/openai.d.ts.map +1 -1
- package/dist/core/oauth/openai.js +2 -187
- package/dist/core/oauth/openai.js.map +1 -1
- package/dist/core/oauth/pkce.d.ts +1 -4
- package/dist/core/oauth/pkce.d.ts.map +1 -1
- package/dist/core/oauth/pkce.js +2 -16
- package/dist/core/oauth/pkce.js.map +1 -1
- package/dist/core/oauth/types.d.ts +1 -13
- package/dist/core/oauth/types.d.ts.map +1 -1
- package/dist/core/process-manager.d.ts +10 -0
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +45 -1
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +132 -7
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +20 -0
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/session-manager.d.ts +26 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +99 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-manager.test.d.ts +2 -0
- package/dist/core/session-manager.test.d.ts.map +1 -0
- package/dist/core/session-manager.test.js +113 -0
- package/dist/core/session-manager.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +6 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/telegram.d.ts +1 -112
- package/dist/core/telegram.d.ts.map +1 -1
- package/dist/core/telegram.js +2 -251
- package/dist/core/telegram.js.map +1 -1
- package/dist/core/thinking-level.d.ts +1 -4
- package/dist/core/thinking-level.d.ts.map +1 -1
- package/dist/core/thinking-level.js +3 -58
- package/dist/core/thinking-level.js.map +1 -1
- package/dist/core/voice-transcriber.d.ts +1 -32
- package/dist/core/voice-transcriber.d.ts.map +1 -1
- package/dist/core/voice-transcriber.js +3 -112
- package/dist/core/voice-transcriber.js.map +1 -1
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +5 -2
- package/dist/interactive.js.map +1 -1
- package/dist/modes/agent-home-mode.d.ts.map +1 -1
- package/dist/modes/agent-home-mode.js +10 -38
- package/dist/modes/agent-home-mode.js.map +1 -1
- package/dist/modes/serve-mode.d.ts.map +1 -1
- package/dist/modes/serve-mode.js +11 -39
- package/dist/modes/serve-mode.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +13 -6
- package/dist/session.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +6 -3
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +15 -3
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +70 -0
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/goals.d.ts +1 -1
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +16 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/task-send.d.ts +12 -0
- package/dist/tools/task-send.d.ts.map +1 -0
- package/dist/tools/task-send.js +34 -0
- package/dist/tools/task-send.js.map +1 -0
- package/dist/tools/task-send.test.d.ts +2 -0
- package/dist/tools/task-send.test.d.ts.map +1 -0
- package/dist/tools/task-send.test.js +95 -0
- package/dist/tools/task-send.test.js.map +1 -0
- package/dist/tools/write.d.ts +3 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +13 -2
- package/dist/tools/write.js.map +1 -1
- package/dist/tools/write.test.js +33 -0
- package/dist/tools/write.test.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/App.d.ts +16 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +127 -12
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/anchor-pad-reclaim.test.d.ts +2 -0
- package/dist/ui/anchor-pad-reclaim.test.d.ts.map +1 -0
- package/dist/ui/anchor-pad-reclaim.test.js +146 -0
- package/dist/ui/anchor-pad-reclaim.test.js.map +1 -0
- package/dist/ui/app-items.d.ts +14 -0
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +13 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/app-items.test.js +17 -1
- package/dist/ui/app-items.test.js.map +1 -1
- package/dist/ui/atomic-flush-regression.test.d.ts +2 -0
- package/dist/ui/atomic-flush-regression.test.d.ts.map +1 -0
- package/dist/ui/atomic-flush-regression.test.js +218 -0
- package/dist/ui/atomic-flush-regression.test.js.map +1 -0
- package/dist/ui/components/AssistantMessage.test.js +32 -1
- package/dist/ui/components/AssistantMessage.test.js.map +1 -1
- package/dist/ui/components/Footer.d.ts.map +1 -1
- package/dist/ui/components/Footer.js +1 -0
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/components/InputArea.test.js +11 -5
- package/dist/ui/components/InputArea.test.js.map +1 -1
- package/dist/ui/components/Markdown.d.ts.map +1 -1
- package/dist/ui/components/Markdown.js +9 -1
- package/dist/ui/components/Markdown.js.map +1 -1
- package/dist/ui/footer-jump-regression.test.js +56 -9
- package/dist/ui/footer-jump-regression.test.js.map +1 -1
- package/dist/ui/frame-clip-regression.test.d.ts +2 -0
- package/dist/ui/frame-clip-regression.test.d.ts.map +1 -0
- package/dist/ui/frame-clip-regression.test.js +215 -0
- package/dist/ui/frame-clip-regression.test.js.map +1 -0
- package/dist/ui/hooks/useTranscriptHistory.d.ts +9 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.js +51 -19
- package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts +2 -0
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts.map +1 -0
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js +81 -0
- package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js.map +1 -0
- package/dist/ui/live-area-clamp.test.js +37 -0
- package/dist/ui/live-area-clamp.test.js.map +1 -1
- package/dist/ui/live-area-height.d.ts.map +1 -1
- package/dist/ui/live-area-height.js +13 -6
- package/dist/ui/live-area-height.js.map +1 -1
- package/dist/ui/live-area-height.test.js +9 -0
- package/dist/ui/live-area-height.test.js.map +1 -1
- package/dist/ui/live-item-flush.d.ts +28 -0
- package/dist/ui/live-item-flush.d.ts.map +1 -1
- package/dist/ui/live-item-flush.js +44 -0
- package/dist/ui/live-item-flush.js.map +1 -1
- package/dist/ui/live-item-flush.test.js +83 -1
- package/dist/ui/live-item-flush.test.js.map +1 -1
- package/dist/ui/login.d.ts.map +1 -1
- package/dist/ui/login.js +12 -30
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/mcp.d.ts +1 -2
- package/dist/ui/mcp.d.ts.map +1 -1
- package/dist/ui/mcp.js +8 -43
- package/dist/ui/mcp.js.map +1 -1
- package/dist/ui/pixel.d.ts.map +1 -1
- package/dist/ui/pixel.js +10 -38
- package/dist/ui/pixel.js.map +1 -1
- package/dist/ui/queued-message.test.js +7 -1
- package/dist/ui/queued-message.test.js.map +1 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +154 -5
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/sessions.d.ts.map +1 -1
- package/dist/ui/sessions.js +10 -42
- package/dist/ui/sessions.js.map +1 -1
- package/dist/ui/startup-banner-order.test.d.ts +2 -0
- package/dist/ui/startup-banner-order.test.d.ts.map +1 -0
- package/dist/ui/startup-banner-order.test.js +105 -0
- package/dist/ui/startup-banner-order.test.js.map +1 -0
- package/dist/ui/streaming-flush-bounce.test.js +41 -20
- package/dist/ui/streaming-flush-bounce.test.js.map +1 -1
- package/dist/ui/submit-boundary-gap.test.d.ts +2 -0
- package/dist/ui/submit-boundary-gap.test.d.ts.map +1 -0
- package/dist/ui/submit-boundary-gap.test.js +180 -0
- package/dist/ui/submit-boundary-gap.test.js.map +1 -0
- package/dist/ui/terminal-history.d.ts.map +1 -1
- package/dist/ui/terminal-history.js +28 -9
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/terminal-history.test.js +10 -3
- package/dist/ui/terminal-history.test.js.map +1 -1
- package/dist/ui/testing/screen-recorder.d.ts.map +1 -1
- package/dist/ui/testing/screen-recorder.js +11 -1
- package/dist/ui/testing/screen-recorder.js.map +1 -1
- package/dist/ui/tui-history-parity.test.js +4 -1
- package/dist/ui/tui-history-parity.test.js.map +1 -1
- package/dist/ui/tui-simulation.test.js +7 -1
- package/dist/ui/tui-simulation.test.js.map +1 -1
- package/dist/ui/utils/assistant-stream-split.d.ts +7 -0
- package/dist/ui/utils/assistant-stream-split.d.ts.map +1 -1
- package/dist/ui/utils/assistant-stream-split.js +22 -1
- package/dist/ui/utils/assistant-stream-split.js.map +1 -1
- package/dist/ui/utils/assistant-stream-split.test.js +14 -0
- package/dist/ui/utils/assistant-stream-split.test.js.map +1 -1
- package/dist/ui/utils/markdown-renderer.d.ts.map +1 -1
- package/dist/ui/utils/markdown-renderer.js +46 -3
- package/dist/ui/utils/markdown-renderer.js.map +1 -1
- package/dist/ui/utils/markdown-renderer.test.d.ts +2 -0
- package/dist/ui/utils/markdown-renderer.test.d.ts.map +1 -0
- package/dist/ui/utils/markdown-renderer.test.js +63 -0
- package/dist/ui/utils/markdown-renderer.test.js.map +1 -0
- package/dist/ui/utils/terminal-graphics.d.ts +28 -1
- package/dist/ui/utils/terminal-graphics.d.ts.map +1 -1
- package/dist/ui/utils/terminal-graphics.js +44 -3
- package/dist/ui/utils/terminal-graphics.js.map +1 -1
- package/dist/ui/utils/terminal-graphics.test.js +40 -1
- package/dist/ui/utils/terminal-graphics.test.js.map +1 -1
- package/dist/utils/session-title.js +1 -1
- package/dist/utils/session-title.js.map +1 -1
- package/package.json +6 -5
- package/dist/core/model-registry.test.d.ts +0 -2
- package/dist/core/model-registry.test.d.ts.map +0 -1
- package/dist/core/model-registry.test.js +0 -95
- package/dist/core/model-registry.test.js.map +0 -1
- package/dist/core/oauth/gemini.test.d.ts +0 -2
- package/dist/core/oauth/gemini.test.d.ts.map +0 -1
- package/dist/core/oauth/gemini.test.js +0 -154
- package/dist/core/oauth/gemini.test.js.map +0 -1
- package/dist/core/thinking-level.test.d.ts +0 -2
- package/dist/core/thinking-level.test.d.ts.map +0 -1
- package/dist/core/thinking-level.test.js +0 -51
- package/dist/core/thinking-level.test.js.map +0 -1
- package/dist/core/voice-transcriber.test.d.ts +0 -2
- package/dist/core/voice-transcriber.test.d.ts.map +0 -1
- package/dist/core/voice-transcriber.test.js +0 -88
- package/dist/core/voice-transcriber.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.test.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { mkdtemp, readFile, rm, utimes, readdir } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
6
|
+
import { SessionManager } from "./session-manager.js";
|
|
7
|
+
const tempDirs = [];
|
|
8
|
+
async function makeTempDir() {
|
|
9
|
+
const dir = await mkdtemp(path.join(tmpdir(), "gg-session-manager-"));
|
|
10
|
+
tempDirs.push(dir);
|
|
11
|
+
return dir;
|
|
12
|
+
}
|
|
13
|
+
afterEach(async () => {
|
|
14
|
+
await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })));
|
|
15
|
+
});
|
|
16
|
+
function entry(id) {
|
|
17
|
+
return {
|
|
18
|
+
type: "message",
|
|
19
|
+
id,
|
|
20
|
+
parentId: null,
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
message: { role: "user", content: "hi" },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
describe("SessionManager persistence failure handling", () => {
|
|
26
|
+
it("appendEntry does not throw when the write fails (e.g. disk full)", async () => {
|
|
27
|
+
const manager = new SessionManager(await makeTempDir());
|
|
28
|
+
const badPath = path.join("/nonexistent-gg-dir", "session.jsonl");
|
|
29
|
+
const errors = [];
|
|
30
|
+
manager.onPersistError = (error) => errors.push(error);
|
|
31
|
+
await expect(manager.appendEntry(badPath, entry("a"))).resolves.toBeUndefined();
|
|
32
|
+
expect(errors).toHaveLength(1);
|
|
33
|
+
expect(errors[0]?.code).toBe("ENOENT");
|
|
34
|
+
});
|
|
35
|
+
it("reports a persistence failure only once per error code", async () => {
|
|
36
|
+
const manager = new SessionManager(await makeTempDir());
|
|
37
|
+
const badPath = path.join("/nonexistent-gg-dir", "session.jsonl");
|
|
38
|
+
let calls = 0;
|
|
39
|
+
manager.onPersistError = () => {
|
|
40
|
+
calls += 1;
|
|
41
|
+
};
|
|
42
|
+
await manager.appendEntry(badPath, entry("a"));
|
|
43
|
+
await manager.appendEntry(badPath, entry("b"));
|
|
44
|
+
await manager.updateLeaf(badPath, "leaf-1");
|
|
45
|
+
expect(calls).toBe(1);
|
|
46
|
+
});
|
|
47
|
+
it("appendEntry still writes normally when the disk is healthy", async () => {
|
|
48
|
+
const sessionsDir = await makeTempDir();
|
|
49
|
+
const manager = new SessionManager(sessionsDir);
|
|
50
|
+
const created = await manager.create(sessionsDir, "anthropic", "test-model");
|
|
51
|
+
await manager.appendEntry(created.path, entry("ok"));
|
|
52
|
+
const content = await readFile(created.path, "utf-8");
|
|
53
|
+
const lines = content.trim().split("\n");
|
|
54
|
+
expect(lines).toHaveLength(2);
|
|
55
|
+
expect(JSON.parse(lines[1] ?? "")).toMatchObject({ type: "message", id: "ok" });
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("SessionManager.getMostRecent", () => {
|
|
59
|
+
it("returns the session most recently spoken in, not the newest-created", async () => {
|
|
60
|
+
const sessionsDir = await makeTempDir();
|
|
61
|
+
const manager = new SessionManager(sessionsDir);
|
|
62
|
+
const cwd = "/proj/continue";
|
|
63
|
+
// Session A is created first, then session B (newer header timestamp).
|
|
64
|
+
const sessionA = await manager.create(cwd, "anthropic", "test-model");
|
|
65
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
66
|
+
const sessionB = await manager.create(cwd, "anthropic", "test-model");
|
|
67
|
+
// We chat in B first, then send the LAST message to A.
|
|
68
|
+
await manager.appendEntry(sessionB.path, entry("b-msg"));
|
|
69
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
70
|
+
await manager.appendEntry(sessionA.path, entry("a-msg"));
|
|
71
|
+
const mostRecent = await manager.getMostRecent(cwd);
|
|
72
|
+
expect(mostRecent).toBe(sessionA.path);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("SessionManager.pruneOldSessions", () => {
|
|
76
|
+
async function makeAgedSession(manager, cwd, ageDays) {
|
|
77
|
+
const created = await manager.create(cwd, "anthropic", "test-model");
|
|
78
|
+
const past = new Date(Date.now() - ageDays * 86_400_000);
|
|
79
|
+
await utimes(created.path, past, past);
|
|
80
|
+
return created.path;
|
|
81
|
+
}
|
|
82
|
+
it("deletes sessions older than the retention window and keeps recent ones", async () => {
|
|
83
|
+
const sessionsDir = await makeTempDir();
|
|
84
|
+
const manager = new SessionManager(sessionsDir);
|
|
85
|
+
const oldPath = await makeAgedSession(manager, "/proj/a", 45);
|
|
86
|
+
const recentPath = await makeAgedSession(manager, "/proj/a", 5);
|
|
87
|
+
const result = await manager.pruneOldSessions({ maxAgeDays: 30 });
|
|
88
|
+
expect(result.deletedFiles).toBe(1);
|
|
89
|
+
expect(result.freedBytes).toBeGreaterThan(0);
|
|
90
|
+
expect(existsSync(oldPath)).toBe(false);
|
|
91
|
+
expect(existsSync(recentPath)).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
it("never deletes paths listed in keepPaths, even when old", async () => {
|
|
94
|
+
const sessionsDir = await makeTempDir();
|
|
95
|
+
const manager = new SessionManager(sessionsDir);
|
|
96
|
+
const activePath = await makeAgedSession(manager, "/proj/b", 90);
|
|
97
|
+
const result = await manager.pruneOldSessions({ maxAgeDays: 30, keepPaths: [activePath] });
|
|
98
|
+
expect(result.deletedFiles).toBe(0);
|
|
99
|
+
expect(existsSync(activePath)).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it("removes project dirs left empty and is a no-op when retention is 0", async () => {
|
|
102
|
+
const sessionsDir = await makeTempDir();
|
|
103
|
+
const manager = new SessionManager(sessionsDir);
|
|
104
|
+
const oldPath = await makeAgedSession(manager, "/proj/c", 60);
|
|
105
|
+
const disabled = await manager.pruneOldSessions({ maxAgeDays: 0 });
|
|
106
|
+
expect(disabled.deletedFiles).toBe(0);
|
|
107
|
+
expect(existsSync(oldPath)).toBe(true);
|
|
108
|
+
await manager.pruneOldSessions({ maxAgeDays: 30 });
|
|
109
|
+
expect(existsSync(oldPath)).toBe(false);
|
|
110
|
+
expect(await readdir(sessionsDir)).toHaveLength(0);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=session-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.test.js","sourceRoot":"","sources":["../../src/core/session-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,9 @@ declare const SettingsSchema: z.ZodObject<{
|
|
|
35
35
|
showTokenUsage: z.ZodDefault<z.ZodBoolean>;
|
|
36
36
|
idealReviewEnabled: z.ZodDefault<z.ZodBoolean>;
|
|
37
37
|
autoApprovePlans: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
+
lspDiagnostics: z.ZodDefault<z.ZodBoolean>;
|
|
38
39
|
enabledTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
40
|
+
sessionRetentionDays: z.ZodDefault<z.ZodNumber>;
|
|
39
41
|
}, z.core.$strip>;
|
|
40
42
|
export type Settings = z.infer<typeof SettingsSchema>;
|
|
41
43
|
export declare const DEFAULT_SETTINGS: Settings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-manager.d.ts","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"settings-manager.d.ts","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuClB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,gBAAgB,EAAE,QAY9B,CAAC;AAIF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,CAAC,EAAE,MAAM;IAIvB,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;IAazB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAI5C,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9E,MAAM,IAAI,QAAQ;CAGnB"}
|
|
@@ -36,7 +36,11 @@ const SettingsSchema = z.object({
|
|
|
36
36
|
showTokenUsage: z.boolean().default(true),
|
|
37
37
|
idealReviewEnabled: z.boolean().default(true),
|
|
38
38
|
autoApprovePlans: z.boolean().default(true),
|
|
39
|
+
/** Append LSP diagnostics to edit/write tool results. */
|
|
40
|
+
lspDiagnostics: z.boolean().default(true),
|
|
39
41
|
enabledTools: z.array(z.string()).optional(),
|
|
42
|
+
/** Delete session transcripts older than this many days at startup. 0 disables pruning. */
|
|
43
|
+
sessionRetentionDays: z.number().int().min(0).default(30),
|
|
40
44
|
});
|
|
41
45
|
export const DEFAULT_SETTINGS = {
|
|
42
46
|
autoCompact: true,
|
|
@@ -48,6 +52,8 @@ export const DEFAULT_SETTINGS = {
|
|
|
48
52
|
showTokenUsage: true,
|
|
49
53
|
idealReviewEnabled: true,
|
|
50
54
|
autoApprovePlans: true,
|
|
55
|
+
lspDiagnostics: true,
|
|
56
|
+
sessionRetentionDays: 30,
|
|
51
57
|
};
|
|
52
58
|
// ── Settings Manager ───────────────────────────────────────
|
|
53
59
|
export class SettingsManager {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,8DAA8D;AAE9D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACtC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC3D,eAAe,EAAE,CAAC;SACf,IAAI,CAAC;QACJ,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,KAAK;QACL,UAAU;QACV,SAAS;QACT,QAAQ;QACR,UAAU;QACV,YAAY;KACb,CAAC;SACD,OAAO,CAAC,WAAW,CAAC;IACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACnD,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3C,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3E,KAAK,EAAE,CAAC;SACL,IAAI,CAAC;QACJ,MAAM;QACN,MAAM;QACN,OAAO;QACP,WAAW;QACX,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;KACnB,CAAC;SACD,OAAO,CAAC,MAAM,CAAC;IAClB,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzC,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/core/telegram.d.ts
CHANGED
|
@@ -1,113 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Minimal Telegram Bot API client using raw fetch().
|
|
3
|
-
* Supports long polling, markdown messages, inline keyboards, and message splitting.
|
|
4
|
-
*/
|
|
5
|
-
export interface TelegramConfig {
|
|
6
|
-
botToken: string;
|
|
7
|
-
/** Only accept messages from this Telegram user ID. */
|
|
8
|
-
allowedUserId: number;
|
|
9
|
-
}
|
|
10
|
-
export interface TelegramUpdate {
|
|
11
|
-
update_id: number;
|
|
12
|
-
message?: {
|
|
13
|
-
message_id: number;
|
|
14
|
-
from: {
|
|
15
|
-
id: number;
|
|
16
|
-
first_name: string;
|
|
17
|
-
};
|
|
18
|
-
chat: {
|
|
19
|
-
id: number;
|
|
20
|
-
type: string;
|
|
21
|
-
title?: string;
|
|
22
|
-
};
|
|
23
|
-
text?: string;
|
|
24
|
-
voice?: {
|
|
25
|
-
file_id: string;
|
|
26
|
-
duration: number;
|
|
27
|
-
mime_type?: string;
|
|
28
|
-
file_size?: number;
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
callback_query?: {
|
|
32
|
-
id: string;
|
|
33
|
-
from: {
|
|
34
|
-
id: number;
|
|
35
|
-
};
|
|
36
|
-
message: {
|
|
37
|
-
chat: {
|
|
38
|
-
id: number;
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
data: string;
|
|
42
|
-
};
|
|
43
|
-
my_chat_member?: {
|
|
44
|
-
chat: {
|
|
45
|
-
id: number;
|
|
46
|
-
type: string;
|
|
47
|
-
title?: string;
|
|
48
|
-
};
|
|
49
|
-
from: {
|
|
50
|
-
id: number;
|
|
51
|
-
};
|
|
52
|
-
new_chat_member: {
|
|
53
|
-
status: string;
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
export interface InlineButton {
|
|
58
|
-
text: string;
|
|
59
|
-
callback_data: string;
|
|
60
|
-
}
|
|
61
|
-
/** Incoming message with chat context. */
|
|
62
|
-
export interface TelegramMessage {
|
|
63
|
-
text: string;
|
|
64
|
-
chatId: number;
|
|
65
|
-
chatType: "private" | "group" | "supergroup" | "channel";
|
|
66
|
-
chatTitle?: string;
|
|
67
|
-
}
|
|
68
|
-
/** Incoming voice note with chat context. */
|
|
69
|
-
export interface TelegramVoiceMessage {
|
|
70
|
-
fileId: string;
|
|
71
|
-
duration: number;
|
|
72
|
-
chatId: number;
|
|
73
|
-
chatType: "private" | "group" | "supergroup" | "channel";
|
|
74
|
-
chatTitle?: string;
|
|
75
|
-
}
|
|
76
|
-
export declare class TelegramBot {
|
|
77
|
-
private token;
|
|
78
|
-
private allowedUserId;
|
|
79
|
-
private offset;
|
|
80
|
-
private running;
|
|
81
|
-
private onMessage;
|
|
82
|
-
private onVoiceMessage;
|
|
83
|
-
private onCallback;
|
|
84
|
-
private onBotAdded;
|
|
85
|
-
private onBotRemoved;
|
|
86
|
-
constructor(config: TelegramConfig);
|
|
87
|
-
/** Register handler for incoming text messages. */
|
|
88
|
-
onText(handler: (msg: TelegramMessage) => void): void;
|
|
89
|
-
/** Register handler for incoming voice notes. */
|
|
90
|
-
onVoice(handler: (msg: TelegramVoiceMessage) => void): void;
|
|
91
|
-
/** Register handler for inline keyboard button presses. */
|
|
92
|
-
onCallbackQuery(handler: (data: string, chatId: number) => void): void;
|
|
93
|
-
/** Register handler for when the bot is added to a group. */
|
|
94
|
-
onAddedToGroup(handler: (chatId: number, chatTitle?: string) => void): void;
|
|
95
|
-
/** Register handler for when the bot is removed from a group. */
|
|
96
|
-
onRemovedFromGroup(handler: (chatId: number) => void): void;
|
|
97
|
-
/** Start long polling. Blocks until stop() is called. */
|
|
98
|
-
start(): Promise<void>;
|
|
99
|
-
/** Stop long polling. */
|
|
100
|
-
stop(): void;
|
|
101
|
-
/** Send a text message to a specific chat. Converts markdown and splits long messages. */
|
|
102
|
-
send(chatId: number, text: string, buttons?: InlineButton[][]): Promise<void>;
|
|
103
|
-
/** Send a plain text message (no markdown parsing) to a specific chat. */
|
|
104
|
-
sendPlain(chatId: number, text: string): Promise<void>;
|
|
105
|
-
/** Send a typing indicator to a specific chat. */
|
|
106
|
-
sendTyping(chatId: number): Promise<void>;
|
|
107
|
-
/** Get a direct download URL for a Telegram file. */
|
|
108
|
-
getFileUrl(fileId: string): Promise<string>;
|
|
109
|
-
private getUpdates;
|
|
110
|
-
private handleUpdate;
|
|
111
|
-
private apiCall;
|
|
112
|
-
}
|
|
1
|
+
export { TelegramBot, type TelegramConfig, type TelegramUpdate, type InlineButton, type TelegramMessage, type TelegramVoiceMessage, } from "@prestyj/core";
|
|
113
2
|
//# sourceMappingURL=telegram.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/core/telegram.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/core/telegram.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC"}
|
package/dist/core/telegram.js
CHANGED
|
@@ -1,252 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Supports long polling, markdown messages, inline keyboards, and message splitting.
|
|
4
|
-
*/
|
|
5
|
-
const TELEGRAM_API = "https://api.telegram.org";
|
|
6
|
-
const MAX_MESSAGE_LENGTH = 4096;
|
|
7
|
-
export class TelegramBot {
|
|
8
|
-
token;
|
|
9
|
-
allowedUserId;
|
|
10
|
-
offset = 0;
|
|
11
|
-
running = false;
|
|
12
|
-
onMessage = null;
|
|
13
|
-
onVoiceMessage = null;
|
|
14
|
-
onCallback = null;
|
|
15
|
-
onBotAdded = null;
|
|
16
|
-
onBotRemoved = null;
|
|
17
|
-
constructor(config) {
|
|
18
|
-
this.token = config.botToken;
|
|
19
|
-
this.allowedUserId = config.allowedUserId;
|
|
20
|
-
}
|
|
21
|
-
/** Register handler for incoming text messages. */
|
|
22
|
-
onText(handler) {
|
|
23
|
-
this.onMessage = handler;
|
|
24
|
-
}
|
|
25
|
-
/** Register handler for incoming voice notes. */
|
|
26
|
-
onVoice(handler) {
|
|
27
|
-
this.onVoiceMessage = handler;
|
|
28
|
-
}
|
|
29
|
-
/** Register handler for inline keyboard button presses. */
|
|
30
|
-
onCallbackQuery(handler) {
|
|
31
|
-
this.onCallback = handler;
|
|
32
|
-
}
|
|
33
|
-
/** Register handler for when the bot is added to a group. */
|
|
34
|
-
onAddedToGroup(handler) {
|
|
35
|
-
this.onBotAdded = handler;
|
|
36
|
-
}
|
|
37
|
-
/** Register handler for when the bot is removed from a group. */
|
|
38
|
-
onRemovedFromGroup(handler) {
|
|
39
|
-
this.onBotRemoved = handler;
|
|
40
|
-
}
|
|
41
|
-
/** Start long polling. Blocks until stop() is called. */
|
|
42
|
-
async start() {
|
|
43
|
-
this.running = true;
|
|
44
|
-
// Verify bot token works
|
|
45
|
-
const me = await this.apiCall("getMe");
|
|
46
|
-
if (!me.ok) {
|
|
47
|
-
throw new Error(`Invalid bot token: ${JSON.stringify(me)}`);
|
|
48
|
-
}
|
|
49
|
-
while (this.running) {
|
|
50
|
-
try {
|
|
51
|
-
const updates = await this.getUpdates();
|
|
52
|
-
for (const update of updates) {
|
|
53
|
-
await this.handleUpdate(update);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
if (!this.running)
|
|
58
|
-
break;
|
|
59
|
-
console.error(`[telegram] Poll error: ${err instanceof Error ? err.message : err}`);
|
|
60
|
-
await sleep(3000);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/** Stop long polling. */
|
|
65
|
-
stop() {
|
|
66
|
-
this.running = false;
|
|
67
|
-
}
|
|
68
|
-
/** Send a text message to a specific chat. Converts markdown and splits long messages. */
|
|
69
|
-
async send(chatId, text, buttons) {
|
|
70
|
-
const converted = toTelegramMarkdown(text);
|
|
71
|
-
const chunks = splitMessage(converted);
|
|
72
|
-
for (let i = 0; i < chunks.length; i++) {
|
|
73
|
-
const isLast = i === chunks.length - 1;
|
|
74
|
-
const replyMarkup = isLast && buttons
|
|
75
|
-
? {
|
|
76
|
-
inline_keyboard: buttons.map((row) => row.map((b) => ({ text: b.text, callback_data: b.callback_data }))),
|
|
77
|
-
}
|
|
78
|
-
: undefined;
|
|
79
|
-
await this.apiCall("sendMessage", {
|
|
80
|
-
chat_id: chatId,
|
|
81
|
-
text: chunks[i],
|
|
82
|
-
parse_mode: "Markdown",
|
|
83
|
-
...(replyMarkup ? { reply_markup: replyMarkup } : {}),
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/** Send a plain text message (no markdown parsing) to a specific chat. */
|
|
88
|
-
async sendPlain(chatId, text) {
|
|
89
|
-
const chunks = splitMessage(text);
|
|
90
|
-
for (const chunk of chunks) {
|
|
91
|
-
await this.apiCall("sendMessage", {
|
|
92
|
-
chat_id: chatId,
|
|
93
|
-
text: chunk,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/** Send a typing indicator to a specific chat. */
|
|
98
|
-
async sendTyping(chatId) {
|
|
99
|
-
await this.apiCall("sendChatAction", {
|
|
100
|
-
chat_id: chatId,
|
|
101
|
-
action: "typing",
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/** Get a direct download URL for a Telegram file. */
|
|
105
|
-
async getFileUrl(fileId) {
|
|
106
|
-
const result = await this.apiCall("getFile", { file_id: fileId });
|
|
107
|
-
if (!result.ok)
|
|
108
|
-
throw new Error(`Failed to get file: ${JSON.stringify(result)}`);
|
|
109
|
-
const filePath = result.result.file_path;
|
|
110
|
-
return `${TELEGRAM_API}/file/bot${this.token}/${filePath}`;
|
|
111
|
-
}
|
|
112
|
-
// ── Private ───────────────────────────────────────────
|
|
113
|
-
async getUpdates() {
|
|
114
|
-
const result = await this.apiCall("getUpdates", {
|
|
115
|
-
offset: this.offset,
|
|
116
|
-
timeout: 30,
|
|
117
|
-
allowed_updates: ["message", "callback_query", "my_chat_member"],
|
|
118
|
-
});
|
|
119
|
-
if (!result.ok || !Array.isArray(result.result))
|
|
120
|
-
return [];
|
|
121
|
-
const updates = result.result;
|
|
122
|
-
if (updates.length > 0) {
|
|
123
|
-
this.offset = updates[updates.length - 1].update_id + 1;
|
|
124
|
-
}
|
|
125
|
-
return updates;
|
|
126
|
-
}
|
|
127
|
-
async handleUpdate(update) {
|
|
128
|
-
if (update.message) {
|
|
129
|
-
const msg = update.message;
|
|
130
|
-
// Auth check
|
|
131
|
-
if (msg.from.id !== this.allowedUserId) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (msg.text && this.onMessage) {
|
|
135
|
-
this.onMessage({
|
|
136
|
-
text: msg.text,
|
|
137
|
-
chatId: msg.chat.id,
|
|
138
|
-
chatType: msg.chat.type,
|
|
139
|
-
chatTitle: msg.chat.title,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
else if (msg.voice && this.onVoiceMessage) {
|
|
143
|
-
this.onVoiceMessage({
|
|
144
|
-
fileId: msg.voice.file_id,
|
|
145
|
-
duration: msg.voice.duration,
|
|
146
|
-
chatId: msg.chat.id,
|
|
147
|
-
chatType: msg.chat.type,
|
|
148
|
-
chatTitle: msg.chat.title,
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// Bot membership changed in a group
|
|
153
|
-
if (update.my_chat_member) {
|
|
154
|
-
const member = update.my_chat_member;
|
|
155
|
-
const status = member.new_chat_member.status;
|
|
156
|
-
if ((status === "member" || status === "administrator") && this.onBotAdded) {
|
|
157
|
-
this.onBotAdded(member.chat.id, member.chat.title);
|
|
158
|
-
}
|
|
159
|
-
else if ((status === "left" || status === "kicked") && this.onBotRemoved) {
|
|
160
|
-
this.onBotRemoved(member.chat.id);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
if (update.callback_query) {
|
|
164
|
-
const cb = update.callback_query;
|
|
165
|
-
if (cb.from.id !== this.allowedUserId)
|
|
166
|
-
return;
|
|
167
|
-
await this.apiCall("answerCallbackQuery", { callback_query_id: cb.id });
|
|
168
|
-
if (cb.data && this.onCallback) {
|
|
169
|
-
this.onCallback(cb.data, cb.message.chat.id);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
async apiCall(method, body) {
|
|
174
|
-
const url = `${TELEGRAM_API}/bot${this.token}/${method}`;
|
|
175
|
-
const response = await fetch(url, {
|
|
176
|
-
method: "POST",
|
|
177
|
-
headers: { "Content-Type": "application/json" },
|
|
178
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
179
|
-
});
|
|
180
|
-
if (!response.ok) {
|
|
181
|
-
return { ok: false };
|
|
182
|
-
}
|
|
183
|
-
return response.json();
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// ── Markdown Conversion ──────────────────────────────────
|
|
187
|
-
/**
|
|
188
|
-
* Convert GitHub-flavored markdown to Telegram-compatible Markdown.
|
|
189
|
-
*
|
|
190
|
-
* Telegram supports: *bold*, _italic_, `code`, ```pre```, [link](url)
|
|
191
|
-
* Does NOT support: headings, horizontal rules, tables, HTML tags, images
|
|
192
|
-
*/
|
|
193
|
-
function toTelegramMarkdown(text) {
|
|
194
|
-
const lines = text.split("\n");
|
|
195
|
-
const result = [];
|
|
196
|
-
let inCodeBlock = false;
|
|
197
|
-
for (const line of lines) {
|
|
198
|
-
if (line.trimStart().startsWith("```")) {
|
|
199
|
-
inCodeBlock = !inCodeBlock;
|
|
200
|
-
result.push(line);
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
|
-
if (inCodeBlock) {
|
|
204
|
-
result.push(line);
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
207
|
-
let transformed = line;
|
|
208
|
-
// Headings → bold text
|
|
209
|
-
const headingMatch = transformed.match(/^(#{1,6})\s+(.+)$/);
|
|
210
|
-
if (headingMatch) {
|
|
211
|
-
transformed = `*${headingMatch[2]}*`;
|
|
212
|
-
result.push(transformed);
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
// Horizontal rules → empty line
|
|
216
|
-
if (/^(-{3,}|_{3,}|\*{3,})$/.test(transformed.trim())) {
|
|
217
|
-
result.push("");
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
// **bold** → *bold*
|
|
221
|
-
transformed = transformed.replace(/\*\*(.+?)\*\*/g, "*$1*");
|
|
222
|
-
result.push(transformed);
|
|
223
|
-
}
|
|
224
|
-
return result.join("\n");
|
|
225
|
-
}
|
|
226
|
-
// ── Helpers ───────────────────────────────────────────────
|
|
227
|
-
function splitMessage(text) {
|
|
228
|
-
if (text.length <= MAX_MESSAGE_LENGTH)
|
|
229
|
-
return [text];
|
|
230
|
-
const chunks = [];
|
|
231
|
-
let remaining = text;
|
|
232
|
-
while (remaining.length > 0) {
|
|
233
|
-
if (remaining.length <= MAX_MESSAGE_LENGTH) {
|
|
234
|
-
chunks.push(remaining);
|
|
235
|
-
break;
|
|
236
|
-
}
|
|
237
|
-
let splitAt = remaining.lastIndexOf("\n", MAX_MESSAGE_LENGTH);
|
|
238
|
-
if (splitAt === -1 || splitAt < MAX_MESSAGE_LENGTH * 0.5) {
|
|
239
|
-
splitAt = remaining.lastIndexOf(" ", MAX_MESSAGE_LENGTH);
|
|
240
|
-
}
|
|
241
|
-
if (splitAt === -1 || splitAt < MAX_MESSAGE_LENGTH * 0.5) {
|
|
242
|
-
splitAt = MAX_MESSAGE_LENGTH;
|
|
243
|
-
}
|
|
244
|
-
chunks.push(remaining.slice(0, splitAt));
|
|
245
|
-
remaining = remaining.slice(splitAt).trimStart();
|
|
246
|
-
}
|
|
247
|
-
return chunks;
|
|
248
|
-
}
|
|
249
|
-
function sleep(ms) {
|
|
250
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
251
|
-
}
|
|
1
|
+
// Moved to @prestyj/core. Shim keeps `../core/telegram.js` imports working.
|
|
2
|
+
export { TelegramBot, } from "@prestyj/core";
|
|
252
3
|
//# sourceMappingURL=telegram.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/core/telegram.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/core/telegram.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EACL,WAAW,GAMZ,MAAM,eAAe,CAAC"}
|
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function getSupportedThinkingLevels(provider: Provider, model: string): readonly ThinkingLevel[];
|
|
3
|
-
export declare function isThinkingLevelSupported(provider: Provider, model: string, level: ThinkingLevel): boolean;
|
|
4
|
-
export declare function getNextThinkingLevel(provider: Provider, model: string, current: ThinkingLevel | undefined): ThinkingLevel | undefined;
|
|
1
|
+
export { getSupportedThinkingLevels, isThinkingLevelSupported, getNextThinkingLevel, } from "@prestyj/core";
|
|
5
2
|
//# sourceMappingURL=thinking-level.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinking-level.d.ts","sourceRoot":"","sources":["../../src/core/thinking-level.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"thinking-level.d.ts","sourceRoot":"","sources":["../../src/core/thinking-level.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,eAAe,CAAC"}
|