@vibes.diy/api-svc 2.2.13-dev.6 → 2.2.14

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.
@@ -0,0 +1,20 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type VibeFile } from "@vibes.diy/api-types";
3
+ import type { VibesApiSQLCtx } from "../types.js";
4
+ export interface AppendTurnOpts {
5
+ readonly chatId: string;
6
+ readonly userId: string;
7
+ readonly userSlug: string;
8
+ readonly appSlug: string;
9
+ readonly fileSystem: readonly VibeFile[];
10
+ readonly userMessage?: string;
11
+ readonly promptId?: string;
12
+ readonly fsId?: string;
13
+ readonly mode?: "dev" | "production";
14
+ readonly timestamp?: Date;
15
+ }
16
+ export interface AppendTurnResult {
17
+ readonly promptId: string;
18
+ readonly fsId: string;
19
+ }
20
+ export declare function appendTurnToChat(vctx: VibesApiSQLCtx, opts: AppendTurnOpts): Promise<Result<AppendTurnResult>>;
@@ -0,0 +1,100 @@
1
+ import { Result, exception2Result, uint8array2stream, to_uint8 } from "@adviser/cement";
2
+ import { isVibeCodeBlock } from "@vibes.diy/api-types";
3
+ import { ensureApps } from "./write-apps.js";
4
+ import { seedChatSection } from "./seed-chat-section.js";
5
+ import { ensureSlugBinding } from "./ensure-slug-binding.js";
6
+ export async function appendTurnToChat(vctx, opts) {
7
+ const now = opts.timestamp ?? new Date();
8
+ const mode = opts.mode ?? "dev";
9
+ const promptId = opts.promptId ?? vctx.sthis.nextId(12).str;
10
+ const syntheticClaims = {
11
+ userId: opts.userId,
12
+ role: "user",
13
+ sub: `synthetic-${opts.userId}`,
14
+ params: {
15
+ email: `${opts.userId}@synthetic.vibes.diy`,
16
+ email_verified: true,
17
+ first: "Synthetic",
18
+ last: "User",
19
+ name: "Synthetic User",
20
+ image_url: "",
21
+ public_meta: undefined,
22
+ nick: opts.userSlug,
23
+ },
24
+ };
25
+ const rBinding = await ensureSlugBinding(vctx, {
26
+ claims: syntheticClaims,
27
+ userId: opts.userId,
28
+ userSlug: opts.userSlug,
29
+ appSlug: opts.appSlug,
30
+ });
31
+ if (rBinding.isErr())
32
+ return Result.Err(`appendTurnToChat: ensureSlugBinding failed: ${rBinding.Err().message}`);
33
+ const binding = rBinding.Ok();
34
+ const writeOps = opts.fileSystem.flatMap((f) => {
35
+ if (f.type !== "code-block" && f.type !== "str-asset-block" && f.type !== "uint8-asset-block")
36
+ return [];
37
+ return [{ fsItem: f, data: f.content }];
38
+ });
39
+ if (writeOps.length === 0) {
40
+ return Result.Err("appendTurnToChat: no storable files in fileSystem");
41
+ }
42
+ const rStorageResults = await vctx.storage.ensure({}, ...writeOps.map((op) => uint8array2stream(to_uint8(op.data))));
43
+ if (rStorageResults.some((r) => r.isErr())) {
44
+ return Result.Err(`appendTurnToChat: storage.ensure failed: ${rStorageResults.map((r) => (r.isErr() ? r.Err().message : "ok")).join(", ")}`);
45
+ }
46
+ const fullFileSystem = rStorageResults.map((op, idx) => ({
47
+ vibeFileItem: writeOps[idx].fsItem,
48
+ storage: op.Ok(),
49
+ }));
50
+ const rApps = await ensureApps(vctx, { env: {}, mode, userId: opts.userId }, binding, fullFileSystem);
51
+ if (rApps.isErr())
52
+ return Result.Err(`appendTurnToChat: ensureApps failed: ${rApps.Err().message}`);
53
+ const appsResult = rApps.Ok();
54
+ if (!("fsId" in appsResult) || typeof appsResult.fsId !== "string") {
55
+ return Result.Err(`appendTurnToChat: ensureApps returned non-ok result: ${JSON.stringify(appsResult)}`);
56
+ }
57
+ const fsId = appsResult.fsId;
58
+ const refValue = {
59
+ type: "prompt.usage.sql",
60
+ usage: { given: [], calculated: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 } },
61
+ fsRef: { fsId, mode, appSlug: opts.appSlug, userSlug: opts.userSlug },
62
+ };
63
+ const rPC = await exception2Result(() => vctx.sql.db.insert(vctx.sql.tables.promptContexts).values({
64
+ userId: opts.userId,
65
+ chatId: opts.chatId,
66
+ promptId,
67
+ fsId,
68
+ nethash: vctx.netHash(),
69
+ promptTokens: 0,
70
+ completionTokens: 0,
71
+ totalTokens: 0,
72
+ ref: refValue,
73
+ created: now.toISOString(),
74
+ }));
75
+ if (rPC.isErr())
76
+ return Result.Err(`appendTurnToChat: promptContexts insert failed: ${rPC.Err().message}`);
77
+ const seedFiles = opts.fileSystem.flatMap((f) => {
78
+ if (!isVibeCodeBlock(f) || typeof f.content !== "string")
79
+ return [];
80
+ const dot = f.filename.lastIndexOf(".");
81
+ const lang = dot >= 0 ? f.filename.slice(dot + 1).toLowerCase() : "txt";
82
+ return [{ path: f.filename, lang, content: f.content }];
83
+ });
84
+ const userText = opts.userMessage ?? `synthetic turn @ ${now.toISOString()}`;
85
+ const blockId = vctx.sthis.nextId(12).str;
86
+ const rSeed = await seedChatSection(vctx, {
87
+ chatId: opts.chatId,
88
+ promptId,
89
+ blockId,
90
+ streamId: blockId,
91
+ userText,
92
+ files: seedFiles,
93
+ timestamp: now,
94
+ fsRef: { fsId, mode, appSlug: opts.appSlug, userSlug: opts.userSlug },
95
+ });
96
+ if (rSeed.isErr())
97
+ return Result.Err(`appendTurnToChat: seedChatSection failed: ${rSeed.Err()}`);
98
+ return Result.Ok({ promptId, fsId });
99
+ }
100
+ //# sourceMappingURL=append-turn-to-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"append-turn-to-chat.js","sourceRoot":"","sources":["../../jsr/intern/append-turn-to-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface DiffHunk {
2
+ readonly oldStart: number;
3
+ readonly oldLines: readonly string[];
4
+ readonly newLines: readonly string[];
5
+ }
6
+ export declare function lineDiff(before: string, after: string): DiffHunk[];
7
+ export declare function coalesceHunks(hunks: readonly DiffHunk[], oldArr: readonly string[], gap: number): DiffHunk[];
8
+ export interface RenderResult {
9
+ readonly ok: boolean;
10
+ readonly text: string;
11
+ }
12
+ export declare function renderHunkAsSearchReplace(hunk: DiffHunk, oldArr: readonly string[], maxExpand: number): RenderResult;
13
+ export declare function generateFileLastEdit(path: string, before: string, after: string): string;
14
+ export declare function generateLastEditBlock(prev2: ReadonlyMap<string, string>, prev: ReadonlyMap<string, string>): string;
@@ -0,0 +1,126 @@
1
+ export function lineDiff(before, after) {
2
+ const oldArr = before.split("\n");
3
+ const newArr = after.split("\n");
4
+ const n = oldArr.length;
5
+ const m = newArr.length;
6
+ const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
7
+ for (let i = n - 1; i >= 0; i--) {
8
+ for (let j = m - 1; j >= 0; j--) {
9
+ if (oldArr[i] === newArr[j])
10
+ dp[i][j] = dp[i + 1][j + 1] + 1;
11
+ else
12
+ dp[i][j] = Math.max(dp[i + 1][j], dp[i][j + 1]);
13
+ }
14
+ }
15
+ const hunks = [];
16
+ let i = 0;
17
+ let j = 0;
18
+ while (i < n || j < m) {
19
+ if (i < n && j < m && oldArr[i] === newArr[j]) {
20
+ i++;
21
+ j++;
22
+ continue;
23
+ }
24
+ const oldStart = i;
25
+ const oldLines = [];
26
+ const newLines = [];
27
+ while (i < n && j < m && oldArr[i] !== newArr[j]) {
28
+ if (dp[i + 1][j] >= dp[i][j + 1]) {
29
+ oldLines.push(oldArr[i++]);
30
+ }
31
+ else {
32
+ newLines.push(newArr[j++]);
33
+ }
34
+ }
35
+ while (i < n && j === m)
36
+ oldLines.push(oldArr[i++]);
37
+ while (j < m && i === n)
38
+ newLines.push(newArr[j++]);
39
+ hunks.push({ oldStart, oldLines, newLines });
40
+ }
41
+ return hunks;
42
+ }
43
+ export function coalesceHunks(hunks, oldArr, gap) {
44
+ if (hunks.length <= 1)
45
+ return hunks.slice();
46
+ const out = [];
47
+ let cur = hunks[0];
48
+ for (let k = 1; k < hunks.length; k++) {
49
+ const next = hunks[k];
50
+ const curEnd = cur.oldStart + cur.oldLines.length;
51
+ const between = next.oldStart - curEnd;
52
+ if (between <= gap && between >= 0) {
53
+ const bridge = oldArr.slice(curEnd, next.oldStart);
54
+ cur = {
55
+ oldStart: cur.oldStart,
56
+ oldLines: [...cur.oldLines, ...bridge, ...next.oldLines],
57
+ newLines: [...cur.newLines, ...bridge, ...next.newLines],
58
+ };
59
+ }
60
+ else {
61
+ out.push(cur);
62
+ cur = next;
63
+ }
64
+ }
65
+ out.push(cur);
66
+ return out;
67
+ }
68
+ export function renderHunkAsSearchReplace(hunk, oldArr, maxExpand) {
69
+ for (let ctx = 0; ctx <= maxExpand; ctx++) {
70
+ const start = Math.max(0, hunk.oldStart - ctx);
71
+ const end = Math.min(oldArr.length, hunk.oldStart + hunk.oldLines.length + ctx);
72
+ const before = oldArr.slice(start, hunk.oldStart);
73
+ const after = oldArr.slice(hunk.oldStart + hunk.oldLines.length, end);
74
+ const searchLines = [...before, ...hunk.oldLines, ...after];
75
+ const searchText = searchLines.join("\n");
76
+ const full = oldArr.join("\n");
77
+ const first = full.indexOf(searchText);
78
+ if (first >= 0 && full.indexOf(searchText, first + 1) === -1) {
79
+ const replaceText = [...before, ...hunk.newLines, ...after].join("\n");
80
+ return {
81
+ ok: true,
82
+ text: `<<<<<<< SEARCH\n${searchText}\n=======\n${replaceText}\n>>>>>>> REPLACE`,
83
+ };
84
+ }
85
+ }
86
+ return { ok: false, text: "" };
87
+ }
88
+ export function generateFileLastEdit(path, before, after) {
89
+ if (before === after)
90
+ return "";
91
+ if (before.length === 0)
92
+ return `[NEW FILE: ${path} — see PREVIOUS]`;
93
+ if (after.length === 0)
94
+ return `[DELETED: ${path}]`;
95
+ const oldArr = before.split("\n");
96
+ const rawHunks = lineDiff(before, after);
97
+ const hunks = coalesceHunks(rawHunks, oldArr, 3);
98
+ if (hunks.length > 20)
99
+ return `[${path}: wholesale rewrite, see PREVIOUS]`;
100
+ const blocks = [];
101
+ for (const h of hunks) {
102
+ const rendered = renderHunkAsSearchReplace(h, oldArr, 20);
103
+ if (!rendered.ok)
104
+ return `[${path}: wholesale rewrite, see PREVIOUS]`;
105
+ blocks.push(rendered.text);
106
+ }
107
+ return `${path}:\n${blocks.join("\n")}`;
108
+ }
109
+ export function generateLastEditBlock(prev2, prev) {
110
+ const paths = new Set();
111
+ for (const p of prev2.keys())
112
+ paths.add(p);
113
+ for (const p of prev.keys())
114
+ paths.add(p);
115
+ const sorted = Array.from(paths).sort();
116
+ const parts = [];
117
+ for (const path of sorted) {
118
+ const a = prev2.get(path) ?? "";
119
+ const b = prev.get(path) ?? "";
120
+ const rendered = generateFileLastEdit(path, a, b);
121
+ if (rendered)
122
+ parts.push(rendered);
123
+ }
124
+ return parts.join("\n\n");
125
+ }
126
+ //# sourceMappingURL=last-edit-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-edit-diff.js","sourceRoot":"","sources":["../../jsr/intern/last-edit-diff.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Result } from "@adviser/cement";
2
+ import { assembleSlotMessages } from "./slot-assembler.js";
2
3
  const MAX_RECOVERY_FILE_BYTES = 16_000;
