@aiscene/core 9.0.6 → 9.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/agent/agent.mjs +24 -11
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/cache-config.mjs +19 -0
- package/dist/es/agent/cache-config.mjs.map +1 -0
- package/dist/es/agent/file-chooser.mjs +82 -0
- package/dist/es/agent/file-chooser.mjs.map +1 -0
- package/dist/es/agent/insight.mjs +101 -0
- package/dist/es/agent/insight.mjs.map +1 -0
- package/dist/es/agent/metrics.mjs +81 -0
- package/dist/es/agent/metrics.mjs.map +1 -0
- package/dist/es/agent/progress/ai-act-progress.mjs +199 -0
- package/dist/es/agent/progress/ai-act-progress.mjs.map +1 -0
- package/dist/es/agent/progress/index.mjs +2 -0
- package/dist/es/agent/progress/progress-bus.mjs +52 -0
- package/dist/es/agent/progress/progress-bus.mjs.map +1 -0
- package/dist/es/agent/prompt-context.mjs +25 -0
- package/dist/es/agent/prompt-context.mjs.map +1 -0
- package/dist/es/agent/record-to-report.mjs +14 -0
- package/dist/es/agent/record-to-report.mjs.map +1 -0
- package/dist/es/agent/run-gherkin-scenario.mjs +114 -0
- package/dist/es/agent/run-gherkin-scenario.mjs.map +1 -0
- package/dist/es/agent/run-markdown.mjs +62 -0
- package/dist/es/agent/run-markdown.mjs.map +1 -0
- package/dist/es/agent/screenshot-preparation.mjs +37 -0
- package/dist/es/agent/screenshot-preparation.mjs.map +1 -0
- package/dist/es/agent/ui-observer.mjs +385 -0
- package/dist/es/agent/ui-observer.mjs.map +1 -0
- package/dist/es/agent/utils.mjs +42 -4
- package/dist/es/agent/utils.mjs.map +1 -1
- package/dist/es/ai-model/connectivity/fixture.mjs +8 -0
- package/dist/es/ai-model/connectivity/fixture.mjs.map +1 -0
- package/dist/es/ai-model/connectivity/index.mjs +2 -0
- package/dist/es/ai-model/connectivity/run-connectivity-test.mjs +160 -0
- package/dist/es/ai-model/connectivity/run-connectivity-test.mjs.map +1 -0
- package/dist/es/ai-model/conversation-history.mjs.map +1 -1
- package/dist/es/ai-model/index.mjs +2 -1
- package/dist/es/ai-model/inspect.mjs +1 -1
- package/dist/es/ai-model/inspect.mjs.map +1 -1
- package/dist/es/ai-model/model-adapter/chat-completion.mjs +69 -0
- package/dist/es/ai-model/model-adapter/chat-completion.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/custom-planning-action.mjs +6 -0
- package/dist/es/ai-model/model-adapter/custom-planning-action.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/custom-planning-types.mjs +0 -0
- package/dist/es/ai-model/model-adapter/default-insight-protocol.mjs +28 -0
- package/dist/es/ai-model/model-adapter/default-insight-protocol.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/default-locate-protocol.mjs +145 -0
- package/dist/es/ai-model/model-adapter/default-locate-protocol.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/default-planning-protocol.mjs +124 -0
- package/dist/es/ai-model/model-adapter/default-planning-protocol.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/image-preprocess.mjs +27 -0
- package/dist/es/ai-model/model-adapter/image-preprocess.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/index.mjs +2 -0
- package/dist/es/ai-model/model-adapter/insight-protocol.mjs +0 -0
- package/dist/es/ai-model/model-adapter/insight.mjs +13 -0
- package/dist/es/ai-model/model-adapter/insight.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/locate-protocol.mjs +0 -0
- package/dist/es/ai-model/model-adapter/locate.mjs +53 -0
- package/dist/es/ai-model/model-adapter/locate.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/planning-protocol.mjs +0 -0
- package/dist/es/ai-model/model-adapter/planning.mjs +49 -0
- package/dist/es/ai-model/model-adapter/planning.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/resolve.mjs +54 -0
- package/dist/es/ai-model/model-adapter/resolve.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/types.mjs +0 -0
- package/dist/es/ai-model/models/auto-glm/actions.mjs +205 -0
- package/dist/es/ai-model/models/auto-glm/actions.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/adapter.mjs +45 -0
- package/dist/es/ai-model/models/auto-glm/adapter.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/locate.mjs +11 -0
- package/dist/es/ai-model/models/auto-glm/locate.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/parser.mjs +217 -0
- package/dist/es/ai-model/models/auto-glm/parser.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/planning.mjs +33 -0
- package/dist/es/ai-model/models/auto-glm/planning.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/prompt.mjs +214 -0
- package/dist/es/ai-model/models/auto-glm/prompt.mjs.map +1 -0
- package/dist/es/ai-model/models/deepseek/adapter.mjs +79 -0
- package/dist/es/ai-model/models/deepseek/adapter.mjs.map +1 -0
- package/dist/es/ai-model/models/deepseek/locate-protocol.mjs +89 -0
- package/dist/es/ai-model/models/deepseek/locate-protocol.mjs.map +1 -0
- package/dist/es/ai-model/models/default.mjs +13 -0
- package/dist/es/ai-model/models/default.mjs.map +1 -0
- package/dist/es/ai-model/models/doubao.mjs +95 -0
- package/dist/es/ai-model/models/doubao.mjs.map +1 -0
- package/dist/es/ai-model/models/gemini.mjs +100 -0
- package/dist/es/ai-model/models/gemini.mjs.map +1 -0
- package/dist/es/ai-model/models/glm.mjs +46 -0
- package/dist/es/ai-model/models/glm.mjs.map +1 -0
- package/dist/es/ai-model/models/gpt.mjs +43 -0
- package/dist/es/ai-model/models/gpt.mjs.map +1 -0
- package/dist/es/ai-model/models/index.mjs +2 -0
- package/dist/es/ai-model/models/kimi.mjs +102 -0
- package/dist/es/ai-model/models/kimi.mjs.map +1 -0
- package/dist/es/ai-model/models/mimo.mjs +36 -0
- package/dist/es/ai-model/models/mimo.mjs.map +1 -0
- package/dist/es/ai-model/models/qwen.mjs +139 -0
- package/dist/es/ai-model/models/qwen.mjs.map +1 -0
- package/dist/es/ai-model/models/registry.mjs +51 -0
- package/dist/es/ai-model/models/registry.mjs.map +1 -0
- package/dist/es/ai-model/models/ui-tars/actions.mjs +147 -0
- package/dist/es/ai-model/models/ui-tars/actions.mjs.map +1 -0
- package/dist/es/ai-model/models/ui-tars/adapter.mjs +102 -0
- package/dist/es/ai-model/models/ui-tars/adapter.mjs.map +1 -0
- package/dist/es/ai-model/models/ui-tars/parser.mjs +40 -0
- package/dist/es/ai-model/models/ui-tars/parser.mjs.map +1 -0
- package/dist/es/ai-model/models/ui-tars/planning.mjs +25 -0
- package/dist/es/ai-model/models/ui-tars/planning.mjs.map +1 -0
- package/dist/es/ai-model/models/ui-tars/prompt.mjs +36 -0
- package/dist/es/ai-model/models/ui-tars/prompt.mjs.map +1 -0
- package/dist/es/ai-model/models/utils/intent.mjs +6 -0
- package/dist/es/ai-model/models/utils/intent.mjs.map +1 -0
- package/dist/es/ai-model/prompt/insight/index.mjs +3 -0
- package/dist/es/ai-model/prompt/insight/system-prompt.mjs +104 -0
- package/dist/es/ai-model/prompt/insight/system-prompt.mjs.map +1 -0
- package/dist/es/ai-model/prompt/insight/user-prompt.mjs +23 -0
- package/dist/es/ai-model/prompt/insight/user-prompt.mjs.map +1 -0
- package/dist/es/ai-model/prompt/locate/element-system-prompt.mjs +12 -0
- package/dist/es/ai-model/prompt/locate/element-system-prompt.mjs.map +1 -0
- package/dist/es/ai-model/prompt/locate/grounding-rules.mjs +13 -0
- package/dist/es/ai-model/prompt/locate/grounding-rules.mjs.map +1 -0
- package/dist/es/ai-model/prompt/locate/index.mjs +4 -0
- package/dist/es/ai-model/prompt/locate/search-area-system-prompt.mjs +9 -0
- package/dist/es/ai-model/prompt/locate/search-area-system-prompt.mjs.map +1 -0
- package/dist/es/ai-model/prompt/planning/action-output-example.mjs +52 -0
- package/dist/es/ai-model/prompt/planning/action-output-example.mjs.map +1 -0
- package/dist/es/ai-model/prompt/planning/action-space-description.mjs +28 -0
- package/dist/es/ai-model/prompt/planning/action-space-description.mjs.map +1 -0
- package/dist/es/ai-model/prompt/planning/index.mjs +6 -0
- package/dist/es/ai-model/prompt/planning/multi-turn-example.mjs +221 -0
- package/dist/es/ai-model/prompt/planning/multi-turn-example.mjs.map +1 -0
- package/dist/es/ai-model/prompt/planning/planning-response-example.mjs +25 -0
- package/dist/es/ai-model/prompt/planning/planning-response-example.mjs.map +1 -0
- package/dist/es/ai-model/prompt/planning/sub-goals-text.mjs +17 -0
- package/dist/es/ai-model/prompt/planning/sub-goals-text.mjs.map +1 -0
- package/dist/es/ai-model/prompt/planning/system-prompt.mjs +293 -0
- package/dist/es/ai-model/prompt/planning/system-prompt.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/codex-app-server.mjs +1 -0
- package/dist/es/ai-model/service-caller/codex-app-server.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +35 -16
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/model-call-recorder.mjs +74 -0
- package/dist/es/ai-model/service-caller/model-call-recorder.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/openai-error.mjs +147 -0
- package/dist/es/ai-model/service-caller/openai-error.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/proxy-deps.node.mjs +9 -0
- package/dist/es/ai-model/service-caller/proxy-deps.node.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/proxy-deps.stub.mjs +12 -0
- package/dist/es/ai-model/service-caller/proxy-deps.stub.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/semantic-retry.mjs +33 -0
- package/dist/es/ai-model/service-caller/semantic-retry.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/types.mjs +0 -0
- package/dist/es/ai-model/shared/action-schema.mjs +15 -0
- package/dist/es/ai-model/shared/action-schema.mjs.map +1 -0
- package/dist/es/ai-model/shared/json.mjs +63 -0
- package/dist/es/ai-model/shared/json.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/bbox.mjs +60 -0
- package/dist/es/ai-model/shared/model-locate-result/bbox.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/coordinate-distance.mjs +10 -0
- package/dist/es/ai-model/shared/model-locate-result/coordinate-distance.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/errors.mjs +9 -0
- package/dist/es/ai-model/shared/model-locate-result/errors.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/factory.mjs +39 -0
- package/dist/es/ai-model/shared/model-locate-result/factory.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/index.mjs +6 -0
- package/dist/es/ai-model/shared/model-locate-result/parse.mjs +45 -0
- package/dist/es/ai-model/shared/model-locate-result/parse.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/pixel-bbox-mapper.mjs +67 -0
- package/dist/es/ai-model/shared/model-locate-result/pixel-bbox-mapper.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/prompt-spec.mjs +110 -0
- package/dist/es/ai-model/shared/model-locate-result/prompt-spec.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/types.mjs +9 -0
- package/dist/es/ai-model/shared/model-locate-result/types.mjs.map +1 -0
- package/dist/es/ai-model/shared/multimodal-prompt.mjs +55 -0
- package/dist/es/ai-model/shared/multimodal-prompt.mjs.map +1 -0
- package/dist/es/ai-model/shared/xml.mjs +42 -0
- package/dist/es/ai-model/shared/xml.mjs.map +1 -0
- package/dist/es/ai-model/workflows/grounding/index.mjs +4 -0
- package/dist/es/ai-model/workflows/grounding/locate-result-rect.mjs +23 -0
- package/dist/es/ai-model/workflows/grounding/locate-result-rect.mjs.map +1 -0
- package/dist/es/ai-model/workflows/grounding/locate.mjs +168 -0
- package/dist/es/ai-model/workflows/grounding/locate.mjs.map +1 -0
- package/dist/es/ai-model/workflows/grounding/planning-action-locate.mjs +97 -0
- package/dist/es/ai-model/workflows/grounding/planning-action-locate.mjs.map +1 -0
- package/dist/es/ai-model/workflows/grounding/search-area-mapping.mjs +18 -0
- package/dist/es/ai-model/workflows/grounding/search-area-mapping.mjs.map +1 -0
- package/dist/es/ai-model/workflows/grounding/search-area.mjs +55 -0
- package/dist/es/ai-model/workflows/grounding/search-area.mjs.map +1 -0
- package/dist/es/ai-model/workflows/grounding/section-locate.mjs +146 -0
- package/dist/es/ai-model/workflows/grounding/section-locate.mjs.map +1 -0
- package/dist/es/ai-model/workflows/grounding/types.mjs +0 -0
- package/dist/es/ai-model/workflows/grounding/utils.mjs +50 -0
- package/dist/es/ai-model/workflows/grounding/utils.mjs.map +1 -0
- package/dist/es/ai-model/workflows/insight/extraction.mjs +101 -0
- package/dist/es/ai-model/workflows/insight/extraction.mjs.map +1 -0
- package/dist/es/ai-model/workflows/insight/index.mjs +3 -0
- package/dist/es/ai-model/workflows/insight/insight-response-parser.mjs +26 -0
- package/dist/es/ai-model/workflows/insight/insight-response-parser.mjs.map +1 -0
- package/dist/es/ai-model/workflows/insight/order-sensitive.mjs +29 -0
- package/dist/es/ai-model/workflows/insight/order-sensitive.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/conversation-history.mjs +185 -0
- package/dist/es/ai-model/workflows/planning/conversation-history.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/custom-planning.mjs +129 -0
- package/dist/es/ai-model/workflows/planning/custom-planning.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/index.mjs +4 -0
- package/dist/es/ai-model/workflows/planning/locate-normalization.mjs +41 -0
- package/dist/es/ai-model/workflows/planning/locate-normalization.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/planning-action-log.mjs +22 -0
- package/dist/es/ai-model/workflows/planning/planning-action-log.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/standard-planning-parser.mjs +99 -0
- package/dist/es/ai-model/workflows/planning/standard-planning-parser.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/standard-planning.mjs +219 -0
- package/dist/es/ai-model/workflows/planning/standard-planning.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/types.mjs +0 -0
- package/dist/es/ai-model/workflows/recorder-generation/common.mjs +171 -0
- package/dist/es/ai-model/workflows/recorder-generation/common.mjs.map +1 -0
- package/dist/es/ai-model/workflows/recorder-generation/index.mjs +5 -0
- package/dist/es/ai-model/workflows/recorder-generation/markdown.mjs +253 -0
- package/dist/es/ai-model/workflows/recorder-generation/markdown.mjs.map +1 -0
- package/dist/es/ai-model/workflows/recorder-generation/metadata.mjs +83 -0
- package/dist/es/ai-model/workflows/recorder-generation/metadata.mjs.map +1 -0
- package/dist/es/ai-model/workflows/recorder-generation/playwright.mjs +123 -0
- package/dist/es/ai-model/workflows/recorder-generation/playwright.mjs.map +1 -0
- package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs +162 -0
- package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs.map +1 -0
- package/dist/es/common.mjs +12 -1
- package/dist/es/common.mjs.map +1 -1
- package/dist/es/constants.mjs +4 -0
- package/dist/es/constants.mjs.map +1 -0
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/device/input-strategy.mjs +34 -0
- package/dist/es/device/input-strategy.mjs.map +1 -0
- package/dist/es/dump/html-utils.mjs +16 -1
- package/dist/es/dump/html-utils.mjs.map +1 -1
- package/dist/es/dump/image-reference.mjs +63 -0
- package/dist/es/dump/image-reference.mjs.map +1 -0
- package/dist/es/dump/report-action-dump.mjs +244 -0
- package/dist/es/dump/report-action-dump.mjs.map +1 -0
- package/dist/es/dump/report-dump-compactor.mjs +200 -0
- package/dist/es/dump/report-dump-compactor.mjs.map +1 -0
- package/dist/es/dump/screenshot-store.mjs +124 -37
- package/dist/es/dump/screenshot-store.mjs.map +1 -1
- package/dist/es/dump/task-service-dump.mjs +17 -0
- package/dist/es/dump/task-service-dump.mjs.map +1 -0
- package/dist/es/dump/task-status.mjs +18 -0
- package/dist/es/dump/task-status.mjs.map +1 -0
- package/dist/es/element-describer.mjs +198 -0
- package/dist/es/element-describer.mjs.map +1 -0
- package/dist/es/errors.mjs +20 -0
- package/dist/es/errors.mjs.map +1 -0
- package/dist/es/report-html-template.mjs +4 -0
- package/dist/es/report-html-template.mjs.map +1 -0
- package/dist/es/report-stats.mjs +113 -0
- package/dist/es/report-stats.mjs.map +1 -0
- package/dist/es/screenshot-item.mjs +7 -2
- package/dist/es/screenshot-item.mjs.map +1 -1
- package/dist/es/service/index.mjs +10 -5
- package/dist/es/service/index.mjs.map +1 -1
- package/dist/es/task-runner.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +1 -1
- package/dist/es/yaml/cleanup.mjs +13 -0
- package/dist/es/yaml/cleanup.mjs.map +1 -0
- package/dist/lib/agent/agent.js +24 -11
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/cache-config.js +53 -0
- package/dist/lib/agent/cache-config.js.map +1 -0
- package/dist/lib/agent/file-chooser.js +125 -0
- package/dist/lib/agent/file-chooser.js.map +1 -0
- package/dist/lib/agent/insight.js +135 -0
- package/dist/lib/agent/insight.js.map +1 -0
- package/dist/lib/agent/metrics.js +115 -0
- package/dist/lib/agent/metrics.js.map +1 -0
- package/dist/lib/agent/progress/ai-act-progress.js +239 -0
- package/dist/lib/agent/progress/ai-act-progress.js.map +1 -0
- package/dist/lib/agent/progress/index.js +67 -0
- package/dist/lib/agent/progress/index.js.map +1 -0
- package/dist/lib/agent/progress/progress-bus.js +86 -0
- package/dist/lib/agent/progress/progress-bus.js.map +1 -0
- package/dist/lib/agent/prompt-context.js +62 -0
- package/dist/lib/agent/prompt-context.js.map +1 -0
- package/dist/lib/agent/record-to-report.js +48 -0
- package/dist/lib/agent/record-to-report.js.map +1 -0
- package/dist/lib/agent/run-gherkin-scenario.js +151 -0
- package/dist/lib/agent/run-gherkin-scenario.js.map +1 -0
- package/dist/lib/agent/run-markdown.js +96 -0
- package/dist/lib/agent/run-markdown.js.map +1 -0
- package/dist/lib/agent/screenshot-preparation.js +74 -0
- package/dist/lib/agent/screenshot-preparation.js.map +1 -0
- package/dist/lib/agent/ui-observer.js +425 -0
- package/dist/lib/agent/ui-observer.js.map +1 -0
- package/dist/lib/agent/utils.js +46 -2
- package/dist/lib/agent/utils.js.map +1 -1
- package/dist/lib/ai-model/connectivity/fixture.js +45 -0
- package/dist/lib/ai-model/connectivity/fixture.js.map +1 -0
- package/dist/lib/ai-model/connectivity/index.js +38 -0
- package/dist/lib/ai-model/connectivity/index.js.map +1 -0
- package/dist/lib/ai-model/connectivity/run-connectivity-test.js +204 -0
- package/dist/lib/ai-model/connectivity/run-connectivity-test.js.map +1 -0
- package/dist/lib/ai-model/conversation-history.js.map +1 -1
- package/dist/lib/ai-model/index.js +15 -11
- package/dist/lib/ai-model/inspect.js +1 -1
- package/dist/lib/ai-model/inspect.js.map +1 -1
- package/dist/lib/ai-model/model-adapter/chat-completion.js +103 -0
- package/dist/lib/ai-model/model-adapter/chat-completion.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/custom-planning-action.js +40 -0
- package/dist/lib/ai-model/model-adapter/custom-planning-action.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/custom-planning-types.js +20 -0
- package/dist/lib/ai-model/model-adapter/custom-planning-types.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/default-insight-protocol.js +62 -0
- package/dist/lib/ai-model/model-adapter/default-insight-protocol.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/default-locate-protocol.js +182 -0
- package/dist/lib/ai-model/model-adapter/default-locate-protocol.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/default-planning-protocol.js +170 -0
- package/dist/lib/ai-model/model-adapter/default-planning-protocol.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/image-preprocess.js +61 -0
- package/dist/lib/ai-model/model-adapter/image-preprocess.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/index.js +38 -0
- package/dist/lib/ai-model/model-adapter/index.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/insight-protocol.js +20 -0
- package/dist/lib/ai-model/model-adapter/insight-protocol.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/insight.js +50 -0
- package/dist/lib/ai-model/model-adapter/insight.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/locate-protocol.js +20 -0
- package/dist/lib/ai-model/model-adapter/locate-protocol.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/locate.js +87 -0
- package/dist/lib/ai-model/model-adapter/locate.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/planning-protocol.js +20 -0
- package/dist/lib/ai-model/model-adapter/planning-protocol.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/planning.js +86 -0
- package/dist/lib/ai-model/model-adapter/planning.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/resolve.js +88 -0
- package/dist/lib/ai-model/model-adapter/resolve.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/types.js +20 -0
- package/dist/lib/ai-model/model-adapter/types.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/actions.js +239 -0
- package/dist/lib/ai-model/models/auto-glm/actions.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/adapter.js +79 -0
- package/dist/lib/ai-model/models/auto-glm/adapter.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/locate.js +45 -0
- package/dist/lib/ai-model/models/auto-glm/locate.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/parser.js +260 -0
- package/dist/lib/ai-model/models/auto-glm/parser.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/planning.js +67 -0
- package/dist/lib/ai-model/models/auto-glm/planning.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/prompt.js +257 -0
- package/dist/lib/ai-model/models/auto-glm/prompt.js.map +1 -0
- package/dist/lib/ai-model/models/deepseek/adapter.js +113 -0
- package/dist/lib/ai-model/models/deepseek/adapter.js.map +1 -0
- package/dist/lib/ai-model/models/deepseek/locate-protocol.js +132 -0
- package/dist/lib/ai-model/models/deepseek/locate-protocol.js.map +1 -0
- package/dist/lib/ai-model/models/default.js +47 -0
- package/dist/lib/ai-model/models/default.js.map +1 -0
- package/dist/lib/ai-model/models/doubao.js +132 -0
- package/dist/lib/ai-model/models/doubao.js.map +1 -0
- package/dist/lib/ai-model/models/gemini.js +137 -0
- package/dist/lib/ai-model/models/gemini.js.map +1 -0
- package/dist/lib/ai-model/models/glm.js +80 -0
- package/dist/lib/ai-model/models/glm.js.map +1 -0
- package/dist/lib/ai-model/models/gpt.js +77 -0
- package/dist/lib/ai-model/models/gpt.js.map +1 -0
- package/dist/lib/ai-model/models/index.js +41 -0
- package/dist/lib/ai-model/models/index.js.map +1 -0
- package/dist/lib/ai-model/models/kimi.js +136 -0
- package/dist/lib/ai-model/models/kimi.js.map +1 -0
- package/dist/lib/ai-model/models/mimo.js +70 -0
- package/dist/lib/ai-model/models/mimo.js.map +1 -0
- package/dist/lib/ai-model/models/qwen.js +173 -0
- package/dist/lib/ai-model/models/qwen.js.map +1 -0
- package/dist/lib/ai-model/models/registry.js +91 -0
- package/dist/lib/ai-model/models/registry.js.map +1 -0
- package/dist/lib/ai-model/models/ui-tars/actions.js +181 -0
- package/dist/lib/ai-model/models/ui-tars/actions.js.map +1 -0
- package/dist/lib/ai-model/models/ui-tars/adapter.js +136 -0
- package/dist/lib/ai-model/models/ui-tars/adapter.js.map +1 -0
- package/dist/lib/ai-model/models/ui-tars/parser.js +74 -0
- package/dist/lib/ai-model/models/ui-tars/parser.js.map +1 -0
- package/dist/lib/ai-model/models/ui-tars/planning.js +59 -0
- package/dist/lib/ai-model/models/ui-tars/planning.js.map +1 -0
- package/dist/lib/ai-model/models/ui-tars/prompt.js +73 -0
- package/dist/lib/ai-model/models/ui-tars/prompt.js.map +1 -0
- package/dist/lib/ai-model/models/utils/intent.js +40 -0
- package/dist/lib/ai-model/models/utils/intent.js.map +1 -0
- package/dist/lib/ai-model/prompt/insight/index.js +45 -0
- package/dist/lib/ai-model/prompt/insight/index.js.map +1 -0
- package/dist/lib/ai-model/prompt/insight/system-prompt.js +138 -0
- package/dist/lib/ai-model/prompt/insight/system-prompt.js.map +1 -0
- package/dist/lib/ai-model/prompt/insight/user-prompt.js +60 -0
- package/dist/lib/ai-model/prompt/insight/user-prompt.js.map +1 -0
- package/dist/lib/ai-model/prompt/locate/element-system-prompt.js +46 -0
- package/dist/lib/ai-model/prompt/locate/element-system-prompt.js.map +1 -0
- package/dist/lib/ai-model/prompt/locate/grounding-rules.js +47 -0
- package/dist/lib/ai-model/prompt/locate/grounding-rules.js.map +1 -0
- package/dist/lib/ai-model/prompt/locate/index.js +46 -0
- package/dist/lib/ai-model/prompt/locate/index.js.map +1 -0
- package/dist/lib/ai-model/prompt/locate/search-area-system-prompt.js +43 -0
- package/dist/lib/ai-model/prompt/locate/search-area-system-prompt.js.map +1 -0
- package/dist/lib/ai-model/prompt/planning/action-output-example.js +92 -0
- package/dist/lib/ai-model/prompt/planning/action-output-example.js.map +1 -0
- package/dist/lib/ai-model/prompt/planning/action-space-description.js +75 -0
- package/dist/lib/ai-model/prompt/planning/action-space-description.js.map +1 -0
- package/dist/lib/ai-model/prompt/planning/index.js +63 -0
- package/dist/lib/ai-model/prompt/planning/index.js.map +1 -0
- package/dist/lib/ai-model/prompt/planning/multi-turn-example.js +255 -0
- package/dist/lib/ai-model/prompt/planning/multi-turn-example.js.map +1 -0
- package/dist/lib/ai-model/prompt/planning/planning-response-example.js +59 -0
- package/dist/lib/ai-model/prompt/planning/planning-response-example.js.map +1 -0
- package/dist/lib/ai-model/prompt/planning/sub-goals-text.js +51 -0
- package/dist/lib/ai-model/prompt/planning/sub-goals-text.js.map +1 -0
- package/dist/lib/ai-model/prompt/planning/system-prompt.js +327 -0
- package/dist/lib/ai-model/prompt/planning/system-prompt.js.map +1 -0
- package/dist/lib/ai-model/service-caller/codex-app-server.js +1 -0
- package/dist/lib/ai-model/service-caller/codex-app-server.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +35 -16
- package/dist/lib/ai-model/service-caller/index.js.map +1 -1
- package/dist/lib/ai-model/service-caller/model-call-recorder.js +124 -0
- package/dist/lib/ai-model/service-caller/model-call-recorder.js.map +1 -0
- package/dist/lib/ai-model/service-caller/openai-error.js +184 -0
- package/dist/lib/ai-model/service-caller/openai-error.js.map +1 -0
- package/dist/lib/ai-model/service-caller/proxy-deps.node.js +46 -0
- package/dist/lib/ai-model/service-caller/proxy-deps.node.js.map +1 -0
- package/dist/lib/ai-model/service-caller/proxy-deps.stub.js +49 -0
- package/dist/lib/ai-model/service-caller/proxy-deps.stub.js.map +1 -0
- package/dist/lib/ai-model/service-caller/semantic-retry.js +70 -0
- package/dist/lib/ai-model/service-caller/semantic-retry.js.map +1 -0
- package/dist/lib/ai-model/service-caller/types.js +20 -0
- package/dist/lib/ai-model/service-caller/types.js.map +1 -0
- package/dist/lib/ai-model/shared/action-schema.js +49 -0
- package/dist/lib/ai-model/shared/action-schema.js.map +1 -0
- package/dist/lib/ai-model/shared/json.js +103 -0
- package/dist/lib/ai-model/shared/json.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/bbox.js +106 -0
- package/dist/lib/ai-model/shared/model-locate-result/bbox.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/coordinate-distance.js +44 -0
- package/dist/lib/ai-model/shared/model-locate-result/coordinate-distance.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/errors.js +46 -0
- package/dist/lib/ai-model/shared/model-locate-result/errors.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/factory.js +76 -0
- package/dist/lib/ai-model/shared/model-locate-result/factory.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/index.js +66 -0
- package/dist/lib/ai-model/shared/model-locate-result/index.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/parse.js +88 -0
- package/dist/lib/ai-model/shared/model-locate-result/parse.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/pixel-bbox-mapper.js +101 -0
- package/dist/lib/ai-model/shared/model-locate-result/pixel-bbox-mapper.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/prompt-spec.js +156 -0
- package/dist/lib/ai-model/shared/model-locate-result/prompt-spec.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/types.js +46 -0
- package/dist/lib/ai-model/shared/model-locate-result/types.js.map +1 -0
- package/dist/lib/ai-model/shared/multimodal-prompt.js +95 -0
- package/dist/lib/ai-model/shared/multimodal-prompt.js.map +1 -0
- package/dist/lib/ai-model/shared/xml.js +79 -0
- package/dist/lib/ai-model/shared/xml.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/index.js +46 -0
- package/dist/lib/ai-model/workflows/grounding/index.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/locate-result-rect.js +60 -0
- package/dist/lib/ai-model/workflows/grounding/locate-result-rect.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/locate.js +208 -0
- package/dist/lib/ai-model/workflows/grounding/locate.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/planning-action-locate.js +131 -0
- package/dist/lib/ai-model/workflows/grounding/planning-action-locate.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/search-area-mapping.js +52 -0
- package/dist/lib/ai-model/workflows/grounding/search-area-mapping.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/search-area.js +92 -0
- package/dist/lib/ai-model/workflows/grounding/search-area.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/section-locate.js +180 -0
- package/dist/lib/ai-model/workflows/grounding/section-locate.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/types.js +20 -0
- package/dist/lib/ai-model/workflows/grounding/types.js.map +1 -0
- package/dist/lib/ai-model/workflows/grounding/utils.js +87 -0
- package/dist/lib/ai-model/workflows/grounding/utils.js.map +1 -0
- package/dist/lib/ai-model/workflows/insight/extraction.js +135 -0
- package/dist/lib/ai-model/workflows/insight/extraction.js.map +1 -0
- package/dist/lib/ai-model/workflows/insight/index.js +42 -0
- package/dist/lib/ai-model/workflows/insight/index.js.map +1 -0
- package/dist/lib/ai-model/workflows/insight/insight-response-parser.js +60 -0
- package/dist/lib/ai-model/workflows/insight/insight-response-parser.js.map +1 -0
- package/dist/lib/ai-model/workflows/insight/order-sensitive.js +63 -0
- package/dist/lib/ai-model/workflows/insight/order-sensitive.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/conversation-history.js +219 -0
- package/dist/lib/ai-model/workflows/planning/conversation-history.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/custom-planning.js +166 -0
- package/dist/lib/ai-model/workflows/planning/custom-planning.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/index.js +49 -0
- package/dist/lib/ai-model/workflows/planning/index.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/locate-normalization.js +75 -0
- package/dist/lib/ai-model/workflows/planning/locate-normalization.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/planning-action-log.js +56 -0
- package/dist/lib/ai-model/workflows/planning/planning-action-log.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/standard-planning-parser.js +142 -0
- package/dist/lib/ai-model/workflows/planning/standard-planning-parser.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/standard-planning.js +253 -0
- package/dist/lib/ai-model/workflows/planning/standard-planning.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/types.js +20 -0
- package/dist/lib/ai-model/workflows/planning/types.js.map +1 -0
- package/dist/lib/ai-model/workflows/recorder-generation/common.js +232 -0
- package/dist/lib/ai-model/workflows/recorder-generation/common.js.map +1 -0
- package/dist/lib/ai-model/workflows/recorder-generation/index.js +68 -0
- package/dist/lib/ai-model/workflows/recorder-generation/index.js.map +1 -0
- package/dist/lib/ai-model/workflows/recorder-generation/markdown.js +293 -0
- package/dist/lib/ai-model/workflows/recorder-generation/markdown.js.map +1 -0
- package/dist/lib/ai-model/workflows/recorder-generation/metadata.js +117 -0
- package/dist/lib/ai-model/workflows/recorder-generation/metadata.js.map +1 -0
- package/dist/lib/ai-model/workflows/recorder-generation/playwright.js +184 -0
- package/dist/lib/ai-model/workflows/recorder-generation/playwright.js.map +1 -0
- package/dist/lib/ai-model/workflows/recorder-generation/yaml.js +232 -0
- package/dist/lib/ai-model/workflows/recorder-generation/yaml.js.map +1 -0
- package/dist/lib/common.js +18 -1
- package/dist/lib/common.js.map +1 -1
- package/dist/lib/constants.js +38 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/device/input-strategy.js +80 -0
- package/dist/lib/device/input-strategy.js.map +1 -0
- package/dist/lib/dump/html-utils.js +18 -0
- package/dist/lib/dump/html-utils.js.map +1 -1
- package/dist/lib/dump/image-reference.js +115 -0
- package/dist/lib/dump/image-reference.js.map +1 -0
- package/dist/lib/dump/report-action-dump.js +284 -0
- package/dist/lib/dump/report-action-dump.js.map +1 -0
- package/dist/lib/dump/report-dump-compactor.js +234 -0
- package/dist/lib/dump/report-dump-compactor.js.map +1 -0
- package/dist/lib/dump/screenshot-store.js +146 -38
- package/dist/lib/dump/screenshot-store.js.map +1 -1
- package/dist/lib/dump/task-service-dump.js +54 -0
- package/dist/lib/dump/task-service-dump.js.map +1 -0
- package/dist/lib/dump/task-status.js +55 -0
- package/dist/lib/dump/task-status.js.map +1 -0
- package/dist/lib/element-describer.js +238 -0
- package/dist/lib/element-describer.js.map +1 -0
- package/dist/lib/errors.js +54 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/report-html-template.js +38 -0
- package/dist/lib/report-html-template.js.map +1 -0
- package/dist/lib/report-stats.js +147 -0
- package/dist/lib/report-stats.js.map +1 -0
- package/dist/lib/screenshot-item.js +7 -2
- package/dist/lib/screenshot-item.js.map +1 -1
- package/dist/lib/service/index.js +10 -5
- package/dist/lib/service/index.js.map +1 -1
- package/dist/lib/task-runner.js.map +1 -1
- package/dist/lib/types.js +2 -2
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/lib/yaml/cleanup.js +47 -0
- package/dist/lib/yaml/cleanup.js.map +1 -0
- package/dist/types/agent/agent.d.ts +5 -9
- package/dist/types/agent/cache-config.d.ts +2 -0
- package/dist/types/agent/file-chooser.d.ts +19 -0
- package/dist/types/agent/insight.d.ts +21 -0
- package/dist/types/agent/metrics.d.ts +48 -0
- package/dist/types/agent/progress/ai-act-progress.d.ts +21 -0
- package/dist/types/agent/progress/index.d.ts +2 -0
- package/dist/types/agent/progress/progress-bus.d.ts +33 -0
- package/dist/types/agent/prompt-context.d.ts +3 -0
- package/dist/types/agent/record-to-report.d.ts +2 -0
- package/dist/types/agent/run-gherkin-scenario.d.ts +26 -0
- package/dist/types/agent/run-markdown.d.ts +6 -0
- package/dist/types/agent/screenshot-preparation.d.ts +20 -0
- package/dist/types/agent/ui-observer.d.ts +103 -0
- package/dist/types/agent/utils.d.ts +12 -1
- package/dist/types/ai-model/connectivity/fixture.d.ts +5 -0
- package/dist/types/ai-model/connectivity/index.d.ts +1 -0
- package/dist/types/ai-model/connectivity/run-connectivity-test.d.ts +11 -0
- package/dist/types/ai-model/index.d.ts +2 -0
- package/dist/types/ai-model/model-adapter/chat-completion.d.ts +2 -0
- package/dist/types/ai-model/model-adapter/custom-planning-action.d.ts +25 -0
- package/dist/types/ai-model/model-adapter/custom-planning-types.d.ts +31 -0
- package/dist/types/ai-model/model-adapter/default-insight-protocol.d.ts +2 -0
- package/dist/types/ai-model/model-adapter/default-locate-protocol.d.ts +7 -0
- package/dist/types/ai-model/model-adapter/default-planning-protocol.d.ts +25 -0
- package/dist/types/ai-model/model-adapter/image-preprocess.d.ts +30 -0
- package/dist/types/ai-model/model-adapter/index.d.ts +2 -0
- package/dist/types/ai-model/model-adapter/insight-protocol.d.ts +24 -0
- package/dist/types/ai-model/model-adapter/insight.d.ts +3 -0
- package/dist/types/ai-model/model-adapter/locate-protocol.d.ts +23 -0
- package/dist/types/ai-model/model-adapter/locate.d.ts +4 -0
- package/dist/types/ai-model/model-adapter/planning-protocol.d.ts +53 -0
- package/dist/types/ai-model/model-adapter/planning.d.ts +6 -0
- package/dist/types/ai-model/model-adapter/resolve.d.ts +12 -0
- package/dist/types/ai-model/model-adapter/types.d.ts +218 -0
- package/dist/types/ai-model/models/auto-glm/actions.d.ts +81 -0
- package/dist/types/ai-model/models/auto-glm/adapter.d.ts +5 -0
- package/dist/types/ai-model/models/auto-glm/locate.d.ts +2 -0
- package/dist/types/ai-model/models/auto-glm/parser.d.ts +14 -0
- package/dist/types/ai-model/models/auto-glm/planning.d.ts +5 -0
- package/dist/types/ai-model/models/auto-glm/prompt.d.ts +4 -0
- package/dist/types/ai-model/models/deepseek/adapter.d.ts +39 -0
- package/dist/types/ai-model/models/deepseek/locate-protocol.d.ts +5 -0
- package/dist/types/ai-model/models/default.d.ts +2 -0
- package/dist/types/ai-model/models/doubao.d.ts +7 -0
- package/dist/types/ai-model/models/gemini.d.ts +37 -0
- package/dist/types/ai-model/models/glm.d.ts +21 -0
- package/dist/types/ai-model/models/gpt.d.ts +20 -0
- package/dist/types/ai-model/models/index.d.ts +2 -0
- package/dist/types/ai-model/models/kimi.d.ts +45 -0
- package/dist/types/ai-model/models/mimo.d.ts +10 -0
- package/dist/types/ai-model/models/qwen.d.ts +33 -0
- package/dist/types/ai-model/models/registry.d.ts +187 -0
- package/dist/types/ai-model/models/ui-tars/actions.d.ts +3 -0
- package/dist/types/ai-model/models/ui-tars/adapter.d.ts +6 -0
- package/dist/types/ai-model/models/ui-tars/parser.d.ts +72 -0
- package/dist/types/ai-model/models/ui-tars/planning.d.ts +4 -0
- package/dist/types/ai-model/models/ui-tars/prompt.d.ts +2 -0
- package/dist/types/ai-model/models/utils/intent.d.ts +2 -0
- package/dist/types/ai-model/prompt/insight/index.d.ts +2 -0
- package/dist/types/ai-model/prompt/insight/system-prompt.d.ts +6 -0
- package/dist/types/ai-model/prompt/insight/user-prompt.d.ts +3 -0
- package/dist/types/ai-model/prompt/locate/element-system-prompt.d.ts +4 -0
- package/dist/types/ai-model/prompt/locate/grounding-rules.d.ts +1 -0
- package/dist/types/ai-model/prompt/locate/index.d.ts +3 -0
- package/dist/types/ai-model/prompt/locate/search-area-system-prompt.d.ts +4 -0
- package/dist/types/ai-model/prompt/planning/action-output-example.d.ts +17 -0
- package/dist/types/ai-model/prompt/planning/action-space-description.d.ts +11 -0
- package/dist/types/ai-model/prompt/planning/index.d.ts +6 -0
- package/dist/types/ai-model/prompt/planning/multi-turn-example.d.ts +10 -0
- package/dist/types/ai-model/prompt/planning/planning-response-example.d.ts +28 -0
- package/dist/types/ai-model/prompt/planning/sub-goals-text.d.ts +2 -0
- package/dist/types/ai-model/prompt/planning/system-prompt.d.ts +18 -0
- package/dist/types/ai-model/service-caller/index.d.ts +21 -6
- package/dist/types/ai-model/service-caller/model-call-recorder.d.ts +12 -0
- package/dist/types/ai-model/service-caller/openai-error.d.ts +26 -0
- package/dist/types/ai-model/service-caller/proxy-deps.node.d.ts +2 -0
- package/dist/types/ai-model/service-caller/proxy-deps.stub.d.ts +2 -0
- package/dist/types/ai-model/service-caller/semantic-retry.d.ts +30 -0
- package/dist/types/ai-model/service-caller/types.d.ts +2 -0
- package/dist/types/ai-model/shared/action-schema.d.ts +4 -0
- package/dist/types/ai-model/shared/json.d.ts +26 -0
- package/dist/types/ai-model/shared/model-locate-result/bbox.d.ts +6 -0
- package/dist/types/ai-model/shared/model-locate-result/coordinate-distance.d.ts +4 -0
- package/dist/types/ai-model/shared/model-locate-result/errors.d.ts +2 -0
- package/dist/types/ai-model/shared/model-locate-result/factory.d.ts +3 -0
- package/dist/types/ai-model/shared/model-locate-result/index.d.ts +7 -0
- package/dist/types/ai-model/shared/model-locate-result/parse.d.ts +8 -0
- package/dist/types/ai-model/shared/model-locate-result/pixel-bbox-mapper.d.ts +7 -0
- package/dist/types/ai-model/shared/model-locate-result/prompt-spec.d.ts +6 -0
- package/dist/types/ai-model/shared/model-locate-result/types.d.ts +150 -0
- package/dist/types/ai-model/shared/multimodal-prompt.d.ts +13 -0
- package/dist/types/ai-model/shared/xml.d.ts +15 -0
- package/dist/types/ai-model/workflows/grounding/index.d.ts +3 -0
- package/dist/types/ai-model/workflows/grounding/locate-result-rect.d.ts +5 -0
- package/dist/types/ai-model/workflows/grounding/locate.d.ts +7 -0
- package/dist/types/ai-model/workflows/grounding/planning-action-locate.d.ts +4 -0
- package/dist/types/ai-model/workflows/grounding/search-area-mapping.d.ts +4 -0
- package/dist/types/ai-model/workflows/grounding/search-area.d.ts +18 -0
- package/dist/types/ai-model/workflows/grounding/section-locate.d.ts +16 -0
- package/dist/types/ai-model/workflows/grounding/types.d.ts +56 -0
- package/dist/types/ai-model/workflows/grounding/utils.d.ts +25 -0
- package/dist/types/ai-model/workflows/insight/extraction.d.ts +18 -0
- package/dist/types/ai-model/workflows/insight/index.d.ts +2 -0
- package/dist/types/ai-model/workflows/insight/insight-response-parser.d.ts +4 -0
- package/dist/types/ai-model/workflows/insight/order-sensitive.d.ts +6 -0
- package/dist/types/ai-model/workflows/planning/conversation-history.d.ts +105 -0
- package/dist/types/ai-model/workflows/planning/custom-planning.d.ts +7 -0
- package/dist/types/ai-model/workflows/planning/index.d.ts +3 -0
- package/dist/types/ai-model/workflows/planning/locate-normalization.d.ts +12 -0
- package/dist/types/ai-model/workflows/planning/planning-action-log.d.ts +2 -0
- package/dist/types/ai-model/workflows/planning/standard-planning-parser.d.ts +31 -0
- package/dist/types/ai-model/workflows/planning/standard-planning.d.ts +4 -0
- package/dist/types/ai-model/workflows/planning/types.d.ts +16 -0
- package/dist/types/ai-model/workflows/recorder-generation/common.d.ts +89 -0
- package/dist/types/ai-model/workflows/recorder-generation/index.d.ts +7 -0
- package/dist/types/ai-model/workflows/recorder-generation/markdown.d.ts +7 -0
- package/dist/types/ai-model/workflows/recorder-generation/metadata.d.ts +13 -0
- package/dist/types/ai-model/workflows/recorder-generation/playwright.d.ts +26 -0
- package/dist/types/ai-model/workflows/recorder-generation/yaml.d.ts +17 -0
- package/dist/types/common.d.ts +2 -0
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/device/index.d.ts +15 -4
- package/dist/types/device/input-strategy.d.ts +44 -0
- package/dist/types/dump/html-utils.d.ts +1 -0
- package/dist/types/dump/image-reference.d.ts +36 -0
- package/dist/types/dump/report-action-dump.d.ts +127 -0
- package/dist/types/dump/report-dump-compactor.d.ts +7 -0
- package/dist/types/dump/screenshot-store.d.ts +32 -15
- package/dist/types/dump/task-service-dump.d.ts +3 -0
- package/dist/types/dump/task-status.d.ts +41 -0
- package/dist/types/element-describer.d.ts +43 -0
- package/dist/types/errors.d.ts +5 -0
- package/dist/types/report-html-template.d.ts +1 -0
- package/dist/types/report-stats.d.ts +39 -0
- package/dist/types/screenshot-item.d.ts +1 -0
- package/dist/types/service/index.d.ts +6 -2
- package/dist/types/task-runner.d.ts +6 -0
- package/dist/types/types.d.ts +98 -5
- package/dist/types/yaml/cleanup.d.ts +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { ScreenshotItem } from "../screenshot-item.mjs";
|
|
4
|
+
import { restoreImageReferences } from "./screenshot-restoration.mjs";
|
|
5
|
+
import { ReportImageStore, isBase64ImageDataUrl } from "./screenshot-store.mjs";
|
|
6
|
+
function _define_property(obj, key, value) {
|
|
7
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
8
|
+
value: value,
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true
|
|
12
|
+
});
|
|
13
|
+
else obj[key] = value;
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
function isReferenceImageDescriptor(value) {
|
|
17
|
+
if ('object' != typeof value || null === value) return false;
|
|
18
|
+
const record = value;
|
|
19
|
+
return 'string' == typeof record.name && 'string' == typeof record.url;
|
|
20
|
+
}
|
|
21
|
+
function getPageOrBrowserObjectName(value) {
|
|
22
|
+
if ('object' != typeof value || null === value) return null;
|
|
23
|
+
const constructorName = value.constructor?.name;
|
|
24
|
+
return 'Page' === constructorName || 'Browser' === constructorName ? constructorName : null;
|
|
25
|
+
}
|
|
26
|
+
function isCustomSerializableObject(value) {
|
|
27
|
+
return 'object' == typeof value && null !== value && 'function' == typeof value.toSerializable;
|
|
28
|
+
}
|
|
29
|
+
function isPlainRecord(value) {
|
|
30
|
+
const prototype = Object.getPrototypeOf(value);
|
|
31
|
+
return prototype === Object.prototype || null === prototype;
|
|
32
|
+
}
|
|
33
|
+
function replacerForDumpSerialization(key, value) {
|
|
34
|
+
if ('screenshotSequence' === key) return;
|
|
35
|
+
const opaqueObjectName = getPageOrBrowserObjectName(value);
|
|
36
|
+
if (opaqueObjectName) return `[${opaqueObjectName} object]`;
|
|
37
|
+
if (isCustomSerializableObject(value)) return value.toSerializable();
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function stringifyDump(data, indents) {
|
|
41
|
+
return JSON.stringify(data, replacerForDumpSerialization, indents);
|
|
42
|
+
}
|
|
43
|
+
function replaceReferenceImageUrls(value, referenceImageRefsByUrl, ancestors = new WeakSet()) {
|
|
44
|
+
if ('object' != typeof value || null === value) return value;
|
|
45
|
+
if (getPageOrBrowserObjectName(value) || isCustomSerializableObject(value) || !Array.isArray(value) && !isPlainRecord(value)) return value;
|
|
46
|
+
if (ancestors.has(value)) return value;
|
|
47
|
+
ancestors.add(value);
|
|
48
|
+
try {
|
|
49
|
+
if (Array.isArray(value)) return value.map((item)=>replaceReferenceImageUrls(item, referenceImageRefsByUrl, ancestors));
|
|
50
|
+
const result = {};
|
|
51
|
+
for (const [key, nestedValue] of Object.entries(value)){
|
|
52
|
+
if ('images' === key && Array.isArray(nestedValue)) {
|
|
53
|
+
result[key] = nestedValue.map((image)=>{
|
|
54
|
+
const transformedImage = replaceReferenceImageUrls(image, referenceImageRefsByUrl, ancestors);
|
|
55
|
+
if (!isReferenceImageDescriptor(image)) return transformedImage;
|
|
56
|
+
const referenceImageRef = referenceImageRefsByUrl.get(image.url);
|
|
57
|
+
if (!referenceImageRef || 'object' != typeof transformedImage || null === transformedImage || !isPlainRecord(transformedImage)) return transformedImage;
|
|
58
|
+
return {
|
|
59
|
+
...transformedImage,
|
|
60
|
+
url: referenceImageRef
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
result[key] = replaceReferenceImageUrls(nestedValue, referenceImageRefsByUrl, ancestors);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
} finally{
|
|
69
|
+
ancestors.delete(value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function reviverForDumpDeserialization(key, value) {
|
|
73
|
+
if ('screenshot' !== key || 'object' != typeof value || null === value) return value;
|
|
74
|
+
ScreenshotItem.isSerialized(value);
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
class ExecutionDump {
|
|
78
|
+
serialize(indents) {
|
|
79
|
+
return stringifyDump(this.toJSON(), indents);
|
|
80
|
+
}
|
|
81
|
+
toJSON() {
|
|
82
|
+
return {
|
|
83
|
+
id: this.id,
|
|
84
|
+
logTime: this.logTime,
|
|
85
|
+
name: this.name,
|
|
86
|
+
description: this.description,
|
|
87
|
+
tasks: this.tasks.map((task)=>({
|
|
88
|
+
...task,
|
|
89
|
+
recorder: task.recorder || []
|
|
90
|
+
})),
|
|
91
|
+
aiActContext: this.aiActContext
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
static fromSerializedString(serialized) {
|
|
95
|
+
const parsed = JSON.parse(serialized, reviverForDumpDeserialization);
|
|
96
|
+
return new ExecutionDump(parsed);
|
|
97
|
+
}
|
|
98
|
+
static fromJSON(data) {
|
|
99
|
+
return new ExecutionDump(data);
|
|
100
|
+
}
|
|
101
|
+
collectScreenshots() {
|
|
102
|
+
const screenshots = [];
|
|
103
|
+
for (const task of this.tasks){
|
|
104
|
+
if (task.uiContext?.screenshot instanceof ScreenshotItem) screenshots.push(task.uiContext.screenshot);
|
|
105
|
+
if (task.recorder) {
|
|
106
|
+
for (const record of task.recorder)if (record.screenshot instanceof ScreenshotItem) screenshots.push(record.screenshot);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return screenshots;
|
|
110
|
+
}
|
|
111
|
+
getReferenceImageUrls() {
|
|
112
|
+
return [
|
|
113
|
+
...this.referenceImageUrls
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
constructor(data, options){
|
|
117
|
+
_define_property(this, "id", void 0);
|
|
118
|
+
_define_property(this, "logTime", void 0);
|
|
119
|
+
_define_property(this, "name", void 0);
|
|
120
|
+
_define_property(this, "description", void 0);
|
|
121
|
+
_define_property(this, "tasks", void 0);
|
|
122
|
+
_define_property(this, "aiActContext", void 0);
|
|
123
|
+
_define_property(this, "referenceImageUrls", void 0);
|
|
124
|
+
this.id = data.id;
|
|
125
|
+
this.logTime = data.logTime;
|
|
126
|
+
this.name = data.name;
|
|
127
|
+
this.description = data.description;
|
|
128
|
+
this.tasks = data.tasks;
|
|
129
|
+
this.aiActContext = data.aiActContext;
|
|
130
|
+
this.referenceImageUrls = Array.from(new Set((options?.referenceImageUrls ?? []).filter(isBase64ImageDataUrl)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
class ReportActionDump {
|
|
134
|
+
serialize(indents) {
|
|
135
|
+
return stringifyDump(this.toJSON(), indents);
|
|
136
|
+
}
|
|
137
|
+
serializeWithReferenceImages(referenceImageRefsByUrl, indents) {
|
|
138
|
+
return stringifyDump(replaceReferenceImageUrls(this.toJSON(), referenceImageRefsByUrl), indents);
|
|
139
|
+
}
|
|
140
|
+
serializeWithInlineScreenshots(indents) {
|
|
141
|
+
const processValue = (obj)=>{
|
|
142
|
+
if (obj instanceof ScreenshotItem) return {
|
|
143
|
+
base64: obj.base64,
|
|
144
|
+
capturedAt: obj.capturedAt
|
|
145
|
+
};
|
|
146
|
+
if (Array.isArray(obj)) return obj.map(processValue);
|
|
147
|
+
if (obj && 'object' == typeof obj) {
|
|
148
|
+
const entries = Object.entries(obj).filter(([key])=>'screenshotSequence' !== key).map(([key, value])=>[
|
|
149
|
+
key,
|
|
150
|
+
processValue(value)
|
|
151
|
+
]);
|
|
152
|
+
return Object.fromEntries(entries);
|
|
153
|
+
}
|
|
154
|
+
return obj;
|
|
155
|
+
};
|
|
156
|
+
const data = processValue(this.toJSON());
|
|
157
|
+
return JSON.stringify(data, null, indents);
|
|
158
|
+
}
|
|
159
|
+
toJSON() {
|
|
160
|
+
return {
|
|
161
|
+
sdkVersion: this.sdkVersion,
|
|
162
|
+
groupName: this.groupName,
|
|
163
|
+
groupDescription: this.groupDescription,
|
|
164
|
+
modelBriefs: this.modelBriefs,
|
|
165
|
+
executions: this.executions.map((exec)=>exec.toJSON()),
|
|
166
|
+
deviceType: this.deviceType
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
static fromSerializedString(serialized) {
|
|
170
|
+
const parsed = JSON.parse(serialized, reviverForDumpDeserialization);
|
|
171
|
+
return new ReportActionDump(parsed);
|
|
172
|
+
}
|
|
173
|
+
static fromJSON(data) {
|
|
174
|
+
return new ReportActionDump(data);
|
|
175
|
+
}
|
|
176
|
+
collectAllScreenshots() {
|
|
177
|
+
const screenshots = [];
|
|
178
|
+
for (const execution of this.executions)screenshots.push(...execution.collectScreenshots());
|
|
179
|
+
return screenshots;
|
|
180
|
+
}
|
|
181
|
+
serializeToFiles(basePath) {
|
|
182
|
+
const screenshotsDir = `${basePath}.screenshots`;
|
|
183
|
+
if (!existsSync(screenshotsDir)) mkdirSync(screenshotsDir, {
|
|
184
|
+
recursive: true
|
|
185
|
+
});
|
|
186
|
+
const screenshots = this.collectAllScreenshots();
|
|
187
|
+
for (const screenshot of screenshots){
|
|
188
|
+
const imagePath = join(screenshotsDir, `${screenshot.id}.${screenshot.extension}`);
|
|
189
|
+
if (existsSync(imagePath)) continue;
|
|
190
|
+
const rawBase64 = screenshot.rawBase64;
|
|
191
|
+
writeFileSync(imagePath, Buffer.from(rawBase64, 'base64'));
|
|
192
|
+
}
|
|
193
|
+
writeFileSync(basePath, this.serialize(), 'utf-8');
|
|
194
|
+
}
|
|
195
|
+
static fromFilesAsInlineJson(basePath) {
|
|
196
|
+
const dumpString = readFileSync(basePath, 'utf-8');
|
|
197
|
+
const screenshotsDir = `${basePath}.screenshots`;
|
|
198
|
+
const dumpData = JSON.parse(dumpString);
|
|
199
|
+
const imageStore = new ReportImageStore({
|
|
200
|
+
mode: 'directory',
|
|
201
|
+
reportPath: basePath,
|
|
202
|
+
screenshotsDir
|
|
203
|
+
});
|
|
204
|
+
const resolveImage = (ref)=>imageStore.loadDataUri(ref);
|
|
205
|
+
const processedData = restoreImageReferences(dumpData, resolveImage);
|
|
206
|
+
return JSON.stringify(processedData);
|
|
207
|
+
}
|
|
208
|
+
static cleanupFiles(basePath) {
|
|
209
|
+
const filesToClean = [
|
|
210
|
+
basePath,
|
|
211
|
+
`${basePath}.screenshots`
|
|
212
|
+
];
|
|
213
|
+
for (const filePath of filesToClean)try {
|
|
214
|
+
rmSync(filePath, {
|
|
215
|
+
force: true,
|
|
216
|
+
recursive: true
|
|
217
|
+
});
|
|
218
|
+
} catch {}
|
|
219
|
+
}
|
|
220
|
+
static getFilePaths(basePath) {
|
|
221
|
+
return [
|
|
222
|
+
basePath,
|
|
223
|
+
`${basePath}.screenshots`
|
|
224
|
+
];
|
|
225
|
+
}
|
|
226
|
+
constructor(data){
|
|
227
|
+
_define_property(this, "sdkVersion", void 0);
|
|
228
|
+
_define_property(this, "groupName", void 0);
|
|
229
|
+
_define_property(this, "groupDescription", void 0);
|
|
230
|
+
_define_property(this, "modelBriefs", void 0);
|
|
231
|
+
_define_property(this, "executions", void 0);
|
|
232
|
+
_define_property(this, "deviceType", void 0);
|
|
233
|
+
this.sdkVersion = data.sdkVersion;
|
|
234
|
+
this.groupName = data.groupName;
|
|
235
|
+
this.groupDescription = data.groupDescription;
|
|
236
|
+
this.modelBriefs = data.modelBriefs;
|
|
237
|
+
this.executions = data.executions.map((exec)=>exec instanceof ExecutionDump ? exec : ExecutionDump.fromJSON(exec));
|
|
238
|
+
this.deviceType = data.deviceType;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const GroupedActionDump = ReportActionDump;
|
|
242
|
+
export { ExecutionDump, GroupedActionDump, ReportActionDump };
|
|
243
|
+
|
|
244
|
+
//# sourceMappingURL=report-action-dump.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dump/report-action-dump.mjs","sources":["../../../src/dump/report-action-dump.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { ScreenshotItem } from '../screenshot-item';\nimport type {\n ExecutionTask,\n IExecutionDump,\n IReportActionDump,\n} from '../types';\nimport { restoreImageReferences } from './screenshot-restoration';\nimport {\n type ImageUrlRef,\n ReportImageStore,\n isBase64ImageDataUrl,\n} from './screenshot-store';\n\n/** A multimodal prompt image descriptor retained by an execution dump. */\ninterface ReportReferenceImageDescriptor {\n name: string;\n url: string;\n}\n\nfunction isReferenceImageDescriptor(\n value: unknown,\n): value is ReportReferenceImageDescriptor {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return typeof record.name === 'string' && typeof record.url === 'string';\n}\n\nfunction getPageOrBrowserObjectName(value: unknown): 'Page' | 'Browser' | null {\n if (typeof value !== 'object' || value === null) return null;\n const constructorName = value.constructor?.name;\n return constructorName === 'Page' || constructorName === 'Browser'\n ? constructorName\n : null;\n}\n\nfunction isCustomSerializableObject(\n value: unknown,\n): value is { toSerializable(): unknown } {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { toSerializable?: unknown }).toSerializable === 'function'\n );\n}\n\nfunction isPlainRecord(value: object): value is Record<string, unknown> {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Replacer function for JSON serialization that handles Page, Browser objects and ScreenshotItem\n */\nfunction replacerForDumpSerialization(key: string, value: any): any {\n // screenshotSequence is a transient model input (multi-frame capture). Its\n // frames are not persisted by collectScreenshots, so serializing them would\n // emit dangling screenshot refs. The representative `screenshot` is kept.\n if (key === 'screenshotSequence') {\n return undefined;\n }\n const opaqueObjectName = getPageOrBrowserObjectName(value);\n if (opaqueObjectName) {\n return `[${opaqueObjectName} object]`;\n }\n if (isCustomSerializableObject(value)) {\n return value.toSerializable();\n }\n return value;\n}\n\nfunction stringifyDump(data: unknown, indents?: number): string {\n return JSON.stringify(data, replacerForDumpSerialization, indents);\n}\n\n/**\n * Clone serializable plain data while replacing image descriptors only when\n * they occur inside an `images` array. Cloning per occurrence deliberately\n * avoids object-identity coupling when callers reuse the same descriptor in\n * another, unrelated field.\n */\nfunction replaceReferenceImageUrls(\n value: unknown,\n referenceImageRefsByUrl: ReadonlyMap<string, ImageUrlRef>,\n ancestors: WeakSet<object> = new WeakSet(),\n): unknown {\n if (typeof value !== 'object' || value === null) return value;\n if (\n getPageOrBrowserObjectName(value) ||\n isCustomSerializableObject(value) ||\n (!Array.isArray(value) && !isPlainRecord(value))\n ) {\n return value;\n }\n if (ancestors.has(value)) return value;\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n return value.map((item) =>\n replaceReferenceImageUrls(item, referenceImageRefsByUrl, ancestors),\n );\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n if (key === 'images' && Array.isArray(nestedValue)) {\n result[key] = nestedValue.map((image) => {\n const transformedImage = replaceReferenceImageUrls(\n image,\n referenceImageRefsByUrl,\n ancestors,\n );\n if (!isReferenceImageDescriptor(image)) return transformedImage;\n\n const referenceImageRef = referenceImageRefsByUrl.get(image.url);\n if (\n !referenceImageRef ||\n typeof transformedImage !== 'object' ||\n transformedImage === null ||\n !isPlainRecord(transformedImage)\n ) {\n return transformedImage;\n }\n return { ...transformedImage, url: referenceImageRef };\n });\n continue;\n }\n result[key] = replaceReferenceImageUrls(\n nestedValue,\n referenceImageRefsByUrl,\n ancestors,\n );\n }\n return result;\n } finally {\n ancestors.delete(value);\n }\n}\n\n/**\n * Reviver function for JSON deserialization that keeps screenshot references\n * as plain objects. Resolution is handled lazily by restoreImageReferences.\n *\n * @param key - JSON key being processed\n * @param value - JSON value being processed\n * @returns Restored value\n */\nfunction reviverForDumpDeserialization(key: string, value: any): any {\n // Only process screenshot fields\n if (key !== 'screenshot' || typeof value !== 'object' || value === null) {\n return value;\n }\n\n if (ScreenshotItem.isSerialized(value)) {\n return value;\n }\n\n return value;\n}\n\n/**\n * ExecutionDump class for serializing and deserializing execution dumps\n */\nexport class ExecutionDump implements IExecutionDump {\n id?: string;\n logTime: number;\n name: string;\n description?: string;\n tasks: ExecutionTask[];\n aiActContext?: string;\n private readonly referenceImageUrls: readonly string[];\n\n constructor(\n data: IExecutionDump,\n options?: { referenceImageUrls?: readonly string[] },\n ) {\n this.id = data.id;\n this.logTime = data.logTime;\n this.name = data.name;\n this.description = data.description;\n this.tasks = data.tasks;\n this.aiActContext = data.aiActContext;\n this.referenceImageUrls = Array.from(\n new Set((options?.referenceImageUrls ?? []).filter(isBase64ImageDataUrl)),\n );\n }\n\n /**\n * Serialize the ExecutionDump to a JSON string\n */\n serialize(indents?: number): string {\n return stringifyDump(this.toJSON(), indents);\n }\n\n /**\n * Convert to a plain object for JSON serialization\n */\n toJSON(): IExecutionDump {\n return {\n id: this.id,\n logTime: this.logTime,\n name: this.name,\n description: this.description,\n tasks: this.tasks.map((task) => ({\n ...task,\n recorder: task.recorder || [],\n })),\n aiActContext: this.aiActContext,\n };\n }\n\n /**\n * Create an ExecutionDump instance from a serialized JSON string\n */\n static fromSerializedString(serialized: string): ExecutionDump {\n const parsed = JSON.parse(\n serialized,\n reviverForDumpDeserialization,\n ) as IExecutionDump;\n return new ExecutionDump(parsed);\n }\n\n /**\n * Create an ExecutionDump instance from a plain object\n */\n static fromJSON(data: IExecutionDump): ExecutionDump {\n return new ExecutionDump(data);\n }\n\n /**\n * Collect all ScreenshotItem instances from tasks.\n * Scans through uiContext and recorder items to find screenshots.\n *\n * @returns Array of ScreenshotItem instances\n */\n collectScreenshots(): ScreenshotItem[] {\n const screenshots: ScreenshotItem[] = [];\n\n for (const task of this.tasks) {\n // Collect uiContext.screenshot if present\n if (task.uiContext?.screenshot instanceof ScreenshotItem) {\n screenshots.push(task.uiContext.screenshot);\n }\n\n // Collect recorder screenshots\n if (task.recorder) {\n for (const record of task.recorder) {\n if (record.screenshot instanceof ScreenshotItem) {\n screenshots.push(record.screenshot);\n }\n }\n }\n }\n\n return screenshots;\n }\n\n /**\n * Return persistable base64 reference-image URLs explicitly registered while\n * building this execution. This sidecar is excluded from serialized dumps.\n */\n getReferenceImageUrls(): readonly string[] {\n return [...this.referenceImageUrls];\n }\n}\n\n/**\n * ReportActionDump class for serializing and deserializing report action dumps\n */\nexport class ReportActionDump implements IReportActionDump {\n sdkVersion: string;\n groupName: string;\n groupDescription?: string;\n modelBriefs: IReportActionDump['modelBriefs'];\n executions: ExecutionDump[];\n deviceType?: string;\n\n constructor(data: IReportActionDump) {\n this.sdkVersion = data.sdkVersion;\n this.groupName = data.groupName;\n this.groupDescription = data.groupDescription;\n this.modelBriefs = data.modelBriefs;\n this.executions = data.executions.map((exec) =>\n exec instanceof ExecutionDump ? exec : ExecutionDump.fromJSON(exec),\n );\n this.deviceType = data.deviceType;\n }\n\n /**\n * Serialize the ReportActionDump to a JSON string\n * Uses typed report references for persisted screenshots.\n */\n serialize(indents?: number): string {\n return stringifyDump(this.toJSON(), indents);\n }\n\n /**\n * Serialize a report dump while replacing persisted multimodal prompt image\n * URLs with their compact report asset references.\n *\n * @param referenceImageRefsByUrl Maps registered prompt image URLs to assets.\n * @param indents Optional JSON indentation.\n * @returns The serialized report dump.\n */\n serializeWithReferenceImages(\n referenceImageRefsByUrl: ReadonlyMap<string, ImageUrlRef>,\n indents?: number,\n ): string {\n return stringifyDump(\n replaceReferenceImageUrls(this.toJSON(), referenceImageRefsByUrl),\n indents,\n );\n }\n\n /**\n * Serialize the ReportActionDump with inline screenshots to a JSON string.\n * Each ScreenshotItem is replaced with { base64: \"...\", capturedAt }.\n */\n serializeWithInlineScreenshots(indents?: number): string {\n const processValue = (obj: unknown): unknown => {\n if (obj instanceof ScreenshotItem) {\n return { base64: obj.base64, capturedAt: obj.capturedAt };\n }\n if (Array.isArray(obj)) {\n return obj.map(processValue);\n }\n if (obj && typeof obj === 'object') {\n const entries = Object.entries(obj)\n // screenshotSequence is a transient multi-frame model input whose\n // frames are not persisted; skip it to avoid inlining large base64.\n .filter(([key]) => key !== 'screenshotSequence')\n .map(([key, value]) => [key, processValue(value)]);\n return Object.fromEntries(entries);\n }\n return obj;\n };\n\n const data = processValue(this.toJSON());\n return JSON.stringify(data, null, indents);\n }\n\n /**\n * Convert to a plain object for JSON serialization\n */\n toJSON(): IReportActionDump {\n return {\n sdkVersion: this.sdkVersion,\n groupName: this.groupName,\n groupDescription: this.groupDescription,\n modelBriefs: this.modelBriefs,\n executions: this.executions.map((exec) => exec.toJSON()),\n deviceType: this.deviceType,\n };\n }\n\n /**\n * Create a ReportActionDump instance from a serialized JSON string\n */\n static fromSerializedString(serialized: string): ReportActionDump {\n const parsed = JSON.parse(\n serialized,\n reviverForDumpDeserialization,\n ) as IReportActionDump;\n return new ReportActionDump(parsed);\n }\n\n /**\n * Create a ReportActionDump instance from a plain object\n */\n static fromJSON(data: IReportActionDump): ReportActionDump {\n return new ReportActionDump(data);\n }\n\n /**\n * Collect all ScreenshotItem instances from all executions.\n *\n * @returns Array of all ScreenshotItem instances across all executions\n */\n collectAllScreenshots(): ScreenshotItem[] {\n const screenshots: ScreenshotItem[] = [];\n for (const execution of this.executions) {\n screenshots.push(...execution.collectScreenshots());\n }\n return screenshots;\n }\n\n /**\n * Serialize the dump to files with screenshots as separate PNG files.\n * Creates:\n * - {basePath} - dump JSON with { $screenshot: id } references\n * - {basePath}.screenshots/ - PNG files\n *\n * @param basePath - Base path for the dump file\n */\n serializeToFiles(basePath: string): void {\n const screenshotsDir = `${basePath}.screenshots`;\n if (!existsSync(screenshotsDir)) {\n mkdirSync(screenshotsDir, { recursive: true });\n }\n\n const screenshots = this.collectAllScreenshots();\n\n for (const screenshot of screenshots) {\n const imagePath = join(\n screenshotsDir,\n `${screenshot.id}.${screenshot.extension}`,\n );\n if (existsSync(imagePath)) {\n continue;\n }\n\n const rawBase64 = screenshot.rawBase64;\n writeFileSync(imagePath, Buffer.from(rawBase64, 'base64'));\n }\n\n // Write dump JSON with references\n writeFileSync(basePath, this.serialize(), 'utf-8');\n }\n\n /**\n * Read dump from files and return JSON string with inline screenshots.\n * Reads the dump JSON and screenshot files, then inlines the base64 data.\n *\n * @param basePath - Base path for the dump file\n * @returns JSON string with inline screenshots ({ base64: \"...\" } format)\n */\n static fromFilesAsInlineJson(basePath: string): string {\n const dumpString = readFileSync(basePath, 'utf-8');\n const screenshotsDir = `${basePath}.screenshots`;\n\n // Restore image references\n const dumpData = JSON.parse(dumpString);\n const imageStore = new ReportImageStore({\n mode: 'directory',\n reportPath: basePath,\n screenshotsDir,\n });\n const resolveImage = (ref: Parameters<typeof imageStore.loadDataUri>[0]) =>\n imageStore.loadDataUri(ref);\n const processedData = restoreImageReferences(dumpData, resolveImage);\n return JSON.stringify(processedData);\n }\n\n /**\n * Clean up all files associated with a serialized dump.\n *\n * @param basePath - Base path for the dump file\n */\n static cleanupFiles(basePath: string): void {\n const filesToClean = [basePath, `${basePath}.screenshots`];\n\n for (const filePath of filesToClean) {\n try {\n rmSync(filePath, { force: true, recursive: true });\n } catch {\n // Ignore errors - file may already be deleted\n }\n }\n }\n\n /**\n * Get all file paths associated with a serialized dump.\n *\n * @param basePath - Base path for the dump file\n * @returns Array of all associated file paths\n */\n static getFilePaths(basePath: string): string[] {\n return [basePath, `${basePath}.screenshots`];\n }\n}\n\n// Backward-compatible aliases for existing external consumers.\nexport type GroupedActionDump = ReportActionDump;\nexport const GroupedActionDump = ReportActionDump;\n"],"names":["isReferenceImageDescriptor","value","record","getPageOrBrowserObjectName","constructorName","isCustomSerializableObject","isPlainRecord","prototype","Object","replacerForDumpSerialization","key","opaqueObjectName","stringifyDump","data","indents","JSON","replaceReferenceImageUrls","referenceImageRefsByUrl","ancestors","WeakSet","Array","item","result","nestedValue","image","transformedImage","referenceImageRef","reviverForDumpDeserialization","ScreenshotItem","ExecutionDump","task","serialized","parsed","screenshots","options","Set","isBase64ImageDataUrl","ReportActionDump","processValue","obj","entries","exec","execution","basePath","screenshotsDir","existsSync","mkdirSync","screenshot","imagePath","join","rawBase64","writeFileSync","Buffer","dumpString","readFileSync","dumpData","imageStore","ReportImageStore","resolveImage","ref","processedData","restoreImageReferences","filesToClean","filePath","rmSync","GroupedActionDump"],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { createReadStream } from "node:fs";
|
|
2
|
+
import { open as promises_open, rename, stat, unlink } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, join } from "node:path";
|
|
4
|
+
import { antiEscapeScriptTag, escapeScriptTag, uuid } from "@aiscene/shared/utils";
|
|
5
|
+
import { ReportActionDump } from "../types.mjs";
|
|
6
|
+
const SCRIPT_OPEN = Buffer.from("<script");
|
|
7
|
+
const SCRIPT_CLOSE = Buffer.from("<\/script>");
|
|
8
|
+
const READ_CHUNK_SIZE = 33554432;
|
|
9
|
+
const DUMP_TYPE_ATTRIBUTE = 'type="midscene_web_dump"';
|
|
10
|
+
const GROUP_ID_REGEXP = /data-group-id="([^"]+)"/;
|
|
11
|
+
function decodeGroupId(openTag) {
|
|
12
|
+
if (!openTag.includes(DUMP_TYPE_ATTRIBUTE)) return;
|
|
13
|
+
const encodedGroupId = openTag.match(GROUP_ID_REGEXP)?.[1];
|
|
14
|
+
return encodedGroupId ? decodeURIComponent(encodedGroupId) : void 0;
|
|
15
|
+
}
|
|
16
|
+
async function scanScriptTags(reportPath, onScript) {
|
|
17
|
+
let pending = Buffer.alloc(0);
|
|
18
|
+
for await (const chunk of createReadStream(reportPath, {
|
|
19
|
+
highWaterMark: READ_CHUNK_SIZE
|
|
20
|
+
})){
|
|
21
|
+
pending = 0 === pending.length ? chunk : Buffer.concat([
|
|
22
|
+
pending,
|
|
23
|
+
chunk
|
|
24
|
+
]);
|
|
25
|
+
while(pending.length > 0){
|
|
26
|
+
const scriptStart = pending.indexOf(SCRIPT_OPEN);
|
|
27
|
+
if (-1 === scriptStart) {
|
|
28
|
+
pending = pending.subarray(Math.max(0, pending.length - SCRIPT_OPEN.length + 1));
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
if (scriptStart > 0) pending = pending.subarray(scriptStart);
|
|
32
|
+
const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);
|
|
33
|
+
if (-1 === openTagEnd) break;
|
|
34
|
+
const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);
|
|
35
|
+
if (-1 === closeTagStart) break;
|
|
36
|
+
const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;
|
|
37
|
+
await onScript({
|
|
38
|
+
openTag: pending.subarray(0, openTagEnd + 1).toString('utf-8'),
|
|
39
|
+
content: pending.subarray(openTagEnd + 1, closeTagStart)
|
|
40
|
+
});
|
|
41
|
+
pending = pending.subarray(scriptEnd);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (-1 !== pending.indexOf(SCRIPT_OPEN)) throw new Error(`Report contains an unterminated script tag: ${reportPath}`);
|
|
45
|
+
}
|
|
46
|
+
async function analyzeDumpGroups(reportPath) {
|
|
47
|
+
const groups = new Map();
|
|
48
|
+
let tagCount = 0;
|
|
49
|
+
await scanScriptTags(reportPath, ({ openTag, content })=>{
|
|
50
|
+
const groupId = decodeGroupId(openTag);
|
|
51
|
+
if (!groupId) return;
|
|
52
|
+
const dump = ReportActionDump.fromSerializedString(antiEscapeScriptTag(content.toString('utf-8').trim()));
|
|
53
|
+
let group = groups.get(groupId);
|
|
54
|
+
if (!group) {
|
|
55
|
+
group = {
|
|
56
|
+
baseDump: dump,
|
|
57
|
+
executionsByKey: new Map(),
|
|
58
|
+
firstOpenTag: openTag,
|
|
59
|
+
noIdExecutionIndex: 0,
|
|
60
|
+
tagCount: 0
|
|
61
|
+
};
|
|
62
|
+
groups.set(groupId, group);
|
|
63
|
+
}
|
|
64
|
+
group.tagCount += 1;
|
|
65
|
+
tagCount += 1;
|
|
66
|
+
for (const execution of dump.executions){
|
|
67
|
+
const executionKey = execution.id ? `id:${execution.id}` : `no-id:${group.noIdExecutionIndex++}`;
|
|
68
|
+
group.executionsByKey.set(executionKey, execution);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
groups,
|
|
73
|
+
tagCount
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function compactedDumpTag(group) {
|
|
77
|
+
group.baseDump.executions = Array.from(group.executionsByKey.values());
|
|
78
|
+
const serialized = escapeScriptTag(group.baseDump.serialize());
|
|
79
|
+
return Buffer.from(`${group.firstOpenTag}${serialized}${SCRIPT_CLOSE.toString('utf-8')}`);
|
|
80
|
+
}
|
|
81
|
+
async function writeAll(handle, data) {
|
|
82
|
+
let offset = 0;
|
|
83
|
+
while(offset < data.length){
|
|
84
|
+
const { bytesWritten } = await handle.write(data, offset, data.length - offset, null);
|
|
85
|
+
if (0 === bytesWritten) throw new Error('Failed to make progress while writing compacted report');
|
|
86
|
+
offset += bytesWritten;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function rewriteReport(sourcePath, targetPath, analysis) {
|
|
90
|
+
const compactedTags = new Map(Array.from(analysis.groups, ([groupId, group])=>[
|
|
91
|
+
groupId,
|
|
92
|
+
compactedDumpTag(group)
|
|
93
|
+
]));
|
|
94
|
+
const seenTagsByGroup = new Map();
|
|
95
|
+
const emittedGroups = new Set();
|
|
96
|
+
const output = await promises_open(targetPath, 'wx');
|
|
97
|
+
let pending = Buffer.alloc(0);
|
|
98
|
+
try {
|
|
99
|
+
for await (const chunk of createReadStream(sourcePath, {
|
|
100
|
+
highWaterMark: READ_CHUNK_SIZE
|
|
101
|
+
})){
|
|
102
|
+
pending = 0 === pending.length ? chunk : Buffer.concat([
|
|
103
|
+
pending,
|
|
104
|
+
chunk
|
|
105
|
+
]);
|
|
106
|
+
while(pending.length > 0){
|
|
107
|
+
const scriptStart = pending.indexOf(SCRIPT_OPEN);
|
|
108
|
+
if (-1 === scriptStart) {
|
|
109
|
+
const writableLength = Math.max(0, pending.length - SCRIPT_OPEN.length + 1);
|
|
110
|
+
await writeAll(output, pending.subarray(0, writableLength));
|
|
111
|
+
pending = pending.subarray(writableLength);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
await writeAll(output, pending.subarray(0, scriptStart));
|
|
115
|
+
pending = pending.subarray(scriptStart);
|
|
116
|
+
const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);
|
|
117
|
+
if (-1 === openTagEnd) break;
|
|
118
|
+
const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);
|
|
119
|
+
if (-1 === closeTagStart) break;
|
|
120
|
+
const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;
|
|
121
|
+
const openTag = pending.subarray(0, openTagEnd + 1).toString('utf-8');
|
|
122
|
+
const groupId = decodeGroupId(openTag);
|
|
123
|
+
if (groupId && analysis.groups.has(groupId)) {
|
|
124
|
+
const seenCount = (seenTagsByGroup.get(groupId) ?? 0) + 1;
|
|
125
|
+
seenTagsByGroup.set(groupId, seenCount);
|
|
126
|
+
if (seenCount === analysis.groups.get(groupId).tagCount) {
|
|
127
|
+
await writeAll(output, compactedTags.get(groupId));
|
|
128
|
+
emittedGroups.add(groupId);
|
|
129
|
+
}
|
|
130
|
+
} else await writeAll(output, pending.subarray(0, scriptEnd));
|
|
131
|
+
pending = pending.subarray(scriptEnd);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (-1 !== pending.indexOf(SCRIPT_OPEN)) throw new Error(`Report contains an unterminated script tag: ${sourcePath}`);
|
|
135
|
+
await writeAll(output, pending);
|
|
136
|
+
for (const [groupId, group] of analysis.groups)if (seenTagsByGroup.get(groupId) !== group.tagCount || !emittedGroups.has(groupId)) throw new Error(`Report compaction did not rewrite every dump in group: ${groupId}`);
|
|
137
|
+
await output.sync();
|
|
138
|
+
} finally{
|
|
139
|
+
await output.close();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function canRetryRenameOnWindows(error) {
|
|
143
|
+
if ('win32' !== process.platform) return false;
|
|
144
|
+
const code = error.code;
|
|
145
|
+
return 'EACCES' === code || 'EEXIST' === code || 'EPERM' === code;
|
|
146
|
+
}
|
|
147
|
+
async function replaceReportFile(temporaryPath, reportPath) {
|
|
148
|
+
try {
|
|
149
|
+
await rename(temporaryPath, reportPath);
|
|
150
|
+
return;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
if (!canRetryRenameOnWindows(error)) throw error;
|
|
153
|
+
}
|
|
154
|
+
const backupPath = join(dirname(reportPath), `.${basename(reportPath)}.${uuid()}.backup`);
|
|
155
|
+
await rename(reportPath, backupPath);
|
|
156
|
+
try {
|
|
157
|
+
await rename(temporaryPath, reportPath);
|
|
158
|
+
} catch (replaceError) {
|
|
159
|
+
try {
|
|
160
|
+
await rename(backupPath, reportPath);
|
|
161
|
+
} catch (restoreError) {
|
|
162
|
+
throw new Error(`Failed to replace compacted report and restore the original report: ${String(replaceError)}; restore error: ${String(restoreError)}`);
|
|
163
|
+
}
|
|
164
|
+
throw replaceError;
|
|
165
|
+
}
|
|
166
|
+
await unlink(backupPath);
|
|
167
|
+
}
|
|
168
|
+
async function compactReportDumps(reportPath) {
|
|
169
|
+
const before = await stat(reportPath);
|
|
170
|
+
const analysis = await analyzeDumpGroups(reportPath);
|
|
171
|
+
const afterDumpCount = analysis.groups.size;
|
|
172
|
+
if (analysis.tagCount <= afterDumpCount) return {
|
|
173
|
+
beforeBytes: before.size,
|
|
174
|
+
afterBytes: before.size,
|
|
175
|
+
beforeDumpCount: analysis.tagCount,
|
|
176
|
+
afterDumpCount
|
|
177
|
+
};
|
|
178
|
+
const temporaryPath = join(dirname(reportPath), `.${basename(reportPath)}.${uuid()}.tmp`);
|
|
179
|
+
try {
|
|
180
|
+
await rewriteReport(reportPath, temporaryPath, analysis);
|
|
181
|
+
const after = await stat(temporaryPath);
|
|
182
|
+
await replaceReportFile(temporaryPath, reportPath);
|
|
183
|
+
return {
|
|
184
|
+
beforeBytes: before.size,
|
|
185
|
+
afterBytes: after.size,
|
|
186
|
+
beforeDumpCount: analysis.tagCount,
|
|
187
|
+
afterDumpCount
|
|
188
|
+
};
|
|
189
|
+
} catch (error) {
|
|
190
|
+
try {
|
|
191
|
+
await unlink(temporaryPath);
|
|
192
|
+
} catch (cleanupError) {
|
|
193
|
+
if ('ENOENT' !== cleanupError.code) throw new Error(`Report compaction failed and the temporary file could not be removed: ${String(error)}; cleanup error: ${String(cleanupError)}`);
|
|
194
|
+
}
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export { compactReportDumps };
|
|
199
|
+
|
|
200
|
+
//# sourceMappingURL=report-dump-compactor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dump/report-dump-compactor.mjs","sources":["../../../src/dump/report-dump-compactor.ts"],"sourcesContent":["import { createReadStream } from 'node:fs';\nimport { type FileHandle, open, rename, stat, unlink } from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\nimport {\n antiEscapeScriptTag,\n escapeScriptTag,\n uuid,\n} from '@aiscene/shared/utils';\nimport { type ExecutionDump, ReportActionDump } from '../types';\n\nconst SCRIPT_OPEN = Buffer.from('<script');\nconst SCRIPT_CLOSE = Buffer.from('</script>');\nconst READ_CHUNK_SIZE = 32 * 1024 * 1024;\nconst DUMP_TYPE_ATTRIBUTE = 'type=\"midscene_web_dump\"';\nconst GROUP_ID_REGEXP = /data-group-id=\"([^\"]+)\"/;\n\ninterface ScriptTag {\n openTag: string;\n content: Buffer;\n}\n\ninterface DumpGroup {\n baseDump: ReportActionDump;\n executionsByKey: Map<string, ExecutionDump>;\n firstOpenTag: string;\n noIdExecutionIndex: number;\n tagCount: number;\n}\n\ninterface DumpAnalysis {\n groups: Map<string, DumpGroup>;\n tagCount: number;\n}\n\nexport interface ReportDumpCompactionResult {\n beforeBytes: number;\n afterBytes: number;\n beforeDumpCount: number;\n afterDumpCount: number;\n}\n\nfunction decodeGroupId(openTag: string): string | undefined {\n if (!openTag.includes(DUMP_TYPE_ATTRIBUTE)) return undefined;\n const encodedGroupId = openTag.match(GROUP_ID_REGEXP)?.[1];\n return encodedGroupId ? decodeURIComponent(encodedGroupId) : undefined;\n}\n\nasync function scanScriptTags(\n reportPath: string,\n onScript: (script: ScriptTag) => void | Promise<void>,\n): Promise<void> {\n let pending: Buffer = Buffer.alloc(0);\n\n for await (const chunk of createReadStream(reportPath, {\n highWaterMark: READ_CHUNK_SIZE,\n })) {\n pending =\n pending.length === 0\n ? (chunk as Buffer)\n : Buffer.concat([pending, chunk as Buffer]);\n\n while (pending.length > 0) {\n const scriptStart = pending.indexOf(SCRIPT_OPEN);\n if (scriptStart === -1) {\n pending = pending.subarray(\n Math.max(0, pending.length - SCRIPT_OPEN.length + 1),\n );\n break;\n }\n\n if (scriptStart > 0) {\n pending = pending.subarray(scriptStart);\n }\n\n const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);\n if (openTagEnd === -1) break;\n\n const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);\n if (closeTagStart === -1) break;\n\n const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;\n await onScript({\n openTag: pending.subarray(0, openTagEnd + 1).toString('utf-8'),\n content: pending.subarray(openTagEnd + 1, closeTagStart),\n });\n pending = pending.subarray(scriptEnd);\n }\n }\n\n if (pending.indexOf(SCRIPT_OPEN) !== -1) {\n throw new Error(\n `Report contains an unterminated script tag: ${reportPath}`,\n );\n }\n}\n\nasync function analyzeDumpGroups(reportPath: string): Promise<DumpAnalysis> {\n const groups = new Map<string, DumpGroup>();\n let tagCount = 0;\n\n await scanScriptTags(reportPath, ({ openTag, content }) => {\n const groupId = decodeGroupId(openTag);\n if (!groupId) return;\n\n const dump = ReportActionDump.fromSerializedString(\n antiEscapeScriptTag(content.toString('utf-8').trim()),\n );\n let group = groups.get(groupId);\n if (!group) {\n group = {\n baseDump: dump,\n executionsByKey: new Map(),\n firstOpenTag: openTag,\n noIdExecutionIndex: 0,\n tagCount: 0,\n };\n groups.set(groupId, group);\n }\n\n group.tagCount += 1;\n tagCount += 1;\n for (const execution of dump.executions) {\n const executionKey = execution.id\n ? `id:${execution.id}`\n : `no-id:${group.noIdExecutionIndex++}`;\n group.executionsByKey.set(executionKey, execution);\n }\n });\n\n return { groups, tagCount };\n}\n\nfunction compactedDumpTag(group: DumpGroup): Buffer {\n group.baseDump.executions = Array.from(group.executionsByKey.values());\n const serialized = escapeScriptTag(group.baseDump.serialize());\n return Buffer.from(\n `${group.firstOpenTag}${serialized}${SCRIPT_CLOSE.toString('utf-8')}`,\n );\n}\n\nasync function writeAll(handle: FileHandle, data: Buffer): Promise<void> {\n let offset = 0;\n while (offset < data.length) {\n const { bytesWritten } = await handle.write(\n data,\n offset,\n data.length - offset,\n null,\n );\n if (bytesWritten === 0) {\n throw new Error('Failed to make progress while writing compacted report');\n }\n offset += bytesWritten;\n }\n}\n\nasync function rewriteReport(\n sourcePath: string,\n targetPath: string,\n analysis: DumpAnalysis,\n): Promise<void> {\n const compactedTags = new Map(\n Array.from(analysis.groups, ([groupId, group]) => [\n groupId,\n compactedDumpTag(group),\n ]),\n );\n const seenTagsByGroup = new Map<string, number>();\n const emittedGroups = new Set<string>();\n const output = await open(targetPath, 'wx');\n let pending: Buffer = Buffer.alloc(0);\n\n try {\n for await (const chunk of createReadStream(sourcePath, {\n highWaterMark: READ_CHUNK_SIZE,\n })) {\n pending =\n pending.length === 0\n ? (chunk as Buffer)\n : Buffer.concat([pending, chunk as Buffer]);\n\n while (pending.length > 0) {\n const scriptStart = pending.indexOf(SCRIPT_OPEN);\n if (scriptStart === -1) {\n const writableLength = Math.max(\n 0,\n pending.length - SCRIPT_OPEN.length + 1,\n );\n await writeAll(output, pending.subarray(0, writableLength));\n pending = pending.subarray(writableLength);\n break;\n }\n\n await writeAll(output, pending.subarray(0, scriptStart));\n pending = pending.subarray(scriptStart);\n\n const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);\n if (openTagEnd === -1) break;\n\n const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);\n if (closeTagStart === -1) break;\n\n const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;\n const openTag = pending.subarray(0, openTagEnd + 1).toString('utf-8');\n const groupId = decodeGroupId(openTag);\n\n if (!groupId || !analysis.groups.has(groupId)) {\n await writeAll(output, pending.subarray(0, scriptEnd));\n } else {\n const seenCount = (seenTagsByGroup.get(groupId) ?? 0) + 1;\n seenTagsByGroup.set(groupId, seenCount);\n if (seenCount === analysis.groups.get(groupId)!.tagCount) {\n await writeAll(output, compactedTags.get(groupId)!);\n emittedGroups.add(groupId);\n }\n }\n pending = pending.subarray(scriptEnd);\n }\n }\n\n if (pending.indexOf(SCRIPT_OPEN) !== -1) {\n throw new Error(\n `Report contains an unterminated script tag: ${sourcePath}`,\n );\n }\n await writeAll(output, pending);\n\n for (const [groupId, group] of analysis.groups) {\n if (\n seenTagsByGroup.get(groupId) !== group.tagCount ||\n !emittedGroups.has(groupId)\n ) {\n throw new Error(\n `Report compaction did not rewrite every dump in group: ${groupId}`,\n );\n }\n }\n await output.sync();\n } finally {\n await output.close();\n }\n}\n\nfunction canRetryRenameOnWindows(error: unknown): boolean {\n if (process.platform !== 'win32') return false;\n const code = (error as NodeJS.ErrnoException).code;\n return code === 'EACCES' || code === 'EEXIST' || code === 'EPERM';\n}\n\nasync function replaceReportFile(\n temporaryPath: string,\n reportPath: string,\n): Promise<void> {\n try {\n await rename(temporaryPath, reportPath);\n return;\n } catch (error) {\n if (!canRetryRenameOnWindows(error)) throw error;\n }\n\n const backupPath = join(\n dirname(reportPath),\n `.${basename(reportPath)}.${uuid()}.backup`,\n );\n await rename(reportPath, backupPath);\n try {\n await rename(temporaryPath, reportPath);\n } catch (replaceError) {\n try {\n await rename(backupPath, reportPath);\n } catch (restoreError) {\n throw new Error(\n `Failed to replace compacted report and restore the original report: ${String(replaceError)}; restore error: ${String(restoreError)}`,\n );\n }\n throw replaceError;\n }\n await unlink(backupPath);\n}\n\nexport async function compactReportDumps(\n reportPath: string,\n): Promise<ReportDumpCompactionResult> {\n const before = await stat(reportPath);\n const analysis = await analyzeDumpGroups(reportPath);\n const afterDumpCount = analysis.groups.size;\n\n if (analysis.tagCount <= afterDumpCount) {\n return {\n beforeBytes: before.size,\n afterBytes: before.size,\n beforeDumpCount: analysis.tagCount,\n afterDumpCount,\n };\n }\n\n const temporaryPath = join(\n dirname(reportPath),\n `.${basename(reportPath)}.${uuid()}.tmp`,\n );\n\n try {\n await rewriteReport(reportPath, temporaryPath, analysis);\n const after = await stat(temporaryPath);\n await replaceReportFile(temporaryPath, reportPath);\n return {\n beforeBytes: before.size,\n afterBytes: after.size,\n beforeDumpCount: analysis.tagCount,\n afterDumpCount,\n };\n } catch (error) {\n try {\n await unlink(temporaryPath);\n } catch (cleanupError) {\n if ((cleanupError as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw new Error(\n `Report compaction failed and the temporary file could not be removed: ${String(error)}; cleanup error: ${String(cleanupError)}`,\n );\n }\n }\n throw error;\n }\n}\n"],"names":["SCRIPT_OPEN","Buffer","SCRIPT_CLOSE","READ_CHUNK_SIZE","DUMP_TYPE_ATTRIBUTE","GROUP_ID_REGEXP","decodeGroupId","openTag","encodedGroupId","decodeURIComponent","undefined","scanScriptTags","reportPath","onScript","pending","chunk","createReadStream","scriptStart","Math","openTagEnd","closeTagStart","scriptEnd","Error","analyzeDumpGroups","groups","Map","tagCount","content","groupId","dump","ReportActionDump","antiEscapeScriptTag","group","execution","executionKey","compactedDumpTag","Array","serialized","escapeScriptTag","writeAll","handle","data","offset","bytesWritten","rewriteReport","sourcePath","targetPath","analysis","compactedTags","seenTagsByGroup","emittedGroups","Set","output","open","writableLength","seenCount","canRetryRenameOnWindows","error","process","code","replaceReportFile","temporaryPath","rename","backupPath","join","dirname","basename","uuid","replaceError","restoreError","String","unlink","compactReportDumps","before","stat","afterDumpCount","after","cleanupError"],"mappings":"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"}
|