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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../../src/server/server-config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../../src/server/server-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAE5D,mBAAmB;AACnB,IAAI,YAAY,GAAsB,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registrar Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the minimal interface for registering MCP tools.
|
|
5
|
+
* Used by both BrowserAutomationServer (stdio) and HttpGateway (HTTP).
|
|
6
|
+
*
|
|
7
|
+
* @module server/tool-registrar.types
|
|
8
|
+
*/
|
|
9
|
+
import type { ZodRawShape } from 'zod';
|
|
10
|
+
/**
|
|
11
|
+
* Minimal interface for registering tools on an MCP server.
|
|
12
|
+
*
|
|
13
|
+
* Implemented by:
|
|
14
|
+
* - BrowserAutomationServer (stdio transport with logging/error wrapping)
|
|
15
|
+
* - HttpToolRegistrar (HTTP transport, wraps McpServer.registerTool)
|
|
16
|
+
*/
|
|
17
|
+
export interface ToolRegistrar {
|
|
18
|
+
registerTool(name: string, definition: {
|
|
19
|
+
title: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
inputSchema: ZodRawShape;
|
|
22
|
+
outputSchema?: ZodRawShape;
|
|
23
|
+
}, handler: (input: unknown) => Promise<unknown>): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tool-registrar.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrar.types.d.ts","sourceRoot":"","sources":["../../../src/server/tool-registrar.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,CAAC,EAAE,WAAW,CAAC;KAC5B,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5C,IAAI,CAAC;CACT"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registrar Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the minimal interface for registering MCP tools.
|
|
5
|
+
* Used by both BrowserAutomationServer (stdio) and HttpGateway (HTTP).
|
|
6
|
+
*
|
|
7
|
+
* @module server/tool-registrar.types
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=tool-registrar.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrar.types.js","sourceRoot":"","sources":["../../../src/server/tool-registrar.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Result Handler
|
|
3
|
+
*
|
|
4
|
+
* Shared result-wrapping logic for converting tool handler return values
|
|
5
|
+
* into MCP-compatible content arrays. Used by both BrowserAutomationServer
|
|
6
|
+
* (stdio) and HttpToolRegistrar (HTTP) to avoid duplication.
|
|
7
|
+
*
|
|
8
|
+
* @module server/tool-result-handler
|
|
9
|
+
*/
|
|
10
|
+
/** MCP text content */
|
|
11
|
+
interface TextContent {
|
|
12
|
+
readonly type: 'text';
|
|
13
|
+
readonly text: string;
|
|
14
|
+
}
|
|
15
|
+
/** MCP image content */
|
|
16
|
+
interface ImageContent {
|
|
17
|
+
readonly type: 'image';
|
|
18
|
+
readonly data: string;
|
|
19
|
+
readonly mimeType: string;
|
|
20
|
+
}
|
|
21
|
+
/** Union of MCP content types produced by this module */
|
|
22
|
+
export type Content = TextContent | ImageContent;
|
|
23
|
+
/** Formatted tool result ready for MCP response */
|
|
24
|
+
export interface FormattedToolResult {
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
content: Content[];
|
|
27
|
+
structuredContent?: Record<string, unknown>;
|
|
28
|
+
isError?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format a tool handler result into an MCP-compatible content array.
|
|
32
|
+
*
|
|
33
|
+
* Handles CompositeResult, ImageResult, FileResult, structured output,
|
|
34
|
+
* plain strings, and arbitrary objects (JSON-stringified).
|
|
35
|
+
*
|
|
36
|
+
* @param result - The raw return value from a tool handler
|
|
37
|
+
* @param hasOutputSchema - Whether the tool definition has an outputSchema
|
|
38
|
+
* @returns MCP-compatible content array with optional structuredContent
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatToolResult(result: unknown, hasOutputSchema?: boolean): FormattedToolResult;
|
|
41
|
+
/**
|
|
42
|
+
* Format an error into an MCP-compatible error response.
|
|
43
|
+
*
|
|
44
|
+
* @param error - The caught error
|
|
45
|
+
* @returns MCP-compatible error content
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatToolError(error: unknown): FormattedToolResult;
|
|
48
|
+
/**
|
|
49
|
+
* Wrap a tool handler with logging, timing, and MCP result formatting.
|
|
50
|
+
*
|
|
51
|
+
* Shared by both BrowserAutomationServer (stdio) and HttpToolRegistrar (HTTP)
|
|
52
|
+
* to avoid duplicating the try/catch/timing/logging boilerplate.
|
|
53
|
+
*
|
|
54
|
+
* @param name - Tool name used in log messages
|
|
55
|
+
* @param handler - The raw tool handler function
|
|
56
|
+
* @param hasOutputSchema - Whether the tool definition has an outputSchema
|
|
57
|
+
* @returns A wrapped handler that returns a FormattedToolResult
|
|
58
|
+
*/
|
|
59
|
+
export declare function wrapToolHandler<T>(name: string, handler: (input: T) => Promise<unknown>, hasOutputSchema: boolean): (input: T) => Promise<FormattedToolResult>;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=tool-result-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result-handler.d.ts","sourceRoot":"","sources":["../../../src/server/tool-result-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,uBAAuB;AACvB,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAwB;AACxB,UAAU,YAAY;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,yDAAyD;AACzD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC;AAEjD,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,UAAQ,GAAG,mBAAmB,CAqE9F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAYnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,EACvC,eAAe,EAAE,OAAO,GACvB,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAmB5C"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Result Handler
|
|
3
|
+
*
|
|
4
|
+
* Shared result-wrapping logic for converting tool handler return values
|
|
5
|
+
* into MCP-compatible content arrays. Used by both BrowserAutomationServer
|
|
6
|
+
* (stdio) and HttpToolRegistrar (HTTP) to avoid duplication.
|
|
7
|
+
*
|
|
8
|
+
* @module server/tool-result-handler
|
|
9
|
+
*/
|
|
10
|
+
import { isCompositeResult, isImageResult, isFileResult } from '../tools/tool-result.types.js';
|
|
11
|
+
import { getLogger } from '../shared/services/logging.service.js';
|
|
12
|
+
/**
|
|
13
|
+
* Format a tool handler result into an MCP-compatible content array.
|
|
14
|
+
*
|
|
15
|
+
* Handles CompositeResult, ImageResult, FileResult, structured output,
|
|
16
|
+
* plain strings, and arbitrary objects (JSON-stringified).
|
|
17
|
+
*
|
|
18
|
+
* @param result - The raw return value from a tool handler
|
|
19
|
+
* @param hasOutputSchema - Whether the tool definition has an outputSchema
|
|
20
|
+
* @returns MCP-compatible content array with optional structuredContent
|
|
21
|
+
*/
|
|
22
|
+
export function formatToolResult(result, hasOutputSchema = false) {
|
|
23
|
+
// Composite result - return as multi-content (text + image)
|
|
24
|
+
if (isCompositeResult(result)) {
|
|
25
|
+
if (isImageResult(result.image)) {
|
|
26
|
+
return {
|
|
27
|
+
content: [
|
|
28
|
+
{ type: 'text', text: result.text },
|
|
29
|
+
{
|
|
30
|
+
type: 'image',
|
|
31
|
+
data: result.image.data,
|
|
32
|
+
mimeType: result.image.mimeType,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// FileResult fallback - return text + file path
|
|
39
|
+
const sizeMB = (result.image.sizeBytes / 1024 / 1024).toFixed(2);
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{ type: 'text', text: result.text },
|
|
43
|
+
{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: `Screenshot saved to: ${result.image.path} (${sizeMB} MB, ${result.image.mimeType})`,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Image result - return as MCP ImageContent (inline base64)
|
|
52
|
+
if (isImageResult(result)) {
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: 'image',
|
|
57
|
+
data: result.data,
|
|
58
|
+
mimeType: result.mimeType,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// File result - return file path as text (for large screenshots)
|
|
64
|
+
if (isFileResult(result)) {
|
|
65
|
+
const sizeMB = (result.sizeBytes / 1024 / 1024).toFixed(2);
|
|
66
|
+
return {
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: `Screenshot saved to: ${result.path} (${sizeMB} MB, ${result.mimeType})`,
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// When outputSchema is defined, return structuredContent for MCP validation
|
|
76
|
+
if (hasOutputSchema) {
|
|
77
|
+
return {
|
|
78
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
79
|
+
structuredContent: result,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// If result is already a string (e.g., XML), use it directly
|
|
83
|
+
// Otherwise JSON.stringify it
|
|
84
|
+
const textContent = typeof result === 'string' ? result : JSON.stringify(result);
|
|
85
|
+
return {
|
|
86
|
+
content: [{ type: 'text', text: textContent }],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format an error into an MCP-compatible error response.
|
|
91
|
+
*
|
|
92
|
+
* @param error - The caught error
|
|
93
|
+
* @returns MCP-compatible error content
|
|
94
|
+
*/
|
|
95
|
+
export function formatToolError(error) {
|
|
96
|
+
return {
|
|
97
|
+
content: [
|
|
98
|
+
{
|
|
99
|
+
type: 'text',
|
|
100
|
+
text: JSON.stringify({
|
|
101
|
+
error: error instanceof Error ? error.message : String(error),
|
|
102
|
+
}),
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
isError: true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Wrap a tool handler with logging, timing, and MCP result formatting.
|
|
110
|
+
*
|
|
111
|
+
* Shared by both BrowserAutomationServer (stdio) and HttpToolRegistrar (HTTP)
|
|
112
|
+
* to avoid duplicating the try/catch/timing/logging boilerplate.
|
|
113
|
+
*
|
|
114
|
+
* @param name - Tool name used in log messages
|
|
115
|
+
* @param handler - The raw tool handler function
|
|
116
|
+
* @param hasOutputSchema - Whether the tool definition has an outputSchema
|
|
117
|
+
* @returns A wrapped handler that returns a FormattedToolResult
|
|
118
|
+
*/
|
|
119
|
+
export function wrapToolHandler(name, handler, hasOutputSchema) {
|
|
120
|
+
const logger = getLogger();
|
|
121
|
+
return async (input) => {
|
|
122
|
+
const startTime = Date.now();
|
|
123
|
+
logger.debug(`Executing tool: ${name}`);
|
|
124
|
+
try {
|
|
125
|
+
const result = await handler(input);
|
|
126
|
+
const executionTime = Date.now() - startTime;
|
|
127
|
+
logger.debug(`Tool ${name} completed in ${executionTime}ms`);
|
|
128
|
+
return formatToolResult(result, hasOutputSchema);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const executionTime = Date.now() - startTime;
|
|
132
|
+
logger.error(`Tool ${name} failed after ${executionTime}ms`, error instanceof Error ? error : undefined);
|
|
133
|
+
return formatToolError(error);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=tool-result-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result-handler.js","sourceRoot":"","sources":["../../../src/server/tool-result-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AA0BlE;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAe,EAAE,eAAe,GAAG,KAAK;IACvE,4DAA4D;IAC5D,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;oBAC5C;wBACE,IAAI,EAAE,OAAgB;wBACtB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;wBACvB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;qBAChC;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;oBAC5C;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,wBAAwB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,QAAQ,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG;qBAC3F;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,OAAgB;oBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,wBAAwB,MAAM,CAAC,IAAI,KAAK,MAAM,QAAQ,MAAM,CAAC,QAAQ,GAAG;iBAC/E;aACF;SACF,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,iBAAiB,EAAE,MAAiC;SACrD,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,8BAA8B;IAC9B,MAAM,WAAW,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC;aACH;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,OAAuC,EACvC,eAAwB;IAExB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,OAAO,KAAK,EAAE,KAAQ,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,iBAAiB,aAAa,IAAI,CAAC,CAAC;YAC7D,OAAO,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC7C,MAAM,CAAC,KAAK,CACV,QAAQ,IAAI,iBAAiB,aAAa,IAAI,EAC9C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;YACF,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Controller
|
|
3
|
+
*
|
|
4
|
+
* Per-tenant state container that implements ToolContext.
|
|
5
|
+
* Each agent/session gets its own SessionController instance
|
|
6
|
+
* with isolated pages, snapshots, state managers, and registries.
|
|
7
|
+
*
|
|
8
|
+
* Each session owns its own SessionManager and browser lifecycle,
|
|
9
|
+
* configured independently via BrowserSessionConfig.
|
|
10
|
+
*
|
|
11
|
+
* @module session/session-controller
|
|
12
|
+
*/
|
|
13
|
+
import type { BaseSnapshot, ReadableNode } from '../snapshot/snapshot.types.js';
|
|
14
|
+
import { SessionManager } from '../browser/session-manager.js';
|
|
15
|
+
import { SnapshotStore } from '../snapshot/snapshot-store.js';
|
|
16
|
+
import { StateManager } from '../state/state-manager.js';
|
|
17
|
+
import { DependencyTracker } from '../form/dependency-tracker.js';
|
|
18
|
+
import { ObservationAccumulator } from '../observation/observation-accumulator.js';
|
|
19
|
+
import type { ToolContext, CdpSessionResult, SnapshotCaptureResult } from '../tools/tool-context.types.js';
|
|
20
|
+
import { type BrowserSessionConfig } from '../browser/browser-session-config.js';
|
|
21
|
+
import type { PageHandle } from '../browser/page-registry.js';
|
|
22
|
+
/**
|
|
23
|
+
* Session state machine.
|
|
24
|
+
*/
|
|
25
|
+
export type SessionState = 'initializing' | 'active' | 'closing' | 'closed';
|
|
26
|
+
/**
|
|
27
|
+
* SessionController configuration.
|
|
28
|
+
*/
|
|
29
|
+
export interface SessionControllerOptions {
|
|
30
|
+
/** Unique session identifier */
|
|
31
|
+
sessionId: string;
|
|
32
|
+
/** Optional browser configuration for this session */
|
|
33
|
+
browserConfig?: BrowserSessionConfig;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Per-tenant session controller implementing ToolContext.
|
|
37
|
+
*
|
|
38
|
+
* Owns all per-session state:
|
|
39
|
+
* - SessionManager (per-session browser lifecycle)
|
|
40
|
+
* - SnapshotStore (per-session snapshot cache)
|
|
41
|
+
* - StateManagers (one per page)
|
|
42
|
+
* - DependencyTracker (per-session form dependencies)
|
|
43
|
+
* - ObservationAccumulator (per-session DOM mutation tracking)
|
|
44
|
+
*/
|
|
45
|
+
export declare class SessionController implements ToolContext {
|
|
46
|
+
readonly sessionId: string;
|
|
47
|
+
private _sessionManager;
|
|
48
|
+
private _browserConfig;
|
|
49
|
+
private readonly _snapshotStore;
|
|
50
|
+
private readonly _stateManagers;
|
|
51
|
+
private readonly _dependencyTracker;
|
|
52
|
+
private readonly _observationAccumulator;
|
|
53
|
+
/** Deduplication promise for concurrent ensureBrowser() calls */
|
|
54
|
+
private _ensureBrowserPromise;
|
|
55
|
+
/** Unsubscribe from SessionManager state changes (cleanup in close()) */
|
|
56
|
+
private _unsubStateChange;
|
|
57
|
+
private _state;
|
|
58
|
+
private _lastActivity;
|
|
59
|
+
constructor(options: SessionControllerOptions);
|
|
60
|
+
/** Get the current session state. */
|
|
61
|
+
get state(): SessionState;
|
|
62
|
+
/** Touch the session to update last activity timestamp. */
|
|
63
|
+
touch(): void;
|
|
64
|
+
/** Get the time of last activity. */
|
|
65
|
+
get lastActivity(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Close the session and clean up all resources, including the owned browser.
|
|
68
|
+
*/
|
|
69
|
+
close(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Check if browser configuration can be changed.
|
|
72
|
+
* Returns true when no browser is running (before first launch or after crash).
|
|
73
|
+
*/
|
|
74
|
+
canReconfigure(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Shut down the current browser and clear session state so the browser
|
|
77
|
+
* can be reconfigured (e.g., switch from a launched browser to auto_connect).
|
|
78
|
+
*/
|
|
79
|
+
resetBrowser(): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Set the browser configuration for this session.
|
|
82
|
+
*
|
|
83
|
+
* Must be called before the browser is launched/connected (i.e., before
|
|
84
|
+
* the first browser-touching tool call). Throws if browser is already running.
|
|
85
|
+
*/
|
|
86
|
+
setBrowserConfig(config: BrowserSessionConfig): void;
|
|
87
|
+
/**
|
|
88
|
+
* Ensure the session's browser is ready.
|
|
89
|
+
*
|
|
90
|
+
* Lazily creates a SessionManager and launches/connects based on
|
|
91
|
+
* the session's BrowserSessionConfig. Idempotent — returns immediately
|
|
92
|
+
* if the browser is already running. Concurrent calls are deduplicated.
|
|
93
|
+
*/
|
|
94
|
+
ensureBrowser(): Promise<void>;
|
|
95
|
+
resolvePage(pageId?: string): PageHandle | undefined;
|
|
96
|
+
resolvePageOrCreate(pageId?: string): Promise<PageHandle>;
|
|
97
|
+
resolveExistingPage(pageId?: string): PageHandle;
|
|
98
|
+
touchPage(pageId: string): void;
|
|
99
|
+
closePage(pageId: string): Promise<boolean>;
|
|
100
|
+
syncPages(): Promise<PageHandle[]>;
|
|
101
|
+
navigateTo(pageId: string, url: string): Promise<void>;
|
|
102
|
+
getSessionManager(): SessionManager;
|
|
103
|
+
getSnapshotStore(): SnapshotStore;
|
|
104
|
+
getStateManager(pageId: string): StateManager;
|
|
105
|
+
removeStateManager(pageId: string): void;
|
|
106
|
+
clearAllStateManagers(): void;
|
|
107
|
+
getDependencyTracker(): DependencyTracker;
|
|
108
|
+
getObservationAccumulator(): ObservationAccumulator;
|
|
109
|
+
ensureCdpSession(handle: PageHandle): Promise<CdpSessionResult>;
|
|
110
|
+
captureSnapshotWithRecovery(handle: PageHandle, pageId: string): Promise<SnapshotCaptureResult>;
|
|
111
|
+
requireSnapshot(pageId: string): BaseSnapshot;
|
|
112
|
+
resolveElementByEid(pageId: string, eid: string, snapshot: BaseSnapshot): ReadableNode;
|
|
113
|
+
/**
|
|
114
|
+
* Get or lazily create the session's own SessionManager.
|
|
115
|
+
*/
|
|
116
|
+
private getOrCreateSessionManager;
|
|
117
|
+
/**
|
|
118
|
+
* Clear stale per-page state (snapshots, state managers, dependencies).
|
|
119
|
+
* Called when the browser crashes or disconnects unexpectedly.
|
|
120
|
+
*/
|
|
121
|
+
private clearSessionState;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=session-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-controller.d.ts","sourceRoot":"","sources":["../../../src/session/session-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Controller
|
|
3
|
+
*
|
|
4
|
+
* Per-tenant state container that implements ToolContext.
|
|
5
|
+
* Each agent/session gets its own SessionController instance
|
|
6
|
+
* with isolated pages, snapshots, state managers, and registries.
|
|
7
|
+
*
|
|
8
|
+
* Each session owns its own SessionManager and browser lifecycle,
|
|
9
|
+
* configured independently via BrowserSessionConfig.
|
|
10
|
+
*
|
|
11
|
+
* @module session/session-controller
|
|
12
|
+
*/
|
|
13
|
+
import { SessionManager } from '../browser/session-manager.js';
|
|
14
|
+
import { SnapshotStore } from '../snapshot/snapshot-store.js';
|
|
15
|
+
import { StateManager } from '../state/state-manager.js';
|
|
16
|
+
import { DependencyTracker } from '../form/dependency-tracker.js';
|
|
17
|
+
import { ObservationAccumulator } from '../observation/observation-accumulator.js';
|
|
18
|
+
import { ensureCdpSession as ensureCdpSessionImpl, resolveExistingPage as resolveExistingPageImpl, } from '../tools/tool-context.js';
|
|
19
|
+
import { captureSnapshotWithRecovery as captureSnapshotWithRecoveryImpl } from '../tools/action-context.js';
|
|
20
|
+
import { ElementNotFoundError, StaleElementError, SnapshotRequiredError } from '../tools/errors.js';
|
|
21
|
+
import { defaultBrowserConfig, } from '../browser/browser-session-config.js';
|
|
22
|
+
import { ensureBrowserReady } from '../browser/ensure-browser.js';
|
|
23
|
+
import { getLogger } from '../shared/services/logging.service.js';
|
|
24
|
+
const logger = getLogger();
|
|
25
|
+
/**
|
|
26
|
+
* Per-tenant session controller implementing ToolContext.
|
|
27
|
+
*
|
|
28
|
+
* Owns all per-session state:
|
|
29
|
+
* - SessionManager (per-session browser lifecycle)
|
|
30
|
+
* - SnapshotStore (per-session snapshot cache)
|
|
31
|
+
* - StateManagers (one per page)
|
|
32
|
+
* - DependencyTracker (per-session form dependencies)
|
|
33
|
+
* - ObservationAccumulator (per-session DOM mutation tracking)
|
|
34
|
+
*/
|
|
35
|
+
export class SessionController {
|
|
36
|
+
sessionId;
|
|
37
|
+
_sessionManager = null;
|
|
38
|
+
_browserConfig;
|
|
39
|
+
_snapshotStore;
|
|
40
|
+
_stateManagers = new Map();
|
|
41
|
+
_dependencyTracker;
|
|
42
|
+
_observationAccumulator;
|
|
43
|
+
/** Deduplication promise for concurrent ensureBrowser() calls */
|
|
44
|
+
_ensureBrowserPromise = null;
|
|
45
|
+
/** Unsubscribe from SessionManager state changes (cleanup in close()) */
|
|
46
|
+
_unsubStateChange = null;
|
|
47
|
+
_state = 'initializing';
|
|
48
|
+
_lastActivity = Date.now();
|
|
49
|
+
constructor(options) {
|
|
50
|
+
this.sessionId = options.sessionId;
|
|
51
|
+
this._browserConfig = options.browserConfig ?? defaultBrowserConfig();
|
|
52
|
+
this._snapshotStore = new SnapshotStore();
|
|
53
|
+
this._dependencyTracker = new DependencyTracker();
|
|
54
|
+
this._observationAccumulator = new ObservationAccumulator();
|
|
55
|
+
this._state = 'active';
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Session lifecycle
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
/** Get the current session state. */
|
|
61
|
+
get state() {
|
|
62
|
+
return this._state;
|
|
63
|
+
}
|
|
64
|
+
/** Touch the session to update last activity timestamp. */
|
|
65
|
+
touch() {
|
|
66
|
+
this._lastActivity = Date.now();
|
|
67
|
+
}
|
|
68
|
+
/** Get the time of last activity. */
|
|
69
|
+
get lastActivity() {
|
|
70
|
+
return this._lastActivity;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Close the session and clean up all resources, including the owned browser.
|
|
74
|
+
*/
|
|
75
|
+
async close() {
|
|
76
|
+
if (this._state === 'closing' || this._state === 'closed')
|
|
77
|
+
return;
|
|
78
|
+
this._state = 'closing';
|
|
79
|
+
this._unsubStateChange?.();
|
|
80
|
+
this._unsubStateChange = null;
|
|
81
|
+
this._snapshotStore.destroy();
|
|
82
|
+
this._stateManagers.clear();
|
|
83
|
+
this._dependencyTracker.clearAll();
|
|
84
|
+
// Shut down the owned browser
|
|
85
|
+
if (this._sessionManager) {
|
|
86
|
+
try {
|
|
87
|
+
await this._sessionManager.shutdown();
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
logger.error('Error shutting down session browser', err instanceof Error ? err : undefined, { sessionId: this.sessionId });
|
|
91
|
+
}
|
|
92
|
+
this._sessionManager = null;
|
|
93
|
+
}
|
|
94
|
+
this._state = 'closed';
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Browser lifecycle (ToolContext implementation)
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Check if browser configuration can be changed.
|
|
101
|
+
* Returns true when no browser is running (before first launch or after crash).
|
|
102
|
+
*/
|
|
103
|
+
canReconfigure() {
|
|
104
|
+
if (this._ensureBrowserPromise)
|
|
105
|
+
return false;
|
|
106
|
+
return !(this._sessionManager?.isRunning() ?? false);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Shut down the current browser and clear session state so the browser
|
|
110
|
+
* can be reconfigured (e.g., switch from a launched browser to auto_connect).
|
|
111
|
+
*/
|
|
112
|
+
async resetBrowser() {
|
|
113
|
+
if (this._sessionManager) {
|
|
114
|
+
await this._sessionManager.shutdown();
|
|
115
|
+
}
|
|
116
|
+
this.clearSessionState();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Set the browser configuration for this session.
|
|
120
|
+
*
|
|
121
|
+
* Must be called before the browser is launched/connected (i.e., before
|
|
122
|
+
* the first browser-touching tool call). Throws if browser is already running.
|
|
123
|
+
*/
|
|
124
|
+
setBrowserConfig(config) {
|
|
125
|
+
if (!this.canReconfigure()) {
|
|
126
|
+
throw new Error('Cannot change browser configuration while the browser is running.');
|
|
127
|
+
}
|
|
128
|
+
const overrides = Object.fromEntries(Object.entries(config).filter(([, v]) => v !== undefined));
|
|
129
|
+
this._browserConfig = { ...this._browserConfig, ...overrides };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Ensure the session's browser is ready.
|
|
133
|
+
*
|
|
134
|
+
* Lazily creates a SessionManager and launches/connects based on
|
|
135
|
+
* the session's BrowserSessionConfig. Idempotent — returns immediately
|
|
136
|
+
* if the browser is already running. Concurrent calls are deduplicated.
|
|
137
|
+
*/
|
|
138
|
+
async ensureBrowser() {
|
|
139
|
+
// Deduplicate concurrent calls — all callers await the same promise
|
|
140
|
+
if (this._ensureBrowserPromise) {
|
|
141
|
+
await this._ensureBrowserPromise;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const session = this.getOrCreateSessionManager();
|
|
145
|
+
// ensureBrowserReady handles the isRunning() fast-path internally
|
|
146
|
+
this._ensureBrowserPromise = ensureBrowserReady(session, this._browserConfig);
|
|
147
|
+
try {
|
|
148
|
+
await this._ensureBrowserPromise;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
this._ensureBrowserPromise = null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Page lifecycle (ToolContext implementation)
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
resolvePage(pageId) {
|
|
158
|
+
this.touch();
|
|
159
|
+
return this.getSessionManager().resolvePage(pageId);
|
|
160
|
+
}
|
|
161
|
+
async resolvePageOrCreate(pageId) {
|
|
162
|
+
this.touch();
|
|
163
|
+
return this.getSessionManager().resolvePageOrCreate(pageId);
|
|
164
|
+
}
|
|
165
|
+
resolveExistingPage(pageId) {
|
|
166
|
+
this.touch();
|
|
167
|
+
return resolveExistingPageImpl(this.getSessionManager(), pageId);
|
|
168
|
+
}
|
|
169
|
+
touchPage(pageId) {
|
|
170
|
+
this.getSessionManager().touchPage(pageId);
|
|
171
|
+
}
|
|
172
|
+
async closePage(pageId) {
|
|
173
|
+
return this.getSessionManager().closePage(pageId);
|
|
174
|
+
}
|
|
175
|
+
async syncPages() {
|
|
176
|
+
return this.getSessionManager().syncPages();
|
|
177
|
+
}
|
|
178
|
+
async navigateTo(pageId, url) {
|
|
179
|
+
await this.getSessionManager().navigateTo(pageId, url);
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// State access (ToolContext implementation)
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
getSessionManager() {
|
|
185
|
+
return this.getOrCreateSessionManager();
|
|
186
|
+
}
|
|
187
|
+
getSnapshotStore() {
|
|
188
|
+
return this._snapshotStore;
|
|
189
|
+
}
|
|
190
|
+
getStateManager(pageId) {
|
|
191
|
+
if (!this._stateManagers.has(pageId)) {
|
|
192
|
+
this._stateManagers.set(pageId, new StateManager({ pageId }));
|
|
193
|
+
}
|
|
194
|
+
return this._stateManagers.get(pageId);
|
|
195
|
+
}
|
|
196
|
+
removeStateManager(pageId) {
|
|
197
|
+
this._stateManagers.delete(pageId);
|
|
198
|
+
}
|
|
199
|
+
clearAllStateManagers() {
|
|
200
|
+
this._stateManagers.clear();
|
|
201
|
+
}
|
|
202
|
+
getDependencyTracker() {
|
|
203
|
+
return this._dependencyTracker;
|
|
204
|
+
}
|
|
205
|
+
getObservationAccumulator() {
|
|
206
|
+
return this._observationAccumulator;
|
|
207
|
+
}
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// CDP health (ToolContext implementation)
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
async ensureCdpSession(handle) {
|
|
212
|
+
return ensureCdpSessionImpl(this.getSessionManager(), handle);
|
|
213
|
+
}
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
// Snapshot capture (ToolContext implementation)
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
async captureSnapshotWithRecovery(handle, pageId) {
|
|
218
|
+
return captureSnapshotWithRecoveryImpl(this, handle, pageId);
|
|
219
|
+
}
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
// Element resolution (ToolContext implementation)
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
requireSnapshot(pageId) {
|
|
224
|
+
const snap = this._snapshotStore.getByPageId(pageId);
|
|
225
|
+
if (!snap) {
|
|
226
|
+
throw new SnapshotRequiredError(pageId);
|
|
227
|
+
}
|
|
228
|
+
return snap;
|
|
229
|
+
}
|
|
230
|
+
resolveElementByEid(pageId, eid, snapshot) {
|
|
231
|
+
const stateManager = this.getStateManager(pageId);
|
|
232
|
+
const registry = stateManager.getElementRegistry();
|
|
233
|
+
const elementRef = registry.getByEid(eid);
|
|
234
|
+
if (!elementRef) {
|
|
235
|
+
throw new ElementNotFoundError(eid);
|
|
236
|
+
}
|
|
237
|
+
if (registry.isStale(eid)) {
|
|
238
|
+
throw new StaleElementError(eid);
|
|
239
|
+
}
|
|
240
|
+
const node = snapshot.nodes.find((n) => n.backend_node_id === elementRef.ref.backend_node_id);
|
|
241
|
+
if (!node) {
|
|
242
|
+
throw new StaleElementError(eid);
|
|
243
|
+
}
|
|
244
|
+
return node;
|
|
245
|
+
}
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// Private helpers
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
/**
|
|
250
|
+
* Get or lazily create the session's own SessionManager.
|
|
251
|
+
*/
|
|
252
|
+
getOrCreateSessionManager() {
|
|
253
|
+
if (!this._sessionManager) {
|
|
254
|
+
this._sessionManager = new SessionManager();
|
|
255
|
+
this._unsubStateChange = this._sessionManager.onStateChange((event) => {
|
|
256
|
+
if (event.currentState === 'failed') {
|
|
257
|
+
this.clearSessionState();
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return this._sessionManager;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Clear stale per-page state (snapshots, state managers, dependencies).
|
|
265
|
+
* Called when the browser crashes or disconnects unexpectedly.
|
|
266
|
+
*/
|
|
267
|
+
clearSessionState() {
|
|
268
|
+
this._snapshotStore.clear();
|
|
269
|
+
this._stateManagers.clear();
|
|
270
|
+
this._dependencyTracker.clearAll();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=session-controller.js.map
|