@tutti-os/agent-gui 0.0.144 → 0.0.146

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 (35) hide show
  1. package/README.md +6 -0
  2. package/dist/{AgentRichTextReadonly-QIQCYZAG.js → AgentRichTextReadonly-GZSB6LJS.js} +3 -3
  3. package/dist/agent-conversation/index.d.ts +36 -2
  4. package/dist/agent-conversation/index.js +5 -3
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-gui.js +7 -7
  7. package/dist/app/renderer/agentactivity.css +41 -16
  8. package/dist/{chunk-4V3QEPKX.js → chunk-3CZYC2YN.js} +427 -59
  9. package/dist/chunk-3CZYC2YN.js.map +1 -0
  10. package/dist/{chunk-Z2J3NPPX.js → chunk-4WSWPMV7.js} +121 -480
  11. package/dist/chunk-4WSWPMV7.js.map +1 -0
  12. package/dist/{chunk-O764HQNF.js → chunk-E27CQCLN.js} +1 -1
  13. package/dist/chunk-E27CQCLN.js.map +1 -0
  14. package/dist/{chunk-5ZZMG4ZB.js → chunk-HMSN264L.js} +2 -2
  15. package/dist/{chunk-N2NZASIS.js → chunk-JNC4FCUV.js} +2 -2
  16. package/dist/{chunk-TJW5NWWH.js → chunk-RBY6GQ2Q.js} +2 -2
  17. package/dist/{chunk-JME2T7T7.js → chunk-ZF65NZ4B.js} +16 -9
  18. package/dist/chunk-ZF65NZ4B.js.map +1 -0
  19. package/dist/context-mention-palette/index.js +3 -3
  20. package/dist/index.d.ts +9 -1
  21. package/dist/index.js +10 -8
  22. package/dist/index.js.map +1 -1
  23. package/dist/mention-search.js +2 -2
  24. package/dist/workbench/contribution.js +1 -1
  25. package/dist/workbench/index.d.ts +2 -1
  26. package/dist/workbench/index.js +1 -1
  27. package/package.json +13 -13
  28. package/dist/chunk-4V3QEPKX.js.map +0 -1
  29. package/dist/chunk-JME2T7T7.js.map +0 -1
  30. package/dist/chunk-O764HQNF.js.map +0 -1
  31. package/dist/chunk-Z2J3NPPX.js.map +0 -1
  32. /package/dist/{AgentRichTextReadonly-QIQCYZAG.js.map → AgentRichTextReadonly-GZSB6LJS.js.map} +0 -0
  33. /package/dist/{chunk-5ZZMG4ZB.js.map → chunk-HMSN264L.js.map} +0 -0
  34. /package/dist/{chunk-N2NZASIS.js.map → chunk-JNC4FCUV.js.map} +0 -0
  35. /package/dist/{chunk-TJW5NWWH.js.map → chunk-RBY6GQ2Q.js.map} +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  AgentRichTextReadonly,
3
3
  promptForProviderSkills,
4
4
  skillTriggerForPrefix
5
- } from "./chunk-N2NZASIS.js";
5
+ } from "./chunk-JNC4FCUV.js";
6
6
  import {
7
7
  classifyRecoverableAgentMessage,
8
8
  isProviderPlanLimitMessage,
@@ -27,7 +27,7 @@ import {
27
27
  agentPromptFileBlocks,
28
28
  agentPromptPastedTextBlocks,
29
29
  materializeAgentComposerFileMentions
30
- } from "./chunk-O764HQNF.js";
30
+ } from "./chunk-E27CQCLN.js";
31
31
  import {
32
32
  AGENT_PASTED_TEXT_BLOCK_KIND,
33
33
  AGENT_PASTED_TEXT_MENTION_KIND
@@ -4981,6 +4981,372 @@ function projectGeneratedImageRow(call, turnId) {
4981
4981
  };
4982
4982
  }
4983
4983
 
