@poolzin/pool-bot 2026.4.2 → 2026.4.4
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/build-info.json +3 -3
- package/dist/channels/plugins/status-issues/shared.d.ts +9 -0
- package/dist/channels/plugins/status-issues/shared.d.ts.map +1 -1
- package/dist/channels/plugins/status-issues/shared.js +10 -0
- package/dist/gateway/server-startup-matrix-migration.d.ts +16 -0
- package/dist/gateway/server-startup-matrix-migration.d.ts.map +1 -0
- package/dist/gateway/server-startup-matrix-migration.js +29 -0
- package/dist/gateway/session-archive.fs.d.ts +19 -0
- package/dist/gateway/session-archive.fs.d.ts.map +1 -0
- package/dist/gateway/session-archive.fs.js +111 -0
- package/dist/gateway/sessions-history-http.d.ts +4 -6
- package/dist/gateway/sessions-history-http.d.ts.map +1 -1
- package/dist/gateway/sessions-history-http.js +111 -146
- package/dist/plugin-sdk/compat.d.ts +18 -0
- package/dist/plugin-sdk/compat.d.ts.map +1 -1
- package/dist/plugin-sdk/compat.js +25 -0
- package/dist/whatsapp/status-issues.d.ts +3 -0
- package/dist/whatsapp/status-issues.d.ts.map +1 -0
- package/dist/whatsapp/status-issues.js +48 -0
- package/package.json +1 -1
package/dist/build-info.json
CHANGED
|
@@ -9,4 +9,13 @@ export declare function appendMatchMetadata(message: string, params: {
|
|
|
9
9
|
matchSource?: unknown;
|
|
10
10
|
}): string;
|
|
11
11
|
export declare function resolveEnabledConfiguredAccountId(...a: any[]): any;
|
|
12
|
+
export declare function collectIssuesForEnabledAccounts(params: {
|
|
13
|
+
accounts: any[];
|
|
14
|
+
readAccount?: (account: any) => any;
|
|
15
|
+
collectIssues?: (params: {
|
|
16
|
+
account: any;
|
|
17
|
+
accountId: string;
|
|
18
|
+
issues: any[];
|
|
19
|
+
}) => void;
|
|
20
|
+
}): any[];
|
|
12
21
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/channels/plugins/status-issues/shared.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE3D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,GAAG,SAAS,CAarB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,MAAM,CAGR;AAED,wBAAgB,iCAAiC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,CAElE"}
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/channels/plugins/status-issues/shared.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE3D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,GAAG,SAAS,CAarB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,MAAM,CAGR;AAED,wBAAgB,iCAAiC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,CAElE;AAGD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;CACtF,GAAG,GAAG,EAAE,CASR"}
|
|
@@ -24,3 +24,13 @@ export function appendMatchMetadata(message, params) {
|
|
|
24
24
|
export function resolveEnabledConfiguredAccountId(...a) {
|
|
25
25
|
return undefined;
|
|
26
26
|
}
|
|
27
|
+
export function collectIssuesForEnabledAccounts(params) {
|
|
28
|
+
const issues = [];
|
|
29
|
+
for (const account of params.accounts) {
|
|
30
|
+
const accountId = account.accountId ?? account.id ?? "unknown";
|
|
31
|
+
if (params.collectIssues) {
|
|
32
|
+
params.collectIssues({ account, accountId, issues });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return issues;
|
|
36
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Startup Matrix Migration
|
|
3
|
+
* Handles Matrix channel state migrations during gateway startup.
|
|
4
|
+
*/
|
|
5
|
+
type MigrationLogger = {
|
|
6
|
+
info?: (message: string) => void;
|
|
7
|
+
warn?: (message: string) => void;
|
|
8
|
+
};
|
|
9
|
+
export declare function runStartupMatrixMigration(params: {
|
|
10
|
+
cfg?: Record<string, unknown>;
|
|
11
|
+
env?: NodeJS.ProcessEnv;
|
|
12
|
+
log: MigrationLogger;
|
|
13
|
+
trigger?: string;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=server-startup-matrix-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-startup-matrix-migration.d.ts","sourceRoot":"","sources":["../../src/gateway/server-startup-matrix-migration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,eAAe,GAAG;IACrB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,EAAE,eAAe,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Startup Matrix Migration
|
|
3
|
+
* Handles Matrix channel state migrations during gateway startup.
|
|
4
|
+
*/
|
|
5
|
+
export async function runStartupMatrixMigration(params) {
|
|
6
|
+
const logPrefix = "gateway";
|
|
7
|
+
const trigger = params.trigger?.trim() || "gateway-startup";
|
|
8
|
+
// Check if Matrix is configured
|
|
9
|
+
const cfg = params.cfg ?? {};
|
|
10
|
+
const matrixCfg = cfg.matrix;
|
|
11
|
+
if (!matrixCfg?.enabled) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
params.log.info?.(`${logPrefix}: matrix migration check (trigger=${trigger})`);
|
|
15
|
+
// Best-effort migration steps
|
|
16
|
+
const steps = [
|
|
17
|
+
{ label: "legacy Matrix state migration", fn: async () => { } },
|
|
18
|
+
{ label: "legacy Matrix crypto preparation", fn: async () => { } },
|
|
19
|
+
];
|
|
20
|
+
for (const step of steps) {
|
|
21
|
+
try {
|
|
22
|
+
await step.fn();
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
params.log.warn?.(`${logPrefix}: ${step.label} failed during Matrix migration; continuing startup: ${String(err)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
params.log.info?.(`${logPrefix}: Matrix migration check complete`);
|
|
29
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type ArchiveReason = "reset" | "deleted";
|
|
2
|
+
export declare function archiveFileOnDisk(filePath: string, reason: ArchiveReason): string;
|
|
3
|
+
export declare function archiveSessionTranscripts(opts: {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
storePath?: string;
|
|
6
|
+
sessionFile?: string;
|
|
7
|
+
agentId?: string;
|
|
8
|
+
reason: ArchiveReason;
|
|
9
|
+
}): string[];
|
|
10
|
+
export declare function cleanupArchivedSessionTranscripts(opts: {
|
|
11
|
+
directories: string[];
|
|
12
|
+
olderThanMs: number;
|
|
13
|
+
reason?: ArchiveReason;
|
|
14
|
+
nowMs?: number;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
removed: number;
|
|
17
|
+
scanned: number;
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=session-archive.fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-archive.fs.d.ts","sourceRoot":"","sources":["../../src/gateway/session-archive.fs.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AA+BhD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAKjF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;CACvB,GAAG,MAAM,EAAE,CA6BX;AAED,wBAAsB,iCAAiC,CAAC,IAAI,EAAE;IAC5D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAmChD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Archive FS
|
|
3
|
+
* Handles archiving and cleanup of session transcript files on disk.
|
|
4
|
+
*/
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
function formatArchiveTimestamp() {
|
|
8
|
+
return new Date().toISOString().replace(/[:.]/g, "-");
|
|
9
|
+
}
|
|
10
|
+
function parseArchiveTimestamp(entry, reason) {
|
|
11
|
+
const suffix = `.${reason}.`;
|
|
12
|
+
const idx = entry.lastIndexOf(suffix);
|
|
13
|
+
if (idx < 0)
|
|
14
|
+
return null;
|
|
15
|
+
const tsPart = entry.slice(idx + suffix.length);
|
|
16
|
+
const iso = tsPart.replace(/-/g, (m, offset) => {
|
|
17
|
+
if (offset === 4 || offset === 7)
|
|
18
|
+
return "-";
|
|
19
|
+
if (offset === 10)
|
|
20
|
+
return "T";
|
|
21
|
+
if (offset === 13 || offset === 16)
|
|
22
|
+
return ":";
|
|
23
|
+
if (offset === 19)
|
|
24
|
+
return ".";
|
|
25
|
+
return m;
|
|
26
|
+
});
|
|
27
|
+
const ts = new Date(iso).getTime();
|
|
28
|
+
return Number.isFinite(ts) ? ts : null;
|
|
29
|
+
}
|
|
30
|
+
function canonicalizePath(filePath) {
|
|
31
|
+
const resolved = path.resolve(filePath);
|
|
32
|
+
try {
|
|
33
|
+
return fs.realpathSync(resolved);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return resolved;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function archiveFileOnDisk(filePath, reason) {
|
|
40
|
+
const ts = formatArchiveTimestamp();
|
|
41
|
+
const archived = `${filePath}.${reason}.${ts}`;
|
|
42
|
+
fs.renameSync(filePath, archived);
|
|
43
|
+
return archived;
|
|
44
|
+
}
|
|
45
|
+
export function archiveSessionTranscripts(opts) {
|
|
46
|
+
const archived = [];
|
|
47
|
+
const candidates = [];
|
|
48
|
+
// Gather candidate paths
|
|
49
|
+
if (opts.storePath) {
|
|
50
|
+
const sessionsDir = path.dirname(opts.storePath);
|
|
51
|
+
if (opts.sessionFile) {
|
|
52
|
+
candidates.push(path.resolve(sessionsDir, opts.sessionFile));
|
|
53
|
+
}
|
|
54
|
+
candidates.push(path.resolve(sessionsDir, `${opts.sessionId}.jsonl`));
|
|
55
|
+
}
|
|
56
|
+
if (opts.agentId) {
|
|
57
|
+
const home = process.env.HOME || process.env.USERPROFILE || "/tmp";
|
|
58
|
+
candidates.push(path.resolve(home, ".poolbot", "agents", opts.agentId, "sessions", `${opts.sessionId}.jsonl`));
|
|
59
|
+
}
|
|
60
|
+
const unique = Array.from(new Set(candidates.map(canonicalizePath)));
|
|
61
|
+
for (const candidate of unique) {
|
|
62
|
+
if (!fs.existsSync(candidate))
|
|
63
|
+
continue;
|
|
64
|
+
try {
|
|
65
|
+
archived.push(archiveFileOnDisk(candidate, opts.reason));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Best-effort
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return archived;
|
|
72
|
+
}
|
|
73
|
+
export async function cleanupArchivedSessionTranscripts(opts) {
|
|
74
|
+
if (!Number.isFinite(opts.olderThanMs) || opts.olderThanMs < 0) {
|
|
75
|
+
return { removed: 0, scanned: 0 };
|
|
76
|
+
}
|
|
77
|
+
const now = opts.nowMs ?? Date.now();
|
|
78
|
+
const reason = opts.reason ?? "deleted";
|
|
79
|
+
const directories = Array.from(new Set(opts.directories.map((dir) => path.resolve(dir))));
|
|
80
|
+
let removed = 0;
|
|
81
|
+
let scanned = 0;
|
|
82
|
+
for (const dir of directories) {
|
|
83
|
+
let entries;
|
|
84
|
+
try {
|
|
85
|
+
entries = await fs.promises.readdir(dir);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
const timestamp = parseArchiveTimestamp(entry, reason);
|
|
92
|
+
if (timestamp == null)
|
|
93
|
+
continue;
|
|
94
|
+
scanned++;
|
|
95
|
+
if (now - timestamp <= opts.olderThanMs)
|
|
96
|
+
continue;
|
|
97
|
+
const fullPath = path.join(dir, entry);
|
|
98
|
+
try {
|
|
99
|
+
const stat = await fs.promises.stat(fullPath);
|
|
100
|
+
if (stat.isFile()) {
|
|
101
|
+
await fs.promises.rm(fullPath);
|
|
102
|
+
removed++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Best-effort
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { removed, scanned };
|
|
111
|
+
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
-
import type { AuthRateLimiter } from "./auth-rate-limit.js";
|
|
3
|
-
import { type ResolvedGatewayAuth } from "./auth.js";
|
|
4
2
|
export declare function handleSessionHistoryHttpRequest(req: IncomingMessage, res: ServerResponse, opts: {
|
|
5
|
-
auth
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
auth?: {
|
|
4
|
+
token?: string;
|
|
5
|
+
};
|
|
6
|
+
sessionsStorePath?: string;
|
|
9
7
|
}): Promise<boolean>;
|
|
10
8
|
//# sourceMappingURL=sessions-history-http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions-history-http.d.ts","sourceRoot":"","sources":["../../src/gateway/sessions-history-http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessions-history-http.d.ts","sourceRoot":"","sources":["../../src/gateway/sessions-history-http.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAiKjE,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GACA,OAAO,CAAC,OAAO,CAAC,CAqDlB"}
|
|
@@ -1,76 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sessions History HTTP
|
|
3
|
+
* HTTP handler for retrieving session message history with pagination and SSE streaming.
|
|
4
|
+
*/
|
|
1
5
|
import fs from "node:fs";
|
|
2
6
|
import path from "node:path";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
function
|
|
12
|
-
const url =
|
|
7
|
+
const MAX_HISTORY_LIMIT = 1000;
|
|
8
|
+
function parseUrl(req) {
|
|
9
|
+
return new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
10
|
+
}
|
|
11
|
+
function getHeader(req, name) {
|
|
12
|
+
const value = req.headers[name.toLowerCase()];
|
|
13
|
+
return Array.isArray(value) ? value[0] : value;
|
|
14
|
+
}
|
|
15
|
+
function resolveSessionKey(req) {
|
|
16
|
+
const url = parseUrl(req);
|
|
13
17
|
const match = url.pathname.match(/^\/sessions\/([^/]+)\/history$/);
|
|
14
|
-
if (!match)
|
|
18
|
+
if (!match)
|
|
15
19
|
return null;
|
|
16
|
-
}
|
|
17
20
|
try {
|
|
18
21
|
return decodeURIComponent(match[1] ?? "").trim() || null;
|
|
19
22
|
}
|
|
20
23
|
catch {
|
|
21
|
-
return
|
|
24
|
+
return null;
|
|
22
25
|
}
|
|
23
26
|
}
|
|
24
|
-
function shouldStreamSse(req) {
|
|
25
|
-
const accept = getHeader(req, "accept")?.toLowerCase() ?? "";
|
|
26
|
-
return accept.includes("text/event-stream");
|
|
27
|
-
}
|
|
28
|
-
function getRequestUrl(req) {
|
|
29
|
-
return new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
30
|
-
}
|
|
31
27
|
function resolveLimit(req) {
|
|
32
|
-
const raw =
|
|
33
|
-
if (raw
|
|
28
|
+
const raw = parseUrl(req).searchParams.get("limit");
|
|
29
|
+
if (!raw?.trim())
|
|
34
30
|
return undefined;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (!Number.isFinite(value) || value < 1) {
|
|
31
|
+
const value = parseInt(raw, 10);
|
|
32
|
+
if (!Number.isFinite(value) || value < 1)
|
|
38
33
|
return 1;
|
|
39
|
-
|
|
40
|
-
return Math.min(MAX_SESSION_HISTORY_LIMIT, Math.max(1, value));
|
|
34
|
+
return Math.min(MAX_HISTORY_LIMIT, Math.max(1, value));
|
|
41
35
|
}
|
|
42
36
|
function resolveCursor(req) {
|
|
43
|
-
|
|
44
|
-
const trimmed = raw?.trim();
|
|
45
|
-
return trimmed ? trimmed : undefined;
|
|
37
|
+
return parseUrl(req).searchParams.get("cursor")?.trim() || undefined;
|
|
46
38
|
}
|
|
47
39
|
function resolveCursorSeq(cursor) {
|
|
48
|
-
if (!cursor)
|
|
40
|
+
if (!cursor)
|
|
49
41
|
return undefined;
|
|
50
|
-
}
|
|
51
42
|
const normalized = cursor.startsWith("seq:") ? cursor.slice(4) : cursor;
|
|
52
|
-
const value =
|
|
43
|
+
const value = parseInt(normalized, 10);
|
|
53
44
|
return Number.isFinite(value) && value > 0 ? value : undefined;
|
|
54
45
|
}
|
|
55
|
-
function
|
|
56
|
-
if (!message || typeof message !== "object" || Array.isArray(message)) {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
const meta = message.__openclaw;
|
|
60
|
-
if (!meta || typeof meta !== "object" || Array.isArray(meta)) {
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
const seq = meta.seq;
|
|
64
|
-
return typeof seq === "number" && Number.isFinite(seq) && seq > 0 ? seq : undefined;
|
|
65
|
-
}
|
|
66
|
-
function paginateSessionMessages(messages, limit, cursor) {
|
|
46
|
+
function paginateMessages(messages, limit, cursor) {
|
|
67
47
|
const cursorSeq = resolveCursorSeq(cursor);
|
|
68
48
|
const endExclusive = typeof cursorSeq === "number"
|
|
69
49
|
? Math.max(0, Math.min(messages.length, cursorSeq - 1))
|
|
70
50
|
: messages.length;
|
|
71
51
|
const start = typeof limit === "number" && limit > 0 ? Math.max(0, endExclusive - limit) : 0;
|
|
72
52
|
const items = messages.slice(start, endExclusive);
|
|
73
|
-
const
|
|
53
|
+
const firstItem = items[0];
|
|
54
|
+
const meta = firstItem?.__poolbot;
|
|
55
|
+
const firstSeq = typeof meta?.seq === "number" ? meta.seq : undefined;
|
|
74
56
|
return {
|
|
75
57
|
items,
|
|
76
58
|
messages: items,
|
|
@@ -78,135 +60,118 @@ function paginateSessionMessages(messages, limit, cursor) {
|
|
|
78
60
|
...(start > 0 && typeof firstSeq === "number" ? { nextCursor: String(firstSeq) } : {}),
|
|
79
61
|
};
|
|
80
62
|
}
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
|
|
63
|
+
function readSessionMessages(sessionId, storePath, sessionFile) {
|
|
64
|
+
let filePath;
|
|
65
|
+
if (sessionFile) {
|
|
66
|
+
filePath = path.isAbsolute(sessionFile)
|
|
67
|
+
? sessionFile
|
|
68
|
+
: path.resolve(path.dirname(storePath ?? "."), sessionFile);
|
|
69
|
+
}
|
|
70
|
+
else if (storePath) {
|
|
71
|
+
filePath = path.resolve(path.dirname(storePath), `${sessionId}.jsonl`);
|
|
72
|
+
}
|
|
73
|
+
if (!filePath || !fs.existsSync(filePath))
|
|
74
|
+
return [];
|
|
75
|
+
try {
|
|
76
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
77
|
+
return content
|
|
78
|
+
.split("\n")
|
|
79
|
+
.filter(Boolean)
|
|
80
|
+
.map((line) => {
|
|
81
|
+
try {
|
|
82
|
+
return JSON.parse(line);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
.filter(Boolean);
|
|
85
89
|
}
|
|
86
|
-
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function resolveSessionStore(storePath) {
|
|
87
95
|
try {
|
|
88
|
-
|
|
96
|
+
if (fs.existsSync(storePath)) {
|
|
97
|
+
const content = fs.readFileSync(storePath, "utf-8");
|
|
98
|
+
return JSON.parse(content);
|
|
99
|
+
}
|
|
89
100
|
}
|
|
90
101
|
catch {
|
|
91
|
-
|
|
102
|
+
// Best-effort
|
|
92
103
|
}
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
function findSessionEntry(store, sessionKey) {
|
|
107
|
+
// Try direct key
|
|
108
|
+
if (store[sessionKey])
|
|
109
|
+
return store[sessionKey];
|
|
110
|
+
// Try matching sessionId
|
|
111
|
+
for (const entry of Object.values(store)) {
|
|
112
|
+
if (entry.sessionId === sessionKey)
|
|
113
|
+
return entry;
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
function shouldStreamSse(req) {
|
|
118
|
+
return (getHeader(req, "accept") ?? "").toLowerCase().includes("text/event-stream");
|
|
119
|
+
}
|
|
120
|
+
function sendJson(res, status, data) {
|
|
121
|
+
res.writeHead(status, { "Content-Type": "application/json" });
|
|
122
|
+
res.end(JSON.stringify(data));
|
|
123
|
+
}
|
|
124
|
+
function sendError(res, status, type, message) {
|
|
125
|
+
sendJson(res, status, { ok: false, error: { type, message } });
|
|
126
|
+
}
|
|
127
|
+
function setSseHeaders(res) {
|
|
128
|
+
res.writeHead(200, {
|
|
129
|
+
"Content-Type": "text/event-stream",
|
|
130
|
+
"Cache-Control": "no-cache",
|
|
131
|
+
Connection: "keep-alive",
|
|
132
|
+
});
|
|
93
133
|
}
|
|
94
134
|
function sseWrite(res, event, payload) {
|
|
95
|
-
res.write(`event: ${event}
|
|
96
|
-
`);
|
|
97
|
-
res.write(`data: ${JSON.stringify(payload)}
|
|
98
|
-
|
|
99
|
-
`);
|
|
135
|
+
res.write(`event: ${event}\n`);
|
|
136
|
+
res.write(`data: ${JSON.stringify(payload)}\n\n`);
|
|
100
137
|
}
|
|
101
138
|
export async function handleSessionHistoryHttpRequest(req, res, opts) {
|
|
102
|
-
const sessionKey =
|
|
103
|
-
if (sessionKey === null)
|
|
139
|
+
const sessionKey = resolveSessionKey(req);
|
|
140
|
+
if (sessionKey === null)
|
|
104
141
|
return false;
|
|
105
|
-
}
|
|
106
142
|
if (!sessionKey) {
|
|
107
|
-
|
|
143
|
+
sendError(res, 400, "invalid_request", "invalid session key");
|
|
108
144
|
return true;
|
|
109
145
|
}
|
|
110
146
|
if (req.method !== "GET") {
|
|
111
|
-
|
|
147
|
+
sendError(res, 405, "method_not_allowed", "GET required");
|
|
112
148
|
return true;
|
|
113
149
|
}
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
const
|
|
117
|
-
auth: opts.auth,
|
|
118
|
-
connectAuth: token ? { token, password: token } : null,
|
|
119
|
-
req,
|
|
120
|
-
trustedProxies: opts.trustedProxies ?? cfg.gateway?.trustedProxies,
|
|
121
|
-
allowRealIpFallback: opts.allowRealIpFallback ?? cfg.gateway?.allowRealIpFallback,
|
|
122
|
-
rateLimiter: opts.rateLimiter,
|
|
123
|
-
});
|
|
124
|
-
if (!authResult.ok) {
|
|
125
|
-
sendGatewayAuthFailure(res, authResult);
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
128
|
-
const target = resolveGatewaySessionStoreTarget({ cfg, key: sessionKey });
|
|
129
|
-
const store = loadSessionStore(target.storePath);
|
|
130
|
-
const entry = target.storeKeys.map((key) => store[key]).find(Boolean);
|
|
150
|
+
const storePath = opts.sessionsStorePath ?? path.join(process.env.HOME || process.env.USERPROFILE || "/tmp", ".poolbot", "sessions", "sessions.json");
|
|
151
|
+
const store = resolveSessionStore(storePath);
|
|
152
|
+
const entry = findSessionEntry(store, sessionKey);
|
|
131
153
|
if (!entry?.sessionId) {
|
|
132
|
-
|
|
133
|
-
ok: false,
|
|
134
|
-
error: {
|
|
135
|
-
type: "not_found",
|
|
136
|
-
message: `Session not found: ${sessionKey}`,
|
|
137
|
-
},
|
|
138
|
-
});
|
|
154
|
+
sendError(res, 404, "not_found", `Session not found: ${sessionKey}`);
|
|
139
155
|
return true;
|
|
140
156
|
}
|
|
141
157
|
const limit = resolveLimit(req);
|
|
142
158
|
const cursor = resolveCursor(req);
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
: [], limit, cursor);
|
|
159
|
+
const messages = readSessionMessages(entry.sessionId, storePath, entry.sessionFile);
|
|
160
|
+
const history = paginateMessages(messages, limit, cursor);
|
|
146
161
|
if (!shouldStreamSse(req)) {
|
|
147
|
-
sendJson(res, 200, {
|
|
148
|
-
sessionKey: target.canonicalKey,
|
|
149
|
-
...history,
|
|
150
|
-
});
|
|
162
|
+
sendJson(res, 200, { sessionKey, ...history });
|
|
151
163
|
return true;
|
|
152
164
|
}
|
|
153
|
-
|
|
154
|
-
? new Set(resolveSessionTranscriptCandidates(entry.sessionId, target.storePath, entry.sessionFile, target.agentId)
|
|
155
|
-
.map((candidate) => canonicalizePath(candidate))
|
|
156
|
-
.filter((candidate) => typeof candidate === "string"))
|
|
157
|
-
: new Set();
|
|
158
|
-
let sentHistory = history;
|
|
165
|
+
// SSE streaming
|
|
159
166
|
setSseHeaders(res);
|
|
160
|
-
res.write("retry: 1000
|
|
161
|
-
|
|
162
|
-
...sentHistory,
|
|
163
|
-
}));
|
|
167
|
+
res.write("retry: 1000\n\n");
|
|
168
|
+
sseWrite(res, "history", { sessionKey, ...history });
|
|
164
169
|
const heartbeat = setInterval(() => {
|
|
165
170
|
if (!res.writableEnded) {
|
|
166
|
-
res.write(": keepalive
|
|
171
|
+
res.write(": keepalive\n\n");
|
|
167
172
|
}
|
|
168
173
|
}, 15_000);
|
|
169
|
-
const
|
|
170
|
-
if (res.writableEnded || !entry?.sessionId) {
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
const updatePath = canonicalizePath(update.sessionFile);
|
|
174
|
-
if (!updatePath || !transcriptCandidates.has(updatePath)) {
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
if (update.message !== undefined) {
|
|
178
|
-
const previousSeq = resolveMessageSeq(sentHistory.items.at(-1));
|
|
179
|
-
const nextMessage = attachOpenClawTranscriptMeta(update.message, {
|
|
180
|
-
...(typeof update.messageId === "string" ? { id: update.messageId } : {}),
|
|
181
|
-
seq: typeof previousSeq === "number"
|
|
182
|
-
? previousSeq + 1
|
|
183
|
-
: readSessionMessages(entry.sessionId, target.storePath, entry.sessionFile).length,
|
|
184
|
-
});
|
|
185
|
-
if (limit === undefined && cursor === undefined) {
|
|
186
|
-
sentHistory = {
|
|
187
|
-
items: [...sentHistory.items, nextMessage],
|
|
188
|
-
messages: [...sentHistory.items, nextMessage],
|
|
189
|
-
hasMore: false,
|
|
190
|
-
};
|
|
191
|
-
sseWrite(res, "message", {
|
|
192
|
-
sessionKey: target.canonicalKey,
|
|
193
|
-
message: nextMessage,
|
|
194
|
-
...(typeof update.messageId === "string" ? { messageId: update.messageId } : {}),
|
|
195
|
-
messageSeq: resolveMessageSeq(nextMessage),
|
|
196
|
-
});
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
sentHistory = paginateSessionMessages(readSessionMessages(entry.sessionId, target.storePath, entry.sessionFile), limit, cursor);
|
|
201
|
-
sseWrite(res, "history", {
|
|
202
|
-
sessionKey: target.canonicalKey,
|
|
203
|
-
...sentHistory,
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
const cleanup = () => {
|
|
207
|
-
clearInterval(heartbeat);
|
|
208
|
-
unsubscribe();
|
|
209
|
-
};
|
|
174
|
+
const cleanup = () => clearInterval(heartbeat);
|
|
210
175
|
req.on("close", cleanup);
|
|
211
176
|
res.on("close", cleanup);
|
|
212
177
|
res.on("finish", cleanup);
|
|
@@ -7,6 +7,24 @@ export type { PoolBotPluginConfigSchema } from "../plugins/types.js";
|
|
|
7
7
|
export { getChatChannelMeta } from "../channels/registry.js";
|
|
8
8
|
export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js";
|
|
9
9
|
export { HEARTBEAT_TOKEN, SILENT_REPLY_TOKEN } from "../auto-reply/tokens.js";
|
|
10
|
+
export { listTelegramAccountIds } from "../telegram/accounts.js";
|
|
11
|
+
export { listSignalAccountIds } from "../signal/accounts.js";
|
|
12
|
+
export { listSlackAccountIds } from "../slack/accounts.js";
|
|
13
|
+
export { listIMessageAccountIds } from "../imessage/accounts.js";
|
|
14
|
+
export { listWhatsAppAccountIds } from "../web/accounts.js";
|
|
15
|
+
export { resolveTelegramAccount, resolveDefaultTelegramAccountId } from "../telegram/accounts.js";
|
|
16
|
+
export { looksLikeTelegramTargetId, normalizeTelegramMessagingTarget } from "../telegram/normalize.js";
|
|
17
|
+
export { collectTelegramStatusIssues } from "./channels/telegram.js";
|
|
18
|
+
export { resolveSignalAccount, resolveDefaultSignalAccountId } from "../signal/accounts.js";
|
|
19
|
+
export { looksLikeSignalTargetId, normalizeSignalMessagingTarget } from "../channels/plugins/normalize/signal.js";
|
|
20
|
+
export { resolveSlackAccount, resolveDefaultSlackAccountId } from "../slack/accounts.js";
|
|
21
|
+
export { looksLikeSlackTargetId, normalizeSlackMessagingTarget } from "../channels/plugins/normalize/slack.js";
|
|
22
|
+
export { resolveIMessageAccount, resolveDefaultIMessageAccountId } from "../imessage/accounts.js";
|
|
23
|
+
export { looksLikeIMessageTargetId, normalizeIMessageMessagingTarget } from "../channels/plugins/normalize/imessage.js";
|
|
24
|
+
export { resolveWhatsAppAccount, resolveDefaultWhatsAppAccountId } from "../web/accounts.js";
|
|
25
|
+
export { looksLikeWhatsAppTargetId, normalizeWhatsAppMessagingTarget } from "../channels/plugins/normalize/whatsapp.js";
|
|
26
|
+
export { collectWhatsAppStatusIssues } from "../whatsapp/status-issues.js";
|
|
27
|
+
export { listTelegramDirectoryGroupsFromConfig, listTelegramDirectoryPeersFromConfig, listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig, listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig, listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, } from "../channels/plugins/directory-config.js";
|
|
10
28
|
export type PoolBotConfig = any;
|
|
11
29
|
export type PoolbotConfig = any;
|
|
12
30
|
export type ClawdbotConfig = any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../src/plugin-sdk/compat.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../src/plugin-sdk/compat.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,31 @@ export { getChatChannelMeta } from "../channels/registry.js";
|
|
|
11
11
|
export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js";
|
|
12
12
|
// Tokens
|
|
13
13
|
export { HEARTBEAT_TOKEN, SILENT_REPLY_TOKEN } from "../auto-reply/tokens.js";
|
|
14
|
+
// Channel account exports
|
|
15
|
+
export { listTelegramAccountIds } from "../telegram/accounts.js";
|
|
16
|
+
export { listSignalAccountIds } from "../signal/accounts.js";
|
|
17
|
+
export { listSlackAccountIds } from "../slack/accounts.js";
|
|
18
|
+
export { listIMessageAccountIds } from "../imessage/accounts.js";
|
|
19
|
+
export { listWhatsAppAccountIds } from "../web/accounts.js";
|
|
20
|
+
// Telegram exports
|
|
21
|
+
export { resolveTelegramAccount, resolveDefaultTelegramAccountId } from "../telegram/accounts.js";
|
|
22
|
+
export { looksLikeTelegramTargetId, normalizeTelegramMessagingTarget } from "../telegram/normalize.js";
|
|
23
|
+
export { collectTelegramStatusIssues } from "./channels/telegram.js";
|
|
24
|
+
// Signal exports
|
|
25
|
+
export { resolveSignalAccount, resolveDefaultSignalAccountId } from "../signal/accounts.js";
|
|
26
|
+
export { looksLikeSignalTargetId, normalizeSignalMessagingTarget } from "../channels/plugins/normalize/signal.js";
|
|
27
|
+
// Slack exports
|
|
28
|
+
export { resolveSlackAccount, resolveDefaultSlackAccountId } from "../slack/accounts.js";
|
|
29
|
+
export { looksLikeSlackTargetId, normalizeSlackMessagingTarget } from "../channels/plugins/normalize/slack.js";
|
|
30
|
+
// iMessage exports
|
|
31
|
+
export { resolveIMessageAccount, resolveDefaultIMessageAccountId } from "../imessage/accounts.js";
|
|
32
|
+
export { looksLikeIMessageTargetId, normalizeIMessageMessagingTarget } from "../channels/plugins/normalize/imessage.js";
|
|
33
|
+
// WhatsApp exports
|
|
34
|
+
export { resolveWhatsAppAccount, resolveDefaultWhatsAppAccountId } from "../web/accounts.js";
|
|
35
|
+
export { looksLikeWhatsAppTargetId, normalizeWhatsAppMessagingTarget } from "../channels/plugins/normalize/whatsapp.js";
|
|
36
|
+
export { collectWhatsAppStatusIssues } from "../whatsapp/status-issues.js";
|
|
37
|
+
// Directory config exports
|
|
38
|
+
export { listTelegramDirectoryGroupsFromConfig, listTelegramDirectoryPeersFromConfig, listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig, listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig, listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, } from "../channels/plugins/directory-config.js";
|
|
14
39
|
// Schema types
|
|
15
40
|
export const MarkdownConfigSchema = {};
|
|
16
41
|
export const ToolPolicySchema = {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-issues.d.ts","sourceRoot":"","sources":["../../src/whatsapp/status-issues.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA4B/F,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,sBAAsB,EAAE,GACjC,kBAAkB,EAAE,CAkCtB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { asString, collectIssuesForEnabledAccounts, isRecord, } from "../channels/plugins/status-issues/shared.js";
|
|
2
|
+
import { formatCliCommand } from "../cli/command-format.js";
|
|
3
|
+
function readWhatsAppAccountStatus(value) {
|
|
4
|
+
if (!isRecord(value)) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
accountId: value.accountId,
|
|
9
|
+
enabled: value.enabled,
|
|
10
|
+
linked: value.linked,
|
|
11
|
+
connected: value.connected,
|
|
12
|
+
running: value.running,
|
|
13
|
+
reconnectAttempts: value.reconnectAttempts,
|
|
14
|
+
lastError: value.lastError,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function collectWhatsAppStatusIssues(accounts) {
|
|
18
|
+
return collectIssuesForEnabledAccounts({
|
|
19
|
+
accounts,
|
|
20
|
+
readAccount: readWhatsAppAccountStatus,
|
|
21
|
+
collectIssues: ({ account, accountId, issues }) => {
|
|
22
|
+
const linked = account.linked === true;
|
|
23
|
+
const running = account.running === true;
|
|
24
|
+
const connected = account.connected === true;
|
|
25
|
+
const reconnectAttempts = typeof account.reconnectAttempts === "number" ? account.reconnectAttempts : null;
|
|
26
|
+
const lastError = asString(account.lastError);
|
|
27
|
+
if (!linked) {
|
|
28
|
+
issues.push({
|
|
29
|
+
channel: "whatsapp",
|
|
30
|
+
accountId,
|
|
31
|
+
kind: "auth",
|
|
32
|
+
message: "Not linked (no WhatsApp Web session).",
|
|
33
|
+
fix: `Run: ${formatCliCommand("openclaw channels login")} (scan QR on the gateway host).`,
|
|
34
|
+
});
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (running && !connected) {
|
|
38
|
+
issues.push({
|
|
39
|
+
channel: "whatsapp",
|
|
40
|
+
accountId,
|
|
41
|
+
kind: "runtime",
|
|
42
|
+
message: `Linked but disconnected${reconnectAttempts != null ? ` (reconnectAttempts=${reconnectAttempts})` : ""}${lastError ? `: ${lastError}` : "."}`,
|
|
43
|
+
fix: `Run: ${formatCliCommand("openclaw doctor")} (or restart the gateway). If it persists, relink via channels login and check logs.`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|