@ai-agent-forge/agent-forge 0.88.5 → 0.88.7
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/CHANGELOG.md +36 -0
- package/bundled-plugins/agent-loop-policy/agent-forge.json +1 -1
- package/bundled-plugins/agent-loop-policy/plugin.json +1 -1
- package/bundled-plugins/alignment/agent-forge.json +19 -0
- package/bundled-plugins/alignment/dist/baseline.d.ts +12 -0
- package/bundled-plugins/alignment/dist/baseline.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/baseline.js +68 -0
- package/bundled-plugins/alignment/dist/baseline.js.map +1 -0
- package/bundled-plugins/alignment/dist/engine.d.ts +102 -0
- package/bundled-plugins/alignment/dist/engine.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/engine.js +654 -0
- package/bundled-plugins/alignment/dist/engine.js.map +1 -0
- package/bundled-plugins/alignment/dist/entry.d.ts +14 -0
- package/bundled-plugins/alignment/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/entry.js +23 -0
- package/bundled-plugins/alignment/dist/entry.js.map +1 -0
- package/bundled-plugins/alignment/dist/export.d.ts +15 -0
- package/bundled-plugins/alignment/dist/export.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/export.js +122 -0
- package/bundled-plugins/alignment/dist/export.js.map +1 -0
- package/bundled-plugins/alignment/dist/http-server.d.ts +33 -0
- package/bundled-plugins/alignment/dist/http-server.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/http-server.js +119 -0
- package/bundled-plugins/alignment/dist/http-server.js.map +1 -0
- package/bundled-plugins/alignment/dist/index.d.ts +24 -0
- package/bundled-plugins/alignment/dist/index.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/index.js +719 -0
- package/bundled-plugins/alignment/dist/index.js.map +1 -0
- package/bundled-plugins/alignment/dist/page.d.ts +15 -0
- package/bundled-plugins/alignment/dist/page.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/page.js +857 -0
- package/bundled-plugins/alignment/dist/page.js.map +1 -0
- package/bundled-plugins/alignment/dist/render.d.ts +40 -0
- package/bundled-plugins/alignment/dist/render.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/render.js +194 -0
- package/bundled-plugins/alignment/dist/render.js.map +1 -0
- package/bundled-plugins/alignment/dist/types.d.ts +217 -0
- package/bundled-plugins/alignment/dist/types.d.ts.map +1 -0
- package/bundled-plugins/alignment/dist/types.js +30 -0
- package/bundled-plugins/alignment/dist/types.js.map +1 -0
- package/bundled-plugins/alignment/plugin.json +12 -0
- package/bundled-plugins/browser-playwright/MANUAL.md +60 -0
- package/bundled-plugins/browser-playwright/agent-forge.json +25 -0
- package/bundled-plugins/browser-playwright/dist/capability.d.ts +25 -0
- package/bundled-plugins/browser-playwright/dist/capability.d.ts.map +1 -0
- package/bundled-plugins/browser-playwright/dist/capability.js +612 -0
- package/bundled-plugins/browser-playwright/dist/capability.js.map +1 -0
- package/bundled-plugins/browser-playwright/dist/entry.d.ts +13 -0
- package/bundled-plugins/browser-playwright/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/browser-playwright/dist/entry.js +14 -0
- package/bundled-plugins/browser-playwright/dist/entry.js.map +1 -0
- package/bundled-plugins/browser-playwright/dist/index.d.ts +7 -0
- package/bundled-plugins/browser-playwright/dist/index.d.ts.map +1 -0
- package/bundled-plugins/browser-playwright/dist/index.js +5 -0
- package/bundled-plugins/browser-playwright/dist/index.js.map +1 -0
- package/bundled-plugins/browser-playwright/dist/operations.d.ts +69 -0
- package/bundled-plugins/browser-playwright/dist/operations.d.ts.map +1 -0
- package/bundled-plugins/browser-playwright/dist/operations.js +149 -0
- package/bundled-plugins/browser-playwright/dist/operations.js.map +1 -0
- package/bundled-plugins/browser-playwright/dist/playwright-driver.d.ts +275 -0
- package/bundled-plugins/browser-playwright/dist/playwright-driver.d.ts.map +1 -0
- package/bundled-plugins/browser-playwright/dist/playwright-driver.js +953 -0
- package/bundled-plugins/browser-playwright/dist/playwright-driver.js.map +1 -0
- package/bundled-plugins/browser-playwright/dist/setup.d.ts +88 -0
- package/bundled-plugins/browser-playwright/dist/setup.d.ts.map +1 -0
- package/bundled-plugins/browser-playwright/dist/setup.js +252 -0
- package/bundled-plugins/browser-playwright/dist/setup.js.map +1 -0
- package/bundled-plugins/browser-playwright/dist/types.d.ts +270 -0
- package/bundled-plugins/browser-playwright/dist/types.d.ts.map +1 -0
- package/bundled-plugins/browser-playwright/dist/types.js +2 -0
- package/bundled-plugins/browser-playwright/dist/types.js.map +1 -0
- package/bundled-plugins/browser-playwright/plugin.json +20 -0
- package/bundled-plugins/coding-tools/agent-forge.json +1 -1
- package/bundled-plugins/coding-tools/dist/bash.d.ts +2 -7
- package/bundled-plugins/coding-tools/dist/bash.d.ts.map +1 -1
- package/bundled-plugins/coding-tools/dist/bash.js +2 -34
- package/bundled-plugins/coding-tools/dist/bash.js.map +1 -1
- package/bundled-plugins/coding-tools/dist/read.d.ts +2 -0
- package/bundled-plugins/coding-tools/dist/read.d.ts.map +1 -1
- package/bundled-plugins/coding-tools/dist/read.js +11 -0
- package/bundled-plugins/coding-tools/dist/read.js.map +1 -1
- package/bundled-plugins/coding-tools/plugin.json +1 -1
- package/bundled-plugins/compaction-policy/agent-forge.json +1 -1
- package/bundled-plugins/compaction-policy/plugin.json +1 -1
- package/bundled-plugins/mcp-http/dist/mcp-http.d.ts.map +1 -1
- package/bundled-plugins/mcp-http/dist/mcp-http.js +84 -31
- package/bundled-plugins/mcp-http/dist/mcp-http.js.map +1 -1
- package/bundled-plugins/overflow-policy/agent-forge.json +1 -1
- package/bundled-plugins/overflow-policy/plugin.json +1 -1
- package/bundled-plugins/provider-failover/agent-forge.json +1 -1
- package/bundled-plugins/provider-failover/plugin.json +1 -1
- package/bundled-plugins/retry-policy/agent-forge.json +1 -1
- package/bundled-plugins/retry-policy/plugin.json +1 -1
- package/dist/bundle/.build-manifest.json +60 -58
- package/dist/bundle/chunks/{anthropic-messages-3FJHRAJL.js → anthropic-messages-NL4Y6WPB.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-GCL47IDS.js → azure-openai-responses-CPXC42HO.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
- package/dist/bundle/chunks/chunk-5LRQFZFE.js +2 -0
- package/dist/bundle/chunks/{chunk-HTEVUY7F.js → chunk-7HSJPQKN.js} +1 -1
- package/dist/bundle/chunks/{chunk-AC2FIS4G.js → chunk-EDO7Q6XR.js} +1 -1
- package/dist/bundle/chunks/{chunk-755VNWIF.js → chunk-ISLHFRER.js} +6 -6
- package/dist/bundle/chunks/{chunk-HV64ASMT.js → chunk-K3S6GTL7.js} +1 -1
- package/dist/bundle/chunks/{chunk-HEL6TAWE.js → chunk-L2SXIPI5.js} +37 -36
- package/dist/bundle/chunks/{chunk-V3ACW7VD.js → chunk-WJSKB3FC.js} +1 -1
- package/dist/bundle/chunks/{chunk-32YDZI4J.js → chunk-ZS5JEI76.js} +1 -1
- package/dist/bundle/chunks/{google-generative-ai-6BMXWA44.js → google-generative-ai-UMZ53EFA.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-6H7NLRTK.js → google-vertex-ZNR5NS6H.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{mistral-conversations-IXUHSFSJ.js → mistral-conversations-IT66WUNN.js} +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-YHUAEVCM.js → openai-codex-responses-FOVCVG6I.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-ULQCFC72.js → openai-completions-FLQ7CBOL.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-NLLAJDPS.js → openai-responses-ABGYHS2T.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-EJTI2EJ3.js → pi-messages-6K5W6LUN.js} +1 -1
- package/dist/bundle/chunks/{virtual-modules-TQWEGNNZ.js → virtual-modules-2QGILFV7.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/client.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/client/remote-session.d.ts.map +1 -1
- package/dist/client/remote-session.js +65 -6
- package/dist/client/remote-session.js.map +1 -1
- package/dist/core/agent-session-store.d.ts.map +1 -1
- package/dist/core/agent-session-store.js +20 -3
- package/dist/core/agent-session-store.js.map +1 -1
- package/dist/core/extensions/agent-composition.d.ts.map +1 -1
- package/dist/core/extensions/agent-composition.js +20 -1
- package/dist/core/extensions/agent-composition.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.js +1 -0
- package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js +10 -3
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -1
- package/dist/core/keybindings.d.ts +35 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +34 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +62 -15
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +11 -3
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +2 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/capability-mount.d.ts.map +1 -1
- package/dist/core/tools/capability-mount.js +4 -21
- package/dist/core/tools/capability-mount.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +2 -2
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +2 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +25 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/changelog-pager.d.ts +53 -0
- package/dist/modes/interactive/components/changelog-pager.d.ts.map +1 -0
- package/dist/modes/interactive/components/changelog-pager.js +239 -0
- package/dist/modes/interactive/components/changelog-pager.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +6 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-run-group.d.ts +41 -11
- package/dist/modes/interactive/components/tool-run-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-run-group.js +126 -14
- package/dist/modes/interactive/components/tool-run-group.js.map +1 -1
- package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-commands.js +23 -13
- package/dist/modes/interactive/interactive-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-events.d.ts +14 -4
- package/dist/modes/interactive/interactive-events.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-events.js +94 -12
- package/dist/modes/interactive/interactive-events.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +6 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +21 -5
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/plugins/ecosystem/node-local-package-source.d.ts +2 -1
- package/dist/plugins/ecosystem/node-local-package-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-local-package-source.js +110 -4
- package/dist/plugins/ecosystem/node-local-package-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-package-install-host.js +106 -39
- package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js +85 -2
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
- package/dist/suites/builtin-suites.d.ts.map +1 -1
- package/dist/suites/builtin-suites.js +2 -2
- package/dist/suites/builtin-suites.js.map +1 -1
- package/dist/utils/changelog.d.ts +27 -0
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +110 -0
- package/dist/utils/changelog.js.map +1 -1
- package/docs/keybindings.md +14 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/with-deps/plugin.json +1 -1
- package/package.json +1 -1
- package/dist/bundle/chunks/chunk-A3JYRWB6.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Browser capability factory: registers the seventeen browser tools on a\n * `CapabilityAPI` and shapes every result as `PluginResultV1`.\n *\n * Tool surface: `browser_navigate`, `browser_snapshot`, `browser_locator_action`\n * (click/dblclick/rightclick/fill/type/press/hover/select/check/uncheck/clear/\n * upload/scroll), `browser_assert_postcondition`, `browser_collect_evidence`,\n * the self-installing `browser_setup`, plus the prewritten operation tools\n * `browser_evaluate` (escape hatch), `browser_console`, `browser_network`,\n * `browser_performance`, `browser_wait`, `browser_drag`, `browser_mouse`,\n * `browser_press_key`, `browser_tabs`, `browser_storage`, and\n * `browser_viewport`. The readonly mode registers only the observation-only\n * tools (`snapshot`, `assert_postcondition`, `collect_evidence`, `console`,\n * `network`, `performance`, `wait`); everything that changes browser or disk\n * state never registers there.\n *\n * All browser state lives behind the injected `BrowserRuntimeV1`; the factory\n * itself has no Playwright knowledge. Error messages are sanitized like the\n * pre-split capability: URLs collapse to origin + pathname (<=512) and the\n * total message stays within 2048 chars.\n */\nimport {\n\tbuildPluginResultV1,\n\ttype CapabilityAPI,\n\ttype CapabilityPluginSyncFactory,\n\ttype DisposableRegistration,\n\ttype PluginResultV1,\n} from \"@agent-forge/plugin-sdk\";\nimport { Type } from \"typebox\";\nimport { boundedPreviewV1 } from \"./setup.ts\";\nimport type {\n\tBrowserDriverV1,\n\tBrowserEvidenceKindV1,\n\tBrowserLocatorActionInputV1,\n\tBrowserLocatorV1,\n\tBrowserMouseButtonV1,\n\tBrowserMouseInputV1,\n\tBrowserNavigateInputV1,\n\tBrowserOperationOptionsV1,\n\tBrowserPostconditionV1,\n\tBrowserRuntimeV1,\n\tBrowserSetupOutcomeV1,\n\tBrowserSnapshotInputV1,\n\tBrowserStorageInputV1,\n\tBrowserTabsInputV1,\n\tBrowserViewportInputV1,\n} from \"./types.ts\";\n\nfunction objectInput(first: unknown, second: unknown): Record<string, unknown> {\n\tconst value = second === undefined ? first : second;\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(\"Plugin tool input must be an object\");\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction toolInvocation(\n\tfirst: unknown,\n\tsecond: unknown,\n): { readonly input: Record<string, unknown>; readonly operationId: string } {\n\treturn {\n\t\tinput: objectInput(first, second),\n\t\toperationId: typeof first === \"string\" && first.trim() !== \"\" ? first : \"profile-runtime-tool-call\",\n\t};\n}\n\nfunction signalFrom(value: unknown): AbortSignal | undefined {\n\treturn value instanceof AbortSignal ? value : undefined;\n}\n\nfunction nonEmptyString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\" || value.trim() === \"\") throw new Error(`${label} must be a non-empty string`);\n\treturn value;\n}\n\nfunction requiredInteger(value: unknown, label: string): number {\n\tif (typeof value !== \"number\" || !Number.isInteger(value)) throw new Error(`${label} must be an integer`);\n\treturn value;\n}\n\n/** URL-sanitized, 2048-char bounded error text (pre-split browser contract). */\nfunction browserVisibleError(value: unknown): string {\n\tconst raw = value instanceof Error && value.message.trim() !== \"\" ? value.message : \"Browser operation failed\";\n\tconst sanitized = raw.replace(/https?:\\/\\/[^\\s\"'<>]+/giu, (candidate) => {\n\t\ttry {\n\t\t\tconst parsed = new URL(candidate);\n\t\t\treturn `${parsed.origin}${parsed.pathname.slice(0, 512)}`;\n\t\t} catch {\n\t\t\treturn candidate.slice(0, 512);\n\t\t}\n\t});\n\treturn sanitized.length > 2048 ? `${sanitized.slice(0, 2047)}…` : sanitized;\n}\n\nfunction browserAbort(value: unknown): boolean {\n\tif (value instanceof Error && value.name === \"AbortError\") return true;\n\treturn typeof value === \"object\" && value !== null && (value as { code?: unknown }).code === \"ABORT_ERR\";\n}\n\nconst browserLocatorSchema = Type.Object({\n\tkind: Type.Union([\n\t\tType.Literal(\"css\"),\n\t\tType.Literal(\"id\"),\n\t\tType.Literal(\"role\"),\n\t\tType.Literal(\"text\"),\n\t\tType.Literal(\"test-id\"),\n\t]),\n\tvalue: Type.String({ minLength: 1 }),\n\tname: Type.Optional(Type.String()),\n});\n\nconst browserMouseActionSchema = Type.Union([\n\tType.Literal(\"move\"),\n\tType.Literal(\"click\"),\n\tType.Literal(\"dblclick\"),\n\tType.Literal(\"rightclick\"),\n\tType.Literal(\"wheel\"),\n]);\n\nconst browserMouseButtonSchema = Type.Union([Type.Literal(\"left\"), Type.Literal(\"right\"), Type.Literal(\"middle\")]);\n\nconst browserTabsActionSchema = Type.Union([\n\tType.Literal(\"list\"),\n\tType.Literal(\"new\"),\n\tType.Literal(\"switch\"),\n\tType.Literal(\"close\"),\n]);\n\nconst browserStorageActionSchema = Type.Union([\n\tType.Literal(\"get-cookies\"),\n\tType.Literal(\"set-cookie\"),\n\tType.Literal(\"clear-cookies\"),\n\tType.Literal(\"get-local\"),\n\tType.Literal(\"set-local\"),\n\tType.Literal(\"clear-local\"),\n]);\n\nconst browserViewportActionSchema = Type.Union([Type.Literal(\"set\"), Type.Literal(\"get\")]);\n\nconst browserWaitUntilKindSchema = Type.Union([\n\tType.Literal(\"selector\"),\n\tType.Literal(\"navigation\"),\n\tType.Literal(\"networkidle\"),\n\tType.Literal(\"time\"),\n]);\n\nconst browserConsoleLevelSchema = Type.String({\n\tpattern: \"^(error|warning|info|debug)(,(error|warning|info|debug))*$\",\n});\n\nconst browserPostconditionSchema = Type.Union([\n\tType.Object({\n\t\tkind: Type.Literal(\"url\"),\n\t\tequals: Type.String({ minLength: 1 }),\n\t\tcontains: Type.Optional(Type.String({ minLength: 1 })),\n\t}),\n\tType.Object({\n\t\tkind: Type.Literal(\"url\"),\n\t\tequals: Type.Optional(Type.String({ minLength: 1 })),\n\t\tcontains: Type.String({ minLength: 1 }),\n\t}),\n\tType.Object({\n\t\tkind: Type.Literal(\"element\"),\n\t\tlocator: browserLocatorSchema,\n\t\tstate: Type.Union([Type.Literal(\"visible\"), Type.Literal(\"hidden\"), Type.Literal(\"value\")]),\n\t\tvalue: Type.Optional(Type.String()),\n\t}),\n\tType.Object({\n\t\tkind: Type.Literal(\"text\"),\n\t\tlocator: Type.Optional(browserLocatorSchema),\n\t\tcontains: Type.String({ minLength: 1 }),\n\t}),\n\tType.Object({\n\t\tkind: Type.Literal(\"console\"),\n\t\tcontains: Type.String({ minLength: 1 }),\n\t\tlevel: Type.Optional(Type.String()),\n\t}),\n\tType.Object({\n\t\tkind: Type.Literal(\"network\"),\n\t\tcontainsUrl: Type.String({ minLength: 1 }),\n\t\tstatus: Type.Optional(Type.Integer({ minimum: 100, maximum: 599 })),\n\t}),\n]);\n\nconst browserPostconditionInputSchema = Type.Union([\n\tbrowserPostconditionSchema,\n\tType.Array(browserPostconditionSchema, { minItems: 1, maxItems: 32 }),\n]);\n\nfunction setupResult(operationId: string, outcome: BrowserSetupOutcomeV1): PluginResultV1 {\n\tif (!outcome.ok) {\n\t\treturn buildPluginResultV1({\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: \"failed\",\n\t\t\tsummary: \"Playwright browser dependency setup failed\",\n\t\t\tartifacts: [],\n\t\t\tevidence: [],\n\t\t\terror: {\n\t\t\t\tversion: 1,\n\t\t\t\tcode: \"browser_setup_failed\",\n\t\t\t\tmessage: boundedPreviewV1(outcome.message, 8192),\n\t\t\t},\n\t\t});\n\t}\n\treturn buildPluginResultV1({\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus: \"succeeded\",\n\t\tsummary: outcome.alreadyInstalled\n\t\t\t? \"Playwright browser dependencies are already installed\"\n\t\t\t: \"Playwright browser dependencies installed\",\n\t\tartifacts: [],\n\t\tevidence: [\n\t\t\t{\n\t\t\t\tversion: 1,\n\t\t\t\tevidenceId: `${operationId}-evidence-1`,\n\t\t\t\tkind: \"log\",\n\t\t\t\toperationId,\n\t\t\t\tsummary: outcome.log.trim() === \"\" ? \"(no output)\" : boundedPreviewV1(outcome.log, 4096),\n\t\t\t},\n\t\t],\n\t\tverification: {\n\t\t\tversion: 1,\n\t\t\tstatus: \"passed\",\n\t\t\tchecks: [outcome.alreadyInstalled ? \"playwright-already-installed\" : \"playwright-install-completed\"],\n\t\t},\n\t});\n}\n\nexport function createBrowserCapabilityFactoryV1(runtime: BrowserRuntimeV1): CapabilityPluginSyncFactory {\n\treturn (api: CapabilityAPI) => {\n\t\tconst readonlyMode = api.host.mode === \"readonly\";\n\t\tlet session: Promise<BrowserDriverV1> | undefined;\n\t\tconst connect = (): Promise<BrowserDriverV1> => {\n\t\t\tif (session === undefined) session = runtime.connect();\n\t\t\treturn session;\n\t\t};\n\t\tconst withSession = async (\n\t\t\toperationId: string,\n\t\t\taction: (active: BrowserDriverV1) => Promise<PluginResultV1>,\n\t\t): Promise<PluginResultV1> => {\n\t\t\tlet active: BrowserDriverV1;\n\t\t\ttry {\n\t\t\t\tactive = await connect();\n\t\t\t} catch (error) {\n\t\t\t\tsession = undefined;\n\t\t\t\treturn buildPluginResultV1({\n\t\t\t\t\tversion: 1,\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: browserAbort(error) ? \"cancelled\" : \"failed\",\n\t\t\t\t\tsummary: \"Browser session connection failed\",\n\t\t\t\t\tartifacts: [],\n\t\t\t\t\tevidence: [],\n\t\t\t\t\terror: {\n\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\tcode: browserAbort(error) ? \"cancelled\" : \"browser_connection_failed\",\n\t\t\t\t\t\tmessage: browserAbort(error) ? \"Browser operation was cancelled\" : browserVisibleError(error),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn await action(active);\n\t\t\t} catch (error) {\n\t\t\t\treturn buildPluginResultV1({\n\t\t\t\t\tversion: 1,\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: browserAbort(error) ? \"cancelled\" : \"failed\",\n\t\t\t\t\tsummary: \"Browser operation failed\",\n\t\t\t\t\tartifacts: [],\n\t\t\t\t\tevidence: [],\n\t\t\t\t\terror: {\n\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\tcode: browserAbort(error) ? \"cancelled\" : \"browser_operation_failed\",\n\t\t\t\t\t\tmessage: browserAbort(error) ? \"Browser operation was cancelled\" : browserVisibleError(error),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tconst operationOptions = (operationId: string, third: unknown): BrowserOperationOptionsV1 => ({\n\t\t\toperationId,\n\t\t\t...(signalFrom(third) === undefined ? {} : { signal: signalFrom(third) }),\n\t\t});\n\t\tconst registrations: DisposableRegistration[] = [];\n\t\tif (!readonlyMode) {\n\t\t\tregistrations.push(\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_navigate\",\n\t\t\t\t\tlabel: \"Browser navigate\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Navigate the active browser session and return structured verification evidence. Requires Playwright in <agentDir>/browser-deps; when missing, run browser_setup or follow the returned install commands\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\turl: Type.String({ minLength: 1 }),\n\t\t\t\t\t\twaitUntil: Type.Optional(\n\t\t\t\t\t\t\tType.Union([\n\t\t\t\t\t\t\t\tType.Literal(\"commit\"),\n\t\t\t\t\t\t\t\tType.Literal(\"domcontentloaded\"),\n\t\t\t\t\t\t\t\tType.Literal(\"load\"),\n\t\t\t\t\t\t\t\tType.Literal(\"networkidle\"),\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.navigate(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\turl: nonEmptyString(input.url, \"url\"),\n\t\t\t\t\t\t\t\t\t...(input.waitUntil === undefined\n\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t: { waitUntil: input.waitUntil as BrowserNavigateInputV1[\"waitUntil\"] }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tregistrations.push(\n\t\t\tapi.registerTool({\n\t\t\t\tname: \"browser_snapshot\",\n\t\t\t\tlabel: \"Browser snapshot\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Capture accessibility, DOM, or screenshot evidence from the active browser session (styles capture is not supported in this build)\",\n\t\t\t\tparameters: Type.Object({\n\t\t\t\t\tincludeDom: Type.Optional(Type.Boolean()),\n\t\t\t\t\tincludeA11y: Type.Optional(Type.Boolean()),\n\t\t\t\t\tincludeStyles: Type.Optional(Type.Boolean()),\n\t\t\t\t\tincludeScreenshot: Type.Optional(Type.Boolean()),\n\t\t\t\t}),\n\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\tactive.snapshot(input as BrowserSnapshotInputV1, operationOptions(operationId, third)),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tif (!readonlyMode) {\n\t\t\tregistrations.push(\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_locator_action\",\n\t\t\t\t\tlabel: \"Browser locator action\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Perform a locator-based browser action (click/dblclick/rightclick/fill/type/press/hover/select/check/uncheck/clear/upload/scroll) and return post-action accessibility evidence\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\tlocator: browserLocatorSchema,\n\t\t\t\t\t\taction: Type.Union([\n\t\t\t\t\t\t\tType.Literal(\"click\"),\n\t\t\t\t\t\t\tType.Literal(\"dblclick\"),\n\t\t\t\t\t\t\tType.Literal(\"rightclick\"),\n\t\t\t\t\t\t\tType.Literal(\"fill\"),\n\t\t\t\t\t\t\tType.Literal(\"type\"),\n\t\t\t\t\t\t\tType.Literal(\"press\"),\n\t\t\t\t\t\t\tType.Literal(\"hover\"),\n\t\t\t\t\t\t\tType.Literal(\"select\"),\n\t\t\t\t\t\t\tType.Literal(\"check\"),\n\t\t\t\t\t\t\tType.Literal(\"uncheck\"),\n\t\t\t\t\t\t\tType.Literal(\"clear\"),\n\t\t\t\t\t\t\tType.Literal(\"upload\"),\n\t\t\t\t\t\t\tType.Literal(\"scroll\"),\n\t\t\t\t\t\t]),\n\t\t\t\t\t\tvalue: Type.Optional(Type.String({ maxLength: 4096 })),\n\t\t\t\t\t\tkey: Type.Optional(Type.String({ maxLength: 128 })),\n\t\t\t\t\t\tdelay: Type.Optional(Type.Integer({ minimum: 0, maximum: 60_000 })),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.locatorAction(\n\t\t\t\t\t\t\t\tinput as unknown as BrowserLocatorActionInputV1,\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tregistrations.push(\n\t\t\tapi.registerTool({\n\t\t\t\tname: \"browser_assert_postcondition\",\n\t\t\t\tlabel: \"Browser assertion\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Assert a URL, element, text, console, or network postcondition (single condition or an array of 1..32, all ANDed) without changing the browser\",\n\t\t\t\tparameters: Type.Object({\n\t\t\t\t\tcondition: browserPostconditionInputSchema,\n\t\t\t\t}),\n\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\tactive.assertPostcondition(\n\t\t\t\t\t\t\tinput.condition as BrowserPostconditionV1 | readonly BrowserPostconditionV1[],\n\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tregistrations.push(\n\t\t\tapi.registerTool({\n\t\t\t\tname: \"browser_collect_evidence\",\n\t\t\t\tlabel: \"Browser evidence\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Collect console, network, or accessibility-snapshot evidence from the active browser session without changing it\",\n\t\t\t\tparameters: Type.Object({\n\t\t\t\t\tkind: Type.Union([Type.Literal(\"console\"), Type.Literal(\"network\"), Type.Literal(\"snapshot\")]),\n\t\t\t\t}),\n\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\tconst kind = input.kind;\n\t\t\t\t\tif (kind !== \"console\" && kind !== \"network\" && kind !== \"snapshot\") {\n\t\t\t\t\t\tthrow new Error(\"kind must be console, network, or snapshot\");\n\t\t\t\t\t}\n\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\tactive.collectEvidence(kind as BrowserEvidenceKindV1, operationOptions(operationId, third)),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tregistrations.push(\n\t\t\tapi.registerTool({\n\t\t\t\tname: \"browser_console\",\n\t\t\t\tlabel: \"Browser console\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Read the bounded console ring buffer (page messages plus auto-accepted [dialog] traces) with optional level/contains filters, without changing the browser\",\n\t\t\t\tparameters: Type.Object({\n\t\t\t\t\tlevel: Type.Optional(browserConsoleLevelSchema),\n\t\t\t\t\tcontains: Type.Optional(Type.String({ minLength: 1 })),\n\t\t\t\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: 200 })),\n\t\t\t\t}),\n\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\tactive.consoleEntries(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...(typeof input.level === \"string\" ? { level: input.level } : {}),\n\t\t\t\t\t\t\t\t...(typeof input.contains === \"string\" ? { contains: input.contains } : {}),\n\t\t\t\t\t\t\t\t...(typeof input.limit === \"number\" ? { limit: input.limit } : {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t}),\n\t\t\tapi.registerTool({\n\t\t\t\tname: \"browser_network\",\n\t\t\t\tlabel: \"Browser network\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Read the bounded network ring buffer (method/url/status/duration/size when available) with optional containsUrl/status/method filters, without changing the browser\",\n\t\t\t\tparameters: Type.Object({\n\t\t\t\t\tcontainsUrl: Type.Optional(Type.String({ minLength: 1 })),\n\t\t\t\t\tstatus: Type.Optional(Type.Integer({ minimum: 100, maximum: 599 })),\n\t\t\t\t\tmethod: Type.Optional(Type.String({ minLength: 1, maxLength: 16 })),\n\t\t\t\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: 200 })),\n\t\t\t\t}),\n\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\tactive.networkEntries(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...(typeof input.containsUrl === \"string\" ? { containsUrl: input.containsUrl } : {}),\n\t\t\t\t\t\t\t\t...(typeof input.status === \"number\" ? { status: input.status } : {}),\n\t\t\t\t\t\t\t\t...(typeof input.method === \"string\" ? { method: input.method } : {}),\n\t\t\t\t\t\t\t\t...(typeof input.limit === \"number\" ? { limit: input.limit } : {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t}),\n\t\t\tapi.registerTool({\n\t\t\t\tname: \"browser_performance\",\n\t\t\t\tlabel: \"Browser performance\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Read structured page performance metrics (Navigation Timing, paint, resource summary, DOM node count) without changing the browser\",\n\t\t\t\tparameters: Type.Object({}),\n\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\tconst { operationId } = toolInvocation(first, second);\n\t\t\t\t\treturn withSession(operationId, (active) => active.performance(operationOptions(operationId, third)));\n\t\t\t\t},\n\t\t\t}),\n\t\t\tapi.registerTool({\n\t\t\t\tname: \"browser_wait\",\n\t\t\t\tlabel: \"Browser wait\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Wait until a selector is visible, navigation completes, the network goes idle, or a fixed time passes (max 30s) and report the actual wait duration\",\n\t\t\t\tparameters: Type.Object({\n\t\t\t\t\tuntil: browserWaitUntilKindSchema,\n\t\t\t\t\tlocator: Type.Optional(browserLocatorSchema),\n\t\t\t\t\tms: Type.Optional(Type.Integer({ minimum: 0, maximum: 30_000 })),\n\t\t\t\t}),\n\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\tconst until = input.until;\n\t\t\t\t\tif (until !== \"selector\" && until !== \"navigation\" && until !== \"networkidle\" && until !== \"time\") {\n\t\t\t\t\t\tthrow new Error(\"until must be selector, navigation, networkidle, or time\");\n\t\t\t\t\t}\n\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\tactive.wait(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tuntil,\n\t\t\t\t\t\t\t\t...(until === \"selector\" ? { locator: input.locator as BrowserLocatorV1 | undefined } : {}),\n\t\t\t\t\t\t\t\t...(typeof input.ms === \"number\" ? { ms: input.ms } : {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tif (!readonlyMode) {\n\t\t\tregistrations.push(\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_evaluate\",\n\t\t\t\t\tlabel: \"Browser evaluate\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Escape hatch: evaluate a JavaScript expression in the page context and return the JSON-serialized result (bounded 64KiB, 30s timeout; dialogs are auto-accepted). Keep it a plain expression; for multi-statement logic use an IIFE string like ((() => { ... return x; })()) — a bare () => ... arrow string is not invoked and yields undefined. Only use this when no built-in browser tool covers the operation\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\texpression: Type.String({ minLength: 1, maxLength: 32_768 }),\n\t\t\t\t\t\targ: Type.Optional(Type.Unknown()),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.evaluate(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\texpression: nonEmptyString(input.expression, \"expression\"),\n\t\t\t\t\t\t\t\t\t...(input.arg === undefined ? {} : { arg: input.arg }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_drag\",\n\t\t\t\t\tlabel: \"Browser drag\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Drag from one element to another (hover source, press, hover target, stepped move to target center, release)\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\tfrom: browserLocatorSchema,\n\t\t\t\t\t\tto: browserLocatorSchema,\n\t\t\t\t\t\tsteps: Type.Optional(Type.Integer({ minimum: 1, maximum: 100 })),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.drag(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfrom: input.from as BrowserLocatorV1,\n\t\t\t\t\t\t\t\t\tto: input.to as BrowserLocatorV1,\n\t\t\t\t\t\t\t\t\t...(typeof input.steps === \"number\" ? { steps: input.steps } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_mouse\",\n\t\t\t\t\tlabel: \"Browser mouse\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Raw mouse actions at viewport coordinates without needing an element (move/click/dblclick/rightclick/wheel); wheel is the basic page-scroll primitive\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\taction: browserMouseActionSchema,\n\t\t\t\t\t\tx: Type.Integer({ minimum: 0 }),\n\t\t\t\t\t\ty: Type.Integer({ minimum: 0 }),\n\t\t\t\t\t\tdeltaX: Type.Optional(Type.Integer({ minimum: -100_000, maximum: 100_000 })),\n\t\t\t\t\t\tdeltaY: Type.Optional(Type.Integer({ minimum: -100_000, maximum: 100_000 })),\n\t\t\t\t\t\tbutton: Type.Optional(browserMouseButtonSchema),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.mouse(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\taction: input.action as BrowserMouseInputV1[\"action\"],\n\t\t\t\t\t\t\t\t\tx: requiredInteger(input.x, \"x\"),\n\t\t\t\t\t\t\t\t\ty: requiredInteger(input.y, \"y\"),\n\t\t\t\t\t\t\t\t\t...(typeof input.deltaX === \"number\" ? { deltaX: input.deltaX } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.deltaY === \"number\" ? { deltaY: input.deltaY } : {}),\n\t\t\t\t\t\t\t\t\t...(input.button === undefined ? {} : { button: input.button as BrowserMouseButtonV1 }),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_press_key\",\n\t\t\t\t\tlabel: \"Browser press key\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Press a page-level key combination by Playwright key name (e.g. Control+a, Enter, Meta+c) without needing an element\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\tkey: Type.String({ minLength: 1, maxLength: 128 }),\n\t\t\t\t\t\tdelay: Type.Optional(Type.Integer({ minimum: 0, maximum: 60_000 })),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.pressKey(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey: nonEmptyString(input.key, \"key\"),\n\t\t\t\t\t\t\t\t\t...(typeof input.delay === \"number\" ? { delay: input.delay } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_tabs\",\n\t\t\t\t\tlabel: \"Browser tabs\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Manage browser tabs: list (title/url/index), new (optional url), switch by index, or close by index\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\taction: browserTabsActionSchema,\n\t\t\t\t\t\tindex: Type.Optional(Type.Integer({ minimum: 0 })),\n\t\t\t\t\t\turl: Type.Optional(Type.String({ minLength: 1, maxLength: 4096 })),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.tabs(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\taction: input.action as BrowserTabsInputV1[\"action\"],\n\t\t\t\t\t\t\t\t\t...(typeof input.index === \"number\" ? { index: input.index } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.url === \"string\" ? { url: input.url } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_storage\",\n\t\t\t\t\tlabel: \"Browser storage\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Manage browser storage: cookies (get-cookies/set-cookie/clear-cookies via the context) and localStorage (get-local/set-local/clear-local via the page)\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\taction: browserStorageActionSchema,\n\t\t\t\t\t\tname: Type.Optional(Type.String({ minLength: 1, maxLength: 4096 })),\n\t\t\t\t\t\tvalue: Type.Optional(Type.String({ maxLength: 4096 })),\n\t\t\t\t\t\tdomain: Type.Optional(Type.String({ minLength: 1, maxLength: 255 })),\n\t\t\t\t\t\tpath: Type.Optional(Type.String({ maxLength: 1024 })),\n\t\t\t\t\t\texpires: Type.Optional(Type.Number()),\n\t\t\t\t\t\tkey: Type.Optional(Type.String({ minLength: 1, maxLength: 4096 })),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.storage(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\taction: input.action as BrowserStorageInputV1[\"action\"],\n\t\t\t\t\t\t\t\t\t...(typeof input.name === \"string\" ? { name: input.name } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.value === \"string\" ? { value: input.value } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.domain === \"string\" ? { domain: input.domain } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.path === \"string\" ? { path: input.path } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.expires === \"number\" ? { expires: input.expires } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.key === \"string\" ? { key: input.key } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_viewport\",\n\t\t\t\t\tlabel: \"Browser viewport\",\n\t\t\t\t\tdescription: \"Set the viewport size (width/height clamped into 320..7680) or read the current one\",\n\t\t\t\t\tparameters: Type.Object({\n\t\t\t\t\t\taction: browserViewportActionSchema,\n\t\t\t\t\t\twidth: Type.Optional(Type.Integer({ minimum: 0, maximum: 100_000 })),\n\t\t\t\t\t\theight: Type.Optional(Type.Integer({ minimum: 0, maximum: 100_000 })),\n\t\t\t\t\t}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { input, operationId } = toolInvocation(first, second);\n\t\t\t\t\t\treturn withSession(operationId, (active) =>\n\t\t\t\t\t\t\tactive.viewport(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\taction: input.action as BrowserViewportInputV1[\"action\"],\n\t\t\t\t\t\t\t\t\t...(typeof input.width === \"number\" ? { width: input.width } : {}),\n\t\t\t\t\t\t\t\t\t...(typeof input.height === \"number\" ? { height: input.height } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\toperationOptions(operationId, third),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tif (!readonlyMode) {\n\t\t\tregistrations.push(\n\t\t\t\tapi.registerTool({\n\t\t\t\t\tname: \"browser_setup\",\n\t\t\t\t\tlabel: \"Browser setup\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Install Playwright and the Chromium browser into <agentDir>/browser-deps (npm install playwright --prefix <dir>, then npx playwright install chromium). Reports alreadyInstalled when dependencies are present\",\n\t\t\t\t\tparameters: Type.Object({}),\n\t\t\t\t\texecute: async (first: unknown, second?: unknown, third?: unknown) => {\n\t\t\t\t\t\tconst { operationId } = toolInvocation(first, second);\n\t\t\t\t\t\tconst signal = signalFrom(third);\n\t\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\t\treturn buildPluginResultV1({\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\tstatus: \"cancelled\",\n\t\t\t\t\t\t\t\tsummary: \"Browser operation was cancelled\",\n\t\t\t\t\t\t\t\tartifacts: [],\n\t\t\t\t\t\t\t\tevidence: [],\n\t\t\t\t\t\t\t\terror: { version: 1, code: \"cancelled\", message: \"Browser operation was cancelled\" },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Call through the runtime: extracting the method would drop\n\t\t\t\t\t\t// `this`, and the production class reads `this.options` in setup().\n\t\t\t\t\t\tif (runtime.setup === undefined) {\n\t\t\t\t\t\t\treturn buildPluginResultV1({\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\t\t\tsummary: \"This browser runtime does not support self-installation\",\n\t\t\t\t\t\t\t\tartifacts: [],\n\t\t\t\t\t\t\t\tevidence: [],\n\t\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\tcode: \"browser_setup_unsupported\",\n\t\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\t\t\"The injected browser runtime exposes no setup face. Install Playwright manually with npm install playwright --prefix <agentDir>/browser-deps and npx playwright install chromium.\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn setupResult(operationId, await runtime.setup());\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treturn buildPluginResultV1({\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\t\t\tsummary: \"Playwright browser dependency setup failed\",\n\t\t\t\t\t\t\t\tartifacts: [],\n\t\t\t\t\t\t\t\tevidence: [],\n\t\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\tcode: \"browser_setup_failed\",\n\t\t\t\t\t\t\t\t\tmessage: browserVisibleError(error),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\tif (session === undefined) return;\n\t\t\t\t// Both a failed connection and a failed close happen after this synchronous\n\t\t\t\t// disposer returns. Consume either rejection so disposal cannot leak a promise.\n\t\t\t\tvoid session.then((active) => active.close()).catch(() => undefined);\n\t\t\t},\n\t\t};\n\t};\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CapabilityPluginSyncFactory } from "@agent-forge/plugin-sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Default-export factory consumed by the host's `loadCapabilityPluginFromManifest`.
|
|
4
|
+
*
|
|
5
|
+
* The runtime is built per load from the host's `agentDir` (`api.host.agentDir`):
|
|
6
|
+
* Playwright resolves and self-installs into `<agentDir>/browser-deps`, the
|
|
7
|
+
* same directory `browser_setup` manages. Browsers launch headless by default.
|
|
8
|
+
* A readonly host mode registers only the observation-only tools; the input
|
|
9
|
+
* and setup tools never register there.
|
|
10
|
+
*/
|
|
11
|
+
declare const factory: CapabilityPluginSyncFactory;
|
|
12
|
+
export default factory;
|
|
13
|
+
//# sourceMappingURL=entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAI3E;;;;;;;;GAQG;AACH,QAAA,MAAM,OAAO,EAAE,2BACwF,CAAC;AAExG,eAAe,OAAO,CAAC","sourcesContent":["import type { CapabilityPluginSyncFactory } from \"@agent-forge/plugin-sdk\";\nimport { createBrowserCapabilityFactoryV1 } from \"./capability.ts\";\nimport { PlaywrightBrowserRuntimeV1 } from \"./playwright-driver.ts\";\n\n/**\n * Default-export factory consumed by the host's `loadCapabilityPluginFromManifest`.\n *\n * The runtime is built per load from the host's `agentDir` (`api.host.agentDir`):\n * Playwright resolves and self-installs into `<agentDir>/browser-deps`, the\n * same directory `browser_setup` manages. Browsers launch headless by default.\n * A readonly host mode registers only the observation-only tools; the input\n * and setup tools never register there.\n */\nconst factory: CapabilityPluginSyncFactory = (api) =>\n\tcreateBrowserCapabilityFactoryV1(new PlaywrightBrowserRuntimeV1({ agentDir: api.host.agentDir }))(api);\n\nexport default factory;\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createBrowserCapabilityFactoryV1 } from "./capability.js";
|
|
2
|
+
import { PlaywrightBrowserRuntimeV1 } from "./playwright-driver.js";
|
|
3
|
+
/**
|
|
4
|
+
* Default-export factory consumed by the host's `loadCapabilityPluginFromManifest`.
|
|
5
|
+
*
|
|
6
|
+
* The runtime is built per load from the host's `agentDir` (`api.host.agentDir`):
|
|
7
|
+
* Playwright resolves and self-installs into `<agentDir>/browser-deps`, the
|
|
8
|
+
* same directory `browser_setup` manages. Browsers launch headless by default.
|
|
9
|
+
* A readonly host mode registers only the observation-only tools; the input
|
|
10
|
+
* and setup tools never register there.
|
|
11
|
+
*/
|
|
12
|
+
const factory = (api) => createBrowserCapabilityFactoryV1(new PlaywrightBrowserRuntimeV1({ agentDir: api.host.agentDir }))(api);
|
|
13
|
+
export default factory;
|
|
14
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAgC,CAAC,GAAG,EAAE,EAAE,CACpD,gCAAgC,CAAC,IAAI,0BAA0B,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAExG,eAAe,OAAO,CAAC","sourcesContent":["import type { CapabilityPluginSyncFactory } from \"@agent-forge/plugin-sdk\";\nimport { createBrowserCapabilityFactoryV1 } from \"./capability.ts\";\nimport { PlaywrightBrowserRuntimeV1 } from \"./playwright-driver.ts\";\n\n/**\n * Default-export factory consumed by the host's `loadCapabilityPluginFromManifest`.\n *\n * The runtime is built per load from the host's `agentDir` (`api.host.agentDir`):\n * Playwright resolves and self-installs into `<agentDir>/browser-deps`, the\n * same directory `browser_setup` manages. Browsers launch headless by default.\n * A readonly host mode registers only the observation-only tools; the input\n * and setup tools never register there.\n */\nconst factory: CapabilityPluginSyncFactory = (api) =>\n\tcreateBrowserCapabilityFactoryV1(new PlaywrightBrowserRuntimeV1({ agentDir: api.host.agentDir }))(api);\n\nexport default factory;\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createBrowserCapabilityFactoryV1 } from "./capability.ts";
|
|
2
|
+
export { BROWSER_DEFAULT_DRAG_STEPS_V1, BROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1, BROWSER_DEFAULT_READ_LIMIT_V1, BROWSER_MAX_DRAG_STEPS_V1, BROWSER_MAX_READ_LIMIT_V1, BROWSER_MAX_VIEWPORT_V1, BROWSER_MAX_WAIT_MS_V1, BROWSER_MIN_VIEWPORT_V1, type BrowserConsoleReadResultV1, type BrowserNetworkReadResultV1, type BrowserScrollDirectiveV1, clampDragStepsV1, clampReadLimitV1, clampViewportDimensionV1, clampWaitMsV1, filterConsoleEntriesV1, filterNetworkEntriesV1, parseConsoleLevelFilterV1, parseScrollDirectiveV1, parseUploadPathsV1, scrollWheelDeltaV1, serializeJsonPayloadV1, shapePerformanceV1, waitMissingInput, } from "./operations.ts";
|
|
3
|
+
export { BROWSER_DOWNLOADS_DIR_NAME_V1, BROWSER_MAX_DOM_CHARS_V1, BROWSER_MAX_EVIDENCE_CHARS_V1, BROWSER_MAX_SCREENSHOT_BYTES_V1, BROWSER_MAX_SNAPSHOT_CHARS_V1, BROWSER_RING_BUFFER_SIZE_V1, PlaywrightBrowserDriver, PlaywrightBrowserRuntimeV1, } from "./playwright-driver.ts";
|
|
4
|
+
export type { BrowserSetupOptionsV1, BrowserSpawnResultV1, BrowserSpawnSyncV1, } from "./setup.ts";
|
|
5
|
+
export { BROWSER_BROWSERS_DIR_NAME_V1, BROWSER_DEPS_DIR_NAME_V1, BROWSER_MAX_FAILURE_MESSAGE_CHARS_V1, BROWSER_MAX_PROGRESS_CHARS_V1, BROWSER_MAX_STDERR_TAIL_CHARS_V1, BROWSER_MAX_STDOUT_TAIL_CHARS_V1, BROWSER_SETUP_TIMEOUT_MS_V1, boundedPreviewV1, boundedTailV1, browserDepsDirFor, browserSetupEnvironmentV1, installGuidanceMessage, resolvePlaywrightModule, setupBrowserDepsPlaywrightV1, } from "./setup.ts";
|
|
6
|
+
export type { BrowserConsoleEntryV1, BrowserConsoleReadInputV1, BrowserDragInputV1, BrowserDriverV1, BrowserElementStateV1, BrowserEvaluateInputV1, BrowserEvidenceKindV1, BrowserLocatorActionInputV1, BrowserLocatorActionKindV1, BrowserLocatorKindV1, BrowserLocatorV1, BrowserMouseActionKindV1, BrowserMouseButtonV1, BrowserMouseInputV1, BrowserNavigateInputV1, BrowserNetworkEntryV1, BrowserNetworkReadInputV1, BrowserOperationOptionsV1, BrowserPerformancePayloadV1, BrowserPerformanceRawV1, BrowserPostconditionV1, BrowserPressKeyInputV1, BrowserRuntimeV1, BrowserSetupOutcomeV1, BrowserSnapshotInputV1, BrowserStorageActionKindV1, BrowserStorageInputV1, BrowserTabsActionKindV1, BrowserTabsInputV1, BrowserViewportActionKindV1, BrowserViewportInputV1, BrowserWaitInputV1, BrowserWaitUntilKindV1, BrowserWaitUntilV1, } from "./types.ts";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACN,6BAA6B,EAC7B,sCAAsC,EACtC,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,6BAA6B,EAC7B,wBAAwB,EACxB,6BAA6B,EAC7B,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACX,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,4BAA4B,EAC5B,wBAAwB,EACxB,oCAAoC,EACpC,6BAA6B,EAC7B,gCAAgC,EAChC,gCAAgC,EAChC,2BAA2B,EAC3B,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,GAC5B,MAAM,YAAY,CAAC;AACpB,YAAY,EACX,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,GAClB,MAAM,YAAY,CAAC","sourcesContent":["export { createBrowserCapabilityFactoryV1 } from \"./capability.ts\";\nexport {\n\tBROWSER_DEFAULT_DRAG_STEPS_V1,\n\tBROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1,\n\tBROWSER_DEFAULT_READ_LIMIT_V1,\n\tBROWSER_MAX_DRAG_STEPS_V1,\n\tBROWSER_MAX_READ_LIMIT_V1,\n\tBROWSER_MAX_VIEWPORT_V1,\n\tBROWSER_MAX_WAIT_MS_V1,\n\tBROWSER_MIN_VIEWPORT_V1,\n\ttype BrowserConsoleReadResultV1,\n\ttype BrowserNetworkReadResultV1,\n\ttype BrowserScrollDirectiveV1,\n\tclampDragStepsV1,\n\tclampReadLimitV1,\n\tclampViewportDimensionV1,\n\tclampWaitMsV1,\n\tfilterConsoleEntriesV1,\n\tfilterNetworkEntriesV1,\n\tparseConsoleLevelFilterV1,\n\tparseScrollDirectiveV1,\n\tparseUploadPathsV1,\n\tscrollWheelDeltaV1,\n\tserializeJsonPayloadV1,\n\tshapePerformanceV1,\n\twaitMissingInput,\n} from \"./operations.ts\";\nexport {\n\tBROWSER_DOWNLOADS_DIR_NAME_V1,\n\tBROWSER_MAX_DOM_CHARS_V1,\n\tBROWSER_MAX_EVIDENCE_CHARS_V1,\n\tBROWSER_MAX_SCREENSHOT_BYTES_V1,\n\tBROWSER_MAX_SNAPSHOT_CHARS_V1,\n\tBROWSER_RING_BUFFER_SIZE_V1,\n\tPlaywrightBrowserDriver,\n\tPlaywrightBrowserRuntimeV1,\n} from \"./playwright-driver.ts\";\nexport type {\n\tBrowserSetupOptionsV1,\n\tBrowserSpawnResultV1,\n\tBrowserSpawnSyncV1,\n} from \"./setup.ts\";\nexport {\n\tBROWSER_BROWSERS_DIR_NAME_V1,\n\tBROWSER_DEPS_DIR_NAME_V1,\n\tBROWSER_MAX_FAILURE_MESSAGE_CHARS_V1,\n\tBROWSER_MAX_PROGRESS_CHARS_V1,\n\tBROWSER_MAX_STDERR_TAIL_CHARS_V1,\n\tBROWSER_MAX_STDOUT_TAIL_CHARS_V1,\n\tBROWSER_SETUP_TIMEOUT_MS_V1,\n\tboundedPreviewV1,\n\tboundedTailV1,\n\tbrowserDepsDirFor,\n\tbrowserSetupEnvironmentV1,\n\tinstallGuidanceMessage,\n\tresolvePlaywrightModule,\n\tsetupBrowserDepsPlaywrightV1,\n} from \"./setup.ts\";\nexport type {\n\tBrowserConsoleEntryV1,\n\tBrowserConsoleReadInputV1,\n\tBrowserDragInputV1,\n\tBrowserDriverV1,\n\tBrowserElementStateV1,\n\tBrowserEvaluateInputV1,\n\tBrowserEvidenceKindV1,\n\tBrowserLocatorActionInputV1,\n\tBrowserLocatorActionKindV1,\n\tBrowserLocatorKindV1,\n\tBrowserLocatorV1,\n\tBrowserMouseActionKindV1,\n\tBrowserMouseButtonV1,\n\tBrowserMouseInputV1,\n\tBrowserNavigateInputV1,\n\tBrowserNetworkEntryV1,\n\tBrowserNetworkReadInputV1,\n\tBrowserOperationOptionsV1,\n\tBrowserPerformancePayloadV1,\n\tBrowserPerformanceRawV1,\n\tBrowserPostconditionV1,\n\tBrowserPressKeyInputV1,\n\tBrowserRuntimeV1,\n\tBrowserSetupOutcomeV1,\n\tBrowserSnapshotInputV1,\n\tBrowserStorageActionKindV1,\n\tBrowserStorageInputV1,\n\tBrowserTabsActionKindV1,\n\tBrowserTabsInputV1,\n\tBrowserViewportActionKindV1,\n\tBrowserViewportInputV1,\n\tBrowserWaitInputV1,\n\tBrowserWaitUntilKindV1,\n\tBrowserWaitUntilV1,\n} from \"./types.ts\";\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createBrowserCapabilityFactoryV1 } from "./capability.js";
|
|
2
|
+
export { BROWSER_DEFAULT_DRAG_STEPS_V1, BROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1, BROWSER_DEFAULT_READ_LIMIT_V1, BROWSER_MAX_DRAG_STEPS_V1, BROWSER_MAX_READ_LIMIT_V1, BROWSER_MAX_VIEWPORT_V1, BROWSER_MAX_WAIT_MS_V1, BROWSER_MIN_VIEWPORT_V1, clampDragStepsV1, clampReadLimitV1, clampViewportDimensionV1, clampWaitMsV1, filterConsoleEntriesV1, filterNetworkEntriesV1, parseConsoleLevelFilterV1, parseScrollDirectiveV1, parseUploadPathsV1, scrollWheelDeltaV1, serializeJsonPayloadV1, shapePerformanceV1, waitMissingInput, } from "./operations.js";
|
|
3
|
+
export { BROWSER_DOWNLOADS_DIR_NAME_V1, BROWSER_MAX_DOM_CHARS_V1, BROWSER_MAX_EVIDENCE_CHARS_V1, BROWSER_MAX_SCREENSHOT_BYTES_V1, BROWSER_MAX_SNAPSHOT_CHARS_V1, BROWSER_RING_BUFFER_SIZE_V1, PlaywrightBrowserDriver, PlaywrightBrowserRuntimeV1, } from "./playwright-driver.js";
|
|
4
|
+
export { BROWSER_BROWSERS_DIR_NAME_V1, BROWSER_DEPS_DIR_NAME_V1, BROWSER_MAX_FAILURE_MESSAGE_CHARS_V1, BROWSER_MAX_PROGRESS_CHARS_V1, BROWSER_MAX_STDERR_TAIL_CHARS_V1, BROWSER_MAX_STDOUT_TAIL_CHARS_V1, BROWSER_SETUP_TIMEOUT_MS_V1, boundedPreviewV1, boundedTailV1, browserDepsDirFor, browserSetupEnvironmentV1, installGuidanceMessage, resolvePlaywrightModule, setupBrowserDepsPlaywrightV1, } from "./setup.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACN,6BAA6B,EAC7B,sCAAsC,EACtC,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EAIvB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,6BAA6B,EAC7B,wBAAwB,EACxB,6BAA6B,EAC7B,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,GAC1B,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACN,4BAA4B,EAC5B,wBAAwB,EACxB,oCAAoC,EACpC,6BAA6B,EAC7B,gCAAgC,EAChC,gCAAgC,EAChC,2BAA2B,EAC3B,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,GAC5B,MAAM,YAAY,CAAC","sourcesContent":["export { createBrowserCapabilityFactoryV1 } from \"./capability.ts\";\nexport {\n\tBROWSER_DEFAULT_DRAG_STEPS_V1,\n\tBROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1,\n\tBROWSER_DEFAULT_READ_LIMIT_V1,\n\tBROWSER_MAX_DRAG_STEPS_V1,\n\tBROWSER_MAX_READ_LIMIT_V1,\n\tBROWSER_MAX_VIEWPORT_V1,\n\tBROWSER_MAX_WAIT_MS_V1,\n\tBROWSER_MIN_VIEWPORT_V1,\n\ttype BrowserConsoleReadResultV1,\n\ttype BrowserNetworkReadResultV1,\n\ttype BrowserScrollDirectiveV1,\n\tclampDragStepsV1,\n\tclampReadLimitV1,\n\tclampViewportDimensionV1,\n\tclampWaitMsV1,\n\tfilterConsoleEntriesV1,\n\tfilterNetworkEntriesV1,\n\tparseConsoleLevelFilterV1,\n\tparseScrollDirectiveV1,\n\tparseUploadPathsV1,\n\tscrollWheelDeltaV1,\n\tserializeJsonPayloadV1,\n\tshapePerformanceV1,\n\twaitMissingInput,\n} from \"./operations.ts\";\nexport {\n\tBROWSER_DOWNLOADS_DIR_NAME_V1,\n\tBROWSER_MAX_DOM_CHARS_V1,\n\tBROWSER_MAX_EVIDENCE_CHARS_V1,\n\tBROWSER_MAX_SCREENSHOT_BYTES_V1,\n\tBROWSER_MAX_SNAPSHOT_CHARS_V1,\n\tBROWSER_RING_BUFFER_SIZE_V1,\n\tPlaywrightBrowserDriver,\n\tPlaywrightBrowserRuntimeV1,\n} from \"./playwright-driver.ts\";\nexport type {\n\tBrowserSetupOptionsV1,\n\tBrowserSpawnResultV1,\n\tBrowserSpawnSyncV1,\n} from \"./setup.ts\";\nexport {\n\tBROWSER_BROWSERS_DIR_NAME_V1,\n\tBROWSER_DEPS_DIR_NAME_V1,\n\tBROWSER_MAX_FAILURE_MESSAGE_CHARS_V1,\n\tBROWSER_MAX_PROGRESS_CHARS_V1,\n\tBROWSER_MAX_STDERR_TAIL_CHARS_V1,\n\tBROWSER_MAX_STDOUT_TAIL_CHARS_V1,\n\tBROWSER_SETUP_TIMEOUT_MS_V1,\n\tboundedPreviewV1,\n\tboundedTailV1,\n\tbrowserDepsDirFor,\n\tbrowserSetupEnvironmentV1,\n\tinstallGuidanceMessage,\n\tresolvePlaywrightModule,\n\tsetupBrowserDepsPlaywrightV1,\n} from \"./setup.ts\";\nexport type {\n\tBrowserConsoleEntryV1,\n\tBrowserConsoleReadInputV1,\n\tBrowserDragInputV1,\n\tBrowserDriverV1,\n\tBrowserElementStateV1,\n\tBrowserEvaluateInputV1,\n\tBrowserEvidenceKindV1,\n\tBrowserLocatorActionInputV1,\n\tBrowserLocatorActionKindV1,\n\tBrowserLocatorKindV1,\n\tBrowserLocatorV1,\n\tBrowserMouseActionKindV1,\n\tBrowserMouseButtonV1,\n\tBrowserMouseInputV1,\n\tBrowserNavigateInputV1,\n\tBrowserNetworkEntryV1,\n\tBrowserNetworkReadInputV1,\n\tBrowserOperationOptionsV1,\n\tBrowserPerformancePayloadV1,\n\tBrowserPerformanceRawV1,\n\tBrowserPostconditionV1,\n\tBrowserPressKeyInputV1,\n\tBrowserRuntimeV1,\n\tBrowserSetupOutcomeV1,\n\tBrowserSnapshotInputV1,\n\tBrowserStorageActionKindV1,\n\tBrowserStorageInputV1,\n\tBrowserTabsActionKindV1,\n\tBrowserTabsInputV1,\n\tBrowserViewportActionKindV1,\n\tBrowserViewportInputV1,\n\tBrowserWaitInputV1,\n\tBrowserWaitUntilKindV1,\n\tBrowserWaitUntilV1,\n} from \"./types.ts\";\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure browser-operation helpers shared by the real Playwright driver and the
|
|
3
|
+
* deterministic test mock: input parsing (scroll directives, upload path
|
|
4
|
+
* lists), read filters (console levels, network predicates), viewport/wait
|
|
5
|
+
* clamping, and the in-page performance raw-to-payload shaping. No I/O and no
|
|
6
|
+
* Playwright types live here, so both drivers apply exactly the same semantics.
|
|
7
|
+
*/
|
|
8
|
+
import type { BrowserConsoleEntryV1, BrowserConsoleReadInputV1, BrowserLocatorV1, BrowserNetworkEntryV1, BrowserNetworkReadInputV1, BrowserPerformancePayloadV1, BrowserPerformanceRawV1 } from "./types.ts";
|
|
9
|
+
export declare const BROWSER_MAX_WAIT_MS_V1 = 30000;
|
|
10
|
+
export declare const BROWSER_MIN_VIEWPORT_V1 = 320;
|
|
11
|
+
export declare const BROWSER_MAX_VIEWPORT_V1 = 7680;
|
|
12
|
+
export declare const BROWSER_DEFAULT_READ_LIMIT_V1 = 50;
|
|
13
|
+
export declare const BROWSER_MAX_READ_LIMIT_V1 = 200;
|
|
14
|
+
export declare const BROWSER_DEFAULT_DRAG_STEPS_V1 = 8;
|
|
15
|
+
export declare const BROWSER_MAX_DRAG_STEPS_V1 = 100;
|
|
16
|
+
export declare const BROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1 = 30000;
|
|
17
|
+
export type BrowserScrollDirectionV1 = "up" | "down" | "left" | "right";
|
|
18
|
+
export interface BrowserScrollDirectiveV1 {
|
|
19
|
+
readonly direction: BrowserScrollDirectionV1;
|
|
20
|
+
readonly pixels: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parses a `<direction>:<pixels>` scroll directive (`down:500`); throws a
|
|
24
|
+
* stable message for anything else so both drivers fail identically.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseScrollDirectiveV1(value: string): BrowserScrollDirectiveV1;
|
|
27
|
+
/** Wheel deltas for a scroll directive (positive y scrolls down). */
|
|
28
|
+
export declare function scrollWheelDeltaV1(directive: BrowserScrollDirectiveV1): {
|
|
29
|
+
readonly deltaX: number;
|
|
30
|
+
readonly deltaY: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Parses an `upload` value: either a single absolute path or a JSON array of
|
|
34
|
+
* paths; throws on anything else (empty arrays included).
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseUploadPathsV1(value: string): readonly string[];
|
|
37
|
+
/** Parses a comma-combined console level filter into Playwright message types (`info` also matches `log`). */
|
|
38
|
+
export declare function parseConsoleLevelFilterV1(level: string): readonly string[];
|
|
39
|
+
/** Normalized read limit: default 50, clamped into 1..200 (the ring size). */
|
|
40
|
+
export declare function clampReadLimitV1(limit: number | undefined): number;
|
|
41
|
+
export interface BrowserConsoleReadResultV1 {
|
|
42
|
+
readonly total: number;
|
|
43
|
+
readonly returned: readonly BrowserConsoleEntryV1[];
|
|
44
|
+
}
|
|
45
|
+
/** Filters ring-buffer console entries (level, contains) and keeps the most recent `limit`. */
|
|
46
|
+
export declare function filterConsoleEntriesV1(entries: readonly BrowserConsoleEntryV1[], input: BrowserConsoleReadInputV1): BrowserConsoleReadResultV1;
|
|
47
|
+
export interface BrowserNetworkReadResultV1 {
|
|
48
|
+
readonly total: number;
|
|
49
|
+
readonly returned: readonly BrowserNetworkEntryV1[];
|
|
50
|
+
}
|
|
51
|
+
/** Filters ring-buffer network entries (containsUrl, status, method) and keeps the most recent `limit`. */
|
|
52
|
+
export declare function filterNetworkEntriesV1(entries: readonly BrowserNetworkEntryV1[], input: BrowserNetworkReadInputV1): BrowserNetworkReadResultV1;
|
|
53
|
+
/** Clamps a viewport dimension into 320..7680. */
|
|
54
|
+
export declare function clampViewportDimensionV1(value: number): number;
|
|
55
|
+
/** Clamps a wait timeout into 0..30000 ms. */
|
|
56
|
+
export declare function clampWaitMsV1(ms: number | undefined, fallback?: number): number;
|
|
57
|
+
/** Normalized drag step count: default 8, clamped into 1..100. */
|
|
58
|
+
export declare function clampDragStepsV1(steps: number | undefined): number;
|
|
59
|
+
/** Shapes the raw in-page performance collection into the bounded public payload. */
|
|
60
|
+
export declare function shapePerformanceV1(raw: BrowserPerformanceRawV1): BrowserPerformancePayloadV1;
|
|
61
|
+
/** Compact JSON text of a payload; `undefined` results serialize as the literal `undefined`. */
|
|
62
|
+
export declare function serializeJsonPayloadV1(value: unknown): string;
|
|
63
|
+
/** Required-input checks mirroring `actionMissingInput` for the new tool domains. */
|
|
64
|
+
export declare function waitMissingInput(input: {
|
|
65
|
+
readonly until: string;
|
|
66
|
+
readonly locator?: BrowserLocatorV1;
|
|
67
|
+
readonly ms?: number;
|
|
68
|
+
}): string | undefined;
|
|
69
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure browser-operation helpers shared by the real Playwright driver and the\n * deterministic test mock: input parsing (scroll directives, upload path\n * lists), read filters (console levels, network predicates), viewport/wait\n * clamping, and the in-page performance raw-to-payload shaping. No I/O and no\n * Playwright types live here, so both drivers apply exactly the same semantics.\n */\nimport type {\n\tBrowserConsoleEntryV1,\n\tBrowserConsoleReadInputV1,\n\tBrowserLocatorV1,\n\tBrowserNetworkEntryV1,\n\tBrowserNetworkReadInputV1,\n\tBrowserPerformancePayloadV1,\n\tBrowserPerformanceRawV1,\n} from \"./types.ts\";\n\nexport const BROWSER_MAX_WAIT_MS_V1 = 30_000;\nexport const BROWSER_MIN_VIEWPORT_V1 = 320;\nexport const BROWSER_MAX_VIEWPORT_V1 = 7680;\nexport const BROWSER_DEFAULT_READ_LIMIT_V1 = 50;\nexport const BROWSER_MAX_READ_LIMIT_V1 = 200;\nexport const BROWSER_DEFAULT_DRAG_STEPS_V1 = 8;\nexport const BROWSER_MAX_DRAG_STEPS_V1 = 100;\nexport const BROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1 = 30_000;\n\nexport type BrowserScrollDirectionV1 = \"up\" | \"down\" | \"left\" | \"right\";\n\nexport interface BrowserScrollDirectiveV1 {\n\treadonly direction: BrowserScrollDirectionV1;\n\treadonly pixels: number;\n}\n\nconst SCROLL_PATTERN = /^(up|down|left|right):(\\d{1,7})$/;\nconst CONSOLE_LEVELS_V1 = [\"error\", \"warning\", \"info\", \"debug\"] as const;\n\n/**\n * Parses a `<direction>:<pixels>` scroll directive (`down:500`); throws a\n * stable message for anything else so both drivers fail identically.\n */\nexport function parseScrollDirectiveV1(value: string): BrowserScrollDirectiveV1 {\n\tconst match = SCROLL_PATTERN.exec(value.trim());\n\tif (match === null) {\n\t\tthrow new Error(\n\t\t\t`scroll value must be <direction>:<pixels> with direction up|down|left|right, got ${JSON.stringify(value.slice(0, 64))}`,\n\t\t);\n\t}\n\treturn { direction: match[1] as BrowserScrollDirectionV1, pixels: Number.parseInt(match[2] ?? \"0\", 10) };\n}\n\n/** Wheel deltas for a scroll directive (positive y scrolls down). */\nexport function scrollWheelDeltaV1(directive: BrowserScrollDirectiveV1): {\n\treadonly deltaX: number;\n\treadonly deltaY: number;\n} {\n\tswitch (directive.direction) {\n\t\tcase \"up\":\n\t\t\treturn { deltaX: 0, deltaY: -directive.pixels };\n\t\tcase \"down\":\n\t\t\treturn { deltaX: 0, deltaY: directive.pixels };\n\t\tcase \"left\":\n\t\t\treturn { deltaX: -directive.pixels, deltaY: 0 };\n\t\tcase \"right\":\n\t\t\treturn { deltaX: directive.pixels, deltaY: 0 };\n\t}\n}\n\n/**\n * Parses an `upload` value: either a single absolute path or a JSON array of\n * paths; throws on anything else (empty arrays included).\n */\nexport function parseUploadPathsV1(value: string): readonly string[] {\n\tconst trimmed = value.trim();\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(trimmed);\n\t} catch {\n\t\tparsed = trimmed;\n\t}\n\tconst paths = Array.isArray(parsed) ? parsed : [parsed];\n\tif (paths.length === 0 || paths.some((item) => typeof item !== \"string\" || item.trim() === \"\")) {\n\t\tthrow new Error(\"upload value must be a file path or a JSON array of file paths\");\n\t}\n\treturn paths.map((item) => (item as string).trim());\n}\n\n/** Parses a comma-combined console level filter into Playwright message types (`info` also matches `log`). */\nexport function parseConsoleLevelFilterV1(level: string): readonly string[] {\n\tconst tokens = level\n\t\t.split(\",\")\n\t\t.map((token) => token.trim().toLowerCase())\n\t\t.filter((token) => token !== \"\");\n\tif (tokens.length === 0) throw new Error(\"level must contain at least one of error, warning, info, debug\");\n\tconst types: string[] = [];\n\tfor (const token of tokens) {\n\t\tif (!(CONSOLE_LEVELS_V1 as readonly string[]).includes(token)) {\n\t\t\tthrow new Error(\n\t\t\t\t`level must contain only error, warning, info, debug (comma-separated), got ${JSON.stringify(token.slice(0, 32))}`,\n\t\t\t);\n\t\t}\n\t\ttypes.push(token);\n\t\t// page console.log arrives as type \"log\"; treat the info filter as info-or-log.\n\t\tif (token === \"info\") types.push(\"log\");\n\t}\n\treturn [...new Set(types)];\n}\n\n/** Normalized read limit: default 50, clamped into 1..200 (the ring size). */\nexport function clampReadLimitV1(limit: number | undefined): number {\n\tif (limit === undefined) return BROWSER_DEFAULT_READ_LIMIT_V1;\n\treturn Math.min(Math.max(Math.trunc(limit), 1), BROWSER_MAX_READ_LIMIT_V1);\n}\n\nexport interface BrowserConsoleReadResultV1 {\n\treadonly total: number;\n\treadonly returned: readonly BrowserConsoleEntryV1[];\n}\n\n/** Filters ring-buffer console entries (level, contains) and keeps the most recent `limit`. */\nexport function filterConsoleEntriesV1(\n\tentries: readonly BrowserConsoleEntryV1[],\n\tinput: BrowserConsoleReadInputV1,\n): BrowserConsoleReadResultV1 {\n\tconst types = input.level === undefined ? undefined : parseConsoleLevelFilterV1(input.level);\n\tconst filtered = entries.filter(\n\t\t(entry) =>\n\t\t\t(types === undefined || types.includes(entry.type)) &&\n\t\t\t(input.contains === undefined || entry.text.includes(input.contains)),\n\t);\n\tconst limit = clampReadLimitV1(input.limit);\n\treturn { total: filtered.length, returned: filtered.slice(Math.max(0, filtered.length - limit)) };\n}\n\nexport interface BrowserNetworkReadResultV1 {\n\treadonly total: number;\n\treadonly returned: readonly BrowserNetworkEntryV1[];\n}\n\n/** Filters ring-buffer network entries (containsUrl, status, method) and keeps the most recent `limit`. */\nexport function filterNetworkEntriesV1(\n\tentries: readonly BrowserNetworkEntryV1[],\n\tinput: BrowserNetworkReadInputV1,\n): BrowserNetworkReadResultV1 {\n\tconst method = input.method === undefined ? undefined : input.method.trim().toUpperCase();\n\tconst filtered = entries.filter(\n\t\t(entry) =>\n\t\t\t(input.containsUrl === undefined || entry.url.includes(input.containsUrl)) &&\n\t\t\t(input.status === undefined || entry.status === input.status) &&\n\t\t\t(method === undefined || entry.method.toUpperCase() === method),\n\t);\n\tconst limit = clampReadLimitV1(input.limit);\n\treturn { total: filtered.length, returned: filtered.slice(Math.max(0, filtered.length - limit)) };\n}\n\n/** Clamps a viewport dimension into 320..7680. */\nexport function clampViewportDimensionV1(value: number): number {\n\treturn Math.min(Math.max(Math.trunc(value), BROWSER_MIN_VIEWPORT_V1), BROWSER_MAX_VIEWPORT_V1);\n}\n\n/** Clamps a wait timeout into 0..30000 ms. */\nexport function clampWaitMsV1(ms: number | undefined, fallback: number = BROWSER_MAX_WAIT_MS_V1): number {\n\tif (ms === undefined) return fallback;\n\treturn Math.min(Math.max(Math.trunc(ms), 0), BROWSER_MAX_WAIT_MS_V1);\n}\n\n/** Normalized drag step count: default 8, clamped into 1..100. */\nexport function clampDragStepsV1(steps: number | undefined): number {\n\tif (steps === undefined) return BROWSER_DEFAULT_DRAG_STEPS_V1;\n\treturn Math.min(Math.max(Math.trunc(steps), 1), BROWSER_MAX_DRAG_STEPS_V1);\n}\n\n/** Shapes the raw in-page performance collection into the bounded public payload. */\nexport function shapePerformanceV1(raw: BrowserPerformanceRawV1): BrowserPerformancePayloadV1 {\n\tconst firstPaint = raw.paints.find((paint) => paint.name === \"first-paint\");\n\tconst firstContentfulPaint = raw.paints.find((paint) => paint.name === \"first-contentful-paint\");\n\tconst slowest = [...raw.resources]\n\t\t.sort((left, right) => right.durationMs - left.durationMs)\n\t\t.slice(0, 5)\n\t\t.map((resource) => ({ url: resource.url, durationMs: resource.durationMs }));\n\treturn {\n\t\t...(raw.navigation === null ? {} : { navigation: raw.navigation }),\n\t\tpaint: {\n\t\t\t...(firstPaint === undefined ? {} : { firstPaintMs: firstPaint.startTimeMs }),\n\t\t\t...(firstContentfulPaint === undefined ? {} : { firstContentfulPaintMs: firstContentfulPaint.startTimeMs }),\n\t\t},\n\t\tresources: {\n\t\t\tcount: raw.resources.length,\n\t\t\ttotalTransferBytes: raw.resources.reduce((total, resource) => total + resource.transferBytes, 0),\n\t\t\tslowest,\n\t\t},\n\t\tdomNodes: raw.domNodes,\n\t};\n}\n\n/** Compact JSON text of a payload; `undefined` results serialize as the literal `undefined`. */\nexport function serializeJsonPayloadV1(value: unknown): string {\n\tif (value === undefined) return \"undefined\";\n\treturn JSON.stringify(value);\n}\n\n/** Required-input checks mirroring `actionMissingInput` for the new tool domains. */\nexport function waitMissingInput(input: {\n\treadonly until: string;\n\treadonly locator?: BrowserLocatorV1;\n\treadonly ms?: number;\n}): string | undefined {\n\tif (input.until === \"selector\" && input.locator === undefined) return \"a locator\";\n\tif (input.until === \"time\" && input.ms === undefined) return \"a ms value\";\n\treturn undefined;\n}\n"]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
export const BROWSER_MAX_WAIT_MS_V1 = 30_000;
|
|
2
|
+
export const BROWSER_MIN_VIEWPORT_V1 = 320;
|
|
3
|
+
export const BROWSER_MAX_VIEWPORT_V1 = 7680;
|
|
4
|
+
export const BROWSER_DEFAULT_READ_LIMIT_V1 = 50;
|
|
5
|
+
export const BROWSER_MAX_READ_LIMIT_V1 = 200;
|
|
6
|
+
export const BROWSER_DEFAULT_DRAG_STEPS_V1 = 8;
|
|
7
|
+
export const BROWSER_MAX_DRAG_STEPS_V1 = 100;
|
|
8
|
+
export const BROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1 = 30_000;
|
|
9
|
+
const SCROLL_PATTERN = /^(up|down|left|right):(\d{1,7})$/;
|
|
10
|
+
const CONSOLE_LEVELS_V1 = ["error", "warning", "info", "debug"];
|
|
11
|
+
/**
|
|
12
|
+
* Parses a `<direction>:<pixels>` scroll directive (`down:500`); throws a
|
|
13
|
+
* stable message for anything else so both drivers fail identically.
|
|
14
|
+
*/
|
|
15
|
+
export function parseScrollDirectiveV1(value) {
|
|
16
|
+
const match = SCROLL_PATTERN.exec(value.trim());
|
|
17
|
+
if (match === null) {
|
|
18
|
+
throw new Error(`scroll value must be <direction>:<pixels> with direction up|down|left|right, got ${JSON.stringify(value.slice(0, 64))}`);
|
|
19
|
+
}
|
|
20
|
+
return { direction: match[1], pixels: Number.parseInt(match[2] ?? "0", 10) };
|
|
21
|
+
}
|
|
22
|
+
/** Wheel deltas for a scroll directive (positive y scrolls down). */
|
|
23
|
+
export function scrollWheelDeltaV1(directive) {
|
|
24
|
+
switch (directive.direction) {
|
|
25
|
+
case "up":
|
|
26
|
+
return { deltaX: 0, deltaY: -directive.pixels };
|
|
27
|
+
case "down":
|
|
28
|
+
return { deltaX: 0, deltaY: directive.pixels };
|
|
29
|
+
case "left":
|
|
30
|
+
return { deltaX: -directive.pixels, deltaY: 0 };
|
|
31
|
+
case "right":
|
|
32
|
+
return { deltaX: directive.pixels, deltaY: 0 };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parses an `upload` value: either a single absolute path or a JSON array of
|
|
37
|
+
* paths; throws on anything else (empty arrays included).
|
|
38
|
+
*/
|
|
39
|
+
export function parseUploadPathsV1(value) {
|
|
40
|
+
const trimmed = value.trim();
|
|
41
|
+
let parsed;
|
|
42
|
+
try {
|
|
43
|
+
parsed = JSON.parse(trimmed);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
parsed = trimmed;
|
|
47
|
+
}
|
|
48
|
+
const paths = Array.isArray(parsed) ? parsed : [parsed];
|
|
49
|
+
if (paths.length === 0 || paths.some((item) => typeof item !== "string" || item.trim() === "")) {
|
|
50
|
+
throw new Error("upload value must be a file path or a JSON array of file paths");
|
|
51
|
+
}
|
|
52
|
+
return paths.map((item) => item.trim());
|
|
53
|
+
}
|
|
54
|
+
/** Parses a comma-combined console level filter into Playwright message types (`info` also matches `log`). */
|
|
55
|
+
export function parseConsoleLevelFilterV1(level) {
|
|
56
|
+
const tokens = level
|
|
57
|
+
.split(",")
|
|
58
|
+
.map((token) => token.trim().toLowerCase())
|
|
59
|
+
.filter((token) => token !== "");
|
|
60
|
+
if (tokens.length === 0)
|
|
61
|
+
throw new Error("level must contain at least one of error, warning, info, debug");
|
|
62
|
+
const types = [];
|
|
63
|
+
for (const token of tokens) {
|
|
64
|
+
if (!CONSOLE_LEVELS_V1.includes(token)) {
|
|
65
|
+
throw new Error(`level must contain only error, warning, info, debug (comma-separated), got ${JSON.stringify(token.slice(0, 32))}`);
|
|
66
|
+
}
|
|
67
|
+
types.push(token);
|
|
68
|
+
// page console.log arrives as type "log"; treat the info filter as info-or-log.
|
|
69
|
+
if (token === "info")
|
|
70
|
+
types.push("log");
|
|
71
|
+
}
|
|
72
|
+
return [...new Set(types)];
|
|
73
|
+
}
|
|
74
|
+
/** Normalized read limit: default 50, clamped into 1..200 (the ring size). */
|
|
75
|
+
export function clampReadLimitV1(limit) {
|
|
76
|
+
if (limit === undefined)
|
|
77
|
+
return BROWSER_DEFAULT_READ_LIMIT_V1;
|
|
78
|
+
return Math.min(Math.max(Math.trunc(limit), 1), BROWSER_MAX_READ_LIMIT_V1);
|
|
79
|
+
}
|
|
80
|
+
/** Filters ring-buffer console entries (level, contains) and keeps the most recent `limit`. */
|
|
81
|
+
export function filterConsoleEntriesV1(entries, input) {
|
|
82
|
+
const types = input.level === undefined ? undefined : parseConsoleLevelFilterV1(input.level);
|
|
83
|
+
const filtered = entries.filter((entry) => (types === undefined || types.includes(entry.type)) &&
|
|
84
|
+
(input.contains === undefined || entry.text.includes(input.contains)));
|
|
85
|
+
const limit = clampReadLimitV1(input.limit);
|
|
86
|
+
return { total: filtered.length, returned: filtered.slice(Math.max(0, filtered.length - limit)) };
|
|
87
|
+
}
|
|
88
|
+
/** Filters ring-buffer network entries (containsUrl, status, method) and keeps the most recent `limit`. */
|
|
89
|
+
export function filterNetworkEntriesV1(entries, input) {
|
|
90
|
+
const method = input.method === undefined ? undefined : input.method.trim().toUpperCase();
|
|
91
|
+
const filtered = entries.filter((entry) => (input.containsUrl === undefined || entry.url.includes(input.containsUrl)) &&
|
|
92
|
+
(input.status === undefined || entry.status === input.status) &&
|
|
93
|
+
(method === undefined || entry.method.toUpperCase() === method));
|
|
94
|
+
const limit = clampReadLimitV1(input.limit);
|
|
95
|
+
return { total: filtered.length, returned: filtered.slice(Math.max(0, filtered.length - limit)) };
|
|
96
|
+
}
|
|
97
|
+
/** Clamps a viewport dimension into 320..7680. */
|
|
98
|
+
export function clampViewportDimensionV1(value) {
|
|
99
|
+
return Math.min(Math.max(Math.trunc(value), BROWSER_MIN_VIEWPORT_V1), BROWSER_MAX_VIEWPORT_V1);
|
|
100
|
+
}
|
|
101
|
+
/** Clamps a wait timeout into 0..30000 ms. */
|
|
102
|
+
export function clampWaitMsV1(ms, fallback = BROWSER_MAX_WAIT_MS_V1) {
|
|
103
|
+
if (ms === undefined)
|
|
104
|
+
return fallback;
|
|
105
|
+
return Math.min(Math.max(Math.trunc(ms), 0), BROWSER_MAX_WAIT_MS_V1);
|
|
106
|
+
}
|
|
107
|
+
/** Normalized drag step count: default 8, clamped into 1..100. */
|
|
108
|
+
export function clampDragStepsV1(steps) {
|
|
109
|
+
if (steps === undefined)
|
|
110
|
+
return BROWSER_DEFAULT_DRAG_STEPS_V1;
|
|
111
|
+
return Math.min(Math.max(Math.trunc(steps), 1), BROWSER_MAX_DRAG_STEPS_V1);
|
|
112
|
+
}
|
|
113
|
+
/** Shapes the raw in-page performance collection into the bounded public payload. */
|
|
114
|
+
export function shapePerformanceV1(raw) {
|
|
115
|
+
const firstPaint = raw.paints.find((paint) => paint.name === "first-paint");
|
|
116
|
+
const firstContentfulPaint = raw.paints.find((paint) => paint.name === "first-contentful-paint");
|
|
117
|
+
const slowest = [...raw.resources]
|
|
118
|
+
.sort((left, right) => right.durationMs - left.durationMs)
|
|
119
|
+
.slice(0, 5)
|
|
120
|
+
.map((resource) => ({ url: resource.url, durationMs: resource.durationMs }));
|
|
121
|
+
return {
|
|
122
|
+
...(raw.navigation === null ? {} : { navigation: raw.navigation }),
|
|
123
|
+
paint: {
|
|
124
|
+
...(firstPaint === undefined ? {} : { firstPaintMs: firstPaint.startTimeMs }),
|
|
125
|
+
...(firstContentfulPaint === undefined ? {} : { firstContentfulPaintMs: firstContentfulPaint.startTimeMs }),
|
|
126
|
+
},
|
|
127
|
+
resources: {
|
|
128
|
+
count: raw.resources.length,
|
|
129
|
+
totalTransferBytes: raw.resources.reduce((total, resource) => total + resource.transferBytes, 0),
|
|
130
|
+
slowest,
|
|
131
|
+
},
|
|
132
|
+
domNodes: raw.domNodes,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** Compact JSON text of a payload; `undefined` results serialize as the literal `undefined`. */
|
|
136
|
+
export function serializeJsonPayloadV1(value) {
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
return "undefined";
|
|
139
|
+
return JSON.stringify(value);
|
|
140
|
+
}
|
|
141
|
+
/** Required-input checks mirroring `actionMissingInput` for the new tool domains. */
|
|
142
|
+
export function waitMissingInput(input) {
|
|
143
|
+
if (input.until === "selector" && input.locator === undefined)
|
|
144
|
+
return "a locator";
|
|
145
|
+
if (input.until === "time" && input.ms === undefined)
|
|
146
|
+
return "a ms value";
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure browser-operation helpers shared by the real Playwright driver and the\n * deterministic test mock: input parsing (scroll directives, upload path\n * lists), read filters (console levels, network predicates), viewport/wait\n * clamping, and the in-page performance raw-to-payload shaping. No I/O and no\n * Playwright types live here, so both drivers apply exactly the same semantics.\n */\nimport type {\n\tBrowserConsoleEntryV1,\n\tBrowserConsoleReadInputV1,\n\tBrowserLocatorV1,\n\tBrowserNetworkEntryV1,\n\tBrowserNetworkReadInputV1,\n\tBrowserPerformancePayloadV1,\n\tBrowserPerformanceRawV1,\n} from \"./types.ts\";\n\nexport const BROWSER_MAX_WAIT_MS_V1 = 30_000;\nexport const BROWSER_MIN_VIEWPORT_V1 = 320;\nexport const BROWSER_MAX_VIEWPORT_V1 = 7680;\nexport const BROWSER_DEFAULT_READ_LIMIT_V1 = 50;\nexport const BROWSER_MAX_READ_LIMIT_V1 = 200;\nexport const BROWSER_DEFAULT_DRAG_STEPS_V1 = 8;\nexport const BROWSER_MAX_DRAG_STEPS_V1 = 100;\nexport const BROWSER_DEFAULT_EVALUATE_TIMEOUT_MS_V1 = 30_000;\n\nexport type BrowserScrollDirectionV1 = \"up\" | \"down\" | \"left\" | \"right\";\n\nexport interface BrowserScrollDirectiveV1 {\n\treadonly direction: BrowserScrollDirectionV1;\n\treadonly pixels: number;\n}\n\nconst SCROLL_PATTERN = /^(up|down|left|right):(\\d{1,7})$/;\nconst CONSOLE_LEVELS_V1 = [\"error\", \"warning\", \"info\", \"debug\"] as const;\n\n/**\n * Parses a `<direction>:<pixels>` scroll directive (`down:500`); throws a\n * stable message for anything else so both drivers fail identically.\n */\nexport function parseScrollDirectiveV1(value: string): BrowserScrollDirectiveV1 {\n\tconst match = SCROLL_PATTERN.exec(value.trim());\n\tif (match === null) {\n\t\tthrow new Error(\n\t\t\t`scroll value must be <direction>:<pixels> with direction up|down|left|right, got ${JSON.stringify(value.slice(0, 64))}`,\n\t\t);\n\t}\n\treturn { direction: match[1] as BrowserScrollDirectionV1, pixels: Number.parseInt(match[2] ?? \"0\", 10) };\n}\n\n/** Wheel deltas for a scroll directive (positive y scrolls down). */\nexport function scrollWheelDeltaV1(directive: BrowserScrollDirectiveV1): {\n\treadonly deltaX: number;\n\treadonly deltaY: number;\n} {\n\tswitch (directive.direction) {\n\t\tcase \"up\":\n\t\t\treturn { deltaX: 0, deltaY: -directive.pixels };\n\t\tcase \"down\":\n\t\t\treturn { deltaX: 0, deltaY: directive.pixels };\n\t\tcase \"left\":\n\t\t\treturn { deltaX: -directive.pixels, deltaY: 0 };\n\t\tcase \"right\":\n\t\t\treturn { deltaX: directive.pixels, deltaY: 0 };\n\t}\n}\n\n/**\n * Parses an `upload` value: either a single absolute path or a JSON array of\n * paths; throws on anything else (empty arrays included).\n */\nexport function parseUploadPathsV1(value: string): readonly string[] {\n\tconst trimmed = value.trim();\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(trimmed);\n\t} catch {\n\t\tparsed = trimmed;\n\t}\n\tconst paths = Array.isArray(parsed) ? parsed : [parsed];\n\tif (paths.length === 0 || paths.some((item) => typeof item !== \"string\" || item.trim() === \"\")) {\n\t\tthrow new Error(\"upload value must be a file path or a JSON array of file paths\");\n\t}\n\treturn paths.map((item) => (item as string).trim());\n}\n\n/** Parses a comma-combined console level filter into Playwright message types (`info` also matches `log`). */\nexport function parseConsoleLevelFilterV1(level: string): readonly string[] {\n\tconst tokens = level\n\t\t.split(\",\")\n\t\t.map((token) => token.trim().toLowerCase())\n\t\t.filter((token) => token !== \"\");\n\tif (tokens.length === 0) throw new Error(\"level must contain at least one of error, warning, info, debug\");\n\tconst types: string[] = [];\n\tfor (const token of tokens) {\n\t\tif (!(CONSOLE_LEVELS_V1 as readonly string[]).includes(token)) {\n\t\t\tthrow new Error(\n\t\t\t\t`level must contain only error, warning, info, debug (comma-separated), got ${JSON.stringify(token.slice(0, 32))}`,\n\t\t\t);\n\t\t}\n\t\ttypes.push(token);\n\t\t// page console.log arrives as type \"log\"; treat the info filter as info-or-log.\n\t\tif (token === \"info\") types.push(\"log\");\n\t}\n\treturn [...new Set(types)];\n}\n\n/** Normalized read limit: default 50, clamped into 1..200 (the ring size). */\nexport function clampReadLimitV1(limit: number | undefined): number {\n\tif (limit === undefined) return BROWSER_DEFAULT_READ_LIMIT_V1;\n\treturn Math.min(Math.max(Math.trunc(limit), 1), BROWSER_MAX_READ_LIMIT_V1);\n}\n\nexport interface BrowserConsoleReadResultV1 {\n\treadonly total: number;\n\treadonly returned: readonly BrowserConsoleEntryV1[];\n}\n\n/** Filters ring-buffer console entries (level, contains) and keeps the most recent `limit`. */\nexport function filterConsoleEntriesV1(\n\tentries: readonly BrowserConsoleEntryV1[],\n\tinput: BrowserConsoleReadInputV1,\n): BrowserConsoleReadResultV1 {\n\tconst types = input.level === undefined ? undefined : parseConsoleLevelFilterV1(input.level);\n\tconst filtered = entries.filter(\n\t\t(entry) =>\n\t\t\t(types === undefined || types.includes(entry.type)) &&\n\t\t\t(input.contains === undefined || entry.text.includes(input.contains)),\n\t);\n\tconst limit = clampReadLimitV1(input.limit);\n\treturn { total: filtered.length, returned: filtered.slice(Math.max(0, filtered.length - limit)) };\n}\n\nexport interface BrowserNetworkReadResultV1 {\n\treadonly total: number;\n\treadonly returned: readonly BrowserNetworkEntryV1[];\n}\n\n/** Filters ring-buffer network entries (containsUrl, status, method) and keeps the most recent `limit`. */\nexport function filterNetworkEntriesV1(\n\tentries: readonly BrowserNetworkEntryV1[],\n\tinput: BrowserNetworkReadInputV1,\n): BrowserNetworkReadResultV1 {\n\tconst method = input.method === undefined ? undefined : input.method.trim().toUpperCase();\n\tconst filtered = entries.filter(\n\t\t(entry) =>\n\t\t\t(input.containsUrl === undefined || entry.url.includes(input.containsUrl)) &&\n\t\t\t(input.status === undefined || entry.status === input.status) &&\n\t\t\t(method === undefined || entry.method.toUpperCase() === method),\n\t);\n\tconst limit = clampReadLimitV1(input.limit);\n\treturn { total: filtered.length, returned: filtered.slice(Math.max(0, filtered.length - limit)) };\n}\n\n/** Clamps a viewport dimension into 320..7680. */\nexport function clampViewportDimensionV1(value: number): number {\n\treturn Math.min(Math.max(Math.trunc(value), BROWSER_MIN_VIEWPORT_V1), BROWSER_MAX_VIEWPORT_V1);\n}\n\n/** Clamps a wait timeout into 0..30000 ms. */\nexport function clampWaitMsV1(ms: number | undefined, fallback: number = BROWSER_MAX_WAIT_MS_V1): number {\n\tif (ms === undefined) return fallback;\n\treturn Math.min(Math.max(Math.trunc(ms), 0), BROWSER_MAX_WAIT_MS_V1);\n}\n\n/** Normalized drag step count: default 8, clamped into 1..100. */\nexport function clampDragStepsV1(steps: number | undefined): number {\n\tif (steps === undefined) return BROWSER_DEFAULT_DRAG_STEPS_V1;\n\treturn Math.min(Math.max(Math.trunc(steps), 1), BROWSER_MAX_DRAG_STEPS_V1);\n}\n\n/** Shapes the raw in-page performance collection into the bounded public payload. */\nexport function shapePerformanceV1(raw: BrowserPerformanceRawV1): BrowserPerformancePayloadV1 {\n\tconst firstPaint = raw.paints.find((paint) => paint.name === \"first-paint\");\n\tconst firstContentfulPaint = raw.paints.find((paint) => paint.name === \"first-contentful-paint\");\n\tconst slowest = [...raw.resources]\n\t\t.sort((left, right) => right.durationMs - left.durationMs)\n\t\t.slice(0, 5)\n\t\t.map((resource) => ({ url: resource.url, durationMs: resource.durationMs }));\n\treturn {\n\t\t...(raw.navigation === null ? {} : { navigation: raw.navigation }),\n\t\tpaint: {\n\t\t\t...(firstPaint === undefined ? {} : { firstPaintMs: firstPaint.startTimeMs }),\n\t\t\t...(firstContentfulPaint === undefined ? {} : { firstContentfulPaintMs: firstContentfulPaint.startTimeMs }),\n\t\t},\n\t\tresources: {\n\t\t\tcount: raw.resources.length,\n\t\t\ttotalTransferBytes: raw.resources.reduce((total, resource) => total + resource.transferBytes, 0),\n\t\t\tslowest,\n\t\t},\n\t\tdomNodes: raw.domNodes,\n\t};\n}\n\n/** Compact JSON text of a payload; `undefined` results serialize as the literal `undefined`. */\nexport function serializeJsonPayloadV1(value: unknown): string {\n\tif (value === undefined) return \"undefined\";\n\treturn JSON.stringify(value);\n}\n\n/** Required-input checks mirroring `actionMissingInput` for the new tool domains. */\nexport function waitMissingInput(input: {\n\treadonly until: string;\n\treadonly locator?: BrowserLocatorV1;\n\treadonly ms?: number;\n}): string | undefined {\n\tif (input.until === \"selector\" && input.locator === undefined) return \"a locator\";\n\tif (input.until === \"time\" && input.ms === undefined) return \"a ms value\";\n\treturn undefined;\n}\n"]}
|