@vibes.diy/api-svc 14.2.7 → 14.2.9
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/cf-serve.js +1 -1
- package/cf-serve.js.map +1 -1
- package/check-auth.d.ts +3 -2
- package/check-build-auth.d.ts +18 -0
- package/check-build-auth.js +73 -0
- package/check-build-auth.js.map +1 -0
- package/create-handler.js +13 -0
- package/create-handler.js.map +1 -1
- package/evento-handler-manifest.js +5 -0
- package/evento-handler-manifest.js.map +1 -1
- package/guest-build-token.d.ts +16 -0
- package/guest-build-token.js +44 -0
- package/guest-build-token.js.map +1 -0
- package/intern/agent-actor.d.ts +1 -0
- package/intern/agent-actor.js +1 -1
- package/intern/agent-actor.js.map +1 -1
- package/intern/agent-router.js +1 -1
- package/intern/agent-router.js.map +1 -1
- package/intern/attach-draft-handle.d.ts +2 -1
- package/intern/attach-draft-handle.js +128 -68
- package/intern/attach-draft-handle.js.map +1 -1
- package/intern/automatic-draft-attachment.d.ts +10 -0
- package/intern/automatic-draft-attachment.js +25 -0
- package/intern/automatic-draft-attachment.js.map +1 -0
- package/intern/components/vibe-background-click.d.ts +1 -0
- package/intern/components/vibe-background-click.js +5 -0
- package/intern/components/vibe-background-click.js.map +1 -0
- package/intern/components/vibe-page.js +2 -0
- package/intern/components/vibe-page.js.map +1 -1
- package/intern/draft-continuation.d.ts +6 -0
- package/intern/draft-continuation.js +86 -0
- package/intern/draft-continuation.js.map +1 -0
- package/intern/draft-runtime-store.d.ts +10 -0
- package/intern/draft-runtime-store.js +46 -0
- package/intern/draft-runtime-store.js.map +1 -0
- package/intern/ensure-chat-id.d.ts +4 -3
- package/intern/ensure-chat-id.js +23 -4
- package/intern/ensure-chat-id.js.map +1 -1
- package/intern/first-build-request.d.ts +10 -0
- package/intern/first-build-request.js +69 -0
- package/intern/first-build-request.js.map +1 -0
- package/intern/get-model-defaults.d.ts +1 -0
- package/intern/get-model-defaults.js +4 -1
- package/intern/get-model-defaults.js.map +1 -1
- package/intern/get-vibe-route-hints.d.ts +2 -0
- package/intern/get-vibe-route-hints.js +11 -2
- package/intern/get-vibe-route-hints.js.map +1 -1
- package/intern/guest-build-issuance.d.ts +9 -0
- package/intern/guest-build-issuance.js +83 -0
- package/intern/guest-build-issuance.js.map +1 -0
- package/intern/guest-build-start.d.ts +8 -0
- package/intern/guest-build-start.js +66 -0
- package/intern/guest-build-start.js.map +1 -0
- package/intern/guest-build-store.d.ts +50 -0
- package/intern/guest-build-store.js +231 -0
- package/intern/guest-build-store.js.map +1 -0
- package/intern/guest-build-usage.d.ts +7 -0
- package/intern/guest-build-usage.js +18 -0
- package/intern/guest-build-usage.js.map +1 -0
- package/intern/mint-job-store.d.ts +11 -1
- package/intern/mint-job-store.js +44 -6
- package/intern/mint-job-store.js.map +1 -1
- package/intern/prompt-assembly.d.ts +1 -0
- package/intern/prompt-assembly.js +1 -0
- package/intern/prompt-assembly.js.map +1 -1
- package/models.json +1 -0
- package/package.json +12 -12
- package/public/attach-draft-handle.js +16 -3
- package/public/attach-draft-handle.js.map +1 -1
- package/public/draft-runtime.d.ts +5 -0
- package/public/draft-runtime.js +299 -0
- package/public/draft-runtime.js.map +1 -0
- package/public/get-chat-details.js +14 -6
- package/public/get-chat-details.js.map +1 -1
- package/public/get-chat-response.js +16 -9
- package/public/get-chat-response.js.map +1 -1
- package/public/guest-build-generation.d.ts +8 -0
- package/public/guest-build-generation.js +218 -0
- package/public/guest-build-generation.js.map +1 -0
- package/public/guest-build.d.ts +7 -0
- package/public/guest-build.js +127 -0
- package/public/guest-build.js.map +1 -0
- package/public/llm-dispatch.d.ts +9 -7
- package/public/llm-dispatch.js +21 -7
- package/public/llm-dispatch.js.map +1 -1
- package/public/open-chat.d.ts +5 -1
- package/public/open-chat.js +69 -34
- package/public/open-chat.js.map +1 -1
- package/public/prompt-chat-section.d.ts +2 -1
- package/public/prompt-chat-section.js +19 -5
- package/public/prompt-chat-section.js.map +1 -1
- package/public/shared-mint.js +3 -1
- package/public/shared-mint.js.map +1 -1
- package/public/stream-assembly.d.ts +9 -7
- package/public/stream-assembly.js +19 -5
- package/public/stream-assembly.js.map +1 -1
- package/types.d.ts +2 -0
- package/types.js.map +1 -1
- package/usage-report/billing-reconcile-util.d.ts +1 -0
- package/usage-report/billing-reconcile-util.js +2 -1
- package/usage-report/billing-reconcile-util.js.map +1 -1
- package/usage-report/draft-output-alert.d.ts +13 -0
- package/usage-report/draft-output-alert.js +25 -0
- package/usage-report/draft-output-alert.js.map +1 -0
- package/usage-report/new-user-alert-util.d.ts +1 -0
- package/usage-report/new-user-alert-util.js +19 -4
- package/usage-report/new-user-alert-util.js.map +1 -1
- package/usage-report/new-user-alert.js +16 -10
- package/usage-report/new-user-alert.js.map +1 -1
- package/usage-report/prompt-cost-sql.d.ts +2 -0
- package/usage-report/prompt-cost-sql.js +2 -0
- package/usage-report/prompt-cost-sql.js.map +1 -1
- package/usage-report/user-journey.js +2 -2
- package/usage-report/user-journey.js.map +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Result, type HandleTriggerCtx, type EventoResultType } from "@adviser/cement";
|
|
2
|
+
import { type MsgBase, type ReqOpenChat, type ReqPromptChatSection, type ReqWithVerifiedBuildAuth, type VibesDiyError, type W3CWebSocketEvent } from "@vibes.diy/api-types";
|
|
3
|
+
type BuildCtx<Req extends {
|
|
4
|
+
type: string;
|
|
5
|
+
}> = HandleTriggerCtx<W3CWebSocketEvent, MsgBase<ReqWithVerifiedBuildAuth<Req>>, VibesDiyError>;
|
|
6
|
+
export declare function handleGuestOpen(ctx: BuildCtx<ReqOpenChat>): Promise<Result<EventoResultType>>;
|
|
7
|
+
export declare function handleGuestPrompt(ctx: BuildCtx<ReqPromptChatSection>): Promise<Result<EventoResultType>>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { EventoResult, Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { scopey } from "@adviser/scopey";
|
|
3
|
+
import { and, eq } from "drizzle-orm";
|
|
4
|
+
import { type } from "arktype";
|
|
5
|
+
import { DRAFT_OWNER_HANDLE, isReqPromptLLMChatSection, } from "@vibes.diy/api-types";
|
|
6
|
+
import { wrapMsgBase } from "../unwrap-msg-base.js";
|
|
7
|
+
import { requireLiveGuestBuild } from "./guest-build.js";
|
|
8
|
+
import { admitGuestBuild, settleGuestBuild } from "../intern/guest-build-store.js";
|
|
9
|
+
import { resendChatSectionsPrevMsg } from "../intern/resend-prev-msg.js";
|
|
10
|
+
import { assemblePromptPayload } from "../intern/prompt-assembly.js";
|
|
11
|
+
import { getModelDefaults } from "../intern/get-model-defaults.js";
|
|
12
|
+
import { appendBlockEvent } from "./llm-dispatch.js";
|
|
13
|
+
import { handleLlmResponse } from "./stream-assembly.js";
|
|
14
|
+
import { closeTurn } from "../intern/open-turn-store.js";
|
|
15
|
+
import { maxPersistedBlockSeq } from "../intern/persisted-block-seq.js";
|
|
16
|
+
import { peekInFlightTurns } from "../intern/in-flight-turns.js";
|
|
17
|
+
import { GUEST_INITIAL_OUTPUT_TOKEN_LIMIT } from "@vibes.diy/vibe-types/runtime-ai-limits.js";
|
|
18
|
+
const guestPromptText = type({ messages: [{ role: "'user'", content: [{ type: "'text'", text: "0 < string <= 16000" }] }] });
|
|
19
|
+
export async function handleGuestOpen(ctx) {
|
|
20
|
+
const req = ctx.validated.payload;
|
|
21
|
+
if (req._auth.type !== "VerifiedGuestBuildAuth")
|
|
22
|
+
return Result.Err("guest-build-auth-required");
|
|
23
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
24
|
+
const allowed = await requireLiveGuestBuild(vctx, req._auth);
|
|
25
|
+
if (allowed.isErr())
|
|
26
|
+
return Result.Err(allowed.Err());
|
|
27
|
+
const row = allowed.Ok();
|
|
28
|
+
const t = vctx.sql.tables.chatContexts;
|
|
29
|
+
const found = await exception2Result(() => vctx.sql.db
|
|
30
|
+
.select({ appSlug: t.appSlug, ownerHandle: t.ownerHandle })
|
|
31
|
+
.from(t)
|
|
32
|
+
.where(and(eq(t.chatId, row.chatId), eq(t.userId, row.guestUserId)))
|
|
33
|
+
.limit(1));
|
|
34
|
+
if (found.isErr())
|
|
35
|
+
return Result.Err(found.Err());
|
|
36
|
+
const address = found.Ok()[0];
|
|
37
|
+
if (address === undefined || address.ownerHandle !== DRAFT_OWNER_HANDLE)
|
|
38
|
+
return Result.Err("guest-build-unavailable");
|
|
39
|
+
const wsp = ctx.send.provider;
|
|
40
|
+
const chatCtx = wsp.chatIds.get(row.chatId) ?? { chatId: row.chatId, tids: new Set() };
|
|
41
|
+
chatCtx.tids.add(ctx.validated.tid);
|
|
42
|
+
wsp.chatIds.set(row.chatId, chatCtx);
|
|
43
|
+
const replay = await resendChatSectionsPrevMsg({
|
|
44
|
+
vctx,
|
|
45
|
+
chatCtx,
|
|
46
|
+
tid: ctx.validated.tid,
|
|
47
|
+
dst: ctx.validated.src,
|
|
48
|
+
send: (msg) => ctx.send.send(ctx, msg),
|
|
49
|
+
});
|
|
50
|
+
if (replay.isErr())
|
|
51
|
+
return Result.Err(replay.Err());
|
|
52
|
+
const acknowledged = await ctx.send.send(ctx, wrapMsgBase(ctx.validated, {
|
|
53
|
+
tid: ctx.validated.tid,
|
|
54
|
+
payload: {
|
|
55
|
+
type: "vibes.diy.res-open-chat",
|
|
56
|
+
chatId: row.chatId,
|
|
57
|
+
...address,
|
|
58
|
+
mode: "codegen",
|
|
59
|
+
draft: true,
|
|
60
|
+
firstTurnFired: row.status !== "issued",
|
|
61
|
+
},
|
|
62
|
+
}));
|
|
63
|
+
return acknowledged.isErr() ? Result.Err(acknowledged.Err()) : Result.Ok(EventoResult.Continue);
|
|
64
|
+
}
|
|
65
|
+
export async function handleGuestPrompt(ctx) {
|
|
66
|
+
const original = ctx.validated.payload;
|
|
67
|
+
if (original._auth.type !== "VerifiedGuestBuildAuth" ||
|
|
68
|
+
original.mode !== "codegen" ||
|
|
69
|
+
isReqPromptLLMChatSection(original) === false)
|
|
70
|
+
return Result.Err("guest-build-mode-refused");
|
|
71
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
72
|
+
if (vctx.sthis.env.get("GUEST_FIRST_BUILD_ENABLED") !== "true")
|
|
73
|
+
return Result.Err("guest-build-issuance-paused");
|
|
74
|
+
const allowed = await requireLiveGuestBuild(vctx, original._auth);
|
|
75
|
+
if (allowed.isErr())
|
|
76
|
+
return Result.Err(allowed.Err());
|
|
77
|
+
const prompt = guestPromptText(original.prompt);
|
|
78
|
+
if (prompt instanceof type.errors)
|
|
79
|
+
return Result.Err("guest-build-needs-one-description");
|
|
80
|
+
const req = {
|
|
81
|
+
type: "vibes.diy.req-prompt-chat-section",
|
|
82
|
+
mode: "codegen",
|
|
83
|
+
chatId: original.chatId,
|
|
84
|
+
outerTid: original.outerTid,
|
|
85
|
+
guest: original._auth.inGuestAuth,
|
|
86
|
+
_auth: original._auth,
|
|
87
|
+
prompt: { messages: prompt.messages },
|
|
88
|
+
};
|
|
89
|
+
ctx.validated.payload = req;
|
|
90
|
+
const row = allowed.Ok();
|
|
91
|
+
if (prompt.messages[0].content[0].text !== row.originalPrompt)
|
|
92
|
+
return Result.Err("guest-build-original-prompt-required");
|
|
93
|
+
const promptId = vctx.sthis.nextId(12).str;
|
|
94
|
+
const admitted = await admitGuestBuild(vctx, { chatId: row.chatId, guestUserId: row.guestUserId, jti: row.jti, promptId });
|
|
95
|
+
if (admitted.isErr())
|
|
96
|
+
return Result.Err(admitted.Err());
|
|
97
|
+
if (admitted.Ok() === false)
|
|
98
|
+
return Result.Err("guest-build-sign-in-to-continue");
|
|
99
|
+
const resChat = { ownerHandle: DRAFT_OWNER_HANDLE, appSlug: `draft-${row.chatId}`, mode: "codegen" };
|
|
100
|
+
await exception2Result(() => ctx.send.send(ctx, wrapMsgBase(ctx.validated, {
|
|
101
|
+
tid: ctx.validated.tid,
|
|
102
|
+
payload: { type: "vibes.diy.res-prompt-chat-section", chatId: row.chatId, ...resChat, promptId, outerTid: req.outerTid },
|
|
103
|
+
})));
|
|
104
|
+
let blockSeq = 0;
|
|
105
|
+
const terminal = { promptBlockEndEmitted: false };
|
|
106
|
+
const completed = await exception2Result(() => scopey(async (scope) => {
|
|
107
|
+
const models = await scope.evalResult(() => getModelDefaults(vctx, {})).do();
|
|
108
|
+
const model = models.codegen.model.id;
|
|
109
|
+
const assembled = await scope
|
|
110
|
+
.evalResult(() => assemblePromptPayload(vctx, {
|
|
111
|
+
chatId: row.chatId,
|
|
112
|
+
userId: row.guestUserId,
|
|
113
|
+
model,
|
|
114
|
+
newUserMessages: prompt.messages,
|
|
115
|
+
degradeAttachments: true,
|
|
116
|
+
}))
|
|
117
|
+
.do();
|
|
118
|
+
await scope
|
|
119
|
+
.evalResult(() => appendBlockEvent({
|
|
120
|
+
ctx,
|
|
121
|
+
vctx,
|
|
122
|
+
req,
|
|
123
|
+
promptId,
|
|
124
|
+
blockSeq,
|
|
125
|
+
evt: { type: "prompt.block-begin", streamId: promptId, chatId: row.chatId, seq: blockSeq++, timestamp: new Date() },
|
|
126
|
+
}))
|
|
127
|
+
.do();
|
|
128
|
+
const llmReq = {
|
|
129
|
+
model,
|
|
130
|
+
messages: assembled.messages,
|
|
131
|
+
stream: true,
|
|
132
|
+
max_tokens: GUEST_INITIAL_OUTPUT_TOKEN_LIMIT,
|
|
133
|
+
verbosity: "low",
|
|
134
|
+
headers: vctx.params.llm.headers,
|
|
135
|
+
};
|
|
136
|
+
await scope
|
|
137
|
+
.evalResult(() => appendBlockEvent({
|
|
138
|
+
ctx,
|
|
139
|
+
vctx,
|
|
140
|
+
req,
|
|
141
|
+
promptId,
|
|
142
|
+
blockSeq,
|
|
143
|
+
evt: {
|
|
144
|
+
type: "prompt.req",
|
|
145
|
+
request: { model, messages: prompt.messages },
|
|
146
|
+
streamId: promptId,
|
|
147
|
+
chatId: row.chatId,
|
|
148
|
+
seq: blockSeq++,
|
|
149
|
+
timestamp: new Date(),
|
|
150
|
+
},
|
|
151
|
+
}))
|
|
152
|
+
.do();
|
|
153
|
+
const abort = new AbortController();
|
|
154
|
+
const response = await scope.evalResult(() => exception2Result(() => vctx.llmRequest(llmReq, { signal: abort.signal }))).do();
|
|
155
|
+
if (response.ok === false || response.body === null)
|
|
156
|
+
return Result.Err(`guest-build-provider-error: ${response.status}`);
|
|
157
|
+
blockSeq = await handleLlmResponse({
|
|
158
|
+
scope,
|
|
159
|
+
ctx,
|
|
160
|
+
vctx,
|
|
161
|
+
req,
|
|
162
|
+
resChat,
|
|
163
|
+
res: response,
|
|
164
|
+
promptId,
|
|
165
|
+
blockSeq,
|
|
166
|
+
llmReq,
|
|
167
|
+
abort,
|
|
168
|
+
terminal,
|
|
169
|
+
frontendDraft: true,
|
|
170
|
+
codegenTheme: assembled.codegenTheme,
|
|
171
|
+
codegenVariety: assembled.codegenVariety,
|
|
172
|
+
});
|
|
173
|
+
return Result.Ok(undefined);
|
|
174
|
+
})).finally(() => terminal.releasePersistGate?.());
|
|
175
|
+
const maxSeq = await maxPersistedBlockSeq(vctx.sql, { chatId: row.chatId, promptId });
|
|
176
|
+
if (maxSeq.isErr())
|
|
177
|
+
return Result.Err(maxSeq.Err());
|
|
178
|
+
blockSeq = Math.max(blockSeq, (maxSeq.Ok() ?? -1) + 1);
|
|
179
|
+
if (completed.isErr()) {
|
|
180
|
+
const error = await appendBlockEvent({
|
|
181
|
+
ctx,
|
|
182
|
+
vctx,
|
|
183
|
+
req,
|
|
184
|
+
promptId,
|
|
185
|
+
blockSeq,
|
|
186
|
+
evt: {
|
|
187
|
+
type: "prompt.error",
|
|
188
|
+
streamId: promptId,
|
|
189
|
+
chatId: row.chatId,
|
|
190
|
+
seq: blockSeq++,
|
|
191
|
+
timestamp: new Date(),
|
|
192
|
+
error: completed.Err().message,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
if (error.isErr())
|
|
196
|
+
return Result.Err(error.Err());
|
|
197
|
+
}
|
|
198
|
+
const ended = await appendBlockEvent({
|
|
199
|
+
ctx,
|
|
200
|
+
vctx,
|
|
201
|
+
req,
|
|
202
|
+
promptId,
|
|
203
|
+
blockSeq,
|
|
204
|
+
emitMode: terminal.promptBlockEndEmitted === true ? "store-only" : "store",
|
|
205
|
+
evt: { type: "prompt.block-end", streamId: promptId, chatId: row.chatId, seq: blockSeq, timestamp: new Date() },
|
|
206
|
+
});
|
|
207
|
+
if (ended.isErr())
|
|
208
|
+
return Result.Err(ended.Err());
|
|
209
|
+
const closed = await closeTurn(vctx.sql, { chatId: row.chatId, promptId });
|
|
210
|
+
if (closed.isErr())
|
|
211
|
+
return Result.Err(closed.Err());
|
|
212
|
+
peekInFlightTurns(row.chatId)?.delete(promptId);
|
|
213
|
+
const settled = await settleGuestBuild(vctx, { chatId: row.chatId, promptId });
|
|
214
|
+
if (settled.isErr())
|
|
215
|
+
return Result.Err(settled.Err());
|
|
216
|
+
return Result.Ok(EventoResult.Continue);
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=guest-build-generation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-build-generation.js","sourceRoot":"","sources":["../../jsr/public/guest-build-generation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Result, type EventoHandler } from "@adviser/cement";
|
|
2
|
+
import { type MsgBase, type ReqGuestBuildStatus, type ReqClaimGuestBuild, type W3CWebSocketEvent, type VibesDiyError, type VerifiedGuestBuildAuth } from "@vibes.diy/api-types";
|
|
3
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
4
|
+
import { type GuestBuildRow } from "../intern/guest-build-store.js";
|
|
5
|
+
export declare function requireLiveGuestBuild(vctx: VibesApiSQLCtx, auth: VerifiedGuestBuildAuth): Promise<Result<GuestBuildRow>>;
|
|
6
|
+
export declare const guestBuildStatus: EventoHandler<W3CWebSocketEvent, MsgBase<ReqGuestBuildStatus>, VibesDiyError>;
|
|
7
|
+
export declare const claimGuestBuild: EventoHandler<W3CWebSocketEvent, MsgBase<ReqClaimGuestBuild>, VibesDiyError>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { EventoResult, Option, Result, exception2Result } from "@adviser/cement";
|
|
2
|
+
import { type } from "arktype";
|
|
3
|
+
import { and, eq } from "drizzle-orm";
|
|
4
|
+
import { reqGuestBuildStatus, reqClaimGuestBuild, } from "@vibes.diy/api-types";
|
|
5
|
+
import { automaticallyAttachDraft } from "../intern/automatic-draft-attachment.js";
|
|
6
|
+
import { checkAuth } from "../check-auth.js";
|
|
7
|
+
import { checkBuildAuth } from "../check-build-auth.js";
|
|
8
|
+
import { unwrapMsgBase, wrapMsgBase } from "../unwrap-msg-base.js";
|
|
9
|
+
import { readGuestBuild, recoverGuestBuild, transferGuestBuild } from "../intern/guest-build-store.js";
|
|
10
|
+
export async function requireLiveGuestBuild(vctx, auth) {
|
|
11
|
+
if (vctx.sthis.env.get("GUEST_FIRST_BUILD_SCHEMA_READY") !== "true")
|
|
12
|
+
return Result.Err("guest-build-disabled");
|
|
13
|
+
const claims = auth.verifiedAuth.claims;
|
|
14
|
+
const loaded = await readGuestBuild(vctx, claims.chatId);
|
|
15
|
+
if (loaded.isErr())
|
|
16
|
+
return Result.Err(loaded.Err());
|
|
17
|
+
const row = loaded.Ok();
|
|
18
|
+
if (row === undefined ||
|
|
19
|
+
row.jti !== claims.jti ||
|
|
20
|
+
row.guestUserId !== claims.userId ||
|
|
21
|
+
row.shardId !== claims.shardId ||
|
|
22
|
+
row.plane !== claims.plane)
|
|
23
|
+
return Result.Err("guest-build-unavailable");
|
|
24
|
+
if (row.claimedUserId !== null)
|
|
25
|
+
return Result.Err("guest-build-already-claimed");
|
|
26
|
+
if (row.expiresAt <= new Date().toISOString())
|
|
27
|
+
return Result.Err("guest-build-expired");
|
|
28
|
+
return recoverGuestBuild(vctx, row);
|
|
29
|
+
}
|
|
30
|
+
async function sendStatus(ctx, row) {
|
|
31
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
32
|
+
const t = vctx.sql.tables.chatContexts;
|
|
33
|
+
const address = await exception2Result(() => vctx.sql.db
|
|
34
|
+
.select({ ownerHandle: t.ownerHandle, appSlug: t.appSlug })
|
|
35
|
+
.from(t)
|
|
36
|
+
.where(and(eq(t.chatId, row.chatId), eq(t.userId, row.claimedUserId ?? row.guestUserId)))
|
|
37
|
+
.limit(1));
|
|
38
|
+
if (address.isErr())
|
|
39
|
+
return Result.Err(address.Err());
|
|
40
|
+
if (address.Ok().length !== 1)
|
|
41
|
+
return Result.Err("guest-build-ownership-unavailable");
|
|
42
|
+
const sent = await ctx.send.send(ctx, wrapMsgBase(ctx.validated, {
|
|
43
|
+
tid: ctx.validated.tid,
|
|
44
|
+
payload: { type: "vibes.diy.res-guest-build-status", chatId: row.chatId, status: row.status, ...address.Ok()[0] },
|
|
45
|
+
}));
|
|
46
|
+
return sent.isErr() ? Result.Err(sent.Err()) : Result.Ok(undefined);
|
|
47
|
+
}
|
|
48
|
+
export const guestBuildStatus = {
|
|
49
|
+
hash: "guest-build-status",
|
|
50
|
+
validate: unwrapMsgBase(async (msg) => {
|
|
51
|
+
const parsed = reqGuestBuildStatus(msg.payload);
|
|
52
|
+
return Result.Ok(parsed instanceof type.errors ? Option.None() : Option.Some({ ...msg, payload: parsed }));
|
|
53
|
+
}),
|
|
54
|
+
handle: checkBuildAuth(async (ctx) => {
|
|
55
|
+
const req = ctx.validated.payload;
|
|
56
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
57
|
+
if (vctx.sthis.env.get("GUEST_FIRST_BUILD_SCHEMA_READY") !== "true")
|
|
58
|
+
return Result.Err("guest-build-disabled");
|
|
59
|
+
const loaded = req._auth.type === "VerifiedGuestBuildAuth"
|
|
60
|
+
? await requireLiveGuestBuild(vctx, req._auth)
|
|
61
|
+
: await readGuestBuild(vctx, req.chatId);
|
|
62
|
+
if (loaded.isErr())
|
|
63
|
+
return Result.Err(loaded.Err());
|
|
64
|
+
const row = loaded.Ok();
|
|
65
|
+
if (row === undefined ||
|
|
66
|
+
(req._auth.type === "VerifiedAuthResult" && row.claimedUserId !== req._auth.verifiedAuth.claims.userId))
|
|
67
|
+
return Result.Err("guest-build-unavailable");
|
|
68
|
+
const sent = await sendStatus(ctx, row);
|
|
69
|
+
return sent.isErr() ? Result.Err(sent.Err()) : Result.Ok(EventoResult.Continue);
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
export const claimGuestBuild = {
|
|
73
|
+
hash: "claim-guest-build",
|
|
74
|
+
validate: unwrapMsgBase(async (msg) => {
|
|
75
|
+
const parsed = reqClaimGuestBuild(msg.payload);
|
|
76
|
+
return Result.Ok(parsed instanceof type.errors ? Option.None() : Option.Some({ ...msg, payload: parsed }));
|
|
77
|
+
}),
|
|
78
|
+
handle: checkAuth(async (ctx) => {
|
|
79
|
+
const req = ctx.validated.payload;
|
|
80
|
+
const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
|
|
81
|
+
if (vctx.sthis.env.get("GUEST_FIRST_BUILD_SCHEMA_READY") !== "true" || vctx.guestBuildSigner === undefined)
|
|
82
|
+
return Result.Err("guest-build-disabled");
|
|
83
|
+
const existing = await readGuestBuild(vctx, req.chatId);
|
|
84
|
+
if (existing.isErr())
|
|
85
|
+
return Result.Err(existing.Err());
|
|
86
|
+
const owned = existing.Ok();
|
|
87
|
+
const userId = req._auth.verifiedAuth.claims.userId;
|
|
88
|
+
if (owned?.claimedUserId !== userId) {
|
|
89
|
+
const verified = await vctx.guestBuildSigner.verify(req.guest.token);
|
|
90
|
+
if (verified.isErr())
|
|
91
|
+
return Result.Err(verified.Err());
|
|
92
|
+
const claims = verified.Ok();
|
|
93
|
+
if (claims.chatId !== req.chatId)
|
|
94
|
+
return Result.Err("guest-build-chat-mismatch");
|
|
95
|
+
const moved = await transferGuestBuild(vctx, { chatId: req.chatId, guestUserId: claims.userId, jti: claims.jti, userId });
|
|
96
|
+
if (moved.isErr())
|
|
97
|
+
return Result.Err(moved.Err());
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const checked = await transferGuestBuild(vctx, {
|
|
101
|
+
chatId: req.chatId,
|
|
102
|
+
guestUserId: owned.guestUserId,
|
|
103
|
+
jti: owned.jti,
|
|
104
|
+
userId,
|
|
105
|
+
});
|
|
106
|
+
if (checked.isErr())
|
|
107
|
+
return Result.Err(checked.Err());
|
|
108
|
+
}
|
|
109
|
+
const attached = await automaticallyAttachDraft(vctx, {
|
|
110
|
+
chatId: req.chatId,
|
|
111
|
+
userId,
|
|
112
|
+
auth: req.auth,
|
|
113
|
+
verifiedAuth: req._auth,
|
|
114
|
+
});
|
|
115
|
+
if (attached.isErr())
|
|
116
|
+
return Result.Err(attached.Err());
|
|
117
|
+
const reloaded = await readGuestBuild(vctx, req.chatId);
|
|
118
|
+
if (reloaded.isErr())
|
|
119
|
+
return Result.Err(reloaded.Err());
|
|
120
|
+
const row = reloaded.Ok();
|
|
121
|
+
if (row === undefined || row.claimedUserId !== userId)
|
|
122
|
+
return Result.Err("guest-build-unavailable");
|
|
123
|
+
const sent = await sendStatus(ctx, row);
|
|
124
|
+
return sent.isErr() ? Result.Err(sent.Err()) : Result.Ok(EventoResult.Continue);
|
|
125
|
+
}),
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=guest-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-build.js","sourceRoot":"","sources":["../../jsr/public/guest-build.ts"],"names":[],"mappings":"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"}
|
package/public/llm-dispatch.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result, Option, HandleTriggerCtx } from "@adviser/cement";
|
|
2
2
|
import { Scope } from "@adviser/scopey";
|
|
3
|
-
import { LLMHeaders, type PromptStyle, type Model, MsgBase, PromptAndBlockMsgs, ReqPromptChatSection, ReqPromptLLMChatSection, ReqWithVerifiedAuth, type FileSystemItem, VibeFile, VibesDiyError, W3CWebSocketEvent, type UrlResearchJob } from "@vibes.diy/api-types";
|
|
3
|
+
import { LLMHeaders, type PromptStyle, type Model, MsgBase, PromptAndBlockMsgs, ReqPromptChatSection, ReqPromptLLMChatSection, ReqWithVerifiedAuth, type ReqWithVerifiedBuildAuth, type FileSystemItem, VibeFile, VibesDiyError, W3CWebSocketEvent, type UrlResearchJob } from "@vibes.diy/api-types";
|
|
4
4
|
import { VibesApiSQLCtx } from "../types.js";
|
|
5
5
|
import { LLMRequest, ChatMessage, type LLMMessage, FileSystemRef, BlockEndMsg, type ToolDefinition } from "@vibes.diy/call-ai-v2";
|
|
6
6
|
import { sqlite } from "@vibes.diy/api-sql";
|
|
@@ -85,9 +85,9 @@ export interface ResChat {
|
|
|
85
85
|
mode: PromptStyle;
|
|
86
86
|
}
|
|
87
87
|
interface AppendBlockEventParams {
|
|
88
|
-
ctx: HandleTriggerCtx<W3CWebSocketEvent, MsgBase<
|
|
88
|
+
ctx: HandleTriggerCtx<W3CWebSocketEvent, MsgBase<ReqWithVerifiedBuildAuth<ReqPromptChatSection>>, never | VibesDiyError>;
|
|
89
89
|
vctx: VibesApiSQLCtx;
|
|
90
|
-
req:
|
|
90
|
+
req: ReqWithVerifiedBuildAuth<ReqPromptChatSection>;
|
|
91
91
|
promptId: string;
|
|
92
92
|
blockSeq: number;
|
|
93
93
|
evt: PromptAndBlockMsgs;
|
|
@@ -101,12 +101,12 @@ export declare function autoPublishOnPersist(vctx: VibesApiSQLCtx, args: {
|
|
|
101
101
|
readonly appSlug: string;
|
|
102
102
|
readonly fsId: string;
|
|
103
103
|
readonly callerUserId: string;
|
|
104
|
-
readonly auth: ReqPromptChatSection["auth"]
|
|
104
|
+
readonly auth: NonNullable<ReqPromptChatSection["auth"]>;
|
|
105
105
|
readonly promptId: string;
|
|
106
106
|
}): Promise<void>;
|
|
107
|
-
export declare function handlePromptContext({ vctx, req, resChat, promptId, blockSeq, value, collectedMsgs: iCollectedMsgs, proseOnly, blockChunks, fileSystem, model, byok, researchRequested, codegenTheme, codegenVariety, editBaseFsId, initiator, agentDispatched, carried, onFsRef, persistSections, ctx, }: {
|
|
107
|
+
export declare function handlePromptContext({ vctx, req, resChat, promptId, blockSeq, value, collectedMsgs: iCollectedMsgs, proseOnly, blockChunks, fileSystem, model, byok, researchRequested, codegenTheme, codegenVariety, editBaseFsId, initiator, agentDispatched, carried, onFsRef, frontendDraft, persistSections, ctx, }: {
|
|
108
108
|
vctx: VibesApiSQLCtx;
|
|
109
|
-
req:
|
|
109
|
+
req: ReqWithVerifiedBuildAuth<ReqPromptChatSection>;
|
|
110
110
|
ctx?: AppendBlockEventParams["ctx"];
|
|
111
111
|
resChat: ResChat;
|
|
112
112
|
promptId: string;
|
|
@@ -114,6 +114,7 @@ export declare function handlePromptContext({ vctx, req, resChat, promptId, bloc
|
|
|
114
114
|
value: BlockEndMsg;
|
|
115
115
|
collectedMsgs: PromptAndBlockMsgs[];
|
|
116
116
|
blockChunks?: number;
|
|
117
|
+
frontendDraft?: boolean;
|
|
117
118
|
persistSections?: (sections: sqlite.SqlChatSection[]) => Promise<Result<void>>;
|
|
118
119
|
fileSystem?: VibeFile[];
|
|
119
120
|
carried?: readonly FileSystemItem[];
|
|
@@ -142,7 +143,8 @@ export declare function mergeServerTools(outgoing: {
|
|
|
142
143
|
tools?: ToolDefinition[];
|
|
143
144
|
tool_choice?: "auto";
|
|
144
145
|
};
|
|
145
|
-
export declare function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resChat, promptId, preAssembled, serverTools, initiator, agentDispatched, platformInitiated, }: {
|
|
146
|
+
export declare function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resChat, promptId, preAssembled, serverTools, initiator, agentDispatched, platformInitiated, modelUsage, }: {
|
|
147
|
+
modelUsage?: "agent";
|
|
146
148
|
scope: Scope;
|
|
147
149
|
ctx: HandleTriggerCtx<W3CWebSocketEvent, MsgBase<ReqWithVerifiedAuth<ReqPromptChatSection>>, never | VibesDiyError>;
|
|
148
150
|
vctx: VibesApiSQLCtx;
|
package/public/llm-dispatch.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { persistGuestUsage } from "../intern/guest-build-usage.js";
|
|
1
2
|
import { Result, Option, exception2Result, chunkyAsync } from "@adviser/cement";
|
|
2
3
|
import { convertImageEvtToFileRef } from "./convert-image-evt.js";
|
|
3
4
|
import { canonicalModelUsage, isDraftOwnerHandle, isPromptFSStyle, isReqPromptFSUpdateChatSection, buildUrlResearchJob, isResError, } from "@vibes.diy/api-types";
|
|
@@ -349,6 +350,8 @@ function lastUserText(messages) {
|
|
|
349
350
|
return last.content.map((part) => (part.type === "text" ? part.text : "")).join("");
|
|
350
351
|
}
|
|
351
352
|
export async function appendBlockEvent({ ctx, vctx, req, promptId, blockSeq, evt, emitMode = "store", resChat, initiator, }) {
|
|
353
|
+
if (isBlockImage(evt) && req._auth.type === "VerifiedGuestBuildAuth")
|
|
354
|
+
return Result.Err("guest-build-images-refused");
|
|
352
355
|
let processedEvt = evt;
|
|
353
356
|
if (isBlockImage(evt) && evt.url && resChat) {
|
|
354
357
|
const rConv = await convertImageEvtToFileRef(vctx, {
|
|
@@ -478,7 +481,7 @@ async function persistChatSections(vctx, sections) {
|
|
|
478
481
|
});
|
|
479
482
|
return result;
|
|
480
483
|
}
|
|
481
|
-
export async function handlePromptContext({ vctx, req, resChat, promptId, blockSeq, value, collectedMsgs: iCollectedMsgs, proseOnly, blockChunks = 100, fileSystem, model, byok, researchRequested, codegenTheme, codegenVariety, editBaseFsId, initiator, agentDispatched, carried, onFsRef, persistSections = (sections) => persistChatSections(vctx, sections), ctx, }) {
|
|
484
|
+
export async function handlePromptContext({ vctx, req, resChat, promptId, blockSeq, value, collectedMsgs: iCollectedMsgs, proseOnly, blockChunks = 100, fileSystem, model, byok, researchRequested, codegenTheme, codegenVariety, editBaseFsId, initiator, agentDispatched, carried, onFsRef, frontendDraft, persistSections = (sections) => persistChatSections(vctx, sections), ctx, }) {
|
|
482
485
|
let fsRef = Option.None();
|
|
483
486
|
let deferredPersist;
|
|
484
487
|
const code = [];
|
|
@@ -516,6 +519,7 @@ export async function handlePromptContext({ vctx, req, resChat, promptId, blockS
|
|
|
516
519
|
totalTokens: value.usage.calculated.total_tokens,
|
|
517
520
|
ref: {
|
|
518
521
|
type: "prompt.usage.sql",
|
|
522
|
+
...(frontendDraft === true ? { frontendDraft: true } : {}),
|
|
519
523
|
usage: value.usage,
|
|
520
524
|
fsRef: fsRef.toValue(),
|
|
521
525
|
...(model !== undefined && model !== "" ? { model } : {}),
|
|
@@ -534,7 +538,9 @@ export async function handlePromptContext({ vctx, req, resChat, promptId, blockS
|
|
|
534
538
|
const rSections = await persistSections(sections);
|
|
535
539
|
if (rSections.isErr())
|
|
536
540
|
return Result.Err(rSections);
|
|
537
|
-
const rContext = await exception2Result(() =>
|
|
541
|
+
const rContext = await exception2Result(() => req._auth.type === "VerifiedGuestBuildAuth"
|
|
542
|
+
? persistGuestUsage(vctx, promptContextValues())
|
|
543
|
+
: vctx.sql.db.insert(vctx.sql.tables.promptContexts).values(promptContextValues()));
|
|
538
544
|
if (rContext.isErr())
|
|
539
545
|
return Result.Err(rContext);
|
|
540
546
|
draftReplayPersisted = true;
|
|
@@ -586,6 +592,8 @@ export async function handlePromptContext({ vctx, req, resChat, promptId, blockS
|
|
|
586
592
|
proseOnly !== true &&
|
|
587
593
|
code.length > 0 &&
|
|
588
594
|
(resChat.mode === "codegen" || isPromptFSStyle(resChat.mode))) {
|
|
595
|
+
if (req._auth.type === "VerifiedGuestBuildAuth" || req.auth === undefined)
|
|
596
|
+
return Result.Err("guest-build-cannot-publish");
|
|
589
597
|
let resolvedFileSystem;
|
|
590
598
|
let changedPathsFromBlocks;
|
|
591
599
|
let carriedItems = carried ?? [];
|
|
@@ -666,7 +674,13 @@ export async function handlePromptContext({ vctx, req, resChat, promptId, blockS
|
|
|
666
674
|
const rSql = await exception2Result(async () => {
|
|
667
675
|
const values = promptContextValues();
|
|
668
676
|
if (draftReplayPersisted === false) {
|
|
669
|
-
|
|
677
|
+
if (req._auth.type === "VerifiedGuestBuildAuth") {
|
|
678
|
+
const persisted = await persistGuestUsage(vctx, values);
|
|
679
|
+
if (persisted.isErr())
|
|
680
|
+
return persisted;
|
|
681
|
+
}
|
|
682
|
+
else
|
|
683
|
+
await vctx.sql.db.insert(vctx.sql.tables.promptContexts).values(values);
|
|
670
684
|
}
|
|
671
685
|
else if (deferredPersist === undefined) {
|
|
672
686
|
await vctx.sql.db
|
|
@@ -688,7 +702,7 @@ export async function handlePromptContext({ vctx, req, resChat, promptId, blockS
|
|
|
688
702
|
}
|
|
689
703
|
const costCents = costCentsFromUsage(value.usage);
|
|
690
704
|
const billingP = (async () => {
|
|
691
|
-
if (costCents <= 0)
|
|
705
|
+
if (costCents <= 0 || req._auth.type === "VerifiedGuestBuildAuth")
|
|
692
706
|
return;
|
|
693
707
|
if (byok === true)
|
|
694
708
|
return;
|
|
@@ -785,7 +799,7 @@ export async function handlePromptContext({ vctx, req, resChat, promptId, blockS
|
|
|
785
799
|
await reconciliation;
|
|
786
800
|
}
|
|
787
801
|
}
|
|
788
|
-
if (fsRef.IsSome() && initiator !== "platform") {
|
|
802
|
+
if (fsRef.IsSome() && initiator !== "platform" && req._auth.type === "VerifiedAuthResult" && req.auth !== undefined) {
|
|
789
803
|
const mintTask = autoPublishOnPersist(vctx, {
|
|
790
804
|
ownerHandle: ownerHandleForPersist,
|
|
791
805
|
appSlug: appSlugForPersist,
|
|
@@ -855,7 +869,7 @@ async function runtimeImageInputGate(vctx, messages, modelId) {
|
|
|
855
869
|
}
|
|
856
870
|
return Result.Ok(undefined);
|
|
857
871
|
}
|
|
858
|
-
export async function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resChat, promptId, preAssembled, serverTools, initiator, agentDispatched, platformInitiated, }) {
|
|
872
|
+
export async function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resChat, promptId, preAssembled, serverTools, initiator, agentDispatched, platformInitiated, modelUsage, }) {
|
|
859
873
|
const resolved = await scope
|
|
860
874
|
.evalResult(async () => {
|
|
861
875
|
const r = await getModelDefaults(vctx, { appSlug: resChat.appSlug, ownerHandle: resChat.ownerHandle });
|
|
@@ -865,7 +879,7 @@ export async function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resCh
|
|
|
865
879
|
let param;
|
|
866
880
|
switch (req.mode) {
|
|
867
881
|
case "codegen":
|
|
868
|
-
param = r.Ok().codegen;
|
|
882
|
+
param = modelUsage === "agent" ? r.Ok().agent : r.Ok().codegen;
|
|
869
883
|
break;
|
|
870
884
|
case "runtime":
|
|
871
885
|
param = r.Ok().runtime;
|