@vibes.diy/api-svc 14.2.6 → 14.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/cf-serve.js +1 -1
  2. package/cf-serve.js.map +1 -1
  3. package/check-auth.d.ts +3 -2
  4. package/check-build-auth.d.ts +18 -0
  5. package/check-build-auth.js +73 -0
  6. package/check-build-auth.js.map +1 -0
  7. package/create-handler.js +13 -6
  8. package/create-handler.js.map +1 -1
  9. package/evento-handler-manifest.js +5 -0
  10. package/evento-handler-manifest.js.map +1 -1
  11. package/guest-build-token.d.ts +16 -0
  12. package/guest-build-token.js +44 -0
  13. package/guest-build-token.js.map +1 -0
  14. package/index.d.ts +0 -2
  15. package/index.js +0 -2
  16. package/index.js.map +1 -1
  17. package/intern/agent-actor.d.ts +1 -0
  18. package/intern/agent-actor.js +1 -1
  19. package/intern/agent-actor.js.map +1 -1
  20. package/intern/agent-assembly.d.ts +0 -2
  21. package/intern/agent-assembly.js +1 -4
  22. package/intern/agent-assembly.js.map +1 -1
  23. package/intern/agent-first-turn-eligible.d.ts +1 -7
  24. package/intern/agent-first-turn-eligible.js +2 -5
  25. package/intern/agent-first-turn-eligible.js.map +1 -1
  26. package/intern/agent-router.d.ts +1 -3
  27. package/intern/agent-router.js +1 -17
  28. package/intern/agent-router.js.map +1 -1
  29. package/intern/agent-session-instruction.js.map +1 -1
  30. package/intern/agent-turn.d.ts +1 -4
  31. package/intern/agent-turn.js +4 -7
  32. package/intern/agent-turn.js.map +1 -1
  33. package/intern/agent-wake.d.ts +2 -3
  34. package/intern/agent-wake.js +2 -24
  35. package/intern/agent-wake.js.map +1 -1
  36. package/intern/attach-draft-handle.d.ts +2 -1
  37. package/intern/attach-draft-handle.js +128 -68
  38. package/intern/attach-draft-handle.js.map +1 -1
  39. package/intern/automatic-draft-attachment.d.ts +10 -0
  40. package/intern/automatic-draft-attachment.js +25 -0
  41. package/intern/automatic-draft-attachment.js.map +1 -0
  42. package/intern/codegen-build-lock.d.ts +0 -5
  43. package/intern/codegen-build-lock.js +0 -3
  44. package/intern/codegen-build-lock.js.map +1 -1
  45. package/intern/draft-continuation.d.ts +6 -0
  46. package/intern/draft-continuation.js +86 -0
  47. package/intern/draft-continuation.js.map +1 -0
  48. package/intern/draft-runtime-store.d.ts +10 -0
  49. package/intern/draft-runtime-store.js +46 -0
  50. package/intern/draft-runtime-store.js.map +1 -0
  51. package/intern/ensure-chat-id.d.ts +4 -3
  52. package/intern/ensure-chat-id.js +23 -4
  53. package/intern/ensure-chat-id.js.map +1 -1
  54. package/intern/first-build-request.d.ts +10 -0
  55. package/intern/first-build-request.js +69 -0
  56. package/intern/first-build-request.js.map +1 -0
  57. package/intern/get-model-defaults.d.ts +1 -0
  58. package/intern/get-model-defaults.js +4 -1
  59. package/intern/get-model-defaults.js.map +1 -1
  60. package/intern/guest-build-issuance.d.ts +9 -0
  61. package/intern/guest-build-issuance.js +83 -0
  62. package/intern/guest-build-issuance.js.map +1 -0
  63. package/intern/guest-build-start.d.ts +8 -0
  64. package/intern/guest-build-start.js +66 -0
  65. package/intern/guest-build-start.js.map +1 -0
  66. package/intern/guest-build-store.d.ts +50 -0
  67. package/intern/guest-build-store.js +231 -0
  68. package/intern/guest-build-store.js.map +1 -0
  69. package/intern/guest-build-usage.d.ts +7 -0
  70. package/intern/guest-build-usage.js +18 -0
  71. package/intern/guest-build-usage.js.map +1 -0
  72. package/intern/mint-decision.js.map +1 -1
  73. package/intern/mint-fire-core.js.map +1 -1
  74. package/intern/mint-job-store.d.ts +11 -1
  75. package/intern/mint-job-store.js +44 -6
  76. package/intern/mint-job-store.js.map +1 -1
  77. package/intern/open-turn-store.d.ts +0 -4
  78. package/intern/open-turn-store.js +1 -6
  79. package/intern/open-turn-store.js.map +1 -1
  80. package/intern/open-turn-sweep.js +0 -1
  81. package/intern/open-turn-sweep.js.map +1 -1
  82. package/intern/prompt-assembly.d.ts +1 -0
  83. package/intern/prompt-assembly.js +1 -0
  84. package/intern/prompt-assembly.js.map +1 -1
  85. package/models.json +1 -0
  86. package/package.json +12 -12
  87. package/public/attach-draft-handle.js +16 -3
  88. package/public/attach-draft-handle.js.map +1 -1
  89. package/public/draft-runtime.d.ts +5 -0
  90. package/public/draft-runtime.js +299 -0
  91. package/public/draft-runtime.js.map +1 -0
  92. package/public/get-chat-details.js +14 -6
  93. package/public/get-chat-details.js.map +1 -1
  94. package/public/get-chat-response.js +16 -9
  95. package/public/get-chat-response.js.map +1 -1
  96. package/public/guest-build-generation.d.ts +8 -0
  97. package/public/guest-build-generation.js +218 -0
  98. package/public/guest-build-generation.js.map +1 -0
  99. package/public/guest-build.d.ts +7 -0
  100. package/public/guest-build.js +127 -0
  101. package/public/guest-build.js.map +1 -0
  102. package/public/llm-dispatch.d.ts +9 -7
  103. package/public/llm-dispatch.js +22 -10
  104. package/public/llm-dispatch.js.map +1 -1
  105. package/public/open-chat.d.ts +5 -1
  106. package/public/open-chat.js +72 -38
  107. package/public/open-chat.js.map +1 -1
  108. package/public/prompt-chat-section.d.ts +2 -1
  109. package/public/prompt-chat-section.js +293 -303
  110. package/public/prompt-chat-section.js.map +1 -1
  111. package/public/shared-mint.js +4 -2
  112. package/public/shared-mint.js.map +1 -1
  113. package/public/stream-assembly.d.ts +9 -7
  114. package/public/stream-assembly.js +19 -5
  115. package/public/stream-assembly.js.map +1 -1
  116. package/types.d.ts +2 -0
  117. package/types.js.map +1 -1
  118. package/usage-report/billing-reconcile-util.d.ts +1 -0
  119. package/usage-report/billing-reconcile-util.js +2 -1
  120. package/usage-report/billing-reconcile-util.js.map +1 -1
  121. package/usage-report/codegen-delivery-alert-util.js.map +1 -1
  122. package/usage-report/draft-output-alert.d.ts +13 -0
  123. package/usage-report/draft-output-alert.js +25 -0
  124. package/usage-report/draft-output-alert.js.map +1 -0
  125. package/usage-report/new-user-alert-util.d.ts +1 -0
  126. package/usage-report/new-user-alert-util.js +19 -4
  127. package/usage-report/new-user-alert-util.js.map +1 -1
  128. package/usage-report/new-user-alert.js +16 -10
  129. package/usage-report/new-user-alert.js.map +1 -1
  130. package/usage-report/prompt-cost-sql.d.ts +2 -0
  131. package/usage-report/prompt-cost-sql.js +2 -0
  132. package/usage-report/prompt-cost-sql.js.map +1 -1
  133. package/usage-report/user-journey.js +2 -2
  134. package/usage-report/user-journey.js.map +1 -1
  135. package/intern/agent-instruction.d.ts +0 -2
  136. package/intern/agent-instruction.js +0 -433
  137. package/intern/agent-instruction.js.map +0 -1
  138. package/intern/agent-lane-flag.d.ts +0 -21
  139. package/intern/agent-lane-flag.js +0 -10
  140. package/intern/agent-lane-flag.js.map +0 -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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"}
