oh-my-opencode 4.12.0 โ 4.13.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.md +1 -1
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/dist/agents/sisyphus-agent-factory.d.ts +9 -0
- package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +31 -0
- package/dist/cli/index.js +916 -670
- package/dist/cli-node/index.js +916 -670
- package/dist/config/schema/codegraph.d.ts +1 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +2 -0
- package/dist/config/schema/runtime-fallback.d.ts +1 -0
- package/dist/features/background-agent/background-task-marker.d.ts +8 -0
- package/dist/features/background-agent/fallback-retry-handler.d.ts +1 -0
- package/dist/features/background-agent/manager.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-dedupe.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-notifier-types.d.ts +2 -0
- package/dist/features/background-agent/parent-wake-notifier.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-window-recovery.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -2
- package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +2 -2
- package/dist/hooks/runtime-fallback/auto-retry.d.ts +1 -1
- package/dist/hooks/runtime-fallback/fallback-state-snapshot.d.ts +13 -0
- package/dist/hooks/runtime-fallback/types.d.ts +8 -0
- package/dist/index.js +1042 -640
- package/dist/oh-my-opencode.schema.json +8 -0
- package/dist/plugin/runtime-skill-resolver.d.ts +35 -0
- package/dist/plugin/skill-context.d.ts +9 -0
- package/dist/skills/frontend/ATTRIBUTION.md +32 -8
- package/dist/skills/frontend/references/design/airbnb.md +3 -0
- package/dist/skills/frontend/references/design/airtable.md +3 -0
- package/dist/skills/frontend/references/design/apple.md +3 -0
- package/dist/skills/frontend/references/design/binance.md +3 -0
- package/dist/skills/frontend/references/design/bmw.md +3 -0
- package/dist/skills/frontend/references/design/bugatti.md +3 -0
- package/dist/skills/frontend/references/design/cal.md +3 -0
- package/dist/skills/frontend/references/design/claude.md +3 -0
- package/dist/skills/frontend/references/design/clay.md +3 -0
- package/dist/skills/frontend/references/design/clickhouse.md +3 -0
- package/dist/skills/frontend/references/design/cohere.md +3 -0
- package/dist/skills/frontend/references/design/coinbase.md +3 -0
- package/dist/skills/frontend/references/design/composio.md +3 -0
- package/dist/skills/frontend/references/design/cursor.md +3 -0
- package/dist/skills/frontend/references/design/elevenlabs.md +3 -0
- package/dist/skills/frontend/references/design/expo.md +3 -0
- package/dist/skills/frontend/references/design/ferrari.md +3 -0
- package/dist/skills/frontend/references/design/figma.md +3 -0
- package/dist/skills/frontend/references/design/framer.md +3 -0
- package/dist/skills/frontend/references/design/hashicorp.md +3 -0
- package/dist/skills/frontend/references/design/ibm.md +3 -0
- package/dist/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
- package/dist/skills/frontend/references/design/intercom.md +3 -0
- package/dist/skills/frontend/references/design/kraken.md +3 -0
- package/dist/skills/frontend/references/design/lamborghini.md +3 -0
- package/dist/skills/frontend/references/design/linear.app.md +3 -0
- package/dist/skills/frontend/references/design/lovable.md +3 -0
- package/dist/skills/frontend/references/design/mastercard.md +3 -0
- package/dist/skills/frontend/references/design/meta.md +3 -0
- package/dist/skills/frontend/references/design/minimax.md +3 -0
- package/dist/skills/frontend/references/design/mintlify.md +3 -0
- package/dist/skills/frontend/references/design/miro.md +3 -0
- package/dist/skills/frontend/references/design/mistral.ai.md +3 -0
- package/dist/skills/frontend/references/design/mongodb.md +3 -0
- package/dist/skills/frontend/references/design/nike.md +3 -0
- package/dist/skills/frontend/references/design/notion.md +3 -0
- package/dist/skills/frontend/references/design/nvidia.md +3 -0
- package/dist/skills/frontend/references/design/ollama.md +3 -0
- package/dist/skills/frontend/references/design/opencode.ai.md +3 -0
- package/dist/skills/frontend/references/design/pinterest.md +3 -0
- package/dist/skills/frontend/references/design/playstation.md +3 -0
- package/dist/skills/frontend/references/design/posthog.md +3 -0
- package/dist/skills/frontend/references/design/raycast.md +3 -0
- package/dist/skills/frontend/references/design/renault.md +3 -0
- package/dist/skills/frontend/references/design/replicate.md +3 -0
- package/dist/skills/frontend/references/design/resend.md +3 -0
- package/dist/skills/frontend/references/design/revolut.md +3 -0
- package/dist/skills/frontend/references/design/runwayml.md +3 -0
- package/dist/skills/frontend/references/design/sanity.md +3 -0
- package/dist/skills/frontend/references/design/sentry.md +3 -0
- package/dist/skills/frontend/references/design/shopify.md +3 -0
- package/dist/skills/frontend/references/design/spacex.md +3 -0
- package/dist/skills/frontend/references/design/spotify.md +3 -0
- package/dist/skills/frontend/references/design/starbucks.md +3 -0
- package/dist/skills/frontend/references/design/stitch-skill.md +1 -1
- package/dist/skills/frontend/references/design/stripe.md +3 -0
- package/dist/skills/frontend/references/design/supabase.md +3 -0
- package/dist/skills/frontend/references/design/superhuman.md +3 -0
- package/dist/skills/frontend/references/design/taste-skill.md +1188 -208
- package/dist/skills/frontend/references/design/tesla.md +3 -0
- package/dist/skills/frontend/references/design/theverge.md +3 -0
- package/dist/skills/frontend/references/design/together.ai.md +3 -0
- package/dist/skills/frontend/references/design/uber.md +3 -0
- package/dist/skills/frontend/references/design/vercel.md +3 -0
- package/dist/skills/frontend/references/design/vodafone.md +3 -0
- package/dist/skills/frontend/references/design/voltagent.md +3 -0
- package/dist/skills/frontend/references/design/warp.md +3 -0
- package/dist/skills/frontend/references/design/webflow.md +3 -0
- package/dist/skills/frontend/references/design/wired.md +3 -0
- package/dist/skills/frontend/references/design/wise.md +3 -0
- package/dist/skills/frontend/references/design/x.ai.md +3 -0
- package/dist/skills/frontend/references/design/zapier.md +3 -0
- package/dist/skills/frontend/references/ui-ux-db/README.md +501 -115
- package/dist/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
- package/dist/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
- package/dist/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
- package/dist/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
- package/dist/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
- package/dist/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
- package/dist/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
- package/dist/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
- package/dist/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
- package/dist/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
- package/dist/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
- package/dist/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
- package/dist/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
- package/dist/skills/lcx-doctor/SKILL.md +1 -1
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
- package/dist/skills/ultimate-browsing/SKILL.md +140 -0
- package/dist/skills/ultimate-browsing/engine/__init__.py +24 -0
- package/dist/skills/ultimate-browsing/engine/__main__.py +106 -0
- package/dist/skills/ultimate-browsing/engine/bias_check.py +174 -0
- package/dist/skills/ultimate-browsing/engine/curl_probe.py +91 -0
- package/dist/skills/ultimate-browsing/engine/executor.py +192 -0
- package/dist/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
- package/dist/skills/ultimate-browsing/engine/referers.py +15 -0
- package/dist/skills/ultimate-browsing/engine/result_schema.py +45 -0
- package/dist/skills/ultimate-browsing/engine/summary.py +37 -0
- package/dist/skills/ultimate-browsing/engine/templates/package.json +11 -0
- package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
- package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
- package/dist/skills/ultimate-browsing/engine/url_transforms.py +98 -0
- package/dist/skills/ultimate-browsing/engine/validators.py +216 -0
- package/dist/skills/ultimate-browsing/engine/waf_detector.py +214 -0
- package/dist/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
- package/dist/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +319 -0
- package/dist/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
- package/dist/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
- package/dist/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
- package/dist/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
- package/dist/skills/ultimate-browsing/references/insane-search/media.md +123 -0
- package/dist/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
- package/dist/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
- package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
- package/dist/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
- package/dist/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
- package/dist/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
- package/dist/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
- package/dist/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
- package/dist/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
- package/dist/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
- package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
- package/dist/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
- package/dist/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
- package/dist/skills/ultraresearch/ATTRIBUTION.md +49 -0
- package/dist/skills/ultraresearch/SKILL.md +34 -6
- package/dist/skills/ulw-plan/SKILL.md +4 -1
- package/dist/tools/background-task/constants.d.ts +1 -1
- package/dist/tools/delegate-task/sync-task-deps.d.ts +8 -6
- package/dist/tools/skill-mcp/tools.d.ts +1 -1
- package/dist/tui.js +18 -4
- package/package.json +16 -14
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +27 -4
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
- package/packages/omo-codex/plugin/README.md +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +134 -42
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/LICENSE +21 -0
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +2951 -0
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +16 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +633 -193
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +561 -44
- package/packages/omo-codex/plugin/components/codegraph/package.json +9 -3
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +11 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +12 -0
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +34 -0
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +75 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +66 -13
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +26 -12
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +50 -330
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +91 -0
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +2 -2
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +68 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +11 -1
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +48 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +133 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +1 -112
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +149 -0
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +63 -0
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +106 -0
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +150 -0
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +3 -3
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +3 -3
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +33 -9
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/dist/cli.js +94 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +17 -0
- package/packages/omo-codex/plugin/components/teammode/package.json +26 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +59 -32
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +17 -16
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-state.mjs +70 -3
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-worktree.mjs +113 -0
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +63 -4
- package/packages/omo-codex/plugin/components/teammode/src/cli.ts +12 -0
- package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +125 -0
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +116 -0
- package/packages/omo-codex/plugin/components/teammode/tsconfig.json +25 -0
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +5 -4
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +24 -3
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +8 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +17 -0
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +17 -0
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +129 -12
- package/packages/omo-codex/plugin/package.json +3 -2
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +133 -0
- package/packages/omo-codex/plugin/scripts/auto-update-release-notes.mjs +135 -0
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +33 -133
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +1 -0
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +41 -0
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +20 -2
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +16 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +32 -8
- package/packages/omo-codex/plugin/skills/frontend/references/design/airbnb.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/airtable.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/apple.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/binance.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/bmw.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/bugatti.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/cal.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/claude.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/clay.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/clickhouse.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/cohere.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/coinbase.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/composio.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/cursor.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/elevenlabs.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/expo.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ferrari.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/figma.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/framer.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/hashicorp.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ibm.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
- package/packages/omo-codex/plugin/skills/frontend/references/design/intercom.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/kraken.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/lamborghini.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/linear.app.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/lovable.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mastercard.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/meta.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/minimax.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mintlify.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/miro.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mistral.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/mongodb.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/nike.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/notion.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/nvidia.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ollama.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/opencode.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/pinterest.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/playstation.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/posthog.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/raycast.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/renault.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/replicate.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/resend.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/revolut.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/runwayml.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/sanity.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/sentry.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/shopify.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/spacex.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/spotify.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/starbucks.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stitch-skill.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/stripe.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/supabase.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/superhuman.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/taste-skill.md +1188 -208
- package/packages/omo-codex/plugin/skills/frontend/references/design/tesla.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/theverge.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/together.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/uber.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/vercel.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/vodafone.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/voltagent.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/warp.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/webflow.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/wired.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/wise.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/x.ai.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/zapier.md +3 -0
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/README.md +501 -115
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +59 -32
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +17 -16
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-state.mjs +70 -3
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-worktree.mjs +113 -0
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +63 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +140 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__init__.py +24 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/__main__.py +106 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/bias_check.py +174 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/curl_probe.py +91 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/executor.py +192 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/referers.py +15 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/result_schema.py +45 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/summary.py +37 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +11 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/url_transforms.py +98 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/validators.py +216 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_detector.py +214 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +319 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/media.md +123 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
- package/packages/omo-codex/plugin/skills/ultraresearch/ATTRIBUTION.md +49 -0
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +34 -6
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -7
- package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +36 -0
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -1
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +1 -1
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +95 -0
- package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +12 -3
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +76 -0
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +24 -0
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -0
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +87 -0
- package/packages/omo-codex/plugin/test/teammode-thread-title.test.mjs +169 -0
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +246 -0
- package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +78 -0
- package/packages/omo-codex/scripts/install-cli-args.test.mjs +1 -1
- package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +23 -0
- package/packages/omo-codex/scripts/install-delegated-command.test.mjs +76 -4
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +531 -214
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +40 -3
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +32 -8
- package/packages/shared-skills/skills/frontend/references/design/airbnb.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/airtable.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/apple.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/binance.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/bmw.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/bugatti.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/cal.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/claude.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/clay.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/clickhouse.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/cohere.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/coinbase.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/composio.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/cursor.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/elevenlabs.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/expo.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/ferrari.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/figma.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/framer.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/hashicorp.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/ibm.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/imagegen-frontend-web.md +380 -79
- package/packages/shared-skills/skills/frontend/references/design/intercom.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/kraken.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/lamborghini.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/linear.app.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/lovable.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mastercard.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/meta.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/minimax.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mintlify.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/miro.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mistral.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/mongodb.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/nike.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/notion.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/nvidia.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/ollama.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/opencode.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/pinterest.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/playstation.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/posthog.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/raycast.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/renault.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/replicate.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/resend.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/revolut.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/runwayml.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/sanity.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/sentry.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/shopify.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/spacex.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/spotify.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/starbucks.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/stitch-skill.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/stripe.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/supabase.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/superhuman.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/taste-skill.md +1188 -208
- package/packages/shared-skills/skills/frontend/references/design/tesla.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/theverge.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/together.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/uber.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/vercel.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/vodafone.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/voltagent.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/warp.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/webflow.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/wired.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/wise.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/x.ai.md +3 -0
- package/packages/shared-skills/skills/frontend/references/design/zapier.md +3 -0
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/README.md +501 -115
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/charts.csv +26 -26
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/colors.csv +162 -97
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/icons.csv +105 -100
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/landing.csv +22 -18
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/products.csv +162 -97
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/flutter.csv +53 -53
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/html-tailwind.csv +56 -56
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/nextjs.csv +53 -53
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/react.csv +54 -54
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/svelte.csv +54 -54
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/swiftui.csv +51 -51
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/stacks/vue.csv +50 -50
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/styles.csv +17 -0
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/typography.csv +17 -1
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/ui-reasoning.csv +162 -101
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/data/web-interface.csv +30 -30
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +31 -22
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/design_system.py +150 -69
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/search.py +3 -3
- package/packages/shared-skills/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +105 -0
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +140 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/__init__.py +24 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/__main__.py +106 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/bias_check.py +174 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/curl_probe.py +91 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/executor.py +192 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/fetch_chain.py +268 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/referers.py +15 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/result_schema.py +45 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/summary.py +37 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +11 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +129 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +167 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_fetch_chain.py +77 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +282 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/url_transforms.py +98 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/validators.py +216 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_detector.py +214 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/waf_profiles.yaml +162 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/README.md +79 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/career.md +29 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/dev.md +62 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/search.md +33 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/social.md +207 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/video.md +115 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/agent-reach/web.md +76 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +120 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +319 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/cache-archive.md +83 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/fallback.md +159 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/jina.md +130 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/json-api.md +133 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/media.md +123 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/metadata.md +116 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/naver.md +107 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +142 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/public-api.md +119 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/rss.md +123 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/tls-impersonate.md +186 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/twitter.md +104 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_crypto.py +75 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_domains.py +38 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/cookie_paths.py +112 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +280 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +110 -0
- package/packages/shared-skills/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +245 -0
- package/packages/shared-skills/skills/ultraresearch/ATTRIBUTION.md +49 -0
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +34 -6
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +4 -1
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.d.ts +0 -2
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.d.ts +0 -32
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""Capability-matched executor for fallback attempts.
|
|
2
|
+
|
|
3
|
+
The fetch_chain's probe/grid phase uses curl_cffi directly. When curl can't
|
|
4
|
+
punch through (JS challenge, real-TLS detection), this module routes to the
|
|
5
|
+
right browser executor based on the profile's `capabilities_needed` tags:
|
|
6
|
+
|
|
7
|
+
needs_real_tls_stack + needs_js_exec โ playwright_real_chrome.js
|
|
8
|
+
needs_js_exec only โ Playwright MCP (if available)
|
|
9
|
+
needs_mobile_context (+ real_tls) โ playwright_mobile_chrome.js
|
|
10
|
+
|
|
11
|
+
The JS templates live in `engine/templates/` and accept only generic
|
|
12
|
+
parameters ({{url}}, {{waitSelector}}, {{profileDir}}, {{device}}). No
|
|
13
|
+
site-specific logic.
|
|
14
|
+
|
|
15
|
+
Playwright MCP invocation requires caller's tool access; this module
|
|
16
|
+
provides the subprocess path for local JS templates but only stubs the MCP
|
|
17
|
+
path (MCP must be driven from the Claude session itself).
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import shutil
|
|
24
|
+
import subprocess
|
|
25
|
+
import tempfile
|
|
26
|
+
import time
|
|
27
|
+
from typing import Optional
|
|
28
|
+
|
|
29
|
+
from .validators import Verdict, validate
|
|
30
|
+
from .waf_detector import load_profile
|
|
31
|
+
from .result_schema import Attempt
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
TEMPLATES_DIR = os.path.join(os.path.dirname(__file__), "templates")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _node_available() -> bool:
|
|
38
|
+
return shutil.which("node") is not None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _chrome_channel_available() -> bool:
|
|
42
|
+
"""Heuristic: try `node -e` to import playwright. Fallback to True, let script fail loudly."""
|
|
43
|
+
if not _node_available():
|
|
44
|
+
return False
|
|
45
|
+
if shutil.which("npx") is None:
|
|
46
|
+
return False
|
|
47
|
+
return True
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _pick_executor(capabilities: list[str], device_class: str) -> str:
|
|
51
|
+
caps = set(capabilities or [])
|
|
52
|
+
if device_class == "mobile" or "needs_mobile_context" in caps:
|
|
53
|
+
if "needs_real_tls_stack" in caps:
|
|
54
|
+
return "playwright_mobile_chrome"
|
|
55
|
+
return "playwright_mcp_mobile"
|
|
56
|
+
if "needs_real_tls_stack" in caps:
|
|
57
|
+
return "playwright_real_chrome"
|
|
58
|
+
if "needs_js_exec" in caps:
|
|
59
|
+
return "playwright_mcp"
|
|
60
|
+
return "playwright_real_chrome" # safest general fallback
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _run_node_template(template: str, args: dict, timeout: int = 90) -> tuple[int, str, str]:
|
|
64
|
+
"""Run a Node.js template with args as JSON on stdin.
|
|
65
|
+
|
|
66
|
+
Template convention: reads `process.stdin` โ JSON โ runs fetch โ writes
|
|
67
|
+
HTML to stdout; errors go to stderr with non-zero exit code.
|
|
68
|
+
"""
|
|
69
|
+
path = os.path.join(TEMPLATES_DIR, template)
|
|
70
|
+
if not os.path.isfile(path):
|
|
71
|
+
return 127, "", f"template not found: {path}"
|
|
72
|
+
try:
|
|
73
|
+
proc = subprocess.run(
|
|
74
|
+
["node", path],
|
|
75
|
+
input=json.dumps(args),
|
|
76
|
+
cwd=TEMPLATES_DIR,
|
|
77
|
+
capture_output=True,
|
|
78
|
+
text=True,
|
|
79
|
+
timeout=timeout,
|
|
80
|
+
)
|
|
81
|
+
return proc.returncode, proc.stdout, proc.stderr
|
|
82
|
+
except subprocess.TimeoutExpired:
|
|
83
|
+
return 124, "", f"timeout after {timeout}s"
|
|
84
|
+
except Exception as e:
|
|
85
|
+
return 1, "", f"{type(e).__name__}:{e}"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class _FakeResp:
|
|
89
|
+
"""Minimal response shim so validators.validate() works on Playwright HTML."""
|
|
90
|
+
def __init__(self, html: str, status: int = 200, final_url: str = ""):
|
|
91
|
+
self.text = html
|
|
92
|
+
self.status_code = status
|
|
93
|
+
self.url = final_url
|
|
94
|
+
self.cookies = _FakeCookies()
|
|
95
|
+
self.headers = {}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class _FakeCookies:
|
|
99
|
+
class _Jar:
|
|
100
|
+
def __iter__(self):
|
|
101
|
+
return iter([])
|
|
102
|
+
def __init__(self):
|
|
103
|
+
self.jar = self._Jar()
|
|
104
|
+
def __iter__(self):
|
|
105
|
+
return iter([])
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def run_playwright_fallback(
|
|
109
|
+
url: str,
|
|
110
|
+
*,
|
|
111
|
+
profile_id: str,
|
|
112
|
+
success_selectors: Optional[list[str]] = None,
|
|
113
|
+
device_class: str = "auto",
|
|
114
|
+
timeout: int = 90,
|
|
115
|
+
profile_dir: Optional[str] = None,
|
|
116
|
+
force_executor: Optional[str] = None,
|
|
117
|
+
) -> tuple[Attempt, str]:
|
|
118
|
+
"""Invoke the appropriate Playwright executor.
|
|
119
|
+
|
|
120
|
+
force_executor: caller-specified executor name (from a profile's
|
|
121
|
+
`fallback_when_challenge` list). When set, it overrides capability-based
|
|
122
|
+
inference. Recognized values: "playwright_real_chrome",
|
|
123
|
+
"playwright_mobile_chrome", "playwright_mcp".
|
|
124
|
+
|
|
125
|
+
Returns (Attempt, html_content). Attempt.verdict reflects validation.
|
|
126
|
+
"""
|
|
127
|
+
profile = load_profile(profile_id)
|
|
128
|
+
capabilities = profile.get("capabilities_needed") or []
|
|
129
|
+
choice = force_executor or _pick_executor(capabilities, device_class)
|
|
130
|
+
|
|
131
|
+
t0 = time.time()
|
|
132
|
+
att = Attempt(
|
|
133
|
+
phase="fallback",
|
|
134
|
+
executor=choice,
|
|
135
|
+
url=url,
|
|
136
|
+
url_transform="original",
|
|
137
|
+
impersonate=None,
|
|
138
|
+
referer="",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
if choice.startswith("playwright_mcp"):
|
|
142
|
+
att.error = (
|
|
143
|
+
"Playwright MCP must be invoked from the Claude session โ "
|
|
144
|
+
"call mcp__playwright__* tools directly instead of fetch_chain."
|
|
145
|
+
)
|
|
146
|
+
att.verdict = Verdict.UNKNOWN.value
|
|
147
|
+
att.elapsed_s = round(time.time() - t0, 3)
|
|
148
|
+
return att, ""
|
|
149
|
+
|
|
150
|
+
if not _chrome_channel_available():
|
|
151
|
+
att.error = "node/npx not available for local Playwright template"
|
|
152
|
+
att.verdict = Verdict.UNKNOWN.value
|
|
153
|
+
att.elapsed_s = round(time.time() - t0, 3)
|
|
154
|
+
return att, ""
|
|
155
|
+
|
|
156
|
+
template_map = {
|
|
157
|
+
"playwright_real_chrome": "playwright_real_chrome.js",
|
|
158
|
+
"playwright_mobile_chrome": "playwright_mobile_chrome.js",
|
|
159
|
+
}
|
|
160
|
+
template = template_map.get(choice)
|
|
161
|
+
if template is None:
|
|
162
|
+
att.error = f"no template for executor {choice}"
|
|
163
|
+
att.verdict = Verdict.UNKNOWN.value
|
|
164
|
+
att.elapsed_s = round(time.time() - t0, 3)
|
|
165
|
+
return att, ""
|
|
166
|
+
|
|
167
|
+
args: dict = {
|
|
168
|
+
"url": url,
|
|
169
|
+
"profileDir": profile_dir or os.path.join(tempfile.gettempdir(), ".insane_pw_profile"),
|
|
170
|
+
"timeout": timeout * 1000,
|
|
171
|
+
}
|
|
172
|
+
if choice == "playwright_mobile_chrome":
|
|
173
|
+
args["device"] = "iPhone 13 Pro"
|
|
174
|
+
if success_selectors:
|
|
175
|
+
args["waitSelector"] = success_selectors[0]
|
|
176
|
+
|
|
177
|
+
rc, stdout, stderr = _run_node_template(template, args, timeout=timeout + 10)
|
|
178
|
+
att.elapsed_s = round(time.time() - t0, 3)
|
|
179
|
+
|
|
180
|
+
if rc != 0 or not stdout:
|
|
181
|
+
att.error = (stderr or "no stdout")[:300]
|
|
182
|
+
att.verdict = Verdict.UNKNOWN.value
|
|
183
|
+
return att, ""
|
|
184
|
+
|
|
185
|
+
# stdout carries HTML. Validate with a shim.
|
|
186
|
+
resp = _FakeResp(stdout)
|
|
187
|
+
vr = validate(resp, success_selectors=success_selectors)
|
|
188
|
+
att.status = 200
|
|
189
|
+
att.body_size = len(stdout)
|
|
190
|
+
att.verdict = vr.verdict.value
|
|
191
|
+
att.reasons = vr.reasons
|
|
192
|
+
return att, stdout
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"""Single entrypoint: insane-search generic fetch chain.
|
|
2
|
+
|
|
3
|
+
from insane_search.engine import fetch
|
|
4
|
+
result = fetch("https://example.com/path", success_selectors=["article"])
|
|
5
|
+
|
|
6
|
+
Public contract:
|
|
7
|
+
* One function: `fetch(url, ...) -> FetchResult`.
|
|
8
|
+
* Internal structure preserved as explicit phases so tests & debug logs
|
|
9
|
+
can target each stage: probe โ validate โ detect โ plan โ execute โ report.
|
|
10
|
+
* `FetchResult.trace` exposes every attempt (transform ร impersonate ร
|
|
11
|
+
referer ร executor) โ callers can diagnose without re-running.
|
|
12
|
+
|
|
13
|
+
No site-specific branching. Site knowledge enters only via:
|
|
14
|
+
* `success_selectors` (caller-supplied positive proof)
|
|
15
|
+
* `user_hint` (optional runtime hints; never persisted by this module)
|
|
16
|
+
* `observations/*.jsonl` (append-only log; separate concern)
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import random
|
|
23
|
+
import time
|
|
24
|
+
|
|
25
|
+
from .curl_probe import run_attempt
|
|
26
|
+
from .result_schema import Attempt, FetchResult
|
|
27
|
+
from .summary import format_summary
|
|
28
|
+
from .validators import Verdict
|
|
29
|
+
from .waf_detector import DetectionHit, detect, load_profile, _load_profiles, last_load_error
|
|
30
|
+
from .url_transforms import iter_transformed
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# --- Main entrypoint ---------------------------------------------------------
|
|
34
|
+
def fetch(
|
|
35
|
+
url: str,
|
|
36
|
+
*,
|
|
37
|
+
success_selectors: list[str] | None = None,
|
|
38
|
+
device_class: str = "auto", # "auto" | "desktop" | "mobile"
|
|
39
|
+
user_hint: dict | None = None,
|
|
40
|
+
timeout: int = 25,
|
|
41
|
+
max_attempts: int = 12,
|
|
42
|
+
enable_playwright: bool = True, # hook left for executor module
|
|
43
|
+
) -> FetchResult:
|
|
44
|
+
"""Fetch `url` using the generic grid.
|
|
45
|
+
|
|
46
|
+
Parameters
|
|
47
|
+
----------
|
|
48
|
+
success_selectors
|
|
49
|
+
Positive-proof CSS selectors. Presence of โฅ1 match promotes verdict
|
|
50
|
+
to STRONG_OK. Without them, best outcome is WEAK_OK.
|
|
51
|
+
device_class
|
|
52
|
+
"desktop" pins curl impersonate to desktop targets (safari/chrome/firefox).
|
|
53
|
+
"mobile" pins to mobile targets (safari_ios/chrome_android) AND enables
|
|
54
|
+
mobile URL transforms.
|
|
55
|
+
"auto" (default) follows profile advice; tries desktop first, mobile on
|
|
56
|
+
persistent failure.
|
|
57
|
+
user_hint
|
|
58
|
+
Optional runtime hints, e.g. `{"impersonate_first": "safari", "referer": "..."}`.
|
|
59
|
+
Never stored. Only influences current call.
|
|
60
|
+
timeout
|
|
61
|
+
Per-attempt timeout in seconds.
|
|
62
|
+
max_attempts
|
|
63
|
+
Hard upper bound on total attempts across all phases.
|
|
64
|
+
enable_playwright
|
|
65
|
+
Placeholder โ Playwright fallback invocation is delegated to
|
|
66
|
+
`engine/executor.py` (separate module, capability-matched).
|
|
67
|
+
"""
|
|
68
|
+
user_hint = user_hint or {}
|
|
69
|
+
profiles = _load_profiles()
|
|
70
|
+
trace: list[Attempt] = []
|
|
71
|
+
last_resp = None
|
|
72
|
+
last_attempt: Attempt | None = None
|
|
73
|
+
profile_used: str | None = None
|
|
74
|
+
|
|
75
|
+
# Surface profile-loader failures as a trace entry so callers can see
|
|
76
|
+
# that we're running on the in-code default (YAML missing / invalid /
|
|
77
|
+
# PyYAML not installed). Never fatal by itself.
|
|
78
|
+
load_err = last_load_error()
|
|
79
|
+
if load_err:
|
|
80
|
+
trace.append(Attempt(
|
|
81
|
+
phase="probe",
|
|
82
|
+
executor="profile_loader",
|
|
83
|
+
url=url,
|
|
84
|
+
url_transform="original",
|
|
85
|
+
impersonate=None,
|
|
86
|
+
referer="",
|
|
87
|
+
verdict=Verdict.UNKNOWN.value,
|
|
88
|
+
error=f"profiles_fallback: {load_err}",
|
|
89
|
+
))
|
|
90
|
+
|
|
91
|
+
# -------- Phase 1: probe with safe defaults ------------------------------
|
|
92
|
+
base_impersonate = user_hint.get("impersonate_first") or "safari"
|
|
93
|
+
if device_class == "mobile":
|
|
94
|
+
base_impersonate = user_hint.get("impersonate_first") or "safari_ios"
|
|
95
|
+
|
|
96
|
+
probe_attempt, probe_resp = run_attempt(
|
|
97
|
+
url,
|
|
98
|
+
transform_name="original",
|
|
99
|
+
impersonate=base_impersonate,
|
|
100
|
+
referer_name=user_hint.get("referer_strategy") or "self_root",
|
|
101
|
+
success_selectors=success_selectors,
|
|
102
|
+
known_bad_sizes=None,
|
|
103
|
+
timeout=timeout,
|
|
104
|
+
phase="probe",
|
|
105
|
+
)
|
|
106
|
+
trace.append(probe_attempt)
|
|
107
|
+
if probe_resp is not None:
|
|
108
|
+
last_resp = probe_resp
|
|
109
|
+
last_attempt = probe_attempt
|
|
110
|
+
if probe_attempt.verdict in (Verdict.STRONG_OK.value, Verdict.WEAK_OK.value):
|
|
111
|
+
return _build_result(probe_resp, probe_attempt, trace, profile_used=None)
|
|
112
|
+
|
|
113
|
+
# -------- Phase 2: detect WAF, plan grid ---------------------------------
|
|
114
|
+
if last_resp is not None:
|
|
115
|
+
hits = detect(last_resp, profiles=profiles)
|
|
116
|
+
else:
|
|
117
|
+
hits = [DetectionHit(profile_id="unknown_challenge", confidence=0.1, signals=["no_probe_response"])]
|
|
118
|
+
|
|
119
|
+
# Try top profiles by confidence.
|
|
120
|
+
attempts_used = len(trace)
|
|
121
|
+
for hit in hits[:3]: # top 3 candidates
|
|
122
|
+
if attempts_used >= max_attempts:
|
|
123
|
+
break
|
|
124
|
+
profile_id = hit.profile_id
|
|
125
|
+
profile_used = profile_id
|
|
126
|
+
profile = load_profile(profile_id, profiles=profiles)
|
|
127
|
+
|
|
128
|
+
tls_groups: list[list[str]] = profile.get("tls_impersonate_candidates") or [["safari", "chrome"]]
|
|
129
|
+
tls_flat: list[str] = [t for group in tls_groups for t in group]
|
|
130
|
+
avoid = set((profile.get("tls_impersonate_avoid") or []))
|
|
131
|
+
tls_flat = [t for t in tls_flat if t not in avoid]
|
|
132
|
+
|
|
133
|
+
referer_order = profile.get("referer_strategies") or ["self_root"]
|
|
134
|
+
transform_order = profile.get("url_transform_order") or ["original"]
|
|
135
|
+
|
|
136
|
+
# device_class override
|
|
137
|
+
if device_class == "mobile":
|
|
138
|
+
tls_flat = [t for t in tls_flat if "ios" in t or "android" in t] or tls_flat
|
|
139
|
+
if "mobile_subdomain" not in transform_order:
|
|
140
|
+
transform_order = transform_order + ["mobile_subdomain"]
|
|
141
|
+
elif device_class == "desktop":
|
|
142
|
+
tls_flat = [t for t in tls_flat if "ios" not in t and "android" not in t] or tls_flat
|
|
143
|
+
|
|
144
|
+
known_bad_sizes = profile.get("known_bad_sizes") or None
|
|
145
|
+
|
|
146
|
+
for t_name, t_url in iter_transformed(url, transform_order):
|
|
147
|
+
for tls in tls_flat:
|
|
148
|
+
for ref in referer_order:
|
|
149
|
+
if attempts_used >= max_attempts:
|
|
150
|
+
break
|
|
151
|
+
# Skip exact duplicate of probe.
|
|
152
|
+
if (t_name == "original" and tls == base_impersonate
|
|
153
|
+
and ref == (user_hint.get("referer_strategy") or "self_root")):
|
|
154
|
+
continue
|
|
155
|
+
att, resp = run_attempt(
|
|
156
|
+
t_url,
|
|
157
|
+
transform_name=t_name,
|
|
158
|
+
impersonate=tls,
|
|
159
|
+
referer_name=ref,
|
|
160
|
+
success_selectors=success_selectors,
|
|
161
|
+
known_bad_sizes=known_bad_sizes,
|
|
162
|
+
timeout=timeout,
|
|
163
|
+
phase="grid",
|
|
164
|
+
)
|
|
165
|
+
trace.append(att)
|
|
166
|
+
attempts_used += 1
|
|
167
|
+
# Jitter: politeness + IP-reputation guard. Tunable via
|
|
168
|
+
# INSANE_JITTER_MS_MIN / INSANE_JITTER_MS_MAX env vars.
|
|
169
|
+
_jmin = int(os.environ.get("INSANE_JITTER_MS_MIN", "150"))
|
|
170
|
+
_jmax = int(os.environ.get("INSANE_JITTER_MS_MAX", "400"))
|
|
171
|
+
time.sleep(random.uniform(_jmin/1000.0, _jmax/1000.0))
|
|
172
|
+
if resp is None:
|
|
173
|
+
continue
|
|
174
|
+
last_resp, last_attempt = resp, att
|
|
175
|
+
if att.verdict in (Verdict.STRONG_OK.value, Verdict.WEAK_OK.value):
|
|
176
|
+
return _build_result(resp, att, trace, profile_used=profile_id)
|
|
177
|
+
|
|
178
|
+
# -------- Phase 3: Playwright fallback (profile-driven order) -----------
|
|
179
|
+
if enable_playwright:
|
|
180
|
+
try:
|
|
181
|
+
from .executor import run_playwright_fallback # lazy import
|
|
182
|
+
# Honour profile's `fallback_when_challenge` list โ iterate the
|
|
183
|
+
# caller-declared order instead of capability-inferred single pick.
|
|
184
|
+
fb_profile = load_profile(profile_used or "unknown_challenge", profiles=profiles)
|
|
185
|
+
fb_order = fb_profile.get("fallback_when_challenge") or ["playwright_real_chrome"]
|
|
186
|
+
pw_attempt = None
|
|
187
|
+
pw_content = ""
|
|
188
|
+
for fb_name in fb_order:
|
|
189
|
+
if fb_name == "curl_grid_exhaust":
|
|
190
|
+
# Already performed in Phase 2; nothing more to do here.
|
|
191
|
+
continue
|
|
192
|
+
pw_attempt, pw_content = run_playwright_fallback(
|
|
193
|
+
url,
|
|
194
|
+
profile_id=profile_used or "unknown_challenge",
|
|
195
|
+
success_selectors=success_selectors,
|
|
196
|
+
device_class=device_class,
|
|
197
|
+
force_executor=fb_name,
|
|
198
|
+
)
|
|
199
|
+
trace.append(pw_attempt)
|
|
200
|
+
if pw_attempt.verdict in (Verdict.STRONG_OK.value, Verdict.WEAK_OK.value):
|
|
201
|
+
return FetchResult(
|
|
202
|
+
ok=True,
|
|
203
|
+
content=pw_content,
|
|
204
|
+
final_url=pw_attempt.url,
|
|
205
|
+
verdict=pw_attempt.verdict,
|
|
206
|
+
profile_used=profile_used,
|
|
207
|
+
trace=trace,
|
|
208
|
+
summary=f"Playwright fallback succeeded via {fb_name}",
|
|
209
|
+
)
|
|
210
|
+
# Synthesize a placeholder if no iteration ran (empty list).
|
|
211
|
+
if pw_attempt is None:
|
|
212
|
+
pw_attempt = Attempt(
|
|
213
|
+
phase="fallback",
|
|
214
|
+
executor="none",
|
|
215
|
+
url=url,
|
|
216
|
+
url_transform="original",
|
|
217
|
+
impersonate=None,
|
|
218
|
+
referer="",
|
|
219
|
+
verdict=Verdict.UNKNOWN.value,
|
|
220
|
+
error="profile has empty fallback_when_challenge",
|
|
221
|
+
)
|
|
222
|
+
trace.append(pw_attempt)
|
|
223
|
+
except ImportError:
|
|
224
|
+
trace.append(Attempt(
|
|
225
|
+
phase="fallback",
|
|
226
|
+
executor="playwright",
|
|
227
|
+
url=url,
|
|
228
|
+
url_transform="original",
|
|
229
|
+
impersonate=None,
|
|
230
|
+
referer="",
|
|
231
|
+
verdict=Verdict.UNKNOWN.value,
|
|
232
|
+
error="executor module not available",
|
|
233
|
+
))
|
|
234
|
+
except (RuntimeError, OSError) as e:
|
|
235
|
+
trace.append(Attempt(
|
|
236
|
+
phase="fallback",
|
|
237
|
+
executor="playwright",
|
|
238
|
+
url=url,
|
|
239
|
+
url_transform="original",
|
|
240
|
+
impersonate=None,
|
|
241
|
+
referer="",
|
|
242
|
+
verdict=Verdict.UNKNOWN.value,
|
|
243
|
+
error=f"{type(e).__name__}:{str(e)[:200]}",
|
|
244
|
+
))
|
|
245
|
+
|
|
246
|
+
# -------- Give up, return best we have ----------------------------------
|
|
247
|
+
summary = format_summary(trace, profile_used)
|
|
248
|
+
return FetchResult(
|
|
249
|
+
ok=False,
|
|
250
|
+
content=getattr(last_resp, "text", "") if last_resp is not None else "",
|
|
251
|
+
final_url=getattr(last_resp, "url", url) if last_resp is not None else url,
|
|
252
|
+
verdict=last_attempt.verdict if last_attempt else Verdict.UNKNOWN.value,
|
|
253
|
+
profile_used=profile_used,
|
|
254
|
+
trace=trace,
|
|
255
|
+
summary=summary,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def _build_result(resp, attempt: Attempt, trace: list[Attempt], profile_used: str | None) -> FetchResult:
|
|
260
|
+
return FetchResult(
|
|
261
|
+
ok=True,
|
|
262
|
+
content=getattr(resp, "text", "") or "",
|
|
263
|
+
final_url=str(getattr(resp, "url", attempt.url)),
|
|
264
|
+
verdict=attempt.verdict,
|
|
265
|
+
profile_used=profile_used,
|
|
266
|
+
trace=trace,
|
|
267
|
+
summary=f"{attempt.executor} {attempt.impersonate} + {attempt.url_transform} + referer:{attempt.referer} โ {attempt.verdict}",
|
|
268
|
+
)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from urllib.parse import urlsplit
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _self_root(url: str) -> str:
|
|
7
|
+
parsed = urlsplit(url)
|
|
8
|
+
return f"{parsed.scheme}://{parsed.netloc}/"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
REFERER_STRATEGIES = {
|
|
12
|
+
"self_root": _self_root,
|
|
13
|
+
"google_search": lambda _url: "https://www.google.com/",
|
|
14
|
+
"none": lambda _url: "",
|
|
15
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import asdict, dataclass, field
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class Attempt:
|
|
9
|
+
phase: str
|
|
10
|
+
executor: str
|
|
11
|
+
url: str
|
|
12
|
+
url_transform: str
|
|
13
|
+
impersonate: Optional[str]
|
|
14
|
+
referer: str
|
|
15
|
+
status: int = 0
|
|
16
|
+
body_size: int = 0
|
|
17
|
+
verdict: str = ""
|
|
18
|
+
reasons: list[str] = field(default_factory=list)
|
|
19
|
+
elapsed_s: float = 0.0
|
|
20
|
+
error: Optional[str] = None
|
|
21
|
+
|
|
22
|
+
def to_dict(self) -> dict:
|
|
23
|
+
return asdict(self)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class FetchResult:
|
|
28
|
+
ok: bool
|
|
29
|
+
content: str = ""
|
|
30
|
+
final_url: str = ""
|
|
31
|
+
verdict: str = ""
|
|
32
|
+
profile_used: Optional[str] = None
|
|
33
|
+
trace: list[Attempt] = field(default_factory=list)
|
|
34
|
+
summary: str = ""
|
|
35
|
+
|
|
36
|
+
def to_dict(self) -> dict:
|
|
37
|
+
return {
|
|
38
|
+
"ok": self.ok,
|
|
39
|
+
"final_url": self.final_url,
|
|
40
|
+
"verdict": self.verdict,
|
|
41
|
+
"profile_used": self.profile_used,
|
|
42
|
+
"trace": [a.to_dict() for a in self.trace],
|
|
43
|
+
"summary": self.summary,
|
|
44
|
+
"content_length": len(self.content),
|
|
45
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from .result_schema import Attempt
|
|
6
|
+
from .validators import Verdict
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
_R7_ELIGIBLE_PROFILES = frozenset({
|
|
10
|
+
"akamai_bot_manager",
|
|
11
|
+
"cloudflare_turnstile",
|
|
12
|
+
"datadome_probable",
|
|
13
|
+
"perimeterx_human",
|
|
14
|
+
"f5_big_ip",
|
|
15
|
+
"aws_waf",
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
R7_HINT = (
|
|
19
|
+
"๐ก R7 API-first ๊ถ์ฅ: WAF๊ฐ HTML ๊ฒฝ๋ก๋ฅผ ์ฐจ๋จ ์ค. "
|
|
20
|
+
"Playwright MCP ์ฌ์ฉ โ browser_navigate โ browser_network_requests "
|
|
21
|
+
"โ `/api/`ยท`/graphql`ยท`\\.json` ํํฐ๋ก ๋ด๋ถ ์๋ํฌ์ธํธ ํ์ง โ "
|
|
22
|
+
"ํด๋น URL์ `python3 -m engine <API_URL>`๋ก ์ฌํธ์ถ. ๋๋ถ๋ถ API ๋ ์ด์ด๋ "
|
|
23
|
+
"WAF ๋ฐฉ์ด๊ฐ ์์ curl_cffi๋ง์ผ๋ก ์์ง๋จ."
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def format_summary(trace: list[Attempt], profile: Optional[str]) -> str:
|
|
28
|
+
n = len(trace)
|
|
29
|
+
verdicts = [a.verdict for a in trace]
|
|
30
|
+
challenge_count = sum(1 for v in verdicts if v == Verdict.CHALLENGE.value)
|
|
31
|
+
base = (
|
|
32
|
+
f"failed after {n} attempts; profile={profile}; "
|
|
33
|
+
f"verdicts={','.join(v for v in verdicts[:5])}" + ("..." if n > 5 else "")
|
|
34
|
+
)
|
|
35
|
+
if profile in _R7_ELIGIBLE_PROFILES and challenge_count >= 3:
|
|
36
|
+
return base + "\n" + R7_HINT
|
|
37
|
+
return base
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "insane-search-templates",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Local deps for Playwright real-Chrome templates. npm install && npx playwright install chrome",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"playwright": "^1.61.0",
|
|
8
|
+
"playwright-extra": "^4.3.6",
|
|
9
|
+
"puppeteer-extra-plugin-stealth": "^2.11.2"
|
|
10
|
+
}
|
|
11
|
+
}
|