@12ui/design 0.2.80 → 0.2.82
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 +8 -9
- package/SKILL.md +2 -8
- package/dist/cli-capabilities.d.ts +2 -2
- package/dist/cli-capabilities.js +2 -2
- package/dist/cli-capabilities.js.map +1 -1
- package/dist/cli-help/design.d.ts +1 -1
- package/dist/cli-help/design.d.ts.map +1 -1
- package/dist/cli-help/design.js +0 -1
- package/dist/cli-help/design.js.map +1 -1
- package/dist/cli-help/index.d.ts +3 -3
- package/dist/cli-help/workflow.d.ts +2 -2
- package/dist/cli-help/workflow.js +4 -4
- package/dist/cli-help/workflow.js.map +1 -1
- package/dist/cli-usage.d.ts.map +1 -1
- package/dist/cli-usage.js +5 -4
- package/dist/cli-usage.js.map +1 -1
- package/dist/cli-workspace-draw.d.ts.map +1 -1
- package/dist/cli-workspace-draw.js +2 -0
- package/dist/cli-workspace-draw.js.map +1 -1
- package/dist/cli-workspace-runner.d.ts.map +1 -1
- package/dist/cli-workspace-runner.js +2 -1
- package/dist/cli-workspace-runner.js.map +1 -1
- package/dist/corpus-client.d.ts +3 -0
- package/dist/corpus-client.d.ts.map +1 -1
- package/dist/corpus-client.js +2 -0
- package/dist/corpus-client.js.map +1 -1
- package/dist/corpus-public-renditions.d.ts +33 -0
- package/dist/corpus-public-renditions.d.ts.map +1 -0
- package/dist/corpus-public-renditions.js +55 -0
- package/dist/corpus-public-renditions.js.map +1 -0
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +11 -0
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/mcp-slate-command.d.ts +0 -2
- package/dist/mcp-slate-command.d.ts.map +1 -1
- package/dist/mcp-slate-command.js +0 -4
- package/dist/mcp-slate-command.js.map +1 -1
- package/dist/mcp-slate-resource.d.ts.map +1 -1
- package/dist/mcp-slate-resource.js +6 -4
- package/dist/mcp-slate-resource.js.map +1 -1
- package/dist/mcp-slate-tool-defs.d.ts.map +1 -1
- package/dist/mcp-slate-tool-defs.js +8 -6
- package/dist/mcp-slate-tool-defs.js.map +1 -1
- package/dist/mcp-slate-tools.d.ts.map +1 -1
- package/dist/mcp-slate-tools.js +8 -1
- package/dist/mcp-slate-tools.js.map +1 -1
- package/dist/mcp-slate-ui-copy.d.ts +88 -208
- package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
- package/dist/mcp-slate-ui-copy.js +58 -159
- package/dist/mcp-slate-ui-copy.js.map +1 -1
- package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/de-DE.js +44 -83
- package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -1
- package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/es-419.js +44 -83
- package/dist/mcp-slate-ui-locales/es-419.js.map +1 -1
- package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/es-ES.js +44 -83
- package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -1
- package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/fr-FR.js +44 -83
- package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -1
- package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/hi-IN.js +44 -83
- package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -1
- package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/it-IT.js +44 -83
- package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -1
- package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/ja-JP.js +44 -83
- package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -1
- package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/ko-KR.js +44 -83
- package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -1
- package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/pt-BR.js +44 -83
- package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -1
- package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/zh-CN.js +44 -83
- package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -1
- package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -1
- package/dist/mcp-slate-ui-locales/zh-TW.js +44 -83
- package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -1
- package/dist/mcp-slate-ui-script-bridge.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-bridge.js +19 -7
- package/dist/mcp-slate-ui-script-bridge.js.map +1 -1
- package/dist/mcp-slate-ui-script-browser.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-browser.js +0 -3
- package/dist/mcp-slate-ui-script-browser.js.map +1 -1
- package/dist/mcp-slate-ui-script-designs.d.ts +17 -0
- package/dist/mcp-slate-ui-script-designs.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-designs.js +365 -0
- package/dist/mcp-slate-ui-script-designs.js.map +1 -0
- package/dist/mcp-slate-ui-script-edit.d.ts +9 -0
- package/dist/mcp-slate-ui-script-edit.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-edit.js +71 -0
- package/dist/mcp-slate-ui-script-edit.js.map +1 -0
- package/dist/mcp-slate-ui-script-inline.d.ts +3 -9
- package/dist/mcp-slate-ui-script-inline.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inline.js +28 -155
- package/dist/mcp-slate-ui-script-inline.js.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +13 -12
- package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-collage.js +24 -24
- package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts +23 -0
- package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration-gallery.js +221 -0
- package/dist/mcp-slate-ui-script-inspiration-gallery.js.map +1 -0
- package/dist/mcp-slate-ui-script-inspiration-grid.d.ts +14 -21
- package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-grid.js +124 -196
- package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration.d.ts +8 -9
- package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration.js +213 -130
- package/dist/mcp-slate-ui-script-inspiration.js.map +1 -1
- package/dist/mcp-slate-ui-script-l10n.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-l10n.js +2 -0
- package/dist/mcp-slate-ui-script-l10n.js.map +1 -1
- package/dist/mcp-slate-ui-script-more.d.ts +4 -33
- package/dist/mcp-slate-ui-script-more.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-more.js +6 -279
- package/dist/mcp-slate-ui-script-more.js.map +1 -1
- package/dist/mcp-slate-ui-script-pause.d.ts +10 -6
- package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-pause.js +45 -30
- package/dist/mcp-slate-ui-script-pause.js.map +1 -1
- package/dist/mcp-slate-ui-script-references.d.ts +19 -0
- package/dist/mcp-slate-ui-script-references.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-references.js +102 -0
- package/dist/mcp-slate-ui-script-references.js.map +1 -0
- package/dist/mcp-slate-ui-script-remote.d.ts +13 -12
- package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-remote.js +46 -27
- package/dist/mcp-slate-ui-script-remote.js.map +1 -1
- package/dist/mcp-slate-ui-script-scribble.d.ts +2 -2
- package/dist/mcp-slate-ui-script-scribble.js +7 -7
- package/dist/mcp-slate-ui-script-select.d.ts +4 -9
- package/dist/mcp-slate-ui-script-select.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-select.js +13 -37
- package/dist/mcp-slate-ui-script-select.js.map +1 -1
- package/dist/mcp-slate-ui-script-stage.d.ts +4 -10
- package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-stage.js +28 -141
- package/dist/mcp-slate-ui-script-stage.js.map +1 -1
- package/dist/mcp-slate-ui-script-state.d.ts +1 -1
- package/dist/mcp-slate-ui-script-state.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-state.js +9 -4
- package/dist/mcp-slate-ui-script-state.js.map +1 -1
- package/dist/mcp-slate-ui-script-viewer.d.ts +18 -0
- package/dist/mcp-slate-ui-script-viewer.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-viewer.js +405 -0
- package/dist/mcp-slate-ui-script-viewer.js.map +1 -0
- package/dist/mcp-slate-ui-script.d.ts +4 -5
- package/dist/mcp-slate-ui-script.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script.js +12 -13
- package/dist/mcp-slate-ui-script.js.map +1 -1
- package/dist/mcp-slate-ui-styles-designs.d.ts +10 -0
- package/dist/mcp-slate-ui-styles-designs.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-designs.js +121 -0
- package/dist/mcp-slate-ui-styles-designs.js.map +1 -0
- package/dist/mcp-slate-ui-styles-inspiration.d.ts +13 -13
- package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles-inspiration.js +67 -33
- package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -1
- package/dist/mcp-slate-ui-styles-pause.d.ts +2 -2
- package/dist/mcp-slate-ui-styles-pause.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles-pause.js +4 -8
- package/dist/mcp-slate-ui-styles-pause.js.map +1 -1
- package/dist/mcp-slate-ui-styles-stage.d.ts +3 -22
- package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles-stage.js +6 -74
- package/dist/mcp-slate-ui-styles-stage.js.map +1 -1
- package/dist/mcp-slate-ui-styles.d.ts +12 -19
- package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles.js +97 -100
- package/dist/mcp-slate-ui-styles.js.map +1 -1
- package/dist/mcp-slate-ui.d.ts +12 -12
- package/dist/mcp-slate-ui.d.ts.map +1 -1
- package/dist/mcp-slate-ui.js +24 -23
- package/dist/mcp-slate-ui.js.map +1 -1
- package/dist/mcp-workflow-tools.js +2 -2
- package/dist/mcp-workflow-tools.js.map +1 -1
- package/dist/review-files-server.d.ts +8 -0
- package/dist/review-files-server.d.ts.map +1 -0
- package/dist/review-files-server.js +133 -0
- package/dist/review-files-server.js.map +1 -0
- package/dist/review-page-assets.d.ts +1 -1
- package/dist/review-page-assets.d.ts.map +1 -1
- package/dist/review-page-assets.js +3 -1
- package/dist/review-page-assets.js.map +1 -1
- package/dist/review-page.d.ts +8 -1
- package/dist/review-page.d.ts.map +1 -1
- package/dist/review-page.js +32 -21
- package/dist/review-page.js.map +1 -1
- package/dist/review-server-guard.d.ts +33 -0
- package/dist/review-server-guard.d.ts.map +1 -0
- package/dist/review-server-guard.js +65 -0
- package/dist/review-server-guard.js.map +1 -0
- package/dist/review-server.d.ts +2 -0
- package/dist/review-server.d.ts.map +1 -1
- package/dist/review-server.js +45 -74
- package/dist/review-server.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/slate-actions.d.ts +22 -1
- package/dist/slate-actions.d.ts.map +1 -1
- package/dist/slate-actions.js +46 -2
- package/dist/slate-actions.js.map +1 -1
- package/dist/slate-browser-host.d.ts +8 -7
- package/dist/slate-browser-host.d.ts.map +1 -1
- package/dist/slate-browser-host.js +13 -10
- package/dist/slate-browser-host.js.map +1 -1
- package/dist/slate-browser-server.d.ts.map +1 -1
- package/dist/slate-browser-server.js +10 -4
- package/dist/slate-browser-server.js.map +1 -1
- package/dist/slate-commit.d.ts.map +1 -1
- package/dist/slate-commit.js +12 -5
- package/dist/slate-commit.js.map +1 -1
- package/dist/slate-handoff.d.ts.map +1 -1
- package/dist/slate-handoff.js +2 -3
- package/dist/slate-handoff.js.map +1 -1
- package/dist/slate-ids.d.ts +2 -1
- package/dist/slate-ids.d.ts.map +1 -1
- package/dist/slate-ids.js +3 -2
- package/dist/slate-ids.js.map +1 -1
- package/dist/slate-reference-ids.d.ts.map +1 -1
- package/dist/slate-reference-ids.js +1 -0
- package/dist/slate-reference-ids.js.map +1 -1
- package/dist/slate-round-prompt.d.ts +19 -0
- package/dist/slate-round-prompt.d.ts.map +1 -1
- package/dist/slate-round-prompt.js +22 -0
- package/dist/slate-round-prompt.js.map +1 -1
- package/dist/slate-round-runner.d.ts.map +1 -1
- package/dist/slate-round-runner.js +16 -12
- package/dist/slate-round-runner.js.map +1 -1
- package/dist/slate-round-search.d.ts.map +1 -1
- package/dist/slate-round-search.js +2 -0
- package/dist/slate-round-search.js.map +1 -1
- package/dist/slate-runtime.d.ts +3 -0
- package/dist/slate-runtime.d.ts.map +1 -1
- package/dist/slate-runtime.js +1 -0
- package/dist/slate-runtime.js.map +1 -1
- package/dist/slate-site-references-capture.d.ts +20 -0
- package/dist/slate-site-references-capture.d.ts.map +1 -0
- package/dist/slate-site-references-capture.js +119 -0
- package/dist/slate-site-references-capture.js.map +1 -0
- package/dist/slate-site-references-client.d.ts +35 -0
- package/dist/slate-site-references-client.d.ts.map +1 -0
- package/dist/slate-site-references-client.js +36 -0
- package/dist/slate-site-references-client.js.map +1 -0
- package/dist/slate-site-references-local.d.ts +6 -0
- package/dist/slate-site-references-local.d.ts.map +1 -0
- package/dist/slate-site-references-local.js +63 -0
- package/dist/slate-site-references-local.js.map +1 -0
- package/dist/slate-site-references-suggest.d.ts +36 -0
- package/dist/slate-site-references-suggest.d.ts.map +1 -0
- package/dist/slate-site-references-suggest.js +144 -0
- package/dist/slate-site-references-suggest.js.map +1 -0
- package/dist/slate-site-references.d.ts +57 -0
- package/dist/slate-site-references.d.ts.map +1 -0
- package/dist/slate-site-references.js +129 -0
- package/dist/slate-site-references.js.map +1 -0
- package/dist/slate-view-contract.d.ts +29 -1
- package/dist/slate-view-contract.d.ts.map +1 -1
- package/dist/slate-view.d.ts.map +1 -1
- package/dist/slate-view.js +5 -0
- package/dist/slate-view.js.map +1 -1
- package/dist/slate-workspace-parse.d.ts +2 -0
- package/dist/slate-workspace-parse.d.ts.map +1 -1
- package/dist/slate-workspace-parse.js +20 -3
- package/dist/slate-workspace-parse.js.map +1 -1
- package/dist/slate-workspace-types.d.ts +17 -2
- package/dist/slate-workspace-types.d.ts.map +1 -1
- package/dist/workflow/adapter-12ui.js +1 -1
- package/dist/workflow/adapter-12ui.js.map +1 -1
- package/dist/workflow/adapters.d.ts.map +1 -1
- package/dist/workflow/adapters.js +3 -3
- package/dist/workflow/adapters.js.map +1 -1
- package/dist/workflow/providers.js +2 -2
- package/dist/workflow/providers.js.map +1 -1
- package/dist/workflow/routing.d.ts +8 -1
- package/dist/workflow/routing.d.ts.map +1 -1
- package/dist/workflow/routing.js +9 -2
- package/dist/workflow/routing.js.map +1 -1
- package/dist/workflow/types.d.ts +5 -2
- package/dist/workflow/types.d.ts.map +1 -1
- package/dist/workflow/types.js.map +1 -1
- package/dist/workflow-transport.d.ts.map +1 -1
- package/dist/workflow-transport.js +4 -2
- package/dist/workflow-transport.js.map +1 -1
- package/dist/workspace-draw-messages.d.ts +27 -5
- package/dist/workspace-draw-messages.d.ts.map +1 -1
- package/dist/workspace-draw-messages.js +29 -3
- package/dist/workspace-draw-messages.js.map +1 -1
- package/dist/workspace-draw-run.d.ts +12 -0
- package/dist/workspace-draw-run.d.ts.map +1 -1
- package/dist/workspace-draw-run.js +47 -18
- package/dist/workspace-draw-run.js.map +1 -1
- package/dist/workspace-draw-types.d.ts +2 -1
- package/dist/workspace-draw-types.d.ts.map +1 -1
- package/dist/workspace-draw-types.js +1 -0
- package/dist/workspace-draw-types.js.map +1 -1
- package/dist/workspace-runner-main.d.ts +5 -0
- package/dist/workspace-runner-main.d.ts.map +1 -1
- package/dist/workspace-runner-main.js +15 -3
- package/dist/workspace-runner-main.js.map +1 -1
- package/open-design.json +2 -13
- package/package.json +1 -1
- package/skills/12ui-design/SKILL.md +7 -8
- package/dist/mcp-slate-ui-script-dialog.d.ts +0 -21
- package/dist/mcp-slate-ui-script-dialog.d.ts.map +0 -1
- package/dist/mcp-slate-ui-script-dialog.js +0 -351
- package/dist/mcp-slate-ui-script-dialog.js.map +0 -1
- package/dist/mcp-slate-ui-script-progress.d.ts +0 -7
- package/dist/mcp-slate-ui-script-progress.d.ts.map +0 -1
- package/dist/mcp-slate-ui-script-progress.js +0 -9
- package/dist/mcp-slate-ui-script-progress.js.map +0 -1
- package/dist/mcp-slate-ui-styles-dialog.d.ts +0 -20
- package/dist/mcp-slate-ui-styles-dialog.d.ts.map +0 -1
- package/dist/mcp-slate-ui-styles-dialog.js +0 -87
- package/dist/mcp-slate-ui-styles-dialog.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-capture.d.ts","sourceRoot":"","sources":["../src/slate-site-references-capture.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB;;;CAAwC,CAAC;AAUtE,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AA4E7F,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC;IAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAwCtI,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import sharp from 'sharp';
|
|
2
|
+
import { resolvePrototypeBrowserProvisioning } from './prototype-browsers.js';
|
|
3
|
+
/**
|
|
4
|
+
* The capture step of the References tab: each suggested site opened headless in the Playwright Chromium the CLI
|
|
5
|
+
* already ships, at a desktop viewport, and photographed above the fold once the page has settled, with a trivial
|
|
6
|
+
* cookie banner accepted first. A page that does not open, answers an error, or stays blank is skipped (null).
|
|
7
|
+
*/
|
|
8
|
+
export const CAPTURE_VIEWPORT = { width: 1440, height: 900 };
|
|
9
|
+
const THUMB_WIDTH = 640;
|
|
10
|
+
const GOTO_TIMEOUT_MS = 25_000;
|
|
11
|
+
const LOAD_WAIT_MS = 10_000;
|
|
12
|
+
const IDLE_WAIT_MS = 4_000;
|
|
13
|
+
/** Marketing pop-ups arrive on a timer (atlascoffeeclub.com's email form shows about 11 s after navigation): keep looking until then. */
|
|
14
|
+
const POPUP_SETTLE_MS = 13_000;
|
|
15
|
+
/** A real desktop Chrome's user agent: some sites turn a "HeadlessChrome" one away. */
|
|
16
|
+
const USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36';
|
|
17
|
+
/**
|
|
18
|
+
* Page scripts, as plain source so no transpiler helper leaks into the page. CLEAR_OVERLAYS accepts a cookie banner and
|
|
19
|
+
* closes an overlay (a newsletter or region pop-up) when either is plainly marked and sits in fixed chrome or a dialog,
|
|
20
|
+
* looking into open shadow roots too, and answers how many it clicked. A close control may be icon-only: a button whose
|
|
21
|
+
* aria-label or title says close or dismiss, or a close-classed element inside a dialog or modal. HIDE_OVERLAYS then
|
|
22
|
+
* hides a fixed, viewport-sized dialog or modal that is still up. HAS_CONTENT answers whether the page painted.
|
|
23
|
+
*/
|
|
24
|
+
const CLEAR_OVERLAYS = String.raw `(() => {
|
|
25
|
+
var known = ["#onetrust-accept-btn-handler", "#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll", "#truste-consent-button", "[data-testid=uc-accept-all-button]", ".cc-allow", ".cky-btn-accept", "#didomi-notice-agree-button"];
|
|
26
|
+
var accept = /^(accept|accept all|accept all cookies|accept cookies|allow all|allow all cookies|allow cookies|i agree|i accept|agree|agree and close|got it|ok|okay|i understand)$/i;
|
|
27
|
+
var dismiss = /^(no thanks|no, thanks|no thank you|not now|maybe later|close|close dialog|close modal|dismiss|×|✕|x|no thank you, i'm fine here|no thanks, i'm fine here|stay here)$/i;
|
|
28
|
+
var roots = [document];
|
|
29
|
+
document.querySelectorAll("*").forEach(function (node) { if (node.shadowRoot) roots.push(node.shadowRoot); });
|
|
30
|
+
function visible(node) { var box = node.getBoundingClientRect(); return box.width > 0 && box.height > 0 && getComputedStyle(node).visibility !== "hidden"; }
|
|
31
|
+
function label(node) { return ((node.textContent || "").replace(/\s+/g, " ").trim() || node.getAttribute("aria-label") || node.value || "").trim(); }
|
|
32
|
+
function overlaid(node) {
|
|
33
|
+
for (var at = node; at && at.nodeType === 1; at = at.parentElement || (at.getRootNode && at.getRootNode().host) || null) {
|
|
34
|
+
var position = getComputedStyle(at).position;
|
|
35
|
+
if (position === "fixed" || position === "sticky" || at.getAttribute("role") === "dialog" || at.getAttribute("aria-modal") === "true") return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function iconClose(node) {
|
|
40
|
+
var name = node.getAttribute("aria-label") || node.getAttribute("title") || "";
|
|
41
|
+
return /\b(close|dismiss)\b/i.test(name) && node.tagName !== "A";
|
|
42
|
+
}
|
|
43
|
+
function closeClassed(node) {
|
|
44
|
+
return /(^|[\s_-])close([\s_-]|$)/i.test(String(node.getAttribute("class") || "")) && !!node.closest("[role=dialog], [aria-modal=true], [class*=modal], [class*=popup], [class*=dialog]");
|
|
45
|
+
}
|
|
46
|
+
var clicked = 0;
|
|
47
|
+
roots.forEach(function (root) {
|
|
48
|
+
known.forEach(function (selector) { var node = root.querySelector(selector); if (node && visible(node)) { node.click(); clicked += 1; } });
|
|
49
|
+
root.querySelectorAll("button, [role=button], a, input[type=button], input[type=submit]").forEach(function (node) {
|
|
50
|
+
if (!visible(node)) return;
|
|
51
|
+
var text = label(node);
|
|
52
|
+
// A link only ever accepts: a close word on a link (an X profile, say) could leave the page.
|
|
53
|
+
if ((accept.test(text) || (dismiss.test(text) && node.tagName !== "A") || iconClose(node)) && overlaid(node)) { node.click(); clicked += 1; }
|
|
54
|
+
});
|
|
55
|
+
root.querySelectorAll("[class*=close]").forEach(function (node) {
|
|
56
|
+
if (visible(node) && closeClassed(node) && node.tagName !== "A" && !node.querySelector("button, [role=button]")) { node.click(); clicked += 1; }
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
return clicked;
|
|
60
|
+
})()`;
|
|
61
|
+
const HIDE_OVERLAYS = String.raw `(() => {
|
|
62
|
+
var hidden = 0;
|
|
63
|
+
var marked = /modal|popup|dialog|overlay|backdrop|lightbox/i;
|
|
64
|
+
document.querySelectorAll("body *").forEach(function (node) {
|
|
65
|
+
var style = getComputedStyle(node);
|
|
66
|
+
if (style.position !== "fixed" || style.display === "none" || style.visibility === "hidden") return;
|
|
67
|
+
var box = node.getBoundingClientRect();
|
|
68
|
+
if (box.width < innerWidth * 0.9 || box.height < innerHeight * 0.9) return;
|
|
69
|
+
var named = node.getAttribute("role") === "dialog" || node.getAttribute("aria-modal") === "true" || marked.test(String(node.getAttribute("class") || "") + " " + node.id);
|
|
70
|
+
if (named) { node.style.setProperty("display", "none", "important"); hidden += 1; }
|
|
71
|
+
});
|
|
72
|
+
return hidden;
|
|
73
|
+
})()`;
|
|
74
|
+
const HAS_CONTENT = '((document.body && document.body.innerText || "").trim().length > 40 || document.images.length > 2)';
|
|
75
|
+
const quietly = async (work) => { await work.catch(() => undefined); };
|
|
76
|
+
export const openSiteCapture = async () => {
|
|
77
|
+
const provisioning = await resolvePrototypeBrowserProvisioning();
|
|
78
|
+
process.env.PLAYWRIGHT_BROWSERS_PATH = provisioning.browsersPath;
|
|
79
|
+
const { chromium } = await import('@playwright/test');
|
|
80
|
+
const browser = await chromium.launch();
|
|
81
|
+
const capture = async (url) => {
|
|
82
|
+
const context = await browser.newContext({ viewport: CAPTURE_VIEWPORT, deviceScaleFactor: 1, userAgent: USER_AGENT, locale: 'en-US', colorScheme: 'light' });
|
|
83
|
+
try {
|
|
84
|
+
const page = await context.newPage();
|
|
85
|
+
const startedAt = Date.now();
|
|
86
|
+
const response = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: GOTO_TIMEOUT_MS });
|
|
87
|
+
if (!response || response.status() >= 400)
|
|
88
|
+
return null;
|
|
89
|
+
await quietly(page.waitForLoadState('load', { timeout: LOAD_WAIT_MS }));
|
|
90
|
+
await quietly(page.waitForLoadState('networkidle', { timeout: IDLE_WAIT_MS }));
|
|
91
|
+
// Banners and pop-ups often arrive a moment after load, some on a timer: clear them, then look again until the
|
|
92
|
+
// settle time has passed.
|
|
93
|
+
for (let pass = 0; pass === 0 || Date.now() - startedAt < POPUP_SETTLE_MS; pass += 1) {
|
|
94
|
+
await page.waitForTimeout(pass === 0 ? 800 : 1_000);
|
|
95
|
+
await page.evaluate(CLEAR_OVERLAYS).catch(() => 0);
|
|
96
|
+
// A pop-up that listens for Escape closes with it.
|
|
97
|
+
await quietly(page.keyboard.press('Escape'));
|
|
98
|
+
}
|
|
99
|
+
// A dialog that survived every click is hidden rather than photographed.
|
|
100
|
+
await quietly(page.evaluate(HIDE_OVERLAYS));
|
|
101
|
+
// Above the fold: a click or a focus may have scrolled the page.
|
|
102
|
+
await quietly(page.evaluate('window.scrollTo(0, 0)'));
|
|
103
|
+
await page.waitForTimeout(500);
|
|
104
|
+
if (!(await page.evaluate(HAS_CONTENT).catch(() => false)))
|
|
105
|
+
return null;
|
|
106
|
+
const image = await page.screenshot({ type: 'jpeg', quality: 82, clip: { x: 0, y: 0, ...CAPTURE_VIEWPORT } });
|
|
107
|
+
const thumb = await sharp(image).resize({ width: THUMB_WIDTH }).jpeg({ quality: 78, mozjpeg: true }).toBuffer();
|
|
108
|
+
return { image, thumb, title: (await page.title().catch(() => '')).trim(), finalUrl: page.url() };
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
await quietly(context.close());
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
return { capture, close: async () => { await quietly(browser.close()); } };
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=slate-site-references-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-capture.js","sourceRoot":"","sources":["../src/slate-site-references-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type DrawFetch } from './workspace-draw-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* The References tab's two calls on design.12ui.com, authenticated by the workspace's upload token like the draw
|
|
4
|
+
* command's: what to look for (the brief, and the sites already added), and one captured site.
|
|
5
|
+
*/
|
|
6
|
+
export type SitesBrief = {
|
|
7
|
+
concept: string;
|
|
8
|
+
corpusQuery: string | null;
|
|
9
|
+
sites: {
|
|
10
|
+
id: string;
|
|
11
|
+
url: string;
|
|
12
|
+
}[];
|
|
13
|
+
max: number;
|
|
14
|
+
};
|
|
15
|
+
export type SitePush = {
|
|
16
|
+
url: string;
|
|
17
|
+
title: string;
|
|
18
|
+
why: string;
|
|
19
|
+
image: Buffer;
|
|
20
|
+
thumb: Buffer;
|
|
21
|
+
};
|
|
22
|
+
export declare const createSitesClient: (args: {
|
|
23
|
+
origin: string;
|
|
24
|
+
token: string;
|
|
25
|
+
cliVersion: string;
|
|
26
|
+
fetch?: DrawFetch;
|
|
27
|
+
}) => {
|
|
28
|
+
brief: () => Promise<SitesBrief>;
|
|
29
|
+
push: (site: SitePush) => Promise<{
|
|
30
|
+
id: string;
|
|
31
|
+
replayed: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
};
|
|
34
|
+
export type SitesClient = ReturnType<typeof createSitesClient>;
|
|
35
|
+
//# sourceMappingURL=slate-site-references-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-client.d.ts","sourceRoot":"","sources":["../src/slate-site-references-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5G;;;GAGG;AAEH,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5H,MAAM,MAAM,QAAQ,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,eAAO,MAAM,iBAAiB,GAAI,MAAM;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE;iBAa3F,OAAO,CAAC,UAAU,CAAC;iBAUjB,QAAQ,KAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CAW3E,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CLI_HEADER, NO_REDIRECT, PUSH_HEADER, readBody } from './workspace-draw-client.js';
|
|
2
|
+
export const createSitesClient = (args) => {
|
|
3
|
+
const fetcher = args.fetch ?? ((url, init) => fetch(url, init));
|
|
4
|
+
const url = `${args.origin}/api/v1/slate/sites`;
|
|
5
|
+
const headers = { [PUSH_HEADER]: args.token, [CLI_HEADER]: args.cliVersion };
|
|
6
|
+
const call = async (init) => {
|
|
7
|
+
const response = await fetcher(url, { ...init, redirect: NO_REDIRECT, headers: { ...headers, ...init.headers } });
|
|
8
|
+
const body = await readBody(response);
|
|
9
|
+
if (!response.ok || !body || typeof body !== 'object')
|
|
10
|
+
throw new Error(`${url} answered ${response.status}${typeof body === 'object' && body ? ` ${JSON.stringify(body.error ?? '')}` : ''}`);
|
|
11
|
+
return body;
|
|
12
|
+
};
|
|
13
|
+
return {
|
|
14
|
+
brief: async () => {
|
|
15
|
+
const body = await call({ method: 'GET' });
|
|
16
|
+
const brief = (body.brief ?? {});
|
|
17
|
+
return {
|
|
18
|
+
concept: typeof brief.concept === 'string' ? brief.concept : '',
|
|
19
|
+
corpusQuery: typeof brief.corpusQuery === 'string' ? brief.corpusQuery : null,
|
|
20
|
+
sites: Array.isArray(body.sites) ? body.sites : [],
|
|
21
|
+
max: typeof body.max === 'number' ? body.max : 12,
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
push: async (site) => {
|
|
25
|
+
const form = new FormData();
|
|
26
|
+
form.append('url', site.url);
|
|
27
|
+
form.append('title', site.title);
|
|
28
|
+
form.append('why', site.why);
|
|
29
|
+
form.append('image', new Blob([new Uint8Array(site.image)], { type: 'image/jpeg' }), 'image.jpg');
|
|
30
|
+
form.append('thumb', new Blob([new Uint8Array(site.thumb)], { type: 'image/jpeg' }), 'thumb.jpg');
|
|
31
|
+
const body = await call({ method: 'POST', body: form });
|
|
32
|
+
return { id: String(body.id), replayed: body.replayed === true };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=slate-site-references-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-client.js","sourceRoot":"","sources":["../src/slate-site-references-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SitePush } from './slate-site-references-client.js';
|
|
2
|
+
export declare const localSiteId: (url: string) => string;
|
|
3
|
+
export declare const addLocalSite: (root: string, site: SitePush) => Promise<string>;
|
|
4
|
+
/** Gather once per workspace per server process; a workspace that already has its sites gathers nothing. */
|
|
5
|
+
export declare const startLocalReferences: (root: string, env?: NodeJS.ProcessEnv) => void;
|
|
6
|
+
//# sourceMappingURL=slate-site-references-local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-local.d.ts","sourceRoot":"","sources":["../src/slate-site-references-local.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAgBlE,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,MAAuD,CAAC;AAOlG,eAAO,MAAM,YAAY,GAAU,MAAM,MAAM,EAAE,MAAM,QAAQ,KAAG,OAAO,CAAC,MAAM,CAe/E,CAAC;AAIF,4GAA4G;AAC5G,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,EAAE,MAAK,MAAM,CAAC,UAAwB,KAAG,IAezF,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import sharp from 'sharp';
|
|
4
|
+
import { sha256Hex } from './slate-ids.js';
|
|
5
|
+
import { referenceFile } from './slate-paths.js';
|
|
6
|
+
import { gatherSiteReferences, SITE_TARGET } from './slate-site-references.js';
|
|
7
|
+
import { loadWorkspaceAt, mutateWorkspace, NoWrite } from './slate-workspace-store.js';
|
|
8
|
+
/**
|
|
9
|
+
* The local plugin's References tab: the same gathering as the hosted workspace's, started by the local MCP server the
|
|
10
|
+
* first time it shows a workspace with fewer than a dozen sites. Each site's screenshot is cached as that reference's
|
|
11
|
+
* pictures (`inspiration/<id>.ref.png` and `.thumb.png`), so the reference tool, the selection and the local runner's
|
|
12
|
+
* draws take it like any reference, and the record names it in `sites`.
|
|
13
|
+
*/
|
|
14
|
+
/** `site-` and 16 hex of sha256 of the page address without its fragment: the hosted server's id for the same page. */
|
|
15
|
+
const pageOf = (url) => {
|
|
16
|
+
const page = new URL(url);
|
|
17
|
+
page.hash = '';
|
|
18
|
+
return page.href;
|
|
19
|
+
};
|
|
20
|
+
export const localSiteId = (url) => `site-${sha256Hex(pageOf(url)).slice(0, 16)}`;
|
|
21
|
+
const writePng = async (file, jpeg) => {
|
|
22
|
+
await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
23
|
+
await writeFile(file, await sharp(jpeg).png().toBuffer(), { mode: 0o600 });
|
|
24
|
+
};
|
|
25
|
+
export const addLocalSite = async (root, site) => {
|
|
26
|
+
const id = localSiteId(site.url);
|
|
27
|
+
// The same page again keeps its first screenshot.
|
|
28
|
+
if (((await loadWorkspaceAt(root, () => new Date())).workspace.sites ?? []).some((entry) => entry.referenceId === id))
|
|
29
|
+
return id;
|
|
30
|
+
await writePng(referenceFile(root, id, 'ref'), site.image);
|
|
31
|
+
await writePng(referenceFile(root, id, 'thumb'), site.thumb);
|
|
32
|
+
const { width, height } = await sharp(site.image).metadata();
|
|
33
|
+
await mutateWorkspace(root, (workspace) => {
|
|
34
|
+
const sites = workspace.sites ?? [];
|
|
35
|
+
if (sites.some((entry) => entry.referenceId === id))
|
|
36
|
+
return new NoWrite(undefined);
|
|
37
|
+
workspace.sites = [...sites, { referenceId: id, url: pageOf(site.url), title: site.title.slice(0, 200), why: site.why ? site.why.slice(0, 500) : null }];
|
|
38
|
+
workspace.references[id] = { referenceId: id, aspect: 'landscape', width: width ?? null, height: height ?? null, description: site.title.slice(0, 200), uiType: 'website' };
|
|
39
|
+
return undefined;
|
|
40
|
+
});
|
|
41
|
+
return id;
|
|
42
|
+
};
|
|
43
|
+
const started = new Set();
|
|
44
|
+
/** Gather once per workspace per server process; a workspace that already has its sites gathers nothing. */
|
|
45
|
+
export const startLocalReferences = (root, env = process.env) => {
|
|
46
|
+
if (started.has(root))
|
|
47
|
+
return;
|
|
48
|
+
started.add(root);
|
|
49
|
+
void (async () => {
|
|
50
|
+
const { workspace } = await loadWorkspaceAt(root, () => new Date());
|
|
51
|
+
const existing = (workspace.sites ?? []).map((site) => site.url);
|
|
52
|
+
if (existing.length >= SITE_TARGET)
|
|
53
|
+
return;
|
|
54
|
+
await gatherSiteReferences({
|
|
55
|
+
brief: workspace.brief.concept,
|
|
56
|
+
existing,
|
|
57
|
+
env,
|
|
58
|
+
progress: (line) => { process.stderr.write(`${line}\n`); },
|
|
59
|
+
push: async (site) => { await addLocalSite(root, site); },
|
|
60
|
+
});
|
|
61
|
+
})().catch((error) => { process.stderr.write(`12ui references: stopped: ${error instanceof Error ? error.message : String(error)}\n`); });
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=slate-site-references-local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-local.js","sourceRoot":"","sources":["../src/slate-site-references-local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The suggest step of the References tab: the person's own agent CLI, with live web search, names real websites that
|
|
3
|
+
* are relevant to the design request. Several run at once, each from its own angle, so the tab mixes direct
|
|
4
|
+
* competitors, the best of the category and design-forward neighbours. It costs the person their own agent's usage and
|
|
5
|
+
* nothing on 12ui.
|
|
6
|
+
*
|
|
7
|
+
* Codex runs `codex exec` without the person's config (their instructions and MCP servers are not this task's), in a
|
|
8
|
+
* read-only sandbox, ephemeral, with web search live and a JSON schema for the answer. Claude runs `claude -p` with
|
|
9
|
+
* only its web tools.
|
|
10
|
+
*/
|
|
11
|
+
export type SiteSuggestion = {
|
|
12
|
+
url: string;
|
|
13
|
+
name: string;
|
|
14
|
+
why: string;
|
|
15
|
+
angle: SuggestAngle;
|
|
16
|
+
};
|
|
17
|
+
export type SuggestAngle = 'competitors' | 'best' | 'adjacent';
|
|
18
|
+
export type SuggestEngine = {
|
|
19
|
+
kind: 'codex' | 'claude';
|
|
20
|
+
binary: string;
|
|
21
|
+
};
|
|
22
|
+
export declare const SUGGEST_ANGLES: readonly SuggestAngle[];
|
|
23
|
+
export declare const SITES_PER_ANGLE = 6;
|
|
24
|
+
export declare const suggestPrompt: (brief: string, angle: SuggestAngle) => string;
|
|
25
|
+
/** Claude when this runs under Claude Code, else Codex; whichever exists when the preferred one does not. */
|
|
26
|
+
export declare const chooseSuggestEngine: (env: NodeJS.ProcessEnv) => SuggestEngine | null;
|
|
27
|
+
/** The first JSON object in a text that has a `sites` list. */
|
|
28
|
+
export declare const parseSites: (text: string, angle: SuggestAngle) => SiteSuggestion[];
|
|
29
|
+
/** One angle's suggestions; an agent that fails or answers nothing gives none. */
|
|
30
|
+
export declare const suggestSites: (args: {
|
|
31
|
+
engine: SuggestEngine;
|
|
32
|
+
brief: string;
|
|
33
|
+
angle: SuggestAngle;
|
|
34
|
+
env: NodeJS.ProcessEnv;
|
|
35
|
+
}) => Promise<SiteSuggestion[]>;
|
|
36
|
+
//# sourceMappingURL=slate-site-references-suggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-suggest.d.ts","sourceRoot":"","sources":["../src/slate-site-references-suggest.ts"],"names":[],"mappings":"AAQA;;;;;;;;;GASG;AAEH,MAAM,MAAM,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAC7F,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAAwC,CAAC;AAC3F,eAAO,MAAM,eAAe,IAAI,CAAC;AASjC,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,OAAO,YAAY,KAAG,MAOvD,CAAC;AAiCb,6GAA6G;AAC7G,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,CAAC,UAAU,KAAG,aAAa,GAAG,IAO5E,CAAC;AAcF,+DAA+D;AAC/D,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,OAAO,YAAY,KAAG,cAAc,EAwB5E,CAAC;AAgCF,kFAAkF;AAClF,eAAO,MAAM,YAAY,GAAU,MAAM;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAAG,OAAO,CAAC,cAAc,EAAE,CAKxJ,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { accessSync, constants } from 'node:fs';
|
|
3
|
+
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { locateCodexBinary } from './codex-binary.js';
|
|
7
|
+
export const SUGGEST_ANGLES = ['competitors', 'best', 'adjacent'];
|
|
8
|
+
export const SITES_PER_ANGLE = 6;
|
|
9
|
+
const SUGGEST_TIMEOUT_MS = 240_000;
|
|
10
|
+
const ANGLE_ASK = {
|
|
11
|
+
competitors: 'direct competitors: companies that offer the same kind of product or service to the same people',
|
|
12
|
+
best: 'the best-designed websites in this category, the ones designers point to as the standard',
|
|
13
|
+
adjacent: 'design-forward websites from neighbouring categories whose look and layout would inspire this design',
|
|
14
|
+
};
|
|
15
|
+
export const suggestPrompt = (brief, angle) => [
|
|
16
|
+
`A designer is about to design this: ${brief}`,
|
|
17
|
+
'',
|
|
18
|
+
`Find ${SITES_PER_ANGLE} real, live websites that are ${ANGLE_ASK[angle]}.`,
|
|
19
|
+
'Use web search to make sure each one exists today. Give the exact page to look at (usually the homepage), the brand',
|
|
20
|
+
'name, and one short line on what is worth seeing in its design. Only public websites a browser can open without',
|
|
21
|
+
'signing in: no marketplaces, app stores, articles, directories or social media. Be quick: a few searches are enough.',
|
|
22
|
+
].join('\n');
|
|
23
|
+
const SCHEMA = {
|
|
24
|
+
type: 'object',
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
required: ['sites'],
|
|
27
|
+
properties: {
|
|
28
|
+
sites: {
|
|
29
|
+
type: 'array',
|
|
30
|
+
items: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
required: ['url', 'name', 'why'],
|
|
34
|
+
properties: { url: { type: 'string' }, name: { type: 'string' }, why: { type: 'string' } },
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const onPath = (env, name) => {
|
|
40
|
+
for (const directory of (env.PATH ?? '').split(path.delimiter)) {
|
|
41
|
+
if (directory === '')
|
|
42
|
+
continue;
|
|
43
|
+
const candidate = path.join(directory, name);
|
|
44
|
+
try {
|
|
45
|
+
accessSync(candidate, constants.X_OK);
|
|
46
|
+
return candidate;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// not here
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
};
|
|
54
|
+
/** Claude when this runs under Claude Code, else Codex; whichever exists when the preferred one does not. */
|
|
55
|
+
export const chooseSuggestEngine = (env) => {
|
|
56
|
+
const codex = locateCodexBinary(env)?.binary ?? null;
|
|
57
|
+
const claude = onPath(env, 'claude');
|
|
58
|
+
const preferClaude = env.CLAUDECODE === '1';
|
|
59
|
+
if (preferClaude && claude)
|
|
60
|
+
return { kind: 'claude', binary: claude };
|
|
61
|
+
if (codex)
|
|
62
|
+
return { kind: 'codex', binary: codex };
|
|
63
|
+
return claude ? { kind: 'claude', binary: claude } : null;
|
|
64
|
+
};
|
|
65
|
+
const run = (binary, args, options) => (new Promise((resolve, reject) => {
|
|
66
|
+
const child = spawn(binary, args, { cwd: options.cwd, env: options.env, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
67
|
+
let stdout = '';
|
|
68
|
+
child.stdout.setEncoding('utf8').on('data', (chunk) => { stdout += chunk; });
|
|
69
|
+
child.stderr.resume();
|
|
70
|
+
const timer = setTimeout(() => { child.kill('SIGTERM'); }, SUGGEST_TIMEOUT_MS);
|
|
71
|
+
child.on('error', (error) => { clearTimeout(timer); reject(error); });
|
|
72
|
+
child.on('close', (code) => { clearTimeout(timer); resolve({ code, stdout }); });
|
|
73
|
+
}));
|
|
74
|
+
/** The first JSON object in a text that has a `sites` list. */
|
|
75
|
+
export const parseSites = (text, angle) => {
|
|
76
|
+
const start = text.indexOf('{');
|
|
77
|
+
const end = text.lastIndexOf('}');
|
|
78
|
+
if (start < 0 || end <= start)
|
|
79
|
+
return [];
|
|
80
|
+
let value;
|
|
81
|
+
try {
|
|
82
|
+
value = JSON.parse(text.slice(start, end + 1));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
const sites = value.sites;
|
|
88
|
+
if (!Array.isArray(sites))
|
|
89
|
+
return [];
|
|
90
|
+
return sites.flatMap((entry) => {
|
|
91
|
+
if (!entry || typeof entry !== 'object')
|
|
92
|
+
return [];
|
|
93
|
+
const { url, name, why } = entry;
|
|
94
|
+
if (typeof url !== 'string')
|
|
95
|
+
return [];
|
|
96
|
+
try {
|
|
97
|
+
const parsed = new URL(url.trim());
|
|
98
|
+
if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:')
|
|
99
|
+
return [];
|
|
100
|
+
return [{ url: parsed.href, name: typeof name === 'string' ? name.trim() : '', why: typeof why === 'string' ? why.trim() : '', angle }];
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const suggestWithCodex = async (engine, prompt, angle, env) => {
|
|
108
|
+
const dir = await mkdtemp(path.join(tmpdir(), '12ui-sites-'));
|
|
109
|
+
try {
|
|
110
|
+
const schema = path.join(dir, 'schema.json');
|
|
111
|
+
const out = path.join(dir, 'answer.json');
|
|
112
|
+
await writeFile(schema, JSON.stringify(SCHEMA));
|
|
113
|
+
await run(engine.binary, [
|
|
114
|
+
'exec', '--ignore-user-config', '--ephemeral', '--skip-git-repo-check', '-s', 'read-only',
|
|
115
|
+
'-c', 'web_search="live"', '-c', 'model_reasoning_effort="low"',
|
|
116
|
+
'--output-schema', schema, '-o', out, prompt,
|
|
117
|
+
], { cwd: dir, env });
|
|
118
|
+
return parseSites(await readFile(out, 'utf8').catch(() => ''), angle);
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
await rm(dir, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const suggestWithClaude = async (engine, prompt, angle, env) => {
|
|
125
|
+
const dir = await mkdtemp(path.join(tmpdir(), '12ui-sites-'));
|
|
126
|
+
try {
|
|
127
|
+
const answer = await run(engine.binary, [
|
|
128
|
+
'-p', `${prompt}\n\nAnswer with only this JSON and nothing else: {"sites":[{"url":"...","name":"...","why":"..."}]}`,
|
|
129
|
+
'--allowedTools', 'WebSearch,WebFetch', '--output-format', 'text', '--model', 'sonnet',
|
|
130
|
+
], { cwd: dir, env });
|
|
131
|
+
return parseSites(answer.stdout, angle);
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
await rm(dir, { recursive: true, force: true });
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
/** One angle's suggestions; an agent that fails or answers nothing gives none. */
|
|
138
|
+
export const suggestSites = async (args) => {
|
|
139
|
+
const prompt = suggestPrompt(args.brief, args.angle);
|
|
140
|
+
return args.engine.kind === 'codex'
|
|
141
|
+
? await suggestWithCodex(args.engine, prompt, args.angle, args.env)
|
|
142
|
+
: await suggestWithClaude(args.engine, prompt, args.angle, args.env);
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=slate-site-references-suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references-suggest.js","sourceRoot":"","sources":["../src/slate-site-references-suggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type CapturedSite } from './slate-site-references-capture.js';
|
|
2
|
+
import { type SitePush } from './slate-site-references-client.js';
|
|
3
|
+
import { type SiteSuggestion, type SuggestAngle, type SuggestEngine } from './slate-site-references-suggest.js';
|
|
4
|
+
import type { DrawFetch } from './workspace-draw-client.js';
|
|
5
|
+
/**
|
|
6
|
+
* The References tab's gathering, start to finish: several agents suggest real sites from different angles at once,
|
|
7
|
+
* each suggestion is captured as soon as its agent answers, and each screenshot is pushed the moment it is taken, so
|
|
8
|
+
* the tab fills while the person looks at it. About a dozen sites, one per domain, the angles interleaved; a site that
|
|
9
|
+
* fails is skipped and the next suggestion takes its place.
|
|
10
|
+
*/
|
|
11
|
+
export declare const SITE_TARGET = 12;
|
|
12
|
+
export type GatherReport = {
|
|
13
|
+
engine: SuggestEngine['kind'] | null;
|
|
14
|
+
suggested: number;
|
|
15
|
+
pushed: number;
|
|
16
|
+
firstMs: number | null;
|
|
17
|
+
lastMs: number | null;
|
|
18
|
+
};
|
|
19
|
+
export type GatherDependencies = {
|
|
20
|
+
suggest?: (args: {
|
|
21
|
+
engine: SuggestEngine;
|
|
22
|
+
brief: string;
|
|
23
|
+
angle: SuggestAngle;
|
|
24
|
+
env: NodeJS.ProcessEnv;
|
|
25
|
+
}) => Promise<SiteSuggestion[]>;
|
|
26
|
+
openCapture?: () => Promise<{
|
|
27
|
+
capture: (url: string) => Promise<CapturedSite | null>;
|
|
28
|
+
close: () => Promise<void>;
|
|
29
|
+
}>;
|
|
30
|
+
now?: () => number;
|
|
31
|
+
};
|
|
32
|
+
/** What the agents are told the design is: the request, plus the short visual caption when there is one. */
|
|
33
|
+
export declare const briefText: (concept: string, corpusQuery: string | null) => string;
|
|
34
|
+
export declare const gatherSiteReferences: (args: {
|
|
35
|
+
brief: string;
|
|
36
|
+
/** Pages already in the workspace: their domains are not suggested again, and they count toward the target. */
|
|
37
|
+
existing: string[];
|
|
38
|
+
target?: number;
|
|
39
|
+
env: NodeJS.ProcessEnv;
|
|
40
|
+
progress: (line: string) => void;
|
|
41
|
+
push: (site: SitePush) => Promise<void>;
|
|
42
|
+
deps?: GatherDependencies;
|
|
43
|
+
}) => Promise<GatherReport>;
|
|
44
|
+
/**
|
|
45
|
+
* The hosted workspace's gathering: reads the request and the sites already added through the upload token, gathers,
|
|
46
|
+
* and pushes each site to design.12ui.com. A workspace that already has its references gathers nothing.
|
|
47
|
+
*/
|
|
48
|
+
export declare const gatherWorkspaceReferences: (args: {
|
|
49
|
+
origin: string;
|
|
50
|
+
token: string;
|
|
51
|
+
cliVersion: string;
|
|
52
|
+
env: NodeJS.ProcessEnv;
|
|
53
|
+
progress: (line: string) => void;
|
|
54
|
+
fetch?: DrawFetch;
|
|
55
|
+
deps?: GatherDependencies;
|
|
56
|
+
}) => Promise<GatherReport | null>;
|
|
57
|
+
//# sourceMappingURL=slate-site-references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-site-references.d.ts","sourceRoot":"","sources":["../src/slate-site-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAAqD,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnK,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;;;GAKG;AAEH,eAAO,MAAM,WAAW,KAAK,CAAC;AAK9B,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEtJ,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACrI,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;IACpH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAUF,4GAA4G;AAC5G,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,EAAE,aAAa,MAAM,GAAG,IAAI,KAAG,MAEvE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,+GAA+G;IAC/G,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B,KAAG,OAAO,CAAC,YAAY,CAgFvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GAAU,MAAM;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B,KAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAY9B,CAAC"}
|