@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.
- 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/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 +9 -0
- package/intern/agent-request-frame.js +14 -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/attach-draft-handle.js +51 -8
- package/intern/attach-draft-handle.js.map +1 -1
- 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 +16 -0
- package/intern/draft-lane-config.js +25 -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 +102 -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 +16 -0
- package/intern/draft-lane-parse.js +104 -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 +92 -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 +36 -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 +3 -0
- package/intern/draft-lane-transport.js +58 -0
- package/intern/draft-lane-transport.js.map +1 -0
- package/intern/draft-lane-worker.d.ts +37 -0
- package/intern/draft-lane-worker.js +156 -0
- package/intern/draft-lane-worker.js.map +1 -0
- package/intern/draft-lane.d.ts +60 -0
- package/intern/draft-lane.js +148 -0
- package/intern/draft-lane.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 +25 -0
- package/intern/import-synth.js +456 -0
- package/intern/import-synth.js.map +1 -0
- package/intern/inline-build-pass.d.ts +23 -0
- package/intern/inline-build-pass.js +27 -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 +1 -0
- package/intern/look-lint.js +4 -1
- package/intern/look-lint.js.map +1 -1
- package/intern/mint-job-store.d.ts +50 -2
- package/intern/mint-job-store.js +149 -4
- package/intern/mint-job-store.js.map +1 -1
- package/intern/opens-check.d.ts +14 -0
- package/intern/opens-check.js +1044 -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 +53 -0
- package/intern/save-build-pass.js.map +1 -0
- package/package.json +13 -12
- package/public/agent-turn-assembly.js +16 -0
- package/public/agent-turn-assembly.js.map +1 -1
- package/public/handle-prompt-context.d.ts +3 -1
- package/public/handle-prompt-context.js +39 -4
- 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 +2 -0
- package/public/open-chat.js +80 -11
- package/public/open-chat.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/types.d.ts +2 -0
- package/types.js.map +1 -1
|
@@ -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,92 @@
|
|
|
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
|
+
})),
|
|
57
|
+
});
|
|
58
|
+
if (blocks.isErr())
|
|
59
|
+
return Result.Err(blocks.Err());
|
|
60
|
+
const end = blockEndOf(blocks.Ok());
|
|
61
|
+
if (end === undefined)
|
|
62
|
+
return Result.Err("draft block stream produced no block.end");
|
|
63
|
+
const persisted = await handlePromptContext({
|
|
64
|
+
vctx,
|
|
65
|
+
req,
|
|
66
|
+
resChat: { ownerHandle: args.ownerHandle, appSlug: args.appSlug, mode: "codegen" },
|
|
67
|
+
promptId,
|
|
68
|
+
blockSeq: 2,
|
|
69
|
+
value: end,
|
|
70
|
+
collectedMsgs: [...blocks.Ok()],
|
|
71
|
+
model: draft.model,
|
|
72
|
+
absorbCost: true,
|
|
73
|
+
leaveLookMarkers: true,
|
|
74
|
+
});
|
|
75
|
+
if (persisted.isErr())
|
|
76
|
+
return Result.Err(persisted.Err());
|
|
77
|
+
const { blockSeq, fsRef, deferredPersist } = persisted.Ok();
|
|
78
|
+
if (deferredPersist !== undefined || fsRef.IsNone())
|
|
79
|
+
return Result.Err("draft turn committed no filesystem");
|
|
80
|
+
const ref = fsRef.unwrap();
|
|
81
|
+
const closed = await (seams?.insertClosingSection ?? insertSection)(vctx, {
|
|
82
|
+
chatId,
|
|
83
|
+
promptId,
|
|
84
|
+
blockSeq,
|
|
85
|
+
evt: { type: "prompt.block-end", streamId: promptId, chatId, seq: blockSeq, timestamp: new Date() },
|
|
86
|
+
});
|
|
87
|
+
if (closed.isErr()) {
|
|
88
|
+
vctx.logger.Warn().Err(closed.Err()).Str("chatId", chatId).Str("promptId", promptId).Msg("draft-lane-block-end-failed");
|
|
89
|
+
}
|
|
90
|
+
return Result.Ok({ appSlug: ref.appSlug, buildId: ref.fsId });
|
|
91
|
+
}
|
|
92
|
+
//# 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 Stand-ins list 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,36 @@
|
|
|
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
|
+
}
|
|
23
|
+
export interface DraftJobSql {
|
|
24
|
+
readonly db: VibesApiSQLCtx["sql"]["db"];
|
|
25
|
+
readonly tables: VibesApiSQLCtx["sql"]["tables"];
|
|
26
|
+
}
|
|
27
|
+
export interface DraftClaimOpts {
|
|
28
|
+
readonly pins?: AgentSessionPins;
|
|
29
|
+
}
|
|
30
|
+
export interface DraftJobStore {
|
|
31
|
+
claimDraft(sql: DraftJobSql, chatId: string, leaseMs: number, opts?: DraftClaimOpts): Promise<Result<string | null>>;
|
|
32
|
+
renewDraft(sql: DraftJobSql, chatId: string, leaseToken: string, leaseMs: number): Promise<Result<boolean>>;
|
|
33
|
+
completeDraft(sql: DraftJobSql, chatId: string, leaseToken: string, completion: DraftCompletion): Promise<Result<boolean>>;
|
|
34
|
+
abandonDraft(sql: DraftJobSql, chatId: string, leaseToken: string): Promise<Result<boolean>>;
|
|
35
|
+
}
|
|
36
|
+
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;AA6D1F,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { type } from "arktype";
|
|
3
|
+
const completion = type({
|
|
4
|
+
"model?": "string",
|
|
5
|
+
choices: type({ message: { content: "string | null" }, "finish_reason?": "string | null" }).array(),
|
|
6
|
+
"usage?": {
|
|
7
|
+
"prompt_tokens?": "number >= 0",
|
|
8
|
+
"completion_tokens?": "number >= 0",
|
|
9
|
+
"total_tokens?": "number >= 0",
|
|
10
|
+
"cost?": "number >= 0",
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
function toChatMessages(req) {
|
|
14
|
+
return req.messages.map((message) => ({ role: message.role, content: [{ type: "text", text: message.content }] }));
|
|
15
|
+
}
|
|
16
|
+
export function draftModelCallFor(vctx) {
|
|
17
|
+
return async function callDraftModel(req) {
|
|
18
|
+
const response = await exception2Result(() => vctx.llmRequest({
|
|
19
|
+
model: req.model,
|
|
20
|
+
messages: toChatMessages(req),
|
|
21
|
+
stream: false,
|
|
22
|
+
max_tokens: req.maxTokens,
|
|
23
|
+
headers: vctx.params.llm.headers,
|
|
24
|
+
}, req.signal === undefined ? undefined : { signal: req.signal }));
|
|
25
|
+
if (response.isErr())
|
|
26
|
+
return Result.Err(response.Err());
|
|
27
|
+
const res = response.Ok();
|
|
28
|
+
if (res.ok === false) {
|
|
29
|
+
await exception2Result(() => res.body?.cancel());
|
|
30
|
+
return Result.Err(`draft-model-status-${res.status}`);
|
|
31
|
+
}
|
|
32
|
+
const json = await exception2Result(() => res.json());
|
|
33
|
+
if (json.isErr())
|
|
34
|
+
return Result.Err(json.Err());
|
|
35
|
+
const parsed = completion(json.Ok());
|
|
36
|
+
if (parsed instanceof type.errors)
|
|
37
|
+
return Result.Err(`draft-model-contract: ${parsed.summary}`);
|
|
38
|
+
const content = parsed.choices[0]?.message.content;
|
|
39
|
+
if (content === undefined || content === null || content.length === 0)
|
|
40
|
+
return Result.Err("draft-model-empty-reply");
|
|
41
|
+
const usage = parsed.usage;
|
|
42
|
+
return Result.Ok({
|
|
43
|
+
text: content,
|
|
44
|
+
...(parsed.model === undefined ? {} : { model: parsed.model }),
|
|
45
|
+
...(usage === undefined
|
|
46
|
+
? {}
|
|
47
|
+
: {
|
|
48
|
+
usage: {
|
|
49
|
+
prompt_tokens: usage.prompt_tokens ?? 0,
|
|
50
|
+
completion_tokens: usage.completion_tokens ?? 0,
|
|
51
|
+
total_tokens: usage.total_tokens ?? (usage.prompt_tokens ?? 0) + (usage.completion_tokens ?? 0),
|
|
52
|
+
...(usage.cost === undefined ? {} : { cost: usage.cost }),
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=draft-lane-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-lane-transport.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import type { DashAuthType } from "@vibes.diy/identity";
|
|
3
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
4
|
+
import type { DraftJobStore } from "./draft-lane-store.js";
|
|
5
|
+
export declare const DRAFT_LANE_PATH = "/internal/draft-lane";
|
|
6
|
+
export declare const DRAFT_LANE_AUTH_HEADER = "x-vibes-draft-lane-auth";
|
|
7
|
+
export declare const draftLaneJob: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
8
|
+
chatId: string;
|
|
9
|
+
leaseToken: string;
|
|
10
|
+
sentence: string;
|
|
11
|
+
auth: {
|
|
12
|
+
type: "clerk" | "device-id" | "ucan";
|
|
13
|
+
token: string;
|
|
14
|
+
};
|
|
15
|
+
}, {}>;
|
|
16
|
+
export type DraftLaneJob = typeof draftLaneJob.infer;
|
|
17
|
+
export type DispatchDraftLane = (job: DraftLaneJob) => Promise<Result<void>>;
|
|
18
|
+
export declare function draftLaneDispatcher(args: {
|
|
19
|
+
readonly baseUrl: string | undefined;
|
|
20
|
+
readonly internalSecret: string | undefined;
|
|
21
|
+
readonly fetch: (request: Request) => Promise<Response>;
|
|
22
|
+
}): DispatchDraftLane | undefined;
|
|
23
|
+
export declare function isDraftLaneCallAuthorized(secret: string | undefined, provided: string | null): boolean;
|
|
24
|
+
export declare function startDraftLane(vctx: VibesApiSQLCtx, args: {
|
|
25
|
+
readonly chatId: string;
|
|
26
|
+
readonly prompt: string;
|
|
27
|
+
readonly auth: DashAuthType;
|
|
28
|
+
readonly jobOrder?: Promise<unknown>;
|
|
29
|
+
readonly store: DraftJobStore;
|
|
30
|
+
readonly dispatch: DispatchDraftLane | undefined;
|
|
31
|
+
}): Promise<boolean>;
|
|
32
|
+
export declare function handleDraftLaneRequest(args: {
|
|
33
|
+
readonly request: Request;
|
|
34
|
+
readonly vctx: VibesApiSQLCtx;
|
|
35
|
+
readonly internalSecret: string | undefined;
|
|
36
|
+
readonly store: DraftJobStore;
|
|
37
|
+
}): Promise<Response>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { type } from "arktype";
|
|
3
|
+
import { and, eq } from "drizzle-orm/sql/expressions";
|
|
4
|
+
import { dashAuthType } from "@vibes.diy/api-types";
|
|
5
|
+
import { verifyAuth } from "../check-auth.js";
|
|
6
|
+
import { readDraftLaneConfig } from "./draft-lane-config.js";
|
|
7
|
+
import { looksLikeBuildIntent } from "./draft-lane-classify.js";
|
|
8
|
+
import { autofixAndCheck } from "./draft-lane-autofix.js";
|
|
9
|
+
import { loadDraftSystemPrompt } from "./draft-lane-prompt.js";
|
|
10
|
+
import { draftModelCallFor } from "./draft-lane-transport.js";
|
|
11
|
+
import { persistDraftBuild } from "./draft-lane-persist.js";
|
|
12
|
+
import { validateAgentFiles } from "./agent-file-validation.js";
|
|
13
|
+
import { runDraftLane } from "./draft-lane.js";
|
|
14
|
+
export const DRAFT_LANE_PATH = "/internal/draft-lane";
|
|
15
|
+
export const DRAFT_LANE_AUTH_HEADER = "x-vibes-draft-lane-auth";
|
|
16
|
+
export const draftLaneJob = type({
|
|
17
|
+
chatId: "0 < string <= 128",
|
|
18
|
+
leaseToken: "0 < string <= 256",
|
|
19
|
+
sentence: "0 < string <= 16000",
|
|
20
|
+
auth: dashAuthType,
|
|
21
|
+
});
|
|
22
|
+
export function draftLaneDispatcher(args) {
|
|
23
|
+
const { baseUrl, internalSecret } = args;
|
|
24
|
+
if (baseUrl === undefined || baseUrl.length === 0 || internalSecret === undefined || internalSecret.length === 0)
|
|
25
|
+
return undefined;
|
|
26
|
+
const send = args.fetch;
|
|
27
|
+
return async function dispatchDraftLane(job) {
|
|
28
|
+
const request = new Request(`${baseUrl.replace(/\/+$/, "")}${DRAFT_LANE_PATH}`, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "application/json", [DRAFT_LANE_AUTH_HEADER]: internalSecret },
|
|
31
|
+
body: JSON.stringify(job),
|
|
32
|
+
});
|
|
33
|
+
const response = await exception2Result(() => send(request));
|
|
34
|
+
if (response.isErr())
|
|
35
|
+
return Result.Err(response.Err());
|
|
36
|
+
const res = response.Ok();
|
|
37
|
+
await exception2Result(() => res.body?.cancel());
|
|
38
|
+
return res.ok ? Result.Ok(undefined) : Result.Err(`draft-lane-route-status-${res.status}`);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function isDraftLaneCallAuthorized(secret, provided) {
|
|
42
|
+
if (secret === undefined || secret.length === 0)
|
|
43
|
+
return false;
|
|
44
|
+
return provided !== null && provided === secret;
|
|
45
|
+
}
|
|
46
|
+
export async function startDraftLane(vctx, args) {
|
|
47
|
+
const config = readDraftLaneConfig(vctx.sthis.env);
|
|
48
|
+
if (config.enabled === false || args.dispatch === undefined)
|
|
49
|
+
return false;
|
|
50
|
+
if (looksLikeBuildIntent(args.prompt) === false)
|
|
51
|
+
return false;
|
|
52
|
+
if (args.jobOrder !== undefined)
|
|
53
|
+
await exception2Result(() => args.jobOrder);
|
|
54
|
+
const claimed = await args.store.claimDraft(vctx.sql, args.chatId, config.leaseMs);
|
|
55
|
+
if (claimed.isErr())
|
|
56
|
+
return false;
|
|
57
|
+
const leaseToken = claimed.Ok();
|
|
58
|
+
if (leaseToken === null)
|
|
59
|
+
return false;
|
|
60
|
+
const dispatch = args.dispatch;
|
|
61
|
+
const kicked = exception2Result(() => dispatch({ chatId: args.chatId, leaseToken, sentence: args.prompt, auth: args.auth })).then(async (sent) => {
|
|
62
|
+
const failed = sent.isErr() ? sent.Err() : undefined;
|
|
63
|
+
if (failed === undefined)
|
|
64
|
+
return;
|
|
65
|
+
vctx.logger.Warn().Err(failed).Str("chatId", args.chatId).Msg("draft-lane-dispatch-failed");
|
|
66
|
+
await args.store.abandonDraft(vctx.sql, args.chatId, leaseToken);
|
|
67
|
+
});
|
|
68
|
+
const waitUntil = vctx.waitUntil;
|
|
69
|
+
if (waitUntil !== undefined) {
|
|
70
|
+
const registered = exception2Result(() => waitUntil(kicked));
|
|
71
|
+
if (registered.isErr())
|
|
72
|
+
vctx.logger.Warn().Err(registered).Str("chatId", args.chatId).Msg("draft-lane-wait-until-failed");
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
await kicked;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
function json(status, body) {
|
|
80
|
+
return new Response(JSON.stringify(body), {
|
|
81
|
+
status,
|
|
82
|
+
headers: { "Content-Type": "application/json", "Cache-Control": "no-store" },
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export async function handleDraftLaneRequest(args) {
|
|
86
|
+
const { request, vctx } = args;
|
|
87
|
+
if (request.method !== "POST")
|
|
88
|
+
return json(405, { error: "method" });
|
|
89
|
+
const config = readDraftLaneConfig(vctx.sthis.env);
|
|
90
|
+
if (config.enabled === false)
|
|
91
|
+
return json(404, { error: "draft lane off" });
|
|
92
|
+
if (isDraftLaneCallAuthorized(args.internalSecret, request.headers.get(DRAFT_LANE_AUTH_HEADER)) === false) {
|
|
93
|
+
return json(403, { error: "forbidden" });
|
|
94
|
+
}
|
|
95
|
+
const body = await exception2Result(() => request.json());
|
|
96
|
+
if (body.isErr())
|
|
97
|
+
return json(400, { error: "invalid body" });
|
|
98
|
+
const job = draftLaneJob(body.Ok());
|
|
99
|
+
if (job instanceof type.errors)
|
|
100
|
+
return json(400, { error: "invalid job" });
|
|
101
|
+
const verified = await verifyAuth(vctx, { auth: job.auth });
|
|
102
|
+
if (verified.isErr())
|
|
103
|
+
return json(401, { error: "unverified" });
|
|
104
|
+
const identity = verified.Ok();
|
|
105
|
+
if (identity.type !== "VerifiedAuthResult")
|
|
106
|
+
return json(401, { error: "unverified" });
|
|
107
|
+
const userId = identity.verifiedAuth.claims.userId;
|
|
108
|
+
const t = vctx.sql.tables.chatContexts;
|
|
109
|
+
const chat = await exception2Result(() => vctx.sql.db
|
|
110
|
+
.select({ ownerHandle: t.ownerHandle, appSlug: t.appSlug })
|
|
111
|
+
.from(t)
|
|
112
|
+
.where(and(eq(t.chatId, job.chatId), eq(t.userId, userId)))
|
|
113
|
+
.limit(1)
|
|
114
|
+
.then((rows) => rows[0]));
|
|
115
|
+
if (chat.isErr())
|
|
116
|
+
return json(503, { error: "store unavailable" });
|
|
117
|
+
const row = chat.Ok();
|
|
118
|
+
if (row === undefined)
|
|
119
|
+
return json(404, { error: "chat not found" });
|
|
120
|
+
const outcome = await runDraftLane({
|
|
121
|
+
chatId: job.chatId,
|
|
122
|
+
leaseToken: job.leaseToken,
|
|
123
|
+
sentence: job.sentence,
|
|
124
|
+
userHandle: row.ownerHandle,
|
|
125
|
+
config,
|
|
126
|
+
deps: {
|
|
127
|
+
store: args.store,
|
|
128
|
+
sql: vctx.sql,
|
|
129
|
+
callModel: draftModelCallFor(vctx),
|
|
130
|
+
systemPrompt: (classification) => loadDraftSystemPrompt(vctx, {
|
|
131
|
+
chatId: job.chatId,
|
|
132
|
+
ownerHandle: row.ownerHandle,
|
|
133
|
+
model: config.builderModel,
|
|
134
|
+
classification,
|
|
135
|
+
}),
|
|
136
|
+
autofixAndCheck,
|
|
137
|
+
saveCheck: async (vfs) => {
|
|
138
|
+
const changes = [...vfs].map(([path, contents]) => ({ path, contents }));
|
|
139
|
+
const checked = await validateAgentFiles(vctx, { vfs, changes, ownerHandle: row.ownerHandle });
|
|
140
|
+
return checked.isErr() ? Result.Err(checked.Err()) : Result.Ok(undefined);
|
|
141
|
+
},
|
|
142
|
+
persist: (draft) => persistDraftBuild(vctx, {
|
|
143
|
+
chatId: job.chatId,
|
|
144
|
+
ownerHandle: row.ownerHandle,
|
|
145
|
+
appSlug: row.appSlug,
|
|
146
|
+
auth: job.auth,
|
|
147
|
+
verified: identity,
|
|
148
|
+
draft,
|
|
149
|
+
}),
|
|
150
|
+
now: () => Date.now(),
|
|
151
|
+
log: (event) => vctx.logger.Info().Any("draftLane", event).Msg(`draft-lane-${event.step}`),
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
return json(200, { ...outcome });
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=draft-lane-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-lane-worker.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import type { DraftLaneConfig } from "./draft-lane-config.js";
|
|
3
|
+
import { type DraftClassification, type DraftModelCall, type DraftModelUsage } from "./draft-lane-classify.js";
|
|
4
|
+
import type { AutofixAndCheck } from "./draft-lane-autofix.js";
|
|
5
|
+
import type { DraftJobSql, DraftJobStore, DraftOpensVerdict } from "./draft-lane-store.js";
|
|
6
|
+
export declare const DRAFT_MAX_OUTPUT_TOKENS = 32000;
|
|
7
|
+
export interface DraftToPersist {
|
|
8
|
+
readonly chatId: string;
|
|
9
|
+
readonly sentence: string;
|
|
10
|
+
readonly text: string;
|
|
11
|
+
readonly vfs: ReadonlyMap<string, string>;
|
|
12
|
+
readonly draftNote: string;
|
|
13
|
+
readonly model: string;
|
|
14
|
+
readonly usage: readonly DraftModelUsage[];
|
|
15
|
+
readonly classification: DraftClassification;
|
|
16
|
+
}
|
|
17
|
+
export interface DraftLaneDeps {
|
|
18
|
+
readonly store: DraftJobStore;
|
|
19
|
+
readonly sql: DraftJobSql;
|
|
20
|
+
readonly callModel: DraftModelCall;
|
|
21
|
+
readonly systemPrompt: (classification: DraftClassification) => Promise<Result<string>>;
|
|
22
|
+
readonly autofixAndCheck: AutofixAndCheck;
|
|
23
|
+
readonly saveCheck: (vfs: ReadonlyMap<string, string>) => Promise<Result<void>>;
|
|
24
|
+
readonly persist: (draft: DraftToPersist) => Promise<Result<{
|
|
25
|
+
readonly appSlug: string;
|
|
26
|
+
readonly buildId: string;
|
|
27
|
+
}>>;
|
|
28
|
+
readonly now: () => number;
|
|
29
|
+
readonly log?: (event: DraftLaneEvent) => void;
|
|
30
|
+
}
|
|
31
|
+
export type DraftAbandonReason = "not-a-build" | "store-error" | "prompt-unavailable" | "builder-error" | "unparseable" | "does-not-open" | "persist-failed" | "complete-refused";
|
|
32
|
+
export type DraftLaneOutcome = {
|
|
33
|
+
readonly kind: "drafted";
|
|
34
|
+
readonly appSlug: string;
|
|
35
|
+
readonly buildId: string;
|
|
36
|
+
readonly draftNote: string;
|
|
37
|
+
readonly verdict: DraftOpensVerdict;
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: "abandoned";
|
|
40
|
+
readonly reason: DraftAbandonReason;
|
|
41
|
+
readonly detail?: string;
|
|
42
|
+
readonly verdict?: DraftOpensVerdict;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: "lease-lost";
|
|
45
|
+
readonly before: "classifier" | "builder" | "persist";
|
|
46
|
+
};
|
|
47
|
+
export interface DraftLaneEvent {
|
|
48
|
+
readonly chatId: string;
|
|
49
|
+
readonly step: "classified" | "attempt" | "settled";
|
|
50
|
+
readonly data: Readonly<Record<string, unknown>>;
|
|
51
|
+
}
|
|
52
|
+
export interface RunDraftLaneArgs {
|
|
53
|
+
readonly chatId: string;
|
|
54
|
+
readonly leaseToken: string;
|
|
55
|
+
readonly sentence: string;
|
|
56
|
+
readonly userHandle: string;
|
|
57
|
+
readonly config: DraftLaneConfig;
|
|
58
|
+
readonly deps: DraftLaneDeps;
|
|
59
|
+
}
|
|
60
|
+
export declare function runDraftLane(args: RunDraftLaneArgs): Promise<DraftLaneOutcome>;
|