@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.
Files changed (116) hide show
  1. package/check-auth.js +7 -0
  2. package/check-auth.js.map +1 -1
  3. package/create-handler.d.ts +6 -2
  4. package/create-handler.js +1 -0
  5. package/create-handler.js.map +1 -1
  6. package/evento-handler-manifest.js +4 -0
  7. package/evento-handler-manifest.js.map +1 -1
  8. package/intern/agent-account-tools.js +4 -1
  9. package/intern/agent-account-tools.js.map +1 -1
  10. package/intern/agent-dispatcher.d.ts +5 -0
  11. package/intern/agent-dispatcher.js +12 -1
  12. package/intern/agent-dispatcher.js.map +1 -1
  13. package/intern/agent-session-runtime.d.ts +9 -2
  14. package/intern/agent-session-runtime.js +45 -5
  15. package/intern/agent-session-runtime.js.map +1 -1
  16. package/intern/agent-session.d.ts +6 -2
  17. package/intern/agent-session.js +8 -4
  18. package/intern/agent-session.js.map +1 -1
  19. package/intern/agent-wake.d.ts +2 -0
  20. package/intern/agent-wake.js +8 -1
  21. package/intern/agent-wake.js.map +1 -1
  22. package/intern/alt-first-build.js +4 -1
  23. package/intern/alt-first-build.js.map +1 -1
  24. package/intern/build-ledger-read.d.ts +29 -0
  25. package/intern/build-ledger-read.js +220 -0
  26. package/intern/build-ledger-read.js.map +1 -0
  27. package/intern/build-ledger-seams.d.ts +27 -0
  28. package/intern/build-ledger-seams.js +65 -0
  29. package/intern/build-ledger-seams.js.map +1 -0
  30. package/intern/build-ledger-store.d.ts +43 -0
  31. package/intern/build-ledger-store.js +78 -0
  32. package/intern/build-ledger-store.js.map +1 -0
  33. package/intern/emit-build-state.d.ts +21 -0
  34. package/intern/emit-build-state.js +72 -0
  35. package/intern/emit-build-state.js.map +1 -0
  36. package/intern/ensure-chat-id.d.ts +6 -1
  37. package/intern/ensure-chat-id.js +8 -0
  38. package/intern/ensure-chat-id.js.map +1 -1
  39. package/intern/first-build-request.d.ts +1 -0
  40. package/intern/first-build-request.js +1 -1
  41. package/intern/first-build-request.js.map +1 -1
  42. package/intern/guest-build-gate.d.ts +24 -0
  43. package/intern/guest-build-gate.js +66 -0
  44. package/intern/guest-build-gate.js.map +1 -0
  45. package/intern/guest-credit-meter.js +8 -2
  46. package/intern/guest-credit-meter.js.map +1 -1
  47. package/intern/guest-principal-claim.d.ts +6 -6
  48. package/intern/guest-principal-claim.js +75 -27
  49. package/intern/guest-principal-claim.js.map +1 -1
  50. package/intern/guest-principal-follow.d.ts +13 -0
  51. package/intern/guest-principal-follow.js +53 -0
  52. package/intern/guest-principal-follow.js.map +1 -0
  53. package/intern/guest-principal-owner.d.ts +4 -0
  54. package/intern/guest-principal-owner.js +21 -0
  55. package/intern/guest-principal-owner.js.map +1 -0
  56. package/intern/mint-fire-core.d.ts +3 -0
  57. package/intern/mint-fire-core.js +12 -2
  58. package/intern/mint-fire-core.js.map +1 -1
  59. package/intern/mint-job-store.d.ts +9 -1
  60. package/intern/mint-job-store.js +44 -3
  61. package/intern/mint-job-store.js.map +1 -1
  62. package/intern/open-turn-store.d.ts +27 -2
  63. package/intern/open-turn-store.js +12 -3
  64. package/intern/open-turn-store.js.map +1 -1
  65. package/intern/open-turn-sweep.d.ts +5 -1
  66. package/intern/open-turn-sweep.js +23 -0
  67. package/intern/open-turn-sweep.js.map +1 -1
  68. package/intern/parent-build-link.d.ts +12 -0
  69. package/intern/parent-build-link.js +48 -0
  70. package/intern/parent-build-link.js.map +1 -0
  71. package/intern/parked-refire.d.ts +42 -0
  72. package/intern/parked-refire.js +190 -0
  73. package/intern/parked-refire.js.map +1 -0
  74. package/intern/server-first-turn-fire.d.ts +12 -0
  75. package/intern/server-first-turn-fire.js +40 -0
  76. package/intern/server-first-turn-fire.js.map +1 -0
  77. package/intern/server-principal.d.ts +20 -0
  78. package/intern/server-principal.js +43 -0
  79. package/intern/server-principal.js.map +1 -0
  80. package/intern/shard-walk.d.ts +8 -0
  81. package/intern/shard-walk.js +21 -0
  82. package/intern/shard-walk.js.map +1 -0
  83. package/intern/turn-error-kind.d.ts +2 -1
  84. package/intern/turn-error-kind.js +1 -0
  85. package/intern/turn-error-kind.js.map +1 -1
  86. package/package.json +13 -13
  87. package/public/agent-turn-action.js +4 -0
  88. package/public/agent-turn-action.js.map +1 -1
  89. package/public/handle-prompt-context.js +14 -4
  90. package/public/handle-prompt-context.js.map +1 -1
  91. package/public/handler-llm-request.js +18 -2
  92. package/public/handler-llm-request.js.map +1 -1
  93. package/public/list-builds.d.ts +3 -0
  94. package/public/list-builds.js +46 -0
  95. package/public/list-builds.js.map +1 -0
  96. package/public/mark-build-seen.d.ts +10 -0
  97. package/public/mark-build-seen.js +57 -0
  98. package/public/mark-build-seen.js.map +1 -0
  99. package/public/open-chat.d.ts +3 -0
  100. package/public/open-chat.js +47 -6
  101. package/public/open-chat.js.map +1 -1
  102. package/public/prompt-chat-section.js +18 -5
  103. package/public/prompt-chat-section.js.map +1 -1
  104. package/public/prompt-turn-settled.js +2 -0
  105. package/public/prompt-turn-settled.js.map +1 -1
  106. package/public/prompt-turn-terminal.d.ts +1 -0
  107. package/public/prompt-turn-terminal.js +23 -0
  108. package/public/prompt-turn-terminal.js.map +1 -1
  109. package/public/shared-mint.js +12 -0
  110. package/public/shared-mint.js.map +1 -1
  111. package/public/stream-assembly.js +2 -0
  112. package/public/stream-assembly.js.map +1 -1
  113. package/shard-gate.js +10 -0
  114. package/shard-gate.js.map +1 -1
  115. package/types.d.ts +6 -2
  116. 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":"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"}
@@ -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, }: {
@@ -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,