@12ui/design 0.2.82 → 0.2.84
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 +4 -1
- package/SKILL.md +1 -1
- package/dist/branch-execution.d.ts.map +1 -1
- package/dist/branch-execution.js +6 -0
- package/dist/branch-execution.js.map +1 -1
- package/dist/branch-materialize.d.ts.map +1 -1
- package/dist/branch-materialize.js +6 -2
- package/dist/branch-materialize.js.map +1 -1
- package/dist/cli-capabilities.d.ts +2 -5
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +2 -2
- package/dist/cli-capabilities.js.map +1 -1
- package/dist/cli-help/conversion.d.ts +1 -1
- package/dist/cli-help/conversion.js +1 -1
- package/dist/cli-help/conversion.js.map +1 -1
- package/dist/cli-help/index.d.ts +1 -1
- package/dist/cli-image-backend.d.ts +6 -1
- package/dist/cli-image-backend.d.ts.map +1 -1
- package/dist/cli-image-backend.js +8 -3
- package/dist/cli-image-backend.js.map +1 -1
- package/dist/cli-local-runtime.d.ts +6 -0
- package/dist/cli-local-runtime.d.ts.map +1 -1
- package/dist/cli-local-runtime.js +14 -1
- package/dist/cli-local-runtime.js.map +1 -1
- package/dist/cli-usage.js +3 -3
- 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/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +24 -1
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/mcp-slate-tool-defs.d.ts.map +1 -1
- package/dist/mcp-slate-tool-defs.js +3 -2
- package/dist/mcp-slate-tool-defs.js.map +1 -1
- package/dist/mcp-slate-ui-copy.d.ts +10 -0
- package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
- package/dist/mcp-slate-ui-copy.js +9 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- 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 +5 -0
- package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -1
- package/dist/mcp-slate-ui-script-board.d.ts +19 -0
- package/dist/mcp-slate-ui-script-board.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-board.js +126 -0
- package/dist/mcp-slate-ui-script-board.js.map +1 -0
- package/dist/mcp-slate-ui-script-designs.d.ts +1 -1
- package/dist/mcp-slate-ui-script-designs.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-designs.js +24 -15
- package/dist/mcp-slate-ui-script-designs.js.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +5 -2
- package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-collage.js +9 -5
- package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts +7 -4
- package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-gallery.js +46 -5
- package/dist/mcp-slate-ui-script-inspiration-gallery.js.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-inspiration-grid.js +4 -0
- package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -1
- package/dist/mcp-slate-ui-script-pause.d.ts +4 -0
- package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-pause.js +9 -2
- package/dist/mcp-slate-ui-script-pause.js.map +1 -1
- package/dist/mcp-slate-ui-script-peek.d.ts +16 -0
- package/dist/mcp-slate-ui-script-peek.d.ts.map +1 -0
- package/dist/mcp-slate-ui-script-peek.js +89 -0
- package/dist/mcp-slate-ui-script-peek.js.map +1 -0
- package/dist/mcp-slate-ui-script-references.d.ts +4 -2
- package/dist/mcp-slate-ui-script-references.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-references.js +39 -7
- package/dist/mcp-slate-ui-script-references.js.map +1 -1
- package/dist/mcp-slate-ui-script-remote.js +2 -2
- package/dist/mcp-slate-ui-script-viewer.d.ts +7 -2
- package/dist/mcp-slate-ui-script-viewer.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script-viewer.js +183 -50
- package/dist/mcp-slate-ui-script-viewer.js.map +1 -1
- package/dist/mcp-slate-ui-script.d.ts.map +1 -1
- package/dist/mcp-slate-ui-script.js +4 -0
- package/dist/mcp-slate-ui-script.js.map +1 -1
- package/dist/mcp-slate-ui-styles-board.d.ts +7 -0
- package/dist/mcp-slate-ui-styles-board.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-board.js +30 -0
- package/dist/mcp-slate-ui-styles-board.js.map +1 -0
- package/dist/mcp-slate-ui-styles-designs.d.ts +2 -1
- package/dist/mcp-slate-ui-styles-designs.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles-designs.js +10 -8
- package/dist/mcp-slate-ui-styles-designs.js.map +1 -1
- package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles-inspiration.js +13 -2
- package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -1
- package/dist/mcp-slate-ui-styles-loading.d.ts +18 -0
- package/dist/mcp-slate-ui-styles-loading.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-loading.js +37 -0
- package/dist/mcp-slate-ui-styles-loading.js.map +1 -0
- package/dist/mcp-slate-ui-styles-peek.d.ts +8 -0
- package/dist/mcp-slate-ui-styles-peek.d.ts.map +1 -0
- package/dist/mcp-slate-ui-styles-peek.js +13 -0
- package/dist/mcp-slate-ui-styles-peek.js.map +1 -0
- package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
- package/dist/mcp-slate-ui-styles.js +0 -3
- package/dist/mcp-slate-ui-styles.js.map +1 -1
- package/dist/mcp-slate-ui.d.ts.map +1 -1
- package/dist/mcp-slate-ui.js +4 -1
- package/dist/mcp-slate-ui.js.map +1 -1
- package/dist/prototype-browsers.d.ts +10 -2
- package/dist/prototype-browsers.d.ts.map +1 -1
- package/dist/prototype-browsers.js +27 -2
- package/dist/prototype-browsers.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/slate-actions.d.ts +6 -7
- package/dist/slate-actions.d.ts.map +1 -1
- package/dist/slate-actions.js +6 -9
- package/dist/slate-actions.js.map +1 -1
- package/dist/slate-branch-runner.d.ts +120 -0
- package/dist/slate-branch-runner.d.ts.map +1 -0
- package/dist/slate-branch-runner.js +312 -0
- package/dist/slate-branch-runner.js.map +1 -0
- package/dist/slate-captions-local.d.ts +14 -0
- package/dist/slate-captions-local.d.ts.map +1 -0
- package/dist/slate-captions-local.js +70 -0
- package/dist/slate-captions-local.js.map +1 -0
- package/dist/slate-captions-remote.d.ts +29 -0
- package/dist/slate-captions-remote.d.ts.map +1 -0
- package/dist/slate-captions-remote.js +65 -0
- package/dist/slate-captions-remote.js.map +1 -0
- package/dist/slate-captions.d.ts +41 -0
- package/dist/slate-captions.d.ts.map +1 -0
- package/dist/slate-captions.js +112 -0
- package/dist/slate-captions.js.map +1 -0
- package/dist/slate-commit.d.ts.map +1 -1
- package/dist/slate-commit.js +8 -6
- package/dist/slate-commit.js.map +1 -1
- package/dist/slate-image-executor.d.ts +18 -3
- package/dist/slate-image-executor.d.ts.map +1 -1
- package/dist/slate-image-executor.js +18 -5
- package/dist/slate-image-executor.js.map +1 -1
- package/dist/slate-paths.d.ts +3 -1
- package/dist/slate-paths.d.ts.map +1 -1
- package/dist/slate-paths.js +8 -2
- package/dist/slate-paths.js.map +1 -1
- package/dist/slate-round-prompt.d.ts +0 -12
- package/dist/slate-round-prompt.d.ts.map +1 -1
- package/dist/slate-round-prompt.js +0 -15
- 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 +8 -14
- package/dist/slate-round-runner.js.map +1 -1
- package/dist/slate-runner-context.d.ts +3 -0
- package/dist/slate-runner-context.d.ts.map +1 -1
- package/dist/slate-runner-context.js.map +1 -1
- package/dist/slate-runner-main.d.ts +3 -0
- package/dist/slate-runner-main.d.ts.map +1 -1
- package/dist/slate-runner-main.js +5 -1
- package/dist/slate-runner-main.js.map +1 -1
- package/dist/slate-runner-spawn.js +2 -2
- package/dist/slate-runner-spawn.js.map +1 -1
- package/dist/slate-site-references-capture.d.ts +38 -1
- package/dist/slate-site-references-capture.d.ts.map +1 -1
- package/dist/slate-site-references-capture.js +25 -7
- package/dist/slate-site-references-capture.js.map +1 -1
- package/dist/slate-site-references-client.d.ts +13 -1
- package/dist/slate-site-references-client.d.ts.map +1 -1
- package/dist/slate-site-references-client.js +39 -14
- package/dist/slate-site-references-client.js.map +1 -1
- package/dist/slate-site-references-local.d.ts +3 -0
- package/dist/slate-site-references-local.d.ts.map +1 -1
- package/dist/slate-site-references-local.js +20 -1
- package/dist/slate-site-references-local.js.map +1 -1
- package/dist/slate-site-references-suggest.d.ts +25 -2
- package/dist/slate-site-references-suggest.d.ts.map +1 -1
- package/dist/slate-site-references-suggest.js +71 -12
- package/dist/slate-site-references-suggest.js.map +1 -1
- package/dist/slate-site-references.d.ts +11 -0
- package/dist/slate-site-references.d.ts.map +1 -1
- package/dist/slate-site-references.js +42 -3
- package/dist/slate-site-references.js.map +1 -1
- package/dist/slate-view-contract.d.ts +39 -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 +8 -0
- package/dist/slate-view.js.map +1 -1
- package/dist/slate-workspace-parse.d.ts.map +1 -1
- package/dist/slate-workspace-parse.js +35 -0
- package/dist/slate-workspace-parse.js.map +1 -1
- package/dist/slate-workspace-types.d.ts +31 -2
- package/dist/slate-workspace-types.d.ts.map +1 -1
- package/dist/workspace-draw-branch.d.ts +27 -0
- package/dist/workspace-draw-branch.d.ts.map +1 -0
- package/dist/workspace-draw-branch.js +101 -0
- package/dist/workspace-draw-branch.js.map +1 -0
- package/dist/workspace-draw-client.d.ts +27 -0
- package/dist/workspace-draw-client.d.ts.map +1 -1
- package/dist/workspace-draw-client.js +30 -0
- package/dist/workspace-draw-client.js.map +1 -1
- package/dist/workspace-draw-codex.d.ts +10 -7
- package/dist/workspace-draw-codex.d.ts.map +1 -1
- package/dist/workspace-draw-codex.js +41 -16
- package/dist/workspace-draw-codex.js.map +1 -1
- package/dist/workspace-draw-run.d.ts +19 -3
- package/dist/workspace-draw-run.d.ts.map +1 -1
- package/dist/workspace-draw-run.js +48 -6
- package/dist/workspace-draw-run.js.map +1 -1
- package/dist/workspace-draw-types.d.ts +23 -2
- package/dist/workspace-draw-types.d.ts.map +1 -1
- package/dist/workspace-draw-types.js.map +1 -1
- package/dist/workspace-runner-main.d.ts +9 -2
- package/dist/workspace-runner-main.d.ts.map +1 -1
- package/dist/workspace-runner-main.js +21 -2
- package/dist/workspace-runner-main.js.map +1 -1
- package/dist/workspace-runner-spawn.js +1 -1
- package/dist/workspace-runner-spawn.js.map +1 -1
- package/open-design.json +2 -2
- package/package.json +1 -1
- package/runtime/codex-conversion/bin/convert.mjs +1 -1
- package/runtime/codex-conversion/src/codex/caller-home.mjs +95 -0
- package/runtime/codex-conversion/src/codex/home.mjs +8 -2
- package/runtime/codex-conversion/src/images/execute.mjs +1 -1
- package/runtime/codex-conversion/src/images/native-invoke.mjs +21 -13
- package/runtime/codex-conversion/src/images/native-records.mjs +3 -1
- package/runtime/codex-conversion/src/images/native.mjs +42 -19
- package/runtime/codex-conversion/src/run.mjs +2 -1
- package/skills/12ui-design/SKILL.md +6 -6
- package/skills/12ui-design/outputs.md +1 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import sharp from 'sharp';
|
|
6
|
+
import { generationVersionId, sha256Hex, slotFor } from './slate-ids.js';
|
|
7
|
+
import { nextOptionLabels } from './slate-labels.js';
|
|
8
|
+
import { branchRunDirectory, ensureRealDirectory, versionImageFile } from './slate-paths.js';
|
|
9
|
+
import { failure, patchOp, setPhase } from './slate-runner-context.js';
|
|
10
|
+
import { readVersionBytes, writeImageOnce } from './slate-versions.js';
|
|
11
|
+
import { findRound, loadWorkspaceAt } from './slate-workspace-store.js';
|
|
12
|
+
const POLL_MS = 1_500;
|
|
13
|
+
/**
|
|
14
|
+
* The branch service's own caps (workers/api/src/create/branchPlan.ts): at most 8 screens (slots a-h) across the
|
|
15
|
+
* source page and at most 4 more pages. Equal to the hosted store's `SLATE_BRANCH.planScreensMax` / `planPagesMax`
|
|
16
|
+
* (workers/api/src/slate/limits.ts).
|
|
17
|
+
*/
|
|
18
|
+
const MAX_PAGES = 5;
|
|
19
|
+
const MAX_SCREENS = 8;
|
|
20
|
+
/** The default launch: this CLI's own `branch execute`, with the runner's environment (the stored 12ui sign-in under HOME). */
|
|
21
|
+
export const spawnBranchExecute = (args) => {
|
|
22
|
+
const cliPath = fileURLToPath(new URL('./cli.js', import.meta.url));
|
|
23
|
+
const child = spawn(process.execPath, [cliPath, ...args.argv], { cwd: args.cwd, stdio: 'ignore', env: process.env });
|
|
24
|
+
return {
|
|
25
|
+
exited: new Promise((resolve) => {
|
|
26
|
+
child.once('error', () => { resolve(1); });
|
|
27
|
+
child.once('exit', (code) => { resolve(code ?? 1); });
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* THE flow policy, as the web /branch board's (apps/web/src/pages/branch/branchColumns.ts): only a planned `web_page`
|
|
33
|
+
* is one continuous document; every other surface's screens are complete states, each with its own shell.
|
|
34
|
+
*/
|
|
35
|
+
const flowOf = (surfaceType) => (surfaceType === undefined || surfaceType === 'web_page' ? 'page' : 'states');
|
|
36
|
+
/** The board's screens from its pages in board order: the one rule both stores (and the runner) place screens by. */
|
|
37
|
+
export const boardPlaces = (pages) => {
|
|
38
|
+
const out = [];
|
|
39
|
+
let column = 0;
|
|
40
|
+
pages.forEach((page, i) => {
|
|
41
|
+
column = page.source && i === 0 ? 0 : column + 1;
|
|
42
|
+
for (let row = 0; row < page.screens && out.length < MAX_SCREENS; row++)
|
|
43
|
+
out.push({ title: page.title, place: { column, screen: row, flow: page.flow } });
|
|
44
|
+
});
|
|
45
|
+
return out;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* The board of a plan: its pages in board order (the page that continues the design first, as column 0; then the rest
|
|
49
|
+
* in plan order, as columns 1, 2, ...) and every screen in that order, each page's screens by viewport. A screen's
|
|
50
|
+
* position in `screens` is its option's position: the server and the local store make the options in this order.
|
|
51
|
+
*/
|
|
52
|
+
export const boardOf = (plan) => {
|
|
53
|
+
const first = plan.pages.find((page) => page.startsFromWinner);
|
|
54
|
+
const ordered = (first ? [first, ...plan.pages.filter((page) => page !== first)] : plan.pages).slice(0, MAX_PAGES);
|
|
55
|
+
const pages = [];
|
|
56
|
+
const slots = [];
|
|
57
|
+
for (const page of ordered) {
|
|
58
|
+
const own = plan.screens.filter((screen) => screen.pageIndex === page.index).sort((a, b) => a.viewportOrdinal - b.viewportOrdinal);
|
|
59
|
+
if (own.length === 0)
|
|
60
|
+
continue;
|
|
61
|
+
pages.push({ title: page.title, flow: page.flow, source: page === first, screens: own.length });
|
|
62
|
+
slots.push(...own.map((screen) => screen.slot));
|
|
63
|
+
}
|
|
64
|
+
const places = boardPlaces(pages);
|
|
65
|
+
return { pages, screens: places.map((entry, i) => ({ slot: slots[i], ...entry })) };
|
|
66
|
+
};
|
|
67
|
+
const readJson = async (file) => {
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null; // not written yet, or caught mid-write: the next poll reads it whole
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
76
|
+
export const readBranchPlan = async (branchDir) => {
|
|
77
|
+
const raw = await readJson(path.join(branchDir, 'branch.plan.json'));
|
|
78
|
+
if (!isRecord(raw) || !Array.isArray(raw.pages) || !Array.isArray(raw.screens))
|
|
79
|
+
return null;
|
|
80
|
+
const pages = raw.pages.filter(isRecord).map((page) => ({
|
|
81
|
+
index: Number(page.index),
|
|
82
|
+
title: String(page.title ?? '').replace(/\s+/gu, ' ').trim().slice(0, 60),
|
|
83
|
+
startsFromWinner: page.startsFromWinner === true,
|
|
84
|
+
flow: flowOf(page.surfaceType),
|
|
85
|
+
})).filter((page) => Number.isInteger(page.index)).sort((a, b) => a.index - b.index);
|
|
86
|
+
const screens = raw.screens.filter(isRecord).map((screen) => ({
|
|
87
|
+
slot: String(screen.slot ?? ''),
|
|
88
|
+
pageIndex: Number(screen.pageIndex),
|
|
89
|
+
viewportOrdinal: Number(screen.viewportOrdinal),
|
|
90
|
+
status: String(screen.status ?? 'pending'),
|
|
91
|
+
})).filter((screen) => /^[a-z0-9-]{1,32}$/u.test(screen.slot));
|
|
92
|
+
// A page with no screens of its own is the design itself (the page a site branch grows from): nothing new to land.
|
|
93
|
+
const drawn = pages.filter((page) => screens.some((screen) => screen.pageIndex === page.index));
|
|
94
|
+
return drawn.length > 0 ? { pages: drawn, screens } : null;
|
|
95
|
+
};
|
|
96
|
+
/** Screen status from the live progress record, falling back to the plan's (a run that never reported progress). */
|
|
97
|
+
const readStatuses = async (branchDir, plan) => {
|
|
98
|
+
const statuses = new Map(plan.screens.map((screen) => [screen.slot, screen.status]));
|
|
99
|
+
const progress = await readJson(path.join(branchDir, 'branch.progress.json'));
|
|
100
|
+
if (isRecord(progress) && Array.isArray(progress.screens)) {
|
|
101
|
+
for (const screen of progress.screens.filter(isRecord)) {
|
|
102
|
+
if (typeof screen.slot === 'string' && typeof screen.status === 'string')
|
|
103
|
+
statuses.set(screen.slot, screen.status);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return statuses;
|
|
107
|
+
};
|
|
108
|
+
const SETTLED = new Set(['succeeded', 'failed', 'blocked']);
|
|
109
|
+
/** A screen's bytes: staged while the run goes on, moved into `screens/` when it ends; decoded whole or not at all. */
|
|
110
|
+
const readScreen = async (branchDir, slot) => {
|
|
111
|
+
for (const file of [
|
|
112
|
+
path.join(branchDir, 'screens', `${slot}.png`),
|
|
113
|
+
path.join(branchDir, 'screens', '.12ui-branch-staging', `${slot}.png.part`),
|
|
114
|
+
]) {
|
|
115
|
+
const bytes = await readFile(file).catch(() => null);
|
|
116
|
+
if (!bytes)
|
|
117
|
+
continue;
|
|
118
|
+
try {
|
|
119
|
+
return await sharp(bytes, { failOn: 'warning' }).png().toBuffer();
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null; // written as we read: the next poll reads it whole
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* The words `branch execute` plans from: the workspace brief, as the web /branch page sends its prompt (Branch.tsx
|
|
129
|
+
* `startBranch`: the brief, trimmed, nothing added). The same design and brief then get the web's plan: the page the
|
|
130
|
+
* design starts continued below the fold, the planner's other pages, the same header, footer and screen cap.
|
|
131
|
+
* The scope is no sentence: `--scope page` keeps that plan's source page (the web board's first column), `site` all of
|
|
132
|
+
* it. Page names the person gave are the one addition, said the way a person on the web writes them into the brief:
|
|
133
|
+
* what the rest of the product must cover.
|
|
134
|
+
*/
|
|
135
|
+
export const branchConcept = (params) => {
|
|
136
|
+
const brief = params.concept.trim();
|
|
137
|
+
const pages = params.scope === 'site' ? params.pages ?? [] : [];
|
|
138
|
+
if (pages.length === 0)
|
|
139
|
+
return brief;
|
|
140
|
+
const lead = brief === '' || /[.!?]$/u.test(brief) ? brief : `${brief}.`;
|
|
141
|
+
return `${lead} The rest of the product must cover these pages: ${pages.join(', ')}.`.trim();
|
|
142
|
+
};
|
|
143
|
+
/** One pass: report the board and its screens, and land every screen that has settled (every screen, at the end). */
|
|
144
|
+
const sync = async (hooks, branchDir, final) => {
|
|
145
|
+
const plan = await readBranchPlan(branchDir);
|
|
146
|
+
if (!plan)
|
|
147
|
+
return false;
|
|
148
|
+
const statuses = await readStatuses(branchDir, plan);
|
|
149
|
+
const board = boardOf(plan);
|
|
150
|
+
const ready = board.screens.filter((screen) => statuses.get(screen.slot) === 'succeeded').length;
|
|
151
|
+
await hooks.progress(board.pages, { ready, total: board.screens.length });
|
|
152
|
+
for (const [position, screen] of board.screens.entries()) {
|
|
153
|
+
if (await hooks.settled(position))
|
|
154
|
+
continue;
|
|
155
|
+
const status = statuses.get(screen.slot) ?? '';
|
|
156
|
+
if (status === 'succeeded') {
|
|
157
|
+
const bytes = await readScreen(branchDir, screen.slot);
|
|
158
|
+
if (bytes || final)
|
|
159
|
+
await hooks.land(position, screen, bytes);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (final || SETTLED.has(status))
|
|
163
|
+
await hooks.land(position, screen, null);
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Runs `12ui branch execute` from `source` in `runDir` (resuming the recorded run when there is one) and follows what
|
|
169
|
+
* it records until it exits: the local runner's branch round and the hosted workspace's branch op
|
|
170
|
+
* (workspace-draw-branch.ts) both land their pages through `hooks`. `planned` says whether its plan ever named a page.
|
|
171
|
+
*/
|
|
172
|
+
export const followBranchRun = async (args) => {
|
|
173
|
+
const branchDir = path.join(args.runDir, 'branch');
|
|
174
|
+
await mkdir(args.runDir, { recursive: true, mode: 0o700 });
|
|
175
|
+
const start = path.join(args.runDir, 'start.png');
|
|
176
|
+
if (!(await access(start).then(() => true, () => false)))
|
|
177
|
+
await writeFile(start, args.source, { mode: 0o600 });
|
|
178
|
+
const resumed = await access(path.join(branchDir, 'branch.attempt.json')).then(() => true, () => false);
|
|
179
|
+
const argv = ['branch', 'execute', '--start', start, '--scope', args.scope, '--concept', args.concept, '--out-dir', args.runDir, '--quiet', ...(resumed ? ['--resume'] : [])];
|
|
180
|
+
await args.log({ event: 'branch_started', scope: args.scope, resumed });
|
|
181
|
+
const child = args.launch({ cwd: args.runDir, argv });
|
|
182
|
+
const exit = { code: null };
|
|
183
|
+
void child.exited.then((value) => { exit.code = value; });
|
|
184
|
+
while (exit.code === null) {
|
|
185
|
+
await sync(args.hooks, branchDir, false);
|
|
186
|
+
await Promise.race([args.sleep(POLL_MS), child.exited]);
|
|
187
|
+
}
|
|
188
|
+
const planned = await sync(args.hooks, branchDir, true);
|
|
189
|
+
await args.log({ event: 'branch_finished', exitCode: exit.code });
|
|
190
|
+
return { exitCode: exit.code, planned, branchDir };
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* The board's screens become this round's options, once: one per screen, in board order, each with its page's title
|
|
194
|
+
* and its place on the board (the same options the hosted store makes from the same report: store/entities.ts).
|
|
195
|
+
*/
|
|
196
|
+
const addScreens = async (env, params, pages) => {
|
|
197
|
+
let added = false;
|
|
198
|
+
await patchOp(env, (_op, ws) => {
|
|
199
|
+
if (ws.candidates.some((candidate) => candidate.roundId === params.roundId))
|
|
200
|
+
return;
|
|
201
|
+
const places = boardPlaces(pages);
|
|
202
|
+
const labels = nextOptionLabels(ws.candidates.map((candidate) => candidate.label), places.length);
|
|
203
|
+
places.forEach((entry, i) => {
|
|
204
|
+
ws.candidates.push({
|
|
205
|
+
candidateId: `${params.roundId}_${slotFor(i)}`,
|
|
206
|
+
label: labels[i],
|
|
207
|
+
roundId: params.roundId,
|
|
208
|
+
localSlot: null,
|
|
209
|
+
referenceId: null,
|
|
210
|
+
...(entry.title ? { page: entry.title } : {}),
|
|
211
|
+
place: entry.place,
|
|
212
|
+
versionIds: [],
|
|
213
|
+
latestOpId: env.opId,
|
|
214
|
+
error: null,
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
findRound(ws, params.roundId).count = Math.max(1, places.length);
|
|
218
|
+
added = true;
|
|
219
|
+
});
|
|
220
|
+
if (added)
|
|
221
|
+
await env.log({ event: 'branch_planned', pages: pages.map((page) => `${page.title} (${page.screens})`) });
|
|
222
|
+
};
|
|
223
|
+
const landPage = async (env, params, candidateId, slot, png) => {
|
|
224
|
+
const facts = await sharp(png).metadata();
|
|
225
|
+
const sha256 = sha256Hex(png);
|
|
226
|
+
const versionId = generationVersionId(params.roundId, slot);
|
|
227
|
+
await writeImageOnce(versionImageFile(env.root, versionId), png, sha256);
|
|
228
|
+
await patchOp(env, (op, ws) => {
|
|
229
|
+
const candidate = ws.candidates.find((entry) => entry.candidateId === candidateId);
|
|
230
|
+
if (!candidate || ws.versions.some((entry) => entry.versionId === versionId))
|
|
231
|
+
return;
|
|
232
|
+
ws.versions.push({
|
|
233
|
+
versionId,
|
|
234
|
+
candidateId,
|
|
235
|
+
n: 1,
|
|
236
|
+
kind: 'generation',
|
|
237
|
+
parentVersionId: null,
|
|
238
|
+
opId: env.opId,
|
|
239
|
+
prompt: null,
|
|
240
|
+
sentPromptSha256: null,
|
|
241
|
+
marks: null,
|
|
242
|
+
sha256,
|
|
243
|
+
width: facts.width ?? 1,
|
|
244
|
+
height: facts.height ?? 1,
|
|
245
|
+
createdAt: env.clock.now().toISOString(),
|
|
246
|
+
});
|
|
247
|
+
candidate.versionIds.push(versionId);
|
|
248
|
+
candidate.error = null;
|
|
249
|
+
op.resultVersionIds.push(versionId);
|
|
250
|
+
});
|
|
251
|
+
await env.log({ event: 'page_landed', slot, sha256 });
|
|
252
|
+
};
|
|
253
|
+
/** The local workspace's branch round: its pages land in `workspace.json` (the Designs tab). */
|
|
254
|
+
const localHooks = (env, params) => {
|
|
255
|
+
const candidateIdAt = (position) => `${params.roundId}_${slotFor(position)}`;
|
|
256
|
+
return {
|
|
257
|
+
progress: async (pages, screens) => {
|
|
258
|
+
await addScreens(env, params, pages);
|
|
259
|
+
await patchOp(env, (_op, ws) => {
|
|
260
|
+
const round = findRound(ws, params.roundId);
|
|
261
|
+
if (round.screens?.ready !== screens.ready || round.screens.total !== screens.total)
|
|
262
|
+
round.screens = screens;
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
settled: async (position) => {
|
|
266
|
+
const { workspace } = await loadWorkspaceAt(env.root, env.clock.now);
|
|
267
|
+
const candidate = workspace.candidates.find((entry) => entry.candidateId === candidateIdAt(position));
|
|
268
|
+
return !candidate || candidate.versionIds.length > 0 || !!candidate.error;
|
|
269
|
+
},
|
|
270
|
+
land: async (position, _screen, png) => {
|
|
271
|
+
if (png) {
|
|
272
|
+
await landPage(env, params, candidateIdAt(position), slotFor(position), png);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
await patchOp(env, (_op, ws) => {
|
|
276
|
+
const entry = ws.candidates.find((c) => c.candidateId === candidateIdAt(position));
|
|
277
|
+
if (entry && entry.versionIds.length === 0) {
|
|
278
|
+
entry.error = 'This screen could not be drawn.';
|
|
279
|
+
entry.errorCode = 'no_option_drawn';
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
};
|
|
285
|
+
export const runBranch = async (env, op) => {
|
|
286
|
+
const params = op.params;
|
|
287
|
+
const { workspace } = await loadWorkspaceAt(env.root, env.clock.now);
|
|
288
|
+
const version = params.from ? workspace.versions.find((entry) => entry.versionId === params.from.versionId) : undefined;
|
|
289
|
+
if (!version || version.sha256 !== params.from?.sourceSha256) {
|
|
290
|
+
return failure('source_changed', 'The image this branch was started from changed after the click.', {}, { code: 'source_changed' });
|
|
291
|
+
}
|
|
292
|
+
const source = await sharp(await readVersionBytes(env.root, workspace, version)).png().toBuffer();
|
|
293
|
+
await ensureRealDirectory(env.root, 'branches');
|
|
294
|
+
await ensureRealDirectory(env.root, 'versions');
|
|
295
|
+
await setPhase(env, 'branching');
|
|
296
|
+
const { exitCode: code, branchDir } = await followBranchRun({
|
|
297
|
+
launch: env.branch,
|
|
298
|
+
runDir: branchRunDirectory(env.root, params.roundId),
|
|
299
|
+
scope: params.scope ?? 'site',
|
|
300
|
+
concept: branchConcept(params),
|
|
301
|
+
source,
|
|
302
|
+
sleep: (milliseconds) => env.clock.sleep(milliseconds),
|
|
303
|
+
log: env.log,
|
|
304
|
+
hooks: localHooks(env, params),
|
|
305
|
+
});
|
|
306
|
+
const after = (await loadWorkspaceAt(env.root, env.clock.now)).workspace;
|
|
307
|
+
const own = after.candidates.filter((candidate) => candidate.roundId === params.roundId);
|
|
308
|
+
if (own.some((candidate) => candidate.versionIds.length > 0))
|
|
309
|
+
return { state: 'succeeded' };
|
|
310
|
+
return failure('all_options_failed', `The branch run ended (exit ${code}) without a page. Its record is in ${branchDir}.`, { retryable: true }, { code: 'no_option_drawn' });
|
|
311
|
+
};
|
|
312
|
+
//# sourceMappingURL=slate-branch-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-branch-runner.js","sourceRoot":"","sources":["../src/slate-branch-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CaptionLines, type CaptionWriter } from './slate-captions.js';
|
|
2
|
+
/** Writes what `pick` names as still missing; answers the lines written. */
|
|
3
|
+
export declare const captionLocal: (args: {
|
|
4
|
+
root: string;
|
|
5
|
+
env: NodeJS.ProcessEnv;
|
|
6
|
+
/** The round to caption, or null for the newest one. */
|
|
7
|
+
roundId: string | null;
|
|
8
|
+
tabs: boolean;
|
|
9
|
+
progress: (line: string) => void;
|
|
10
|
+
write?: CaptionWriter;
|
|
11
|
+
}) => Promise<CaptionLines>;
|
|
12
|
+
/** Once per workspace per server process, beside the References gathering. */
|
|
13
|
+
export declare const startLocalCaptions: (root: string, env?: NodeJS.ProcessEnv) => void;
|
|
14
|
+
//# sourceMappingURL=slate-captions-local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-captions-local.d.ts","sourceRoot":"","sources":["../src/slate-captions-local.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAoCtH,4EAA4E;AAC5E,eAAO,MAAM,YAAY,GAAU,MAAM;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,wDAAwD;IACxD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,KAAG,OAAO,CAAC,YAAY,CAmBvB,CAAC;AAIF,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,MAAK,MAAM,CAAC,UAAwB,KAAG,IAKvF,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { placesOf, writeCaptions } from './slate-captions.js';
|
|
2
|
+
import { chooseSuggestEngine } from './slate-site-references-suggest.js';
|
|
3
|
+
import { loadWorkspaceAt, mutateWorkspace, NoWrite } from './slate-workspace-store.js';
|
|
4
|
+
/**
|
|
5
|
+
* The local plugin's captions (slate-captions.ts), kept in the workspace record: the tabs' lines and the newest round's,
|
|
6
|
+
* in one call the first time the local MCP server shows a workspace, beside the References gathering. The local round
|
|
7
|
+
* runner makes no caption call (its rounds are pinned to their draws alone). A line already in the record is never
|
|
8
|
+
* written again; a failed call leaves the screen's static lines.
|
|
9
|
+
*/
|
|
10
|
+
const roundAsk = (workspace, round) => (round && !round.caption ? {
|
|
11
|
+
index: round.index,
|
|
12
|
+
kind: round.kind,
|
|
13
|
+
note: round.note,
|
|
14
|
+
references: round.referenceIds.map((id) => workspace.references[id]?.description ?? '').filter(Boolean),
|
|
15
|
+
} : null);
|
|
16
|
+
const store = async (root, roundId, lines) => {
|
|
17
|
+
await mutateWorkspace(root, (workspace) => {
|
|
18
|
+
let wrote = false;
|
|
19
|
+
const captions = { ...workspace.captions };
|
|
20
|
+
for (const place of ['inspiration', 'references']) {
|
|
21
|
+
if (lines[place] && !captions[place]) {
|
|
22
|
+
captions[place] = lines[place];
|
|
23
|
+
wrote = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const round = roundId ? workspace.rounds.find((entry) => entry.roundId === roundId) : undefined;
|
|
27
|
+
if (round && lines.round && !round.caption) {
|
|
28
|
+
round.caption = lines.round;
|
|
29
|
+
wrote = true;
|
|
30
|
+
}
|
|
31
|
+
if (!wrote)
|
|
32
|
+
return new NoWrite(undefined);
|
|
33
|
+
workspace.captions = captions;
|
|
34
|
+
return undefined;
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
/** Writes what `pick` names as still missing; answers the lines written. */
|
|
38
|
+
export const captionLocal = async (args) => {
|
|
39
|
+
const { workspace } = await loadWorkspaceAt(args.root, () => new Date());
|
|
40
|
+
const round = args.roundId
|
|
41
|
+
? workspace.rounds.find((entry) => entry.roundId === args.roundId)
|
|
42
|
+
: [...workspace.rounds].sort((a, b) => b.index - a.index)[0];
|
|
43
|
+
const ask = {
|
|
44
|
+
brief: workspace.brief.concept,
|
|
45
|
+
inspiration: args.tabs && !workspace.captions?.inspiration,
|
|
46
|
+
references: args.tabs && !workspace.captions?.references,
|
|
47
|
+
round: roundAsk(workspace, round),
|
|
48
|
+
};
|
|
49
|
+
if (placesOf(ask).length === 0)
|
|
50
|
+
return {};
|
|
51
|
+
const engine = chooseSuggestEngine(args.env);
|
|
52
|
+
if (!engine)
|
|
53
|
+
return {};
|
|
54
|
+
const started = Date.now();
|
|
55
|
+
const lines = await (args.write ?? writeCaptions)({ engine, ask, env: args.env });
|
|
56
|
+
args.progress(`12ui captions: ${engine.kind} wrote ${Object.keys(lines).join(', ') || 'nothing'} (${((Date.now() - started) / 1000).toFixed(1)} s)`);
|
|
57
|
+
if (Object.keys(lines).length > 0)
|
|
58
|
+
await store(args.root, round?.roundId ?? null, lines);
|
|
59
|
+
return lines;
|
|
60
|
+
};
|
|
61
|
+
const started = new Set();
|
|
62
|
+
/** Once per workspace per server process, beside the References gathering. */
|
|
63
|
+
export const startLocalCaptions = (root, env = process.env) => {
|
|
64
|
+
if (started.has(root))
|
|
65
|
+
return;
|
|
66
|
+
started.add(root);
|
|
67
|
+
void captionLocal({ root, env, roundId: null, tabs: true, progress: (line) => { process.stderr.write(`${line}\n`); } })
|
|
68
|
+
.catch((error) => { process.stderr.write(`12ui captions: stopped: ${error instanceof Error ? error.message : String(error)}\n`); });
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=slate-captions-local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-captions-local.js","sourceRoot":"","sources":["../src/slate-captions-local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type CaptionLines, type CaptionWriter } from './slate-captions.js';
|
|
2
|
+
import { type SuggestEngine } from './slate-site-references-suggest.js';
|
|
3
|
+
import { type DrawFetch } from './workspace-draw-client.js';
|
|
4
|
+
/**
|
|
5
|
+
* The hosted workspace's captions (slate-captions.ts): reads the brief, the round a request draws and the lines already
|
|
6
|
+
* stored through the upload token (`GET /api/v1/slate/captions?op=`), asks the person's agent for the missing ones in
|
|
7
|
+
* one call, and stores what it wrote (`POST`). Started by the draw command and the workspace runner beside the draw.
|
|
8
|
+
*/
|
|
9
|
+
export type CaptionReport = {
|
|
10
|
+
engine: SuggestEngine['kind'];
|
|
11
|
+
places: string[];
|
|
12
|
+
lines: CaptionLines;
|
|
13
|
+
ms: number;
|
|
14
|
+
};
|
|
15
|
+
export declare const captionWorkspace: (args: {
|
|
16
|
+
origin: string;
|
|
17
|
+
token: string;
|
|
18
|
+
cliVersion: string;
|
|
19
|
+
opId: string;
|
|
20
|
+
env: NodeJS.ProcessEnv;
|
|
21
|
+
progress: (line: string) => void;
|
|
22
|
+
fetch?: DrawFetch;
|
|
23
|
+
deps?: {
|
|
24
|
+
engine?: SuggestEngine;
|
|
25
|
+
write?: CaptionWriter;
|
|
26
|
+
now?: () => number;
|
|
27
|
+
};
|
|
28
|
+
}) => Promise<CaptionReport | null>;
|
|
29
|
+
//# sourceMappingURL=slate-captions-remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-captions-remote.d.ts","sourceRoot":"","sources":["../src/slate-captions-remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,YAAY,EAAqB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzI,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAkD,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5G;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AA4BjH,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,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;QAAE,MAAM,CAAC,EAAE,aAAa,CAAC;QAAC,KAAK,CAAC,EAAE,aAAa,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC;CAC9E,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAsC/B,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { placesOf, writeCaptions } from './slate-captions.js';
|
|
2
|
+
import { briefText } from './slate-site-references.js';
|
|
3
|
+
import { chooseSuggestEngine } from './slate-site-references-suggest.js';
|
|
4
|
+
import { CLI_HEADER, NO_REDIRECT, PUSH_HEADER, readBody } from './workspace-draw-client.js';
|
|
5
|
+
const asText = (value) => (typeof value === 'string' && value.trim() ? value : null);
|
|
6
|
+
const readOf = (body) => {
|
|
7
|
+
const brief = (body.brief ?? {});
|
|
8
|
+
const captions = (body.captions ?? {});
|
|
9
|
+
const round = body.round && typeof body.round === 'object' ? body.round : null;
|
|
10
|
+
const kind = round?.kind;
|
|
11
|
+
return {
|
|
12
|
+
brief: { concept: asText(brief.concept) ?? '', corpusQuery: asText(brief.corpusQuery) },
|
|
13
|
+
captions: { inspiration: asText(captions.inspiration), references: asText(captions.references) },
|
|
14
|
+
round: round && typeof round.index === 'number' && (kind === 'root' || kind === 'new' || kind === 'like' || kind === 'branch') ? {
|
|
15
|
+
index: round.index,
|
|
16
|
+
kind,
|
|
17
|
+
note: asText(round.note),
|
|
18
|
+
references: Array.isArray(round.references) ? round.references.filter((entry) => typeof entry === 'string') : [],
|
|
19
|
+
caption: asText(round.caption),
|
|
20
|
+
} : null,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export const captionWorkspace = async (args) => {
|
|
24
|
+
const fetcher = args.fetch ?? ((url, init) => fetch(url, init));
|
|
25
|
+
const url = `${args.origin}/api/v1/slate/captions`;
|
|
26
|
+
const headers = { [PUSH_HEADER]: args.token, [CLI_HEADER]: args.cliVersion };
|
|
27
|
+
const call = async (target, init) => {
|
|
28
|
+
const response = await fetcher(target, { ...init, redirect: NO_REDIRECT, headers: { ...headers, ...init.headers } });
|
|
29
|
+
const body = await readBody(response);
|
|
30
|
+
if (!response.ok || !body || typeof body !== 'object')
|
|
31
|
+
throw new Error(`${url} answered ${response.status}`);
|
|
32
|
+
return body;
|
|
33
|
+
};
|
|
34
|
+
const read = readOf(await call(`${url}?op=${encodeURIComponent(args.opId)}`, { method: 'GET' }));
|
|
35
|
+
const ask = {
|
|
36
|
+
brief: briefText(read.brief.concept, read.brief.corpusQuery),
|
|
37
|
+
inspiration: read.captions.inspiration === null,
|
|
38
|
+
references: read.captions.references === null,
|
|
39
|
+
round: read.round && read.round.caption === null ? read.round : null,
|
|
40
|
+
};
|
|
41
|
+
if (placesOf(ask).length === 0 || !ask.brief)
|
|
42
|
+
return null;
|
|
43
|
+
const engine = args.deps?.engine ?? chooseSuggestEngine(args.env);
|
|
44
|
+
if (!engine)
|
|
45
|
+
return null;
|
|
46
|
+
const now = args.deps?.now ?? Date.now;
|
|
47
|
+
const started = now();
|
|
48
|
+
const lines = await (args.deps?.write ?? writeCaptions)({ engine, ask, env: args.env });
|
|
49
|
+
const ms = now() - started;
|
|
50
|
+
const places = Object.keys(lines);
|
|
51
|
+
args.progress(`12ui captions: ${engine.kind} wrote ${places.length ? places.join(', ') : 'nothing'} (${(ms / 1000).toFixed(1)} s)`);
|
|
52
|
+
if (places.length === 0)
|
|
53
|
+
return { engine: engine.kind, places, lines, ms };
|
|
54
|
+
await call(url, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: { 'content-type': 'application/json' },
|
|
57
|
+
body: JSON.stringify({
|
|
58
|
+
...(lines.inspiration ? { inspiration: lines.inspiration } : {}),
|
|
59
|
+
...(lines.references ? { references: lines.references } : {}),
|
|
60
|
+
...(lines.round ? { round: { opId: args.opId, text: lines.round } } : {}),
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
return { engine: engine.kind, places, lines, ms };
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=slate-captions-remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-captions-remote.js","sourceRoot":"","sources":["../src/slate-captions-remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type SuggestEngine } from './slate-site-references-suggest.js';
|
|
2
|
+
/**
|
|
3
|
+
* The one-line captions of the Design workspace: a sentence at the top of the Inspiration and References tabs and on
|
|
4
|
+
* each round, saying what that screen is doing for this brief. The person's own agent CLI writes them in one small call
|
|
5
|
+
* (`codex exec` with a JSON schema and low reasoning effort, or `claude -p` under Claude Code), alongside the drawing and
|
|
6
|
+
* never in its way. The screen shows its own static line until a written one lands, and keeps it when none does.
|
|
7
|
+
*/
|
|
8
|
+
export type CaptionRound = {
|
|
9
|
+
index: number;
|
|
10
|
+
kind: 'root' | 'new' | 'like' | 'branch';
|
|
11
|
+
note: string | null;
|
|
12
|
+
references: string[];
|
|
13
|
+
};
|
|
14
|
+
/** What to write: the brief, and which places still have no line. */
|
|
15
|
+
export type CaptionAsk = {
|
|
16
|
+
brief: string;
|
|
17
|
+
inspiration: boolean;
|
|
18
|
+
references: boolean;
|
|
19
|
+
round: CaptionRound | null;
|
|
20
|
+
};
|
|
21
|
+
export type CaptionLines = {
|
|
22
|
+
inspiration?: string;
|
|
23
|
+
references?: string;
|
|
24
|
+
round?: string;
|
|
25
|
+
};
|
|
26
|
+
export type CaptionPlace = keyof CaptionLines;
|
|
27
|
+
export declare const placesOf: (ask: CaptionAsk) => CaptionPlace[];
|
|
28
|
+
export declare const captionPrompt: (ask: CaptionAsk) => string;
|
|
29
|
+
export declare const captionSchema: (ask: CaptionAsk) => Record<string, unknown>;
|
|
30
|
+
/** One line: whitespace folded, quotes and a trailing ellipsis dropped, cut at a word past the limit. */
|
|
31
|
+
export declare const cleanCaption: (value: unknown) => string;
|
|
32
|
+
/** The asked places' lines from the first JSON object in a text; anything missing or empty is left out. */
|
|
33
|
+
export declare const parseCaptions: (text: string, ask: CaptionAsk) => CaptionLines;
|
|
34
|
+
export type CaptionWriter = (args: {
|
|
35
|
+
engine: SuggestEngine;
|
|
36
|
+
ask: CaptionAsk;
|
|
37
|
+
env: NodeJS.ProcessEnv;
|
|
38
|
+
}) => Promise<CaptionLines>;
|
|
39
|
+
/** One call to the person's agent for every asked place; an agent that fails or answers nothing gives no lines. */
|
|
40
|
+
export declare const writeCaptions: CaptionWriter;
|
|
41
|
+
//# sourceMappingURL=slate-captions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slate-captions.d.ts","sourceRoot":"","sources":["../src/slate-captions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAErF;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAClI,qEAAqE;AACrE,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,CAAC;AAClH,MAAM,MAAM,YAAY,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACzF,MAAM,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC;AAM9C,eAAO,MAAM,QAAQ,GAAI,KAAK,UAAU,KAAG,YAAY,EAItD,CAAC;AAsBF,eAAO,MAAM,aAAa,GAAI,KAAK,UAAU,KAAG,MAQpC,CAAC;AAEb,eAAO,MAAM,aAAa,GAAI,KAAK,UAAU,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAQrE,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAS7C,CAAC;AAEF,2GAA2G;AAC3G,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,KAAK,UAAU,KAAG,YAiB7D,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEhI,mHAAmH;AACnH,eAAO,MAAM,aAAa,EAAE,aAwB3B,CAAC"}
|