@vibes.diy/api-svc 14.3.21 → 14.3.22

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.
Files changed (110) hide show
  1. package/create-handler.d.ts +2 -0
  2. package/create-handler.js +1 -0
  3. package/create-handler.js.map +1 -1
  4. package/index.d.ts +2 -0
  5. package/index.js +2 -0
  6. package/index.js.map +1 -1
  7. package/intern/agent-assembly.d.ts +2 -0
  8. package/intern/agent-assembly.js +2 -2
  9. package/intern/agent-assembly.js.map +1 -1
  10. package/intern/agent-build-tools.d.ts +7 -0
  11. package/intern/agent-build-tools.js +14 -3
  12. package/intern/agent-build-tools.js.map +1 -1
  13. package/intern/agent-dispatcher.js +66 -25
  14. package/intern/agent-dispatcher.js.map +1 -1
  15. package/intern/agent-request-frame.d.ts +9 -0
  16. package/intern/agent-request-frame.js +14 -0
  17. package/intern/agent-request-frame.js.map +1 -1
  18. package/intern/agent-router.js +1 -1
  19. package/intern/agent-router.js.map +1 -1
  20. package/intern/agent-session.d.ts +1 -1
  21. package/intern/agent-session.js +1 -1
  22. package/intern/agent-session.js.map +1 -1
  23. package/intern/attach-draft-handle.js +51 -8
  24. package/intern/attach-draft-handle.js.map +1 -1
  25. package/intern/draft-lane-autofix.d.ts +8 -0
  26. package/intern/draft-lane-autofix.js +8 -0
  27. package/intern/draft-lane-autofix.js.map +1 -0
  28. package/intern/draft-lane-classify.d.ts +55 -0
  29. package/intern/draft-lane-classify.js +168 -0
  30. package/intern/draft-lane-classify.js.map +1 -0
  31. package/intern/draft-lane-config.d.ts +16 -0
  32. package/intern/draft-lane-config.js +25 -0
  33. package/intern/draft-lane-config.js.map +1 -0
  34. package/intern/draft-lane-exports.d.ts +7 -0
  35. package/intern/draft-lane-exports.js +102 -0
  36. package/intern/draft-lane-exports.js.map +1 -0
  37. package/intern/draft-lane-imports.d.ts +6 -0
  38. package/intern/draft-lane-imports.js +180 -0
  39. package/intern/draft-lane-imports.js.map +1 -0
  40. package/intern/draft-lane-opens.d.ts +6 -0
  41. package/intern/draft-lane-opens.js +173 -0
  42. package/intern/draft-lane-opens.js.map +1 -0
  43. package/intern/draft-lane-parse.d.ts +16 -0
  44. package/intern/draft-lane-parse.js +104 -0
  45. package/intern/draft-lane-parse.js.map +1 -0
  46. package/intern/draft-lane-persist.d.ts +26 -0
  47. package/intern/draft-lane-persist.js +92 -0
  48. package/intern/draft-lane-persist.js.map +1 -0
  49. package/intern/draft-lane-prompt.d.ts +16 -0
  50. package/intern/draft-lane-prompt.js +59 -0
  51. package/intern/draft-lane-prompt.js.map +1 -0
  52. package/intern/draft-lane-store.d.ts +36 -0
  53. package/intern/draft-lane-store.js +5 -0
  54. package/intern/draft-lane-store.js.map +1 -0
  55. package/intern/draft-lane-transport.d.ts +3 -0
  56. package/intern/draft-lane-transport.js +58 -0
  57. package/intern/draft-lane-transport.js.map +1 -0
  58. package/intern/draft-lane-worker.d.ts +37 -0
  59. package/intern/draft-lane-worker.js +156 -0
  60. package/intern/draft-lane-worker.js.map +1 -0
  61. package/intern/draft-lane.d.ts +60 -0
  62. package/intern/draft-lane.js +148 -0
  63. package/intern/draft-lane.js.map +1 -0
  64. package/intern/eval-handles.d.ts +2 -1
  65. package/intern/eval-handles.js +2 -1
  66. package/intern/eval-handles.js.map +1 -1
  67. package/intern/first-build-request.js +5 -1
  68. package/intern/first-build-request.js.map +1 -1
  69. package/intern/import-synth.d.ts +25 -0
  70. package/intern/import-synth.js +456 -0
  71. package/intern/import-synth.js.map +1 -0
  72. package/intern/inline-build-pass.d.ts +23 -0
  73. package/intern/inline-build-pass.js +27 -0
  74. package/intern/inline-build-pass.js.map +1 -0
  75. package/intern/look-lint-engine.d.ts +9 -0
  76. package/intern/look-lint-engine.js +22 -0
  77. package/intern/look-lint-engine.js.map +1 -1
  78. package/intern/look-lint.d.ts +1 -0
  79. package/intern/look-lint.js +4 -1
  80. package/intern/look-lint.js.map +1 -1
  81. package/intern/mint-job-store.d.ts +50 -2
  82. package/intern/mint-job-store.js +149 -4
  83. package/intern/mint-job-store.js.map +1 -1
  84. package/intern/opens-check.d.ts +14 -0
  85. package/intern/opens-check.js +1044 -0
  86. package/intern/opens-check.js.map +1 -0
  87. package/intern/prompt-assembly.d.ts +19 -0
  88. package/intern/prompt-assembly.js +5 -2
  89. package/intern/prompt-assembly.js.map +1 -1
  90. package/intern/save-build-pass.d.ts +15 -0
  91. package/intern/save-build-pass.js +53 -0
  92. package/intern/save-build-pass.js.map +1 -0
  93. package/package.json +13 -12
  94. package/public/agent-turn-assembly.js +16 -0
  95. package/public/agent-turn-assembly.js.map +1 -1
  96. package/public/handle-prompt-context.d.ts +3 -1
  97. package/public/handle-prompt-context.js +39 -4
  98. package/public/handle-prompt-context.js.map +1 -1
  99. package/public/home-feed-common.js +2 -2
  100. package/public/home-feed-common.js.map +1 -1
  101. package/public/open-chat.d.ts +2 -0
  102. package/public/open-chat.js +80 -11
  103. package/public/open-chat.js.map +1 -1
  104. package/public/related-vibes.js +9 -3
  105. package/public/related-vibes.js.map +1 -1
  106. package/public/shared-mint.d.ts +5 -0
  107. package/public/shared-mint.js +15 -0
  108. package/public/shared-mint.js.map +1 -1
  109. package/types.d.ts +2 -0
  110. package/types.js.map +1 -1
