@bivy/bivy 0.20.9-staging.25 → 0.20.9-staging.26
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/dist/agent-instructions.js +2 -1
- package/dist/session/message-components.js +84 -4
- package/dist/session/transcript-persistence.js +35 -5
- package/package.json +1 -1
- package/web/assets/AutomationsView-DmpG0A2d.js +51 -0
- package/web/assets/{ChangesCard-CF4Ggj8i.js → ChangesCard-MnYxEII6.js} +1 -1
- package/web/assets/{LibraryView-BPA8XNBE.js → LibraryView-Dgy0RDJ9.js} +1 -1
- package/web/assets/{ProviderConnect-CnobppzO.js → ProviderConnect-BPKzKW-3.js} +1 -1
- package/web/assets/{SessionList-BTKFzdDa.js → SessionList-qxtogmTB.js} +1 -1
- package/web/assets/{Settings-C7DbOXb4.js → Settings-Bq4kmS2N.js} +3 -3
- package/web/assets/{Sheet-Dx_m8Blv.js → Sheet-BStsfXWj.js} +1 -1
- package/web/assets/{Terminal-pZiTEW8e.js → Terminal-B7uN0hzl.js} +1 -1
- package/web/assets/{VoiceSettings-WZM9C7g7.js → VoiceSettings-DVOJ7bhm.js} +1 -1
- package/web/assets/{abnfDiagram-VCTEODGH-WRpHjP0B.js → abnfDiagram-VCTEODGH-DMJ9w-Gd.js} +1 -1
- package/web/assets/architecture-7GRP2DOG-C8QAIGJw.js +1 -0
- package/web/assets/{architectureDiagram-5GKGNRK7-CdjlBExx.js → architectureDiagram-5GKGNRK7-ChXoo05D.js} +1 -1
- package/web/assets/{blockDiagram-I7D4REHJ-D77krZd2.js → blockDiagram-I7D4REHJ-DZX289s_.js} +1 -1
- package/web/assets/{c4Diagram-7LVT6UL2-CDhNs6GX.js → c4Diagram-7LVT6UL2-DWrh10Ke.js} +1 -1
- package/web/assets/channel-Cegd5v_e.js +1 -0
- package/web/assets/{chunk-4HAMMTFA-B4yDhw9w.js → chunk-4HAMMTFA-BMUPp7ah.js} +1 -1
- package/web/assets/{chunk-75Z2AOVW-DlBs-44Q.js → chunk-75Z2AOVW-S_Lqeycl.js} +1 -1
- package/web/assets/{chunk-DU6HZSFF-CJ_HANui.js → chunk-DU6HZSFF-ByvxKoJE.js} +1 -1
- package/web/assets/{chunk-F27PBJKO-Cu5CSjiN.js → chunk-F27PBJKO-DV2WohGL.js} +1 -1
- package/web/assets/{chunk-GMAD6QVW-DyA4dvEU.js → chunk-GMAD6QVW-DMHrNFhF.js} +1 -1
- package/web/assets/{chunk-GVQU2GXP-BQMSnk4C.js → chunk-GVQU2GXP-CBJMgIgv.js} +1 -1
- package/web/assets/{chunk-IMKFNOWR-CS_PemS5.js → chunk-IMKFNOWR-BBYSJuSR.js} +1 -1
- package/web/assets/{chunk-L3NEJ4N5-DxvNkxIH.js → chunk-L3NEJ4N5-CBfNG4NB.js} +1 -1
- package/web/assets/{chunk-OSK3NFVY-CCohDz0n.js → chunk-OSK3NFVY-DhTm62Wo.js} +1 -1
- package/web/assets/{chunk-P2QGCYS3-D-B6wTHD.js → chunk-P2QGCYS3-C8KBtXRm.js} +1 -1
- package/web/assets/{chunk-POPQ4Y6H-BOvoop5q.js → chunk-POPQ4Y6H-1ZdD_cfb.js} +1 -1
- package/web/assets/{chunk-PWAF6VOD-CLeIUWUo.js → chunk-PWAF6VOD-bVFoxXgJ.js} +1 -1
- package/web/assets/{chunk-SHT3W25Y-DrmMp-0y.js → chunk-SHT3W25Y-PZoRcBIi.js} +1 -1
- package/web/assets/{chunk-SVP7TREG-us7eU0Ur.js → chunk-SVP7TREG-YqptXnk5.js} +1 -1
- package/web/assets/{chunk-TICWLB2K-iDXvmJ81.js → chunk-TICWLB2K-BXdDCPmK.js} +1 -1
- package/web/assets/classDiagram-ZZMXUADV-C1F2-BOm.js +1 -0
- package/web/assets/classDiagram-v2-VYDZK3BY-C1F2-BOm.js +1 -0
- package/web/assets/{cynefin-OW5HDTMX-CIdE0drB.js → cynefin-OW5HDTMX-B1yk_pYn.js} +1 -1
- package/web/assets/{cynefinDiagram-5FMLGOSQ-DoE-XOWg.js → cynefinDiagram-5FMLGOSQ-VIFTAKKv.js} +1 -1
- package/web/assets/{dagre-GXQ25YYZ-BWmLtVVG.js → dagre-GXQ25YYZ-xlSUoorU.js} +1 -1
- package/web/assets/{diagram-S7CK7UJ4-BXsoBMqT.js → diagram-S7CK7UJ4-DHSlluS0.js} +1 -1
- package/web/assets/{diagram-UQ7AKVKN-D6ZwCAqS.js → diagram-UQ7AKVKN-BobUeJCF.js} +1 -1
- package/web/assets/{diagram-VSXAHHWV-CahS4Ehx.js → diagram-VSXAHHWV-Djm_2Ydy.js} +1 -1
- package/web/assets/{diagram-VX7I27RA-8IpuDz9Q.js → diagram-VX7I27RA-CixOqShF.js} +1 -1
- package/web/assets/{diagram-Z3DM3KII-BNNzb7O9.js → diagram-Z3DM3KII-DXYwUQvp.js} +1 -1
- package/web/assets/{ebnfDiagram-PWID7BFC-D9q0WjFG.js → ebnfDiagram-PWID7BFC-bGfwjP4s.js} +1 -1
- package/web/assets/{erDiagram-RLTQ6QDP-CEaH33R9.js → erDiagram-RLTQ6QDP-BkL3bf_c.js} +1 -1
- package/web/assets/eventmodeling-NTZA5JFV-Cx_Qoqa9.js +1 -0
- package/web/assets/flowDiagram-HODETNUW-CzzUtl9c.js +1 -0
- package/web/assets/{ganttDiagram-EL5Y4UJY-BaZJssC1.js → ganttDiagram-EL5Y4UJY-CQZN3YeS.js} +1 -1
- package/web/assets/{gitGraph-4MIJSDKK-BqtDQboB.js → gitGraph-4MIJSDKK-DZnCbmQI.js} +1 -1
- package/web/assets/{gitGraphDiagram-WWUBYQGX-DSR4hPrg.js → gitGraphDiagram-WWUBYQGX-DsE3BvGm.js} +1 -1
- package/web/assets/{index-C2MrCQ49.js → index-Cwu0Upat.js} +2 -2
- package/web/assets/{info-A6RAGUB7-BcRqmoAK.js → info-A6RAGUB7-CiQhcF59.js} +1 -1
- package/web/assets/{infoDiagram-27XIBGKW-DWrIU55Z.js → infoDiagram-27XIBGKW-BK7_G-Rv.js} +1 -1
- package/web/assets/{ishikawaDiagram-5VMMS53U-Bydrg8Aa.js → ishikawaDiagram-5VMMS53U-DwEXkGbl.js} +1 -1
- package/web/assets/{journeyDiagram-3NMN7TZE-Bs9PQ9td.js → journeyDiagram-3NMN7TZE-BFEfYmn1.js} +1 -1
- package/web/assets/{kanban-definition-UXKFOSKX-CRDsBHws.js → kanban-definition-UXKFOSKX-BGHHTvjY.js} +1 -1
- package/web/assets/{mermaid-parser.core-DGTHwG-V.js → mermaid-parser.core-BicayJF_.js} +3 -3
- package/web/assets/{mermaid.core-Tftjkz0u.js → mermaid.core-CFd-eua3.js} +4 -4
- package/web/assets/{mindmap-definition-YA3MSWOX-Cby1m35H.js → mindmap-definition-YA3MSWOX-dXnvoZdd.js} +1 -1
- package/web/assets/mount-COlEtDSc.js +36 -0
- package/web/assets/{packet-AYTQ26CC-D7pp3ByC.js → packet-AYTQ26CC-Dlk4XpLp.js} +1 -1
- package/web/assets/{pegDiagram-XKGWAZYB-B9EB-hpz.js → pegDiagram-XKGWAZYB-CrqdR0_-.js} +1 -1
- package/web/assets/{pie-WAS4IAKB-CBLaLmoX.js → pie-WAS4IAKB-BkO3XUQE.js} +1 -1
- package/web/assets/{pieDiagram-E7YTZNPT-B03jVQzh.js → pieDiagram-E7YTZNPT-BFDb2LSV.js} +1 -1
- package/web/assets/{quadrantDiagram-AXDQQJYC-DO7LdvI8.js → quadrantDiagram-AXDQQJYC-DaNSrCCT.js} +1 -1
- package/web/assets/{radar-RG4KPBEZ-Yp7qqsWn.js → radar-RG4KPBEZ-BWrmhxp6.js} +1 -1
- package/web/assets/{railroad-74A4TZTK-DCyaPcEg.js → railroad-74A4TZTK-Cu7Q7Rok.js} +1 -1
- package/web/assets/railroad-abnf-HS5TGJTU-BlfjFDjh.js +1 -0
- package/web/assets/railroad-ebnf-LZEXJU2U-wQByly-B.js +1 -0
- package/web/assets/railroad-peg-WCYAUIDC-CzTmW96x.js +1 -0
- package/web/assets/{railroadDiagram-O6MQD6OU-BjVunKM_.js → railroadDiagram-O6MQD6OU-CjDi9ktT.js} +1 -1
- package/web/assets/{requirementDiagram-BXWQKSXE-B2scbtpl.js → requirementDiagram-BXWQKSXE-C5_u4Gsv.js} +1 -1
- package/web/assets/{sankeyDiagram-P5KCCOFB-C9WyXdqF.js → sankeyDiagram-P5KCCOFB-BRGbnGwX.js} +1 -1
- package/web/assets/{sequenceDiagram-WJ2MYXX4-DDjf04-a.js → sequenceDiagram-WJ2MYXX4-C5YMU5on.js} +1 -1
- package/web/assets/{settingsRoute-DMOkGZ0F.js → settingsRoute-D-Q_gBJG.js} +1 -1
- package/web/assets/{stateDiagram-D77RDMKH-QtaNRMSA.js → stateDiagram-D77RDMKH-5EO5EMUS.js} +1 -1
- package/web/assets/stateDiagram-v2-MP3YSRHH-Bxmq54qM.js +1 -0
- package/web/assets/{swimlanes-42K2YHIH-B8i2q2ms.js → swimlanes-42K2YHIH-C3hju0RN.js} +1 -1
- package/web/assets/swimlanesDiagram-VR7AAH4N-upM6VKK6.js +8 -0
- package/web/assets/{timeline-definition-24CTP7MA-CBUkpsbO.js → timeline-definition-24CTP7MA-CHCn7Xv6.js} +1 -1
- package/web/assets/{treeView-Q6P3EWNA-nflLeiBr.js → treeView-Q6P3EWNA-CUNcz5ji.js} +1 -1
- package/web/assets/{treemap-WGGIJYW6-yD2jzvoa.js → treemap-WGGIJYW6-CcOyHQjm.js} +1 -1
- package/web/assets/{useStore-D4YwrJWz.js → useStore-BcTuuxB0.js} +14 -14
- package/web/assets/{vennDiagram-4TSXK5OY-B6E0p7OK.js → vennDiagram-4TSXK5OY-YlBK7CKj.js} +1 -1
- package/web/assets/{wardley-WFR3VGLG-jjQJdlvj.js → wardley-WFR3VGLG-Dlu1wm0W.js} +1 -1
- package/web/assets/{wardleyDiagram-VM6X3IG4-B_RIiDHY.js → wardleyDiagram-VM6X3IG4-Cx9Tx2TY.js} +1 -1
- package/web/assets/{xychartDiagram-S5SC5T6Z-ULQo9pt_.js → xychartDiagram-S5SC5T6Z-B5SG3mCC.js} +1 -1
- package/web/index.html +1 -1
- package/web/sw.js +1 -1
- package/web/assets/AutomationsView-C91uHBUg.js +0 -51
- package/web/assets/architecture-7GRP2DOG-BriHxVmA.js +0 -1
- package/web/assets/channel-KG6NYshN.js +0 -1
- package/web/assets/classDiagram-ZZMXUADV-DHqO-Y2G.js +0 -1
- package/web/assets/classDiagram-v2-VYDZK3BY-DHqO-Y2G.js +0 -1
- package/web/assets/eventmodeling-NTZA5JFV-S9SQVVXj.js +0 -1
- package/web/assets/flowDiagram-HODETNUW-Btl9wWK-.js +0 -1
- package/web/assets/mount-adAIXSUv.js +0 -36
- package/web/assets/railroad-abnf-HS5TGJTU-FUIbQmAF.js +0 -1
- package/web/assets/railroad-ebnf-LZEXJU2U-C48FI13a.js +0 -1
- package/web/assets/railroad-peg-WCYAUIDC-DgSxsTCM.js +0 -1
- package/web/assets/stateDiagram-v2-MP3YSRHH-CdaiTthO.js +0 -1
- package/web/assets/swimlanesDiagram-VR7AAH4N-B4l2mjJD.js +0 -8
|
@@ -38,7 +38,8 @@ export const BIVY_AGENT_NOTE = [
|
|
|
38
38
|
"rule. A `.csv`/`.tsv` renders as a table; anything else arrives as a download.",
|
|
39
39
|
"- Show a NUMBER or a CHART inside your reply: fence a spec as ```bivy. A number is " +
|
|
40
40
|
'`{"type":"metric","value":"4 650 kWh","label":"per year"}`; a chart is a plain Vega-Lite spec with its data ' +
|
|
41
|
-
"inline
|
|
41
|
+
"inline, or pointing at a workspace data file with `\"data\":{\"url\":\"data/use.csv\"}` (.csv/.tsv/.json). " +
|
|
42
|
+
"A chart cannot fetch a remote URL.",
|
|
42
43
|
"- Send a file WITHOUT writing a reply (or from a script): run " +
|
|
43
44
|
'`bivy attach <path> [--caption "short note"]`, or call the `attach_to_chat` tool if you have it.',
|
|
44
45
|
"- Something with a UI: `bivy app publish <manifest.json>` (a web server's port, a static build, a terminal) or " +
|
|
@@ -292,11 +292,85 @@ export function componentKind(opts) {
|
|
|
292
292
|
// show that yet".
|
|
293
293
|
return "file";
|
|
294
294
|
}
|
|
295
|
+
/** How deep into a spec to look for references. Bounded so a pathological
|
|
296
|
+
* nesting cannot turn one message into an unbounded walk. */
|
|
297
|
+
const MAX_SPEC_DEPTH = 8;
|
|
295
298
|
/**
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
299
|
+
* Workspace files a SPEC references, by putting a relative path in a `url`
|
|
300
|
+
* field. That is Vega-Lite's `data.url`, which is how a chart points at a
|
|
301
|
+
* dataset rather than carrying every row inline — and the whole spec is walked
|
|
302
|
+
* because Vega-Lite allows one per layer, facet and lookup, not just at the top.
|
|
303
|
+
*
|
|
304
|
+
* Deliberately keyed on the field NAME, not on anything Vega-specific: this
|
|
305
|
+
* file must not learn one kind's schema, and "a `url` field holding a
|
|
306
|
+
* workspace path is a reference" is a rule any future kind can use.
|
|
307
|
+
*
|
|
308
|
+
* A `url` that is not a workspace path (an `https://` address, say) is not
|
|
309
|
+
* returned, and so is never resolved — the view layer refuses those outright
|
|
310
|
+
* rather than letting a chart make the reader's browser fetch it.
|
|
311
|
+
*/
|
|
312
|
+
export function specReferences(spec, limit = MAX_COMPONENTS_PER_MESSAGE) {
|
|
313
|
+
const out = [];
|
|
314
|
+
const seen = new Set();
|
|
315
|
+
const walk = (value, depth) => {
|
|
316
|
+
if (out.length >= limit || depth > MAX_SPEC_DEPTH || !value || typeof value !== "object")
|
|
317
|
+
return;
|
|
318
|
+
if (Array.isArray(value)) {
|
|
319
|
+
for (const item of value)
|
|
320
|
+
walk(item, depth + 1);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
for (const [key, child] of Object.entries(value)) {
|
|
324
|
+
if (key === "url" && typeof child === "string") {
|
|
325
|
+
const ref = unescapeComponentRef(child);
|
|
326
|
+
if (classifyImageTarget(ref) === "workspace" && !seen.has(ref)) {
|
|
327
|
+
seen.add(ref);
|
|
328
|
+
out.push(ref);
|
|
329
|
+
if (out.length >= limit)
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
walk(child, depth + 1);
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
walk(spec, 0);
|
|
338
|
+
return out;
|
|
339
|
+
}
|
|
340
|
+
/** Each ```bivy fence in `text`, as a parsed spec with its offset. Line-wise,
|
|
341
|
+
* because that is how a fence is defined; an unterminated one yields nothing,
|
|
342
|
+
* which is also how a half-streamed message behaves. */
|
|
343
|
+
function componentFences(text) {
|
|
344
|
+
const out = [];
|
|
345
|
+
const lines = String(text).split("\n");
|
|
346
|
+
let at = 0;
|
|
347
|
+
for (let i = 0; i < lines.length; i++) {
|
|
348
|
+
const line = lines[i] ?? "";
|
|
349
|
+
const start = at;
|
|
350
|
+
at += line.length + 1;
|
|
351
|
+
if (!isComponentFence(line.trim().replace(/^```+/, "")))
|
|
352
|
+
continue;
|
|
353
|
+
const body = [];
|
|
354
|
+
let j = i + 1;
|
|
355
|
+
for (; j < lines.length && !lines[j].trim().startsWith("```"); j++) {
|
|
356
|
+
body.push(lines[j]);
|
|
357
|
+
at += lines[j].length + 1;
|
|
358
|
+
}
|
|
359
|
+
if (j < lines.length)
|
|
360
|
+
at += lines[j].length + 1;
|
|
361
|
+
const spec = parseComponentSpec(body.join("\n"));
|
|
362
|
+
if (spec)
|
|
363
|
+
out.push({ spec, at: start });
|
|
364
|
+
i = j;
|
|
365
|
+
}
|
|
366
|
+
return out;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Every reference a message makes that Bivy has to resolve — from image syntax,
|
|
370
|
+
* from a directive, or from a `url` inside a spec — de-duplicated, in first-seen
|
|
371
|
+
* order, under ONE shared cap. One budget across all three forms is deliberate:
|
|
372
|
+
* the cost being bounded is file reads and persisted bytes, which do not care
|
|
373
|
+
* which syntax asked.
|
|
300
374
|
*/
|
|
301
375
|
export function extractMessageReferences(text, limit = MAX_COMPONENTS_PER_MESSAGE) {
|
|
302
376
|
if (!text)
|
|
@@ -322,6 +396,12 @@ export function extractMessageReferences(text, limit = MAX_COMPONENTS_PER_MESSAG
|
|
|
322
396
|
found.push({ ref: directive.ref, origin: "workspace", syntax: "view", at });
|
|
323
397
|
at += line.length + 1;
|
|
324
398
|
}
|
|
399
|
+
// A spec can point at a dataset instead of carrying it (a chart's data.url).
|
|
400
|
+
for (const { spec, at: offset } of componentFences(source)) {
|
|
401
|
+
for (const ref of specReferences(spec, limit)) {
|
|
402
|
+
found.push({ ref, origin: "workspace", syntax: "spec", at: offset });
|
|
403
|
+
}
|
|
404
|
+
}
|
|
325
405
|
found.sort((a, b) => a.at - b.at);
|
|
326
406
|
const out = [];
|
|
327
407
|
const seen = new Set();
|
|
@@ -127,13 +127,31 @@ export function createTranscriptPersistence(deps) {
|
|
|
127
127
|
}
|
|
128
128
|
return refs;
|
|
129
129
|
}
|
|
130
|
+
/** References made by the NEWEST assistant message. These are re-read even
|
|
131
|
+
* when the log already has them, which is what lets an agent overwrite a
|
|
132
|
+
* file and reference it again; see resolveWorkspaceRefs. */
|
|
133
|
+
function refsInLatestMessage(record) {
|
|
134
|
+
const messages = record.session.getMessages();
|
|
135
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
136
|
+
const m = messages[i];
|
|
137
|
+
if (m.role !== "assistant")
|
|
138
|
+
continue;
|
|
139
|
+
return new Set(extractWorkspaceRefs(assistantTextForImageScan(m.content)).map(({ ref }) => ref));
|
|
140
|
+
}
|
|
141
|
+
return new Set();
|
|
142
|
+
}
|
|
130
143
|
/** Store resolved bytes under `ref` and tell every client, durably and live.
|
|
131
144
|
* One place, so the remote and workspace resolvers below cannot drift in how
|
|
132
145
|
* they record what they found. `kind` carries whether the bytes are an image,
|
|
133
146
|
* which is what lets the view layer pick a renderer for a `::view` that
|
|
134
147
|
* points at something other than a picture. */
|
|
135
|
-
function recordResolvedRef(sessionId, ref, bytes, meta) {
|
|
148
|
+
function recordResolvedRef(sessionId, ref, bytes, meta, previousHash) {
|
|
136
149
|
const stored = attachmentStore.put(bytes, { name: meta.name, mimeType: meta.mimeType, kind: meta.kind ?? "image" });
|
|
150
|
+
// Content-addressed, so re-reading an unchanged file yields the hash
|
|
151
|
+
// already recorded. Appending that again would grow the log and wake every
|
|
152
|
+
// device for a picture none of them would redraw.
|
|
153
|
+
if (previousHash && stored.hash === previousHash)
|
|
154
|
+
return;
|
|
137
155
|
eventLog.appendInlineImage(sessionId, { url: ref, ref: stored });
|
|
138
156
|
eventLog.flush(sessionId);
|
|
139
157
|
deps.broadcast(deps.stampSessionEvent({ type: "session.event", sessionId, event: { type: "inlineImage", url: ref, ref: stored } }));
|
|
@@ -166,12 +184,24 @@ export function createTranscriptPersistence(deps) {
|
|
|
166
184
|
const refs = workspaceRefsInTranscript(record);
|
|
167
185
|
if (!refs.size)
|
|
168
186
|
return;
|
|
169
|
-
const
|
|
187
|
+
const resolved = new Map(eventLog.readInlineImages(record.id));
|
|
188
|
+
// References the agent just made are re-read even when the log already has
|
|
189
|
+
// them. An agent that regenerates out/chart.png and shows it again means
|
|
190
|
+
// the new one; without this it would say "here is the updated chart" above
|
|
191
|
+
// the old picture. Bounded to the newest message, so this costs at most the
|
|
192
|
+
// per-message reference budget in reads per turn rather than re-reading
|
|
193
|
+
// every file the whole session ever mentioned.
|
|
194
|
+
const fresh = refsInLatestMessage(record);
|
|
170
195
|
for (const [rel, syntax] of refs) {
|
|
171
|
-
|
|
196
|
+
const previous = resolved.get(rel);
|
|
197
|
+
const isFresh = fresh.has(rel);
|
|
198
|
+
if (previous && !isFresh)
|
|
172
199
|
continue;
|
|
173
200
|
const failedAt = inlineImageFailedAt.get(rel);
|
|
174
|
-
|
|
201
|
+
// A fresh reference ignores the cooldown: the likeliest reason it failed
|
|
202
|
+
// before is that the agent had not written the file yet, and waiting ten
|
|
203
|
+
// minutes to show a file that now exists is worse than one extra read.
|
|
204
|
+
if (!isFresh && failedAt !== undefined && Date.now() - failedAt < INLINE_IMAGE_RETRY_COOLDOWN_MS)
|
|
175
205
|
continue;
|
|
176
206
|
const plan = planAttachment({ workspaceDir, filePath: rel, maxBytes: MAX_WORKSPACE_REF_BYTES });
|
|
177
207
|
if (isAttachPlanError(plan)) {
|
|
@@ -189,7 +219,7 @@ export function createTranscriptPersistence(deps) {
|
|
|
189
219
|
continue;
|
|
190
220
|
}
|
|
191
221
|
try {
|
|
192
|
-
recordResolvedRef(record.id, rel, plan.bytes, { name: plan.name, mimeType: plan.mimeType, kind: plan.kind });
|
|
222
|
+
recordResolvedRef(record.id, rel, plan.bytes, { name: plan.name, mimeType: plan.mimeType, kind: plan.kind }, previous?.hash);
|
|
193
223
|
}
|
|
194
224
|
catch (error) {
|
|
195
225
|
console.warn(`[component] ${rel}:`, error instanceof Error ? error.message : String(error));
|
package/package.json
CHANGED