lazycodex-ai 5.0.0-beta.9 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +64 -69
- package/README.ko.md +65 -70
- package/README.md +108 -182
- package/README.ru.md +60 -68
- package/README.zh-cn.md +60 -69
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/config-manager/refresh-opencode-plugin-sandbox.d.ts +31 -0
- package/dist/cli/doctor/checks/browser-provider.d.ts +2 -0
- package/dist/cli/doctor/checks/index.d.ts +2 -0
- package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/doctor/checks/tui-plugin-config.d.ts +11 -0
- package/dist/cli/doctor/framework/constants.d.ts +5 -0
- package/dist/cli/doctor/framework/types.d.ts +2 -0
- package/dist/cli/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +60340 -63161
- package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
- package/dist/cli/install-native/index.d.ts +12 -0
- package/dist/cli/install-native/legacy-omo-bin.d.ts +27 -0
- package/dist/cli/install-native/offer-native-setup.d.ts +31 -0
- package/dist/cli/install-native/omo-bin-test-fixtures.d.ts +35 -0
- package/dist/cli/install-native/plan.d.ts +21 -0
- package/dist/cli/install-native/repair-legacy-omo-bin.d.ts +26 -0
- package/dist/cli/install-native/run-native-install.d.ts +33 -0
- package/dist/cli/install-native/verify-omo-command.d.ts +22 -0
- package/dist/cli/install-native-dev/index.d.ts +4 -0
- package/dist/cli/native-dev-platform-flag.d.ts +5 -0
- package/dist/cli/native-edition-hint.d.ts +10 -0
- package/dist/cli/runtime-commands.d.ts +1 -1
- package/dist/cli/types.d.ts +3 -2
- package/dist/cli/worktree-sweep/classify.d.ts +16 -0
- package/dist/cli/worktree-sweep/format.d.ts +8 -0
- package/dist/cli/worktree-sweep/git.d.ts +19 -0
- package/dist/cli/worktree-sweep/index.d.ts +7 -0
- package/dist/cli/worktree-sweep/options.d.ts +2 -0
- package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
- package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
- package/dist/cli/worktree-sweep/types.d.ts +65 -0
- package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
- package/dist/cli-node/index.js +61667 -64465
- package/package.json +15 -14
- package/packages/git-bash-mcp/dist/cli.js +6 -1
- package/packages/lsp-daemon/dist/cli.js +1421 -960
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +956 -498
- package/packages/lsp-daemon/dist/daemon-client.d.ts +3 -0
- package/packages/lsp-daemon/dist/daemon-client.js +23 -3
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
- package/packages/lsp-daemon/dist/ensure-daemon.js +27 -5
- package/packages/lsp-daemon/dist/index.js +860 -407
- package/packages/lsp-daemon/dist/ownership.js +2 -2
- package/packages/lsp-daemon/dist/proxy.js +3 -0
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-daemon/package.json +5 -4
- package/packages/lsp-tools-mcp/dist/cli.js +764 -341
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +274 -138
- package/packages/lsp-tools-mcp/dist/mcp.js +789 -368
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +719 -302
- package/packages/lsp-tools-mcp/package.json +5 -4
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
- package/packages/omo-codex/plugin/.mcp.json +0 -6
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/README.md +6 -2
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +8504 -408
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
- package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +7 -1
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +6 -5
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
- package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
- package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +6 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +134 -11
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-contribute-bug-fix/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +7 -5
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-report-bug/SKILL.md +5 -5
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +977 -545
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +6 -5
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/README.md +2 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +5 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +127 -0
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +103 -68
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +8 -7
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +27 -5
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -2
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +6 -5
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +5328 -1382
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +5524 -1579
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +6 -5
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
- package/packages/omo-codex/plugin/components/ultrawork/README.md +3 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +20 -7
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +478 -4
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +6 -6
- package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +9 -10
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +17 -13
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -153
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +13 -13
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +13 -12
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -8
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +22 -6
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +17 -1
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +102 -107
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +30 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +57 -46
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +2205 -737
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +8 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +35 -23
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +25 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.d.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.js +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.js +37 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +24 -12
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.d.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.js +39 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +19 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.d.ts +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.js +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +6 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +54 -25
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.d.ts +10 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.js +38 -31
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +10 -7
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +121 -100
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.d.ts +16 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.js +115 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +41 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +25 -13
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +157 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +381 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +127 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +130 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.d.ts +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.js +67 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +7 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +190 -59
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.js +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +259 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +41 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +9 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +11 -11
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +28 -23
- package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.d.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.js +41 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +21 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +100 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +18 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +7 -6
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +7 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +34 -11
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +52 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +59 -77
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +51 -33
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +27 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/driver-objective-ack.ts +20 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/evidence-artifacts.ts +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +23 -16
- package/packages/omo-codex/plugin/components/ulw-loop/src/ledger.ts +38 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +32 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-commit.ts +132 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +67 -54
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts +63 -31
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +140 -119
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-log.ts +112 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +61 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
- package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +38 -13
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +218 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +156 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +143 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-budget-io.ts +59 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +201 -52
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-role-guard.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +257 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +5 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +12 -10
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +27 -22
- package/packages/omo-codex/plugin/components/ulw-loop/src/success-criteria-input.ts +56 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +133 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +35 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +88 -11
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/barrier.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-child.ts +65 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-cli-qa.mjs +76 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-crash.ts +23 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +58 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-writer.ts +65 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/lease-clock.ts +23 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
- package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-log.test.ts +252 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-recovery.test.ts +190 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +74 -25
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-legacy-projection.test.ts +228 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-newest.test.ts +72 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-fields-messages.test.ts +98 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-completed-plan.test.ts +43 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-driver-states.test.ts +174 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-dx.test.ts +219 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +169 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard-native-reviewer.test.ts +207 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +452 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +113 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +310 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/status-next-actions-surface.test.ts +133 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +12 -12
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +12 -6
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +113 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +9 -3
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +16 -7
- package/packages/omo-codex/plugin/package-lock.json +992 -681
- package/packages/omo-codex/plugin/package.json +6 -3
- package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
- package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +8 -2
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.d.mts +4 -0
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +114 -67
- package/packages/omo-codex/plugin/shared/package.json +3 -4
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
- package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +13 -1
- package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +37 -0
- package/packages/omo-codex/plugin/skills/browser/SKILL.md +109 -0
- package/packages/omo-codex/plugin/skills/browser/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/browser/references/commands.md +105 -0
- package/packages/omo-codex/plugin/skills/browser/references/install.md +97 -0
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +62 -0
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +52 -0
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +61 -0
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +62 -0
- package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +61 -0
- package/packages/omo-codex/plugin/skills/browser/references/remote.md +25 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +57 -0
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +50 -0
- package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +5 -3
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +26 -5
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +8 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +13 -4
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +146 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +30 -6
- package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +19 -5
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +20 -18
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +7 -5
- package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +5 -5
- package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -18
- package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +43 -15
- package/packages/omo-codex/plugin/skills/programming/references/rust/api-design.md +81 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +35 -25
- package/packages/omo-codex/plugin/skills/programming/references/rust/macros.md +63 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +50 -12
- package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +11 -9
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +11 -9
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +116 -424
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +40 -28
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +2 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +34 -111
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +14 -7
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +22 -36
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +102 -107
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +38 -39
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +31 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +34 -11
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +9 -10
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +17 -13
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -153
- package/packages/omo-codex/plugin/skills/ulw-research/AGENTS.md +63 -0
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +52 -33
- package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +187 -0
- package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +66 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/cli-support.mjs +102 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/contracts.mjs +162 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/css-lite.mjs +204 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/design-spec.mjs +161 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/entities.mjs +39 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/entry-guard.mjs +21 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/format-extract-css.mjs +122 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/format-extract.mjs +229 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-figures.mjs +173 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-layout.mjs +146 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-static.mjs +167 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-structure.mjs +118 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-text.mjs +190 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-lite.mjs +239 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/layout-probe.mjs +83 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome.mjs +250 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/repair-tracker.mjs +171 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools-commands.mjs +214 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools.mjs +61 -0
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +10 -7
- package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +77 -0
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +12 -12
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +13 -28
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
- package/packages/omo-codex/plugin/test/bootstrap-default-role.test.mjs +66 -0
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
- package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +100 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
- package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +81 -3
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +57 -26
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +37 -0
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +16238 -4291
- package/packages/{omo-codex/plugin/components/ultrawork/directive.md → prompts-core/prompts/ultrawork/codex.md} +102 -107
- package/packages/shared-skills/package.json +7 -1
- package/packages/shared-skills/skill-source-filter.d.ts +16 -0
- package/packages/shared-skills/skill-source-filter.mjs +44 -0
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/ast-grep/SKILL.md +13 -1
- package/packages/shared-skills/skills/browser/ATTRIBUTION.md +37 -0
- package/packages/shared-skills/skills/browser/SKILL.md +109 -0
- package/packages/shared-skills/skills/browser/references/commands.md +105 -0
- package/packages/shared-skills/skills/browser/references/install.md +97 -0
- package/packages/shared-skills/skills/browser/references/owned-engine/README.md +62 -0
- package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +52 -0
- package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +61 -0
- package/packages/shared-skills/skills/browser/references/owned-engine/network.md +62 -0
- package/packages/shared-skills/skills/browser/references/recipes/1password.md +61 -0
- package/packages/shared-skills/skills/browser/references/remote.md +25 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +57 -0
- package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +50 -0
- package/packages/shared-skills/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +5 -3
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +26 -5
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
- package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +8 -3
- package/packages/shared-skills/skills/frontend/references/design/README.md +13 -4
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +146 -0
- package/packages/shared-skills/skills/frontend/references/design/aside.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +30 -6
- package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +19 -5
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/shared-skills/skills/frontend/references/perfection/README.md +1 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
- package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
- package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
- package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +12 -18
- package/packages/shared-skills/skills/programming/references/rust/README.md +43 -15
- package/packages/shared-skills/skills/programming/references/rust/api-design.md +81 -0
- package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/shared-skills/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/shared-skills/skills/programming/references/rust/libraries.md +35 -25
- package/packages/shared-skills/skills/programming/references/rust/macros.md +63 -0
- package/packages/shared-skills/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/shared-skills/skills/programming/references/rust/type-state.md +50 -12
- package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
- package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/shared-skills/skills/refactor/SKILL.md +5 -5
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +5 -5
- package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +1 -82
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +40 -28
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +2 -1
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +34 -111
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +14 -7
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +22 -36
- package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +27 -25
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +10 -11
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +18 -13
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +5 -6
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/shared-skills/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -153
- package/packages/shared-skills/skills/ulw-research/AGENTS.md +63 -0
- package/packages/shared-skills/skills/ulw-research/SKILL.md +47 -30
- package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +187 -0
- package/packages/shared-skills/skills/ulw-research/references/report-gates.md +66 -0
- package/packages/shared-skills/skills/ulw-research/scripts/cli-support.mjs +102 -0
- package/packages/shared-skills/skills/ulw-research/scripts/cli-support.test.ts +88 -0
- package/packages/shared-skills/skills/ulw-research/scripts/contracts.mjs +162 -0
- package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +177 -0
- package/packages/shared-skills/skills/ulw-research/scripts/css-lite.mjs +204 -0
- package/packages/shared-skills/skills/ulw-research/scripts/css-lite.test.ts +159 -0
- package/packages/shared-skills/skills/ulw-research/scripts/design-spec.mjs +161 -0
- package/packages/shared-skills/skills/ulw-research/scripts/design-spec.test.ts +162 -0
- package/packages/shared-skills/skills/ulw-research/scripts/entities.mjs +39 -0
- package/packages/shared-skills/skills/ulw-research/scripts/entry-guard.mjs +21 -0
- package/packages/shared-skills/skills/ulw-research/scripts/format-extract-css.mjs +122 -0
- package/packages/shared-skills/skills/ulw-research/scripts/format-extract.mjs +229 -0
- package/packages/shared-skills/skills/ulw-research/scripts/format-extract.test.ts +243 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-figures.mjs +173 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-layout.mjs +146 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-layout.test.ts +236 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +167 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-static.test.ts +265 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-structure.mjs +118 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-text.mjs +190 -0
- package/packages/shared-skills/skills/ulw-research/scripts/glossary-vocabulary.test.ts +43 -0
- package/packages/shared-skills/skills/ulw-research/scripts/html-lite.mjs +239 -0
- package/packages/shared-skills/skills/ulw-research/scripts/html-lite.test.ts +191 -0
- package/packages/shared-skills/skills/ulw-research/scripts/layout-probe.mjs +83 -0
- package/packages/shared-skills/skills/ulw-research/scripts/layout-probe.test.ts +89 -0
- package/packages/shared-skills/skills/ulw-research/scripts/outcome.mjs +250 -0
- package/packages/shared-skills/skills/ulw-research/scripts/outcome.test.ts +281 -0
- package/packages/shared-skills/skills/ulw-research/scripts/repair-tracker.mjs +171 -0
- package/packages/shared-skills/skills/ulw-research/scripts/repair-tracker.test.ts +246 -0
- package/packages/shared-skills/skills/ulw-research/scripts/report-tools-commands.mjs +214 -0
- package/packages/shared-skills/skills/ulw-research/scripts/report-tools.mjs +61 -0
- package/packages/shared-skills/skills/ulw-research/scripts/report-tools.test.ts +213 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/assets/figure-1.svg +1 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/bad-report.html +44 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/boxes.json +90 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/design-spec.md +29 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/good-report.html +57 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/reference-report.html +86 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/reference.md +23 -0
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
- package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +77 -0
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/dist/cli/install-senpi/index.d.ts +0 -1
- package/dist/cli/senpi-platform-flag.d.ts +0 -4
- package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12244
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9842
- package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
- package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
- package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
- package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
- package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +0 -484
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +0 -194
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +0 -45
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
- package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +0 -194
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
- package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -0,0 +1,1395 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
const ROLE_MAP = {
|
|
3
|
+
a: "link",
|
|
4
|
+
button: "button",
|
|
5
|
+
iframe: "iframe",
|
|
6
|
+
select: "combobox",
|
|
7
|
+
textarea: "textbox",
|
|
8
|
+
h1: "heading",
|
|
9
|
+
h2: "heading",
|
|
10
|
+
h3: "heading",
|
|
11
|
+
h4: "heading",
|
|
12
|
+
h5: "heading",
|
|
13
|
+
h6: "heading",
|
|
14
|
+
canvas: "canvas",
|
|
15
|
+
svg: "image",
|
|
16
|
+
img: "image",
|
|
17
|
+
nav: "navigation",
|
|
18
|
+
main: "main",
|
|
19
|
+
header: "banner",
|
|
20
|
+
footer: "contentinfo",
|
|
21
|
+
section: "region",
|
|
22
|
+
article: "article",
|
|
23
|
+
aside: "complementary",
|
|
24
|
+
form: "form",
|
|
25
|
+
table: "table",
|
|
26
|
+
ul: "list",
|
|
27
|
+
ol: "list",
|
|
28
|
+
li: "listitem",
|
|
29
|
+
p: "paragraph",
|
|
30
|
+
label: "label"
|
|
31
|
+
};
|
|
32
|
+
const VALID_ARIA_ROLES = /* @__PURE__ */ new Set([
|
|
33
|
+
"alert",
|
|
34
|
+
"alertdialog",
|
|
35
|
+
"application",
|
|
36
|
+
"article",
|
|
37
|
+
"banner",
|
|
38
|
+
"blockquote",
|
|
39
|
+
"button",
|
|
40
|
+
"caption",
|
|
41
|
+
"cell",
|
|
42
|
+
"checkbox",
|
|
43
|
+
"code",
|
|
44
|
+
"columnheader",
|
|
45
|
+
"combobox",
|
|
46
|
+
"complementary",
|
|
47
|
+
"contentinfo",
|
|
48
|
+
"definition",
|
|
49
|
+
"deletion",
|
|
50
|
+
"dialog",
|
|
51
|
+
"directory",
|
|
52
|
+
"document",
|
|
53
|
+
"emphasis",
|
|
54
|
+
"feed",
|
|
55
|
+
"figure",
|
|
56
|
+
"form",
|
|
57
|
+
"generic",
|
|
58
|
+
"grid",
|
|
59
|
+
"gridcell",
|
|
60
|
+
"group",
|
|
61
|
+
"heading",
|
|
62
|
+
"img",
|
|
63
|
+
"insertion",
|
|
64
|
+
"link",
|
|
65
|
+
"list",
|
|
66
|
+
"listbox",
|
|
67
|
+
"listitem",
|
|
68
|
+
"log",
|
|
69
|
+
"main",
|
|
70
|
+
"mark",
|
|
71
|
+
"marquee",
|
|
72
|
+
"math",
|
|
73
|
+
"meter",
|
|
74
|
+
"menu",
|
|
75
|
+
"menubar",
|
|
76
|
+
"menuitem",
|
|
77
|
+
"menuitemcheckbox",
|
|
78
|
+
"menuitemradio",
|
|
79
|
+
"navigation",
|
|
80
|
+
"none",
|
|
81
|
+
"note",
|
|
82
|
+
"option",
|
|
83
|
+
"paragraph",
|
|
84
|
+
"presentation",
|
|
85
|
+
"progressbar",
|
|
86
|
+
"radio",
|
|
87
|
+
"radiogroup",
|
|
88
|
+
"region",
|
|
89
|
+
"row",
|
|
90
|
+
"rowgroup",
|
|
91
|
+
"rowheader",
|
|
92
|
+
"scrollbar",
|
|
93
|
+
"search",
|
|
94
|
+
"searchbox",
|
|
95
|
+
"separator",
|
|
96
|
+
"slider",
|
|
97
|
+
"spinbutton",
|
|
98
|
+
"status",
|
|
99
|
+
"strong",
|
|
100
|
+
"subscript",
|
|
101
|
+
"superscript",
|
|
102
|
+
"switch",
|
|
103
|
+
"tab",
|
|
104
|
+
"table",
|
|
105
|
+
"tablist",
|
|
106
|
+
"tabpanel",
|
|
107
|
+
"term",
|
|
108
|
+
"textbox",
|
|
109
|
+
"time",
|
|
110
|
+
"timer",
|
|
111
|
+
"toolbar",
|
|
112
|
+
"tooltip",
|
|
113
|
+
"tree",
|
|
114
|
+
"treegrid",
|
|
115
|
+
"treeitem"
|
|
116
|
+
]);
|
|
117
|
+
function getExplicitAriaRole(element) {
|
|
118
|
+
return (element.getAttribute("role") || "").split(" ").map((role) => role.trim().toLowerCase()).filter(Boolean).find((role) => VALID_ARIA_ROLES.has(role)) || null;
|
|
119
|
+
}
|
|
120
|
+
function isContentEditableElement(element) {
|
|
121
|
+
if (!(element instanceof HTMLElement)) return false;
|
|
122
|
+
return element.contentEditable === "true" || element.contentEditable === "plaintext-only";
|
|
123
|
+
}
|
|
124
|
+
function getImplicitRole(element) {
|
|
125
|
+
const tag = element.tagName.toLowerCase();
|
|
126
|
+
const type = element.getAttribute("type");
|
|
127
|
+
if (isContentEditableElement(element)) return "textbox";
|
|
128
|
+
if (tag === "input") {
|
|
129
|
+
if (type === "submit" || type === "button") return "button";
|
|
130
|
+
if (type === "checkbox") return "checkbox";
|
|
131
|
+
if (type === "radio") return "radio";
|
|
132
|
+
if (type === "file") return "button";
|
|
133
|
+
return "textbox";
|
|
134
|
+
}
|
|
135
|
+
return ROLE_MAP[tag] || "generic";
|
|
136
|
+
}
|
|
137
|
+
function getRole(element) {
|
|
138
|
+
const explicitRole = getExplicitAriaRole(element);
|
|
139
|
+
if (!explicitRole) return getImplicitRole(element);
|
|
140
|
+
if (explicitRole === "presentation" || explicitRole === "none") return getImplicitRole(element);
|
|
141
|
+
return explicitRole;
|
|
142
|
+
}
|
|
143
|
+
const INTERACTIVE_TAGS = /* @__PURE__ */ new Set([
|
|
144
|
+
"a",
|
|
145
|
+
"button",
|
|
146
|
+
"input",
|
|
147
|
+
"select",
|
|
148
|
+
"textarea",
|
|
149
|
+
"details",
|
|
150
|
+
"summary"
|
|
151
|
+
]);
|
|
152
|
+
const INTERACTIVE_REF_ROLES = /* @__PURE__ */ new Set([
|
|
153
|
+
"button",
|
|
154
|
+
"link",
|
|
155
|
+
"textbox",
|
|
156
|
+
"checkbox",
|
|
157
|
+
"radio",
|
|
158
|
+
"combobox",
|
|
159
|
+
"listbox",
|
|
160
|
+
"menuitem",
|
|
161
|
+
"menuitemcheckbox",
|
|
162
|
+
"menuitemradio",
|
|
163
|
+
"option",
|
|
164
|
+
"searchbox",
|
|
165
|
+
"slider",
|
|
166
|
+
"spinbutton",
|
|
167
|
+
"switch",
|
|
168
|
+
"tab",
|
|
169
|
+
"treeitem"
|
|
170
|
+
]);
|
|
171
|
+
const CONTENT_REF_ROLES = /* @__PURE__ */ new Set([
|
|
172
|
+
"cell",
|
|
173
|
+
"gridcell",
|
|
174
|
+
"columnheader",
|
|
175
|
+
"rowheader",
|
|
176
|
+
"listitem",
|
|
177
|
+
"article",
|
|
178
|
+
"region",
|
|
179
|
+
"main",
|
|
180
|
+
"navigation"
|
|
181
|
+
]);
|
|
182
|
+
const ARIA_LEVEL_ROLES = /* @__PURE__ */ new Set([
|
|
183
|
+
"heading",
|
|
184
|
+
"listitem",
|
|
185
|
+
"row",
|
|
186
|
+
"treeitem"
|
|
187
|
+
]);
|
|
188
|
+
const ARIA_SELECTED_ROLES = /* @__PURE__ */ new Set([
|
|
189
|
+
"gridcell",
|
|
190
|
+
"option",
|
|
191
|
+
"row",
|
|
192
|
+
"tab",
|
|
193
|
+
"rowheader",
|
|
194
|
+
"columnheader",
|
|
195
|
+
"treeitem"
|
|
196
|
+
]);
|
|
197
|
+
const ARIA_CHECKED_ROLES = /* @__PURE__ */ new Set([
|
|
198
|
+
"checkbox",
|
|
199
|
+
"radio",
|
|
200
|
+
"menuitemcheckbox",
|
|
201
|
+
"menuitemradio",
|
|
202
|
+
"switch"
|
|
203
|
+
]);
|
|
204
|
+
/** Roles where `aria-readonly` is meaningful for editability checks. */
|
|
205
|
+
const ARIA_READONLY_ROLES = /* @__PURE__ */ new Set([
|
|
206
|
+
"checkbox",
|
|
207
|
+
"combobox",
|
|
208
|
+
"grid",
|
|
209
|
+
"gridcell",
|
|
210
|
+
"listbox",
|
|
211
|
+
"radiogroup",
|
|
212
|
+
"slider",
|
|
213
|
+
"spinbutton",
|
|
214
|
+
"textbox",
|
|
215
|
+
"columnheader",
|
|
216
|
+
"rowheader",
|
|
217
|
+
"searchbox",
|
|
218
|
+
"switch",
|
|
219
|
+
"treegrid"
|
|
220
|
+
]);
|
|
221
|
+
const ARIA_DISABLED_ROLES = /* @__PURE__ */ new Set([
|
|
222
|
+
"application",
|
|
223
|
+
"button",
|
|
224
|
+
"composite",
|
|
225
|
+
"gridcell",
|
|
226
|
+
"group",
|
|
227
|
+
"input",
|
|
228
|
+
"link",
|
|
229
|
+
"menuitem",
|
|
230
|
+
"scrollbar",
|
|
231
|
+
"separator",
|
|
232
|
+
"tab",
|
|
233
|
+
"checkbox",
|
|
234
|
+
"columnheader",
|
|
235
|
+
"combobox",
|
|
236
|
+
"grid",
|
|
237
|
+
"listbox",
|
|
238
|
+
"menu",
|
|
239
|
+
"menubar",
|
|
240
|
+
"menuitemcheckbox",
|
|
241
|
+
"menuitemradio",
|
|
242
|
+
"option",
|
|
243
|
+
"radio",
|
|
244
|
+
"radiogroup",
|
|
245
|
+
"row",
|
|
246
|
+
"rowheader",
|
|
247
|
+
"searchbox",
|
|
248
|
+
"select",
|
|
249
|
+
"slider",
|
|
250
|
+
"spinbutton",
|
|
251
|
+
"switch",
|
|
252
|
+
"tablist",
|
|
253
|
+
"textbox",
|
|
254
|
+
"toolbar",
|
|
255
|
+
"tree",
|
|
256
|
+
"treegrid",
|
|
257
|
+
"treeitem"
|
|
258
|
+
]);
|
|
259
|
+
const NATIVE_HEADING_LEVELS = {
|
|
260
|
+
h1: 1,
|
|
261
|
+
h2: 2,
|
|
262
|
+
h3: 3,
|
|
263
|
+
h4: 4,
|
|
264
|
+
h5: 5,
|
|
265
|
+
h6: 6
|
|
266
|
+
};
|
|
267
|
+
/** */
|
|
268
|
+
function getAriaLevel(element, role) {
|
|
269
|
+
if (!ARIA_LEVEL_ROLES.has(role)) return void 0;
|
|
270
|
+
const tag = element.tagName.toLowerCase();
|
|
271
|
+
if (role === "heading") {
|
|
272
|
+
const nativeLevel = NATIVE_HEADING_LEVELS[tag];
|
|
273
|
+
if (nativeLevel) return nativeLevel;
|
|
274
|
+
}
|
|
275
|
+
const ariaLevel = Number(element.getAttribute("aria-level"));
|
|
276
|
+
if (Number.isInteger(ariaLevel) && ariaLevel >= 1) return ariaLevel;
|
|
277
|
+
}
|
|
278
|
+
const LANDMARK_TAGS = /* @__PURE__ */ new Set([
|
|
279
|
+
"h1",
|
|
280
|
+
"h2",
|
|
281
|
+
"h3",
|
|
282
|
+
"h4",
|
|
283
|
+
"h5",
|
|
284
|
+
"h6",
|
|
285
|
+
"nav",
|
|
286
|
+
"main",
|
|
287
|
+
"header",
|
|
288
|
+
"footer",
|
|
289
|
+
"section",
|
|
290
|
+
"article",
|
|
291
|
+
"aside"
|
|
292
|
+
]);
|
|
293
|
+
const SKIP_TAGS = /* @__PURE__ */ new Set([
|
|
294
|
+
"script",
|
|
295
|
+
"style",
|
|
296
|
+
"meta",
|
|
297
|
+
"link",
|
|
298
|
+
"title",
|
|
299
|
+
"noscript"
|
|
300
|
+
]);
|
|
301
|
+
function getAriaBoolean(attr) {
|
|
302
|
+
if (attr === null) return void 0;
|
|
303
|
+
return attr.toLowerCase() === "true";
|
|
304
|
+
}
|
|
305
|
+
/** Escape double quotes and newlines in text. */
|
|
306
|
+
const escapeSnapshotText = (text) => text.replace(/"/g, "\\\"").replace(/\n/g, "\\n");
|
|
307
|
+
/** Replace consecutive whitespace characters with a single space and trim the result. */
|
|
308
|
+
const normalizeWhitespace = (text) => text.trim();
|
|
309
|
+
function shouldInsertSpaceBetween(left, right) {
|
|
310
|
+
const trimmedLeft = left.trimEnd();
|
|
311
|
+
const trimmedRight = right.trimStart();
|
|
312
|
+
if (!trimmedLeft || !trimmedRight) return false;
|
|
313
|
+
return /[\p{L}\p{N}]$/u.test(trimmedLeft) && /^[\p{L}\p{N}]/u.test(trimmedRight);
|
|
314
|
+
}
|
|
315
|
+
/** Merge adjacent strings with whitespace normalization and boundary-safe spacing. */
|
|
316
|
+
function mergeStringBuffer(buffer) {
|
|
317
|
+
let merged = "";
|
|
318
|
+
for (const part of buffer) {
|
|
319
|
+
if (!part) continue;
|
|
320
|
+
if (!merged) {
|
|
321
|
+
merged = part;
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (shouldInsertSpaceBetween(merged, part)) merged += " ";
|
|
325
|
+
merged += part;
|
|
326
|
+
}
|
|
327
|
+
return normalizeWhitespace(merged);
|
|
328
|
+
}
|
|
329
|
+
function getCSSContent(element, pseudo) {
|
|
330
|
+
try {
|
|
331
|
+
const style = window.getComputedStyle(element, pseudo);
|
|
332
|
+
if (!style) return "";
|
|
333
|
+
if (style.display === "none" || style.visibility === "hidden") return "";
|
|
334
|
+
const content = (style.content || "").trim();
|
|
335
|
+
if (!content || content === "none" || content === "normal") return "";
|
|
336
|
+
const matches = [...content.matchAll(/"((?:\\.|[^"\\])*)"|'((?:\\.|[^'\\])*)'/g)];
|
|
337
|
+
if (!matches.length) return "";
|
|
338
|
+
return matches.map((match) => match[1] ?? match[2] ?? "").map((text) => text.replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, " ").replace(/\\f/g, "\f").replace(/\\(["'\\])/g, "$1")).join("");
|
|
339
|
+
} catch {
|
|
340
|
+
return "";
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
let _cache;
|
|
344
|
+
let _cacheHidden;
|
|
345
|
+
/** Start per-snapshot caching. Call at beginning of generateAccessibilityTree. */
|
|
346
|
+
function beginAccNameCaches() {
|
|
347
|
+
_cache = /* @__PURE__ */ new Map();
|
|
348
|
+
_cacheHidden = /* @__PURE__ */ new Map();
|
|
349
|
+
}
|
|
350
|
+
/** End per-snapshot caching. Call in finally block after generateAccessibilityTree. */
|
|
351
|
+
function endAccNameCaches() {
|
|
352
|
+
_cache = void 0;
|
|
353
|
+
_cacheHidden = void 0;
|
|
354
|
+
}
|
|
355
|
+
const NAME_FROM_CONTENT_ROLES = /* @__PURE__ */ new Set([
|
|
356
|
+
"button",
|
|
357
|
+
"link",
|
|
358
|
+
"heading",
|
|
359
|
+
"cell",
|
|
360
|
+
"columnheader",
|
|
361
|
+
"rowheader",
|
|
362
|
+
"tooltip",
|
|
363
|
+
"tab",
|
|
364
|
+
"menuitem",
|
|
365
|
+
"menuitemcheckbox",
|
|
366
|
+
"menuitemradio",
|
|
367
|
+
"treeitem",
|
|
368
|
+
"option",
|
|
369
|
+
"listitem",
|
|
370
|
+
"row",
|
|
371
|
+
"term"
|
|
372
|
+
]);
|
|
373
|
+
const PROHIBITS_NAMING = /* @__PURE__ */ new Set([
|
|
374
|
+
"caption",
|
|
375
|
+
"code",
|
|
376
|
+
"definition",
|
|
377
|
+
"deletion",
|
|
378
|
+
"emphasis",
|
|
379
|
+
"generic",
|
|
380
|
+
"insertion",
|
|
381
|
+
"mark",
|
|
382
|
+
"paragraph",
|
|
383
|
+
"presentation",
|
|
384
|
+
"strong",
|
|
385
|
+
"subscript",
|
|
386
|
+
"superscript",
|
|
387
|
+
"term",
|
|
388
|
+
"time"
|
|
389
|
+
]);
|
|
390
|
+
function getIdRefs(element, attrValue) {
|
|
391
|
+
if (!attrValue) return [];
|
|
392
|
+
const doc = element.ownerDocument;
|
|
393
|
+
return attrValue.split(/\s+/).filter(Boolean).map((id) => doc.getElementById(id)).filter(Boolean);
|
|
394
|
+
}
|
|
395
|
+
function isHiddenForAria(element) {
|
|
396
|
+
if (element.getAttribute("aria-hidden") === "true") return true;
|
|
397
|
+
try {
|
|
398
|
+
const style = window.getComputedStyle(element);
|
|
399
|
+
if (style.display === "none" || style.visibility === "hidden") return true;
|
|
400
|
+
} catch {}
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
function getLabels(element) {
|
|
404
|
+
const labels = [];
|
|
405
|
+
const id = element.getAttribute("id");
|
|
406
|
+
if (id) {
|
|
407
|
+
const forLabels = element.ownerDocument.querySelectorAll(`label[for="${id.replace(/"/g, "\\\"")}"]`);
|
|
408
|
+
labels.push(...Array.from(forLabels));
|
|
409
|
+
}
|
|
410
|
+
let parent = element.parentElement;
|
|
411
|
+
while (parent) {
|
|
412
|
+
if (parent.tagName.toLowerCase() === "label") {
|
|
413
|
+
labels.push(parent);
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
parent = parent.parentElement;
|
|
417
|
+
}
|
|
418
|
+
return labels;
|
|
419
|
+
}
|
|
420
|
+
const MAX_ACCNAME_DEPTH = 10;
|
|
421
|
+
function getAccNameInternal(element, opts) {
|
|
422
|
+
if (opts.depth >= MAX_ACCNAME_DEPTH) return "";
|
|
423
|
+
if (opts.visitedElements.has(element)) return "";
|
|
424
|
+
opts.visitedElements.add(element);
|
|
425
|
+
if (!opts.includeHidden && !opts.inLabelledBy && !opts.inLabel) {
|
|
426
|
+
if (isHiddenForAria(element)) return "";
|
|
427
|
+
}
|
|
428
|
+
if (!opts.inLabelledBy) {
|
|
429
|
+
const refs = getIdRefs(element, element.getAttribute("aria-labelledby"));
|
|
430
|
+
if (refs.length) {
|
|
431
|
+
const name = refs.map((ref) => getAccNameInternal(ref, {
|
|
432
|
+
...opts,
|
|
433
|
+
depth: opts.depth + 1,
|
|
434
|
+
visitedElements: new Set(opts.visitedElements),
|
|
435
|
+
inLabelledBy: true
|
|
436
|
+
})).join(" ").replace(/\s+/g, " ").trim();
|
|
437
|
+
if (name) return name;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const ariaLabel = element.getAttribute("aria-label")?.trim();
|
|
441
|
+
if (ariaLabel) return ariaLabel;
|
|
442
|
+
const role = getRole(element);
|
|
443
|
+
const tag = element.tagName.toLowerCase();
|
|
444
|
+
if ([
|
|
445
|
+
"input",
|
|
446
|
+
"textarea",
|
|
447
|
+
"select",
|
|
448
|
+
"meter",
|
|
449
|
+
"progress",
|
|
450
|
+
"output"
|
|
451
|
+
].includes(tag) && !opts.inLabel && !opts.inLabelledBy) {
|
|
452
|
+
const labels = getLabels(element);
|
|
453
|
+
if (labels.length) {
|
|
454
|
+
const name = labels.map((lbl) => getAccNameInternal(lbl, {
|
|
455
|
+
...opts,
|
|
456
|
+
depth: opts.depth + 1,
|
|
457
|
+
visitedElements: new Set(opts.visitedElements),
|
|
458
|
+
inLabel: true
|
|
459
|
+
})).join(" ").replace(/\s+/g, " ").trim();
|
|
460
|
+
if (name) return name;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
if (tag === "area" || tag === "img" || tag === "input" && element.getAttribute("type") === "image") {
|
|
464
|
+
const alt = element.getAttribute("alt");
|
|
465
|
+
if (alt !== null) return alt.trim();
|
|
466
|
+
}
|
|
467
|
+
if (tag === "fieldset") {
|
|
468
|
+
const legend = element.querySelector(":scope > legend");
|
|
469
|
+
if (legend) return getAccNameInternal(legend, {
|
|
470
|
+
...opts,
|
|
471
|
+
depth: opts.depth + 1,
|
|
472
|
+
visitedElements: new Set(opts.visitedElements)
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
if (tag === "figure") {
|
|
476
|
+
const figcaption = element.querySelector(":scope > figcaption");
|
|
477
|
+
if (figcaption) return getAccNameInternal(figcaption, {
|
|
478
|
+
...opts,
|
|
479
|
+
depth: opts.depth + 1,
|
|
480
|
+
visitedElements: new Set(opts.visitedElements)
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
if (tag === "table") {
|
|
484
|
+
const caption = element.querySelector(":scope > caption");
|
|
485
|
+
if (caption) return getAccNameInternal(caption, {
|
|
486
|
+
...opts,
|
|
487
|
+
depth: opts.depth + 1,
|
|
488
|
+
visitedElements: new Set(opts.visitedElements)
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
if (tag === "select") {
|
|
492
|
+
const sel = element;
|
|
493
|
+
const selected = sel.selectedIndex >= 0 ? sel.options[sel.selectedIndex] : null;
|
|
494
|
+
if (selected) return selected.textContent?.trim() || "";
|
|
495
|
+
}
|
|
496
|
+
if (NAME_FROM_CONTENT_ROLES.has(role) || opts.inLabelledBy || opts.inLabel) {
|
|
497
|
+
const parts = [];
|
|
498
|
+
const before = getCSSContent(element, "::before");
|
|
499
|
+
if (before) parts.push(before);
|
|
500
|
+
for (const child of element.childNodes) if (child.nodeType === Node.TEXT_NODE) {
|
|
501
|
+
const text = child.textContent || "";
|
|
502
|
+
if (text) parts.push(text);
|
|
503
|
+
} else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
504
|
+
const childText = getAccNameInternal(child, {
|
|
505
|
+
...opts,
|
|
506
|
+
depth: opts.depth + 1,
|
|
507
|
+
visitedElements: new Set(opts.visitedElements)
|
|
508
|
+
});
|
|
509
|
+
if (childText) parts.push(childText);
|
|
510
|
+
}
|
|
511
|
+
const after = getCSSContent(element, "::after");
|
|
512
|
+
if (after) parts.push(after);
|
|
513
|
+
const text = parts.join("").replace(/\s+/g, " ").trim();
|
|
514
|
+
if (text) return text;
|
|
515
|
+
}
|
|
516
|
+
if (tag === "input") {
|
|
517
|
+
const type = (element.getAttribute("type") || "text").toLowerCase();
|
|
518
|
+
if (type === "submit" || type === "button") {
|
|
519
|
+
const val = element.value;
|
|
520
|
+
if (val?.trim()) return val.trim();
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const placeholder = element.getAttribute("placeholder")?.trim();
|
|
524
|
+
if (placeholder) return placeholder;
|
|
525
|
+
const title = element.getAttribute("title")?.trim();
|
|
526
|
+
if (title) return title;
|
|
527
|
+
return "";
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Compute the W3C-compliant accessible name for an element.
|
|
531
|
+
* Cached within a snapshot call when used with beginAccNameCaches/endAccNameCaches.
|
|
532
|
+
*/
|
|
533
|
+
function getAccessibleName(element, includeHidden = false) {
|
|
534
|
+
const cache = includeHidden ? _cacheHidden : _cache;
|
|
535
|
+
if (cache) {
|
|
536
|
+
const cached = cache.get(element);
|
|
537
|
+
if (cached !== void 0) return cached;
|
|
538
|
+
}
|
|
539
|
+
const role = getRole(element);
|
|
540
|
+
let name = "";
|
|
541
|
+
if (!PROHIBITS_NAMING.has(role)) name = getAccNameInternal(element, {
|
|
542
|
+
includeHidden,
|
|
543
|
+
visitedElements: /* @__PURE__ */ new Set(),
|
|
544
|
+
inLabelledBy: false,
|
|
545
|
+
inLabel: false,
|
|
546
|
+
depth: 0
|
|
547
|
+
});
|
|
548
|
+
name = name.replace(/\s+/g, " ").trim().substring(0, 300);
|
|
549
|
+
if (cache) cache.set(element, name);
|
|
550
|
+
return name;
|
|
551
|
+
}
|
|
552
|
+
let _registry = null;
|
|
553
|
+
let _refs = null;
|
|
554
|
+
let _signatureAssigned = null;
|
|
555
|
+
let _refCounter = 0;
|
|
556
|
+
let _visibilityCache = null;
|
|
557
|
+
const OMOWRIGHT_REF_SYMBOL = Symbol("omowright_ref");
|
|
558
|
+
const USER_PASSWORD_REDACTED = "[redacted]";
|
|
559
|
+
function getRefPrefix(ref) {
|
|
560
|
+
return ref.match(/^(f\d+)?e\d+$/)?.[1] ?? "";
|
|
561
|
+
}
|
|
562
|
+
const ROLE_SELECTOR_RE = /^\[role=["'](\w+)["']\]$/;
|
|
563
|
+
function querySelectorWithImplicitRole(selector) {
|
|
564
|
+
const match = selector.match(ROLE_SELECTOR_RE);
|
|
565
|
+
if (!match) return null;
|
|
566
|
+
const targetRole = match[1];
|
|
567
|
+
for (const el of Array.from(document.querySelectorAll("*"))) if (getRole(el) === targetRole) return el;
|
|
568
|
+
return null;
|
|
569
|
+
}
|
|
570
|
+
function getAriaDisabled(element, role) {
|
|
571
|
+
if (!ARIA_DISABLED_ROLES.has(role)) return false;
|
|
572
|
+
if ([
|
|
573
|
+
"button",
|
|
574
|
+
"input",
|
|
575
|
+
"select",
|
|
576
|
+
"textarea",
|
|
577
|
+
"option",
|
|
578
|
+
"optgroup"
|
|
579
|
+
].includes(element.tagName.toLowerCase()) && element.matches(":disabled")) return true;
|
|
580
|
+
for (let current = element; current; current = getParentElementAcrossShadowBoundary(current)) if (getAriaBoolean(current.getAttribute("aria-disabled")) === true) return true;
|
|
581
|
+
return false;
|
|
582
|
+
}
|
|
583
|
+
function getAriaChecked(element, role) {
|
|
584
|
+
if (element instanceof HTMLInputElement && (element.type === "checkbox" || element.type === "radio")) return element.checked;
|
|
585
|
+
if (!ARIA_CHECKED_ROLES.has(role)) return false;
|
|
586
|
+
return getAriaBoolean(element.getAttribute("aria-checked")) === true;
|
|
587
|
+
}
|
|
588
|
+
function getAriaSelected(element, role) {
|
|
589
|
+
if (element.tagName.toLowerCase() === "option") return element.selected;
|
|
590
|
+
if (!ARIA_SELECTED_ROLES.has(role)) return false;
|
|
591
|
+
return getAriaBoolean(element.getAttribute("aria-selected")) === true;
|
|
592
|
+
}
|
|
593
|
+
function getTextboxValue(element) {
|
|
594
|
+
if (isContentEditableElement(element)) return element.innerText ?? element.textContent ?? "";
|
|
595
|
+
if (!(element instanceof HTMLInputElement) && !(element instanceof HTMLTextAreaElement)) return null;
|
|
596
|
+
if (element instanceof HTMLInputElement && [
|
|
597
|
+
"checkbox",
|
|
598
|
+
"radio",
|
|
599
|
+
"file"
|
|
600
|
+
].includes(element.type)) return null;
|
|
601
|
+
if (element instanceof HTMLInputElement && element.type === "password") return element.value ? USER_PASSWORD_REDACTED : "";
|
|
602
|
+
return element.value;
|
|
603
|
+
}
|
|
604
|
+
function getAriaOwnedElements(element) {
|
|
605
|
+
const owns = element.getAttribute("aria-owns");
|
|
606
|
+
if (!owns) return [];
|
|
607
|
+
const ownedElements = [];
|
|
608
|
+
const seen = /* @__PURE__ */ new Set();
|
|
609
|
+
for (const id of owns.split(/\s+/)) {
|
|
610
|
+
if (!id) continue;
|
|
611
|
+
const owned = element.ownerDocument.getElementById(id);
|
|
612
|
+
if (!owned || owned === element || seen.has(owned)) continue;
|
|
613
|
+
seen.add(owned);
|
|
614
|
+
ownedElements.push(owned);
|
|
615
|
+
}
|
|
616
|
+
return ownedElements;
|
|
617
|
+
}
|
|
618
|
+
function normalizeName(name) {
|
|
619
|
+
return name.replace(/\s+/g, " ").trim().substring(0, 100);
|
|
620
|
+
}
|
|
621
|
+
function getLayoutSize(element) {
|
|
622
|
+
const layout = element;
|
|
623
|
+
return {
|
|
624
|
+
width: layout.offsetWidth ?? -1,
|
|
625
|
+
height: layout.offsetHeight ?? -1
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
function getContainingShadowHost(element) {
|
|
629
|
+
const root = typeof element.getRootNode === "function" ? element.getRootNode() : null;
|
|
630
|
+
if (typeof ShadowRoot !== "undefined" && root instanceof ShadowRoot) return root.host;
|
|
631
|
+
return null;
|
|
632
|
+
}
|
|
633
|
+
function getParentElementAcrossShadowBoundary(element) {
|
|
634
|
+
return element.parentElement ?? getContainingShadowHost(element);
|
|
635
|
+
}
|
|
636
|
+
function getLightAndShadowChildNodes(element) {
|
|
637
|
+
const nodes = Array.from(element.childNodes);
|
|
638
|
+
if (element.shadowRoot) nodes.push(...Array.from(element.shadowRoot.childNodes));
|
|
639
|
+
return nodes;
|
|
640
|
+
}
|
|
641
|
+
function hasClippedZeroSizeBox(element, style) {
|
|
642
|
+
const overflowClips = style.overflow === "hidden" || style.overflow === "clip" || style.overflowX === "hidden" || style.overflowX === "clip" || style.overflowY === "hidden" || style.overflowY === "clip";
|
|
643
|
+
const { width, height } = getLayoutSize(element);
|
|
644
|
+
return overflowClips && (width === 0 || height === 0);
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Checks whether an element is rendered and visible to the user.
|
|
648
|
+
* Merges the ancestor walk for display:contents detection with the main
|
|
649
|
+
* visibility loop to avoid a redundant second traversal.
|
|
650
|
+
*/
|
|
651
|
+
function isVisible(element) {
|
|
652
|
+
if (_visibilityCache) {
|
|
653
|
+
const cached = _visibilityCache.get(element);
|
|
654
|
+
if (cached !== void 0) return cached;
|
|
655
|
+
}
|
|
656
|
+
const result = isVisibleUncached(element);
|
|
657
|
+
if (_visibilityCache) _visibilityCache.set(element, result);
|
|
658
|
+
return result;
|
|
659
|
+
}
|
|
660
|
+
function isVisibleUncached(element) {
|
|
661
|
+
if (element.getAttribute("aria-hidden") === "true") return false;
|
|
662
|
+
const targetVisibility = window.getComputedStyle(element).visibility;
|
|
663
|
+
let hasContentsAncestor = false;
|
|
664
|
+
for (let current = element; current && current !== document.documentElement; current = getParentElementAcrossShadowBoundary(current)) {
|
|
665
|
+
const style = window.getComputedStyle(current);
|
|
666
|
+
if (style.display === "contents") {
|
|
667
|
+
hasContentsAncestor = true;
|
|
668
|
+
continue;
|
|
669
|
+
}
|
|
670
|
+
if (style.display === "none") return false;
|
|
671
|
+
if (hasClippedZeroSizeBox(current, style)) return false;
|
|
672
|
+
const { width, height } = getLayoutSize(current);
|
|
673
|
+
if (current.tagName === "IFRAME" && (width === 0 || height === 0)) return false;
|
|
674
|
+
if (style.visibility === "hidden" && targetVisibility !== "visible") return false;
|
|
675
|
+
if (Number.parseFloat(style.opacity) === 0) return false;
|
|
676
|
+
}
|
|
677
|
+
if (typeof element.checkVisibility === "function") {
|
|
678
|
+
if (!element.checkVisibility({
|
|
679
|
+
checkOpacity: true,
|
|
680
|
+
checkVisibilityCSS: true
|
|
681
|
+
}) && !hasContentsAncestor) return false;
|
|
682
|
+
}
|
|
683
|
+
if (element instanceof HTMLElement) {
|
|
684
|
+
const rect = element.getBoundingClientRect();
|
|
685
|
+
if (rect.width > 0 && rect.height > 0 && (rect.right <= 0 || rect.bottom <= 0)) {
|
|
686
|
+
const style = window.getComputedStyle(element);
|
|
687
|
+
if (style.overflowX !== "visible" && style.overflowY !== "visible") return false;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
return true;
|
|
691
|
+
}
|
|
692
|
+
function getInteractivitySignals(element) {
|
|
693
|
+
const tag = element.tagName.toLowerCase();
|
|
694
|
+
const role = getExplicitAriaRole(element);
|
|
695
|
+
const tabIndex = element.getAttribute("tabindex");
|
|
696
|
+
const hasTabIndex = tabIndex !== null && tabIndex !== "-1";
|
|
697
|
+
const hasOnClick = element.hasAttribute("onclick");
|
|
698
|
+
const hasCursorPointer = window.getComputedStyle(element).cursor === "pointer";
|
|
699
|
+
const isInteractiveTag = INTERACTIVE_TAGS.has(tag);
|
|
700
|
+
const isRoleInteractive = role === "button" || role === "link";
|
|
701
|
+
const isContentEditable = element.getAttribute("contenteditable") === "true";
|
|
702
|
+
let hasPointerInteraction = hasCursorPointer;
|
|
703
|
+
if (hasCursorPointer && !hasOnClick && !hasTabIndex) {
|
|
704
|
+
const parent = element.parentElement;
|
|
705
|
+
if (parent && window.getComputedStyle(parent).cursor === "pointer") hasPointerInteraction = false;
|
|
706
|
+
}
|
|
707
|
+
const hints = [];
|
|
708
|
+
if (hasPointerInteraction) hints.push("cursor:pointer");
|
|
709
|
+
if (hasOnClick) hints.push("onclick");
|
|
710
|
+
if (hasTabIndex) hints.push("tabindex");
|
|
711
|
+
return {
|
|
712
|
+
interactive: isInteractiveTag || hasOnClick || hasTabIndex || isRoleInteractive || isContentEditable || hasPointerInteraction,
|
|
713
|
+
isInteractiveTag,
|
|
714
|
+
hints
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
function isInteractive(element) {
|
|
718
|
+
return getInteractivitySignals(element).interactive;
|
|
719
|
+
}
|
|
720
|
+
const SCROLLABLE_OVERFLOW_VALUES = /* @__PURE__ */ new Set([
|
|
721
|
+
"auto",
|
|
722
|
+
"scroll",
|
|
723
|
+
"overlay"
|
|
724
|
+
]);
|
|
725
|
+
function isScrollable(element) {
|
|
726
|
+
const tag = element.tagName.toLowerCase();
|
|
727
|
+
if (tag === "html" || tag === "body") return false;
|
|
728
|
+
const style = window.getComputedStyle(element);
|
|
729
|
+
if (!SCROLLABLE_OVERFLOW_VALUES.has(style.overflowX) && !SCROLLABLE_OVERFLOW_VALUES.has(style.overflowY)) return false;
|
|
730
|
+
return element.scrollHeight > element.clientHeight + 1 || element.scrollWidth > element.clientWidth + 1;
|
|
731
|
+
}
|
|
732
|
+
function isLandmark(element) {
|
|
733
|
+
const tag = element.tagName.toLowerCase();
|
|
734
|
+
const explicitRole = getExplicitAriaRole(element);
|
|
735
|
+
return LANDMARK_TAGS.has(tag) || !!explicitRole && explicitRole !== "presentation" && explicitRole !== "none";
|
|
736
|
+
}
|
|
737
|
+
function shouldTraverse(element, options) {
|
|
738
|
+
const tag = element.tagName.toLowerCase();
|
|
739
|
+
if (SKIP_TAGS.has(tag)) return false;
|
|
740
|
+
if (element.getAttribute("aria-hidden") === "true" && element.children.length === 0) return false;
|
|
741
|
+
if (!options.showHidden && !isVisible(element)) {
|
|
742
|
+
if (tag === "input") {
|
|
743
|
+
const type = element.type;
|
|
744
|
+
if (type === "radio" || type === "checkbox") return true;
|
|
745
|
+
}
|
|
746
|
+
return false;
|
|
747
|
+
}
|
|
748
|
+
return true;
|
|
749
|
+
}
|
|
750
|
+
function shouldIncludeNode(element, options) {
|
|
751
|
+
const role = getRole(element);
|
|
752
|
+
if (options.interactive) return role === "canvas" || isInteractive(element) || isScrollable(element) || isLandmark(element);
|
|
753
|
+
if (isInteractive(element)) return true;
|
|
754
|
+
if (isScrollable(element)) return true;
|
|
755
|
+
if (isLandmark(element)) return true;
|
|
756
|
+
if (getAccessibleName(element).length > 0) return true;
|
|
757
|
+
return role !== "generic" && role !== "image";
|
|
758
|
+
}
|
|
759
|
+
function getOrCreateRefId(element, role, name, refPrefix = "") {
|
|
760
|
+
const writeRefMeta = (ref) => {
|
|
761
|
+
const metaRole = getRole(element);
|
|
762
|
+
const metaName = getAccessibleName(element).substring(0, 100);
|
|
763
|
+
const signature = `${metaRole}::${metaName}`;
|
|
764
|
+
const nth = _signatureAssigned.get(signature) ?? 0;
|
|
765
|
+
_signatureAssigned.set(signature, nth + 1);
|
|
766
|
+
_refs[ref] = {
|
|
767
|
+
role: metaRole,
|
|
768
|
+
name: metaName,
|
|
769
|
+
tagName: element.tagName,
|
|
770
|
+
inputType: element.type || void 0,
|
|
771
|
+
ariaLabel: element.getAttribute("aria-label") || void 0,
|
|
772
|
+
placeholder: element.getAttribute("placeholder") || void 0,
|
|
773
|
+
nthAmongSameSignature: nth
|
|
774
|
+
};
|
|
775
|
+
};
|
|
776
|
+
const cached = element[OMOWRIGHT_REF_SYMBOL];
|
|
777
|
+
if (cached && cached.role === role && cached.name === name && getRefPrefix(cached.ref) === refPrefix) {
|
|
778
|
+
_registry.set(cached.ref, element);
|
|
779
|
+
writeRefMeta(cached.ref);
|
|
780
|
+
return cached.ref;
|
|
781
|
+
}
|
|
782
|
+
const ref = refPrefix.length > 0 ? `${refPrefix}e${++_refCounter}` : "e" + ++_refCounter;
|
|
783
|
+
element[OMOWRIGHT_REF_SYMBOL] = {
|
|
784
|
+
role,
|
|
785
|
+
name,
|
|
786
|
+
ref
|
|
787
|
+
};
|
|
788
|
+
_registry.set(ref, element);
|
|
789
|
+
writeRefMeta(ref);
|
|
790
|
+
return ref;
|
|
791
|
+
}
|
|
792
|
+
function findDuplicateRefIds(rootNode) {
|
|
793
|
+
const refCounts = /* @__PURE__ */ new Map();
|
|
794
|
+
const visit = (node) => {
|
|
795
|
+
if (node.refId) refCounts.set(node.refId, (refCounts.get(node.refId) ?? 0) + 1);
|
|
796
|
+
for (const child of node.children) if (typeof child !== "string") visit(child);
|
|
797
|
+
};
|
|
798
|
+
visit(rootNode);
|
|
799
|
+
return [...refCounts.entries()].filter(([, count]) => count > 1).map(([refId]) => refId).sort();
|
|
800
|
+
}
|
|
801
|
+
function toSnapshotNode(element, refPrefix = "") {
|
|
802
|
+
const role = getRole(element);
|
|
803
|
+
const roleLower = role.toLowerCase();
|
|
804
|
+
const interactivity = getInteractivitySignals(element);
|
|
805
|
+
const name = normalizeName(getAccessibleName(element));
|
|
806
|
+
const hidden = !isVisible(element);
|
|
807
|
+
const scrollable = isScrollable(element);
|
|
808
|
+
const shouldHaveRef = roleLower === "iframe" || roleLower === "canvas" || scrollable || interactivity.interactive || INTERACTIVE_REF_ROLES.has(roleLower) || CONTENT_REF_ROLES.has(roleLower) && name.length > 0;
|
|
809
|
+
let nodeRefId;
|
|
810
|
+
if (shouldHaveRef) nodeRefId = getOrCreateRefId(element, role, name, refPrefix);
|
|
811
|
+
if (role === "generic" && !nodeRefId && !hidden) return null;
|
|
812
|
+
const hints = [];
|
|
813
|
+
if (interactivity.interactive && !interactivity.isInteractiveTag && interactivity.hints.length > 0) hints.push(...interactivity.hints);
|
|
814
|
+
const href = element.getAttribute("href");
|
|
815
|
+
const type = element.getAttribute("type");
|
|
816
|
+
const placeholder = element.getAttribute("placeholder");
|
|
817
|
+
const level = getAriaLevel(element, role);
|
|
818
|
+
const checked = getAriaChecked(element, roleLower);
|
|
819
|
+
const selected = getAriaSelected(element, roleLower);
|
|
820
|
+
const focused = element.ownerDocument.activeElement === element;
|
|
821
|
+
const disabled = getAriaDisabled(element, roleLower);
|
|
822
|
+
const textboxValue = getTextboxValue(element);
|
|
823
|
+
const rect = roleLower === "canvas" ? element.getBoundingClientRect() : null;
|
|
824
|
+
return {
|
|
825
|
+
role,
|
|
826
|
+
name,
|
|
827
|
+
level,
|
|
828
|
+
hidden: hidden || void 0,
|
|
829
|
+
scrollable: scrollable || void 0,
|
|
830
|
+
checked: checked || void 0,
|
|
831
|
+
selected: selected || void 0,
|
|
832
|
+
focused: focused || void 0,
|
|
833
|
+
disabled: disabled || void 0,
|
|
834
|
+
refId: nodeRefId,
|
|
835
|
+
hints,
|
|
836
|
+
href: href ?? void 0,
|
|
837
|
+
type: type ?? void 0,
|
|
838
|
+
placeholder: placeholder ?? void 0,
|
|
839
|
+
size: rect ? `${Math.round(rect.width)}x${Math.round(rect.height)}` : void 0,
|
|
840
|
+
element,
|
|
841
|
+
children: textboxValue !== null ? [textboxValue] : []
|
|
842
|
+
};
|
|
843
|
+
}
|
|
844
|
+
/** True when a node carries no semantic payload beyond its role — safe to unwrap or collapse. */
|
|
845
|
+
function isBareWrapper(node) {
|
|
846
|
+
return !node.name && !node.level && !node.hidden && !node.scrollable && !node.checked && !node.selected && !node.focused && !node.disabled && !node.refId && node.hints.length === 0 && !node.href && !node.type && !node.placeholder && !node.size;
|
|
847
|
+
}
|
|
848
|
+
function normalizeStringChildren(rootNode) {
|
|
849
|
+
const paragraphLeafToText = (node) => {
|
|
850
|
+
if (node.role !== "paragraph") return null;
|
|
851
|
+
if (!isBareWrapper(node)) return null;
|
|
852
|
+
if (node.children.some((child) => typeof child !== "string")) return null;
|
|
853
|
+
return mergeStringBuffer(node.children) || "";
|
|
854
|
+
};
|
|
855
|
+
const flushChildren = (buffer, normalizedChildren) => {
|
|
856
|
+
if (!buffer.length) return;
|
|
857
|
+
const text = mergeStringBuffer(buffer);
|
|
858
|
+
if (text) normalizedChildren.push(text);
|
|
859
|
+
buffer.length = 0;
|
|
860
|
+
};
|
|
861
|
+
const visit = (node) => {
|
|
862
|
+
const normalizedChildren = [];
|
|
863
|
+
const buffer = [];
|
|
864
|
+
for (const child of node.children) {
|
|
865
|
+
if (typeof child === "string") {
|
|
866
|
+
buffer.push(child);
|
|
867
|
+
continue;
|
|
868
|
+
}
|
|
869
|
+
visit(child);
|
|
870
|
+
const paragraphText = paragraphLeafToText(child);
|
|
871
|
+
if (paragraphText !== null) {
|
|
872
|
+
if (paragraphText) buffer.push(paragraphText);
|
|
873
|
+
continue;
|
|
874
|
+
}
|
|
875
|
+
flushChildren(buffer, normalizedChildren);
|
|
876
|
+
normalizedChildren.push(child);
|
|
877
|
+
}
|
|
878
|
+
flushChildren(buffer, normalizedChildren);
|
|
879
|
+
node.children = normalizedChildren.length ? normalizedChildren : [];
|
|
880
|
+
if (node.children.length === 1 && node.children[0] === node.name) node.children = [];
|
|
881
|
+
};
|
|
882
|
+
visit(rootNode);
|
|
883
|
+
}
|
|
884
|
+
function normalizeGenericRoles(node) {
|
|
885
|
+
const hasRefInSubtree = (children) => {
|
|
886
|
+
for (const child of children) {
|
|
887
|
+
if (typeof child === "string") continue;
|
|
888
|
+
if (child.refId) return true;
|
|
889
|
+
if (hasRefInSubtree(child.children)) return true;
|
|
890
|
+
}
|
|
891
|
+
return false;
|
|
892
|
+
};
|
|
893
|
+
const normalizeChildren = (current) => {
|
|
894
|
+
const result = [];
|
|
895
|
+
for (const child of current.children) {
|
|
896
|
+
if (typeof child === "string") {
|
|
897
|
+
result.push(child);
|
|
898
|
+
continue;
|
|
899
|
+
}
|
|
900
|
+
const normalized = normalizeChildren(child);
|
|
901
|
+
result.push(...normalized);
|
|
902
|
+
}
|
|
903
|
+
if (current.hidden && !current.refId && !hasRefInSubtree(result)) return [];
|
|
904
|
+
const singleChild = result.length === 1 && typeof result[0] !== "string" ? result[0] : null;
|
|
905
|
+
if (current.role === "paragraph" && isBareWrapper(current) && !!singleChild && singleChild.role === "paragraph") return singleChild ? [singleChild] : [];
|
|
906
|
+
if (current.role === "generic" && !current.hidden && !current.name && result.length <= 1 && result.every((child) => typeof child !== "string" && !!child.refId)) {
|
|
907
|
+
const flattened = [];
|
|
908
|
+
for (const child of result) if (typeof child !== "string") flattened.push(child);
|
|
909
|
+
return flattened;
|
|
910
|
+
}
|
|
911
|
+
current.children = result;
|
|
912
|
+
return [current];
|
|
913
|
+
};
|
|
914
|
+
normalizeChildren(node);
|
|
915
|
+
}
|
|
916
|
+
function withoutWhitespace(text) {
|
|
917
|
+
return normalizeWhitespace(text).replace(/\s+/g, "");
|
|
918
|
+
}
|
|
919
|
+
function mergeTextLeafChildren(node) {
|
|
920
|
+
const textLeafRoles = /* @__PURE__ */ new Set([
|
|
921
|
+
"generic",
|
|
922
|
+
"heading",
|
|
923
|
+
"paragraph",
|
|
924
|
+
"label"
|
|
925
|
+
]);
|
|
926
|
+
const getLeafText = (child) => {
|
|
927
|
+
if (typeof child === "string") return normalizeWhitespace(child) || null;
|
|
928
|
+
if (!textLeafRoles.has(child.role)) return null;
|
|
929
|
+
if (child.hidden) return null;
|
|
930
|
+
if (!child.name || child.children.length > 0) return null;
|
|
931
|
+
return child.name;
|
|
932
|
+
};
|
|
933
|
+
const visit = (current) => {
|
|
934
|
+
for (const child of current.children) if (typeof child !== "string") visit(child);
|
|
935
|
+
if (current.hidden) return;
|
|
936
|
+
if (!current.refId || current.children.length === 0) return;
|
|
937
|
+
if (current.children.length > 3) return;
|
|
938
|
+
const texts = [];
|
|
939
|
+
for (const child of current.children) {
|
|
940
|
+
const text = getLeafText(child);
|
|
941
|
+
if (!text) return;
|
|
942
|
+
texts.push(text);
|
|
943
|
+
}
|
|
944
|
+
const merged = normalizeName(texts.join(" "));
|
|
945
|
+
if (!merged) return;
|
|
946
|
+
if (!current.name) {
|
|
947
|
+
current.name = merged;
|
|
948
|
+
current.children = [];
|
|
949
|
+
return;
|
|
950
|
+
}
|
|
951
|
+
if (withoutWhitespace(current.name) === withoutWhitespace(merged)) current.children = [];
|
|
952
|
+
};
|
|
953
|
+
visit(node);
|
|
954
|
+
}
|
|
955
|
+
function snapshotNodeToString(node) {
|
|
956
|
+
const parts = [node.role];
|
|
957
|
+
if (node.name) parts.push(`"${escapeSnapshotText(node.name)}"`);
|
|
958
|
+
if (node.refId) parts.push(`[ref=${node.refId}]`);
|
|
959
|
+
if (node.level && node.level > 0) parts.push(`[level=${node.level}]`);
|
|
960
|
+
if (node.hidden) parts.push("[hidden]");
|
|
961
|
+
if (node.scrollable) parts.push("[scrollable]");
|
|
962
|
+
if (node.checked) parts.push("[checked]");
|
|
963
|
+
if (node.disabled) parts.push("[disabled]");
|
|
964
|
+
if (node.focused) parts.push("[focused]");
|
|
965
|
+
if (node.selected) parts.push("[selected]");
|
|
966
|
+
if (node.placeholder) parts.push(`[placeholder="${escapeSnapshotText(node.placeholder)}"]`);
|
|
967
|
+
if (node.size) parts.push(`[size=${node.size}]`);
|
|
968
|
+
return parts.join(" ");
|
|
969
|
+
}
|
|
970
|
+
function renderSnapshotTree(node, depth, lines) {
|
|
971
|
+
const isRoot = node.role === "fragment";
|
|
972
|
+
const childDepth = isRoot ? depth : depth + 1;
|
|
973
|
+
const indent = " ".repeat(depth);
|
|
974
|
+
const childIndent = " ".repeat(childDepth);
|
|
975
|
+
if (!isRoot) {
|
|
976
|
+
const nodeString = snapshotNodeToString(node);
|
|
977
|
+
const textChildren = node.children.filter((child) => typeof child === "string");
|
|
978
|
+
const elementChildren = node.children.filter((child) => typeof child !== "string");
|
|
979
|
+
const hasSelectOptions = node.element?.tagName.toLowerCase() === "select";
|
|
980
|
+
if (textChildren.length === 1 && elementChildren.length === 0 && !hasSelectOptions) {
|
|
981
|
+
const text = normalizeWhitespace(textChildren[0] || "");
|
|
982
|
+
if (text) lines.push(`${indent}- ${nodeString}: "${escapeSnapshotText(text)}"`);
|
|
983
|
+
else lines.push(`${indent}- ${nodeString}`);
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
const hasChildren = node.children.length > 0 || hasSelectOptions;
|
|
987
|
+
lines.push(`${indent}- ${nodeString}${hasChildren ? ":" : ""}`);
|
|
988
|
+
if (hasSelectOptions) {
|
|
989
|
+
const selectEl = node.element;
|
|
990
|
+
for (const option of Array.from(selectEl.options)) {
|
|
991
|
+
let optionLine = `${childIndent}- option`;
|
|
992
|
+
const optionText = option.textContent?.trim() || "";
|
|
993
|
+
if (optionText) {
|
|
994
|
+
const truncated = optionText.replace(/\s+/g, " ").substring(0, 100);
|
|
995
|
+
optionLine += ` "${escapeSnapshotText(truncated)}"`;
|
|
996
|
+
}
|
|
997
|
+
if (option.selected) optionLine += " (selected)";
|
|
998
|
+
if (option.value && option.value !== optionText) optionLine += ` value="${escapeSnapshotText(option.value)}"`;
|
|
999
|
+
lines.push(optionLine);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
for (const child of node.children) {
|
|
1004
|
+
if (typeof child === "string") {
|
|
1005
|
+
const text = normalizeWhitespace(child);
|
|
1006
|
+
if (!text) continue;
|
|
1007
|
+
lines.push(`${childIndent}- text: "${escapeSnapshotText(text)}"`);
|
|
1008
|
+
continue;
|
|
1009
|
+
}
|
|
1010
|
+
renderSnapshotTree(child, childDepth, lines);
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
const defaultOptions = {
|
|
1014
|
+
interactive: false,
|
|
1015
|
+
maxDepth: 50,
|
|
1016
|
+
showHidden: false,
|
|
1017
|
+
refPrefix: ""
|
|
1018
|
+
};
|
|
1019
|
+
/** Generate the YAML-like accessibility tree for the current page or a subtree. */
|
|
1020
|
+
function generateAccessibilityTree(elementRegistry, _options = {}) {
|
|
1021
|
+
_registry = elementRegistry;
|
|
1022
|
+
_refs = {};
|
|
1023
|
+
_signatureAssigned = /* @__PURE__ */ new Map();
|
|
1024
|
+
_visibilityCache = /* @__PURE__ */ new Map();
|
|
1025
|
+
beginAccNameCaches();
|
|
1026
|
+
try {
|
|
1027
|
+
const options = {
|
|
1028
|
+
...defaultOptions,
|
|
1029
|
+
..._options
|
|
1030
|
+
};
|
|
1031
|
+
const maxDepth = options.maxDepth ?? defaultOptions.maxDepth;
|
|
1032
|
+
const treeRoot = {
|
|
1033
|
+
role: "fragment",
|
|
1034
|
+
name: "",
|
|
1035
|
+
hints: [],
|
|
1036
|
+
children: []
|
|
1037
|
+
};
|
|
1038
|
+
const visited = /* @__PURE__ */ new Set();
|
|
1039
|
+
function traverse(element, currentDepth, parentNode) {
|
|
1040
|
+
if (currentDepth > options.maxDepth) return;
|
|
1041
|
+
if (!element?.tagName) return;
|
|
1042
|
+
if (visited.has(element)) return;
|
|
1043
|
+
visited.add(element);
|
|
1044
|
+
const traversable = shouldTraverse(element, options);
|
|
1045
|
+
const includeAsRoot = !options.refId && element === document.body;
|
|
1046
|
+
const hidden = !isVisible(element);
|
|
1047
|
+
const include = includeAsRoot || traversable && (shouldIncludeNode(element, options) || options.showHidden && hidden);
|
|
1048
|
+
if (!traversable && !includeAsRoot) return;
|
|
1049
|
+
let currentNode = null;
|
|
1050
|
+
let targetNode = parentNode;
|
|
1051
|
+
if (include) {
|
|
1052
|
+
currentNode = toSnapshotNode(element, options.refPrefix || "");
|
|
1053
|
+
if (currentNode) {
|
|
1054
|
+
parentNode.children.push(currentNode);
|
|
1055
|
+
targetNode = currentNode;
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
if (!include && options.interactive && element.childNodes.length === 0) {
|
|
1059
|
+
const hoistedName = normalizeName(getAccessibleName(element));
|
|
1060
|
+
if (hoistedName && targetNode.role !== "fragment") targetNode.children.push(hoistedName);
|
|
1061
|
+
}
|
|
1062
|
+
if (currentDepth < maxDepth) {
|
|
1063
|
+
const beforeText = getCSSContent(element, "::before");
|
|
1064
|
+
if (beforeText) targetNode.children.push(beforeText);
|
|
1065
|
+
const nextDepth = include && currentNode ? currentDepth + 1 : currentDepth;
|
|
1066
|
+
for (const child of getLightAndShadowChildNodes(element)) {
|
|
1067
|
+
if (child.nodeType === Node.TEXT_NODE) {
|
|
1068
|
+
if (!child.nodeValue || targetNode.role === "textbox") continue;
|
|
1069
|
+
targetNode.children.push(child.nodeValue);
|
|
1070
|
+
continue;
|
|
1071
|
+
}
|
|
1072
|
+
if (child.nodeType === Node.ELEMENT_NODE) traverse(child, nextDepth, targetNode);
|
|
1073
|
+
}
|
|
1074
|
+
for (const child of getAriaOwnedElements(element)) traverse(child, nextDepth, targetNode);
|
|
1075
|
+
const afterText = getCSSContent(element, "::after");
|
|
1076
|
+
if (afterText) targetNode.children.push(afterText);
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
if (options.refId) {
|
|
1080
|
+
const element = elementRegistry.get(options.refId);
|
|
1081
|
+
if (!element || !element.isConnected) return {
|
|
1082
|
+
error: `Element with ref_id '${options.refId}' not found. It may have been removed from the page. Use read_page without ref_id to get the current page state.`,
|
|
1083
|
+
tree: "",
|
|
1084
|
+
refs: {}
|
|
1085
|
+
};
|
|
1086
|
+
traverse(element, 0, treeRoot);
|
|
1087
|
+
} else if (options.selector) {
|
|
1088
|
+
const element = document.querySelector(options.selector) ?? querySelectorWithImplicitRole(options.selector);
|
|
1089
|
+
if (!element) return {
|
|
1090
|
+
error: `Element matching selector '${options.selector}' not found. It may have been removed from the page. Use read_page without selector to get the current page state.`,
|
|
1091
|
+
tree: "",
|
|
1092
|
+
refs: {}
|
|
1093
|
+
};
|
|
1094
|
+
traverse(element, 0, treeRoot);
|
|
1095
|
+
} else if (document.body) traverse(document.body, 0, treeRoot);
|
|
1096
|
+
normalizeStringChildren(treeRoot);
|
|
1097
|
+
normalizeGenericRoles(treeRoot);
|
|
1098
|
+
mergeTextLeafChildren(treeRoot);
|
|
1099
|
+
const duplicateRefs = findDuplicateRefIds(treeRoot);
|
|
1100
|
+
if (duplicateRefs.length > 0) return {
|
|
1101
|
+
error: `Snapshot produced duplicate refs: ${duplicateRefs.join(", ")}. Take a new snapshot and retry.`,
|
|
1102
|
+
tree: "",
|
|
1103
|
+
refs: {}
|
|
1104
|
+
};
|
|
1105
|
+
const lines = [];
|
|
1106
|
+
renderSnapshotTree(treeRoot, 0, lines);
|
|
1107
|
+
const tree = lines.join("\n");
|
|
1108
|
+
if (options.maxChars && tree.length > options.maxChars) {
|
|
1109
|
+
let errorMsg = `Output exceeds ${options.maxChars} character limit (${tree.length} characters). `;
|
|
1110
|
+
if (options.refId) errorMsg += "The specified element has too much content. Try specifying a smaller depth parameter or focus on a more specific child element.";
|
|
1111
|
+
else if (options.maxDepth) errorMsg += "Try specifying an even smaller depth parameter or use ref_id to focus on a specific element from the page.";
|
|
1112
|
+
else errorMsg += "Try specifying a depth parameter (e.g., depth: 5) or use ref_id to focus on a specific element from the page.";
|
|
1113
|
+
return {
|
|
1114
|
+
error: errorMsg,
|
|
1115
|
+
tree: "",
|
|
1116
|
+
refs: _refs
|
|
1117
|
+
};
|
|
1118
|
+
}
|
|
1119
|
+
return {
|
|
1120
|
+
tree,
|
|
1121
|
+
refs: _refs
|
|
1122
|
+
};
|
|
1123
|
+
} finally {
|
|
1124
|
+
_registry = null;
|
|
1125
|
+
_refs = null;
|
|
1126
|
+
_signatureAssigned = null;
|
|
1127
|
+
_visibilityCache = null;
|
|
1128
|
+
endAccNameCaches();
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
(function setupOmOWrightWorld() {
|
|
1132
|
+
const elementRegistry = /* @__PURE__ */ new Map();
|
|
1133
|
+
let _lastRefs = {};
|
|
1134
|
+
function toElement(node) {
|
|
1135
|
+
if (node instanceof Element) return node;
|
|
1136
|
+
if (node && typeof node === "object" && "parentElement" in node) return node.parentElement;
|
|
1137
|
+
return null;
|
|
1138
|
+
}
|
|
1139
|
+
function takeSnapshot(options) {
|
|
1140
|
+
const rootElement = options?.refId ? elementRegistry.get(options.refId) : void 0;
|
|
1141
|
+
const previousRegistry = new Map(elementRegistry);
|
|
1142
|
+
elementRegistry.clear();
|
|
1143
|
+
if (rootElement && options?.refId) elementRegistry.set(options.refId, rootElement);
|
|
1144
|
+
try {
|
|
1145
|
+
const result = generateAccessibilityTree(elementRegistry, options);
|
|
1146
|
+
_lastRefs = result.refs;
|
|
1147
|
+
return result;
|
|
1148
|
+
} catch {
|
|
1149
|
+
elementRegistry.clear();
|
|
1150
|
+
for (const [key, value] of previousRegistry) elementRegistry.set(key, value);
|
|
1151
|
+
throw new Error("Snapshot failed");
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
const DEREF_WALKER_BUDGET = 5e3;
|
|
1155
|
+
function deref(ref) {
|
|
1156
|
+
const el = elementRegistry.get(ref);
|
|
1157
|
+
if (el && el.isConnected) return el;
|
|
1158
|
+
const meta = _lastRefs[ref];
|
|
1159
|
+
if (!meta) return null;
|
|
1160
|
+
const candidates = [];
|
|
1161
|
+
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);
|
|
1162
|
+
let node;
|
|
1163
|
+
let visited = 0;
|
|
1164
|
+
while (node = walker.nextNode()) {
|
|
1165
|
+
if (++visited > DEREF_WALKER_BUDGET) break;
|
|
1166
|
+
if (getRole(node) === meta.role && getAccessibleName(node) === meta.name) candidates.push(node);
|
|
1167
|
+
}
|
|
1168
|
+
if (candidates.length === 1) return candidates[0] ?? null;
|
|
1169
|
+
if (meta.nthAmongSameSignature < candidates.length) return candidates[meta.nthAmongSameSignature] ?? null;
|
|
1170
|
+
return null;
|
|
1171
|
+
}
|
|
1172
|
+
function retarget(element, behavior) {
|
|
1173
|
+
let el = toElement(element);
|
|
1174
|
+
if (!el) return null;
|
|
1175
|
+
if (behavior === "none") return el;
|
|
1176
|
+
if (!el.matches("input, textarea, select") && !el.isContentEditable) if (behavior === "button-link") el = el.closest("button, [role=button], a, [role=link]") || el;
|
|
1177
|
+
else el = el.closest("button, [role=button], [role=checkbox], [role=radio]") || el;
|
|
1178
|
+
if (behavior === "follow-label") {
|
|
1179
|
+
if (!el.matches("a, input, textarea, button, select, [role=link], [role=button], [role=checkbox], [role=radio]") && !el.isContentEditable) {
|
|
1180
|
+
const label = el.closest("label");
|
|
1181
|
+
if (label?.control) el = label.control;
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
return el;
|
|
1185
|
+
}
|
|
1186
|
+
function resolvePointerTarget(element) {
|
|
1187
|
+
const el = toElement(element);
|
|
1188
|
+
if (!el) return null;
|
|
1189
|
+
if (el instanceof HTMLInputElement && (el.type === "checkbox" || el.type === "radio")) {
|
|
1190
|
+
const visibleLabel = Array.from(el.labels ?? []).find((label) => {
|
|
1191
|
+
const style = label.ownerDocument?.defaultView?.getComputedStyle?.(label);
|
|
1192
|
+
if (style && (style.display === "none" || style.visibility === "hidden")) return false;
|
|
1193
|
+
const rect = label.getBoundingClientRect();
|
|
1194
|
+
return rect.width > 0 && rect.height > 0;
|
|
1195
|
+
});
|
|
1196
|
+
if (visibleLabel) return visibleLabel;
|
|
1197
|
+
}
|
|
1198
|
+
const nativeFormTargetSelector = "input:not([type=\"hidden\"]), select, textarea";
|
|
1199
|
+
const nestedFormTargetSelector = [
|
|
1200
|
+
nativeFormTargetSelector,
|
|
1201
|
+
"[role=\"checkbox\"]",
|
|
1202
|
+
"[role=\"radio\"]",
|
|
1203
|
+
"[role=\"switch\"]"
|
|
1204
|
+
].join(", ");
|
|
1205
|
+
const formControlHostSelector = [
|
|
1206
|
+
"label",
|
|
1207
|
+
"[role=\"checkbox\"]",
|
|
1208
|
+
"[role=\"radio\"]",
|
|
1209
|
+
"[role=\"switch\"]",
|
|
1210
|
+
"mat-checkbox",
|
|
1211
|
+
"mat-radio-button",
|
|
1212
|
+
"mat-slide-toggle"
|
|
1213
|
+
].join(", ");
|
|
1214
|
+
const label = el.closest("label");
|
|
1215
|
+
if (label?.control) {
|
|
1216
|
+
const labelStyle = label.ownerDocument?.defaultView?.getComputedStyle?.(label);
|
|
1217
|
+
const labelRect = label.getBoundingClientRect();
|
|
1218
|
+
const controlRect = label.control.getBoundingClientRect();
|
|
1219
|
+
if ((!labelStyle || labelStyle.display !== "none" && labelStyle.visibility !== "hidden") && labelRect.width > 0 && labelRect.height > 0 && (controlRect.width === 0 || controlRect.height === 0)) return label;
|
|
1220
|
+
return label.control;
|
|
1221
|
+
}
|
|
1222
|
+
const formHost = el.closest(formControlHostSelector);
|
|
1223
|
+
const nestedFormTarget = formHost?.querySelector(nestedFormTargetSelector);
|
|
1224
|
+
if (nestedFormTarget && nestedFormTarget !== formHost) return nestedFormTarget;
|
|
1225
|
+
if (el.hasAttribute("aria-checked") || el.hasAttribute("aria-selected")) return el;
|
|
1226
|
+
if (!el.matches("li, [role=listitem], [role=menuitem], [role=option]")) return el;
|
|
1227
|
+
const selector = [
|
|
1228
|
+
nativeFormTargetSelector,
|
|
1229
|
+
"button",
|
|
1230
|
+
"a[href]",
|
|
1231
|
+
"summary",
|
|
1232
|
+
"[role=\"button\"]",
|
|
1233
|
+
"[role=\"checkbox\"]",
|
|
1234
|
+
"[role=\"radio\"]",
|
|
1235
|
+
"[role=\"switch\"]",
|
|
1236
|
+
"[aria-checked]",
|
|
1237
|
+
"[tabindex]:not([tabindex=\"-1\"])"
|
|
1238
|
+
].join(", ");
|
|
1239
|
+
const candidates = Array.from(el.querySelectorAll(selector)).filter((candidate) => {
|
|
1240
|
+
const rect = candidate.getBoundingClientRect();
|
|
1241
|
+
return rect.width > 0 && rect.height > 0;
|
|
1242
|
+
});
|
|
1243
|
+
if (candidates.length === 0) return el;
|
|
1244
|
+
return candidates.find((candidate) => candidate.matches("input[type=\"checkbox\"], input[type=\"radio\"], [role=\"checkbox\"], [role=\"radio\"], [role=\"switch\"], [aria-checked]")) ?? candidates.find((candidate) => candidate.tabIndex >= 0) ?? candidates[0] ?? el;
|
|
1245
|
+
}
|
|
1246
|
+
function checkHitTarget(element, point) {
|
|
1247
|
+
const el = toElement(element);
|
|
1248
|
+
if (!el) return {
|
|
1249
|
+
ok: false,
|
|
1250
|
+
error: "Node is not an Element"
|
|
1251
|
+
};
|
|
1252
|
+
const isComposedDescendant = (candidate, ancestor) => {
|
|
1253
|
+
let current = candidate;
|
|
1254
|
+
while (current) {
|
|
1255
|
+
if (current === ancestor) return true;
|
|
1256
|
+
if (current instanceof ShadowRoot) {
|
|
1257
|
+
current = current.host;
|
|
1258
|
+
continue;
|
|
1259
|
+
}
|
|
1260
|
+
current = current.parentNode;
|
|
1261
|
+
}
|
|
1262
|
+
return false;
|
|
1263
|
+
};
|
|
1264
|
+
let root = el.ownerDocument;
|
|
1265
|
+
let hitElement = null;
|
|
1266
|
+
while (root) {
|
|
1267
|
+
const candidate = root.elementFromPoint(point.x, point.y);
|
|
1268
|
+
if (!candidate) break;
|
|
1269
|
+
hitElement = candidate;
|
|
1270
|
+
if (isComposedDescendant(candidate, el)) return { ok: true };
|
|
1271
|
+
root = candidate.shadowRoot;
|
|
1272
|
+
}
|
|
1273
|
+
if (!hitElement) {
|
|
1274
|
+
const rect = el.getBoundingClientRect();
|
|
1275
|
+
if (el.isConnected && rect.width > 0 && rect.height > 0) return { ok: true };
|
|
1276
|
+
return {
|
|
1277
|
+
ok: false,
|
|
1278
|
+
error: "Element is obscured at click point"
|
|
1279
|
+
};
|
|
1280
|
+
}
|
|
1281
|
+
if (isComposedDescendant(el, hitElement)) return { ok: true };
|
|
1282
|
+
return {
|
|
1283
|
+
ok: false,
|
|
1284
|
+
error: "Element is obscured by another element"
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
async function waitForReady(element, checks, timeoutMs = 5e3) {
|
|
1288
|
+
const el = toElement(element);
|
|
1289
|
+
if (!el) return {
|
|
1290
|
+
ok: false,
|
|
1291
|
+
error: "Node is not an Element (text node or non-Element handle)"
|
|
1292
|
+
};
|
|
1293
|
+
const start = Date.now();
|
|
1294
|
+
while (Date.now() - start < timeoutMs) {
|
|
1295
|
+
if (checks.includes("attached") && !el.isConnected) return {
|
|
1296
|
+
ok: false,
|
|
1297
|
+
error: "Element is detached from the DOM"
|
|
1298
|
+
};
|
|
1299
|
+
if (checks.includes("visible")) {
|
|
1300
|
+
const rect = el.getBoundingClientRect();
|
|
1301
|
+
if (!(el.checkVisibility?.({
|
|
1302
|
+
checkOpacity: false,
|
|
1303
|
+
checkVisibilityCSS: true
|
|
1304
|
+
}) !== false && rect.width > 0 && rect.height > 0)) {
|
|
1305
|
+
await new Promise((r) => setTimeout(r, 16));
|
|
1306
|
+
continue;
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
if (checks.includes("enabled") && isDisabled(el)) return {
|
|
1310
|
+
ok: false,
|
|
1311
|
+
error: "Element is disabled"
|
|
1312
|
+
};
|
|
1313
|
+
if (checks.includes("stable")) {
|
|
1314
|
+
const prev = el.getBoundingClientRect();
|
|
1315
|
+
await new Promise((r) => setTimeout(r, 32));
|
|
1316
|
+
const curr = el.getBoundingClientRect();
|
|
1317
|
+
if (prev.x !== curr.x || prev.y !== curr.y || prev.width !== curr.width || prev.height !== curr.height) {
|
|
1318
|
+
if (Date.now() - start + 32 >= timeoutMs) return {
|
|
1319
|
+
ok: false,
|
|
1320
|
+
error: "Element is moving"
|
|
1321
|
+
};
|
|
1322
|
+
continue;
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
return { ok: true };
|
|
1326
|
+
}
|
|
1327
|
+
return {
|
|
1328
|
+
ok: false,
|
|
1329
|
+
error: "Timeout waiting for element to be ready"
|
|
1330
|
+
};
|
|
1331
|
+
}
|
|
1332
|
+
function checkEditable(element) {
|
|
1333
|
+
if (isDisabled(element)) return {
|
|
1334
|
+
ok: false,
|
|
1335
|
+
error: "Element is disabled"
|
|
1336
|
+
};
|
|
1337
|
+
const tag = element.tagName;
|
|
1338
|
+
if ([
|
|
1339
|
+
"INPUT",
|
|
1340
|
+
"TEXTAREA",
|
|
1341
|
+
"SELECT"
|
|
1342
|
+
].includes(tag)) return element.hasAttribute("readonly") ? {
|
|
1343
|
+
ok: false,
|
|
1344
|
+
error: "Element is read-only"
|
|
1345
|
+
} : { ok: true };
|
|
1346
|
+
if (element.getAttribute("contenteditable") === "false") return {
|
|
1347
|
+
ok: false,
|
|
1348
|
+
error: "Element is not editable"
|
|
1349
|
+
};
|
|
1350
|
+
if (ARIA_READONLY_ROLES.has(getRole(element))) return element.getAttribute("aria-readonly") === "true" ? {
|
|
1351
|
+
ok: false,
|
|
1352
|
+
error: "Element is read-only (aria-readonly)"
|
|
1353
|
+
} : { ok: true };
|
|
1354
|
+
if (element.isContentEditable) return { ok: true };
|
|
1355
|
+
return {
|
|
1356
|
+
ok: false,
|
|
1357
|
+
error: "Element does not support editable state"
|
|
1358
|
+
};
|
|
1359
|
+
}
|
|
1360
|
+
function isDisabled(element) {
|
|
1361
|
+
if ([
|
|
1362
|
+
"BUTTON",
|
|
1363
|
+
"INPUT",
|
|
1364
|
+
"SELECT",
|
|
1365
|
+
"TEXTAREA",
|
|
1366
|
+
"OPTION",
|
|
1367
|
+
"OPTGROUP"
|
|
1368
|
+
].includes(element.tagName)) {
|
|
1369
|
+
if (element.disabled) return true;
|
|
1370
|
+
const fieldset = element.closest("fieldset:disabled");
|
|
1371
|
+
if (fieldset) {
|
|
1372
|
+
const legend = fieldset.querySelector(":scope > legend");
|
|
1373
|
+
if (!legend || !legend.contains(element)) return true;
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
let el = element;
|
|
1377
|
+
while (el) {
|
|
1378
|
+
if (el.getAttribute("aria-disabled") === "true") return true;
|
|
1379
|
+
el = el.parentElement;
|
|
1380
|
+
}
|
|
1381
|
+
return false;
|
|
1382
|
+
}
|
|
1383
|
+
globalThis.__omowright = {
|
|
1384
|
+
elementRegistry,
|
|
1385
|
+
snapshotEpoch: 0,
|
|
1386
|
+
takeSnapshot,
|
|
1387
|
+
deref,
|
|
1388
|
+
retarget,
|
|
1389
|
+
resolvePointerTarget,
|
|
1390
|
+
waitForReady,
|
|
1391
|
+
checkHitTarget,
|
|
1392
|
+
checkEditable
|
|
1393
|
+
};
|
|
1394
|
+
})();
|
|
1395
|
+
})();
|