agent-web-interface 4.4.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/browser/browser-session-config.d.ts +33 -0
- package/dist/src/browser/browser-session-config.d.ts.map +1 -0
- package/dist/src/browser/browser-session-config.js +24 -0
- package/dist/src/browser/browser-session-config.js.map +1 -0
- package/dist/src/browser/ensure-browser.d.ts +12 -27
- package/dist/src/browser/ensure-browser.d.ts.map +1 -1
- package/dist/src/browser/ensure-browser.js +104 -37
- package/dist/src/browser/ensure-browser.js.map +1 -1
- package/dist/src/browser/index.d.ts +2 -1
- package/dist/src/browser/index.d.ts.map +1 -1
- package/dist/src/browser/index.js +1 -0
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/session-manager.d.ts +20 -0
- package/dist/src/browser/session-manager.d.ts.map +1 -1
- package/dist/src/browser/session-manager.js +122 -17
- package/dist/src/browser/session-manager.js.map +1 -1
- package/dist/src/browser/session-manager.types.d.ts +14 -2
- package/dist/src/browser/session-manager.types.d.ts.map +1 -1
- package/dist/src/browser/session-manager.types.js +5 -1
- package/dist/src/browser/session-manager.types.js.map +1 -1
- package/dist/src/cli/args.d.ts +12 -18
- package/dist/src/cli/args.d.ts.map +1 -1
- package/dist/src/cli/args.js +35 -40
- package/dist/src/cli/args.js.map +1 -1
- package/dist/src/form/constraint-extraction.d.ts +5 -0
- package/dist/src/form/constraint-extraction.d.ts.map +1 -1
- package/dist/src/form/constraint-extraction.js +13 -6
- package/dist/src/form/constraint-extraction.js.map +1 -1
- package/dist/src/form/field-extractor.d.ts.map +1 -1
- package/dist/src/form/field-extractor.js +14 -7
- package/dist/src/form/field-extractor.js.map +1 -1
- package/dist/src/form/form-state.d.ts.map +1 -1
- package/dist/src/form/form-state.js +16 -4
- package/dist/src/form/form-state.js.map +1 -1
- package/dist/src/gateway/http-gateway.d.ts +56 -0
- package/dist/src/gateway/http-gateway.d.ts.map +1 -0
- package/dist/src/gateway/http-gateway.js +229 -0
- package/dist/src/gateway/http-gateway.js.map +1 -0
- package/dist/src/gateway/json-rpc-errors.d.ts +6 -0
- package/dist/src/gateway/json-rpc-errors.d.ts.map +1 -0
- package/dist/src/gateway/json-rpc-errors.js +11 -0
- package/dist/src/gateway/json-rpc-errors.js.map +1 -0
- package/dist/src/gateway/session-router.d.ts +80 -0
- package/dist/src/gateway/session-router.d.ts.map +1 -0
- package/dist/src/gateway/session-router.js +177 -0
- package/dist/src/gateway/session-router.js.map +1 -0
- package/dist/src/http-entry.d.ts +20 -0
- package/dist/src/http-entry.d.ts.map +1 -0
- package/dist/src/http-entry.js +112 -0
- package/dist/src/http-entry.js.map +1 -0
- package/dist/src/index.d.ts +1 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +25 -232
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/text-utils.d.ts +0 -24
- package/dist/src/lib/text-utils.d.ts.map +1 -1
- package/dist/src/lib/text-utils.js +2 -38
- package/dist/src/lib/text-utils.js.map +1 -1
- package/dist/src/observation/eid-linker.d.ts.map +1 -1
- package/dist/src/observation/eid-linker.js +1 -21
- package/dist/src/observation/eid-linker.js.map +1 -1
- package/dist/src/server/index.d.ts +0 -1
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +0 -1
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/server/mcp-server.d.ts +6 -2
- package/dist/src/server/mcp-server.d.ts.map +1 -1
- package/dist/src/server/mcp-server.js +3 -91
- package/dist/src/server/mcp-server.js.map +1 -1
- package/dist/src/server/server-config.d.ts +4 -20
- package/dist/src/server/server-config.d.ts.map +1 -1
- package/dist/src/server/server-config.js +6 -50
- package/dist/src/server/server-config.js.map +1 -1
- package/dist/src/server/tool-registrar.types.d.ts +25 -0
- package/dist/src/server/tool-registrar.types.d.ts.map +1 -0
- package/dist/src/server/tool-registrar.types.js +10 -0
- package/dist/src/server/tool-registrar.types.js.map +1 -0
- package/dist/src/server/tool-result-handler.d.ts +61 -0
- package/dist/src/server/tool-result-handler.d.ts.map +1 -0
- package/dist/src/server/tool-result-handler.js +137 -0
- package/dist/src/server/tool-result-handler.js.map +1 -0
- package/dist/src/session/session-controller.d.ts +123 -0
- package/dist/src/session/session-controller.d.ts.map +1 -0
- package/dist/src/session/session-controller.js +273 -0
- package/dist/src/session/session-controller.js.map +1 -0
- package/dist/src/shared/services/index.d.ts +0 -2
- package/dist/src/shared/services/index.d.ts.map +1 -1
- package/dist/src/shared/services/index.js +0 -2
- package/dist/src/shared/services/index.js.map +1 -1
- package/dist/src/shared/version.d.ts +10 -0
- package/dist/src/shared/version.d.ts.map +1 -0
- package/dist/src/shared/version.js +32 -0
- package/dist/src/shared/version.js.map +1 -0
- package/dist/src/snapshot/element-resolver.d.ts +3 -2
- package/dist/src/snapshot/element-resolver.d.ts.map +1 -1
- package/dist/src/snapshot/element-resolver.js +83 -8
- package/dist/src/snapshot/element-resolver.js.map +1 -1
- package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/attribute-extractor.js +4 -0
- package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -1
- package/dist/src/snapshot/extractors/layout-extractor.d.ts +9 -7
- package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/layout-extractor.js +34 -19
- package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -1
- package/dist/src/snapshot/extractors/state-extractor.d.ts +2 -2
- package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/state-extractor.js +22 -2
- package/dist/src/snapshot/extractors/state-extractor.js.map +1 -1
- package/dist/src/snapshot/extractors/types.d.ts +6 -0
- package/dist/src/snapshot/extractors/types.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/types.js.map +1 -1
- package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
- package/dist/src/snapshot/snapshot-compiler.js +15 -2
- package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
- package/dist/src/snapshot/snapshot.types.d.ts +10 -1
- package/dist/src/snapshot/snapshot.types.d.ts.map +1 -1
- package/dist/src/snapshot/snapshot.types.js.map +1 -1
- package/dist/src/state/actionables-filter.d.ts.map +1 -1
- package/dist/src/state/actionables-filter.js +7 -3
- package/dist/src/state/actionables-filter.js.map +1 -1
- package/dist/src/state/atoms-extractor.d.ts.map +1 -1
- package/dist/src/state/atoms-extractor.js +3 -23
- package/dist/src/state/atoms-extractor.js.map +1 -1
- package/dist/src/state/diff-engine.d.ts.map +1 -1
- package/dist/src/state/diff-engine.js +6 -33
- package/dist/src/state/diff-engine.js.map +1 -1
- package/dist/src/state/element-identity.d.ts +3 -6
- package/dist/src/state/element-identity.d.ts.map +1 -1
- package/dist/src/state/element-identity.js +10 -7
- package/dist/src/state/element-identity.js.map +1 -1
- package/dist/src/state/element-ref.types.d.ts +5 -27
- package/dist/src/state/element-ref.types.d.ts.map +1 -1
- package/dist/src/state/state-manager.d.ts.map +1 -1
- package/dist/src/state/state-manager.js +3 -1
- package/dist/src/state/state-manager.js.map +1 -1
- package/dist/src/state/state-renderer.d.ts.map +1 -1
- package/dist/src/state/state-renderer.js +3 -1
- package/dist/src/state/state-renderer.js.map +1 -1
- package/dist/src/state/types.d.ts +2 -1
- package/dist/src/state/types.d.ts.map +1 -1
- package/dist/src/state/url-sanitization.d.ts +1 -1
- package/dist/src/state/url-sanitization.d.ts.map +1 -1
- package/dist/src/state/url-sanitization.js +29 -13
- package/dist/src/state/url-sanitization.js.map +1 -1
- package/dist/src/tools/action-context.d.ts +6 -11
- package/dist/src/tools/action-context.d.ts.map +1 -1
- package/dist/src/tools/action-context.js +10 -19
- package/dist/src/tools/action-context.js.map +1 -1
- package/dist/src/tools/action-stabilization.d.ts.map +1 -1
- package/dist/src/tools/action-stabilization.js +6 -0
- package/dist/src/tools/action-stabilization.js.map +1 -1
- package/dist/src/tools/browser-tools.d.ts +3 -2
- package/dist/src/tools/browser-tools.d.ts.map +1 -1
- package/dist/src/tools/browser-tools.js +5 -3
- package/dist/src/tools/browser-tools.js.map +1 -1
- package/dist/src/tools/canvas-tools.d.ts +2 -1
- package/dist/src/tools/canvas-tools.d.ts.map +1 -1
- package/dist/src/tools/canvas-tools.js +5 -7
- package/dist/src/tools/canvas-tools.js.map +1 -1
- package/dist/src/tools/errors.d.ts +2 -34
- package/dist/src/tools/errors.d.ts.map +1 -1
- package/dist/src/tools/errors.js +1 -44
- package/dist/src/tools/errors.js.map +1 -1
- package/dist/src/tools/execute-action.d.ts +4 -3
- package/dist/src/tools/execute-action.d.ts.map +1 -1
- package/dist/src/tools/execute-action.js +32 -23
- package/dist/src/tools/execute-action.js.map +1 -1
- package/dist/src/tools/form-tools.d.ts +3 -8
- package/dist/src/tools/form-tools.d.ts.map +1 -1
- package/dist/src/tools/form-tools.js +38 -18
- package/dist/src/tools/form-tools.js.map +1 -1
- package/dist/src/tools/index.d.ts +6 -6
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +7 -10
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/interaction-tools.d.ts +6 -5
- package/dist/src/tools/interaction-tools.d.ts.map +1 -1
- package/dist/src/tools/interaction-tools.js +29 -32
- package/dist/src/tools/interaction-tools.js.map +1 -1
- package/dist/src/tools/navigation-tools.d.ts +7 -13
- package/dist/src/tools/navigation-tools.d.ts.map +1 -1
- package/dist/src/tools/navigation-tools.js +52 -59
- package/dist/src/tools/navigation-tools.js.map +1 -1
- package/dist/src/tools/observation-tools.d.ts +6 -5
- package/dist/src/tools/observation-tools.d.ts.map +1 -1
- package/dist/src/tools/observation-tools.js +30 -34
- package/dist/src/tools/observation-tools.js.map +1 -1
- package/dist/src/tools/readability-tools.d.ts +16 -0
- package/dist/src/tools/readability-tools.d.ts.map +1 -0
- package/dist/src/tools/readability-tools.js +45 -0
- package/dist/src/tools/readability-tools.js.map +1 -0
- package/dist/src/tools/response-builder.d.ts +20 -32
- package/dist/src/tools/response-builder.d.ts.map +1 -1
- package/dist/src/tools/response-builder.js +31 -47
- package/dist/src/tools/response-builder.js.map +1 -1
- package/dist/src/tools/stale-element-retry.d.ts.map +1 -1
- package/dist/src/tools/stale-element-retry.js +37 -2
- package/dist/src/tools/stale-element-retry.js.map +1 -1
- package/dist/src/tools/tool-context.d.ts +4 -36
- package/dist/src/tools/tool-context.d.ts.map +1 -1
- package/dist/src/tools/tool-context.js +6 -75
- package/dist/src/tools/tool-context.js.map +1 -1
- package/dist/src/tools/tool-context.types.d.ts +141 -0
- package/dist/src/tools/tool-context.types.d.ts.map +1 -0
- package/dist/src/tools/tool-context.types.js +11 -0
- package/dist/src/tools/tool-context.types.js.map +1 -0
- package/dist/src/tools/tool-registration.d.ts +25 -0
- package/dist/src/tools/tool-registration.d.ts.map +1 -0
- package/dist/src/tools/tool-registration.js +180 -0
- package/dist/src/tools/tool-registration.js.map +1 -0
- package/dist/src/tools/tool-schemas.d.ts +88 -1947
- package/dist/src/tools/tool-schemas.d.ts.map +1 -1
- package/dist/src/tools/tool-schemas.js +21 -302
- package/dist/src/tools/tool-schemas.js.map +1 -1
- package/dist/src/tools/viewport-tools.d.ts +4 -3
- package/dist/src/tools/viewport-tools.d.ts.map +1 -1
- package/dist/src/tools/viewport-tools.js +17 -21
- package/dist/src/tools/viewport-tools.js.map +1 -1
- package/dist/src/worker/chrome-worker-process.d.ts +4 -0
- package/dist/src/worker/chrome-worker-process.d.ts.map +1 -1
- package/dist/src/worker/chrome-worker-process.js +1 -1
- package/dist/src/worker/chrome-worker-process.js.map +1 -1
- package/package.json +7 -3
- package/dist/src/factpack/action-selector.d.ts +0 -36
- package/dist/src/factpack/action-selector.d.ts.map +0 -1
- package/dist/src/factpack/action-selector.js +0 -367
- package/dist/src/factpack/action-selector.js.map +0 -1
- package/dist/src/factpack/dialog-detector.d.ts +0 -19
- package/dist/src/factpack/dialog-detector.d.ts.map +0 -1
- package/dist/src/factpack/dialog-detector.js +0 -354
- package/dist/src/factpack/dialog-detector.js.map +0 -1
- package/dist/src/factpack/form-detector.d.ts +0 -28
- package/dist/src/factpack/form-detector.d.ts.map +0 -1
- package/dist/src/factpack/form-detector.js +0 -555
- package/dist/src/factpack/form-detector.js.map +0 -1
- package/dist/src/factpack/index.d.ts +0 -32
- package/dist/src/factpack/index.d.ts.map +0 -1
- package/dist/src/factpack/index.js +0 -73
- package/dist/src/factpack/index.js.map +0 -1
- package/dist/src/factpack/page-classifier.d.ts +0 -22
- package/dist/src/factpack/page-classifier.d.ts.map +0 -1
- package/dist/src/factpack/page-classifier.js +0 -526
- package/dist/src/factpack/page-classifier.js.map +0 -1
- package/dist/src/factpack/types.d.ts +0 -307
- package/dist/src/factpack/types.d.ts.map +0 -1
- package/dist/src/factpack/types.js +0 -12
- package/dist/src/factpack/types.js.map +0 -1
- package/dist/src/lib/constants.d.ts +0 -27
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -63
- package/dist/src/lib/constants.js.map +0 -1
- package/dist/src/lib/index.d.ts +0 -12
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -17
- package/dist/src/lib/index.js.map +0 -1
- package/dist/src/lib/regions.d.ts +0 -29
- package/dist/src/lib/regions.d.ts.map +0 -1
- package/dist/src/lib/regions.js +0 -93
- package/dist/src/lib/regions.js.map +0 -1
- package/dist/src/lib/scoring.d.ts +0 -47
- package/dist/src/lib/scoring.d.ts.map +0 -1
- package/dist/src/lib/scoring.js +0 -79
- package/dist/src/lib/scoring.js.map +0 -1
- package/dist/src/lib/selectors.d.ts +0 -42
- package/dist/src/lib/selectors.d.ts.map +0 -1
- package/dist/src/lib/selectors.js +0 -138
- package/dist/src/lib/selectors.js.map +0 -1
- package/dist/src/renderer/budget-manager.d.ts +0 -46
- package/dist/src/renderer/budget-manager.d.ts.map +0 -1
- package/dist/src/renderer/budget-manager.js +0 -133
- package/dist/src/renderer/budget-manager.js.map +0 -1
- package/dist/src/renderer/constants.d.ts +0 -38
- package/dist/src/renderer/constants.d.ts.map +0 -1
- package/dist/src/renderer/constants.js +0 -29
- package/dist/src/renderer/constants.js.map +0 -1
- package/dist/src/renderer/index.d.ts +0 -12
- package/dist/src/renderer/index.d.ts.map +0 -1
- package/dist/src/renderer/index.js +0 -16
- package/dist/src/renderer/index.js.map +0 -1
- package/dist/src/renderer/section-renderers.d.ts +0 -42
- package/dist/src/renderer/section-renderers.d.ts.map +0 -1
- package/dist/src/renderer/section-renderers.js +0 -252
- package/dist/src/renderer/section-renderers.js.map +0 -1
- package/dist/src/renderer/token-counter.d.ts +0 -45
- package/dist/src/renderer/token-counter.d.ts.map +0 -1
- package/dist/src/renderer/token-counter.js +0 -65
- package/dist/src/renderer/token-counter.js.map +0 -1
- package/dist/src/renderer/types.d.ts +0 -71
- package/dist/src/renderer/types.d.ts.map +0 -1
- package/dist/src/renderer/types.js +0 -7
- package/dist/src/renderer/types.js.map +0 -1
- package/dist/src/renderer/xml-renderer.d.ts +0 -42
- package/dist/src/renderer/xml-renderer.d.ts.map +0 -1
- package/dist/src/renderer/xml-renderer.js +0 -103
- package/dist/src/renderer/xml-renderer.js.map +0 -1
- package/dist/src/server/session-store.d.ts +0 -163
- package/dist/src/server/session-store.d.ts.map +0 -1
- package/dist/src/server/session-store.js +0 -248
- package/dist/src/server/session-store.js.map +0 -1
- package/dist/src/session/session-worker-binding.d.ts +0 -57
- package/dist/src/session/session-worker-binding.d.ts.map +0 -1
- package/dist/src/session/session-worker-binding.js +0 -109
- package/dist/src/session/session-worker-binding.js.map +0 -1
- package/dist/src/shared/services/dom-transformer.service.d.ts +0 -71
- package/dist/src/shared/services/dom-transformer.service.d.ts.map +0 -1
- package/dist/src/shared/services/dom-transformer.service.js +0 -190
- package/dist/src/shared/services/dom-transformer.service.js.map +0 -1
- package/dist/src/shared/services/selector-builder.service.d.ts +0 -53
- package/dist/src/shared/services/selector-builder.service.d.ts.map +0 -1
- package/dist/src/shared/services/selector-builder.service.js +0 -240
- package/dist/src/shared/services/selector-builder.service.js.map +0 -1
- package/dist/src/state/constants.d.ts +0 -125
- package/dist/src/state/constants.d.ts.map +0 -1
- package/dist/src/state/constants.js +0 -131
- package/dist/src/state/constants.js.map +0 -1
- package/dist/src/tools/state-manager-registry.d.ts +0 -26
- package/dist/src/tools/state-manager-registry.d.ts.map +0 -1
- package/dist/src/tools/state-manager-registry.js +0 -39
- package/dist/src/tools/state-manager-registry.js.map +0 -1
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session Store
|
|
3
|
-
*
|
|
4
|
-
* Tracks active sessions per MCP client (tenant isolation).
|
|
5
|
-
* Supports optional TTL-based auto-cleanup of expired sessions.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Options for session store configuration
|
|
9
|
-
*/
|
|
10
|
-
export interface SessionStoreOptions {
|
|
11
|
-
/** Session TTL in milliseconds (default: 30 minutes, 0 = no expiry) */
|
|
12
|
-
ttlMs?: number;
|
|
13
|
-
/** Maximum sessions allowed (default: unlimited) */
|
|
14
|
-
maxSessions?: number;
|
|
15
|
-
/** Enable automatic cleanup of expired sessions (default: false) */
|
|
16
|
-
autoCleanup?: boolean;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Represents a tenant session
|
|
20
|
-
*/
|
|
21
|
-
export interface ClientInfo {
|
|
22
|
-
name: string;
|
|
23
|
-
version: string;
|
|
24
|
-
}
|
|
25
|
-
export interface TenantSession {
|
|
26
|
-
/** Unique session identifier */
|
|
27
|
-
session_id: string;
|
|
28
|
-
/** Tenant/client identifier */
|
|
29
|
-
tenant_id: string;
|
|
30
|
-
/** Page IDs associated with this session */
|
|
31
|
-
page_ids: Set<string>;
|
|
32
|
-
/** When the session was created */
|
|
33
|
-
created_at: Date;
|
|
34
|
-
/** When the session was last accessed */
|
|
35
|
-
last_accessed_at: Date;
|
|
36
|
-
/** When the session expires (null = never) */
|
|
37
|
-
expires_at: Date | null;
|
|
38
|
-
/** MCP client info from initialization handshake */
|
|
39
|
-
client_info?: ClientInfo;
|
|
40
|
-
/** Isolated browser context for this session */
|
|
41
|
-
browser_context?: import('puppeteer-core').BrowserContext;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* In-memory session store for tenant isolation
|
|
45
|
-
*/
|
|
46
|
-
export declare class SessionStore {
|
|
47
|
-
private readonly sessions;
|
|
48
|
-
private readonly ttlMs;
|
|
49
|
-
private readonly maxSessions;
|
|
50
|
-
private cleanupInterval;
|
|
51
|
-
constructor(options?: SessionStoreOptions);
|
|
52
|
-
/**
|
|
53
|
-
* Create a new session for a tenant
|
|
54
|
-
*
|
|
55
|
-
* @param tenant_id - The tenant/client identifier
|
|
56
|
-
* @returns The new session_id
|
|
57
|
-
* @throws Error if max sessions limit reached
|
|
58
|
-
*/
|
|
59
|
-
createSession(tenant_id: string, clientInfo?: ClientInfo): string;
|
|
60
|
-
/**
|
|
61
|
-
* Get a session by its ID.
|
|
62
|
-
* Automatically refreshes TTL and checks for expiration.
|
|
63
|
-
*
|
|
64
|
-
* @param session_id - The session identifier
|
|
65
|
-
* @returns TenantSession if found and not expired, undefined otherwise
|
|
66
|
-
*/
|
|
67
|
-
getSession(session_id: string): TenantSession | undefined;
|
|
68
|
-
/**
|
|
69
|
-
* Get the default session when only one exists.
|
|
70
|
-
* Returns undefined when no sessions exist.
|
|
71
|
-
* Throws when multiple sessions exist (caller must provide explicit session_id).
|
|
72
|
-
*/
|
|
73
|
-
getDefaultSession(): TenantSession | undefined;
|
|
74
|
-
/**
|
|
75
|
-
* Add a page to a session
|
|
76
|
-
*
|
|
77
|
-
* @param session_id - The session identifier
|
|
78
|
-
* @param page_id - The page identifier to add
|
|
79
|
-
*/
|
|
80
|
-
addPage(session_id: string, page_id: string): void;
|
|
81
|
-
/**
|
|
82
|
-
* Remove a page from a session
|
|
83
|
-
*
|
|
84
|
-
* @param session_id - The session identifier
|
|
85
|
-
* @param page_id - The page identifier to remove
|
|
86
|
-
*/
|
|
87
|
-
removePage(session_id: string, page_id: string): void;
|
|
88
|
-
/**
|
|
89
|
-
* Get all pages for a session
|
|
90
|
-
*
|
|
91
|
-
* @param session_id - The session identifier
|
|
92
|
-
* @returns Array of page_ids (empty if session not found)
|
|
93
|
-
*/
|
|
94
|
-
getPages(session_id: string): string[];
|
|
95
|
-
/**
|
|
96
|
-
* Destroy a session completely.
|
|
97
|
-
* If the session has an isolated browser context, it will be closed (best-effort).
|
|
98
|
-
*
|
|
99
|
-
* @param session_id - The session identifier
|
|
100
|
-
*/
|
|
101
|
-
destroySession(session_id: string): Promise<void>;
|
|
102
|
-
/**
|
|
103
|
-
* List all active sessions
|
|
104
|
-
*
|
|
105
|
-
* @returns Array of all TenantSession objects
|
|
106
|
-
*/
|
|
107
|
-
listSessions(): TenantSession[];
|
|
108
|
-
/**
|
|
109
|
-
* Get sessions for a specific tenant
|
|
110
|
-
*
|
|
111
|
-
* @param tenant_id - The tenant identifier
|
|
112
|
-
* @returns Array of sessions for this tenant
|
|
113
|
-
*/
|
|
114
|
-
getSessionsByTenant(tenant_id: string): TenantSession[];
|
|
115
|
-
/**
|
|
116
|
-
* Get the total number of sessions
|
|
117
|
-
*
|
|
118
|
-
* @returns Session count
|
|
119
|
-
*/
|
|
120
|
-
sessionCount(): number;
|
|
121
|
-
/**
|
|
122
|
-
* Check if a session exists
|
|
123
|
-
*
|
|
124
|
-
* @param session_id - The session identifier
|
|
125
|
-
* @returns true if session exists
|
|
126
|
-
*/
|
|
127
|
-
hasSession(session_id: string): boolean;
|
|
128
|
-
/**
|
|
129
|
-
* Clear all sessions (for testing or shutdown)
|
|
130
|
-
*/
|
|
131
|
-
clear(): void;
|
|
132
|
-
/**
|
|
133
|
-
* Stop automatic cleanup timer
|
|
134
|
-
*/
|
|
135
|
-
stopAutoCleanup(): void;
|
|
136
|
-
/**
|
|
137
|
-
* Start automatic cleanup of expired sessions
|
|
138
|
-
*/
|
|
139
|
-
startAutoCleanup(): void;
|
|
140
|
-
/**
|
|
141
|
-
* Manually clean up all expired sessions
|
|
142
|
-
*
|
|
143
|
-
* @returns Number of sessions removed
|
|
144
|
-
*/
|
|
145
|
-
cleanupExpired(): number;
|
|
146
|
-
/**
|
|
147
|
-
* Check if a session is expired
|
|
148
|
-
*/
|
|
149
|
-
private isExpired;
|
|
150
|
-
/**
|
|
151
|
-
* Touch a session to refresh its TTL
|
|
152
|
-
*/
|
|
153
|
-
private touchSession;
|
|
154
|
-
/**
|
|
155
|
-
* Get the configured TTL in milliseconds
|
|
156
|
-
*/
|
|
157
|
-
getTtlMs(): number;
|
|
158
|
-
/**
|
|
159
|
-
* Get the configured max sessions limit
|
|
160
|
-
*/
|
|
161
|
-
getMaxSessions(): number;
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../../src/server/session-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oEAAoE;IACpE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IAEnB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,4CAA4C;IAC5C,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAEtB,mCAAmC;IACnC,UAAU,EAAE,IAAI,CAAC;IAEjB,yCAAyC;IACzC,gBAAgB,EAAE,IAAI,CAAC;IAEvB,8CAA8C;IAC9C,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IAExB,oDAAoD;IACpD,WAAW,CAAC,EAAE,UAAU,CAAC;IAEzB,gDAAgD;IAChD,eAAe,CAAC,EAAE,OAAO,gBAAgB,EAAE,cAAc,CAAC;CAC3D;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,eAAe,CAA+B;gBAE1C,OAAO,GAAE,mBAAwB;IAS7C;;;;;;OAMG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM;IAwBjE;;;;;;OAMG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAezD;;;;OAIG;IACH,iBAAiB,IAAI,aAAa,GAAG,SAAS;IAU9C;;;;;OAKG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAOlD;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAOrD;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAQtC;;;;;OAKG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD;;;;OAIG;IACH,YAAY,IAAI,aAAa,EAAE;IAI/B;;;;;OAKG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;IAIvD;;;;OAIG;IACH,YAAY,IAAI,MAAM;IAItB;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,eAAe,IAAI,IAAI;IAOvB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAUxB;;;;OAIG;IACH,cAAc,IAAI,MAAM;IAcxB;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session Store
|
|
3
|
-
*
|
|
4
|
-
* Tracks active sessions per MCP client (tenant isolation).
|
|
5
|
-
* Supports optional TTL-based auto-cleanup of expired sessions.
|
|
6
|
-
*/
|
|
7
|
-
import { randomUUID } from 'crypto';
|
|
8
|
-
/** Default TTL in milliseconds (30 minutes) */
|
|
9
|
-
const DEFAULT_TTL_MS = 30 * 60 * 1000;
|
|
10
|
-
/** Cleanup interval in milliseconds (5 minutes) */
|
|
11
|
-
const CLEANUP_INTERVAL_MS = 5 * 60 * 1000;
|
|
12
|
-
/**
|
|
13
|
-
* In-memory session store for tenant isolation
|
|
14
|
-
*/
|
|
15
|
-
export class SessionStore {
|
|
16
|
-
sessions = new Map();
|
|
17
|
-
ttlMs;
|
|
18
|
-
maxSessions;
|
|
19
|
-
cleanupInterval = null;
|
|
20
|
-
constructor(options = {}) {
|
|
21
|
-
this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
22
|
-
this.maxSessions = options.maxSessions ?? Infinity;
|
|
23
|
-
if (options.autoCleanup && this.ttlMs > 0) {
|
|
24
|
-
this.startAutoCleanup();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Create a new session for a tenant
|
|
29
|
-
*
|
|
30
|
-
* @param tenant_id - The tenant/client identifier
|
|
31
|
-
* @returns The new session_id
|
|
32
|
-
* @throws Error if max sessions limit reached
|
|
33
|
-
*/
|
|
34
|
-
createSession(tenant_id, clientInfo) {
|
|
35
|
-
// Check max sessions limit
|
|
36
|
-
if (this.sessions.size >= this.maxSessions) {
|
|
37
|
-
throw new Error(`Maximum sessions limit reached: ${this.maxSessions}`);
|
|
38
|
-
}
|
|
39
|
-
const session_id = `session-${randomUUID()}`;
|
|
40
|
-
const now = new Date();
|
|
41
|
-
const session = {
|
|
42
|
-
session_id,
|
|
43
|
-
tenant_id,
|
|
44
|
-
page_ids: new Set(),
|
|
45
|
-
created_at: now,
|
|
46
|
-
last_accessed_at: now,
|
|
47
|
-
expires_at: this.ttlMs > 0 ? new Date(now.getTime() + this.ttlMs) : null,
|
|
48
|
-
client_info: clientInfo,
|
|
49
|
-
};
|
|
50
|
-
this.sessions.set(session_id, session);
|
|
51
|
-
return session_id;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Get a session by its ID.
|
|
55
|
-
* Automatically refreshes TTL and checks for expiration.
|
|
56
|
-
*
|
|
57
|
-
* @param session_id - The session identifier
|
|
58
|
-
* @returns TenantSession if found and not expired, undefined otherwise
|
|
59
|
-
*/
|
|
60
|
-
getSession(session_id) {
|
|
61
|
-
const session = this.sessions.get(session_id);
|
|
62
|
-
if (!session)
|
|
63
|
-
return undefined;
|
|
64
|
-
// Check if expired
|
|
65
|
-
if (this.isExpired(session)) {
|
|
66
|
-
this.sessions.delete(session_id);
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
// Touch session to refresh TTL
|
|
70
|
-
this.touchSession(session);
|
|
71
|
-
return session;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Get the default session when only one exists.
|
|
75
|
-
* Returns undefined when no sessions exist.
|
|
76
|
-
* Throws when multiple sessions exist (caller must provide explicit session_id).
|
|
77
|
-
*/
|
|
78
|
-
getDefaultSession() {
|
|
79
|
-
if (this.sessions.size === 0)
|
|
80
|
-
return undefined;
|
|
81
|
-
if (this.sessions.size > 1) {
|
|
82
|
-
throw new Error(`Multiple sessions active (${this.sessions.size}). Provide an explicit session_id.`);
|
|
83
|
-
}
|
|
84
|
-
return this.sessions.values().next().value;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Add a page to a session
|
|
88
|
-
*
|
|
89
|
-
* @param session_id - The session identifier
|
|
90
|
-
* @param page_id - The page identifier to add
|
|
91
|
-
*/
|
|
92
|
-
addPage(session_id, page_id) {
|
|
93
|
-
const session = this.sessions.get(session_id);
|
|
94
|
-
if (session) {
|
|
95
|
-
session.page_ids.add(page_id);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Remove a page from a session
|
|
100
|
-
*
|
|
101
|
-
* @param session_id - The session identifier
|
|
102
|
-
* @param page_id - The page identifier to remove
|
|
103
|
-
*/
|
|
104
|
-
removePage(session_id, page_id) {
|
|
105
|
-
const session = this.sessions.get(session_id);
|
|
106
|
-
if (session) {
|
|
107
|
-
session.page_ids.delete(page_id);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Get all pages for a session
|
|
112
|
-
*
|
|
113
|
-
* @param session_id - The session identifier
|
|
114
|
-
* @returns Array of page_ids (empty if session not found)
|
|
115
|
-
*/
|
|
116
|
-
getPages(session_id) {
|
|
117
|
-
const session = this.sessions.get(session_id);
|
|
118
|
-
if (!session) {
|
|
119
|
-
return [];
|
|
120
|
-
}
|
|
121
|
-
return Array.from(session.page_ids);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Destroy a session completely.
|
|
125
|
-
* If the session has an isolated browser context, it will be closed (best-effort).
|
|
126
|
-
*
|
|
127
|
-
* @param session_id - The session identifier
|
|
128
|
-
*/
|
|
129
|
-
async destroySession(session_id) {
|
|
130
|
-
const session = this.sessions.get(session_id);
|
|
131
|
-
if (session?.browser_context) {
|
|
132
|
-
try {
|
|
133
|
-
await session.browser_context.close();
|
|
134
|
-
}
|
|
135
|
-
catch {
|
|
136
|
-
/* best effort */
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
this.sessions.delete(session_id);
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* List all active sessions
|
|
143
|
-
*
|
|
144
|
-
* @returns Array of all TenantSession objects
|
|
145
|
-
*/
|
|
146
|
-
listSessions() {
|
|
147
|
-
return Array.from(this.sessions.values());
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Get sessions for a specific tenant
|
|
151
|
-
*
|
|
152
|
-
* @param tenant_id - The tenant identifier
|
|
153
|
-
* @returns Array of sessions for this tenant
|
|
154
|
-
*/
|
|
155
|
-
getSessionsByTenant(tenant_id) {
|
|
156
|
-
return this.listSessions().filter((s) => s.tenant_id === tenant_id);
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Get the total number of sessions
|
|
160
|
-
*
|
|
161
|
-
* @returns Session count
|
|
162
|
-
*/
|
|
163
|
-
sessionCount() {
|
|
164
|
-
return this.sessions.size;
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Check if a session exists
|
|
168
|
-
*
|
|
169
|
-
* @param session_id - The session identifier
|
|
170
|
-
* @returns true if session exists
|
|
171
|
-
*/
|
|
172
|
-
hasSession(session_id) {
|
|
173
|
-
return this.sessions.has(session_id);
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Clear all sessions (for testing or shutdown)
|
|
177
|
-
*/
|
|
178
|
-
clear() {
|
|
179
|
-
this.sessions.clear();
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Stop automatic cleanup timer
|
|
183
|
-
*/
|
|
184
|
-
stopAutoCleanup() {
|
|
185
|
-
if (this.cleanupInterval) {
|
|
186
|
-
clearInterval(this.cleanupInterval);
|
|
187
|
-
this.cleanupInterval = null;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Start automatic cleanup of expired sessions
|
|
192
|
-
*/
|
|
193
|
-
startAutoCleanup() {
|
|
194
|
-
this.stopAutoCleanup();
|
|
195
|
-
this.cleanupInterval = setInterval(() => {
|
|
196
|
-
this.cleanupExpired();
|
|
197
|
-
}, CLEANUP_INTERVAL_MS);
|
|
198
|
-
// Don't keep the process alive just for cleanup
|
|
199
|
-
this.cleanupInterval.unref();
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Manually clean up all expired sessions
|
|
203
|
-
*
|
|
204
|
-
* @returns Number of sessions removed
|
|
205
|
-
*/
|
|
206
|
-
cleanupExpired() {
|
|
207
|
-
let removed = 0;
|
|
208
|
-
const now = new Date();
|
|
209
|
-
for (const [session_id, session] of this.sessions) {
|
|
210
|
-
if (session.expires_at && session.expires_at <= now) {
|
|
211
|
-
this.sessions.delete(session_id);
|
|
212
|
-
removed++;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return removed;
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Check if a session is expired
|
|
219
|
-
*/
|
|
220
|
-
isExpired(session) {
|
|
221
|
-
if (!session.expires_at)
|
|
222
|
-
return false;
|
|
223
|
-
return session.expires_at <= new Date();
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Touch a session to refresh its TTL
|
|
227
|
-
*/
|
|
228
|
-
touchSession(session) {
|
|
229
|
-
const now = new Date();
|
|
230
|
-
session.last_accessed_at = now;
|
|
231
|
-
if (this.ttlMs > 0) {
|
|
232
|
-
session.expires_at = new Date(now.getTime() + this.ttlMs);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Get the configured TTL in milliseconds
|
|
237
|
-
*/
|
|
238
|
-
getTtlMs() {
|
|
239
|
-
return this.ttlMs;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Get the configured max sessions limit
|
|
243
|
-
*/
|
|
244
|
-
getMaxSessions() {
|
|
245
|
-
return this.maxSessions;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
//# sourceMappingURL=session-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/server/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session Worker Binding
|
|
3
|
-
*
|
|
4
|
-
* Thin adapter that routes session lifecycle to either WorkerManager (process isolation)
|
|
5
|
-
* or BrowserContext (context isolation) based on the configured ISOLATION_MODE.
|
|
6
|
-
*/
|
|
7
|
-
import type { SessionManager } from '../browser/session-manager.js';
|
|
8
|
-
import type { WorkerManager } from '../worker/worker-manager.js';
|
|
9
|
-
/** Isolation mode determines how sessions get browser access */
|
|
10
|
-
export type IsolationMode = 'process' | 'context';
|
|
11
|
-
/**
|
|
12
|
-
* Tracks worker assignments for process-mode sessions.
|
|
13
|
-
* Maps sessionId to the workerId that was acquired.
|
|
14
|
-
*/
|
|
15
|
-
interface WorkerAssignment {
|
|
16
|
-
workerId: string;
|
|
17
|
-
cdpEndpoint: string;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Routes session lifecycle events to the appropriate isolation backend.
|
|
21
|
-
*
|
|
22
|
-
* - **process** mode: Each session gets a dedicated Chrome worker process via WorkerManager.
|
|
23
|
-
* - **context** mode: Each session gets an isolated BrowserContext within the shared browser.
|
|
24
|
-
*/
|
|
25
|
-
export declare class SessionWorkerBinding {
|
|
26
|
-
readonly isolationMode: IsolationMode;
|
|
27
|
-
private readonly workerAssignments;
|
|
28
|
-
constructor(isolationMode?: IsolationMode);
|
|
29
|
-
/**
|
|
30
|
-
* Handle session start: acquire isolation resources.
|
|
31
|
-
*
|
|
32
|
-
* @param sessionId - The session identifier (used as tenantId for worker leases)
|
|
33
|
-
* @param sessionManager - The SessionManager for browser access
|
|
34
|
-
* @param workerManager - Required in process mode; ignored in context mode
|
|
35
|
-
* @returns The CDP endpoint (process mode) or the BrowserContext (context mode)
|
|
36
|
-
*/
|
|
37
|
-
onSessionStart(sessionId: string, sessionManager: SessionManager, workerManager?: WorkerManager): Promise<{
|
|
38
|
-
cdpEndpoint?: string;
|
|
39
|
-
browserContext?: import('puppeteer-core').BrowserContext;
|
|
40
|
-
}>;
|
|
41
|
-
/**
|
|
42
|
-
* Handle session end: release isolation resources.
|
|
43
|
-
*
|
|
44
|
-
* @param sessionId - The session identifier
|
|
45
|
-
* @param workerManager - Required in process mode; ignored in context mode
|
|
46
|
-
*/
|
|
47
|
-
onSessionEnd(sessionId: string, workerManager?: WorkerManager): void;
|
|
48
|
-
/**
|
|
49
|
-
* Get the worker assignment for a session (process mode only).
|
|
50
|
-
*/
|
|
51
|
-
getWorkerAssignment(sessionId: string): WorkerAssignment | undefined;
|
|
52
|
-
private startProcessIsolation;
|
|
53
|
-
private startContextIsolation;
|
|
54
|
-
private endProcessIsolation;
|
|
55
|
-
}
|
|
56
|
-
export {};
|
|
57
|
-
//# sourceMappingURL=session-worker-binding.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-worker-binding.d.ts","sourceRoot":"","sources":["../../../src/session/session-worker-binding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAKjE,gEAAgE;AAChE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;AAElD;;;GAGG;AACH,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;gBAE7D,aAAa,GAAE,aAAyB;IAKpD;;;;;;;OAOG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,cAAc,EAC9B,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,gBAAgB,EAAE,cAAc,CAAA;KAAE,CAAC;IAO9F;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI;IASpE;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;YAQtD,qBAAqB;YA0CrB,qBAAqB;IASnC,OAAO,CAAC,mBAAmB;CAgB5B"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session Worker Binding
|
|
3
|
-
*
|
|
4
|
-
* Thin adapter that routes session lifecycle to either WorkerManager (process isolation)
|
|
5
|
-
* or BrowserContext (context isolation) based on the configured ISOLATION_MODE.
|
|
6
|
-
*/
|
|
7
|
-
import { createLogger } from '../shared/services/logging.service.js';
|
|
8
|
-
const logger = createLogger('SessionWorkerBinding');
|
|
9
|
-
/**
|
|
10
|
-
* Routes session lifecycle events to the appropriate isolation backend.
|
|
11
|
-
*
|
|
12
|
-
* - **process** mode: Each session gets a dedicated Chrome worker process via WorkerManager.
|
|
13
|
-
* - **context** mode: Each session gets an isolated BrowserContext within the shared browser.
|
|
14
|
-
*/
|
|
15
|
-
export class SessionWorkerBinding {
|
|
16
|
-
isolationMode;
|
|
17
|
-
workerAssignments = new Map();
|
|
18
|
-
constructor(isolationMode = 'context') {
|
|
19
|
-
this.isolationMode = isolationMode;
|
|
20
|
-
logger.info(`SessionWorkerBinding created`, { isolationMode });
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Handle session start: acquire isolation resources.
|
|
24
|
-
*
|
|
25
|
-
* @param sessionId - The session identifier (used as tenantId for worker leases)
|
|
26
|
-
* @param sessionManager - The SessionManager for browser access
|
|
27
|
-
* @param workerManager - Required in process mode; ignored in context mode
|
|
28
|
-
* @returns The CDP endpoint (process mode) or the BrowserContext (context mode)
|
|
29
|
-
*/
|
|
30
|
-
async onSessionStart(sessionId, sessionManager, workerManager) {
|
|
31
|
-
if (this.isolationMode === 'process') {
|
|
32
|
-
return this.startProcessIsolation(sessionId, sessionManager, workerManager);
|
|
33
|
-
}
|
|
34
|
-
return this.startContextIsolation(sessionId, sessionManager);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Handle session end: release isolation resources.
|
|
38
|
-
*
|
|
39
|
-
* @param sessionId - The session identifier
|
|
40
|
-
* @param workerManager - Required in process mode; ignored in context mode
|
|
41
|
-
*/
|
|
42
|
-
onSessionEnd(sessionId, workerManager) {
|
|
43
|
-
if (this.isolationMode === 'process') {
|
|
44
|
-
this.endProcessIsolation(sessionId, workerManager);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
// Context mode: BrowserContext cleanup is handled by SessionStore.destroySession()
|
|
48
|
-
logger.debug(`Context-mode session ended; cleanup delegated to SessionStore`, { sessionId });
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Get the worker assignment for a session (process mode only).
|
|
52
|
-
*/
|
|
53
|
-
getWorkerAssignment(sessionId) {
|
|
54
|
-
return this.workerAssignments.get(sessionId);
|
|
55
|
-
}
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
// Private helpers
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
async startProcessIsolation(sessionId, sessionManager, workerManager) {
|
|
60
|
-
if (!workerManager) {
|
|
61
|
-
throw new Error('WorkerManager is required for process isolation mode');
|
|
62
|
-
}
|
|
63
|
-
logger.info(`Acquiring worker for session`, { sessionId });
|
|
64
|
-
const result = await workerManager.acquireForTenant(sessionId, sessionId);
|
|
65
|
-
if (!result.success || !result.cdpEndpoint || !result.workerId) {
|
|
66
|
-
throw new Error(`Failed to acquire worker for session ${sessionId}: ${result.error ?? 'unknown error'}`);
|
|
67
|
-
}
|
|
68
|
-
const assignment = {
|
|
69
|
-
workerId: result.workerId,
|
|
70
|
-
cdpEndpoint: result.cdpEndpoint,
|
|
71
|
-
};
|
|
72
|
-
this.workerAssignments.set(sessionId, assignment);
|
|
73
|
-
// Connect SessionManager to the worker's CDP endpoint
|
|
74
|
-
try {
|
|
75
|
-
await sessionManager.connect({ browserWSEndpoint: result.cdpEndpoint });
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
// Rollback: release assignment so we don't leak a dangling entry
|
|
79
|
-
this.workerAssignments.delete(sessionId);
|
|
80
|
-
throw err;
|
|
81
|
-
}
|
|
82
|
-
logger.info(`Session connected to worker`, {
|
|
83
|
-
sessionId,
|
|
84
|
-
workerId: result.workerId,
|
|
85
|
-
cdpEndpoint: result.cdpEndpoint,
|
|
86
|
-
});
|
|
87
|
-
return { cdpEndpoint: result.cdpEndpoint };
|
|
88
|
-
}
|
|
89
|
-
async startContextIsolation(_sessionId, sessionManager) {
|
|
90
|
-
const browserContext = await sessionManager.createIsolatedContext();
|
|
91
|
-
logger.info(`Created isolated BrowserContext for session`, { sessionId: _sessionId });
|
|
92
|
-
return { browserContext };
|
|
93
|
-
}
|
|
94
|
-
endProcessIsolation(sessionId, workerManager) {
|
|
95
|
-
if (!workerManager) {
|
|
96
|
-
logger.warning(`No WorkerManager provided for process-mode session end`, { sessionId });
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
const assignment = this.workerAssignments.get(sessionId);
|
|
100
|
-
if (!assignment) {
|
|
101
|
-
logger.warning(`No worker assignment found for session`, { sessionId });
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
workerManager.releaseLease(sessionId);
|
|
105
|
-
this.workerAssignments.delete(sessionId);
|
|
106
|
-
logger.info(`Released worker lease for session`, { sessionId, workerId: assignment.workerId });
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=session-worker-binding.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-worker-binding.js","sourceRoot":"","sources":["../../../src/session/session-worker-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DOM Transformer Service
|
|
3
|
-
*
|
|
4
|
-
* Transforms CDP DOM.getDocument responses into our DomTreeNode format
|
|
5
|
-
*
|
|
6
|
-
* FIXES: The stub implementation in browser-automation-mcp-server.ts:731-736
|
|
7
|
-
* that returned { nodes: [] } without transforming the CDP response
|
|
8
|
-
*/
|
|
9
|
-
import type { DomTreeNode } from '../types/index.js';
|
|
10
|
-
/**
|
|
11
|
-
* CDP DOM Node structure
|
|
12
|
-
*/
|
|
13
|
-
interface CdpDomNode {
|
|
14
|
-
nodeId: number;
|
|
15
|
-
nodeType: number;
|
|
16
|
-
nodeName: string;
|
|
17
|
-
localName: string;
|
|
18
|
-
nodeValue: string;
|
|
19
|
-
childNodeCount?: number;
|
|
20
|
-
children?: CdpDomNode[];
|
|
21
|
-
attributes?: string[];
|
|
22
|
-
documentURL?: string;
|
|
23
|
-
baseURL?: string;
|
|
24
|
-
}
|
|
25
|
-
interface CdpDomTreeResponse {
|
|
26
|
-
root: CdpDomNode;
|
|
27
|
-
}
|
|
28
|
-
export interface DomGetTreeParams {
|
|
29
|
-
frameId?: string;
|
|
30
|
-
depth?: number;
|
|
31
|
-
visibleOnly?: boolean;
|
|
32
|
-
}
|
|
33
|
-
export interface DomGetTreeResponse {
|
|
34
|
-
nodes: DomTreeNode[];
|
|
35
|
-
}
|
|
36
|
-
export declare class DomTransformerService {
|
|
37
|
-
/**
|
|
38
|
-
* Transform CDP DOM.getDocument response into our DomTreeNode format
|
|
39
|
-
*/
|
|
40
|
-
transform(cdpResponse: CdpDomTreeResponse, params: DomGetTreeParams): DomGetTreeResponse;
|
|
41
|
-
/**
|
|
42
|
-
* Recursively transform a CDP node and its children
|
|
43
|
-
*/
|
|
44
|
-
private transformNode;
|
|
45
|
-
/**
|
|
46
|
-
* Parse CDP attributes array [key1, value1, key2, value2, ...] to object
|
|
47
|
-
*/
|
|
48
|
-
private parseAttributes;
|
|
49
|
-
/**
|
|
50
|
-
* Check if element is hidden by inline style
|
|
51
|
-
*/
|
|
52
|
-
private isHiddenByStyle;
|
|
53
|
-
/**
|
|
54
|
-
* Extract text content from immediate text children
|
|
55
|
-
*/
|
|
56
|
-
private extractTextContent;
|
|
57
|
-
/**
|
|
58
|
-
* Flatten tree structure into array (breadth-first traversal)
|
|
59
|
-
*/
|
|
60
|
-
flattenTree(nodes: DomTreeNode[]): DomTreeNode[];
|
|
61
|
-
/**
|
|
62
|
-
* Filter nodes by tag name
|
|
63
|
-
*/
|
|
64
|
-
filterByTag(nodes: DomTreeNode[], tag: string): DomTreeNode[];
|
|
65
|
-
/**
|
|
66
|
-
* Find nodes by attribute
|
|
67
|
-
*/
|
|
68
|
-
findByAttribute(nodes: DomTreeNode[], attrName: string, attrValue?: string): DomTreeNode[];
|
|
69
|
-
}
|
|
70
|
-
export {};
|
|
71
|
-
//# sourceMappingURL=dom-transformer.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom-transformer.service.d.ts","sourceRoot":"","sources":["../../../../src/shared/services/dom-transformer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,qBAAa,qBAAqB;IAChC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,GAAG,kBAAkB;IASxF;;OAEG;IACH,OAAO,CAAC,aAAa;IAoFrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAgBhD;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE;IAe7D;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;CA2B3F"}
|