@@ -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<ReqWithVerifiedAuth<ReqPromptChatSection>>, never | VibesDiyError>;
88
+ ctx: HandleTriggerCtx<W3CWebSocketEvent, MsgBase<ReqWithVerifiedBuildAuth<ReqPromptChatSection>>, never | VibesDiyError>;
89
89
  vctx: VibesApiSQLCtx;
90
- req: ReqWithVerifiedAuth<ReqPromptChatSection>;
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: ReqWithVerifiedAuth<ReqPromptChatSection>;
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;
@@ -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(() => vctx.sql.db.insert(vctx.sql.tables.promptContexts).values(promptContextValues()));
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 ?? [];
@@ -613,7 +621,7 @@ export async function handlePromptContext({ vctx, req, resChat, promptId, blockS
613
621
  resolvedFileSystem = resolved.files;
614
622
  changedPathsFromBlocks = resolved.changedPaths;
615
623
  }
616
- if (agentDispatched === true && agentSessionEnabled(vctx)) {
624
+ if (agentDispatched === true) {
617
625
  const sources = resolvedFileSystem
618
626
  .filter((file) => file.type === "code-block")
619
627
  .filter((file) => file.filename.startsWith("/~~") === false);
@@ -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
- await vctx.sql.db.insert(vctx.sql.tables.promptContexts).values(values);
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;
@@ -993,7 +1007,6 @@ export async function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resCh
993
1007
  ownerHandle: resChat.ownerHandle,
994
1008
  appSlug: resChat.appSlug,
995
1009
  kind: isInitialTurn ? "first-build" : "codegen",
996
- ...("variant" in req && req.variant !== undefined ? { variant: req.variant } : {}),
997
1010
  ...(vctx.doInstance === undefined ? {} : { objectId: vctx.doInstance.objectId, instanceId: vctx.doInstance.instanceId }),
998
1011
  });
999
1012
  if (rOpen.isErr()) {
@@ -1137,6 +1150,5 @@ export async function handlerLlmRequest({ scope, ctx, vctx, blockSeq, req, resCh
1137
1150
  };
1138
1151
  }
1139
1152
  import { validateAgentFiles } from "../intern/agent-file-validation.js";
1140
- import { agentSessionEnabled } from "../intern/agent-lane-flag.js";
1141
1153
  import { isAppContextMessage } from "../intern/agent-request-frame.js";
1142
1154
  //# sourceMappingURL=llm-dispatch.js.map