@vibes.diy/api-svc 14.3.107 → 14.3.110
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/check-auth.js +7 -0
- package/check-auth.js.map +1 -1
- package/create-handler.d.ts +6 -2
- package/create-handler.js +1 -0
- package/create-handler.js.map +1 -1
- package/evento-handler-manifest.js +4 -0
- package/evento-handler-manifest.js.map +1 -1
- package/intern/agent-account-tools.js +4 -1
- package/intern/agent-account-tools.js.map +1 -1
- package/intern/agent-dispatcher.d.ts +5 -0
- package/intern/agent-dispatcher.js +12 -1
- package/intern/agent-dispatcher.js.map +1 -1
- package/intern/agent-session-runtime.d.ts +9 -2
- package/intern/agent-session-runtime.js +45 -5
- package/intern/agent-session-runtime.js.map +1 -1
- package/intern/agent-session.d.ts +6 -2
- package/intern/agent-session.js +8 -4
- package/intern/agent-session.js.map +1 -1
- package/intern/agent-wake.d.ts +2 -0
- package/intern/agent-wake.js +8 -1
- package/intern/agent-wake.js.map +1 -1
- package/intern/alt-first-build.js +4 -1
- package/intern/alt-first-build.js.map +1 -1
- package/intern/build-ledger-read.d.ts +29 -0
- package/intern/build-ledger-read.js +220 -0
- package/intern/build-ledger-read.js.map +1 -0
- package/intern/build-ledger-seams.d.ts +27 -0
- package/intern/build-ledger-seams.js +65 -0
- package/intern/build-ledger-seams.js.map +1 -0
- package/intern/build-ledger-store.d.ts +43 -0
- package/intern/build-ledger-store.js +78 -0
- package/intern/build-ledger-store.js.map +1 -0
- package/intern/emit-build-state.d.ts +21 -0
- package/intern/emit-build-state.js +72 -0
- package/intern/emit-build-state.js.map +1 -0
- package/intern/ensure-chat-id.d.ts +6 -1
- package/intern/ensure-chat-id.js +8 -0
- package/intern/ensure-chat-id.js.map +1 -1
- package/intern/first-build-request.d.ts +1 -0
- package/intern/first-build-request.js +1 -1
- package/intern/first-build-request.js.map +1 -1
- package/intern/guest-build-gate.d.ts +24 -0
- package/intern/guest-build-gate.js +66 -0
- package/intern/guest-build-gate.js.map +1 -0
- package/intern/guest-credit-meter.js +8 -2
- package/intern/guest-credit-meter.js.map +1 -1
- package/intern/guest-principal-claim.d.ts +6 -6
- package/intern/guest-principal-claim.js +75 -27
- package/intern/guest-principal-claim.js.map +1 -1
- package/intern/guest-principal-follow.d.ts +13 -0
- package/intern/guest-principal-follow.js +53 -0
- package/intern/guest-principal-follow.js.map +1 -0
- package/intern/guest-principal-owner.d.ts +4 -0
- package/intern/guest-principal-owner.js +21 -0
- package/intern/guest-principal-owner.js.map +1 -0
- package/intern/mint-fire-core.d.ts +3 -0
- package/intern/mint-fire-core.js +12 -2
- package/intern/mint-fire-core.js.map +1 -1
- package/intern/mint-job-store.d.ts +9 -1
- package/intern/mint-job-store.js +44 -3
- package/intern/mint-job-store.js.map +1 -1
- package/intern/open-turn-store.d.ts +27 -2
- package/intern/open-turn-store.js +12 -3
- package/intern/open-turn-store.js.map +1 -1
- package/intern/open-turn-sweep.d.ts +5 -1
- package/intern/open-turn-sweep.js +23 -0
- package/intern/open-turn-sweep.js.map +1 -1
- package/intern/parent-build-link.d.ts +12 -0
- package/intern/parent-build-link.js +48 -0
- package/intern/parent-build-link.js.map +1 -0
- package/intern/parked-refire.d.ts +42 -0
- package/intern/parked-refire.js +190 -0
- package/intern/parked-refire.js.map +1 -0
- package/intern/server-first-turn-fire.d.ts +12 -0
- package/intern/server-first-turn-fire.js +40 -0
- package/intern/server-first-turn-fire.js.map +1 -0
- package/intern/server-principal.d.ts +20 -0
- package/intern/server-principal.js +43 -0
- package/intern/server-principal.js.map +1 -0
- package/intern/shard-walk.d.ts +8 -0
- package/intern/shard-walk.js +21 -0
- package/intern/shard-walk.js.map +1 -0
- package/intern/turn-error-kind.d.ts +2 -1
- package/intern/turn-error-kind.js +1 -0
- package/intern/turn-error-kind.js.map +1 -1
- package/package.json +13 -13
- package/public/agent-turn-action.js +4 -0
- package/public/agent-turn-action.js.map +1 -1
- package/public/handle-prompt-context.js +14 -4
- package/public/handle-prompt-context.js.map +1 -1
- package/public/handler-llm-request.js +18 -2
- package/public/handler-llm-request.js.map +1 -1
- package/public/list-builds.d.ts +3 -0
- package/public/list-builds.js +46 -0
- package/public/list-builds.js.map +1 -0
- package/public/mark-build-seen.d.ts +10 -0
- package/public/mark-build-seen.js +57 -0
- package/public/mark-build-seen.js.map +1 -0
- package/public/open-chat.d.ts +3 -0
- package/public/open-chat.js +47 -6
- package/public/open-chat.js.map +1 -1
- package/public/prompt-chat-section.js +18 -5
- package/public/prompt-chat-section.js.map +1 -1
- package/public/prompt-turn-settled.js +2 -0
- package/public/prompt-turn-settled.js.map +1 -1
- package/public/prompt-turn-terminal.d.ts +1 -0
- package/public/prompt-turn-terminal.js +23 -0
- package/public/prompt-turn-terminal.js.map +1 -1
- package/public/shared-mint.js +12 -0
- package/public/shared-mint.js.map +1 -1
- package/public/stream-assembly.js +2 -0
- package/public/stream-assembly.js.map +1 -1
- package/shard-gate.js +10 -0
- package/shard-gate.js.map +1 -1
- package/types.d.ts +6 -2
- package/types.js.map +1 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { exception2Result, Result } from "@adviser/cement";
|
|
2
|
+
import { and, desc, eq, gte, inArray, isNull, ne, notInArray, or } from "drizzle-orm/sql/expressions";
|
|
3
|
+
import { isBuildOrigin, isBuildPhase, isBuildSurface, LIST_BUILDS_DEFAULT_LIMIT, LIST_BUILDS_DEFAULT_WINDOW_MS, LIST_BUILDS_MAX_LIMIT, } from "@vibes.diy/api-types";
|
|
4
|
+
import { AGENT_SESSION_RECORD_ID } from "./agent-session-store.js";
|
|
5
|
+
import { readBuildTerminal } from "./agent-session-runtime.js";
|
|
6
|
+
import { readChatAddress } from "./chat-address.js";
|
|
7
|
+
import { classifyTurnError, QUEUE_TIMEOUT_ERROR } from "./turn-error-kind.js";
|
|
8
|
+
import { CONVERSATION_TURN_PHASE } from "./build-ledger-store.js";
|
|
9
|
+
export const BUILD_PROMPT_PREVIEW_CHARS = 80;
|
|
10
|
+
const TURN_ROWS_PER_ITEM = 3;
|
|
11
|
+
export const SETTLED_INTENT_STATUSES = ["done", "drafting", "drafted"];
|
|
12
|
+
export function deriveBuildPhase(input) {
|
|
13
|
+
switch (input.turnStatus) {
|
|
14
|
+
case "swept":
|
|
15
|
+
return { phase: "failed", errorKind: "turn-lost" };
|
|
16
|
+
case "open":
|
|
17
|
+
return { phase: input.intentStatus === "agent" ? "deciding" : "building" };
|
|
18
|
+
case "closed":
|
|
19
|
+
return closedTurnPhase(input);
|
|
20
|
+
}
|
|
21
|
+
switch (input.intentStatus) {
|
|
22
|
+
case "agent":
|
|
23
|
+
return { phase: "deciding" };
|
|
24
|
+
case "agent-awaiting-files":
|
|
25
|
+
case "awaiting-files":
|
|
26
|
+
return { phase: "needs-you" };
|
|
27
|
+
case "parked":
|
|
28
|
+
case "retrying":
|
|
29
|
+
return { phase: "queued" };
|
|
30
|
+
case "failed":
|
|
31
|
+
return { phase: "failed" };
|
|
32
|
+
default:
|
|
33
|
+
return { phase: "requested" };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function closedTurnPhase(input) {
|
|
37
|
+
const terminal = input.terminal;
|
|
38
|
+
if (terminal?.applied === true)
|
|
39
|
+
return { phase: "ready" };
|
|
40
|
+
const errorKind = terminal?.error === undefined ? undefined : classifyTurnError(terminal.error);
|
|
41
|
+
if (errorKind === "turn-lost")
|
|
42
|
+
return { phase: "failed", errorKind };
|
|
43
|
+
if (terminal?.settled === true)
|
|
44
|
+
return { phase: input.intentStatus === "agent" ? "needs-you" : "unchanged" };
|
|
45
|
+
if (errorKind === "credits-exhausted")
|
|
46
|
+
return { phase: "out-of-credits", errorKind };
|
|
47
|
+
if (errorKind !== undefined)
|
|
48
|
+
return { phase: "failed", errorKind };
|
|
49
|
+
return { phase: "unchanged" };
|
|
50
|
+
}
|
|
51
|
+
function intentColumns(vctx) {
|
|
52
|
+
const t = vctx.sql.tables.mintJobs;
|
|
53
|
+
return {
|
|
54
|
+
chatId: t.chatId,
|
|
55
|
+
ownerHandle: t.ownerHandle,
|
|
56
|
+
appSlug: t.appSlug,
|
|
57
|
+
prompt: t.prompt,
|
|
58
|
+
status: t.status,
|
|
59
|
+
updated: t.updated,
|
|
60
|
+
phase: t.phase,
|
|
61
|
+
phaseSeq: t.phaseSeq,
|
|
62
|
+
surface: t.surface,
|
|
63
|
+
origin: t.origin,
|
|
64
|
+
originChatId: t.originChatId,
|
|
65
|
+
lastError: t.lastError,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function turnColumns(vctx) {
|
|
69
|
+
const t = vctx.sql.tables.openTurns;
|
|
70
|
+
return {
|
|
71
|
+
chatId: t.chatId,
|
|
72
|
+
promptId: t.promptId,
|
|
73
|
+
ownerHandle: t.ownerHandle,
|
|
74
|
+
appSlug: t.appSlug,
|
|
75
|
+
kind: t.kind,
|
|
76
|
+
status: t.status,
|
|
77
|
+
updated: t.updated,
|
|
78
|
+
phase: t.phase,
|
|
79
|
+
phaseSeq: t.phaseSeq,
|
|
80
|
+
errorKind: t.errorKind,
|
|
81
|
+
fsId: t.fsId,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function isBuildTurn(vctx) {
|
|
85
|
+
const ot = vctx.sql.tables.openTurns;
|
|
86
|
+
return and(ne(ot.promptId, AGENT_SESSION_RECORD_ID), or(isNull(ot.phase), ne(ot.phase, CONVERSATION_TURN_PHASE)));
|
|
87
|
+
}
|
|
88
|
+
export async function readBuild(vctx, args, readTerminal = readBuildTerminal) {
|
|
89
|
+
const mj = vctx.sql.tables.mintJobs;
|
|
90
|
+
const ot = vctx.sql.tables.openTurns;
|
|
91
|
+
const rTurn = await exception2Result(() => vctx.sql.db
|
|
92
|
+
.select(turnColumns(vctx))
|
|
93
|
+
.from(ot)
|
|
94
|
+
.where(and(eq(ot.userId, args.userId), eq(ot.chatId, args.chatId), isBuildTurn(vctx)))
|
|
95
|
+
.orderBy(desc(ot.updated))
|
|
96
|
+
.limit(1));
|
|
97
|
+
if (rTurn.isErr())
|
|
98
|
+
return Result.Err(rTurn);
|
|
99
|
+
const rIntent = await exception2Result(() => vctx.sql.db
|
|
100
|
+
.select(intentColumns(vctx))
|
|
101
|
+
.from(mj)
|
|
102
|
+
.where(and(eq(mj.userId, args.userId), eq(mj.chatId, args.chatId)))
|
|
103
|
+
.limit(1));
|
|
104
|
+
if (rIntent.isErr())
|
|
105
|
+
return Result.Err(rIntent);
|
|
106
|
+
const turn = rTurn.Ok()[0];
|
|
107
|
+
const intent = rIntent.Ok()[0];
|
|
108
|
+
if (turn === undefined && (intent === undefined || SETTLED_INTENT_STATUSES.includes(intent.status))) {
|
|
109
|
+
return Result.Ok(undefined);
|
|
110
|
+
}
|
|
111
|
+
return toItem(vctx, { chatId: args.chatId, turn, intent }, readTerminal);
|
|
112
|
+
}
|
|
113
|
+
export function clampListBuildsLimit(limit) {
|
|
114
|
+
if (limit === undefined || !Number.isFinite(limit))
|
|
115
|
+
return LIST_BUILDS_DEFAULT_LIMIT;
|
|
116
|
+
return Math.min(LIST_BUILDS_MAX_LIMIT, Math.max(1, Math.floor(limit)));
|
|
117
|
+
}
|
|
118
|
+
function windowStart(since, nowMs) {
|
|
119
|
+
const parsed = since === undefined ? Number.NaN : Date.parse(since);
|
|
120
|
+
return new Date(Number.isNaN(parsed) ? nowMs - LIST_BUILDS_DEFAULT_WINDOW_MS : parsed).toISOString();
|
|
121
|
+
}
|
|
122
|
+
export async function listBuilds(vctx, args, readTerminal = readBuildTerminal) {
|
|
123
|
+
const limit = clampListBuildsLimit(args.limit);
|
|
124
|
+
const since = windowStart(args.since, args.nowMs ?? Date.now());
|
|
125
|
+
const mj = vctx.sql.tables.mintJobs;
|
|
126
|
+
const ot = vctx.sql.tables.openTurns;
|
|
127
|
+
const rTurns = await exception2Result(() => vctx.sql.db
|
|
128
|
+
.select(turnColumns(vctx))
|
|
129
|
+
.from(ot)
|
|
130
|
+
.where(and(eq(ot.userId, args.userId), isBuildTurn(vctx), or(eq(ot.status, "open"), gte(ot.updated, since))))
|
|
131
|
+
.orderBy(desc(ot.updated))
|
|
132
|
+
.limit(limit * TURN_ROWS_PER_ITEM));
|
|
133
|
+
if (rTurns.isErr())
|
|
134
|
+
return Result.Err(rTurns);
|
|
135
|
+
const rIntents = await exception2Result(() => vctx.sql.db
|
|
136
|
+
.select(intentColumns(vctx))
|
|
137
|
+
.from(mj)
|
|
138
|
+
.where(and(eq(mj.userId, args.userId), notInArray(mj.status, [...SETTLED_INTENT_STATUSES]), gte(mj.updated, since)))
|
|
139
|
+
.orderBy(desc(mj.updated))
|
|
140
|
+
.limit(limit));
|
|
141
|
+
if (rIntents.isErr())
|
|
142
|
+
return Result.Err(rIntents);
|
|
143
|
+
const turnByChat = new Map();
|
|
144
|
+
for (const row of rTurns.Ok())
|
|
145
|
+
if (!turnByChat.has(row.chatId))
|
|
146
|
+
turnByChat.set(row.chatId, row);
|
|
147
|
+
const intentByChat = new Map(rIntents.Ok().map((row) => [row.chatId, row]));
|
|
148
|
+
const missing = [...turnByChat.keys()].filter((chatId) => !intentByChat.has(chatId));
|
|
149
|
+
if (missing.length > 0) {
|
|
150
|
+
const rMore = await exception2Result(() => vctx.sql.db
|
|
151
|
+
.select(intentColumns(vctx))
|
|
152
|
+
.from(mj)
|
|
153
|
+
.where(and(eq(mj.userId, args.userId), inArray(mj.chatId, missing))));
|
|
154
|
+
if (rMore.isErr())
|
|
155
|
+
return Result.Err(rMore);
|
|
156
|
+
for (const row of rMore.Ok())
|
|
157
|
+
intentByChat.set(row.chatId, row);
|
|
158
|
+
}
|
|
159
|
+
const chats = [...new Set([...turnByChat.keys(), ...intentByChat.keys()])]
|
|
160
|
+
.map((chatId) => ({ chatId, turn: turnByChat.get(chatId), intent: intentByChat.get(chatId) }))
|
|
161
|
+
.filter((c) => c.turn !== undefined || (c.intent !== undefined && !SETTLED_INTENT_STATUSES.includes(c.intent.status)))
|
|
162
|
+
.sort((a, b) => sortKey(b).localeCompare(sortKey(a)))
|
|
163
|
+
.slice(0, limit);
|
|
164
|
+
const items = await Promise.all(chats.map((c) => toItem(vctx, c, readTerminal)));
|
|
165
|
+
const failed = items.find((r) => r.isErr());
|
|
166
|
+
if (failed !== undefined)
|
|
167
|
+
return Result.Err(failed.Err());
|
|
168
|
+
return Result.Ok(items.map((r) => r.Ok()));
|
|
169
|
+
}
|
|
170
|
+
function sortKey(c) {
|
|
171
|
+
return c.turn?.updated ?? c.intent?.updated ?? "";
|
|
172
|
+
}
|
|
173
|
+
async function toItem(vctx, c, readTerminal) {
|
|
174
|
+
const { chatId, turn, intent } = c;
|
|
175
|
+
const live = intent !== undefined && !SETTLED_INTENT_STATUSES.includes(intent.status);
|
|
176
|
+
const kind = turn === undefined || turn.kind === "first-build" || (turn.kind === "codegen" && live) ? "first-build" : "edit";
|
|
177
|
+
const owner = turn ?? intent;
|
|
178
|
+
if (owner === undefined)
|
|
179
|
+
return Result.Err(`build ledger: no row for ${chatId}`);
|
|
180
|
+
const stamped = owner.phase !== null && isBuildPhase(owner.phase) ? owner.phase : undefined;
|
|
181
|
+
let terminal;
|
|
182
|
+
if (stamped === undefined && turn?.status === "closed") {
|
|
183
|
+
const rTerminal = await readTerminal(vctx, { chatId, promptId: turn.promptId });
|
|
184
|
+
if (rTerminal.isErr())
|
|
185
|
+
return Result.Err(rTerminal);
|
|
186
|
+
terminal = rTerminal.Ok();
|
|
187
|
+
}
|
|
188
|
+
const derived = stamped === undefined
|
|
189
|
+
? deriveBuildPhase({ intentStatus: intent?.status, turnStatus: turn?.status, terminal })
|
|
190
|
+
: { phase: stamped, errorKind: undefined };
|
|
191
|
+
const rAddress = await readChatAddress(vctx.sql, chatId);
|
|
192
|
+
if (rAddress.isErr())
|
|
193
|
+
return Result.Err(rAddress);
|
|
194
|
+
const address = rAddress.Ok() ?? { ownerHandle: owner.ownerHandle, appSlug: owner.appSlug };
|
|
195
|
+
const queueTimedOut = turn === undefined && intent?.status === "failed" && intent.lastError === QUEUE_TIMEOUT_ERROR;
|
|
196
|
+
const errorKind = turn?.errorKind ?? derived.errorKind ?? (queueTimedOut ? QUEUE_TIMEOUT_ERROR : undefined);
|
|
197
|
+
const fsId = turn?.fsId ?? terminal?.landing?.fsId;
|
|
198
|
+
const surface = intent?.surface ?? undefined;
|
|
199
|
+
const origin = intent?.origin ?? undefined;
|
|
200
|
+
const originChatId = intent?.originChatId ?? undefined;
|
|
201
|
+
return Result.Ok({
|
|
202
|
+
chatId,
|
|
203
|
+
...(turn === undefined ? {} : { promptId: turn.promptId }),
|
|
204
|
+
kind,
|
|
205
|
+
phase: derived.phase,
|
|
206
|
+
phaseAt: owner.updated,
|
|
207
|
+
phaseSeq: owner.phaseSeq,
|
|
208
|
+
ownerHandle: address.ownerHandle,
|
|
209
|
+
appSlug: address.appSlug,
|
|
210
|
+
...(errorKind === undefined || errorKind === null ? {} : { errorKind }),
|
|
211
|
+
...(fsId === undefined || fsId === null ? {} : { fsId }),
|
|
212
|
+
...(kind === "first-build" && intent !== undefined
|
|
213
|
+
? { promptPreview: intent.prompt.slice(0, BUILD_PROMPT_PREVIEW_CHARS) }
|
|
214
|
+
: {}),
|
|
215
|
+
...(isBuildSurface(surface) ? { surface } : {}),
|
|
216
|
+
origin: isBuildOrigin(origin) ? origin : "prompt",
|
|
217
|
+
...(originChatId === undefined || originChatId === null ? {} : { originChatId }),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=build-ledger-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-ledger-read.js","sourceRoot":"","sources":["../../jsr/intern/build-ledger-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAEtG,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,GAGtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAalE,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAG7C,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAG7B,MAAM,CAAC,MAAM,uBAAuB,GAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAkB1F,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QACrD,KAAK,MAAM;YAET,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,QAAQ,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3B,KAAK,OAAO;YACV,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC/B,KAAK,sBAAsB,CAAC;QAC5B,KAAK,gBAAgB;YACnB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAChC,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU;YACb,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7B,KAAK,QAAQ;YACX,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7B;YAGE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAA4B;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,IAAI,QAAQ,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhG,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAGrE,IAAI,QAAQ,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7G,IAAI,SAAS,KAAK,mBAAmB;QAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;IACrF,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACnE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAkCD,SAAS,aAAa,CAAC,IAAiC;IACtD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;IACnC,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAiC;IACpD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IACpC,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC;AACJ,CAAC;AAWD,SAAS,WAAW,CAAC,IAAiC;IACpD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IACrC,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;AACpH,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAiC,EACjC,IAA0D,EAC1D,YAAY,GAAwB,iBAAiB;IAErD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,GAAuB,EAAE,CAC5D,IAAI,CAAC,GAAG,CAAC,EAAE;SACR,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACzB,IAAI,CAAC,EAAE,CAAC;SACR,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;SACrF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;SACzB,KAAK,CAAC,CAAC,CAAC,CACZ,CAAC;IACF,IAAI,KAAK,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,GAAyB,EAAE,CAChE,IAAI,CAAC,GAAG,CAAC,EAAE;SACR,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;SAC3B,IAAI,CAAC,EAAE,CAAC;SACR,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;SAClE,KAAK,CAAC,CAAC,CAAC,CACZ,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACpG,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;AAC3E,CAAC;AAGD,MAAM,UAAU,oBAAoB,CAAC,KAAyB;IAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,yBAAyB,CAAC;IACrF,OAAO,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,6BAA6B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;AACvG,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAiC,EACjC,IAA4G,EAC5G,YAAY,GAAwB,iBAAiB;IAErD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IAErC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAuB,EAAE,CAC7D,IAAI,CAAC,GAAG,CAAC,EAAE;SACR,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACzB,IAAI,CAAC,EAAE,CAAC;SACR,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;SAC5G,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;SACzB,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC,CACrC,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAyB,EAAE,CACjE,IAAI,CAAC,GAAG,CAAC,EAAE;SACR,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;SAC3B,IAAI,CAAC,EAAE,CAAC;SACR,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,uBAAuB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;SACnH,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;SACzB,KAAK,CAAC,KAAK,CAAC,CAChB,CAAC;IACF,IAAI,QAAQ,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAGlD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE;QAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,IAAI,GAAG,CAAoB,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAK/F,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACrF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,GAAyB,EAAE,CAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;aACR,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aAC3B,IAAI,CAAC,EAAE,CAAC;aACR,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CACvE,CAAC;QACF,IAAI,KAAK,CAAC,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE;YAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACvE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAG7F,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;SACrH,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,OAAO,CAAC,CAAyC;IAExD,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,IAAiC,EACjC,CAAyD,EACzD,YAAiC;IAEjC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtF,MAAM,IAAI,GACR,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IAGlH,MAAM,KAAK,GAAG,IAAI,IAAI,MAAM,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5F,IAAI,QAAmC,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChF,IAAI,SAAS,CAAC,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,QAAQ,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,OAAO,GACX,OAAO,KAAK,SAAS;QACnB,CAAC,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACxF,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAE/C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzD,IAAI,QAAQ,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAI5F,MAAM,aAAa,GAAG,IAAI,KAAK,SAAS,IAAI,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,KAAK,mBAAmB,CAAC;IACpH,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;IAEnD,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,SAAS,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,SAAS,CAAC;IAEvD,OAAO,MAAM,CAAC,EAAE,CAAC;QACf,MAAM;QACN,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1D,IAAI;QACJ,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACvE,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAExD,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,KAAK,SAAS;YAChD,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC,EAAE;YACvE,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QACjD,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;KACjF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BuildPhase } from "@vibes.diy/api-types";
|
|
2
|
+
import { type EmitBuildStateCtx } from "./emit-build-state.js";
|
|
3
|
+
export declare function stampTurnOpened(vctx: EmitBuildStateCtx, args: {
|
|
4
|
+
readonly chatId: string;
|
|
5
|
+
readonly userId: string;
|
|
6
|
+
readonly opened: boolean;
|
|
7
|
+
readonly conversation: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export declare function erroredTurnPhase(message: string | undefined): {
|
|
10
|
+
phase: BuildPhase;
|
|
11
|
+
errorKind: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function stampTurnErrored(vctx: EmitBuildStateCtx, args: {
|
|
14
|
+
readonly chatId: string;
|
|
15
|
+
readonly promptId: string;
|
|
16
|
+
readonly userId: string;
|
|
17
|
+
readonly conversation: boolean;
|
|
18
|
+
readonly message: string | undefined;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
export declare function stampTurnSettled(vctx: EmitBuildStateCtx, args: {
|
|
21
|
+
readonly chatId: string;
|
|
22
|
+
readonly promptId: string;
|
|
23
|
+
readonly userId: string;
|
|
24
|
+
readonly conversation: boolean;
|
|
25
|
+
readonly errored: boolean;
|
|
26
|
+
readonly fsId: string | undefined;
|
|
27
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { BUILD_TURN_FROM, LIGHT_MINT_STATUSES } from "./build-ledger-store.js";
|
|
2
|
+
import { scheduleBuildState, stampIntentAndEmit, stampTurnAndEmit } from "./emit-build-state.js";
|
|
3
|
+
import { classifyTurnError } from "./turn-error-kind.js";
|
|
4
|
+
const AGENT_DECIDING_FROM = [null, "requested", "needs-you", "failed", "out-of-credits"];
|
|
5
|
+
export async function stampTurnOpened(vctx, args) {
|
|
6
|
+
if (args.conversation) {
|
|
7
|
+
await stampIntentAndEmit(vctx, {
|
|
8
|
+
chatId: args.chatId,
|
|
9
|
+
userId: args.userId,
|
|
10
|
+
phase: "deciding",
|
|
11
|
+
onlyFrom: AGENT_DECIDING_FROM,
|
|
12
|
+
onlyStatus: LIGHT_MINT_STATUSES,
|
|
13
|
+
});
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (args.opened)
|
|
17
|
+
scheduleBuildState(vctx, { chatId: args.chatId, userId: args.userId });
|
|
18
|
+
}
|
|
19
|
+
export function erroredTurnPhase(message) {
|
|
20
|
+
const errorKind = classifyTurnError(message);
|
|
21
|
+
return { phase: errorKind === "credits-exhausted" ? "out-of-credits" : "failed", errorKind };
|
|
22
|
+
}
|
|
23
|
+
export async function stampTurnErrored(vctx, args) {
|
|
24
|
+
const { phase, errorKind } = erroredTurnPhase(args.message);
|
|
25
|
+
if (args.conversation) {
|
|
26
|
+
await stampIntentAndEmit(vctx, {
|
|
27
|
+
chatId: args.chatId,
|
|
28
|
+
userId: args.userId,
|
|
29
|
+
phase,
|
|
30
|
+
onlyFrom: [null, "requested", "deciding", "needs-you"],
|
|
31
|
+
onlyStatus: LIGHT_MINT_STATUSES,
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await stampTurnAndEmit(vctx, {
|
|
36
|
+
chatId: args.chatId,
|
|
37
|
+
promptId: args.promptId,
|
|
38
|
+
userId: args.userId,
|
|
39
|
+
phase,
|
|
40
|
+
onlyFrom: BUILD_TURN_FROM,
|
|
41
|
+
extra: { errorKind },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function stampTurnSettled(vctx, args) {
|
|
45
|
+
if (args.conversation) {
|
|
46
|
+
if (args.errored)
|
|
47
|
+
return;
|
|
48
|
+
await stampIntentAndEmit(vctx, {
|
|
49
|
+
chatId: args.chatId,
|
|
50
|
+
userId: args.userId,
|
|
51
|
+
phase: "needs-you",
|
|
52
|
+
onlyFrom: ["deciding"],
|
|
53
|
+
onlyStatus: LIGHT_MINT_STATUSES,
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
await stampTurnAndEmit(vctx, {
|
|
58
|
+
chatId: args.chatId,
|
|
59
|
+
promptId: args.promptId,
|
|
60
|
+
userId: args.userId,
|
|
61
|
+
onlyFrom: BUILD_TURN_FROM,
|
|
62
|
+
...(args.fsId === undefined ? { phase: "unchanged" } : { phase: "ready", extra: { fsId: args.fsId } }),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=build-ledger-seams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-ledger-seams.js","sourceRoot":"","sources":["../../jsr/intern/build-ledger-seams.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import { type SQL } from "drizzle-orm";
|
|
3
|
+
import { type BuildPhase } from "@vibes.diy/api-types";
|
|
4
|
+
import type { VibesApiTables, VibesSqlite } from "@vibes.diy/api-sql";
|
|
5
|
+
export interface BuildLedgerSql {
|
|
6
|
+
readonly db: VibesSqlite;
|
|
7
|
+
readonly tables: VibesApiTables;
|
|
8
|
+
}
|
|
9
|
+
export declare const CONVERSATION_TURN_PHASE: BuildPhase;
|
|
10
|
+
export declare const BUILD_TURN_FROM: readonly (BuildPhase | null)[];
|
|
11
|
+
export declare const LIGHT_MINT_STATUSES: readonly string[];
|
|
12
|
+
export declare function intentPhaseForStatus(status: string): BuildPhase | undefined;
|
|
13
|
+
export declare function bornIntentPhase(status: string): BuildPhase;
|
|
14
|
+
export type PhaseStamp = {
|
|
15
|
+
readonly won: true;
|
|
16
|
+
readonly phaseSeq: number;
|
|
17
|
+
} | {
|
|
18
|
+
readonly won: false;
|
|
19
|
+
};
|
|
20
|
+
export type PhaseGuard = readonly (BuildPhase | null)[];
|
|
21
|
+
export declare function stampIntentPhase(sql: BuildLedgerSql, args: {
|
|
22
|
+
readonly chatId: string;
|
|
23
|
+
readonly phase: BuildPhase;
|
|
24
|
+
readonly onlyFrom?: PhaseGuard;
|
|
25
|
+
readonly onlyStatus?: readonly string[];
|
|
26
|
+
readonly nowMs?: number;
|
|
27
|
+
}): Promise<Result<PhaseStamp>>;
|
|
28
|
+
export interface TurnPhaseExtra {
|
|
29
|
+
readonly errorKind?: string;
|
|
30
|
+
readonly fsId?: string;
|
|
31
|
+
readonly submitId?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function stampTurnPhase(sql: BuildLedgerSql, args: {
|
|
34
|
+
readonly chatId: string;
|
|
35
|
+
readonly promptId: string;
|
|
36
|
+
readonly phase: BuildPhase;
|
|
37
|
+
readonly onlyFrom?: PhaseGuard;
|
|
38
|
+
readonly extra?: TurnPhaseExtra;
|
|
39
|
+
readonly nowMs?: number;
|
|
40
|
+
}): Promise<Result<PhaseStamp>>;
|
|
41
|
+
export declare function intentHandoffValues(tables: VibesApiTables, chatId: string): {
|
|
42
|
+
phaseSeq: SQL;
|
|
43
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { exception2Result, Result } from "@adviser/cement";
|
|
2
|
+
import { and, eq, inArray, isNull, notInArray, or } from "drizzle-orm/sql/expressions";
|
|
3
|
+
import { sql as sqlExpr } from "drizzle-orm";
|
|
4
|
+
import { TERMINAL_BUILD_PHASES } from "@vibes.diy/api-types";
|
|
5
|
+
export const CONVERSATION_TURN_PHASE = "deciding";
|
|
6
|
+
export const BUILD_TURN_FROM = [null, "building"];
|
|
7
|
+
export const LIGHT_MINT_STATUSES = ["agent", "agent-unfired", "agent-awaiting-files"];
|
|
8
|
+
export function intentPhaseForStatus(status) {
|
|
9
|
+
switch (status) {
|
|
10
|
+
case "parked":
|
|
11
|
+
return "queued";
|
|
12
|
+
case "failed":
|
|
13
|
+
return "failed";
|
|
14
|
+
case "awaiting-files":
|
|
15
|
+
case "agent-awaiting-files":
|
|
16
|
+
return "needs-you";
|
|
17
|
+
default:
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function bornIntentPhase(status) {
|
|
22
|
+
return intentPhaseForStatus(status) ?? "requested";
|
|
23
|
+
}
|
|
24
|
+
function phaseGuard(column, onlyFrom) {
|
|
25
|
+
if (onlyFrom === undefined) {
|
|
26
|
+
return or(isNull(column), notInArray(column, [...TERMINAL_BUILD_PHASES]));
|
|
27
|
+
}
|
|
28
|
+
const named = onlyFrom.filter((p) => p !== null);
|
|
29
|
+
const allowsNull = onlyFrom.includes(null);
|
|
30
|
+
const arms = [...(named.length === 0 ? [] : [inArray(column, named)]), ...(allowsNull ? [isNull(column)] : [])];
|
|
31
|
+
return arms.length === 0 ? sqlExpr `1 = 0` : or(...arms);
|
|
32
|
+
}
|
|
33
|
+
function toStamp(rows) {
|
|
34
|
+
const row = rows[0];
|
|
35
|
+
return row === undefined ? { won: false } : { won: true, phaseSeq: row.phaseSeq };
|
|
36
|
+
}
|
|
37
|
+
export async function stampIntentPhase(sql, args) {
|
|
38
|
+
const t = sql.tables.mintJobs;
|
|
39
|
+
const statusGuard = args.onlyStatus === undefined ? undefined : inArray(t.status, [...args.onlyStatus]);
|
|
40
|
+
const r = await exception2Result(() => sql.db
|
|
41
|
+
.update(t)
|
|
42
|
+
.set({
|
|
43
|
+
phase: args.phase,
|
|
44
|
+
phaseSeq: sqlExpr `${t.phaseSeq} + 1`,
|
|
45
|
+
updated: new Date(args.nowMs ?? Date.now()).toISOString(),
|
|
46
|
+
})
|
|
47
|
+
.where(and(eq(t.chatId, args.chatId), phaseGuard(t.phase, args.onlyFrom), statusGuard))
|
|
48
|
+
.returning({ phaseSeq: t.phaseSeq }));
|
|
49
|
+
if (r.isErr())
|
|
50
|
+
return Result.Err(r);
|
|
51
|
+
return Result.Ok(toStamp(r.Ok()));
|
|
52
|
+
}
|
|
53
|
+
export async function stampTurnPhase(sql, args) {
|
|
54
|
+
const t = sql.tables.openTurns;
|
|
55
|
+
const extra = args.extra ?? {};
|
|
56
|
+
const r = await exception2Result(() => sql.db
|
|
57
|
+
.update(t)
|
|
58
|
+
.set({
|
|
59
|
+
phase: args.phase,
|
|
60
|
+
phaseSeq: sqlExpr `${t.phaseSeq} + 1`,
|
|
61
|
+
updated: new Date(args.nowMs ?? Date.now()).toISOString(),
|
|
62
|
+
...(extra.errorKind === undefined ? {} : { errorKind: extra.errorKind }),
|
|
63
|
+
...(extra.fsId === undefined ? {} : { fsId: extra.fsId }),
|
|
64
|
+
...(extra.submitId === undefined ? {} : { submitId: extra.submitId }),
|
|
65
|
+
})
|
|
66
|
+
.where(and(eq(t.chatId, args.chatId), eq(t.promptId, args.promptId), phaseGuard(t.phase, args.onlyFrom)))
|
|
67
|
+
.returning({ phaseSeq: t.phaseSeq }));
|
|
68
|
+
if (r.isErr())
|
|
69
|
+
return Result.Err(r);
|
|
70
|
+
return Result.Ok(toStamp(r.Ok()));
|
|
71
|
+
}
|
|
72
|
+
export function intentHandoffValues(tables, chatId) {
|
|
73
|
+
const mj = tables.mintJobs;
|
|
74
|
+
return {
|
|
75
|
+
phaseSeq: sqlExpr `coalesce((select ${mj.phaseSeq} from ${mj} where ${mj.chatId} = ${chatId}), 0) + 1`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=build-ledger-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-ledger-store.js","sourceRoot":"","sources":["../../jsr/intern/build-ledger-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { UserNotifyEvent } from "@vibes.diy/api-types";
|
|
2
|
+
import type { VibesApiSQLCtx } from "../types.js";
|
|
3
|
+
import { stampIntentPhase, stampTurnPhase, type PhaseStamp } from "./build-ledger-store.js";
|
|
4
|
+
export interface EmitBuildStateCtx {
|
|
5
|
+
readonly sql: VibesApiSQLCtx["sql"];
|
|
6
|
+
readonly logger: VibesApiSQLCtx["logger"];
|
|
7
|
+
notifyUser?(userId: string, evt: UserNotifyEvent, senderConnId: string): Promise<void>;
|
|
8
|
+
waitUntil?(promise: Promise<unknown>): void;
|
|
9
|
+
}
|
|
10
|
+
export interface BuildStateTarget {
|
|
11
|
+
readonly chatId: string;
|
|
12
|
+
readonly userId?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function emitBuildState(vctx: EmitBuildStateCtx, target: BuildStateTarget): Promise<boolean>;
|
|
15
|
+
export declare function scheduleBuildState(vctx: EmitBuildStateCtx, target: BuildStateTarget): void;
|
|
16
|
+
export declare function stampIntentAndEmit(vctx: EmitBuildStateCtx, args: Parameters<typeof stampIntentPhase>[1] & {
|
|
17
|
+
readonly userId?: string;
|
|
18
|
+
}): Promise<PhaseStamp>;
|
|
19
|
+
export declare function stampTurnAndEmit(vctx: EmitBuildStateCtx, args: Parameters<typeof stampTurnPhase>[1] & {
|
|
20
|
+
readonly userId: string;
|
|
21
|
+
}): Promise<PhaseStamp>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { exception2Result, Result } from "@adviser/cement";
|
|
2
|
+
import { eq } from "drizzle-orm/sql/expressions";
|
|
3
|
+
import { readBuild } from "./build-ledger-read.js";
|
|
4
|
+
import { stampIntentPhase, stampTurnPhase } from "./build-ledger-store.js";
|
|
5
|
+
import { followGuestPrincipal } from "./guest-principal-owner.js";
|
|
6
|
+
async function ownerOf(vctx, target) {
|
|
7
|
+
if (target.userId !== undefined)
|
|
8
|
+
return Result.Ok(await followGuestPrincipal(vctx, target.userId));
|
|
9
|
+
const mj = vctx.sql.tables.mintJobs;
|
|
10
|
+
const r = await exception2Result(() => vctx.sql.db.select({ userId: mj.userId }).from(mj).where(eq(mj.chatId, target.chatId)).limit(1));
|
|
11
|
+
if (r.isErr())
|
|
12
|
+
return Result.Err(r);
|
|
13
|
+
return Result.Ok(r.Ok()[0]?.userId);
|
|
14
|
+
}
|
|
15
|
+
export async function emitBuildState(vctx, target) {
|
|
16
|
+
const notifyUser = vctx.notifyUser?.bind(vctx);
|
|
17
|
+
if (notifyUser === undefined)
|
|
18
|
+
return false;
|
|
19
|
+
const r = await exception2Result(async () => {
|
|
20
|
+
const rUser = await ownerOf(vctx, target);
|
|
21
|
+
if (rUser.isErr())
|
|
22
|
+
throw rUser.Err();
|
|
23
|
+
const userId = rUser.Ok();
|
|
24
|
+
if (userId === undefined)
|
|
25
|
+
return false;
|
|
26
|
+
const rItem = await readBuild(vctx, { userId, chatId: target.chatId });
|
|
27
|
+
if (rItem.isErr())
|
|
28
|
+
throw rItem.Err();
|
|
29
|
+
const build = rItem.Ok();
|
|
30
|
+
if (build === undefined)
|
|
31
|
+
return false;
|
|
32
|
+
await notifyUser(userId, { type: "vibes.diy.evt-build-state", build }, "");
|
|
33
|
+
return true;
|
|
34
|
+
});
|
|
35
|
+
if (r.isErr()) {
|
|
36
|
+
vctx.logger.Warn().Err(r).Str("chatId", target.chatId).Msg("build-state-emit-failed");
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return r.Ok();
|
|
40
|
+
}
|
|
41
|
+
export function scheduleBuildState(vctx, target) {
|
|
42
|
+
if (vctx.notifyUser === undefined)
|
|
43
|
+
return;
|
|
44
|
+
const p = emitBuildState(vctx, target);
|
|
45
|
+
if (vctx.waitUntil !== undefined)
|
|
46
|
+
vctx.waitUntil(p);
|
|
47
|
+
else
|
|
48
|
+
void p;
|
|
49
|
+
}
|
|
50
|
+
function logLost(vctx, chatId, phase, err) {
|
|
51
|
+
vctx.logger.Warn().Err(err).Str("chatId", chatId).Str("phase", phase).Msg("build-phase-stamp-failed");
|
|
52
|
+
return { won: false };
|
|
53
|
+
}
|
|
54
|
+
export async function stampIntentAndEmit(vctx, args) {
|
|
55
|
+
const { userId, ...stamp } = args;
|
|
56
|
+
const r = await stampIntentPhase(vctx.sql, stamp);
|
|
57
|
+
if (r.isErr())
|
|
58
|
+
return logLost(vctx, args.chatId, args.phase, r.Err());
|
|
59
|
+
if (r.Ok().won)
|
|
60
|
+
scheduleBuildState(vctx, { chatId: args.chatId, ...(userId === undefined ? {} : { userId }) });
|
|
61
|
+
return r.Ok();
|
|
62
|
+
}
|
|
63
|
+
export async function stampTurnAndEmit(vctx, args) {
|
|
64
|
+
const { userId, ...stamp } = args;
|
|
65
|
+
const r = await stampTurnPhase(vctx.sql, stamp);
|
|
66
|
+
if (r.isErr())
|
|
67
|
+
return logLost(vctx, args.chatId, args.phase, r.Err());
|
|
68
|
+
if (r.Ok().won)
|
|
69
|
+
scheduleBuildState(vctx, { chatId: args.chatId, userId });
|
|
70
|
+
return r.Ok();
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=emit-build-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-build-state.js","sourceRoot":"","sources":["../../jsr/intern/emit-build-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { VibesApiSQLCtx } from "../types.js";
|
|
2
2
|
import { Result } from "@adviser/cement";
|
|
3
3
|
import { type MintDecision } from "./mint-decision.js";
|
|
4
|
+
import { type IntentLedgerFields } from "./mint-job-store.js";
|
|
4
5
|
import { type GenerationVariety, type VarietyPin } from "@vibes.diy/prompts";
|
|
5
|
-
import { type AppNature, ReqOpenChat, ReqWithVerifiedAuth, type Style } from "@vibes.diy/api-types";
|
|
6
|
+
import { type AppNature, ReqOpenChat, ReqWithVerifiedAuth, type Style, type BuildSurface } from "@vibes.diy/api-types";
|
|
6
7
|
export declare const DRY_RUN_PLACEHOLDER_HANDLE = "dry-run-preview";
|
|
7
8
|
export declare const DRY_RUN_PLACEHOLDER_APP_SLUG = "dry-run-preview";
|
|
8
9
|
export declare function preAllocEligible(req: {
|
|
@@ -33,7 +34,11 @@ export interface EnsureChatIdOpts {
|
|
|
33
34
|
readonly decision?: MintDecision;
|
|
34
35
|
readonly lightMint?: boolean;
|
|
35
36
|
readonly lightMintUnfired?: boolean;
|
|
37
|
+
readonly ledger?: IntentLedgerFields;
|
|
36
38
|
}
|
|
39
|
+
export declare function intentSurface(ctx: Pick<VibesApiSQLCtx, "client">, req: {
|
|
40
|
+
readonly surface?: BuildSurface;
|
|
41
|
+
}): BuildSurface | undefined;
|
|
37
42
|
export declare function ensureChatId(ctx: VibesApiSQLCtx, req: ReqWithVerifiedAuth<ReqOpenChat>, opts?: EnsureChatIdOpts): Promise<Result<EnsureChatIdPResult>>;
|
|
38
43
|
export declare function agentChatIdFor(userId: string, ownerHandle: string): string;
|
|
39
44
|
export declare function writePreAllocActiveEntries(ctx: VibesApiSQLCtx, { userId, ownerHandle, appSlug, title, skills, iconDescription, theme, enrichedPrompt, privacySensitive, nature, variety, varietyPinned, textureNote, style, colorTheme, stylePinned, }: {
|
package/intern/ensure-chat-id.js
CHANGED
|
@@ -102,6 +102,11 @@ export function resolveStylePin(raw, themeSlug) {
|
|
|
102
102
|
const checked = validateColorwayPinForLook(raw, themeSlug);
|
|
103
103
|
return checked.ok ? Result.Ok(checked.slug) : Result.Err(checked.message);
|
|
104
104
|
}
|
|
105
|
+
export function intentSurface(ctx, req) {
|
|
106
|
+
if (req.surface !== undefined)
|
|
107
|
+
return req.surface;
|
|
108
|
+
return ctx.client?.kind === "cli" ? "cli" : undefined;
|
|
109
|
+
}
|
|
105
110
|
export async function ensureChatId(ctx, req, opts = {}) {
|
|
106
111
|
if (req.firstBuildRequestId === undefined)
|
|
107
112
|
return ensureChatIdInternal(ctx, req, opts);
|
|
@@ -301,7 +306,10 @@ async function ensureChatIdInternal(ctx, req, opts = {}) {
|
|
|
301
306
|
if (preAllocEligible(req)) {
|
|
302
307
|
const mintPrompt = req.prompt;
|
|
303
308
|
const lightMintStatus = opts.lightMintUnfired === true ? "agent-unfired" : "agent";
|
|
309
|
+
const surface = opts.ledger?.surface ?? intentSurface(ctx, req);
|
|
310
|
+
const ledger = { ...opts.ledger, ...(surface === undefined ? {} : { surface }) };
|
|
304
311
|
mintJobOrder = upsertPendingMintJob(ctx, {
|
|
312
|
+
ledger,
|
|
305
313
|
chatId,
|
|
306
314
|
userId,
|
|
307
315
|
ownerHandle,
|