imperium-crawl 2.3.1 → 2.5.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/README.md +146 -11
- package/dist/cli-explore.d.ts +30 -0
- package/dist/cli-explore.d.ts.map +1 -0
- package/dist/cli-explore.js +427 -0
- package/dist/cli-explore.js.map +1 -0
- package/dist/cli-recorder.d.ts +44 -0
- package/dist/cli-recorder.d.ts.map +1 -0
- package/dist/cli-recorder.js +67 -0
- package/dist/cli-recorder.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +51 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +31 -1
- package/dist/constants.js.map +1 -1
- package/dist/flows/engine.d.ts +7 -0
- package/dist/flows/engine.d.ts.map +1 -0
- package/dist/flows/engine.js +183 -0
- package/dist/flows/engine.js.map +1 -0
- package/dist/flows/index.d.ts +6 -0
- package/dist/flows/index.d.ts.map +1 -0
- package/dist/flows/index.js +6 -0
- package/dist/flows/index.js.map +1 -0
- package/dist/flows/server.d.ts +11 -0
- package/dist/flows/server.d.ts.map +1 -0
- package/dist/flows/server.js +81 -0
- package/dist/flows/server.js.map +1 -0
- package/dist/flows/smart-target.d.ts +9 -0
- package/dist/flows/smart-target.d.ts.map +1 -0
- package/dist/flows/smart-target.js +84 -0
- package/dist/flows/smart-target.js.map +1 -0
- package/dist/flows/storage.d.ts +26 -0
- package/dist/flows/storage.d.ts.map +1 -0
- package/dist/flows/storage.js +118 -0
- package/dist/flows/storage.js.map +1 -0
- package/dist/flows/templates.d.ts +4 -0
- package/dist/flows/templates.d.ts.map +1 -0
- package/dist/flows/templates.js +35 -0
- package/dist/flows/templates.js.map +1 -0
- package/dist/flows/types.d.ts +3356 -0
- package/dist/flows/types.d.ts.map +1 -0
- package/dist/flows/types.js +133 -0
- package/dist/flows/types.js.map +1 -0
- package/dist/knowledge/index.d.ts +1 -0
- package/dist/knowledge/index.d.ts.map +1 -1
- package/dist/knowledge/index.js +1 -0
- package/dist/knowledge/index.js.map +1 -1
- package/dist/knowledge/record-browser.d.ts +17 -0
- package/dist/knowledge/record-browser.d.ts.map +1 -0
- package/dist/knowledge/record-browser.js +29 -0
- package/dist/knowledge/record-browser.js.map +1 -0
- package/dist/knowledge/store.d.ts +19 -0
- package/dist/knowledge/store.d.ts.map +1 -1
- package/dist/knowledge/store.js +63 -4
- package/dist/knowledge/store.js.map +1 -1
- package/dist/llm/retry.d.ts +4 -2
- package/dist/llm/retry.d.ts.map +1 -1
- package/dist/llm/retry.js +15 -4
- package/dist/llm/retry.js.map +1 -1
- package/dist/sessions/browser-connect.d.ts +30 -0
- package/dist/sessions/browser-connect.d.ts.map +1 -0
- package/dist/sessions/browser-connect.js +68 -0
- package/dist/sessions/browser-connect.js.map +1 -0
- package/dist/sessions/browser-state.d.ts +35 -0
- package/dist/sessions/browser-state.d.ts.map +1 -0
- package/dist/sessions/browser-state.js +74 -0
- package/dist/sessions/browser-state.js.map +1 -0
- package/dist/sessions/index.d.ts +1 -1
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +1 -1
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/inject-cookies.d.ts +20 -0
- package/dist/sessions/inject-cookies.d.ts.map +1 -0
- package/dist/sessions/inject-cookies.js +57 -0
- package/dist/sessions/inject-cookies.js.map +1 -0
- package/dist/sessions/manager.d.ts +31 -1
- package/dist/sessions/manager.d.ts.map +1 -1
- package/dist/sessions/manager.js +97 -6
- package/dist/sessions/manager.js.map +1 -1
- package/dist/sessions/types.d.ts +2 -0
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/skills/chain.d.ts +61 -0
- package/dist/skills/chain.d.ts.map +1 -0
- package/dist/skills/chain.js +182 -0
- package/dist/skills/chain.js.map +1 -0
- package/dist/skills/conditions.d.ts +14 -0
- package/dist/skills/conditions.d.ts.map +1 -0
- package/dist/skills/conditions.js +208 -0
- package/dist/skills/conditions.js.map +1 -0
- package/dist/skills/manager.d.ts +47 -2
- package/dist/skills/manager.d.ts.map +1 -1
- package/dist/skills/manager.js.map +1 -1
- package/dist/skills/parameters.d.ts +49 -0
- package/dist/skills/parameters.d.ts.map +1 -0
- package/dist/skills/parameters.js +157 -0
- package/dist/skills/parameters.js.map +1 -0
- package/dist/snapshot/store.d.ts +8 -0
- package/dist/snapshot/store.d.ts.map +1 -1
- package/dist/snapshot/store.js +48 -0
- package/dist/snapshot/store.js.map +1 -1
- package/dist/stealth/antibot-detector.d.ts +1 -1
- package/dist/stealth/antibot-detector.d.ts.map +1 -1
- package/dist/stealth/antibot-detector.js +56 -0
- package/dist/stealth/antibot-detector.js.map +1 -1
- package/dist/stealth/browser-image-extract.d.ts +43 -0
- package/dist/stealth/browser-image-extract.d.ts.map +1 -0
- package/dist/stealth/browser-image-extract.js +268 -0
- package/dist/stealth/browser-image-extract.js.map +1 -0
- package/dist/stealth/browser.d.ts +5 -0
- package/dist/stealth/browser.d.ts.map +1 -1
- package/dist/stealth/browser.js +82 -1
- package/dist/stealth/browser.js.map +1 -1
- package/dist/stealth/chrome-profile.d.ts +1 -0
- package/dist/stealth/chrome-profile.d.ts.map +1 -1
- package/dist/stealth/chrome-profile.js +28 -5
- package/dist/stealth/chrome-profile.js.map +1 -1
- package/dist/stealth/detector.d.ts +10 -1
- package/dist/stealth/detector.d.ts.map +1 -1
- package/dist/stealth/detector.js +117 -25
- package/dist/stealth/detector.js.map +1 -1
- package/dist/stealth/headers.d.ts +1 -1
- package/dist/stealth/headers.d.ts.map +1 -1
- package/dist/stealth/headers.js +94 -2
- package/dist/stealth/headers.js.map +1 -1
- package/dist/stealth/index.d.ts +5 -0
- package/dist/stealth/index.d.ts.map +1 -1
- package/dist/stealth/index.js +257 -27
- package/dist/stealth/index.js.map +1 -1
- package/dist/stealth/proxy.d.ts +40 -1
- package/dist/stealth/proxy.d.ts.map +1 -1
- package/dist/stealth/proxy.js +90 -6
- package/dist/stealth/proxy.js.map +1 -1
- package/dist/tools/action-executor.d.ts +66 -0
- package/dist/tools/action-executor.d.ts.map +1 -0
- package/dist/tools/action-executor.js +403 -0
- package/dist/tools/action-executor.js.map +1 -0
- package/dist/tools/batch-download.d.ts +33 -0
- package/dist/tools/batch-download.d.ts.map +1 -0
- package/dist/tools/batch-download.js +208 -0
- package/dist/tools/batch-download.js.map +1 -0
- package/dist/tools/batch-scrape.d.ts +2 -2
- package/dist/tools/browser.d.ts +100 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +448 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/crawl.d.ts +2 -2
- package/dist/tools/create-skill.d.ts +2 -2
- package/dist/tools/discover-apis.d.ts +1 -1
- package/dist/tools/discover-apis.d.ts.map +1 -1
- package/dist/tools/discover-apis.js +3 -0
- package/dist/tools/discover-apis.js.map +1 -1
- package/dist/tools/download.d.ts +39 -6
- package/dist/tools/download.d.ts.map +1 -1
- package/dist/tools/download.js +248 -44
- package/dist/tools/download.js.map +1 -1
- package/dist/tools/extract.d.ts +1 -1
- package/dist/tools/image-search.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +26 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inspect-flow.d.ts +24 -0
- package/dist/tools/inspect-flow.d.ts.map +1 -0
- package/dist/tools/inspect-flow.js +23 -0
- package/dist/tools/inspect-flow.js.map +1 -0
- package/dist/tools/instagram.d.ts +2 -2
- package/dist/tools/interact.d.ts +91 -50
- package/dist/tools/interact.d.ts.map +1 -1
- package/dist/tools/interact.js +80 -299
- package/dist/tools/interact.js.map +1 -1
- package/dist/tools/knowledge.d.ts +24 -0
- package/dist/tools/knowledge.d.ts.map +1 -0
- package/dist/tools/knowledge.js +99 -0
- package/dist/tools/knowledge.js.map +1 -0
- package/dist/tools/list-flows.d.ts +21 -0
- package/dist/tools/list-flows.d.ts.map +1 -0
- package/dist/tools/list-flows.js +18 -0
- package/dist/tools/list-flows.js.map +1 -0
- package/dist/tools/list-skills.js +1 -1
- package/dist/tools/list-skills.js.map +1 -1
- package/dist/tools/manifest.d.ts.map +1 -1
- package/dist/tools/manifest.js +48 -0
- package/dist/tools/manifest.js.map +1 -1
- package/dist/tools/monitor-websocket.d.ts +1 -1
- package/dist/tools/monitor.d.ts +46 -0
- package/dist/tools/monitor.d.ts.map +1 -0
- package/dist/tools/monitor.js +213 -0
- package/dist/tools/monitor.js.map +1 -0
- package/dist/tools/news-search.d.ts +1 -1
- package/dist/tools/pdf-extract.d.ts +38 -0
- package/dist/tools/pdf-extract.d.ts.map +1 -0
- package/dist/tools/pdf-extract.js +244 -0
- package/dist/tools/pdf-extract.js.map +1 -0
- package/dist/tools/query-api.d.ts +6 -6
- package/dist/tools/readability.d.ts +2 -2
- package/dist/tools/record-flow.d.ts +39 -0
- package/dist/tools/record-flow.d.ts.map +1 -0
- package/dist/tools/record-flow.js +406 -0
- package/dist/tools/record-flow.js.map +1 -0
- package/dist/tools/reddit.d.ts +4 -4
- package/dist/tools/run-flow.d.ts +54 -0
- package/dist/tools/run-flow.d.ts.map +1 -0
- package/dist/tools/run-flow.js +47 -0
- package/dist/tools/run-flow.js.map +1 -0
- package/dist/tools/run-skill.d.ts +14 -4
- package/dist/tools/run-skill.d.ts.map +1 -1
- package/dist/tools/run-skill.js +74 -0
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/scrape.d.ts +9 -6
- package/dist/tools/scrape.d.ts.map +1 -1
- package/dist/tools/scrape.js +19 -1
- package/dist/tools/scrape.js.map +1 -1
- package/dist/tools/screenshot.d.ts.map +1 -1
- package/dist/tools/screenshot.js +6 -0
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/serve-flow.d.ts +36 -0
- package/dist/tools/serve-flow.d.ts.map +1 -0
- package/dist/tools/serve-flow.js +42 -0
- package/dist/tools/serve-flow.js.map +1 -0
- package/dist/tools/snapshot.d.ts +5 -5
- package/dist/tools/snapshot.d.ts.map +1 -1
- package/dist/tools/snapshot.js +3 -0
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/validate-flow.d.ts +24 -0
- package/dist/tools/validate-flow.d.ts.map +1 -0
- package/dist/tools/validate-flow.js +23 -0
- package/dist/tools/validate-flow.js.map +1 -0
- package/dist/tools/video-search.d.ts +1 -1
- package/dist/tools/watch.d.ts +68 -0
- package/dist/tools/watch.d.ts.map +1 -0
- package/dist/tools/watch.js +224 -0
- package/dist/tools/watch.js.map +1 -0
- package/dist/tools/youtube.d.ts +2 -2
- package/dist/utils/fetcher.d.ts +13 -4
- package/dist/utils/fetcher.d.ts.map +1 -1
- package/dist/utils/fetcher.js +153 -23
- package/dist/utils/fetcher.js.map +1 -1
- package/package.json +19 -5
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser State persistence — stores CDP endpoint + PID between CLI invocations.
|
|
3
|
+
*
|
|
4
|
+
* Each named session gets its own directory under ~/.imperium-crawl/sessions/{name}/
|
|
5
|
+
* with browser.json holding the CDP connection info and Chrome PID.
|
|
6
|
+
*
|
|
7
|
+
* This enables persistent browser sessions: Chrome lives independently of Node.js,
|
|
8
|
+
* and each CLI call reconnects via CDP (connectOverCDP).
|
|
9
|
+
*/
|
|
10
|
+
export interface BrowserState {
|
|
11
|
+
/** CDP WebSocket endpoint, e.g. "http://127.0.0.1:9222" */
|
|
12
|
+
endpoint: string;
|
|
13
|
+
/** Chrome process ID */
|
|
14
|
+
pid: number;
|
|
15
|
+
/** ISO timestamp when browser was started */
|
|
16
|
+
startedAt: string;
|
|
17
|
+
/** Whether browser was launched with headed mode */
|
|
18
|
+
headed: boolean;
|
|
19
|
+
/** CDP port used */
|
|
20
|
+
port: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function saveBrowserState(session: string, state: BrowserState): Promise<void>;
|
|
23
|
+
export declare function loadBrowserState(session: string): Promise<BrowserState | null>;
|
|
24
|
+
export declare function clearBrowserState(session: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if the Chrome process for a session is still alive.
|
|
27
|
+
* Sends signal 0 (no-op) to test if PID exists.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isBrowserAlive(session: string): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Get the directory path for a session's persistent data.
|
|
32
|
+
* Used by snapshot refs disk persistence.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getSessionDir(session: string): string;
|
|
35
|
+
//# sourceMappingURL=browser-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-state.d.ts","sourceRoot":"","sources":["../../src/sessions/browser-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAWD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAOpF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAStE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser State persistence — stores CDP endpoint + PID between CLI invocations.
|
|
3
|
+
*
|
|
4
|
+
* Each named session gets its own directory under ~/.imperium-crawl/sessions/{name}/
|
|
5
|
+
* with browser.json holding the CDP connection info and Chrome PID.
|
|
6
|
+
*
|
|
7
|
+
* This enables persistent browser sessions: Chrome lives independently of Node.js,
|
|
8
|
+
* and each CLI call reconnects via CDP (connectOverCDP).
|
|
9
|
+
*/
|
|
10
|
+
import fs from "node:fs/promises";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { getSessionsDir } from "../config.js";
|
|
13
|
+
function browserDir(session) {
|
|
14
|
+
const safe = session.replace(/[^a-zA-Z0-9_\-]/g, "_");
|
|
15
|
+
return path.join(getSessionsDir(), safe);
|
|
16
|
+
}
|
|
17
|
+
function browserStatePath(session) {
|
|
18
|
+
return path.join(browserDir(session), "browser.json");
|
|
19
|
+
}
|
|
20
|
+
export async function saveBrowserState(session, state) {
|
|
21
|
+
const dir = browserDir(session);
|
|
22
|
+
await fs.mkdir(dir, { recursive: true });
|
|
23
|
+
const filePath = browserStatePath(session);
|
|
24
|
+
const tmpPath = `${filePath}.${Date.now()}.tmp`;
|
|
25
|
+
await fs.writeFile(tmpPath, JSON.stringify(state, null, 2), "utf-8");
|
|
26
|
+
try {
|
|
27
|
+
await fs.rename(tmpPath, filePath);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
await fs.unlink(tmpPath).catch(() => { });
|
|
31
|
+
throw new Error(`Failed to save browser state for session "${session}"`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function loadBrowserState(session) {
|
|
35
|
+
try {
|
|
36
|
+
const data = await fs.readFile(browserStatePath(session), "utf-8");
|
|
37
|
+
return JSON.parse(data);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function clearBrowserState(session) {
|
|
44
|
+
try {
|
|
45
|
+
await fs.unlink(browserStatePath(session));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Already gone — fine
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if the Chrome process for a session is still alive.
|
|
53
|
+
* Sends signal 0 (no-op) to test if PID exists.
|
|
54
|
+
*/
|
|
55
|
+
export async function isBrowserAlive(session) {
|
|
56
|
+
const state = await loadBrowserState(session);
|
|
57
|
+
if (!state)
|
|
58
|
+
return false;
|
|
59
|
+
try {
|
|
60
|
+
process.kill(state.pid, 0);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the directory path for a session's persistent data.
|
|
69
|
+
* Used by snapshot refs disk persistence.
|
|
70
|
+
*/
|
|
71
|
+
export function getSessionDir(session) {
|
|
72
|
+
return browserDir(session);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=browser-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-state.js","sourceRoot":"","sources":["../../src/sessions/browser-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAe9C,SAAS,UAAU,CAAC,OAAe;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,KAAmB;IACzE,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,GAAG,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/sessions/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export type { StoredSession, StoredCookie } from "./types.js";
|
|
2
|
-
export { SessionManager, getSessionManager, resetSessionManager } from "./manager.js";
|
|
2
|
+
export { SessionManager, getSessionManager, resetSessionManager, isSessionValid } from "./manager.js";
|
|
3
3
|
export { encryptData, decryptData, isEncryptedPayload, ensureEncryptionKey, generateEncryptionKey, } from "./encryption.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACtG,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
package/dist/sessions/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { SessionManager, getSessionManager, resetSessionManager } from "./manager.js";
|
|
1
|
+
export { SessionManager, getSessionManager, resetSessionManager, isSessionValid } from "./manager.js";
|
|
2
2
|
export { encryptData, decryptData, isEncryptedPayload, ensureEncryptionKey, generateEncryptionKey, } from "./encryption.js";
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACtG,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie injection helper — bridges persistent browser sessions to HTTP tools.
|
|
3
|
+
*
|
|
4
|
+
* After a browser login, cookies are stored in SessionManager.
|
|
5
|
+
* This module extracts those cookies and formats them as HTTP Cookie headers,
|
|
6
|
+
* so tools like scrape, extract, readability, download can reuse the same auth.
|
|
7
|
+
*
|
|
8
|
+
* Domain/path/expiry filtering ensures only relevant cookies are sent.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Get Cookie header string for a session + URL.
|
|
12
|
+
* Returns empty string if no matching cookies found.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getSessionCookieHeader(sessionId: string, url: string): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Inject session cookies into HTTP request headers.
|
|
17
|
+
* Merges with any existing headers, adding Cookie header if session has matching cookies.
|
|
18
|
+
*/
|
|
19
|
+
export declare function injectSessionHeaders(sessionId: string, url: string, headers?: Record<string, string>): Promise<Record<string, string>>;
|
|
20
|
+
//# sourceMappingURL=inject-cookies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject-cookies.d.ts","sourceRoot":"","sources":["../../src/sessions/inject-cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6BH;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5F;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAMjC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie injection helper — bridges persistent browser sessions to HTTP tools.
|
|
3
|
+
*
|
|
4
|
+
* After a browser login, cookies are stored in SessionManager.
|
|
5
|
+
* This module extracts those cookies and formats them as HTTP Cookie headers,
|
|
6
|
+
* so tools like scrape, extract, readability, download can reuse the same auth.
|
|
7
|
+
*
|
|
8
|
+
* Domain/path/expiry filtering ensures only relevant cookies are sent.
|
|
9
|
+
*/
|
|
10
|
+
import { getSessionManager } from "./manager.js";
|
|
11
|
+
/**
|
|
12
|
+
* Build a Cookie header string from stored cookies, filtering by URL.
|
|
13
|
+
*/
|
|
14
|
+
function buildCookieHeader(cookies, url) {
|
|
15
|
+
const parsed = new URL(url);
|
|
16
|
+
const hostname = parsed.hostname;
|
|
17
|
+
const pathname = parsed.pathname;
|
|
18
|
+
const now = Date.now() / 1000;
|
|
19
|
+
return cookies
|
|
20
|
+
.filter((c) => {
|
|
21
|
+
// Domain match: ".example.com" matches "sub.example.com"
|
|
22
|
+
const cookieDomain = c.domain.startsWith(".") ? c.domain : `.${c.domain}`;
|
|
23
|
+
if (!`.${hostname}`.endsWith(cookieDomain))
|
|
24
|
+
return false;
|
|
25
|
+
// Path match
|
|
26
|
+
if (c.path && !pathname.startsWith(c.path))
|
|
27
|
+
return false;
|
|
28
|
+
// Expiry check
|
|
29
|
+
if (c.expires && c.expires > 0 && c.expires < now)
|
|
30
|
+
return false;
|
|
31
|
+
return true;
|
|
32
|
+
})
|
|
33
|
+
.map((c) => `${c.name}=${c.value}`)
|
|
34
|
+
.join("; ");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get Cookie header string for a session + URL.
|
|
38
|
+
* Returns empty string if no matching cookies found.
|
|
39
|
+
*/
|
|
40
|
+
export async function getSessionCookieHeader(sessionId, url) {
|
|
41
|
+
const session = await getSessionManager().load(sessionId);
|
|
42
|
+
if (!session?.cookies.length)
|
|
43
|
+
return "";
|
|
44
|
+
return buildCookieHeader(session.cookies, url);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Inject session cookies into HTTP request headers.
|
|
48
|
+
* Merges with any existing headers, adding Cookie header if session has matching cookies.
|
|
49
|
+
*/
|
|
50
|
+
export async function injectSessionHeaders(sessionId, url, headers = {}) {
|
|
51
|
+
const cookieHeader = await getSessionCookieHeader(sessionId, url);
|
|
52
|
+
if (cookieHeader) {
|
|
53
|
+
headers["Cookie"] = cookieHeader;
|
|
54
|
+
}
|
|
55
|
+
return headers;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=inject-cookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject-cookies.js","sourceRoot":"","sources":["../../src/sessions/inject-cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAuB,EAAE,GAAW;IAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAE9B,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,yDAAyD;QACzD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1E,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,KAAK,CAAC;QACzD,aAAa;QACb,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACzD,eAAe;QACf,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,GAAG;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;SAClC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB,EAAE,GAAW;IACzE,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,GAAW,EACX,UAAkC,EAAE;IAEpC,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -4,15 +4,45 @@ export declare class SessionManager {
|
|
|
4
4
|
private dir;
|
|
5
5
|
private encryptionKey;
|
|
6
6
|
private keyLoaded;
|
|
7
|
-
|
|
7
|
+
private refreshThreshold;
|
|
8
|
+
constructor(dir?: string, refreshThreshold?: number);
|
|
8
9
|
private getEncryptionKey;
|
|
9
10
|
private sessionPath;
|
|
10
11
|
save(id: string, cookies: StoredCookie[], url: string): Promise<void>;
|
|
11
12
|
load(id: string): Promise<StoredSession | null>;
|
|
12
13
|
delete(id: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a session exists and has at least one non-expired cookie.
|
|
16
|
+
*/
|
|
17
|
+
isLoggedIn(id: string): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Increment the action counter for a session.
|
|
20
|
+
* Call after each browser action to track session staleness.
|
|
21
|
+
*/
|
|
22
|
+
incrementActions(id: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Returns true if the session has exceeded the max actions threshold.
|
|
25
|
+
* Use before executing actions to decide whether to refresh first.
|
|
26
|
+
*/
|
|
27
|
+
needsRefresh(id: string, maxActions: number): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Returns true if the session has exceeded the configured refresh threshold.
|
|
30
|
+
* Convenience wrapper — uses the instance's refreshThreshold (default: 15).
|
|
31
|
+
*/
|
|
32
|
+
shouldRefresh(id: string): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Get the current action count for a session.
|
|
35
|
+
*/
|
|
36
|
+
getActionCount(id: string): Promise<number>;
|
|
37
|
+
/**
|
|
38
|
+
* Reset the action counter for a session (call after page refresh).
|
|
39
|
+
*/
|
|
40
|
+
resetActionCount(id: string): Promise<void>;
|
|
13
41
|
list(): Promise<string[]>;
|
|
14
42
|
}
|
|
15
43
|
export declare function getSessionManager(): SessionManager;
|
|
44
|
+
/** Check if a session has valid (non-expired) cookies */
|
|
45
|
+
export declare function isSessionValid(sessionId: string): Promise<boolean>;
|
|
16
46
|
/** Reset singleton (for testing) */
|
|
17
47
|
export declare function resetSessionManager(): void;
|
|
18
48
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/sessions/manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/sessions/manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM9D,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,GAAG,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM;YAKrC,gBAAgB;IAQ9B,OAAO,CAAC,WAAW;IAMb,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CrE,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAqC/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvC;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9C;;;OAGG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAajD;;;OAGG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMpE;;;OAGG;IACG,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjD;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKjD;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAUhC;AAMD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED,yDAAyD;AACzD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED,oCAAoC;AACpC,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
|
package/dist/sessions/manager.js
CHANGED
|
@@ -2,13 +2,17 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { getSessionsDir } from "../config.js";
|
|
4
4
|
import { encryptData, decryptData, isEncryptedPayload, ensureEncryptionKey } from "./encryption.js";
|
|
5
|
+
/** Default action count before a session is considered stale and needs refresh */
|
|
6
|
+
const DEFAULT_REFRESH_THRESHOLD = 15;
|
|
5
7
|
export class SessionManager {
|
|
6
8
|
cache = new Map();
|
|
7
9
|
dir;
|
|
8
10
|
encryptionKey;
|
|
9
11
|
keyLoaded = false;
|
|
10
|
-
|
|
12
|
+
refreshThreshold;
|
|
13
|
+
constructor(dir, refreshThreshold) {
|
|
11
14
|
this.dir = dir ?? getSessionsDir();
|
|
15
|
+
this.refreshThreshold = refreshThreshold ?? DEFAULT_REFRESH_THRESHOLD;
|
|
12
16
|
}
|
|
13
17
|
async getEncryptionKey() {
|
|
14
18
|
if (!this.keyLoaded) {
|
|
@@ -30,18 +34,35 @@ export class SessionManager {
|
|
|
30
34
|
cookies,
|
|
31
35
|
url,
|
|
32
36
|
createdAt: existing?.createdAt ?? now,
|
|
37
|
+
actionCount: existing?.actionCount,
|
|
33
38
|
updatedAt: now,
|
|
34
39
|
};
|
|
35
40
|
this.cache.set(id, session);
|
|
36
|
-
await fs.mkdir(this.dir, { recursive: true });
|
|
37
|
-
const filePath = this.sessionPath(id);
|
|
38
|
-
const tmpPath = filePath + ".tmp";
|
|
39
41
|
const key = await this.getEncryptionKey();
|
|
40
42
|
const content = key
|
|
41
43
|
? JSON.stringify(encryptData(JSON.stringify(session), key), null, 2)
|
|
42
44
|
: JSON.stringify(session, null, 2);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
// Retry loop — handles ENOENT from dir not existing or tmp file disappearing
|
|
46
|
+
const MAX_SAVE_RETRIES = 2;
|
|
47
|
+
for (let attempt = 0; attempt <= MAX_SAVE_RETRIES; attempt++) {
|
|
48
|
+
await fs.mkdir(this.dir, { recursive: true });
|
|
49
|
+
const filePath = this.sessionPath(id);
|
|
50
|
+
const tmpPath = `${filePath}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
|
|
51
|
+
try {
|
|
52
|
+
await fs.writeFile(tmpPath, content, "utf-8");
|
|
53
|
+
await fs.rename(tmpPath, filePath);
|
|
54
|
+
return; // success
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
await fs.unlink(tmpPath).catch(() => { });
|
|
58
|
+
const code = err.code;
|
|
59
|
+
if (code === "ENOENT" && attempt < MAX_SAVE_RETRIES) {
|
|
60
|
+
// Directory may have been removed between mkdir and write — retry
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
45
66
|
}
|
|
46
67
|
async load(id) {
|
|
47
68
|
if (this.cache.has(id))
|
|
@@ -84,6 +105,72 @@ export class SessionManager {
|
|
|
84
105
|
// Session didn't exist on disk — fine
|
|
85
106
|
}
|
|
86
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if a session exists and has at least one non-expired cookie.
|
|
110
|
+
*/
|
|
111
|
+
async isLoggedIn(id) {
|
|
112
|
+
const session = await this.load(id);
|
|
113
|
+
if (!session || !session.cookies.length)
|
|
114
|
+
return false;
|
|
115
|
+
const now = Date.now() / 1000; // cookies use epoch seconds
|
|
116
|
+
return session.cookies.some((c) => c.expires === undefined || c.expires === -1 || c.expires === 0 || c.expires > now);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Increment the action counter for a session.
|
|
120
|
+
* Call after each browser action to track session staleness.
|
|
121
|
+
*/
|
|
122
|
+
async incrementActions(id) {
|
|
123
|
+
const session = await this.load(id);
|
|
124
|
+
if (!session)
|
|
125
|
+
return;
|
|
126
|
+
const updated = {
|
|
127
|
+
...session,
|
|
128
|
+
actionCount: (session.actionCount ?? 0) + 1,
|
|
129
|
+
updatedAt: new Date().toISOString(),
|
|
130
|
+
};
|
|
131
|
+
this.cache.set(id, updated);
|
|
132
|
+
// Persist async — best effort, don't block action flow
|
|
133
|
+
this.save(id, updated.cookies, updated.url).catch(() => { });
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Returns true if the session has exceeded the max actions threshold.
|
|
137
|
+
* Use before executing actions to decide whether to refresh first.
|
|
138
|
+
*/
|
|
139
|
+
async needsRefresh(id, maxActions) {
|
|
140
|
+
const session = await this.load(id);
|
|
141
|
+
if (!session)
|
|
142
|
+
return false;
|
|
143
|
+
return (session.actionCount ?? 0) >= maxActions;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Returns true if the session has exceeded the configured refresh threshold.
|
|
147
|
+
* Convenience wrapper — uses the instance's refreshThreshold (default: 15).
|
|
148
|
+
*/
|
|
149
|
+
async shouldRefresh(id) {
|
|
150
|
+
return this.needsRefresh(id, this.refreshThreshold);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the current action count for a session.
|
|
154
|
+
*/
|
|
155
|
+
async getActionCount(id) {
|
|
156
|
+
const session = await this.load(id);
|
|
157
|
+
return session?.actionCount ?? 0;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Reset the action counter for a session (call after page refresh).
|
|
161
|
+
*/
|
|
162
|
+
async resetActionCount(id) {
|
|
163
|
+
const session = await this.load(id);
|
|
164
|
+
if (!session)
|
|
165
|
+
return;
|
|
166
|
+
const updated = {
|
|
167
|
+
...session,
|
|
168
|
+
actionCount: 0,
|
|
169
|
+
updatedAt: new Date().toISOString(),
|
|
170
|
+
};
|
|
171
|
+
this.cache.set(id, updated);
|
|
172
|
+
this.save(id, updated.cookies, updated.url).catch(() => { });
|
|
173
|
+
}
|
|
87
174
|
async list() {
|
|
88
175
|
try {
|
|
89
176
|
const files = await fs.readdir(this.dir);
|
|
@@ -104,6 +191,10 @@ export function getSessionManager() {
|
|
|
104
191
|
}
|
|
105
192
|
return manager;
|
|
106
193
|
}
|
|
194
|
+
/** Check if a session has valid (non-expired) cookies */
|
|
195
|
+
export async function isSessionValid(sessionId) {
|
|
196
|
+
return getSessionManager().isLoggedIn(sessionId);
|
|
197
|
+
}
|
|
107
198
|
/** Reset singleton (for testing) */
|
|
108
199
|
export function resetSessionManager() {
|
|
109
200
|
manager = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/sessions/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEpG,MAAM,OAAO,cAAc;IACjB,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IACzC,GAAG,CAAS;IACZ,aAAa,CAAqB;IAClC,SAAS,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/sessions/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Executor — multi-step skill composition.
|
|
3
|
+
*
|
|
4
|
+
* A chain skill connects multiple skills sequentially, passing outputs
|
|
5
|
+
* from one step as inputs to the next via variable references.
|
|
6
|
+
*
|
|
7
|
+
* Variable syntax in step.input values: "$step_name.field.nested[0]"
|
|
8
|
+
* Output merge: "merge($a, $b)" or just "$step_name"
|
|
9
|
+
*
|
|
10
|
+
* Example chain config:
|
|
11
|
+
* {
|
|
12
|
+
* "name": "search-and-extract",
|
|
13
|
+
* "type": "chain",
|
|
14
|
+
* "steps": [
|
|
15
|
+
* { "skill": "web-search", "input": { "query": "{{input:topic}}" }, "output": "search" },
|
|
16
|
+
* { "skill": "extract-page", "input": { "url": "$search.results[0].url" }, "output": "article",
|
|
17
|
+
* "condition": "$search.results.length > 0" }
|
|
18
|
+
* ],
|
|
19
|
+
* "output": "$article"
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
export interface ChainStep {
|
|
23
|
+
/** Skill name to run */
|
|
24
|
+
skill: string;
|
|
25
|
+
/** Input values — may reference previous step outputs with $step.field */
|
|
26
|
+
input?: Record<string, string>;
|
|
27
|
+
/** Name to store this step's output under (for downstream references) */
|
|
28
|
+
output?: string;
|
|
29
|
+
/** Optional condition — step is skipped if this evaluates to false */
|
|
30
|
+
condition?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ChainConfig {
|
|
33
|
+
name: string;
|
|
34
|
+
description: string;
|
|
35
|
+
type: "chain";
|
|
36
|
+
steps: ChainStep[];
|
|
37
|
+
/** Final output expression: "$step_name" or "merge($a, $b)" */
|
|
38
|
+
output?: string;
|
|
39
|
+
created_at: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ChainExecutionResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
steps_executed: number;
|
|
44
|
+
steps_skipped: number;
|
|
45
|
+
step_results: Array<{
|
|
46
|
+
name: string;
|
|
47
|
+
output_key: string;
|
|
48
|
+
skipped?: boolean;
|
|
49
|
+
error?: string;
|
|
50
|
+
}>;
|
|
51
|
+
output: unknown;
|
|
52
|
+
error?: string;
|
|
53
|
+
}
|
|
54
|
+
export declare class ChainExecutor {
|
|
55
|
+
/**
|
|
56
|
+
* Execute a chain, running each step in order.
|
|
57
|
+
* Step outputs are accumulated in `variables` and available to downstream steps.
|
|
58
|
+
*/
|
|
59
|
+
execute(config: ChainConfig, initialParams?: Record<string, string>): Promise<ChainExecutionResult>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/skills/chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,MAAM,WAAW,SAAS;IACxB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AA4ED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACxB;;;OAGG;IACG,OAAO,CACX,MAAM,EAAE,WAAW,EACnB,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACzC,OAAO,CAAC,oBAAoB,CAAC;CAmGjC"}
|