@vibes.diy/api-svc 14.3.21 → 14.3.23
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/create-handler.d.ts +2 -0
- package/create-handler.js +1 -0
- package/create-handler.js.map +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/intern/accepted-aliases.d.ts +31 -0
- package/intern/accepted-aliases.js +151 -0
- package/intern/accepted-aliases.js.map +1 -0
- package/intern/agent-assembly.d.ts +2 -0
- package/intern/agent-assembly.js +2 -2
- package/intern/agent-assembly.js.map +1 -1
- package/intern/agent-build-tools.d.ts +7 -0
- package/intern/agent-build-tools.js +14 -3
- package/intern/agent-build-tools.js.map +1 -1
- package/intern/agent-dispatcher.js +66 -25
- package/intern/agent-dispatcher.js.map +1 -1
- package/intern/agent-request-frame.d.ts +10 -0
- package/intern/agent-request-frame.js +16 -0
- package/intern/agent-request-frame.js.map +1 -1
- package/intern/agent-router.js +1 -1
- package/intern/agent-router.js.map +1 -1
- package/intern/agent-session.d.ts +1 -1
- package/intern/agent-session.js +1 -1
- package/intern/agent-session.js.map +1 -1
- package/intern/agent-wake.d.ts +1 -0
- package/intern/agent-wake.js +2 -0
- package/intern/agent-wake.js.map +1 -1
- package/intern/attach-draft-handle.js +51 -8
- package/intern/attach-draft-handle.js.map +1 -1
- package/intern/code-view.d.ts +1 -0
- package/intern/code-view.js +79 -0
- package/intern/code-view.js.map +1 -0
- package/intern/draft-lane-autofix.d.ts +8 -0
- package/intern/draft-lane-autofix.js +8 -0
- package/intern/draft-lane-autofix.js.map +1 -0
- package/intern/draft-lane-classify.d.ts +55 -0
- package/intern/draft-lane-classify.js +168 -0
- package/intern/draft-lane-classify.js.map +1 -0
- package/intern/draft-lane-config.d.ts +18 -0
- package/intern/draft-lane-config.js +35 -0
- package/intern/draft-lane-config.js.map +1 -0
- package/intern/draft-lane-exports.d.ts +7 -0
- package/intern/draft-lane-exports.js +104 -0
- package/intern/draft-lane-exports.js.map +1 -0
- package/intern/draft-lane-imports.d.ts +6 -0
- package/intern/draft-lane-imports.js +180 -0
- package/intern/draft-lane-imports.js.map +1 -0
- package/intern/draft-lane-opens.d.ts +6 -0
- package/intern/draft-lane-opens.js +173 -0
- package/intern/draft-lane-opens.js.map +1 -0
- package/intern/draft-lane-parse.d.ts +17 -0
- package/intern/draft-lane-parse.js +107 -0
- package/intern/draft-lane-parse.js.map +1 -0
- package/intern/draft-lane-persist.d.ts +26 -0
- package/intern/draft-lane-persist.js +94 -0
- package/intern/draft-lane-persist.js.map +1 -0
- package/intern/draft-lane-prompt.d.ts +16 -0
- package/intern/draft-lane-prompt.js +59 -0
- package/intern/draft-lane-prompt.js.map +1 -0
- package/intern/draft-lane-store.d.ts +37 -0
- package/intern/draft-lane-store.js +5 -0
- package/intern/draft-lane-store.js.map +1 -0
- package/intern/draft-lane-transport.d.ts +11 -0
- package/intern/draft-lane-transport.js +61 -0
- package/intern/draft-lane-transport.js.map +1 -0
- package/intern/draft-lane-worker.d.ts +38 -0
- package/intern/draft-lane-worker.js +173 -0
- package/intern/draft-lane-worker.js.map +1 -0
- package/intern/draft-lane.d.ts +63 -0
- package/intern/draft-lane.js +167 -0
- package/intern/draft-lane.js.map +1 -0
- package/intern/draft-note.d.ts +1 -0
- package/intern/draft-note.js +13 -0
- package/intern/draft-note.js.map +1 -0
- package/intern/draft-ready-frame.d.ts +50 -0
- package/intern/draft-ready-frame.js +102 -0
- package/intern/draft-ready-frame.js.map +1 -0
- package/intern/eval-handles.d.ts +2 -1
- package/intern/eval-handles.js +2 -1
- package/intern/eval-handles.js.map +1 -1
- package/intern/first-build-request.js +5 -1
- package/intern/first-build-request.js.map +1 -1
- package/intern/import-synth.d.ts +29 -0
- package/intern/import-synth.js +607 -0
- package/intern/import-synth.js.map +1 -0
- package/intern/inline-build-pass.d.ts +26 -0
- package/intern/inline-build-pass.js +54 -0
- package/intern/inline-build-pass.js.map +1 -0
- package/intern/look-lint-engine.d.ts +9 -0
- package/intern/look-lint-engine.js +22 -0
- package/intern/look-lint-engine.js.map +1 -1
- package/intern/look-lint.d.ts +12 -1
- package/intern/look-lint.js +40 -1
- package/intern/look-lint.js.map +1 -1
- package/intern/mint-job-store.d.ts +53 -2
- package/intern/mint-job-store.js +153 -4
- package/intern/mint-job-store.js.map +1 -1
- package/intern/opens-check.d.ts +14 -0
- package/intern/opens-check.js +1046 -0
- package/intern/opens-check.js.map +1 -0
- package/intern/prompt-assembly.d.ts +19 -0
- package/intern/prompt-assembly.js +5 -2
- package/intern/prompt-assembly.js.map +1 -1
- package/intern/save-build-pass.d.ts +15 -0
- package/intern/save-build-pass.js +65 -0
- package/intern/save-build-pass.js.map +1 -0
- package/intern/section-fan-out.d.ts +9 -0
- package/intern/section-fan-out.js +22 -0
- package/intern/section-fan-out.js.map +1 -1
- package/package.json +13 -12
- package/public/agent-turn-assembly.js +17 -0
- package/public/agent-turn-assembly.js.map +1 -1
- package/public/handle-prompt-context.d.ts +5 -1
- package/public/handle-prompt-context.js +56 -6
- package/public/handle-prompt-context.js.map +1 -1
- package/public/home-feed-common.js +2 -2
- package/public/home-feed-common.js.map +1 -1
- package/public/open-chat.d.ts +19 -3
- package/public/open-chat.js +219 -22
- package/public/open-chat.js.map +1 -1
- package/public/prompt-turn-settled.js +1 -0
- package/public/prompt-turn-settled.js.map +1 -1
- package/public/related-vibes.js +9 -3
- package/public/related-vibes.js.map +1 -1
- package/public/shared-mint.d.ts +5 -0
- package/public/shared-mint.js +15 -0
- package/public/shared-mint.js.map +1 -1
- package/public/stream-assembly.d.ts +1 -0
- package/public/stream-assembly.js +3 -0
- package/public/stream-assembly.js.map +1 -1
- package/types.d.ts +2 -0
- package/types.js.map +1 -1
|
@@ -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":"AAgBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG/B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQzD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AAG5C,SAAS,mBAAmB;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AAClI,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAClD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/E,CAAC;AAOD,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC/G,CAAC;AAGD,SAAS,IAAI,CAAC,IAAa,EAAE,KAA8B;IACzD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO;IACnC,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO;YAAE,SAAS;QACrG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7G,CAAC;AAGD,SAAS,aAAa,CAAC,OAAgB;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,SAAS,WAAW,CAAC,OAAgB;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,IAAI,KAAK,qBAAqB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACnH,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,IAAI,IAAI,KAAK,SAAS;oBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzD,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,IAAI,KAAK,yBAAyB;gBAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,IAAI,CAAC,IAAI,KAAK,oBAAoB;gBACrC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrB,MAAM;YACR,KAAK,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,IAAI,IAAI,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;gBAC3H,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,IAAI,KAAK,SAAS;oBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,IAAI,KAAK,aAAa;gBAC9B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChH,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,IAAmG;IACpH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,gBAAgB,CAC7B,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,CAAY,CAC/G,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;IAC9G,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,IAAiB,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK;YAAE,SAAS;QAC1C,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrE,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK;oBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,IAAI,mCAAmC,MAAM,EAAE,CAAC,CAAC;gBACnH,SAAS;YACX,CAAC;YACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,IAAI,2CAA2C,CAAC,CAAC;gBACpF,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,KAAK;gBAAE,SAAS;YACrF,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAuB,EAAE,CAAC;gBAC1D,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,SAAS,CAAC,IAAI,KAAK,iBAAiB;oBAAE,SAAS;gBAClF,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;oBACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,QAAQ,wBAAwB,IAAI,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GACb,CAAC,SAAS,CAAC,IAAI,KAAK,qBAAqB,IAAI,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC9E,CAAC,SAAS,CAAC,IAAI,KAAK,qBAAqB;gBACvC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC;gBACpC,SAAS,CAAC,YAA0B,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnH,IAAI,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,kEAAkE,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB;YAAE,OAAO;QAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,IAAI,yCAAyC,CAAC,CAAC;IACtG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,IAAY;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG;YAAE,SAAS;QAChD,IAAI,OAAO,KAAK,IAAI;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;;YAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/B,CAAC;AAGD,MAAM,UAAU,UAAU,CAAC,GAAgC;IACzD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACjC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,KAAK,EAAE;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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 tail: string;
|
|
7
|
+
readonly draftNote: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function draftTextToBlocks(args: {
|
|
10
|
+
readonly text: string;
|
|
11
|
+
readonly streamId: string;
|
|
12
|
+
readonly createId: () => string;
|
|
13
|
+
readonly usage?: readonly SseUsage[];
|
|
14
|
+
}): Promise<Result<BlockStreamMsg[]>>;
|
|
15
|
+
export declare function blockEndOf(msgs: readonly BlockStreamMsg[]): BlockEndMsg | undefined;
|
|
16
|
+
export declare function parseDraftText(text: string): Promise<Result<ParsedDraft>>;
|
|
17
|
+
export declare function renderDraftText(draft: Pick<ParsedDraft, "vfs" | "intro" | "tail">): string;
|
|
@@ -0,0 +1,107 @@
|
|
|
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
|
+
import { draftNoteOf } from "./draft-note.js";
|
|
5
|
+
function toLines(text) {
|
|
6
|
+
const lines = text.split("\n");
|
|
7
|
+
if (lines.length > 0 && lines[lines.length - 1] === "")
|
|
8
|
+
lines.pop();
|
|
9
|
+
return lines;
|
|
10
|
+
}
|
|
11
|
+
export async function draftTextToBlocks(args) {
|
|
12
|
+
const inner = `${args.streamId}:lines`;
|
|
13
|
+
const now = new Date();
|
|
14
|
+
const lines = toLines(args.text);
|
|
15
|
+
const input = new ReadableStream({
|
|
16
|
+
start(controller) {
|
|
17
|
+
controller.enqueue({ type: "line.begin", streamId: inner, timestamp: now });
|
|
18
|
+
lines.forEach((content, index) => controller.enqueue({ type: "line.line", streamId: inner, content, lineNr: index + 1, timestamp: now }));
|
|
19
|
+
(args.usage ?? []).forEach((usage, index) => controller.enqueue({ type: "delta.usage", streamId: args.streamId, usage, deltaSeq: index, timestamp: now }));
|
|
20
|
+
controller.enqueue({ type: "line.end", streamId: inner, totalLines: lines.length, timestamp: now });
|
|
21
|
+
controller.close();
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const out = input.pipeThrough(createBlockStream(args.streamId, inner, args.createId));
|
|
25
|
+
const collected = [];
|
|
26
|
+
const read = await exception2Result(async () => {
|
|
27
|
+
const reader = out.getReader();
|
|
28
|
+
for (;;) {
|
|
29
|
+
const next = await reader.read();
|
|
30
|
+
if (next.done === true)
|
|
31
|
+
break;
|
|
32
|
+
collected.push(next.value);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
if (read.isErr())
|
|
36
|
+
return Result.Err(read.Err());
|
|
37
|
+
return Result.Ok(collected);
|
|
38
|
+
}
|
|
39
|
+
export function blockEndOf(msgs) {
|
|
40
|
+
const found = msgs.filter((msg) => isBlockEnd(msg));
|
|
41
|
+
return found[found.length - 1];
|
|
42
|
+
}
|
|
43
|
+
export async function parseDraftText(text) {
|
|
44
|
+
let id = 0;
|
|
45
|
+
const blocks = await draftTextToBlocks({ text, streamId: "draft-parse", createId: () => `d${++id}` });
|
|
46
|
+
if (blocks.isErr())
|
|
47
|
+
return Result.Err(blocks.Err());
|
|
48
|
+
const accumulator = createBlockAccumulator();
|
|
49
|
+
const code = [];
|
|
50
|
+
const before = [];
|
|
51
|
+
let tail = [];
|
|
52
|
+
let seenCode = false;
|
|
53
|
+
for (const msg of blocks.Ok()) {
|
|
54
|
+
const closed = accumulator.ingest(msg);
|
|
55
|
+
if (closed !== undefined)
|
|
56
|
+
code.push({ begin: closed.begin, lines: [...closed.lines], end: closed.end });
|
|
57
|
+
if (isCodeEnd(msg)) {
|
|
58
|
+
seenCode = true;
|
|
59
|
+
tail = [];
|
|
60
|
+
}
|
|
61
|
+
if (isToplevelLine(msg)) {
|
|
62
|
+
if (seenCode)
|
|
63
|
+
tail.push(msg.line);
|
|
64
|
+
else
|
|
65
|
+
before.push(msg.line);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const resolved = resolveCodeBlocks(code, new Map());
|
|
69
|
+
const vfs = new Map();
|
|
70
|
+
for (const file of resolved.files) {
|
|
71
|
+
if (file.type === "code-block")
|
|
72
|
+
vfs.set(file.filename, file.content);
|
|
73
|
+
}
|
|
74
|
+
const tailText = tail.join("\n").trim();
|
|
75
|
+
return Result.Ok({
|
|
76
|
+
vfs,
|
|
77
|
+
intro: before
|
|
78
|
+
.map((line) => line.trim())
|
|
79
|
+
.filter((line) => line.length > 0)
|
|
80
|
+
.join(" "),
|
|
81
|
+
tail: tailText,
|
|
82
|
+
draftNote: draftNoteOf(tailText),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function fenceLang(path) {
|
|
86
|
+
const ext = /\.(\w+)$/.exec(path)?.[1]?.toLowerCase() ?? "jsx";
|
|
87
|
+
if (ext === "json" || ext === "css" || ext === "tsx" || ext === "ts" || ext === "js")
|
|
88
|
+
return ext;
|
|
89
|
+
return "jsx";
|
|
90
|
+
}
|
|
91
|
+
function fileOrder(path) {
|
|
92
|
+
if (path === "/App.jsx")
|
|
93
|
+
return 0;
|
|
94
|
+
if (path === "/seed.json")
|
|
95
|
+
return 2;
|
|
96
|
+
return 1;
|
|
97
|
+
}
|
|
98
|
+
export function renderDraftText(draft) {
|
|
99
|
+
const paths = [...draft.vfs.keys()].sort((a, b) => fileOrder(a) - fileOrder(b) || a.localeCompare(b));
|
|
100
|
+
const files = paths.map((path) => {
|
|
101
|
+
const body = (draft.vfs.get(path) ?? "").replace(/\n+$/, "");
|
|
102
|
+
return `### \`${path.replace(/^\/+/, "")}\`\n\`\`\`${fenceLang(path)}\n${body}\n\`\`\``;
|
|
103
|
+
});
|
|
104
|
+
const intro = draft.intro.length > 0 ? draft.intro : "Here is the first draft.";
|
|
105
|
+
return [intro, ...files, ...(draft.tail.length > 0 ? [draft.tail] : [])].join("\n\n") + "\n";
|
|
106
|
+
}
|
|
107
|
+
//# 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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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import type { PromptAndBlockMsgs } from "@vibes.diy/api-types";
|
|
3
|
+
import type { DashAuthType, VerifiedAuthResult } from "@vibes.diy/identity";
|
|
4
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
5
|
+
import type { DraftToPersist } from "./draft-lane.js";
|
|
6
|
+
export interface PersistDraftArgs {
|
|
7
|
+
readonly chatId: string;
|
|
8
|
+
readonly ownerHandle: string;
|
|
9
|
+
readonly appSlug: string;
|
|
10
|
+
readonly auth: DashAuthType;
|
|
11
|
+
readonly verified: VerifiedAuthResult;
|
|
12
|
+
readonly draft: DraftToPersist;
|
|
13
|
+
}
|
|
14
|
+
export declare function insertSection(vctx: VibesApiSQLCtx, row: {
|
|
15
|
+
readonly chatId: string;
|
|
16
|
+
readonly promptId: string;
|
|
17
|
+
readonly blockSeq: number;
|
|
18
|
+
readonly evt: PromptAndBlockMsgs;
|
|
19
|
+
}): Promise<Result<void>>;
|
|
20
|
+
export interface PersistDraftSeams {
|
|
21
|
+
readonly insertClosingSection?: typeof insertSection;
|
|
22
|
+
}
|
|
23
|
+
export declare function persistDraftBuild(vctx: VibesApiSQLCtx, args: PersistDraftArgs, seams?: PersistDraftSeams): Promise<Result<{
|
|
24
|
+
readonly appSlug: string;
|
|
25
|
+
readonly buildId: string;
|
|
26
|
+
}>>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { handlePromptContext } from "../public/handle-prompt-context.js";
|
|
3
|
+
import { blockEndOf, draftTextToBlocks } from "./draft-lane-parse.js";
|
|
4
|
+
export async function insertSection(vctx, row) {
|
|
5
|
+
const inserted = await exception2Result(() => vctx.sql.db.insert(vctx.sql.tables.chatSections).values({
|
|
6
|
+
chatId: row.chatId,
|
|
7
|
+
promptId: row.promptId,
|
|
8
|
+
blockSeq: row.blockSeq,
|
|
9
|
+
blocks: [row.evt],
|
|
10
|
+
created: new Date().toISOString(),
|
|
11
|
+
}));
|
|
12
|
+
return inserted.isErr() ? Result.Err(inserted.Err()) : Result.Ok(undefined);
|
|
13
|
+
}
|
|
14
|
+
export async function persistDraftBuild(vctx, args, seams) {
|
|
15
|
+
const { chatId, draft } = args;
|
|
16
|
+
const promptId = vctx.sthis.nextId(12).str;
|
|
17
|
+
const request = {
|
|
18
|
+
model: draft.model,
|
|
19
|
+
messages: [{ role: "user", content: [{ type: "text", text: draft.sentence }] }],
|
|
20
|
+
};
|
|
21
|
+
const req = {
|
|
22
|
+
type: "vibes.diy.req-prompt-chat-section",
|
|
23
|
+
mode: "codegen",
|
|
24
|
+
auth: args.auth,
|
|
25
|
+
chatId,
|
|
26
|
+
outerTid: `draft-lane-${chatId}`,
|
|
27
|
+
prompt: request,
|
|
28
|
+
_auth: args.verified,
|
|
29
|
+
};
|
|
30
|
+
const begin = await insertSection(vctx, {
|
|
31
|
+
chatId,
|
|
32
|
+
promptId,
|
|
33
|
+
blockSeq: 0,
|
|
34
|
+
evt: { type: "prompt.block-begin", streamId: promptId, chatId, seq: 0, timestamp: new Date() },
|
|
35
|
+
});
|
|
36
|
+
if (begin.isErr())
|
|
37
|
+
return Result.Err(begin.Err());
|
|
38
|
+
const echo = await insertSection(vctx, {
|
|
39
|
+
chatId,
|
|
40
|
+
promptId,
|
|
41
|
+
blockSeq: 1,
|
|
42
|
+
evt: { type: "prompt.req", request, streamId: promptId, chatId, seq: 1, timestamp: new Date() },
|
|
43
|
+
});
|
|
44
|
+
if (echo.isErr())
|
|
45
|
+
return Result.Err(echo.Err());
|
|
46
|
+
let id = 0;
|
|
47
|
+
const blocks = await draftTextToBlocks({
|
|
48
|
+
text: draft.text,
|
|
49
|
+
streamId: promptId,
|
|
50
|
+
createId: () => `${promptId}-${++id}`,
|
|
51
|
+
usage: draft.usage.map((usage) => ({
|
|
52
|
+
prompt_tokens: usage.prompt_tokens,
|
|
53
|
+
completion_tokens: usage.completion_tokens,
|
|
54
|
+
total_tokens: usage.total_tokens,
|
|
55
|
+
model: usage.model ?? draft.model,
|
|
56
|
+
...(usage.reasoningEffort === undefined ? {} : { reasoningEffort: usage.reasoningEffort }),
|
|
57
|
+
})),
|
|
58
|
+
});
|
|
59
|
+
if (blocks.isErr())
|
|
60
|
+
return Result.Err(blocks.Err());
|
|
61
|
+
const end = blockEndOf(blocks.Ok());
|
|
62
|
+
if (end === undefined)
|
|
63
|
+
return Result.Err("draft block stream produced no block.end");
|
|
64
|
+
const persisted = await handlePromptContext({
|
|
65
|
+
vctx,
|
|
66
|
+
req,
|
|
67
|
+
resChat: { ownerHandle: args.ownerHandle, appSlug: args.appSlug, mode: "codegen" },
|
|
68
|
+
promptId,
|
|
69
|
+
blockSeq: 2,
|
|
70
|
+
value: end,
|
|
71
|
+
collectedMsgs: [...blocks.Ok()],
|
|
72
|
+
model: draft.model,
|
|
73
|
+
absorbCost: true,
|
|
74
|
+
leaveLookMarkers: true,
|
|
75
|
+
promptVariant: "initial-draft",
|
|
76
|
+
});
|
|
77
|
+
if (persisted.isErr())
|
|
78
|
+
return Result.Err(persisted.Err());
|
|
79
|
+
const { blockSeq, fsRef, deferredPersist } = persisted.Ok();
|
|
80
|
+
if (deferredPersist !== undefined || fsRef.IsNone())
|
|
81
|
+
return Result.Err("draft turn committed no filesystem");
|
|
82
|
+
const ref = fsRef.unwrap();
|
|
83
|
+
const closed = await (seams?.insertClosingSection ?? insertSection)(vctx, {
|
|
84
|
+
chatId,
|
|
85
|
+
promptId,
|
|
86
|
+
blockSeq,
|
|
87
|
+
evt: { type: "prompt.block-end", streamId: promptId, chatId, seq: blockSeq, timestamp: new Date() },
|
|
88
|
+
});
|
|
89
|
+
if (closed.isErr()) {
|
|
90
|
+
vctx.logger.Warn().Err(closed.Err()).Str("chatId", chatId).Str("promptId", promptId).Msg("draft-lane-block-end-failed");
|
|
91
|
+
}
|
|
92
|
+
return Result.Ok({ appSlug: ref.appSlug, buildId: ref.fsId });
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=draft-lane-persist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-lane-persist.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-persist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
3
|
+
import type { DraftClassification, DraftDeferred } from "./draft-lane-classify.js";
|
|
4
|
+
export declare const DRAFT_PARAGRAPH: string;
|
|
5
|
+
export declare function composeDraftBrief(sentence: string): string;
|
|
6
|
+
export declare function composeRepairAsk(findings: readonly string[]): string;
|
|
7
|
+
export declare function appendDraftContext(systemPrompt: string, args: {
|
|
8
|
+
readonly deferred: DraftDeferred;
|
|
9
|
+
readonly ownerHandle: string;
|
|
10
|
+
}): string;
|
|
11
|
+
export declare function loadDraftSystemPrompt(vctx: VibesApiSQLCtx, args: {
|
|
12
|
+
readonly chatId: string;
|
|
13
|
+
readonly ownerHandle: string;
|
|
14
|
+
readonly model: string;
|
|
15
|
+
readonly classification: DraftClassification;
|
|
16
|
+
}): Promise<Result<string>>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { hasLookBrief, makeBaseSystemPrompt } from "@vibes.diy/prompts";
|
|
3
|
+
import { createPromptAssetFetch, promptsPkgBaseUrl } from "./prompt-asset-fetch.js";
|
|
4
|
+
import { loadActiveSettings } from "./prompt-assembly.js";
|
|
5
|
+
export const DRAFT_PARAGRAPH = "Build the interaction this sentence names, fully working, with realistic launch content. " +
|
|
6
|
+
"Records are documents with a type; every list is a live query; every save is a document write. " +
|
|
7
|
+
"Known values are direct controls. " +
|
|
8
|
+
"Sharing, invitations, roles, scheduled jobs, emails and outside services appear as labelled stand-ins.";
|
|
9
|
+
export function composeDraftBrief(sentence) {
|
|
10
|
+
const trimmed = sentence.trim().replace(/[.\s]+$/, "");
|
|
11
|
+
return `${trimmed}. ${DRAFT_PARAGRAPH}`;
|
|
12
|
+
}
|
|
13
|
+
export function composeRepairAsk(findings) {
|
|
14
|
+
const listed = findings.slice(0, 6).join("\n");
|
|
15
|
+
return (`Opening the app in the browser reported:\n\n${listed}\n\n` +
|
|
16
|
+
"Write the corrected draft in full, same files and same format (each file under its `### `path`` heading, " +
|
|
17
|
+
"complete, once; `seed.json` last; the `Draft note:` line after it). Keep everything that already worked.");
|
|
18
|
+
}
|
|
19
|
+
export function appendDraftContext(systemPrompt, args) {
|
|
20
|
+
const deferredEntries = Object.entries(args.deferred).filter((entry) => typeof entry[1] === "string" && entry[1].length > 0);
|
|
21
|
+
const planned = deferredEntries.length === 0
|
|
22
|
+
? ""
|
|
23
|
+
: "\n\n<planned-later>\nThe agent adds these in its own pass; give each a stand-in in the place it will live:\n" +
|
|
24
|
+
deferredEntries.map(([key, why]) => `- ${key}: ${why}`).join("\n") +
|
|
25
|
+
"\n</planned-later>";
|
|
26
|
+
const previewMaker = `<preview-maker>${JSON.stringify({ handle: args.ownerHandle })}</preview-maker>\n` +
|
|
27
|
+
"This is the maker opening the first preview. Match seed.json parent IDs to this maker's opening query; resolve each visitor's identity dynamically in app code.";
|
|
28
|
+
return [systemPrompt.replace(/\n+$/, "") + planned, previewMaker].join("\n\n");
|
|
29
|
+
}
|
|
30
|
+
export async function loadDraftSystemPrompt(vctx, args) {
|
|
31
|
+
const active = await exception2Result(() => loadActiveSettings(vctx, args.chatId));
|
|
32
|
+
if (active.isErr())
|
|
33
|
+
return Result.Err(active.Err());
|
|
34
|
+
const { theme, layoutArchetype, flourishes, textureNote } = active.Ok();
|
|
35
|
+
const includeLook = theme !== undefined && hasLookBrief(theme);
|
|
36
|
+
const pkgBaseUrl = promptsPkgBaseUrl(vctx.params.pkgRepos.workspace);
|
|
37
|
+
const fetch = createPromptAssetFetch({ fetchAsset: vctx.fetchAsset });
|
|
38
|
+
const base = await exception2Result(() => makeBaseSystemPrompt(args.model, {
|
|
39
|
+
skills: [...args.classification.skills],
|
|
40
|
+
theme,
|
|
41
|
+
...(includeLook ? { look: true } : {}),
|
|
42
|
+
title: args.classification.title,
|
|
43
|
+
layoutArchetype,
|
|
44
|
+
flourishes,
|
|
45
|
+
textureNote,
|
|
46
|
+
demoData: false,
|
|
47
|
+
suppressDefaultStylePrompt: false,
|
|
48
|
+
variant: "initial-draft",
|
|
49
|
+
pkgBaseUrl,
|
|
50
|
+
fetch,
|
|
51
|
+
}));
|
|
52
|
+
if (base.isErr())
|
|
53
|
+
return Result.Err(base.Err());
|
|
54
|
+
return Result.Ok(appendDraftContext(base.Ok().systemPrompt, {
|
|
55
|
+
deferred: args.classification.deferred,
|
|
56
|
+
ownerHandle: args.ownerHandle,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=draft-lane-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-lane-prompt.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Result } from "@adviser/cement";
|
|
2
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
3
|
+
import type { AgentSessionPins } from "./agent-session.js";
|
|
4
|
+
export interface DraftOpensVerdict {
|
|
5
|
+
readonly opens: boolean;
|
|
6
|
+
readonly findings: readonly string[];
|
|
7
|
+
readonly retries: number;
|
|
8
|
+
readonly classifierMs: number;
|
|
9
|
+
readonly draftMs: number;
|
|
10
|
+
readonly classifierSource: "model" | "template";
|
|
11
|
+
readonly autofixNotes: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export interface DraftRowVerdict {
|
|
14
|
+
readonly opens: boolean;
|
|
15
|
+
readonly findings: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface DraftCompletion {
|
|
18
|
+
readonly appSlug: string;
|
|
19
|
+
readonly buildId: string;
|
|
20
|
+
readonly draftNote: string;
|
|
21
|
+
readonly opensVerdict?: DraftRowVerdict;
|
|
22
|
+
readonly aliasesUsed?: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export interface DraftJobSql {
|
|
25
|
+
readonly db: VibesApiSQLCtx["sql"]["db"];
|
|
26
|
+
readonly tables: VibesApiSQLCtx["sql"]["tables"];
|
|
27
|
+
}
|
|
28
|
+
export interface DraftClaimOpts {
|
|
29
|
+
readonly pins?: AgentSessionPins;
|
|
30
|
+
}
|
|
31
|
+
export interface DraftJobStore {
|
|
32
|
+
claimDraft(sql: DraftJobSql, chatId: string, leaseMs: number, opts?: DraftClaimOpts): Promise<Result<string | null>>;
|
|
33
|
+
renewDraft(sql: DraftJobSql, chatId: string, leaseToken: string, leaseMs: number): Promise<Result<boolean>>;
|
|
34
|
+
completeDraft(sql: DraftJobSql, chatId: string, leaseToken: string, completion: DraftCompletion): Promise<Result<boolean>>;
|
|
35
|
+
abandonDraft(sql: DraftJobSql, chatId: string, leaseToken: string): Promise<Result<boolean>>;
|
|
36
|
+
}
|
|
37
|
+
export declare function draftJobStoreFor(): DraftJobStore;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-lane-store.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-store.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAmE1F,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
2
|
+
import type { DraftModelCall } from "./draft-lane-classify.js";
|
|
3
|
+
export interface DraftTransportCtx {
|
|
4
|
+
readonly llmRequest: VibesApiSQLCtx["llmRequest"];
|
|
5
|
+
readonly params: {
|
|
6
|
+
readonly llm: {
|
|
7
|
+
readonly headers: VibesApiSQLCtx["params"]["llm"]["headers"];
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function draftModelCallFor(vctx: DraftTransportCtx): DraftModelCall;
|