4984
+ // agent-gui/agentGuiNode/model/agentConversationCopy.ts
4985
+ var COPY_PAGE_SIZE = 200;
4986
+ var MAX_COPY_PAGES = 1e3;
4987
+ var AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES = 2 * 1024 * 1024;
4988
+ async function loadCompleteAgentConversationMessages(input) {
4989
+ const messagesById = /* @__PURE__ */ new Map();
4990
+ let beforeVersion;
4991
+ for (let pageIndex = 0; pageIndex < MAX_COPY_PAGES; pageIndex += 1) {
4992
+ const page = await input.runtime.listSessionMessages({
4993
+ agentSessionId: input.agentSessionId,
4994
+ ...beforeVersion === void 0 ? {} : { beforeVersion },
4995
+ cache: false,
4996
+ limit: COPY_PAGE_SIZE,
4997
+ order: "desc",
4998
+ workspaceId: input.workspaceId
4999
+ });
5000
+ for (const message of page.messages) {
5001
+ const key = message.messageId.trim() || `${message.version}`;
5002
+ const existing = messagesById.get(key);
5003
+ if (!existing || message.version >= existing.version) {
5004
+ messagesById.set(key, message);
5005
+ }
5006
+ }
5007
+ if (!page.hasMore) {
5008
+ return [...messagesById.values()].sort(compareMessagesAscending);
5009
+ }
5010
+ const nextBeforeVersion = minimumPositiveVersion(page.messages);
5011
+ if (nextBeforeVersion === null || beforeVersion !== void 0 && nextBeforeVersion >= beforeVersion) {
5012
+ throw new Error("Conversation message pagination did not advance.");
5013
+ }
5014
+ beforeVersion = nextBeforeVersion;
5015
+ }
5016
+ throw new Error("Conversation message pagination exceeded the safety limit.");
5017
+ }
5018
+ async function serializeAgentConversationForClipboard(input) {
5019
+ const context = {
5020
+ labels: input.labels,
5021
+ readAttachment: input.readAttachment,
5022
+ readLocalImage: input.readLocalImage,
5023
+ stats: { omittedImages: 0 }
5024
+ };
5025
+ const kept = [];
5026
+ for (const message of [...input.messages].sort(compareMessagesAscending)) {
5027
+ if (isSystemNoticeMessage(message)) {
5028
+ continue;
5029
+ }
5030
+ if (isToolMessage(message)) {
5031
+ const body2 = await serializeImagesOnly(message.payload ?? {}, context);
5032
+ if (body2.plain) {
5033
+ kept.push({ body: body2, isToolImage: true, role: "assistant" });
5034
+ }
5035
+ continue;
5036
+ }
5037
+ const role = keptMessageRole(message);
5038
+ if (!role) {
5039
+ continue;
5040
+ }
5041
+ const body = await serializeMessageContent(message.payload ?? {}, context);
5042
+ if (body.plain) {
5043
+ kept.push({ body, role });
5044
+ }
5045
+ }
5046
+ const markdownBlocks = [`# ${singleLine(input.title)}`];
5047
+ const hydratedBlocks = [`# ${singleLine(input.title)}`];
5048
+ const pushBlock = (plain, hydrated) => {
5049
+ markdownBlocks.push(plain);
5050
+ hydratedBlocks.push(hydrated);
5051
+ };
5052
+ let index = 0;
5053
+ while (index < kept.length) {
5054
+ const entry = kept[index];
5055
+ if (entry.role === "user") {
5056
+ pushBlock(
5057
+ blockquoteMarkdown(entry.body.plain),
5058
+ blockquoteMarkdown(entry.body.hydrated)
5059
+ );
5060
+ index += 1;
5061
+ continue;
5062
+ }
5063
+ let last = index;
5064
+ while (last + 1 < kept.length && kept[last + 1].role === "assistant") {
5065
+ last += 1;
5066
+ }
5067
+ const run = kept.slice(index, last + 1);
5068
+ const textEntries = run.filter((item) => !item.isToolImage);
5069
+ const interim = textEntries.slice(0, -1);
5070
+ const finalText = textEntries.at(-1);
5071
+ if (interim.length > 0) {
5072
+ const summary = input.labels.previousMessages.replace(
5073
+ "{{count}}",
5074
+ `${interim.length}`
5075
+ );
5076
+ const detailsBlock = (side) => [
5077
+ `<details><summary>${summary}</summary>`,
5078
+ ...interim.map((item) => blockquoteMarkdown(item.body[side])),
5079
+ "</details>"
5080
+ ].join("\n\n");
5081
+ pushBlock(detailsBlock("plain"), detailsBlock("hydrated"));
5082
+ }
5083
+ for (const item of run) {
5084
+ if (item.isToolImage || item === finalText) {
5085
+ pushBlock(item.body.plain, item.body.hydrated);
5086
+ }
5087
+ }
5088
+ index = last + 1;
5089
+ }
5090
+ return {
5091
+ hydratedMarkdown: hydratedBlocks.join("\n\n").trim(),
5092
+ markdown: markdownBlocks.join("\n\n").trim(),
5093
+ omittedImages: context.stats.omittedImages
5094
+ };
5095
+ }
5096
+ function sameBody(value) {
5097
+ return { hydrated: value, plain: value };
5098
+ }
5099
+ function joinBodies(bodies) {
5100
+ return {
5101
+ hydrated: bodies.map((body) => body.hydrated).filter(Boolean).join("\n\n").trim(),
5102
+ plain: bodies.map((body) => body.plain).filter(Boolean).join("\n\n").trim()
5103
+ };
5104
+ }
5105
+ function keptMessageRole(message) {
5106
+ const role = normalizedRole(message.role);
5107
+ if (role === "user") {
5108
+ return "user";
5109
+ }
5110
+ if (role === "assistant" || role === "agent") {
5111
+ return "assistant";
5112
+ }
5113
+ return null;
5114
+ }
5115
+ function blockquoteMarkdown(value) {
5116
+ const quoted = value.replace(
5117
+ /\n(.?)/g,
5118
+ (_match, next) => next ? `
5119
+ > ${next}` : "\n>"
5120
+ );
5121
+ return `> ${quoted}`;
5122
+ }
5123
+ async function serializeMessageContent(payload, context) {
5124
+ const content = payload.content;
5125
+ if (Array.isArray(content)) {
5126
+ const blocks = await Promise.all(
5127
+ content.map((block) => serializeContentValue(block, context))
5128
+ );
5129
+ const serialized = joinBodies(blocks);
5130
+ if (serialized.plain) {
5131
+ return serialized;
5132
+ }
5133
+ } else if (typeof content === "string" && content.trim()) {
5134
+ return sameBody(content.trim());
5135
+ }
5136
+ return sameBody(
5137
+ firstString2(
5138
+ payload.displayPrompt,
5139
+ payload.text,
5140
+ payload.detail,
5141
+ payload.title,
5142
+ payload.summary
5143
+ ) ?? ""
5144
+ );
5145
+ }
5146
+ async function serializeContentValue(value, context) {
5147
+ if (typeof value === "string") {
5148
+ return sameBody(value.trim());
5149
+ }
5150
+ if (!isRecord(value)) {
5151
+ return sameBody("");
5152
+ }
5153
+ if (value.type === "content" && value.content !== void 0) {
5154
+ return serializeContentValue(value.content, context);
5155
+ }
5156
+ const block = value;
5157
+ switch (block.type) {
5158
+ case "text":
5159
+ return sameBody(typeof block.text === "string" ? block.text.trim() : "");
5160
+ case "image":
5161
+ return serializeImageBlock(block, context);
5162
+ case "file":
5163
+ return sameBody(serializeFileBlock(block, context.labels));
5164
+ case "mention":
5165
+ return sameBody(serializeMentionBlock(block, context.labels));
5166
+ case "skill":
5167
+ return sameBody(serializeSkillBlock(block));
5168
+ default: {
5169
+ const nested = await Promise.all(
5170
+ [value.content, value.output, value.result].filter((candidate) => candidate !== void 0).map((candidate) => serializeContentValue(candidate, context))
5171
+ );
5172
+ return joinBodies(nested);
5173
+ }
5174
+ }
5175
+ }
5176
+ async function serializeImagesOnly(value, context) {
5177
+ if (Array.isArray(value)) {
5178
+ const nested = await Promise.all(
5179
+ value.map((item) => serializeImagesOnly(item, context))
5180
+ );
5181
+ return joinBodies(nested);
5182
+ }
5183
+ if (!isRecord(value)) {
5184
+ return sameBody("");
5185
+ }
5186
+ if (value.type === "content" && value.content !== void 0) {
5187
+ return serializeImagesOnly(value.content, context);
5188
+ }
5189
+ const block = value;
5190
+ switch (block.type) {
5191
+ case "image":
5192
+ return serializeImageBlock(block, context);
5193
+ case "text":
5194
+ case "file":
5195
+ case "mention":
5196
+ case "skill":
5197
+ return sameBody("");
5198
+ default: {
5199
+ const nested = await Promise.all(
5200
+ [value.content, value.output, value.result].filter((candidate) => candidate !== void 0).map((candidate) => serializeImagesOnly(candidate, context))
5201
+ );
5202
+ return joinBodies(nested);
5203
+ }
5204
+ }
5205
+ }
5206
+ async function serializeImageBlock(block, context) {
5207
+ const attachmentId = firstString2(block.attachmentId);
5208
+ const blockMimeType = firstString2(block.mimeType);
5209
+ const name = firstString2(block.name) ?? context.labels.image;
5210
+ const source = firstString2(block.url, block.uri, block.path, block.hostPath);
5211
+ const inlineData = typeof block.data === "string" && block.data.trim() ? block.data.trim() : null;
5212
+ const isDataSource = source?.startsWith("data:") ?? false;
5213
+ const plain = source && !isDataSource ? imageLinkMarkdown(name, source) : attachmentId ? imageLinkMarkdown(name, `attachment:${attachmentId}`) : `**${name}**`;
5214
+ let hydrated = plain;
5215
+ if (source && isDataSource) {
5216
+ const payload = source.slice(source.indexOf(",") + 1);
5217
+ if (base64BinaryByteSize(payload) <= AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES) {
5218
+ hydrated = imageLinkMarkdown(name, source);
5219
+ } else {
5220
+ context.stats.omittedImages += 1;
5221
+ }
5222
+ } else if (source) {
5223
+ const localPath = localImagePathFromSource(source);
5224
+ if (localPath && context.readLocalImage) {
5225
+ try {
5226
+ const attachment = await context.readLocalImage({
5227
+ mimeType: blockMimeType,
5228
+ path: localPath
5229
+ });
5230
+ hydrated = embedWithinLimit(name, attachment, plain, context);
5231
+ } catch {
5232
+ context.stats.omittedImages += 1;
5233
+ }
5234
+ }
5235
+ } else if (inlineData) {
5236
+ const dataUri = inlineData.startsWith("data:") ? inlineData : `data:${blockMimeType ?? "image/png"};base64,${inlineData}`;
5237
+ const payload = dataUri.slice(dataUri.indexOf(",") + 1);
5238
+ if (base64BinaryByteSize(payload) <= AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES) {
5239
+ hydrated = imageLinkMarkdown(name, dataUri);
5240
+ } else {
5241
+ context.stats.omittedImages += 1;
5242
+ }
5243
+ } else if (attachmentId && context.readAttachment) {
5244
+ try {
5245
+ const attachment = await context.readAttachment(attachmentId);
5246
+ hydrated = embedWithinLimit(name, attachment, plain, context);
5247
+ } catch {
5248
+ context.stats.omittedImages += 1;
5249
+ }
5250
+ }
5251
+ return { hydrated, plain };
5252
+ }
5253
+ function embedWithinLimit(name, attachment, fallback, context) {
5254
+ if (base64BinaryByteSize(attachment.data) > AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES) {
5255
+ context.stats.omittedImages += 1;
5256
+ return fallback;
5257
+ }
5258
+ return imageLinkMarkdown(
5259
+ name,
5260
+ `data:${attachment.mimeType};base64,${attachment.data}`
5261
+ );
5262
+ }
5263
+ function imageLinkMarkdown(name, target) {
5264
+ return `![${escapeMarkdownLabel(name)}](<${escapeMarkdownTarget(target)}>)`;
5265
+ }
5266
+ function base64BinaryByteSize(value) {
5267
+ const trimmed = value.trim();
5268
+ const padding = trimmed.endsWith("==") ? 2 : trimmed.endsWith("=") ? 1 : 0;
5269
+ return Math.max(0, Math.floor(trimmed.length * 3 / 4) - padding);
5270
+ }
5271
+ function localImagePathFromSource(source) {
5272
+ const trimmed = source.trim();
5273
+ if (isLocalImagePath(trimmed)) {
5274
+ return trimmed;
5275
+ }
5276
+ if (!/^file:\/\//i.test(trimmed)) {
5277
+ return null;
5278
+ }
5279
+ try {
5280
+ const pathname = decodeURIComponent(new URL(trimmed).pathname);
5281
+ return /^\/[a-zA-Z]:[\\/]/.test(pathname) ? pathname.slice(1) : pathname;
5282
+ } catch {
5283
+ return null;
5284
+ }
5285
+ }
5286
+ function serializeFileBlock(block, labels) {
5287
+ const source = firstString2(block.uri, block.path, block.hostPath, block.url);
5288
+ const name = firstString2(block.name) ?? source ?? labels.file;
5289
+ return source ? `[${escapeMarkdownLabel(name)}](<${escapeMarkdownTarget(source)}>)` : `**${labels.file}:** ${escapeMarkdownLabel(name)}`;
5290
+ }
5291
+ function serializeMentionBlock(block, labels) {
5292
+ const text = firstString2(block.text, block.name);
5293
+ if (text) {
5294
+ return text.startsWith(labels.mentionPrefix) ? text : `${labels.mentionPrefix}${text}`;
5295
+ }
5296
+ return firstString2(block.uri, block.path) ?? "";
5297
+ }
5298
+ function serializeSkillBlock(block) {
5299
+ const name = firstString2(block.name, block.text);
5300
+ return name ? name.startsWith("/") ? name : `/${name}` : "";
5301
+ }
5302
+ function isSystemNoticeMessage(message) {
5303
+ return firstString2(message.payload.kind) === "agent_system_notice";
5304
+ }
5305
+ function isToolMessage(message) {
5306
+ const kind = message.kind.trim().toLowerCase();
5307
+ return kind.includes("tool") || kind.includes("call") || firstString2(message.payload.callType, message.payload.toolName) !== null;
5308
+ }
5309
+ function compareMessagesAscending(left, right) {
5310
+ const leftSequence = left.sequence ?? 0;
5311
+ const rightSequence = right.sequence ?? 0;
5312
+ if (leftSequence > 0 && rightSequence > 0 && leftSequence !== rightSequence) {
5313
+ return leftSequence - rightSequence;
5314
+ }
5315
+ return left.occurredAtUnixMs - right.occurredAtUnixMs || left.version - right.version || left.messageId.localeCompare(right.messageId);
5316
+ }
5317
+ function minimumPositiveVersion(messages) {
5318
+ let minimum = Number.POSITIVE_INFINITY;
5319
+ for (const message of messages) {
5320
+ if (Number.isFinite(message.version) && message.version > 0) {
5321
+ minimum = Math.min(minimum, message.version);
5322
+ }
5323
+ }
5324
+ return Number.isFinite(minimum) ? minimum : null;
5325
+ }
5326
+ function normalizedRole(role) {
5327
+ return role.trim().toLowerCase();
5328
+ }
5329
+ function firstString2(...values) {
5330
+ for (const value of values) {
5331
+ if (typeof value === "string" && value.trim()) {
5332
+ return value.trim();
5333
+ }
5334
+ }
5335
+ return null;
5336
+ }
5337
+ function singleLine(value) {
5338
+ return value.trim().replace(/\s+/g, " ");
5339
+ }
5340
+ function escapeMarkdownLabel(value) {
5341
+ return value.replaceAll("\\", "\\\\").replaceAll("[", "\\[").replaceAll("]", "\\]");
5342
+ }
5343
+ function escapeMarkdownTarget(value) {
5344
+ return value.replace(/>/g, "%3E");
5345
+ }
5346
+ function isRecord(value) {
5347
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
5348
+ }
5349
+
4984
5350
  // shared/agentConversation/components/AgentTranscriptSkeleton.tsx
