• Mohamed Aziz Mejri's avatar
    Integrating web crawling in the custom theme generator (#2347) · de52b9da
    Mohamed Aziz Mejri 提交于
    <!-- CURSOR_SUMMARY -->
    > [!NOTE]
    > Introduces URL-based theme generation alongside image uploads,
    enabling prompts derived from live websites.
    > 
    > - New `Website URL` input source in `AIGeneratorTab` with toggle,
    validation, crawl status indicators, and adjusted generate button/empty
    states
    > - Adds `useGenerateThemeFromUrl` hook and integrates it with existing
    generation flow and loading state
    > - Extends IPC types with `ThemeInputSource`, `CrawlStatus`, and
    `GenerateThemeFromUrlParams`; updates `templateContracts` with
    `generate-theme-from-url`
    > - Implements `generate-theme-from-url` handler: validates inputs,
    calls Dyad Engine `/tools/web-crawl`, selects web-crawl-specific system
    prompts (inspired/high-fidelity), streams model output, and returns
    prompt with robust error handling
    > - Preserves and refines image-based generation; resets state on dialog
    close and adds small UI polish (icons, counters, disabled states)
    > 
    > <sup>Written by [Cursor
    Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
    b5b1aebb277ce421953a06b148bd342fded2a64f. This will update automatically
    on new commits. Configure
    [here](https://cursor.com/dashboard?tab=bugbot).</sup>
    <!-- /CURSOR_SUMMARY -->
    
    <!-- This is an auto-generated description by cubic. -->
    ---
    ## Summary by cubic
    Add URL-based theme generation with web crawling to the custom theme
    generator, alongside image uploads. Users can paste a website URL to
    extract a design system and generate a prompt with clear generation
    status, with added security and reliability improvements.
    
    - **New Features**
    - Source toggle: switch between “Upload Images” and “Website URL,” with
    state reset on dialog close.
    - URL input flow: validate URL and update button states/text; show
    generating state during processing.
    - New hook and types: useGenerateThemeFromUrl, ThemeInputSource,
    CrawlStatus.
    - IPC + contract: generate-theme-from-url with
    GenerateThemeFromUrlParams and result typing.
    - Backend handler: validates Dyad Pro + API key, URL, keywords; crawls
    via Dyad Engine (/tools/web-crawl); uses screenshot + markdown with
    truncation; distinct meta prompts for inspired vs high-fidelity; model
    mapping (Gemini 3 Pro, Claude Opus 4.5, GPT-5.2); streams prompt;
    returns clear errors; test mode stub output.
    
    - **Bug Fixes**
    - Security: restrict to HTTP/HTTPS URLs; block internal/private hosts
    (SSRF); sanitize crawled markdown and user keywords; Zod-validate crawl
    response.
    - Reliability: 120s crawl timeout with AbortController; clearer errors;
    UUID request IDs.
    - UI: add “generating” state; fix effect deps to avoid races; correct
    button disabled states.
      - Code health: shared model map at module scope (DRY).
    
    <sup>Written for commit b8aef2d51b1c5b7de5266f5afdfeb3174a64285b.
    Summary will update on new commits.</sup>
    
    <!-- End of auto-generated description by cubic. -->
    
    <!-- devin-review-badge-begin -->
    
    ---
    
    <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2347">
      <picture>
    <source media="(prefers-color-scheme: dark)"
    srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
    <img
    src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
    alt="Open with Devin">
      </picture>
    </a>
    <!-- devin-review-badge-end -->
    
    ---------
    Co-authored-by: 's avatarClaude <noreply@anthropic.com>
    Co-authored-by: 's avatarWill Chen <willchen90@gmail.com>
    de52b9da
名称
最后提交
最后更新
.claude 正在载入提交数据...
.cursor/rules 正在载入提交数据...
.devcontainer 正在载入提交数据...
.github 正在载入提交数据...
.husky 正在载入提交数据...
assets 正在载入提交数据...
docs 正在载入提交数据...
drizzle 正在载入提交数据...
e2e-tests 正在载入提交数据...
makers 正在载入提交数据...
packages/@dyad-sh 正在载入提交数据...
scaffold 正在载入提交数据...
scripts 正在载入提交数据...
shared 正在载入提交数据...
src 正在载入提交数据...
testing 正在载入提交数据...
tools 正在载入提交数据...
worker 正在载入提交数据...
workers/tsc 正在载入提交数据...
.cursorignore 正在载入提交数据...
.env.example 正在载入提交数据...
.eslintrc.json 正在载入提交数据...
.gitattributes 正在载入提交数据...
.gitignore 正在载入提交数据...
.oxfmtrc.json 正在载入提交数据...
.oxlintrc.json 正在载入提交数据...
.prettierignore 正在载入提交数据...
.prettierrc 正在载入提交数据...
AGENTS.md 正在载入提交数据...
CLA.md 正在载入提交数据...
CLAUDE.md 正在载入提交数据...
CONTRIBUTING.md 正在载入提交数据...
LICENSE 正在载入提交数据...
README.md 正在载入提交数据...
SECURITY.md 正在载入提交数据...
biome.json 正在载入提交数据...
components.json 正在载入提交数据...
drizzle.config.ts 正在载入提交数据...
forge.config.ts 正在载入提交数据...
forge.env.d.ts 正在载入提交数据...
index.html 正在载入提交数据...
lint-staged.config.js 正在载入提交数据...
merge.config.ts 正在载入提交数据...
package-lock.json 正在载入提交数据...
package.json 正在载入提交数据...
playwright.config.ts 正在载入提交数据...
tsconfig.app.json 正在载入提交数据...
tsconfig.json 正在载入提交数据...
tsconfig.node.json 正在载入提交数据...
vite.main.config.mts 正在载入提交数据...
vite.preload.config.mts 正在载入提交数据...
vite.renderer.config.mts 正在载入提交数据...
vite.worker.config.mts 正在载入提交数据...
vitest.config.ts 正在载入提交数据...