3
4
  const MAX_RECOVERY_TOTAL_BYTES = 32_000;
4
5
  export function buildRecoveryRequest({ originalRequest, recoveryAddendum, vfs, focusPath, assistantPartial, lastReplaceFileLines, }) {
@@ -8,9 +9,15 @@ export function buildRecoveryRequest({ originalRequest, recoveryAddendum, vfs, f
8
9
  if (focusPath.length === 0) {
9
10
  return Result.Err("focus path is empty");
10
11
  }
11
- const filesBlock = renderCurrentFiles(vfs, focusPath);
12
- const recoverySuffix = `${recoveryAddendum}\n\n${filesBlock}`;
13
- const messages = mergeRecoveryIntoSystem(originalRequest.messages, recoverySuffix);
12
+ const messages = mergeRecoveryIntoSystem(originalRequest.messages, recoveryAddendum);
13
+ const slotMessages = assembleSlotMessages({
14
+ recoveryPartial: vfs,
15
+ focusPath,
16
+ config: {},
17
+ });
18
+ for (const s of slotMessages) {
19
+ messages.push({ role: "user", content: [{ type: "text", text: s.text }] });
20
+ }
14
21
  if (assistantPartial !== undefined && assistantPartial.length > 0) {
15
22
  messages.push({
16
23
  role: "user",
@@ -1 +1 @@
1
- {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../jsr/intern/recovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../jsr/intern/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AASzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAyB3D,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AA0CxC,MAAM,UAAU,oBAAoB,CAAC,EACnC,eAAe,EACf,gBAAgB,EAChB,GAAG,EACH,SAAS,EACT,gBAAgB,EAChB,oBAAoB,GACC;IACrB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,oBAAoB,CAAC;QACxC,eAAe,EAAE,GAAG;QACpB,SAAS;QACT,MAAM,EAAE,EAAE;KACX,CAAC,CAAC;IACH,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,CAAC,gBAAgB,EAAE,SAAS,EAAE,oBAAoB,CAAC,EAAE,CAAC;SAC1G,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;AACrD,CAAC;AAMD,SAAS,mBAAmB,CAAC,gBAAwB,EAAE,SAAiB,EAAE,oBAA6B;IACrG,MAAM,UAAU,GACd,oBAAoB,KAAK,SAAS;QAChC,CAAC,CAAC,gEAAgE,SAAS,kCAAkC,oBAAoB,cAAc;QAC/I,CAAC,CAAC,EAAE,CAAC;IACT,OAAO;QACL,8UAA8U,UAAU,EAAE;QAC1V,EAAE;QACF,gBAAgB;QAChB,EAAE;QACF,sLAAsL;KACvL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgC,EAAE,cAAsB;IACvF,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACtE,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,MAAM,GAAgB;QAC1B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,OAAO,cAAc,EAAE,EAAE,CAAC;KAC1E,CAAC;IACF,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAgC,EAAE,SAAiB;IACpF,MAAM,KAAK,GAAa,CAAC,4CAA4C,CAAC,CAAC;IACvE,IAAI,WAAW,GAAG,wBAAwB,CAAC;IAC3C,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,gDAAgD,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,OAAO,CAAC,CAAC;YACvC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,gBAAgB,OAAO,CAAC,MAAM,kBAAkB,GAAG,OAAO,EACrE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EACrB,OAAO,IAAI,wBAAwB,CACpC,CAAC;YACF,WAAW,IAAI,GAAG,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAgC,EAAE,SAAiB;IAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;IAC5G,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,OAAO,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,CAAC;AACjC,CAAC;AAgBD,MAAM,UAAU,qBAAqB,CAAC,OAAwB,EAAE,OAA2C;IACzG,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC;AACzH,CAAC;AAID,MAAM,UAAU,qBAAqB,CAAC,OAAwB,EAAE,MAAM,GAAmB,EAAE,uBAAuB,EAAE,CAAC,EAAE;IACrH,OAAO,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACvE,CAAC;AAgBD,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC1E,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;QAC3B,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS;QAC/B,GAAG,EAAE,QAAQ;QACb,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;QAC3B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;QACvB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;QACpC,UAAU;QACV,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ export interface SlotEntry {
2
+ readonly label: string;
3
+ readonly caption: string;
4
+ readonly vfs: ReadonlyMap<string, string>;
5
+ readonly canonical: boolean;
6
+ }
7
+ export interface RenderedBlock {
8
+ readonly label: string;
9
+ readonly text: string;
10
+ }
11
+ export declare function renderSlotsWithDedup(slots: readonly SlotEntry[], focusPath: string): RenderedBlock[];
12
+ export type CanonicalKind = "recovery" | "selected-draft" | "previous" | "none";
13
+ export interface CanonicalInputs {
14
+ readonly recoveryPartial?: ReadonlyMap<string, string>;
15
+ readonly selectedDraft?: ReadonlyMap<string, string>;
16
+ readonly previous?: ReadonlyMap<string, string>;
17
+ }
18
+ export declare function pickCanonicalHome(inputs: CanonicalInputs): CanonicalKind;
19
+ import type { SlotConfig } from "@vibes.diy/api-types";
20
+ export interface AssembleInputs {
21
+ readonly original?: {
22
+ readonly vfs: ReadonlyMap<string, string>;
23
+ readonly turnsAgo: number;
24
+ };
25
+ readonly prev2?: ReadonlyMap<string, string>;
26
+ readonly previous?: ReadonlyMap<string, string>;
27
+ readonly selectedVersion?: {
28
+ readonly vfs: ReadonlyMap<string, string>;
29
+ readonly turnsAgo: number;
30
+ };
31
+ readonly selectedDraft?: ReadonlyMap<string, string>;
32
+ readonly recoveryPartial?: ReadonlyMap<string, string>;
33
+ readonly focusPath: string;
34
+ readonly config: SlotConfig;
35
+ }
36
+ export interface AssembledMessage {
37
+ readonly role: "user";
38
+ readonly label: string;
39
+ readonly text: string;
40
+ }
41
+ export declare function assembleSlotMessages(inputs: AssembleInputs): AssembledMessage[];
42
+ export declare function resolveSlotConfig(req: SlotConfig | undefined, env: Record<string, string | undefined>): Required<SlotConfig>;
43
+ import type { ChatMessage } from "@vibes.diy/call-ai-v2";
44
+ export declare function renderSlotMessagesAs(msgs: readonly AssembledMessage[], mode: "user" | "system"): ChatMessage[];
@@ -0,0 +1,152 @@
1
+ import { renderCurrentFiles } from "./recovery.js";
2
+ export function renderSlotsWithDedup(slots, focusPath) {
3
+ const canonical = slots.find((s) => s.canonical);
4
+ const out = [];
5
+ for (const s of slots) {
6
+ if (s === canonical) {
7
+ const body = renderCurrentFiles(s.vfs, focusPath);
8
+ out.push({
9
+ label: s.label,
10
+ text: `--- ${s.label} (${s.caption}) ---\n${body}`,
11
+ });
12
+ continue;
13
+ }
14
+ const dedupedVfs = new Map();
15
+ const pointerLines = [];
16
+ for (const [path, content] of s.vfs.entries()) {
17
+ const canonicalContent = canonical?.vfs.get(path);
18
+ if (canonical && canonicalContent === content) {
19
+ pointerLines.push(`--- ${path} (identical to ${canonical.label}) ---`);
20
+ }
21
+ else {
22
+ dedupedVfs.set(path, content);
23
+ }
24
+ }
25
+ if (dedupedVfs.size === 0)
26
+ continue;
27
+ const body = renderCurrentFiles(dedupedVfs, focusPath);
28
+ const parts = [`--- ${s.label} (${s.caption}) ---`, body];
29
+ parts.push(...pointerLines);
30
+ const text = parts.join("\n");
31
+ out.push({ label: s.label, text });
32
+ }
33
+ return out;
34
+ }
35
+ export function pickCanonicalHome(inputs) {
36
+ if (inputs.recoveryPartial)
37
+ return "recovery";
38
+ if (inputs.selectedDraft)
39
+ return "selected-draft";
40
+ if (inputs.previous)
41
+ return "previous";
42
+ return "none";
43
+ }
44
+ import { generateLastEditBlock } from "./last-edit-diff.js";
45
+ export function assembleSlotMessages(inputs) {
46
+ const cfg = inputs.config;
47
+ const muted = (k) => cfg[k] === "off";
48
+ const canonical = pickCanonicalHome({
49
+ recoveryPartial: inputs.recoveryPartial,
50
+ selectedDraft: inputs.selectedDraft,
51
+ previous: inputs.previous,
52
+ });
53
+ const snapshotEntries = [];
54
+ if (inputs.original && !muted("original")) {
55
+ snapshotEntries.push({
56
+ label: "ORIGINAL",
57
+ caption: `scaffold — first response, ${inputs.original.turnsAgo} turns ago`,
58
+ vfs: inputs.original.vfs,
59
+ canonical: false,
60
+ });
61
+ }
62
+ if (inputs.selectedVersion && !muted("selected")) {
63
+ snapshotEntries.push({
64
+ label: "SELECTED_VERSION",
65
+ caption: `user is currently viewing this, from ${inputs.selectedVersion.turnsAgo} turns ago`,
66
+ vfs: inputs.selectedVersion.vfs,
67
+ canonical: false,
68
+ });
69
+ }
70
+ if (inputs.previous && !muted("previous") && canonical !== "previous") {
71
+ snapshotEntries.push({
72
+ label: "PREVIOUS",
73
+ caption: "last server-side state — for reference; the disk/recovery state has since changed",
74
+ vfs: inputs.previous,
75
+ canonical: false,
76
+ });
77
+ }
78
+ if (canonical === "recovery" && inputs.recoveryPartial) {
79
+ snapshotEntries.push({
80
+ label: "RECOVERY_PARTIAL",
81
+ caption: "partial state captured during recovery; anchor SEARCH against this exact content",
82
+ vfs: inputs.recoveryPartial,
83
+ canonical: true,
84
+ });
85
+ }
86
+ else if (canonical === "selected-draft" && inputs.selectedDraft && !muted("selected")) {
87
+ snapshotEntries.push({
88
+ label: "SELECTED_DRAFT",
89
+ caption: "current disk contents — anchor SEARCH against these bytes",
90
+ vfs: inputs.selectedDraft,
91
+ canonical: true,
92
+ });
93
+ }
94
+ else if (canonical === "previous" && inputs.previous && !muted("previous")) {
95
+ const breadcrumb = inputs.original ? `; ORIGINAL scaffold is ${inputs.original.turnsAgo} turns earlier` : "";
96
+ snapshotEntries.push({
97
+ label: "PREVIOUS",
98
+ caption: `current state — anchor SEARCH here${breadcrumb}`,
99
+ vfs: inputs.previous,
100
+ canonical: true,
101
+ });
102
+ }
103
+ let lastEditText;
104
+ if (inputs.prev2 && inputs.previous && !muted("last_edit")) {
105
+ const block = generateLastEditBlock(inputs.prev2, inputs.previous);
106
+ if (block) {
107
+ lastEditText = `--- LAST_EDIT (the diff that produced the current PREVIOUS state) ---\n${block}`;
108
+ }
109
+ }
110
+ const canonicalLabel = snapshotEntries.find((e) => e.canonical)?.label;
111
+ const rendered = renderSlotsWithDedup(snapshotEntries, inputs.focusPath);
112
+ const out = [];
113
+ for (const r of rendered) {
114
+ if (lastEditText && canonicalLabel && r.label === canonicalLabel) {
115
+ out.push({ role: "user", label: "LAST_EDIT", text: lastEditText });
116
+ lastEditText = undefined;
117
+ }
118
+ out.push({ role: "user", label: r.label, text: r.text });
119
+ }
120
+ if (lastEditText) {
121
+ out.push({ role: "user", label: "LAST_EDIT", text: lastEditText });
122
+ }
123
+ return out;
124
+ }
125
+ export function resolveSlotConfig(req, env) {
126
+ const read = (key, envKey) => {
127
+ const r = req?.[key];
128
+ if (r === "on" || r === "off")
129
+ return r;
130
+ const e = env[envKey];
131
+ if (e === "on" || e === "off")
132
+ return e;
133
+ return "on";
134
+ };
135
+ return {
136
+ original: read("original", "SLOTS_ORIGINAL"),
137
+ selected: read("selected", "SLOTS_SELECTED"),
138
+ last_edit: read("last_edit", "SLOTS_LAST_EDIT"),
139
+ previous: read("previous", "SLOTS_PREVIOUS"),
140
+ compaction: read("compaction", "SLOTS_COMPACTION"),
141
+ };
142
+ }
143
+ export function renderSlotMessagesAs(msgs, mode) {
144
+ if (mode === "user") {
145
+ return msgs.map((m) => ({ role: "user", content: [{ type: "text", text: m.text }] }));
146
+ }
147
+ const joined = msgs.map((m) => m.text).join("\n\n");
148
+ if (joined === "")
149
+ return [];
150
+ return [{ role: "system", content: [{ type: "text", text: joined }] }];
151
+ }
152
+ //# sourceMappingURL=slot-assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot-assembler.js","sourceRoot":"","sources":["../../jsr/intern/slot-assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Result } from "@adviser/cement";
2
+ import type { FileSystemItem } from "@vibes.diy/api-types";
3
+ import type { VibesApiSQLCtx } from "../types.js";
4
+ export interface TimelineEntry {
5
+ readonly fsId: string;
6
+ readonly created: Date;
7
+ readonly vfs: ReadonlyMap<string, string>;
8
+ }
9
+ export declare function resolveVfsFromFileSystem(vctx: VibesApiSQLCtx, items: FileSystemItem[]): Promise<ReadonlyMap<string, string>>;
10
+ export declare function loadVersionTimeline(vctx: VibesApiSQLCtx, chatId: string): Promise<Result<TimelineEntry[]>>;
11
+ export interface SlotSources {
12
+ readonly original?: TimelineEntry;
13
+ readonly previous?: TimelineEntry;
14
+ readonly prev2?: TimelineEntry;
15
+ }
16
+ export declare function selectSlotSources(timeline: readonly TimelineEntry[]): SlotSources;
17
+ export declare function loadLatestPromptId(vctx: VibesApiSQLCtx, chatId: string): Promise<Result<string | undefined>>;
@@ -0,0 +1,75 @@
1
+ import { eq, asc, desc } from "drizzle-orm";
2
+ import { parseArray, fileSystemItem, isFetchErrResult, isFetchNotFoundResult } from "@vibes.diy/api-types";
3
+ import { exception2Result, stream2uint8array } from "@adviser/cement";
4
+ const SOURCE_EXT = new Set([".jsx", ".tsx", ".js", ".ts", ".css", ".html", ".md", ".json"]);
5
+ function isSourceFile(fileName) {
6
+ const dot = fileName.lastIndexOf(".");
7
+ if (dot < 0)
8
+ return false;
9
+ return SOURCE_EXT.has(fileName.slice(dot).toLowerCase());
10
+ }
11
+ export async function resolveVfsFromFileSystem(vctx, items) {
12
+ const vfs = new Map();
13
+ for (const item of items) {
14
+ if (!isSourceFile(item.fileName))
15
+ continue;
16
+ const rFetch = await vctx.storage.fetch(item.assetURI);
17
+ if (isFetchErrResult(rFetch) || isFetchNotFoundResult(rFetch))
18
+ continue;
19
+ const bytes = await stream2uint8array(rFetch.data);
20
+ const text = vctx.sthis.txt.decode(bytes);
21
+ const key = item.fileName.startsWith("/") ? item.fileName : `/${item.fileName}`;
22
+ vfs.set(key, text);
23
+ }
24
+ return vfs;
25
+ }
26
+ export async function loadVersionTimeline(vctx, chatId) {
27
+ return exception2Result(async () => {
28
+ const rows = await vctx.sql.db
29
+ .select({
30
+ fsId: vctx.sql.tables.promptContexts.fsId,
31
+ created: vctx.sql.tables.promptContexts.created,
32
+ fileSystem: vctx.sql.tables.apps.fileSystem,
33
+ })
34
+ .from(vctx.sql.tables.promptContexts)
35
+ .innerJoin(vctx.sql.tables.apps, eq(vctx.sql.tables.apps.fsId, vctx.sql.tables.promptContexts.fsId))
36
+ .where(eq(vctx.sql.tables.promptContexts.chatId, chatId))
37
+ .orderBy(asc(vctx.sql.tables.promptContexts.created));
38
+ const seen = new Set();
39
+ const out = [];
40
+ for (const r of rows) {
41
+ if (!r.fsId || seen.has(r.fsId))
42
+ continue;
43
+ seen.add(r.fsId);
44
+ const items = parseArray(r.fileSystem, fileSystemItem);
45
+ const vfs = await resolveVfsFromFileSystem(vctx, items);
46
+ const created = new Date(r.created);
47
+ out.push({ fsId: r.fsId, created, vfs });
48
+ }
49
+ return out;
50
+ });
51
+ }
52
+ export function selectSlotSources(timeline) {
53
+ if (timeline.length === 0)
54
+ return {};
55
+ if (timeline.length === 1)
56
+ return { original: timeline[0], previous: timeline[0] };
57
+ return {
58
+ original: timeline[0],
59
+ previous: timeline[timeline.length - 1],
60
+ prev2: timeline[timeline.length - 2],
61
+ };
62
+ }
63
+ export async function loadLatestPromptId(vctx, chatId) {
64
+ return exception2Result(async () => {
65
+ const r = await vctx.sql.db
66
+ .select({ promptId: vctx.sql.tables.promptContexts.promptId, created: vctx.sql.tables.promptContexts.created })
67
+ .from(vctx.sql.tables.promptContexts)
68
+ .where(eq(vctx.sql.tables.promptContexts.chatId, chatId))
69
+ .orderBy(desc(vctx.sql.tables.promptContexts.created))
70
+ .limit(1)
71
+ .then((rs) => rs[0]);
72
+ return r?.promptId;
73
+ });
74
+ }
75
+ //# sourceMappingURL=version-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-timeline.js","sourceRoot":"","sources":["../../jsr/intern/version-timeline.ts"],"names":[],"mappings":"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"}