4985
5351
  import { jsx, jsxs } from "react/jsx-runtime";
4986
5352
  function AgentTranscriptSkeleton({
@@ -7699,7 +8065,7 @@ function getFileChangeRenderData(call) {
7699
8065
  if (fromContentDiff.length > 0) {
7700
8066
  return fromContentDiff;
7701
8067
  }
7702
- const inputPath = firstString2(
8068
+ const inputPath = firstString3(
7703
8069
  stringValue6(call.input?.file_path),
7704
8070
  stringValue6(call.input?.filePath),
7705
8071
  stringValue6(call.input?.path),
@@ -7708,31 +8074,31 @@ function getFileChangeRenderData(call) {
7708
8074
  stringValue6(payloadInput?.path),
7709
8075
  firstLocationPath(inputLocations)
7710
8076
  );
7711
- const unifiedDiff = firstString2(
8077
+ const unifiedDiff = firstString3(
7712
8078
  stringValue6(call.output?.patch),
7713
8079
  stringValue6(payloadOutput?.patch),
7714
8080
  stringValue6(call.output?.diff),
7715
8081
  stringValue6(payloadOutput?.diff)
7716
8082
  );
7717
- const path = firstString2(
8083
+ const path = firstString3(
7718
8084
  inputPath,
7719
8085
  unifiedDiff ? extractAgentPatchPath(unifiedDiff) : null
7720
8086
  );
7721
8087
  if (!path) {
7722
8088
  return [];
7723
8089
  }
7724
- const content = firstString2(
8090
+ const content = firstString3(
7725
8091
  stringValue6(call.input?.content),
7726
8092
  stringValue6(payloadInput?.content),
7727
8093
  stringValue6(rawInput?.content)
7728
8094
  );
7729
- const oldString = firstString2(
8095
+ const oldString = firstString3(
7730
8096
  stringValue6(call.input?.old_string),
7731
8097
  stringValue6(payloadInput?.old_string),
7732
8098
  stringValue6(call.output?.oldString),
7733
8099
  stringValue6(payloadOutput?.oldString)
7734
8100
  );
7735
- const newString = firstString2(
8101
+ const newString = firstString3(
7736
8102
  stringValue6(call.input?.new_string),
7737
8103
  stringValue6(payloadInput?.new_string),
7738
8104
  stringValue6(call.output?.newString),
@@ -7774,26 +8140,26 @@ function structuredPatchFiles(value) {
7774
8140
  }
7775
8141
  return patches.flatMap((item) => {
7776
8142
  const patch = recordValue3(item);
7777
- const path = firstString2(
8143
+ const path = firstString3(
7778
8144
  stringValue6(patch?.filePath),
7779
8145
  stringValue6(patch?.path)
7780
8146
  );
7781
- const diff = firstString2(
8147
+ const diff = firstString3(
7782
8148
  stringValue6(patch?.diff),
7783
8149
  stringValue6(patch?.patch)
7784
8150
  );
7785
8151
  if (!path) {
7786
8152
  return [];
7787
8153
  }
7788
- const oldString = firstString2(
8154
+ const oldString = firstString3(
7789
8155
  stringValue6(patch?.oldString),
7790
8156
  stringValue6(patch?.old_string)
7791
8157
  );
7792
- const newString = firstString2(
8158
+ const newString = firstString3(
7793
8159
  stringValue6(patch?.newString),
7794
8160
  stringValue6(patch?.new_string)
7795
8161
  );
7796
- const content = firstString2(stringValue6(patch?.content), newString);
8162
+ const content = firstString3(stringValue6(patch?.content), newString);
7797
8163
  if (!diff && !oldString && !newString && !content) {
7798
8164
  return [];
7799
8165
  }
@@ -7861,21 +8227,21 @@ function fileChangesFiles(value) {
7861
8227
  if (!path) {
7862
8228
  return [];
7863
8229
  }
7864
- const unifiedDiff = firstString2(
8230
+ const unifiedDiff = firstString3(
7865
8231
  stringValue6(file?.diff),
7866
8232
  stringValue6(file?.patch),
7867
8233
  stringValue6(file?.unifiedDiff),
7868
8234
  stringValue6(file?.unified_diff)
7869
8235
  );
7870
- const oldString = firstString2(
8236
+ const oldString = firstString3(
7871
8237
  stringValue6(file?.oldString),
7872
8238
  stringValue6(file?.old_string)
7873
8239
  );
7874
- const newString = firstString2(
8240
+ const newString = firstString3(
7875
8241
  stringValue6(file?.newString),
7876
8242
  stringValue6(file?.new_string)
7877
8243
  );
7878
- const content = firstString2(stringValue6(file?.content), newString);
8244
+ const content = firstString3(stringValue6(file?.content), newString);
7879
8245
  const changeType = firstKnownChangeType(
7880
8246
  normalizeChangeType2(stringValue6(file?.change)),
7881
8247
  normalizeChangeType2(stringValue6(file?.kind)),
@@ -7910,7 +8276,7 @@ function changeMapFiles(value) {
7910
8276
  if (!normalizedPath) {
7911
8277
  return [];
7912
8278
  }
7913
- const unifiedDiff = firstString2(
8279
+ const unifiedDiff = firstString3(
7914
8280
  stringValue6(change.unified_diff),
7915
8281
  stringValue6(change.unifiedDiff),
7916
8282
  stringValue6(change.diff),
@@ -7918,11 +8284,11 @@ function changeMapFiles(value) {
7918
8284
  );
7919
8285
  const explicitContent = stringValue6(change.content);
7920
8286
  const normalizedType = normalizeChangeType2(fileChangeTypeValue(change));
7921
- let oldString = firstString2(
8287
+ let oldString = firstString3(
7922
8288
  stringValue6(change.old_string),
7923
8289
  stringValue6(change.oldString)
7924
8290
  );
7925
- let newString = firstString2(
8291
+ let newString = firstString3(
7926
8292
  stringValue6(change.new_string),
7927
8293
  stringValue6(change.newString),
7928
8294
  explicitContent
@@ -7937,7 +8303,7 @@ function changeMapFiles(value) {
7937
8303
  if (normalizedType === "deleted" && newString === null && oldString !== null) {
7938
8304
  newString = "";
7939
8305
  }
7940
- const content = firstString2(
8306
+ const content = firstString3(
7941
8307
  normalizedType === "deleted" ? null : explicitContent,
7942
8308
  normalizedType === "created" ? newString : null
7943
8309
  );
@@ -7996,7 +8362,7 @@ function contentDiffFiles(value, changesValue, toolName) {
7996
8362
  return [];
7997
8363
  }
7998
8364
  const relatedChange = changesByPath.get(path) ?? null;
7999
- const unifiedDiff = firstString2(
8365
+ const unifiedDiff = firstString3(
8000
8366
  stringValue6(record.diff),
8001
8367
  stringValue6(record.patch),
8002
8368
  stringValue6(relatedChange?.unified_diff),
@@ -8005,13 +8371,13 @@ function contentDiffFiles(value, changesValue, toolName) {
8005
8371
  const normalizedType = normalizeChangeType2(
8006
8372
  relatedChange ? fileChangeTypeValue(relatedChange) : null
8007
8373
  );
8008
- let oldString = firstString2(
8374
+ let oldString = firstString3(
8009
8375
  stringValue6(record.oldText),
8010
8376
  stringValue6(record.oldString),
8011
8377
  stringValue6(relatedChange?.old_string),
8012
8378
  stringValue6(relatedChange?.oldString)
8013
8379
  );
8014
- let newString = firstString2(
8380
+ let newString = firstString3(
8015
8381
  stringValue6(record.newText),
8016
8382
  stringValue6(record.newString),
8017
8383
  stringValue6(relatedChange?.new_string),
@@ -8028,7 +8394,7 @@ function contentDiffFiles(value, changesValue, toolName) {
8028
8394
  if (normalizedType === "deleted" && newString === null && oldString !== null) {
8029
8395
  newString = "";
8030
8396
  }
8031
- const explicitContent = firstString2(
8397
+ const explicitContent = firstString3(
8032
8398
  stringValue6(record.content),
8033
8399
  stringValue6(relatedChange?.content)
8034
8400
  );
@@ -8045,7 +8411,7 @@ function contentDiffFiles(value, changesValue, toolName) {
8045
8411
  if (changeType === "created" && oldString === null && newString !== null) {
8046
8412
  oldString = "";
8047
8413
  }
8048
- const content = firstString2(
8414
+ const content = firstString3(
8049
8415
  changeType === "deleted" ? null : explicitContent,
8050
8416
  changeType === "created" ? newString : null
8051
8417
  );
@@ -8225,7 +8591,7 @@ function languageForPath(path) {
8225
8591
  function normalizeToolName6(value) {
8226
8592
  return (value ?? "").trim().replace(/[_\s-]+/g, "").toLowerCase();
8227
8593
  }
8228
- function firstString2(...values) {
8594
+ function firstString3(...values) {
8229
8595
  for (const value of values) {
8230
8596
  if (typeof value === "string" && value.trim()) {
8231
8597
  return value.trim();
@@ -8264,7 +8630,7 @@ function getCommandRenderData(call) {
8264
8630
  const outputRawOutput = recordValue4(call.output?.rawOutput);
8265
8631
  const errorRawOutput = recordValue4(call.error?.rawOutput);
8266
8632
  return {
8267
- command: firstString3(
8633
+ command: firstString4(
8268
8634
  stringValue7(call.input?.command),
8269
8635
  stringValue7(call.input?.cmd),
8270
8636
  commandArrayToString(call.input?.command),
@@ -8275,7 +8641,7 @@ function getCommandRenderData(call) {
8275
8641
  stringValue7(payloadInputRawInput?.command),
8276
8642
  stringValue7(payloadInputRawInput?.cmd)
8277
8643
  ),
8278
- cwd: firstString3(
8644
+ cwd: firstString4(
8279
8645
  stringValue7(call.input?.cwd),
8280
8646
  stringValue7(inputRawInput?.cwd),
8281
8647
  stringValue7(payloadInput?.cwd),
@@ -8314,7 +8680,7 @@ function getCommandRenderData(call) {
8314
8680
  function getSearchRenderData(call) {
8315
8681
  const canonicalContent = contentText(call.content);
8316
8682
  const canonicalFiles = locationPaths(call.locations);
8317
- const output = firstString3(
8683
+ const output = firstString4(
8318
8684
  canonicalContent,
8319
8685
  contentText(call.output?.content),
8320
8686
  stringValue7(call.output?.content),
@@ -8329,14 +8695,14 @@ function getSearchRenderData(call) {
8329
8695
  const mode = canonicalFiles.length > 0 && !output ? "list_files" : searchMode(call.output, output);
8330
8696
  const filenames = canonicalFiles.length > 0 ? canonicalFiles : stringArray(call.output?.filenames);
8331
8697
  return {
8332
- query: firstString3(
8698
+ query: firstString4(
8333
8699
  stringValue7(call.input?.pattern),
8334
8700
  stringValue7(call.input?.query),
8335
8701
  stringValue7(call.input?.search_query),
8336
8702
  stringValue7(call.input?.searchQuery),
8337
8703
  stringValue7(call.input?.glob)
8338
8704
  ),
8339
- scope: firstString3(
8705
+ scope: firstString4(
8340
8706
  stringValue7(call.input?.path),
8341
8707
  stringValue7(call.input?.file_path),
8342
8708
  stringValue7(call.input?.glob)
@@ -8345,7 +8711,7 @@ function getSearchRenderData(call) {
8345
8711
  files: filenames.length > 0 ? filenames : mode === "list_files" ? outputLines : [],
8346
8712
  lines: outputLines,
8347
8713
  output,
8348
- error: firstString3(
8714
+ error: firstString4(
8349
8715
  stringValue7(call.error?.aggregated_output),
8350
8716
  stringValue7(call.error?.stdout),
8351
8717
  stringValue7(call.error?.formatted_output),
@@ -8361,17 +8727,17 @@ function getWebSearchRenderData(call) {
8361
8727
  recordValue4(call.input?.action)?.searchQuery
8362
8728
  );
8363
8729
  return {
8364
- query: firstString3(
8730
+ query: firstString4(
8365
8731
  stringValue7(call.input?.query),
8366
8732
  stringValue7(recordValue4(call.input?.action)?.query),
8367
8733
  queries[0] ?? null
8368
8734
  ),
8369
8735
  queries,
8370
- url: firstString3(
8736
+ url: firstString4(
8371
8737
  stringValue7(call.input?.url),
8372
8738
  stringValue7(recordValue4(call.input?.action)?.url)
8373
8739
  ),
8374
- output: firstString3(
8740
+ output: firstString4(
8375
8741
  stringValue7(call.output?.text),
8376
8742
  contentText(call.content),
8377
8743
  contentText(call.output?.content),
@@ -8379,18 +8745,18 @@ function getWebSearchRenderData(call) {
8379
8745
  stringValue7(call.output?.output),
8380
8746
  stringValue7(call.output?.content)
8381
8747
  ) ?? "",
8382
- error: firstString3(
8748
+ error: firstString4(
8383
8749
  stringValue7(call.error?.message),
8384
8750
  stringValue7(call.error?.stdout)
8385
8751
  ) ?? ""
8386
8752
  };
8387
8753
  }
8388
8754
  function getWebFetchRenderData(call, maxContentLength = 3e3) {
8389
- const url = firstString3(
8755
+ const url = firstString4(
8390
8756
  stringValue7(call.input?.url),
8391
8757
  stringValue7(recordValue4(call.input?.action)?.url)
8392
8758
  );
8393
- const content = firstString3(
8759
+ const content = firstString4(
8394
8760
  contentText(call.content),
8395
8761
  contentText(call.output?.content),
8396
8762
  stringValue7(call.output?.output),
@@ -8412,7 +8778,7 @@ function getTodoRenderData(call) {
8412
8778
  }
8413
8779
  return todos.flatMap((todo) => {
8414
8780
  const record = recordValue4(todo);
8415
- const content = firstString3(
8781
+ const content = firstString4(
8416
8782
  stringValue7(record?.content),
8417
8783
  stringValue7(record?.text)
8418
8784
  );
@@ -8437,20 +8803,20 @@ function getToolSearchRenderData(call) {
8437
8803
  };
8438
8804
  }
8439
8805
  function getPlanModeRenderData(call) {
8440
- const enterText = call.rendererKind === "plan-enter" ? firstString3(
8806
+ const enterText = call.rendererKind === "plan-enter" ? firstString4(
8441
8807
  stringValue7(call.planMode?.plan),
8442
8808
  stringValue7(call.output?.text),
8443
8809
  stringValue7(call.input?.content),
8444
8810
  nonEmpty(call.summary),
8445
8811
  "Exploring codebase and designing implementation approach."
8446
8812
  ) : null;
8447
- const filePath = firstString3(
8813
+ const filePath = firstString4(
8448
8814
  stringValue7(call.input?.filePath),
8449
8815
  stringValue7(call.input?.file_path)
8450
8816
  );
8451
8817
  return {
8452
8818
  enterText,
8453
- plan: call.rendererKind === "plan-enter" ? null : firstString3(
8819
+ plan: call.rendererKind === "plan-enter" ? null : firstString4(
8454
8820
  stringValue7(call.input?.plan),
8455
8821
  stringValue7(call.payload?.plan),
8456
8822
  nonEmpty(call.summary)
@@ -8469,13 +8835,13 @@ function getTaskRenderData(call) {
8469
8835
  status: task?.status ?? stringValue7(call.metadata?.taskStatus) ?? stringValue7(call.metadata?.subagentStatus),
8470
8836
  durationText: typeof task?.durationMs === "number" && Number.isFinite(task.durationMs) ? formatDuration(task.durationMs) : null,
8471
8837
  latestStepSummary: task?.status === "running" ? steps.at(-1)?.summary ?? null : null,
8472
- prompt: firstString3(
8838
+ prompt: firstString4(
8473
8839
  stringValue7(task?.prompt),
8474
8840
  stringValue7(call.input?.prompt),
8475
8841
  stringValue7(call.input?.description),
8476
8842
  stringValue7(call.payload?.description)
8477
8843
  ),
8478
- childSessionId: firstString3(
8844
+ childSessionId: firstString4(
8479
8845
  stringValue7(task?.delegateSessionId),
8480
8846
  stringValue7(call.metadata?.childSessionID),
8481
8847
  stringValue7(call.metadata?.child_session_id),
@@ -8485,7 +8851,7 @@ function getTaskRenderData(call) {
8485
8851
  stringValue7(call.metadata?.agentId)
8486
8852
  ),
8487
8853
  steps,
8488
- resultMarkdown: firstString3(
8854
+ resultMarkdown: firstString4(
8489
8855
  stringValue7(task?.resultMarkdown),
8490
8856
  firstNonEmptyStructuredText(call.output, outputRawOutput)
8491
8857
  ),
@@ -8497,14 +8863,14 @@ function getSkillRenderData(call) {
8497
8863
  const outputRawOutput = call.output?.rawOutput;
8498
8864
  const success = booleanValue(call.output?.success) ?? legacySkillSuccess(outputRawOutput) ?? booleanValue(recordValue4(outputRawOutput)?.success);
8499
8865
  return {
8500
- skill: firstString3(
8866
+ skill: firstString4(
8501
8867
  stringValue7(call.input?.skill),
8502
8868
  stringValue7(inputRawInput?.skill),
8503
8869
  stringValue7(call.output?.commandName),
8504
8870
  stringValue7(recordValue4(outputRawOutput)?.commandName),
8505
8871
  nonEmpty(call.summary)
8506
8872
  ),
8507
- args: firstString3(
8873
+ args: firstString4(
8508
8874
  stringValue7(call.input?.args),
8509
8875
  stringValue7(inputRawInput?.args)
8510
8876
  ),
@@ -8685,7 +9051,7 @@ function contentText(value) {
8685
9051
  return [];
8686
9052
  }
8687
9053
  return [
8688
- firstString3(
9054
+ firstString4(
8689
9055
  stringValue7(record.text),
8690
9056
  stringValue7(record.content),
8691
9057
  stringValue7(recordValue4(record.content)?.text)
@@ -8705,7 +9071,7 @@ function structuredText(value) {
8705
9071
  if (!record) {
8706
9072
  return null;
8707
9073
  }
8708
- const preferred = firstString3(
9074
+ const preferred = firstString4(
8709
9075
  stringValue7(record.plan),
8710
9076
  stringValue7(record.text),
8711
9077
  stringValue7(record.output),
@@ -8732,7 +9098,7 @@ function structuredText(value) {
8732
9098
  }
8733
9099
  return null;
8734
9100
  }
8735
- function firstString3(...values) {
9101
+ function firstString4(...values) {
8736
9102
  for (const value of values) {
8737
9103
  if (typeof value === "string" && value.trim()) {
8738
9104
  return value.trim();
@@ -8802,7 +9168,7 @@ function locationPaths(value) {
8802
9168
  return [];
8803
9169
  }
8804
9170
  return [
8805
- firstString3(
9171
+ firstString4(
8806
9172
  stringValue7(record.path),
8807
9173
  stringValue7(record.filePath),
8808
9174
  stringValue7(record.file_path)
@@ -10724,7 +11090,7 @@ function normalizeMcpPayload(call) {
10724
11090
  return {
10725
11091
  server,
10726
11092
  tool,
10727
- inputSummary: firstString4(
11093
+ inputSummary: firstString5(
10728
11094
  stringValue8(call.input?.query),
10729
11095
  stringValue8(call.input?.url),
10730
11096
  stringValue8(call.input?.path),
@@ -10732,7 +11098,7 @@ function normalizeMcpPayload(call) {
10732
11098
  stringValue8(call.input?.command)
10733
11099
  ),
10734
11100
  structured,
10735
- text: firstString4(
11101
+ text: firstString5(
10736
11102
  contentArrayText(call.output?.content),
10737
11103
  stringValue8(call.output?.content),
10738
11104
  stringValue8(call.output?.output),
@@ -10771,7 +11137,7 @@ function parsedItems(value) {
10771
11137
  return [];
10772
11138
  }
10773
11139
  function itemPrimaryText(item) {
10774
- return firstString4(
11140
+ return firstString5(
10775
11141
  stringValue8(item.key),
10776
11142
  stringValue8(item.title),
10777
11143
  stringValue8(item.name),
@@ -10781,7 +11147,7 @@ function itemPrimaryText(item) {
10781
11147
  );
10782
11148
  }
10783
11149
  function itemSecondaryText(item) {
10784
- return firstString4(
11150
+ return firstString5(
10785
11151
  stringValue8(item.summary),
10786
11152
  stringValue8(item.description),
10787
11153
  stringValue8(item.status),
@@ -10820,7 +11186,7 @@ function contentArrayText(value) {
10820
11186
  return [];
10821
11187
  }
10822
11188
  return [
10823
- firstString4(
11189
+ firstString5(
10824
11190
  stringValue8(record.text),
10825
11191
  stringValue8(record.content),
10826
11192
  stringValue8(objectValue6(record.content)?.text)
@@ -10829,7 +11195,7 @@ function contentArrayText(value) {
10829
11195
  }).join("\n").trim();
10830
11196
  return text || null;
10831
11197
  }
10832
- function firstString4(...values) {
11198
+ function firstString5(...values) {
10833
11199
  for (const value of values) {
10834
11200
  if (value) {
10835
11201
  return value;
@@ -14496,9 +14862,11 @@ export {
14496
14862
  reconcileProjectedAgentConversationVM,
14497
14863
  getAppErrorCode,
14498
14864
  toLocalShortDateTime,
14865
+ loadCompleteAgentConversationMessages,
14866
+ serializeAgentConversationForClipboard,
14499
14867
  AgentTranscriptSkeleton,
14500
14868
  AgentTranscriptView,
14501
14869
  AgentConversationFlow,
14502
14870
  useProjectedAgentConversation
14503
14871
  };
14504
- //# sourceMappingURL=chunk-4V3QEPKX.js.map
14872
+ //# sourceMappingURL=chunk-3CZYC2YN.js.map