@@ -0,0 +1,102 @@
1
+ export const LOOK_BASE_EXPORTS = [
2
+ "Button",
3
+ "Card",
4
+ "CardHeader",
5
+ "CardTitle",
6
+ "CardDescription",
7
+ "CardContent",
8
+ "CardFooter",
9
+ "Input",
10
+ "Textarea",
11
+ "Label",
12
+ "Badge",
13
+ "Tabs",
14
+ "TabsList",
15
+ "TabsTrigger",
16
+ "TabsContent",
17
+ "Separator",
18
+ "Skeleton",
19
+ "Table",
20
+ "TableHeader",
21
+ "TableBody",
22
+ "TableRow",
23
+ "TableHead",
24
+ "TableCell",
25
+ "Avatar",
26
+ "AvatarFallback",
27
+ "Progress",
28
+ "cn",
29
+ ];
30
+ export const LOOK_OVERLAY_EXPORTS = [
31
+ "Dialog",
32
+ "DialogTrigger",
33
+ "DialogContent",
34
+ "DialogHeader",
35
+ "DialogTitle",
36
+ "DialogDescription",
37
+ "DialogFooter",
38
+ "Sheet",
39
+ "SheetTrigger",
40
+ "SheetContent",
41
+ "SheetHeader",
42
+ "SheetTitle",
43
+ "SheetDescription",
44
+ "SheetFooter",
45
+ "Popover",
46
+ "PopoverTrigger",
47
+ "PopoverContent",
48
+ "Select",
49
+ "SelectTrigger",
50
+ "SelectContent",
51
+ "SelectItem",
52
+ "SelectValue",
53
+ "DropdownMenu",
54
+ "DropdownMenuTrigger",
55
+ "DropdownMenuContent",
56
+ "DropdownMenuItem",
57
+ "Tooltip",
58
+ "TooltipTrigger",
59
+ "TooltipContent",
60
+ "TooltipProvider",
61
+ ];
62
+ export const LOOK_MODULE = "@vibes.diy/look";
63
+ export const LOOK_OVERLAY_MODULE = "@vibes.diy/look/overlay";
64
+ export const MODULE_EXPORTS = {
65
+ [LOOK_MODULE]: [...LOOK_BASE_EXPORTS, ...LOOK_OVERLAY_EXPORTS],
66
+ [LOOK_OVERLAY_MODULE]: LOOK_OVERLAY_EXPORTS,
67
+ "use-fireproof": ["useFireproof", "fireproof", "ImgFile"],
68
+ "use-vibes": [
69
+ "useVibe",
70
+ "useViewer",
71
+ "ViewerTag",
72
+ "HandleInput",
73
+ "ImgGen",
74
+ "useImgGen",
75
+ "imgGen",
76
+ "useSocial",
77
+ "useFireproof",
78
+ "fireproof",
79
+ "ImgFile",
80
+ "callAI",
81
+ "callAi",
82
+ ],
83
+ "call-ai": ["callAI", "callAi"],
84
+ };
85
+ export const RUNTIME_MODULES = ["use-fireproof", "use-vibes", "call-ai"];
86
+ export const REACT_HOOKS = [
87
+ "useState",
88
+ "useEffect",
89
+ "useRef",
90
+ "useMemo",
91
+ "useCallback",
92
+ "useReducer",
93
+ "useContext",
94
+ "useLayoutEffect",
95
+ "useId",
96
+ "useTransition",
97
+ "createContext",
98
+ "forwardRef",
99
+ "memo",
100
+ "Fragment",
101
+ ];
102
+ //# sourceMappingURL=draft-lane-exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-lane-exports.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-exports.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,QAAQ;IACR,MAAM;IACN,YAAY;IACZ,WAAW;IACX,iBAAiB;IACjB,aAAa;IACb,YAAY;IACZ,OAAO;IACP,UAAU;IACV,OAAO;IACP,OAAO;IACP,MAAM;IACN,UAAU;IACV,aAAa;IACb,aAAa;IACb,WAAW;IACX,UAAU;IACV,OAAO;IACP,aAAa;IACb,WAAW;IACX,UAAU;IACV,WAAW;IACX,WAAW;IACX,QAAQ;IACR,gBAAgB;IAChB,UAAU;IACV,IAAI;CACL,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,QAAQ;IACR,eAAe;IACf,eAAe;IACf,cAAc;IACd,aAAa;IACb,mBAAmB;IACnB,cAAc;IACd,OAAO;IACP,cAAc;IACd,cAAc;IACd,aAAa;IACb,YAAY;IACZ,kBAAkB;IAClB,aAAa;IACb,SAAS;IACT,gBAAgB;IAChB,gBAAgB;IAChB,QAAQ;IACR,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,cAAc;IACd,qBAAqB;IACrB,qBAAqB;IACrB,kBAAkB;IAClB,SAAS;IACT,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAG7D,MAAM,CAAC,MAAM,cAAc,GAAgD;IACzE,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,GAAG,oBAAoB,CAAC;IAC9D,CAAC,mBAAmB,CAAC,EAAE,oBAAoB;IAC3C,eAAe,EAAE,CAAC,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC;IACzD,WAAW,EAAE;QACX,SAAS;QACT,WAAW;QACX,WAAW;QACX,aAAa;QACb,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,WAAW;QACX,cAAc;QACd,WAAW;QACX,SAAS;QACT,QAAQ;QACR,QAAQ;KACT;IACD,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAChC,CAAC;AAGF,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC5C,UAAU;IACV,WAAW;IACX,QAAQ;IACR,SAAS;IACT,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,iBAAiB;IACjB,OAAO;IACP,eAAe;IACf,eAAe;IACf,YAAY;IACZ,MAAM;IACN,UAAU;CACX,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface SynthesizedImports {
2
+ readonly vfs: ReadonlyMap<string, string>;
3
+ readonly notes: readonly string[];
4
+ }
5
+ export declare function resolveRelative(fromPath: string, spec: string): string;
6
+ export declare function synthesizeImports(vfs: ReadonlyMap<string, string>): SynthesizedImports;
@@ -0,0 +1,180 @@
1
+ import { LOOK_BASE_EXPORTS, LOOK_MODULE, LOOK_OVERLAY_EXPORTS, LOOK_OVERLAY_MODULE, MODULE_EXPORTS, REACT_HOOKS, RUNTIME_MODULES, } from "./draft-lane-exports.js";
2
+ const RUNTIME_ADDS = [
3
+ ["useVibe", "use-vibes"],
4
+ ["useViewer", "use-vibes"],
5
+ ["useImgGen", "use-vibes"],
6
+ ["callAI", "call-ai"],
7
+ ["useFireproof", "use-fireproof"],
8
+ ["fireproof", "use-fireproof"],
9
+ ];
10
+ const JSX_RUNTIME_COMPONENTS = ["ImgGen", "ViewerTag", "HandleInput"];
11
+ export function resolveRelative(fromPath, spec) {
12
+ const dir = fromPath.slice(0, fromPath.lastIndexOf("/") + 1);
13
+ const parts = [];
14
+ for (const segment of (dir + spec).split("/")) {
15
+ if (segment === "" || segment === ".")
16
+ continue;
17
+ if (segment === "..")
18
+ parts.pop();
19
+ else
20
+ parts.push(segment);
21
+ }
22
+ return `/${parts.join("/")}`;
23
+ }
24
+ function localName(specifier) {
25
+ const pieces = specifier.split(/\s+as\s+/);
26
+ return pieces[pieces.length - 1].trim();
27
+ }
28
+ function importedName(specifier) {
29
+ return specifier.split(/\s+as\s+/)[0].trim();
30
+ }
31
+ function addTo(map, mod, name) {
32
+ const set = map.get(mod) ?? new Set();
33
+ set.add(name);
34
+ map.set(mod, set);
35
+ }
36
+ function escapeRegExp(text) {
37
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
38
+ }
39
+ function synthesizeFile(args) {
40
+ const { path, vfs, notes } = args;
41
+ let src = args.source;
42
+ src = src.replace(/from\s+["'](\.{1,2}\/[^"']+)["']/g, (match, spec) => {
43
+ if (/\.[a-z]+$/i.test(spec))
44
+ return match;
45
+ const base = resolveRelative(path, spec);
46
+ const ext = [".jsx", ".js", ".tsx", ".ts"].find((candidate) => vfs.has(base + candidate));
47
+ if (ext === undefined)
48
+ return match;
49
+ notes.push(`ext ${spec}${ext}`);
50
+ return match.replace(spec, spec + ext);
51
+ });
52
+ const importRe = /^import\s*\{([^}]*)\}\s*from\s*["']([^"']+)["'];?\s*$/gm;
53
+ const wanted = new Map([
54
+ [LOOK_MODULE, new Set()],
55
+ [LOOK_OVERLAY_MODULE, new Set()],
56
+ ]);
57
+ const runtime = new Map();
58
+ src = src.replace(importRe, (match, names, mod) => {
59
+ const list = names
60
+ .split(",")
61
+ .map((name) => name.trim())
62
+ .filter((name) => name.length > 0);
63
+ if (mod === LOOK_MODULE || mod === LOOK_OVERLAY_MODULE) {
64
+ for (const specifier of list) {
65
+ const bare = importedName(specifier);
66
+ if (LOOK_BASE_EXPORTS.includes(bare))
67
+ addTo(wanted, LOOK_MODULE, specifier);
68
+ else if (LOOK_OVERLAY_EXPORTS.includes(bare))
69
+ addTo(wanted, LOOK_OVERLAY_MODULE, specifier);
70
+ else
71
+ notes.push(`drop ${bare} from ${mod}`);
72
+ }
73
+ return "/*__LOOK_IMPORT__*/";
74
+ }
75
+ if (RUNTIME_MODULES.includes(mod)) {
76
+ const exports = MODULE_EXPORTS[mod] ?? [];
77
+ for (const specifier of list) {
78
+ const bare = importedName(specifier);
79
+ if (exports.includes(bare)) {
80
+ addTo(runtime, mod, specifier);
81
+ continue;
82
+ }
83
+ const home = RUNTIME_MODULES.find((candidate) => (MODULE_EXPORTS[candidate] ?? []).includes(bare));
84
+ if (home !== undefined) {
85
+ addTo(runtime, home, specifier);
86
+ notes.push(`move ${bare} to ${home}`);
87
+ }
88
+ else
89
+ notes.push(`drop ${bare} from ${mod}`);
90
+ }
91
+ if (runtime.has(mod) === false)
92
+ runtime.set(mod, new Set());
93
+ return "/*__RT_IMPORT__*/";
94
+ }
95
+ return match;
96
+ });
97
+ const reactRe = /^import\s+(?:(React)\s*,?\s*)?(?:\{([^}]*)\})?\s*from\s*["']react["'];?\s*$/m;
98
+ const reactMatch = reactRe.exec(src);
99
+ const reactNamed = new Set(reactMatch !== null && reactMatch[2] !== undefined
100
+ ? reactMatch[2]
101
+ .split(",")
102
+ .map((name) => name.trim())
103
+ .filter((name) => name.length > 0)
104
+ : []);
105
+ const needReactDefault = /\bReact\./.test(src) || /<[A-Za-z]/.test(src);
106
+ for (const hook of REACT_HOOKS) {
107
+ const used = new RegExp(`(?<![.\\w])${hook}\\(`).test(src);
108
+ const declaredLocally = new RegExp(`(?:function|const|let)\\s+${hook}\\b`).test(src);
109
+ if (used && reactNamed.has(hook) === false && declaredLocally === false) {
110
+ reactNamed.add(hook);
111
+ notes.push(`add ${hook} from react`);
112
+ }
113
+ }
114
+ if (reactMatch !== null)
115
+ src = src.replace(reactRe, "/*__REACT_IMPORT__*/");
116
+ else if (reactNamed.size > 0 || needReactDefault)
117
+ notes.push("add react import");
118
+ const reactLine = `import React${reactNamed.size > 0 ? `, { ${[...reactNamed].join(", ")} }` : ""} from "react";`;
119
+ const used = new Set([...src.matchAll(/<([A-Z][A-Za-z]*)\b/g)].map((m) => m[1]));
120
+ const imported = new Set([...wanted.values()].flatMap((set) => [...set]).map(localName));
121
+ const declared = new Set([...src.matchAll(/(?:function|const|let|var|class)\s+([A-Za-z_][A-Za-z0-9_]*)/g)].map((m) => m[1]));
122
+ for (const name of used) {
123
+ if (imported.has(name) || declared.has(name))
124
+ continue;
125
+ if (LOOK_BASE_EXPORTS.includes(name)) {
126
+ addTo(wanted, LOOK_MODULE, name);
127
+ notes.push(`add ${name}`);
128
+ }
129
+ else if (LOOK_OVERLAY_EXPORTS.includes(name)) {
130
+ addTo(wanted, LOOK_OVERLAY_MODULE, name);
131
+ notes.push(`add ${name}`);
132
+ }
133
+ else if (JSX_RUNTIME_COMPONENTS.includes(name) &&
134
+ [...runtime.values()].some((set) => [...set].map(localName).includes(name)) === false) {
135
+ addTo(runtime, "use-vibes", name);
136
+ notes.push(`add ${name}`);
137
+ }
138
+ }
139
+ for (const [hook, home] of RUNTIME_ADDS) {
140
+ const called = new RegExp(`\\b${escapeRegExp(hook)}\\(`).test(src);
141
+ const inRuntime = [...runtime.values()].some((set) => [...set].map(localName).includes(hook));
142
+ const importedElsewhere = new RegExp(`import[^;]*\\b${escapeRegExp(hook)}\\b[^;]*from`).test(src);
143
+ if (called && declared.has(hook) === false && inRuntime === false && importedElsewhere === false) {
144
+ addTo(runtime, home, hook);
145
+ notes.push(`add ${hook}`);
146
+ }
147
+ }
148
+ const lines = [];
149
+ for (const [mod, set] of wanted)
150
+ if (set.size > 0)
151
+ lines.push(`import { ${[...set].join(", ")} } from "${mod}";`);
152
+ for (const [mod, set] of runtime)
153
+ if (set.size > 0)
154
+ lines.push(`import { ${[...set].join(", ")} } from "${mod}";`);
155
+ if (reactNamed.size > 0 || needReactDefault || reactMatch !== null)
156
+ lines.unshift(reactLine);
157
+ let placed = false;
158
+ src = src.replace(/\/\*__(LOOK|RT|REACT)_IMPORT__\*\/\n?/g, () => {
159
+ if (placed)
160
+ return "";
161
+ placed = true;
162
+ return lines.join("\n") + "\n";
163
+ });
164
+ if (placed === false && lines.length > 0)
165
+ src = lines.join("\n") + "\n" + src;
166
+ return src;
167
+ }
168
+ export function synthesizeImports(vfs) {
169
+ const notes = [];
170
+ const out = new Map();
171
+ for (const [path, source] of vfs) {
172
+ if (/\.(jsx?|tsx?)$/.test(path) === false) {
173
+ out.set(path, source);
174
+ continue;
175
+ }
176
+ out.set(path, synthesizeFile({ path, source, vfs, notes }));
177
+ }
178
+ return { vfs: out, notes };
179
+ }
180
+ //# sourceMappingURL=draft-lane-imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-lane-imports.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-imports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface OpensCheck {
2
+ readonly opens: boolean;
3
+ readonly findings: readonly string[];
4
+ }
5
+ export declare function isServedBareSpecifier(spec: string): boolean;
6
+ export declare function opensCheck(vfs: ReadonlyMap<string, string>): OpensCheck;
@@ -0,0 +1,173 @@
1
+ import { exception2Result } from "@adviser/cement";
2
+ import { Parser } from "acorn";
3
+ import acornJsx from "acorn-jsx";
4
+ import { lockedGroupsVersions } from "./grouped-vibe-import-map.js";
5
+ import { MODULE_EXPORTS } from "./draft-lane-exports.js";
6
+ const JsxParser = Parser.extend(acornJsx());
7
+ function importMapSpecifiers() {
8
+ const keys = Object.values(lockedGroupsVersions).flatMap((group) => Object.keys(group));
9
+ return { exact: new Set(keys.filter((key) => key.endsWith("/") === false)), prefixes: keys.filter((key) => key.endsWith("/")) };
10
+ }
11
+ export function isServedBareSpecifier(spec) {
12
+ const { exact, prefixes } = importMapSpecifiers();
13
+ return exact.has(spec) || prefixes.some((prefix) => spec.startsWith(prefix));
14
+ }
15
+ function isNode(value) {
16
+ return typeof value === "object" && value !== null && typeof value.type === "string";
17
+ }
18
+ function walk(root, visit) {
19
+ if (Array.isArray(root)) {
20
+ for (const item of root)
21
+ walk(item, visit);
22
+ return;
23
+ }
24
+ if (isNode(root) === false)
25
+ return;
26
+ visit(root);
27
+ for (const [key, value] of Object.entries(root)) {
28
+ if (key === "type" || key === "start" || key === "end" || key === "loc" || key === "range")
29
+ continue;
30
+ if (typeof value === "object" && value !== null)
31
+ walk(value, visit);
32
+ }
33
+ }
34
+ function identifierName(node) {
35
+ return isNode(node) && node.type === "Identifier" && typeof node.name === "string" ? node.name : undefined;
36
+ }
37
+ function declaredNames(program) {
38
+ const names = new Set();
39
+ function bindPattern(pattern) {
40
+ walk(pattern, (node) => {
41
+ const name = identifierName(node);
42
+ if (name !== undefined)
43
+ names.add(name);
44
+ });
45
+ }
46
+ walk(program, (node) => {
47
+ switch (true) {
48
+ case node.type === "FunctionDeclaration" || node.type === "ClassDeclaration" || node.type === "FunctionExpression": {
49
+ const name = identifierName(node.id);
50
+ if (name !== undefined)
51
+ names.add(name);
52
+ if (Array.isArray(node.params))
53
+ bindPattern(node.params);
54
+ break;
55
+ }
56
+ case node.type === "ArrowFunctionExpression":
57
+ if (Array.isArray(node.params))
58
+ bindPattern(node.params);
59
+ break;
60
+ case node.type === "VariableDeclarator":
61
+ bindPattern(node.id);
62
+ break;
63
+ case node.type === "ImportSpecifier" || node.type === "ImportDefaultSpecifier" || node.type === "ImportNamespaceSpecifier": {
64
+ const name = identifierName(node.local);
65
+ if (name !== undefined)
66
+ names.add(name);
67
+ break;
68
+ }
69
+ case node.type === "CatchClause":
70
+ bindPattern(node.param);
71
+ break;
72
+ }
73
+ });
74
+ return names;
75
+ }
76
+ function jsxElementName(node) {
77
+ const name = node.name;
78
+ return isNode(name) && name.type === "JSXIdentifier" && typeof name.name === "string" ? name.name : undefined;
79
+ }
80
+ function isHookCall(node) {
81
+ if (isNode(node) === false || node.type !== "CallExpression")
82
+ return false;
83
+ const callee = identifierName(node.callee);
84
+ return callee !== undefined && /^use[A-Z]/.test(callee);
85
+ }
86
+ function checkFile(args) {
87
+ const { path, source, vfs } = args;
88
+ const file = path.replace(/^\/+/, "");
89
+ const parsed = exception2Result(() => JsxParser.parse(source, { ecmaVersion: "latest", sourceType: "module", allowHashBang: true }));
90
+ if (parsed.isErr())
91
+ return [`${file}: ${parsed.Err().message}`];
92
+ const program = parsed.Ok();
93
+ if (isNode(program) === false || Array.isArray(program.body) === false)
94
+ return [`${file}: unreadable module`];
95
+ const findings = [];
96
+ for (const statement of program.body) {
97
+ if (isNode(statement) === false)
98
+ continue;
99
+ if (statement.type === "ImportDeclaration") {
100
+ const sourceNode = statement.source;
101
+ const spec = isNode(sourceNode) && typeof sourceNode.value === "string" ? sourceNode.value : "";
102
+ if (spec.startsWith("./") || spec.startsWith("../") || spec.startsWith("/")) {
103
+ const target = spec.startsWith("/") ? spec : resolveFrom(path, spec);
104
+ if (vfs.has(target) === false)
105
+ findings.push(`${file}: imports "${spec}", and the draft has no file at ${target}`);
106
+ continue;
107
+ }
108
+ if (isServedBareSpecifier(spec) === false) {
109
+ findings.push(`${file}: imports "${spec}", which is not one of the app's packages`);
110
+ continue;
111
+ }
112
+ const exports = MODULE_EXPORTS[spec];
113
+ if (exports === undefined || Array.isArray(statement.specifiers) === false)
114
+ continue;
115
+ for (const specifier of statement.specifiers) {
116
+ if (isNode(specifier) === false || specifier.type !== "ImportSpecifier")
117
+ continue;
118
+ const imported = identifierName(specifier.imported);
119
+ if (imported !== undefined && exports.includes(imported) === false) {
120
+ findings.push(`${file}: "${imported}" is not exported by ${spec}`);
121
+ }
122
+ }
123
+ continue;
124
+ }
125
+ const hookAtTop = (statement.type === "ExpressionStatement" && isHookCall(statement.expression)) ||
126
+ (statement.type === "VariableDeclaration" &&
127
+ Array.isArray(statement.declarations) &&
128
+ statement.declarations.some((declarator) => isNode(declarator) && isHookCall(declarator.init)));
129
+ if (hookAtTop)
130
+ findings.push(`${file}: a hook is called at module scope; call it inside the component`);
131
+ }
132
+ const declared = declaredNames(program);
133
+ const missing = new Set();
134
+ walk(program, (node) => {
135
+ if (node.type !== "JSXOpeningElement")
136
+ return;
137
+ const name = jsxElementName(node);
138
+ if (name !== undefined && /^[A-Z]/.test(name) && declared.has(name) === false)
139
+ missing.add(name);
140
+ });
141
+ for (const name of missing)
142
+ findings.push(`${file}: <${name}> is used but never imported or defined`);
143
+ return findings;
144
+ }
145
+ function resolveFrom(fromPath, spec) {
146
+ const dir = fromPath.slice(0, fromPath.lastIndexOf("/") + 1);
147
+ const parts = [];
148
+ for (const segment of (dir + spec).split("/")) {
149
+ if (segment === "" || segment === ".")
150
+ continue;
151
+ if (segment === "..")
152
+ parts.pop();
153
+ else
154
+ parts.push(segment);
155
+ }
156
+ return `/${parts.join("/")}`;
157
+ }
158
+ export function opensCheck(vfs) {
159
+ const findings = [];
160
+ if (vfs.has("/App.jsx") === false)
161
+ findings.push("App.jsx: the draft has no App.jsx");
162
+ for (const [path, source] of vfs) {
163
+ if (/\.(jsx?|mjs)$/.test(path))
164
+ findings.push(...checkFile({ path, source, vfs }));
165
+ if (path.endsWith(".json")) {
166
+ const json = exception2Result(() => JSON.parse(source));
167
+ if (json.isErr())
168
+ findings.push(`${path.replace(/^\/+/, "")}: ${json.Err().message}`);
169
+ }
170
+ }
171
+ return { opens: findings.length === 0, findings };
172
+ }
173
+ //# sourceMappingURL=draft-lane-opens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-lane-opens.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-opens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type BlockEndMsg, type BlockStreamMsg, type SseUsage } from "@vibes.diy/call-ai-v2";
3
+ export interface ParsedDraft {
4
+ readonly vfs: ReadonlyMap<string, string>;
5
+ readonly intro: string;
6
+ readonly draftNote: string;
7
+ }
8
+ export declare function draftTextToBlocks(args: {
9
+ readonly text: string;
10
+ readonly streamId: string;
11
+ readonly createId: () => string;
12
+ readonly usage?: readonly SseUsage[];
13
+ }): Promise<Result<BlockStreamMsg[]>>;
14
+ export declare function blockEndOf(msgs: readonly BlockStreamMsg[]): BlockEndMsg | undefined;
15
+ export declare function parseDraftText(text: string): Promise<Result<ParsedDraft>>;
16
+ export declare function renderDraftText(draft: ParsedDraft): string;
@@ -0,0 +1,104 @@
1
+ import { Result, exception2Result } from "@adviser/cement";
2
+ import { createBlockStream, isBlockEnd, isCodeEnd, isToplevelLine, } from "@vibes.diy/call-ai-v2";
3
+ import { createBlockAccumulator, resolveCodeBlocks } from "./prompt-streaming.js";
4
+ function toLines(text) {
5
+ const lines = text.split("\n");
6
+ if (lines.length > 0 && lines[lines.length - 1] === "")
7
+ lines.pop();
8
+ return lines;
9
+ }
10
+ export async function draftTextToBlocks(args) {
11
+ const inner = `${args.streamId}:lines`;
12
+ const now = new Date();
13
+ const lines = toLines(args.text);
14
+ const input = new ReadableStream({
15
+ start(controller) {
16
+ controller.enqueue({ type: "line.begin", streamId: inner, timestamp: now });
17
+ lines.forEach((content, index) => controller.enqueue({ type: "line.line", streamId: inner, content, lineNr: index + 1, timestamp: now }));
18
+ (args.usage ?? []).forEach((usage, index) => controller.enqueue({ type: "delta.usage", streamId: args.streamId, usage, deltaSeq: index, timestamp: now }));
19
+ controller.enqueue({ type: "line.end", streamId: inner, totalLines: lines.length, timestamp: now });
20
+ controller.close();
21
+ },
22
+ });
23
+ const out = input.pipeThrough(createBlockStream(args.streamId, inner, args.createId));
24
+ const collected = [];
25
+ const read = await exception2Result(async () => {
26
+ const reader = out.getReader();
27
+ for (;;) {
28
+ const next = await reader.read();
29
+ if (next.done === true)
30
+ break;
31
+ collected.push(next.value);
32
+ }
33
+ });
34
+ if (read.isErr())
35
+ return Result.Err(read.Err());
36
+ return Result.Ok(collected);
37
+ }
38
+ export function blockEndOf(msgs) {
39
+ const found = msgs.filter((msg) => isBlockEnd(msg));
40
+ return found[found.length - 1];
41
+ }
42
+ export async function parseDraftText(text) {
43
+ let id = 0;
44
+ const blocks = await draftTextToBlocks({ text, streamId: "draft-parse", createId: () => `d${++id}` });
45
+ if (blocks.isErr())
46
+ return Result.Err(blocks.Err());
47
+ const accumulator = createBlockAccumulator();
48
+ const code = [];
49
+ const before = [];
50
+ let tail = [];
51
+ let seenCode = false;
52
+ for (const msg of blocks.Ok()) {
53
+ const closed = accumulator.ingest(msg);
54
+ if (closed !== undefined)
55
+ code.push({ begin: closed.begin, lines: [...closed.lines], end: closed.end });
56
+ if (isCodeEnd(msg)) {
57
+ seenCode = true;
58
+ tail = [];
59
+ }
60
+ if (isToplevelLine(msg)) {
61
+ if (seenCode)
62
+ tail.push(msg.line);
63
+ else
64
+ before.push(msg.line);
65
+ }
66
+ }
67
+ const resolved = resolveCodeBlocks(code, new Map());
68
+ const vfs = new Map();
69
+ for (const file of resolved.files) {
70
+ if (file.type === "code-block")
71
+ vfs.set(file.filename, file.content);
72
+ }
73
+ return Result.Ok({
74
+ vfs,
75
+ intro: before
76
+ .map((line) => line.trim())
77
+ .filter((line) => line.length > 0)
78
+ .join(" "),
79
+ draftNote: tail.join("\n").trim(),
80
+ });
81
+ }
82
+ function fenceLang(path) {
83
+ const ext = /\.(\w+)$/.exec(path)?.[1]?.toLowerCase() ?? "jsx";
84
+ if (ext === "json" || ext === "css" || ext === "tsx" || ext === "ts" || ext === "js")
85
+ return ext;
86
+ return "jsx";
87
+ }
88
+ function fileOrder(path) {
89
+ if (path === "/App.jsx")
90
+ return 0;
91
+ if (path === "/seed.json")
92
+ return 2;
93
+ return 1;
94
+ }
95
+ export function renderDraftText(draft) {
96
+ const paths = [...draft.vfs.keys()].sort((a, b) => fileOrder(a) - fileOrder(b) || a.localeCompare(b));
97
+ const files = paths.map((path) => {
98
+ const body = (draft.vfs.get(path) ?? "").replace(/\n+$/, "");
99
+ return `### \`${path.replace(/^\/+/, "")}\`\n\`\`\`${fenceLang(path)}\n${body}\n\`\`\``;
100
+ });
101
+ const intro = draft.intro.length > 0 ? draft.intro : "Here is the first draft.";
102
+ return [intro, ...files, ...(draft.draftNote.length > 0 ? [draft.draftNote] : [])].join("\n\n") + "\n";
103
+ }
104
+ //# sourceMappingURL=draft-lane-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-lane-parse.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-parse.ts"],"names":[],"mappings":"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"}