@tutti-os/agent-gui 0.0.139 → 0.0.140
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/README.md +5 -7
- package/dist/{AgentRichTextReadonly-E5SBW7KJ.js → AgentRichTextReadonly-ITYHQCN5.js} +5 -5
- package/dist/agent-conversation/index.d.ts +2 -2
- package/dist/agent-conversation/index.js +8 -8
- package/dist/agent-gui.d.ts +11 -2
- package/dist/agent-gui.js +17 -17
- package/dist/agent-message-center/index.js +6 -6
- package/dist/{agentGuiNodeTypes-DV7KvZRe.d.ts → agentGuiNodeTypes-D3f1yiEL.d.ts} +15 -1
- package/dist/agents.d.ts +1 -1
- package/dist/agents.js +1 -1
- package/dist/app/renderer/agentactivity.css +64 -83
- package/dist/{chunk-5H5LUEBG.js → chunk-AVXN6UMO.js} +2 -2
- package/dist/{chunk-5WOCGIXJ.js → chunk-C4ACYHOY.js} +1 -4
- package/dist/chunk-C4ACYHOY.js.map +1 -0
- package/dist/{chunk-EU7DCT4F.js → chunk-D3VWQTDH.js} +2 -2
- package/dist/{chunk-R7AXDQCA.js → chunk-JDVP33S5.js} +6 -1
- package/dist/chunk-JDVP33S5.js.map +1 -0
- package/dist/{chunk-7QKKMJZS.js → chunk-MMEHSIWJ.js} +162 -12
- package/dist/chunk-MMEHSIWJ.js.map +1 -0
- package/dist/{chunk-IYZ4GOSN.js → chunk-MX2NPLCN.js} +4 -3
- package/dist/{chunk-IYZ4GOSN.js.map → chunk-MX2NPLCN.js.map} +1 -1
- package/dist/{chunk-25VMCMAQ.js → chunk-OEC2IIWG.js} +4 -4
- package/dist/{chunk-NFY5SSBS.js → chunk-ORPU3AJK.js} +2556 -1417
- package/dist/chunk-ORPU3AJK.js.map +1 -0
- package/dist/{chunk-GIYGO2PB.js → chunk-OWJ7Q2DJ.js} +2 -2
- package/dist/{chunk-3MHXBAYC.js → chunk-OXCHXPBD.js} +5 -5
- package/dist/{chunk-VGS7S7YT.js → chunk-Q2WMHYIB.js} +2 -2
- package/dist/{chunk-OFJNIQWR.js → chunk-RXOGBOK6.js} +2 -2
- package/dist/{chunk-OFJNIQWR.js.map → chunk-RXOGBOK6.js.map} +1 -1
- package/dist/{chunk-VUNVGEQG.js → chunk-S2D4NNEB.js} +49 -5
- package/dist/chunk-S2D4NNEB.js.map +1 -0
- package/dist/{chunk-USIFGHT3.js → chunk-VMPA46ET.js} +2 -2
- package/dist/{chunk-O5CSF2RC.js → chunk-WM63XUAL.js} +4 -4
- package/dist/{chunk-DBFHUUZ5.js → chunk-WUMJJOK6.js} +2 -2
- package/dist/{chunk-UARGXEXF.js → chunk-XUFVBZUT.js} +8 -11
- package/dist/chunk-XUFVBZUT.js.map +1 -0
- package/dist/context-mention-palette/index.js +9 -9
- package/dist/{contribution-CDdwTppn.d.ts → contribution-CC2DVyUV.d.ts} +28 -2
- package/dist/i18n/index.d.ts +74 -40
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +97 -43
- package/dist/index.js +17 -17
- package/dist/mention-search.js +7 -7
- package/dist/{types-ee3zJ6Cc.d.ts → types-DVmB_kyD.d.ts} +0 -2
- package/dist/workbench/contribution.d.ts +1 -1
- package/dist/workbench/contribution.js +10 -4
- package/dist/workbench/index.d.ts +6 -3
- package/dist/workbench/index.js +10 -4
- package/dist/workbench/sessionTitle.js +2 -2
- package/dist/workspace-agent-generated-files.js +2 -2
- package/package.json +13 -13
- package/dist/chunk-5WOCGIXJ.js.map +0 -1
- package/dist/chunk-7QKKMJZS.js.map +0 -1
- package/dist/chunk-NFY5SSBS.js.map +0 -1
- package/dist/chunk-R7AXDQCA.js.map +0 -1
- package/dist/chunk-UARGXEXF.js.map +0 -1
- package/dist/chunk-VUNVGEQG.js.map +0 -1
- /package/dist/{AgentRichTextReadonly-E5SBW7KJ.js.map → AgentRichTextReadonly-ITYHQCN5.js.map} +0 -0
- /package/dist/{chunk-5H5LUEBG.js.map → chunk-AVXN6UMO.js.map} +0 -0
- /package/dist/{chunk-EU7DCT4F.js.map → chunk-D3VWQTDH.js.map} +0 -0
- /package/dist/{chunk-25VMCMAQ.js.map → chunk-OEC2IIWG.js.map} +0 -0
- /package/dist/{chunk-GIYGO2PB.js.map → chunk-OWJ7Q2DJ.js.map} +0 -0
- /package/dist/{chunk-3MHXBAYC.js.map → chunk-OXCHXPBD.js.map} +0 -0
- /package/dist/{chunk-VGS7S7YT.js.map → chunk-Q2WMHYIB.js.map} +0 -0
- /package/dist/{chunk-USIFGHT3.js.map → chunk-VMPA46ET.js.map} +0 -0
- /package/dist/{chunk-O5CSF2RC.js.map → chunk-WM63XUAL.js.map} +0 -0
- /package/dist/{chunk-DBFHUUZ5.js.map → chunk-WUMJJOK6.js.map} +0 -0
|
@@ -60,6 +60,10 @@ function stripImagePayloadData(value) {
|
|
|
60
60
|
}
|
|
61
61
|
return sanitized;
|
|
62
62
|
}
|
|
63
|
+
function isLocalImagePath(path) {
|
|
64
|
+
const candidate = path.trim();
|
|
65
|
+
return candidate.length > 1 && candidate.startsWith("/") && !candidate.startsWith("//") && !candidate.includes("://") && !/\s/.test(candidate) || /^[a-zA-Z]:[\\/]/.test(candidate);
|
|
66
|
+
}
|
|
63
67
|
function resolveImageGenerationPreviewSrc(uri) {
|
|
64
68
|
const trimmed = uri?.trim();
|
|
65
69
|
if (!trimmed) {
|
|
@@ -141,6 +145,7 @@ export {
|
|
|
141
145
|
isImageGenerationToolCall,
|
|
142
146
|
extractImageGenerationPreview,
|
|
143
147
|
stripImagePayloadData,
|
|
148
|
+
isLocalImagePath,
|
|
144
149
|
resolveImageGenerationPreviewSrc
|
|
145
150
|
};
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
151
|
+
//# sourceMappingURL=chunk-JDVP33S5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/imageGenerationTool.ts"],"sourcesContent":["interface ImageGenerationProbe {\n toolName?: string | null;\n displayName?: string | null;\n content?: unknown;\n outputContent?: unknown;\n outputSavedPath?: unknown;\n inputPrompt?: unknown;\n payloadInputPrompt?: unknown;\n}\n\ninterface ImageGenerationContentEntry {\n type: string | null;\n text: string | null;\n uri: string | null;\n mimeType: string | null;\n}\n\nexport interface ImageGenerationPreview {\n prompt: string | null;\n imageUri: string | null;\n mimeType: string | null;\n}\n\nconst KNOWN_IMAGE_GENERATION_TOOL_NAMES = new Set([\n \"imagegeneration\",\n \"imagegen\",\n \"generateimage\",\n \"generatingimage\",\n \"imagegenerate\",\n \"imagegenerator\"\n]);\n\nexport function resolveImageGenerationCanonicalToolName(\n probe: ImageGenerationProbe\n): \"ImageGeneration\" | null {\n return isImageGenerationToolCall(probe) ? \"ImageGeneration\" : null;\n}\n\nexport function isImageGenerationToolCall(\n probe: ImageGenerationProbe\n): boolean {\n const normalizedToolName = normalizeToolNameToken(probe.toolName);\n const normalizedDisplayName = normalizeToolNameToken(probe.displayName);\n const preview = extractImageGenerationPreview(probe);\n const hasKnownName =\n KNOWN_IMAGE_GENERATION_TOOL_NAMES.has(normalizedToolName) ||\n KNOWN_IMAGE_GENERATION_TOOL_NAMES.has(normalizedDisplayName);\n const hasOpaqueAlias =\n looksLikeOpaqueImageGenerationAlias(probe.toolName) ||\n looksLikeOpaqueImageGenerationAlias(probe.displayName);\n const hasPromptSignal = Boolean(\n preview.prompt &&\n (preview.prompt.toLowerCase().startsWith(\"revised prompt:\") ||\n stringValue(probe.inputPrompt) ||\n stringValue(probe.payloadInputPrompt))\n );\n\n return (\n hasKnownName ||\n (hasOpaqueAlias && preview.imageUri !== null) ||\n (hasPromptSignal && preview.imageUri !== null)\n );\n}\n\nexport function extractImageGenerationPreview(\n probe: ImageGenerationProbe\n): ImageGenerationPreview {\n const entries = [\n ...contentEntries(probe.content),\n ...contentEntries(probe.outputContent)\n ];\n const prompt =\n firstString(\n stringValue(probe.inputPrompt),\n stringValue(probe.payloadInputPrompt),\n promptFromEntries(entries)\n ) ?? null;\n const imageEntry = entries.find((entry) => isImageEntry(entry));\n\n return {\n prompt,\n imageUri:\n firstString(imageEntry?.uri, stringValue(probe.outputSavedPath)) ?? null,\n mimeType: imageEntry?.mimeType ?? null\n };\n}\n\nexport function stripImagePayloadData(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => stripImagePayloadData(item));\n }\n const record = recordValue(value);\n if (!record) {\n return value;\n }\n const imageLike = looksLikeImageRecord(record);\n const sanitized: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n const normalizedKey = key.trim().toLowerCase();\n if (imageLike && normalizedKey === \"data\") {\n continue;\n }\n if (\n imageLike &&\n (normalizedKey === \"uri\" || normalizedKey === \"path\") &&\n typeof entry === \"string\" &&\n entry.trim().toLowerCase().startsWith(\"data:image/\")\n ) {\n continue;\n }\n sanitized[key] = stripImagePayloadData(entry);\n }\n return sanitized;\n}\n\n// A bare local filesystem path (posix absolute or Windows drive letter), as\n// opposed to a scheme-qualified URL. Shared by the generated-image preview and\n// the conversation copy serializer so both hydrate the same source taxonomy\n// through the host workspace reader.\nexport function isLocalImagePath(path: string): boolean {\n const candidate = path.trim();\n return (\n (candidate.length > 1 &&\n candidate.startsWith(\"/\") &&\n !candidate.startsWith(\"//\") &&\n !candidate.includes(\"://\") &&\n !/\\s/.test(candidate)) ||\n /^[a-zA-Z]:[\\\\/]/.test(candidate)\n );\n}\n\nexport function resolveImageGenerationPreviewSrc(\n uri: string | null\n): string | null {\n const trimmed = uri?.trim();\n if (!trimmed) {\n return null;\n }\n if (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.test(trimmed)) {\n return trimmed;\n }\n if (trimmed.startsWith(\"/\")) {\n return new URL(trimmed, \"file://\").toString();\n }\n if (/^[a-zA-Z]:[\\\\/]/.test(trimmed)) {\n return `file:///${trimmed.replace(/\\\\/g, \"/\")}`;\n }\n return trimmed;\n}\n\nfunction contentEntries(value: unknown): ImageGenerationContentEntry[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((item) => {\n const record = recordValue(item);\n if (!record) {\n return [];\n }\n const nestedContent = recordValue(record.content);\n return [toContentEntry(nestedContent ?? record)];\n });\n}\n\nfunction promptFromEntries(\n entries: ImageGenerationContentEntry[]\n): string | null {\n const revisedPrompt = entries.find(\n (entry) =>\n entry.text && entry.text.toLowerCase().startsWith(\"revised prompt:\")\n );\n return (\n firstString(\n revisedPrompt?.text,\n entries.find((entry) => entry.text)?.text\n ) ?? null\n );\n}\n\nfunction toContentEntry(\n value: Record<string, unknown>\n): ImageGenerationContentEntry {\n return {\n type: stringValue(value.type),\n text:\n firstString(stringValue(value.text), stringValue(value.content)) ?? null,\n uri: firstString(stringValue(value.uri), stringValue(value.path)) ?? null,\n mimeType: stringValue(value.mimeType)\n };\n}\n\nfunction isImageEntry(entry: ImageGenerationContentEntry): boolean {\n return (\n entry.type?.toLowerCase() === \"image\" ||\n (entry.mimeType?.toLowerCase().startsWith(\"image/\") ?? false) ||\n entry.uri !== null\n );\n}\n\nfunction looksLikeImageRecord(value: Record<string, unknown>): boolean {\n const type = stringValue(value.type)?.toLowerCase();\n const mimeType = stringValue(value.mimeType)?.toLowerCase();\n const uri = firstString(stringValue(value.uri), stringValue(value.path));\n return (\n type === \"image\" ||\n Boolean(mimeType?.startsWith(\"image/\")) ||\n Boolean(uri && value.data)\n );\n}\n\nfunction looksLikeOpaqueImageGenerationAlias(\n value: string | null | undefined\n): boolean {\n return /^ig_[a-z0-9]+$/i.test((value ?? \"\").trim());\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction firstString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (value?.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction normalizeToolNameToken(value: string | null | undefined): string {\n return (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[_\\s-]+/gu, \"\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
resolveAgentGUIConversationTitleDisplayPrompt,
|
|
10
10
|
resolveAgentGuiWorkbenchHeaderTitle,
|
|
11
11
|
resolveAgentGuiWorkbenchSessionTitle
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-Q2WMHYIB.js";
|
|
13
13
|
import {
|
|
14
14
|
createAgentGuiWorkbenchNodeStateSource,
|
|
15
15
|
migrateLegacyAgentGuiWorkbenchState,
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
import {
|
|
25
25
|
normalizeAgentGUIAgents,
|
|
26
26
|
projectAgentGUIAgentsToInternalTargets
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-C4ACYHOY.js";
|
|
28
28
|
import {
|
|
29
29
|
agentGuiDockIconUrls
|
|
30
30
|
} from "./chunk-DXT4W2SU.js";
|
|
@@ -219,7 +219,7 @@ import {
|
|
|
219
219
|
useState
|
|
220
220
|
} from "react";
|
|
221
221
|
import {
|
|
222
|
-
Button,
|
|
222
|
+
Button as Button2,
|
|
223
223
|
PanelIcon,
|
|
224
224
|
Tooltip,
|
|
225
225
|
TooltipContent,
|
|
@@ -274,9 +274,124 @@ function useAgentGuiWorkbenchBodyRenderError(nodeId) {
|
|
|
274
274
|
);
|
|
275
275
|
}
|
|
276
276
|
|
|
277
|
+
// workbench/AgentGuiWorkbenchSessionMenu.tsx
|
|
278
|
+
import {
|
|
279
|
+
useCallback,
|
|
280
|
+
useRef
|
|
281
|
+
} from "react";
|
|
282
|
+
import { FileText, MoreHorizontal, Pencil, AtSign } from "lucide-react";
|
|
283
|
+
import {
|
|
284
|
+
Button,
|
|
285
|
+
DropdownMenu,
|
|
286
|
+
DropdownMenuContent,
|
|
287
|
+
DropdownMenuItem,
|
|
288
|
+
DropdownMenuSeparator,
|
|
289
|
+
DropdownMenuTrigger
|
|
290
|
+
} from "@tutti-os/ui-system";
|
|
291
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
292
|
+
var menuContentClassName = "w-max min-w-44 nodrag [-webkit-app-region:no-drag]";
|
|
293
|
+
function AgentGuiWorkbenchSessionMenu({
|
|
294
|
+
copy,
|
|
295
|
+
onAction
|
|
296
|
+
}) {
|
|
297
|
+
const pendingActionRef = useRef(false);
|
|
298
|
+
const select = useCallback(
|
|
299
|
+
(action) => {
|
|
300
|
+
if (pendingActionRef.current) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
pendingActionRef.current = true;
|
|
304
|
+
window.requestAnimationFrame(() => {
|
|
305
|
+
pendingActionRef.current = false;
|
|
306
|
+
onAction(action);
|
|
307
|
+
});
|
|
308
|
+
},
|
|
309
|
+
[onAction]
|
|
310
|
+
);
|
|
311
|
+
const actionProps = useCallback(
|
|
312
|
+
(action) => ({
|
|
313
|
+
onClick: () => select(action),
|
|
314
|
+
onPointerUp: (event) => {
|
|
315
|
+
if (event.button === 0) {
|
|
316
|
+
select(action);
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
onSelect: () => select(action)
|
|
320
|
+
}),
|
|
321
|
+
[select]
|
|
322
|
+
);
|
|
323
|
+
return /* @__PURE__ */ jsxs(
|
|
324
|
+
DropdownMenu,
|
|
325
|
+
{
|
|
326
|
+
onOpenChange: (open) => {
|
|
327
|
+
if (open) {
|
|
328
|
+
pendingActionRef.current = false;
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
children: [
|
|
332
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
333
|
+
Button,
|
|
334
|
+
{
|
|
335
|
+
"aria-label": copy.moreSessionActions,
|
|
336
|
+
title: copy.moreSessionActions,
|
|
337
|
+
className: "agent-gui-workbench-header__icon-button agent-gui-workbench-header__session-menu-trigger",
|
|
338
|
+
"data-testid": "agent-gui-session-menu-trigger",
|
|
339
|
+
size: "icon-sm",
|
|
340
|
+
type: "button",
|
|
341
|
+
variant: "ghost",
|
|
342
|
+
onClick: (event) => event.stopPropagation(),
|
|
343
|
+
onDoubleClick: (event) => event.stopPropagation(),
|
|
344
|
+
onPointerDown: (event) => event.stopPropagation(),
|
|
345
|
+
children: /* @__PURE__ */ jsx(
|
|
346
|
+
MoreHorizontal,
|
|
347
|
+
{
|
|
348
|
+
"aria-hidden": "true",
|
|
349
|
+
className: "agent-gui-workbench-header__icon"
|
|
350
|
+
}
|
|
351
|
+
)
|
|
352
|
+
}
|
|
353
|
+
) }),
|
|
354
|
+
/* @__PURE__ */ jsxs(
|
|
355
|
+
DropdownMenuContent,
|
|
356
|
+
{
|
|
357
|
+
align: "start",
|
|
358
|
+
className: menuContentClassName,
|
|
359
|
+
onClick: stopMousePropagation,
|
|
360
|
+
onDoubleClick: stopMousePropagation,
|
|
361
|
+
onPointerDown: stopPointerPropagation,
|
|
362
|
+
onPointerUp: stopPointerPropagation,
|
|
363
|
+
sideOffset: 6,
|
|
364
|
+
children: [
|
|
365
|
+
/* @__PURE__ */ jsxs(DropdownMenuItem, { ...actionProps("rename"), children: [
|
|
366
|
+
/* @__PURE__ */ jsx(Pencil, { "aria-hidden": "true" }),
|
|
367
|
+
/* @__PURE__ */ jsx("span", { children: copy.renameSession })
|
|
368
|
+
] }),
|
|
369
|
+
/* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
|
|
370
|
+
/* @__PURE__ */ jsxs(DropdownMenuItem, { ...actionProps("copy-markdown"), children: [
|
|
371
|
+
/* @__PURE__ */ jsx(FileText, { "aria-hidden": "true" }),
|
|
372
|
+
/* @__PURE__ */ jsx("span", { children: copy.copyAsMarkdown })
|
|
373
|
+
] }),
|
|
374
|
+
/* @__PURE__ */ jsxs(DropdownMenuItem, { ...actionProps("copy-reference"), children: [
|
|
375
|
+
/* @__PURE__ */ jsx(AtSign, { "aria-hidden": "true" }),
|
|
376
|
+
/* @__PURE__ */ jsx("span", { children: copy.copyAsReference })
|
|
377
|
+
] })
|
|
378
|
+
]
|
|
379
|
+
}
|
|
380
|
+
)
|
|
381
|
+
]
|
|
382
|
+
}
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
function stopMousePropagation(event) {
|
|
386
|
+
event.stopPropagation();
|
|
387
|
+
}
|
|
388
|
+
function stopPointerPropagation(event) {
|
|
389
|
+
event.stopPropagation();
|
|
390
|
+
}
|
|
391
|
+
|
|
277
392
|
// workbench/header.ts
|
|
278
393
|
var LazyAgentRichTextReadonly = lazy(
|
|
279
|
-
() => import("./AgentRichTextReadonly-
|
|
394
|
+
() => import("./AgentRichTextReadonly-ITYHQCN5.js").then((module) => ({
|
|
280
395
|
default: module.AgentRichTextReadonly
|
|
281
396
|
}))
|
|
282
397
|
);
|
|
@@ -304,6 +419,7 @@ function AgentGuiWorkbenchHeader({
|
|
|
304
419
|
nodeId,
|
|
305
420
|
onCreateConversation,
|
|
306
421
|
onOpenDetachedWindow,
|
|
422
|
+
onSessionAction,
|
|
307
423
|
onToggleConversationRail,
|
|
308
424
|
showAppTitle = true,
|
|
309
425
|
showConversationRailToggle = true,
|
|
@@ -323,6 +439,10 @@ function AgentGuiWorkbenchHeader({
|
|
|
323
439
|
const hasExpandedIdentity = Boolean(
|
|
324
440
|
collapsedTitle || sessionIconUrl || sessionIconFallbackUrl
|
|
325
441
|
);
|
|
442
|
+
const sessionMenu = onSessionAction && copy.sessionMenu && sessionTitle && !hasBodyRenderError ? createElement(AgentGuiWorkbenchSessionMenu, {
|
|
443
|
+
copy: copy.sessionMenu,
|
|
444
|
+
onAction: onSessionAction
|
|
445
|
+
}) : null;
|
|
326
446
|
const safeDisplayMode = displayMode ?? "floating";
|
|
327
447
|
const safeWindowActions = windowActions ?? {
|
|
328
448
|
close: () => void 0,
|
|
@@ -431,7 +551,8 @@ function AgentGuiWorkbenchHeader({
|
|
|
431
551
|
className: "agent-gui-workbench-header__title-text"
|
|
432
552
|
},
|
|
433
553
|
collapsedTitle
|
|
434
|
-
)
|
|
554
|
+
),
|
|
555
|
+
sessionMenu
|
|
435
556
|
) : null,
|
|
436
557
|
isConversationRailCollapsed && secondaryAccessory ? createElement(
|
|
437
558
|
"div",
|
|
@@ -479,7 +600,8 @@ function AgentGuiWorkbenchHeader({
|
|
|
479
600
|
className: "agent-gui-workbench-header__title-text"
|
|
480
601
|
},
|
|
481
602
|
sessionTitle
|
|
482
|
-
) : null
|
|
603
|
+
) : null,
|
|
604
|
+
sessionMenu
|
|
483
605
|
) : null,
|
|
484
606
|
secondaryAccessory ? createElement(
|
|
485
607
|
"div",
|
|
@@ -498,7 +620,7 @@ function createConversationRailToggleButton({
|
|
|
498
620
|
onToggleConversationRail
|
|
499
621
|
}) {
|
|
500
622
|
const button = createElement(
|
|
501
|
-
|
|
623
|
+
Button2,
|
|
502
624
|
{
|
|
503
625
|
"aria-label": label,
|
|
504
626
|
className: conversationRailToggleButtonClassName,
|
|
@@ -533,7 +655,7 @@ function createDetachedWindowButton({
|
|
|
533
655
|
onOpenDetachedWindow
|
|
534
656
|
}) {
|
|
535
657
|
const button = createElement(
|
|
536
|
-
|
|
658
|
+
Button2,
|
|
537
659
|
{
|
|
538
660
|
"aria-label": label,
|
|
539
661
|
className: detachedWindowButtonClassName,
|
|
@@ -582,7 +704,7 @@ function createNewConversationButton({
|
|
|
582
704
|
onCreateConversation
|
|
583
705
|
}) {
|
|
584
706
|
const button = createElement(
|
|
585
|
-
|
|
707
|
+
Button2,
|
|
586
708
|
{
|
|
587
709
|
"aria-label": label,
|
|
588
710
|
className: headerChromeIconButtonClassName,
|
|
@@ -709,7 +831,7 @@ var trafficLightIconPathByName = {
|
|
|
709
831
|
};
|
|
710
832
|
|
|
711
833
|
// workbench/AgentGuiWorkbenchReactiveHeader.tsx
|
|
712
|
-
import { jsx } from "react/jsx-runtime";
|
|
834
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
713
835
|
function AgentGuiWorkbenchReactiveHeader({
|
|
714
836
|
agentDirectory,
|
|
715
837
|
dockIconUrls,
|
|
@@ -741,7 +863,7 @@ function AgentGuiWorkbenchReactiveHeader({
|
|
|
741
863
|
}),
|
|
742
864
|
agentGuiWorkbenchConversationIdentitiesEqual
|
|
743
865
|
);
|
|
744
|
-
return /* @__PURE__ */
|
|
866
|
+
return /* @__PURE__ */ jsx2(
|
|
745
867
|
AgentGuiWorkbenchHeader,
|
|
746
868
|
{
|
|
747
869
|
...headerProps,
|
|
@@ -756,6 +878,23 @@ function AgentGuiWorkbenchReactiveHeader({
|
|
|
756
878
|
);
|
|
757
879
|
}
|
|
758
880
|
|
|
881
|
+
// workbench/sessionActions.ts
|
|
882
|
+
var AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT = "tutti:agent-gui-workbench-session-action";
|
|
883
|
+
var agentGuiWorkbenchSessionActions = ["rename", "copy-markdown", "copy-reference"];
|
|
884
|
+
function isAgentGuiWorkbenchSessionAction(value) {
|
|
885
|
+
return agentGuiWorkbenchSessionActions.includes(
|
|
886
|
+
value
|
|
887
|
+
);
|
|
888
|
+
}
|
|
889
|
+
function dispatchAgentGuiWorkbenchSessionAction(detail) {
|
|
890
|
+
window.dispatchEvent(
|
|
891
|
+
new CustomEvent(
|
|
892
|
+
AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,
|
|
893
|
+
{ detail }
|
|
894
|
+
)
|
|
895
|
+
);
|
|
896
|
+
}
|
|
897
|
+
|
|
759
898
|
// workbench/contributionDock.tsx
|
|
760
899
|
import { createElement as createElement2 } from "react";
|
|
761
900
|
import {
|
|
@@ -1248,6 +1387,13 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
1248
1387
|
)
|
|
1249
1388
|
);
|
|
1250
1389
|
};
|
|
1390
|
+
const announceSessionAction = (action) => {
|
|
1391
|
+
dispatchAgentGuiWorkbenchSessionAction({
|
|
1392
|
+
action,
|
|
1393
|
+
agentSessionId: workbenchState.lastActiveAgentSessionId,
|
|
1394
|
+
instanceId
|
|
1395
|
+
});
|
|
1396
|
+
};
|
|
1251
1397
|
const headerProps = {
|
|
1252
1398
|
copy,
|
|
1253
1399
|
conversationIconFallbackUrl,
|
|
@@ -1265,6 +1411,7 @@ function createAgentGuiWorkbenchContribution(input) {
|
|
|
1265
1411
|
},
|
|
1266
1412
|
...dragHandleProps,
|
|
1267
1413
|
onCreateConversation: announceNewConversation,
|
|
1414
|
+
onSessionAction: announceSessionAction,
|
|
1268
1415
|
onOpenDetachedWindow: input.onOpenDetachedWindow ? selectedAgent ? () => {
|
|
1269
1416
|
void input.onOpenDetachedWindow?.({
|
|
1270
1417
|
agentSessionId: workbenchState.lastActiveAgentSessionId,
|
|
@@ -1466,6 +1613,9 @@ export {
|
|
|
1466
1613
|
resolveAgentGuiWorkbenchConversationIdentity,
|
|
1467
1614
|
agentGuiWorkbenchConversationIdentitiesEqual,
|
|
1468
1615
|
AgentGuiWorkbenchHeader,
|
|
1616
|
+
AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,
|
|
1617
|
+
isAgentGuiWorkbenchSessionAction,
|
|
1618
|
+
dispatchAgentGuiWorkbenchSessionAction,
|
|
1469
1619
|
agentGuiWorkbenchDefaultNodeFrame,
|
|
1470
1620
|
agentGuiWorkbenchDefaultUsableWidthRatio,
|
|
1471
1621
|
agentGuiWorkbenchDefaultUsableHeightRatio,
|
|
@@ -1482,4 +1632,4 @@ export {
|
|
|
1482
1632
|
AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT,
|
|
1483
1633
|
createAgentGuiWorkbenchContribution
|
|
1484
1634
|
};
|
|
1485
|
-
//# sourceMappingURL=chunk-
|
|
1635
|
+
//# sourceMappingURL=chunk-MMEHSIWJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../workbench/contribution.ts","../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts","../workbench/AgentGuiWorkbenchReactiveHeader.tsx","../workbench/conversationIdentity.ts","../agentGuiSessionProviderIconUrls.ts","../workbench/header.ts","../app/renderer/assets/icons/open-link-lined.svg","../workbench/bodyRenderErrorRegistry.ts","../workbench/AgentGuiWorkbenchSessionMenu.tsx","../workbench/sessionActions.ts","../workbench/contributionDock.tsx"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type { AgentSessionEngine } from \"@tutti-os/agent-activity-core\";\nimport {\n type WorkbenchContribution,\n type WorkbenchFrame,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport {\n clampAgentGUIConversationRailWidthPx,\n resolveAgentGUIExpandedWindowFrame,\n shouldAutoCollapseAgentGUIConversationRail\n} from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport { AgentGuiWorkbenchReactiveHeader } from \"./AgentGuiWorkbenchReactiveHeader.tsx\";\nimport { setAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\nimport {\n AgentGuiWorkbenchHeader,\n type AgentGuiWorkbenchHeaderProps\n} from \"./header.ts\";\nimport type { AgentGuiWorkbenchConversationIdentity } from \"./conversationIdentity.ts\";\nimport {\n agentGuiWorkbenchTypeId,\n createAgentGuiWorkbenchLaunchDescriptor\n} from \"./launch.ts\";\nimport {\n createAgentGuiWorkbenchNodeStateSource,\n migrateLegacyAgentGuiWorkbenchState,\n normalizeAgentGuiWorkbenchNodeState,\n normalizeAgentGuiWorkbenchState\n} from \"./state.ts\";\nimport type {\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\nimport type { AgentGUIAgentDirectoryPort } from \"../types.ts\";\nimport {\n AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,\n dispatchAgentGuiWorkbenchSessionAction,\n isAgentGuiWorkbenchSessionAction\n} from \"./sessionActions.ts\";\nimport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionActionDetail,\n AgentGuiWorkbenchSessionActionRequest,\n AgentGuiWorkbenchSessionMenuCopy\n} from \"./sessionActions.ts\";\n\nexport const AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT =\n \"tutti:agent-gui-workbench-conversation-rail-toggle\";\n\nexport const AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT =\n \"tutti:agent-gui-workbench-new-conversation\";\n\n/**\n * Fired when the empty-hero \"Import session\" suggestion is chosen. The host\n * chrome (which owns the external-agent import wizard state) listens for this\n * and opens the wizard.\n */\nexport const AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT =\n \"tutti:agent-gui-workbench-open-external-import\";\n\nexport interface AgentGuiWorkbenchConversationRailToggleDetail {\n conversationRailCollapsed: boolean;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchNewConversationDetail {\n instanceId: string;\n}\n\nexport {\n AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,\n dispatchAgentGuiWorkbenchSessionAction,\n isAgentGuiWorkbenchSessionAction\n};\nexport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionActionDetail,\n AgentGuiWorkbenchSessionActionRequest,\n AgentGuiWorkbenchSessionMenuCopy\n};\n\nexport type { AgentGuiWorkbenchConversationIdentity } from \"./conversationIdentity.ts\";\n\nexport interface AgentGuiWorkbenchContributionCopy {\n collapseConversationRail: string;\n close: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n maximize: string;\n minimize: string;\n newConversation: string;\n nodeTitle: string;\n openDetachedWindow: string;\n restore: string;\n untitledConversation: string;\n sessionMenu?: AgentGuiWorkbenchSessionMenuCopy | null;\n}\n\nexport type AgentGuiWorkbenchContributionCopyOverrides =\n Partial<AgentGuiWorkbenchContributionCopy>;\n\nexport interface AgentGuiWorkbenchRenderBodyHelpers {\n agentDirectory: AgentGUIAgentDirectoryPort;\n agentTargetId: string | null;\n nodeTypeId: string;\n onStateChange(state: AgentGuiWorkbenchState): void;\n provider: AgentGuiWorkbenchProvider | null;\n}\n\nexport interface CreateAgentGuiWorkbenchContributionInput {\n agentDirectory: AgentGUIAgentDirectoryPort;\n copy?: AgentGuiWorkbenchContributionCopyOverrides;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n dockSectionId?: string;\n frame?: WorkbenchFrame;\n id?: string;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n renderBody(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n renderPreview?(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n renderMinimizedPreview(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n resolveDockPopupTitle?: (\n state: AgentGuiWorkbenchState | null\n ) => string | null;\n resolveDockPopupIdentity?: (\n state: AgentGuiWorkbenchState | null\n ) => AgentGuiWorkbenchConversationIdentity | null;\n sessionEngine?: AgentSessionEngine;\n onOpenDetachedWindow?: (input: {\n agentSessionId?: string | null;\n agentTargetId?: string | null;\n provider: AgentGuiWorkbenchProvider;\n workspaceId: string;\n }) => void | Promise<void>;\n unifiedDockIconUrl?: string;\n workspaceId: string;\n}\n\nexport function createAgentGuiWorkbenchContribution(\n input: CreateAgentGuiWorkbenchContributionInput\n): WorkbenchContribution {\n const nodeStateSource = createAgentGuiWorkbenchNodeStateSource({\n workspaceId: input.workspaceId\n });\n const frame = input.frame ?? agentGuiWorkbenchDefaultNodeFrame;\n const copy = resolveAgentGuiWorkbenchContributionCopy(input.copy);\n return {\n dockEntries: buildAgentGuiDockEntries({\n agentDirectory: input.agentDirectory,\n defaultProvider: input.defaultProvider,\n dockIconUrls: input.dockIconUrls,\n label: copy.nodeTitle,\n providerAvailability: input.providerAvailability,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId: input.dockSectionId ?? \"agents\",\n unifiedDockIconUrl: input.unifiedDockIconUrl\n }),\n externalStateSource: nodeStateSource.externalStateSource,\n id: input.id ?? \"workspace-agent-gui\",\n nodes: [\n {\n frame,\n instance: { mode: \"multi\" },\n onBodyRenderErrorChange: ({ hasError, node }) => {\n setAgentGuiWorkbenchBodyRenderError(node.id, hasError);\n },\n renderBody: (context) => {\n const persistedState = normalizeAgentGuiWorkbenchState(\n context.externalNodeState ?? context.node?.data.snapshotNodeState\n );\n const activationAgentTargetId = agentTargetIdFromActivation(\n context.activation\n );\n const state =\n activationAgentTargetId && !persistedState.agentTargetId\n ? { ...persistedState, agentTargetId: activationAgentTargetId }\n : persistedState;\n const agent = resolveAgentGuiWorkbenchStateAgent(\n state,\n input.agentDirectory\n );\n return input.renderBody(\n context as WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n {\n agentDirectory: input.agentDirectory,\n agentTargetId: state.agentTargetId ?? null,\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: (nextState) => {\n nodeStateSource.writeNodeState({\n instanceId: context.instanceId,\n nodeId: context.node.id,\n state: nextState,\n typeId: agentGuiWorkbenchTypeId\n });\n },\n provider: agent?.provider ?? null\n }\n );\n },\n renderHeader: ({\n dragHandleProps,\n displayMode,\n externalNodeState,\n instanceId,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const headerTitle = copy.nodeTitle;\n const rawWorkbenchState = (externalNodeState ??\n node.data.runtimeNodeState) as\n | Partial<AgentGuiWorkbenchNodeState>\n | null\n | undefined;\n const migratedWorkbenchState =\n migrateLegacyAgentGuiWorkbenchState(rawWorkbenchState);\n const workbenchState = normalizeAgentGuiWorkbenchState(\n migratedWorkbenchState\n );\n const selectedAgent = resolveAgentGuiWorkbenchStateAgent(\n workbenchState,\n input.agentDirectory\n );\n const provider = selectedAgent?.provider ?? \"unknown\";\n const nodeState = normalizeAgentGuiWorkbenchNodeState(\n migratedWorkbenchState,\n provider\n );\n const isConversationRailAutoCollapsed =\n shouldAutoCollapseAgentGUIConversationRail(node.frame.width);\n const isConversationRailCollapsed =\n nodeState.conversationRailCollapsed === true ||\n isConversationRailAutoCollapsed;\n const conversationRailWidthPx = clampAgentGUIConversationRailWidthPx(\n nodeState.conversationRailWidthPx,\n node.frame.width\n );\n const conversationIdentity = input.sessionEngine\n ? null\n : (input.resolveDockPopupIdentity?.(workbenchState) ?? null);\n const conversationTitle = input.sessionEngine\n ? null\n : (conversationIdentity?.title ??\n input.resolveDockPopupTitle?.(workbenchState) ??\n null);\n // The empty new-conversation home has no session identity, so it\n // must not inherit the provider icon from the workbench instance.\n // Once a local session id exists, keep the provider icon available\n // while the canonical conversation title is still being persisted.\n const hasConversation = Boolean(\n workbenchState.lastActiveAgentSessionId?.trim()\n );\n const conversationIconFallbackUrl =\n hasConversation && selectedAgent ? selectedAgent.iconUrl : null;\n const conversationIconUrl =\n conversationIdentity?.iconUrl ?? conversationIconFallbackUrl;\n const persistConversationRailCollapsed = (collapsed: boolean) => {\n nodeStateSource.writeNodeState({\n instanceId,\n nodeId: node.id,\n state: {\n ...workbenchState,\n conversationRailCollapsed: collapsed\n },\n typeId: agentGuiWorkbenchTypeId\n });\n };\n const announceConversationRailCollapsed = (collapsed: boolean) => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchConversationRailToggleDetail>(\n AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,\n {\n detail: {\n conversationRailCollapsed: collapsed,\n instanceId\n }\n }\n )\n );\n };\n const announceNewConversation = () => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchNewConversationDetail>(\n AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,\n {\n detail: {\n instanceId\n }\n }\n )\n );\n };\n const announceSessionAction = (\n action: AgentGuiWorkbenchSessionAction\n ) => {\n dispatchAgentGuiWorkbenchSessionAction({\n action,\n agentSessionId: workbenchState.lastActiveAgentSessionId,\n instanceId\n });\n };\n\n const headerProps = {\n copy,\n conversationIconFallbackUrl,\n conversationRailWidthPx,\n displayMode,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n nodeId: node.id,\n providerRailWidthPx: agentGuiWorkbenchProviderRailWidthPx,\n title: headerTitle,\n windowActions: {\n close: windowActions.close,\n minimize: windowActions.minimize,\n toggleDisplayMode: windowActions.toggleDisplayMode\n },\n ...dragHandleProps,\n onCreateConversation: announceNewConversation,\n onSessionAction: announceSessionAction,\n onOpenDetachedWindow: input.onOpenDetachedWindow\n ? selectedAgent\n ? () => {\n void input.onOpenDetachedWindow?.({\n agentSessionId: workbenchState.lastActiveAgentSessionId,\n agentTargetId: selectedAgent.agentTargetId,\n provider: selectedAgent.provider,\n workspaceId: input.workspaceId\n });\n }\n : undefined\n : undefined,\n onPointerDown: (event) => {\n dragHandleProps.onPointerDown?.(event);\n if (!isFocused) {\n windowActions.focus();\n }\n },\n onToggleConversationRail: (nextCollapsed) => {\n announceConversationRailCollapsed(nextCollapsed);\n if (\n isConversationRailCollapsed &&\n nextCollapsed === false &&\n node.displayMode !== \"fullscreen\"\n ) {\n const expandedFrame = resolveAgentGUIExpandedWindowFrame({\n conversationRailWidthPx: nodeState.conversationRailWidthPx,\n desktopSize: surfaceSize,\n height: node.frame.height,\n position: {\n x: node.frame.x,\n y: node.frame.y\n },\n width: node.frame.width\n });\n\n windowActions.resize({\n ...node.frame,\n height: expandedFrame.size.height,\n width: expandedFrame.size.width,\n x: expandedFrame.position.x,\n y: expandedFrame.position.y\n });\n }\n\n persistConversationRailCollapsed(nextCollapsed);\n }\n } satisfies AgentGuiWorkbenchHeaderProps;\n return input.sessionEngine\n ? createElement(AgentGuiWorkbenchReactiveHeader, {\n ...headerProps,\n agentDirectory: input.agentDirectory,\n dockIconUrls: input.dockIconUrls,\n sessionEngine: input.sessionEngine,\n workbenchState\n })\n : createElement(AgentGuiWorkbenchHeader, {\n ...headerProps,\n agentTitle: conversationIdentity?.agentTitle,\n conversationIconUrl,\n conversationTitle,\n hasConversation\n });\n },\n title: copy.nodeTitle,\n typeId: agentGuiWorkbenchTypeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"component\",\n providePreview: (item) =>\n createAgentGuiWorkbenchPreviewContent({\n agentDirectory: input.agentDirectory,\n item,\n renderPreview: input.renderMinimizedPreview,\n resolveDockPopupTitle: input.resolveDockPopupTitle\n })\n },\n minimizable: true\n }\n }\n ],\n onLaunchRequest: (request) => {\n if (request.typeId !== agentGuiWorkbenchTypeId) {\n return null;\n }\n\n const launchPayload = resolveAgentGuiWorkbenchLaunchPayload(request, {\n agentDirectory: input.agentDirectory,\n defaultProvider: input.defaultProvider,\n providerAvailability: input.providerAvailability\n });\n if (\n !hasAgentSessionId(launchPayload) &&\n !providerTargetLaunchPayloadFromRequest(\n launchPayload,\n providerFromState(launchPayload) ?? \"codex\"\n ).agentTargetId\n ) {\n return null;\n }\n if (!providerFromState(launchPayload)) {\n return null;\n }\n const {\n activation,\n dockEntryId,\n instanceId: descriptorInstanceId,\n openInNewWindow,\n provider,\n reusePolicy,\n targetAgentSessionId\n } = createAgentGuiWorkbenchLaunchDescriptor({\n ...request,\n payload: launchPayload\n });\n const providerTarget = providerTargetLaunchPayloadFromRequest(\n launchPayload,\n provider\n );\n // Locate an already-open node currently showing this session (its launch\n // instanceId may differ from the session-keyed one, e.g. a conversation\n // started fresh as a draft) so we focus it instead of opening a duplicate.\n const existingInstanceId =\n reusePolicy.kind === \"current-session\"\n ? nodeStateSource.findInstanceIdByAgentSessionId(\n reusePolicy.agentSessionId\n )\n : null;\n const instanceId = existingInstanceId ?? descriptorInstanceId;\n const title = copy.nodeTitle;\n const launchAgentTargetId = providerTarget.agentTargetId;\n if (targetAgentSessionId) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n ...(targetAgentSessionId\n ? { lastActiveAgentSessionId: targetAgentSessionId }\n : {}),\n agentTargetId: launchAgentTargetId ?? null\n },\n typeId: agentGuiWorkbenchTypeId\n });\n } else if (providerTarget.agentTargetId) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n lastActiveAgentSessionId: null,\n agentTargetId: providerTarget.agentTargetId\n },\n typeId: agentGuiWorkbenchTypeId\n });\n }\n const defaultFrame = resolveAgentGuiWorkbenchDefaultLaunchFrame({\n frame,\n request\n });\n return {\n activation,\n ...(openInNewWindow\n ? { cascadeOffset: agentGuiWorkbenchNewWindowCascadeOffset }\n : {}),\n defaultFrame,\n dockEntryId,\n framePolicy:\n !openInNewWindow &&\n isAgentGuiWorkbenchCompactVisibleFrame(defaultFrame, frame)\n ? \"absolute\"\n : \"cascade-same-type-centered\",\n instanceId,\n // Reusing the window already showing this specific conversation\n // (e.g. clicking a completion notification) should just focus it,\n // not reset it back to the default size/position.\n preserveExistingNodeFrame: existingInstanceId !== null,\n reuseDockEntryNode: reusePolicy.kind === \"dock-entry\",\n title,\n typeId: agentGuiWorkbenchTypeId\n };\n }\n };\n}\n\nfunction resolveAgentGuiWorkbenchStateAgent(\n state: AgentGuiWorkbenchState | null,\n directory: AgentGUIAgentDirectoryPort\n) {\n const agentTargetId = state?.agentTargetId?.trim();\n if (!agentTargetId) {\n return null;\n }\n return (\n directory\n .getSnapshot()\n .agents.find((agent) => agent.agentTargetId === agentTargetId) ?? null\n );\n}\n\nfunction agentTargetIdFromActivation(activation: unknown): string | null {\n if (!activation || typeof activation !== \"object\") {\n return null;\n }\n const payload = (activation as { payload?: unknown }).payload;\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n return typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : null;\n}\n\nfunction hasAgentSessionId(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return false;\n }\n return (\n typeof (payload as { agentSessionId?: unknown }).agentSessionId ===\n \"string\" &&\n (payload as { agentSessionId: string }).agentSessionId.trim().length > 0\n );\n}\n\nimport {\n agentGuiWorkbenchDefaultNodeFrame,\n agentGuiWorkbenchNewWindowCascadeOffset,\n agentGuiWorkbenchProviderRailWidthPx,\n buildAgentGuiDockEntries,\n createAgentGuiWorkbenchPreviewContent,\n isAgentGuiWorkbenchCompactVisibleFrame,\n providerFromState,\n providerTargetLaunchPayloadFromRequest,\n resolveAgentGuiWorkbenchLaunchPayload,\n resolveAgentGuiWorkbenchContributionCopy,\n resolveAgentGuiWorkbenchDefaultLaunchFrame\n} from \"./contributionDock.tsx\";\nimport type { AgentGuiWorkbenchProviderAvailability } from \"./contributionDock.tsx\";\nexport {\n agentGuiWorkbenchCompactVisibleAreaRatio,\n agentGuiWorkbenchDefaultCopy,\n agentGuiWorkbenchDefaultNodeFrame,\n agentGuiWorkbenchDefaultUsableHeightRatio,\n agentGuiWorkbenchDefaultUsableWidthRatio,\n agentGuiWorkbenchNewWindowCascadeOffset,\n agentGuiWorkbenchProviderRailWidthPx,\n buildAgentGuiDockEntries,\n resolveAgentGuiUnifiedDockLaunchPayload,\n resolveAgentGuiWorkbenchContributionCopy,\n resolveAgentGuiWorkbenchDefaultLaunchFrame\n} from \"./contributionDock.tsx\";\nexport type {\n AgentGuiWorkbenchProviderAvailability,\n BuildAgentGuiDockEntriesInput\n} from \"./contributionDock.tsx\";\n","function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n// Keep aligned with the issue manager task-list rail dimensions.\nexport const AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;\nexport const AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;\nexport const AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;\nexport const AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;\nexport const AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX = 320;\nexport const AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;\nexport const AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;\nexport const AGENT_GUI_EXPANDED_MIN_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\nexport const AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX = 610;\n// The standalone agent window keeps the conversation rail visible until the\n// home composer reaches its actual minimum width. Include the provider rail in\n// this host-specific threshold: 248px conversation rail + 320px composer +\n// 10px resize handle + 52px provider rail = 630px.\nexport const AGENT_GUI_STANDALONE_AUTO_COLLAPSE_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX +\n 52;\nexport const AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;\n\nexport interface AgentGUIExpandedWindowFrameInput {\n position: { x: number; y: number };\n width: number;\n height: number;\n desktopSize: { width: number; height: number };\n conversationRailWidthPx: number | null | undefined;\n}\n\nexport function shouldAutoCollapseAgentGUIConversationRail(\n containerWidthPx: number,\n autoCollapseWidthPx: number = AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX\n): boolean {\n return (\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0 &&\n containerWidthPx <= autoCollapseWidthPx\n );\n}\n\nexport function resolveAgentGUIConversationRailMaxWidthPx(\n containerWidthPx: number\n): number {\n const safeContainerWidth =\n Number.isFinite(containerWidthPx) && containerWidthPx > 0\n ? containerWidthPx\n : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\n\n return Math.max(\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n Math.min(\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,\n safeContainerWidth -\n AGENT_GUI_DETAIL_MIN_WIDTH_PX -\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n )\n );\n}\n\nexport function clampAgentGUIConversationRailWidthPx(\n widthPx: number | null | undefined,\n containerWidthPx: number\n): number {\n const preferredWidthPx =\n typeof widthPx === \"number\" && Number.isFinite(widthPx)\n ? Math.round(widthPx)\n : null;\n\n return clamp(\n preferredWidthPx ?? AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX,\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)\n );\n}\n\nexport function resolveNextAgentGUIConversationRailWidthPx(input: {\n currentWidthPx: number | null | undefined;\n requestedWidthPx: number;\n containerWidthPx: number;\n}): number | null {\n const nextWidthPx = clampAgentGUIConversationRailWidthPx(\n input.requestedWidthPx,\n input.containerWidthPx\n );\n if (input.currentWidthPx === nextWidthPx) {\n return input.currentWidthPx;\n }\n\n if (input.currentWidthPx === null || input.currentWidthPx === undefined) {\n const defaultWidthPx = clampAgentGUIConversationRailWidthPx(\n null,\n input.containerWidthPx\n );\n if (nextWidthPx === defaultWidthPx) {\n return null;\n }\n }\n\n return nextWidthPx;\n}\n\nexport function resolveAgentGUIExpandedWindowFrame(\n input: AgentGUIExpandedWindowFrameInput\n): {\n position: { x: number; y: number };\n size: { width: number; height: number };\n} {\n const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(\n input.conversationRailWidthPx,\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n );\n const desiredWidthPx = Math.max(\n Math.round(input.width),\n desiredRailWidthPx +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,\n AGENT_GUI_EXPANDED_MIN_WIDTH_PX,\n AGENT_GUI_EXPANDED_TARGET_WIDTH_PX\n );\n const desktopWidthPx =\n Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0\n ? Math.round(input.desktopSize.width)\n : desiredWidthPx;\n const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);\n const maxX = Math.max(0, desktopWidthPx - nextWidthPx);\n const nextX = clamp(Math.round(input.position.x), 0, maxX);\n\n return {\n position: {\n x: nextX,\n y: input.position.y\n },\n size: {\n width: nextWidthPx,\n height: input.height\n }\n };\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport type { AgentSessionEngine } from \"@tutti-os/agent-activity-core\";\nimport type {\n AgentGUIAgentDirectoryPort,\n AgentGUIAgentDirectorySnapshot\n} from \"../types.ts\";\nimport { useEngineSelector } from \"../shared/engine/useEngineSelector.ts\";\nimport {\n agentGuiWorkbenchConversationIdentitiesEqual,\n resolveAgentGuiWorkbenchConversationIdentity\n} from \"./conversationIdentity.ts\";\nimport {\n AgentGuiWorkbenchHeader,\n type AgentGuiWorkbenchHeaderProps\n} from \"./header.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\ninterface AgentGuiWorkbenchReactiveHeaderProps extends Omit<\n AgentGuiWorkbenchHeaderProps,\n | \"agentTitle\"\n | \"conversationIconUrl\"\n | \"conversationTitle\"\n | \"conversationTitleDisplayPrompt\"\n | \"hasConversation\"\n> {\n agentDirectory: AgentGUIAgentDirectoryPort;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n sessionEngine: AgentSessionEngine;\n workbenchState: AgentGuiWorkbenchState | null;\n}\n\nexport function AgentGuiWorkbenchReactiveHeader({\n agentDirectory,\n dockIconUrls,\n sessionEngine,\n workbenchState,\n ...headerProps\n}: AgentGuiWorkbenchReactiveHeaderProps): ReactNode {\n const directoryStore = useMemo(\n () => ({\n getSnapshot: () => agentDirectory.getSnapshot(),\n subscribe: (\n listener: (snapshot: AgentGUIAgentDirectorySnapshot) => void\n ) =>\n agentDirectory.subscribe(() => {\n listener(agentDirectory.getSnapshot());\n })\n }),\n [agentDirectory]\n );\n const agents = useEngineSelector(\n directoryStore,\n (snapshot) => snapshot.agents,\n Object.is\n );\n const conversationIdentity = useEngineSelector(\n sessionEngine,\n (engineState) =>\n resolveAgentGuiWorkbenchConversationIdentity({\n agents,\n dockIconUrls,\n engineState,\n workbenchState\n }),\n agentGuiWorkbenchConversationIdentitiesEqual\n );\n\n return (\n <AgentGuiWorkbenchHeader\n {...headerProps}\n agentTitle={conversationIdentity?.agentTitle}\n conversationIconUrl={\n conversationIdentity?.iconUrl ?? headerProps.conversationIconFallbackUrl\n }\n conversationTitle={conversationIdentity?.title}\n conversationTitleDisplayPrompt={conversationIdentity?.titleDisplayPrompt}\n hasConversation={Boolean(\n workbenchState?.lastActiveAgentSessionId?.trim()\n )}\n />\n );\n}\n","import {\n isPendingActivationViable,\n selectLatestActivationForSession,\n selectSessionMessages,\n selectWorkspaceAgentConsumerSession,\n type AgentActivityMessage,\n type AgentPromptContentBlock,\n type AgentSessionEngineState\n} from \"@tutti-os/agent-activity-core\";\nimport { resolveAgentGuiSessionProviderIconUrl } from \"../agentGuiSessionProviderIconUrls.ts\";\nimport {\n resolveAgentGUIConversationBrowserFreeTitle,\n resolveAgentGUIConversationTitleDisplayPrompt\n} from \"../shared/agentConversationTitleProjection.ts\";\nimport type { AgentGUIAgent } from \"../types.ts\";\nimport { isAgentGuiWorkbenchProvider } from \"./providerCatalog.ts\";\nimport {\n resolveAgentGuiWorkbenchHeaderTitle,\n resolveAgentGuiWorkbenchSessionTitle\n} from \"./sessionTitle.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\nexport interface AgentGuiWorkbenchConversationIdentity {\n agentTitle?: string | null;\n iconUrl?: string | null;\n title: string | null;\n titleDisplayPrompt?: string | null;\n}\n\nexport function resolveAgentGuiWorkbenchConversationIdentity(input: {\n agents: readonly AgentGUIAgent[];\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n engineState: AgentSessionEngineState;\n workbenchState: AgentGuiWorkbenchState | null;\n}): AgentGuiWorkbenchConversationIdentity | null {\n const agentSessionId =\n input.workbenchState?.lastActiveAgentSessionId?.trim() ?? \"\";\n if (!agentSessionId) {\n return null;\n }\n\n const session = selectWorkspaceAgentConsumerSession(\n input.engineState,\n agentSessionId\n )?.session;\n const activation = selectLatestActivationForSession(\n input.engineState,\n agentSessionId\n );\n const optimisticTitle =\n activation?.mode === \"new\" && isPendingActivationViable(activation)\n ? activation.optimisticTitle\n : null;\n const agentTargetId =\n session?.agentTargetId ?? input.workbenchState?.agentTargetId ?? null;\n const agent = agentTargetId\n ? (input.agents.find(\n (candidate) => candidate.agentTargetId === agentTargetId\n ) ?? null)\n : null;\n const provider = session?.provider ?? agent?.provider ?? null;\n const resolvedTitle = resolveAgentGuiWorkbenchSessionTitle({\n agentSessionId,\n fallbackTitle: null,\n optimisticTitle,\n session\n });\n const canonicalTitle = resolvedTitle.title;\n const messages = selectSessionMessages(input.engineState, agentSessionId);\n const titleDisplayPrompt = resolveAgentGuiWorkbenchTitleDisplayPrompt({\n activation,\n allowEmptyTitle: resolvedTitle.source === \"optimistic\",\n messages,\n title: canonicalTitle\n });\n // Keep browser context canonical in the message while omitting its tag from the visible header title.\n const title = resolveAgentGUIConversationBrowserFreeTitle({\n activation,\n allowEmptyTitle: resolvedTitle.source === \"optimistic\",\n messages,\n title: canonicalTitle\n });\n const agentTitle = resolveAgentGuiWorkbenchHeaderTitle({\n agentName: agent?.name,\n conversationTitle: title,\n provider\n });\n const iconUrl =\n agent?.iconUrl ??\n resolveAgentGuiSessionProviderIconUrl(provider ?? undefined) ??\n (isAgentGuiWorkbenchProvider(provider)\n ? (input.dockIconUrls?.[provider] ?? null)\n : null);\n\n return {\n agentTitle,\n iconUrl,\n title,\n titleDisplayPrompt\n };\n}\n\nexport function resolveAgentGuiWorkbenchTitleDisplayPrompt(input: {\n activation?: {\n content: readonly AgentPromptContentBlock[];\n displayPrompt?: string;\n mode: \"existing\" | \"new\";\n status: import(\"@tutti-os/agent-activity-core\").PendingActivationStatus;\n } | null;\n allowEmptyTitle?: boolean;\n messages: readonly AgentActivityMessage[];\n title: string | null;\n}): string | null {\n return resolveAgentGUIConversationTitleDisplayPrompt(input);\n}\n\nexport function agentGuiWorkbenchConversationIdentitiesEqual(\n left: AgentGuiWorkbenchConversationIdentity | null,\n right: AgentGuiWorkbenchConversationIdentity | null\n): boolean {\n return (\n left === right ||\n (left !== null &&\n right !== null &&\n left.agentTitle === right.agentTitle &&\n left.iconUrl === right.iconUrl &&\n left.title === right.title &&\n left.titleDisplayPrompt === right.titleDisplayPrompt)\n );\n}\n","import {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorFlatFilledIconUrl,\n opencodeFlatFilledIconUrl,\n resolveProviderIconAsset,\n tuttiFlatFilledIconUrl\n} from \"./providerIconAssets.ts\";\nimport { resolveAgentGUIProviderCatalogIdentity } from \"./providerIdentityCatalog.ts\";\nimport { cursorColorfulUrl } from \"./managedAgentIconAssets.ts\";\nimport { normalizeManagedAgentProvider } from \"./shared/managedAgentProviders\";\n\nexport {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorColorfulUrl,\n cursorFlatFilledIconUrl,\n opencodeFlatFilledIconUrl,\n tuttiFlatFilledIconUrl\n};\n\n/**\n * Colorful session icons, used where the icon renders as a real <img> avatar\n * (collapsed workbench header, dock popup). Colorful assets keep their fill.\n */\nexport function resolveAgentGuiSessionProviderIconUrl(\n provider: string | undefined\n): string | null {\n const identity = resolveAgentGUIProviderCatalogIdentity(\n normalizeManagedAgentProvider(provider)\n );\n return resolveProviderIconAsset(identity?.iconKey, \"sessionColorful\");\n}\n\n/**\n * Flat monochrome session icons, used where the icon renders through a CSS\n * mask (e.g. the conversation rail rows). Colorful assets would collapse to a\n * solid square under a mask, so these must be single-color glyphs with a\n * transparent background.\n */\nexport function resolveAgentGuiSessionProviderFlatIconUrl(\n provider: string | undefined\n): string | null {\n const identity = resolveAgentGUIProviderCatalogIdentity(\n normalizeManagedAgentProvider(provider)\n );\n return resolveProviderIconAsset(identity?.iconKey, \"sessionFlat\");\n}\n","import {\n createElement,\n lazy,\n Suspense,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode\n} from \"react\";\nimport type {\n WorkbenchDisplayMode,\n WorkbenchHostNodeHeaderWindowActions\n} from \"@tutti-os/workbench-surface\";\nimport {\n Button,\n PanelIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { CreateChatIcon } from \"@tutti-os/ui-system/icons\";\nimport openLinkLinedIconUrl from \"../app/renderer/assets/icons/open-link-lined.svg\";\nimport { useAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\nimport { AgentGuiWorkbenchSessionMenu } from \"./AgentGuiWorkbenchSessionMenu.tsx\";\nimport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionMenuCopy\n} from \"./sessionActions.ts\";\n\nconst LazyAgentRichTextReadonly = lazy(() =>\n import(\"../shared/AgentRichTextReadonly.tsx\").then((module) => ({\n default: module.AgentRichTextReadonly\n }))\n);\n\nconst headerChromeIconButtonClassName =\n \"agent-gui-workbench-header__icon-button\";\n\nconst conversationRailToggleButtonClassName =\n \"agent-gui-workbench-header__icon-button agent-gui-workbench-header__rail-toggle\";\n\nconst detachedWindowButtonClassName =\n \"agent-gui-workbench-header__icon-button agent-gui-workbench-header__detached-window\";\n\nconst headerChromeIconClassName = \"agent-gui-workbench-header__icon\";\n\nexport interface AgentGuiWorkbenchHeaderCopy {\n collapseConversationRail: string;\n close?: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n maximize?: string;\n minimize?: string;\n newConversation: string;\n openDetachedWindow?: string;\n restore?: string;\n untitledConversation?: string;\n sessionMenu?: AgentGuiWorkbenchSessionMenuCopy | null;\n}\n\nexport interface AgentGuiWorkbenchHeaderProps extends HTMLAttributes<HTMLElement> {\n copy: AgentGuiWorkbenchHeaderCopy;\n agentTitle?: string | null;\n defaultActions?: ReactNode;\n displayMode?: WorkbenchDisplayMode;\n isConversationRailAutoCollapsed: boolean;\n isConversationRailCollapsed: boolean;\n conversationRailWidthPx?: number | null;\n conversationIconUrl?: string | null;\n conversationIconFallbackUrl?: string | null;\n hasConversation?: boolean;\n providerRailWidthPx?: number | null;\n primaryAccessory?: ReactNode;\n secondaryAccessory?: ReactNode;\n conversationTitle?: string | null;\n conversationTitleDisplayPrompt?: string | null;\n nodeId: string;\n onCreateConversation?: () => void;\n onOpenDetachedWindow?: () => void;\n onSessionAction?: (action: AgentGuiWorkbenchSessionAction) => void;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n showAppTitle?: boolean;\n showConversationRailToggle?: boolean;\n showWindowControls?: boolean;\n title?: string;\n windowActions?: Pick<\n WorkbenchHostNodeHeaderWindowActions,\n \"close\" | \"minimize\" | \"toggleDisplayMode\"\n >;\n}\n\nexport function AgentGuiWorkbenchHeader({\n className,\n copy,\n agentTitle,\n defaultActions: _defaultActions,\n displayMode,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n conversationRailWidthPx,\n conversationIconUrl,\n conversationIconFallbackUrl,\n hasConversation = false,\n providerRailWidthPx,\n primaryAccessory,\n secondaryAccessory,\n conversationTitle,\n conversationTitleDisplayPrompt,\n nodeId,\n onCreateConversation,\n onOpenDetachedWindow,\n onSessionAction,\n onToggleConversationRail,\n showAppTitle = true,\n showConversationRailToggle = true,\n showWindowControls = true,\n title: _title,\n windowActions,\n ...headerProps\n}: AgentGuiWorkbenchHeaderProps): ReactNode {\n const hasBodyRenderError = useAgentGuiWorkbenchBodyRenderError(nodeId);\n const toggleLabel = isConversationRailCollapsed\n ? copy.expandConversationRail\n : copy.collapseConversationRail;\n const appTitle = _title?.trim() || copy.fallbackAgentLabel;\n const sessionTitle = hasBodyRenderError\n ? \"\"\n : conversationTitle?.trim() ||\n (hasConversation ? copy.untitledConversation?.trim() : \"\") ||\n \"\";\n const sessionTitleDisplayPrompt = hasBodyRenderError\n ? \"\"\n : conversationTitleDisplayPrompt?.trim() || \"\";\n const collapsedTitle = sessionTitle || agentTitle?.trim() || \"\";\n const sessionIconUrl = conversationIconUrl?.trim() || \"\";\n const sessionIconFallbackUrl = conversationIconFallbackUrl?.trim() || \"\";\n const hasExpandedIdentity = Boolean(\n collapsedTitle || sessionIconUrl || sessionIconFallbackUrl\n );\n const sessionMenu =\n onSessionAction && copy.sessionMenu && sessionTitle && !hasBodyRenderError\n ? createElement(AgentGuiWorkbenchSessionMenu, {\n copy: copy.sessionMenu,\n onAction: onSessionAction\n })\n : null;\n const safeDisplayMode = displayMode ?? \"floating\";\n const safeWindowActions = windowActions ?? {\n close: () => undefined,\n minimize: () => undefined,\n toggleDisplayMode: () => undefined\n };\n const displayModeLabel =\n safeDisplayMode === \"fullscreen\"\n ? (copy.restore ?? \"Restore\")\n : (copy.maximize ?? \"Maximize\");\n const headerStyle = {\n ...(headerProps.style ?? {}),\n ...(typeof conversationRailWidthPx === \"number\" &&\n Number.isFinite(conversationRailWidthPx)\n ? {\n \"--agent-gui-workbench-header-rail-width\": `${Math.round(\n conversationRailWidthPx +\n (typeof providerRailWidthPx === \"number\" &&\n Number.isFinite(providerRailWidthPx)\n ? providerRailWidthPx\n : 0)\n )}px`\n }\n : {})\n } as CSSProperties;\n\n return createElement(\n \"header\",\n {\n ...headerProps,\n className: cn(\"agent-gui-workbench-header\", className),\n \"data-agent-gui-workbench-header\": \"true\",\n \"data-agent-gui-workbench-header-collapsed\": isConversationRailCollapsed\n ? \"true\"\n : \"false\",\n \"data-agent-gui-workbench-header-has-session\": sessionTitle\n ? \"true\"\n : \"false\",\n style: headerStyle\n },\n createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__primary\",\n \"data-agent-gui-workbench-header-primary\": \"true\"\n },\n showWindowControls\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__traffic-lights\",\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createTrafficLightButton({\n label: copy.close ?? \"Close\",\n onClick: safeWindowActions.close,\n testId: \"agent-gui-window-close\",\n tone: \"close\"\n }),\n createTrafficLightButton({\n label: copy.minimize ?? \"Minimize\",\n onClick: safeWindowActions.minimize,\n testId: \"agent-gui-window-minimize\",\n tone: \"minimize\"\n }),\n createTrafficLightButton({\n label: displayModeLabel,\n onClick: safeWindowActions.toggleDisplayMode,\n pressed: safeDisplayMode === \"fullscreen\",\n testId: \"agent-gui-window-toggle-display-mode\",\n tone: \"maximize\"\n })\n )\n : null,\n showAppTitle && !isConversationRailCollapsed\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__agent-brand\"\n },\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__agent-name\"\n },\n appTitle\n )\n )\n : null,\n primaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__primary-accessory\"\n },\n primaryAccessory\n )\n : null,\n onOpenDetachedWindow && !hasBodyRenderError\n ? createDetachedWindowButton({\n label: copy.openDetachedWindow ?? \"Open in detached window\",\n onOpenDetachedWindow\n })\n : null,\n showConversationRailToggle\n ? createConversationRailToggleButton({\n isAutoCollapsed: isConversationRailAutoCollapsed,\n isCollapsed: isConversationRailCollapsed,\n label: toggleLabel,\n onToggleConversationRail\n })\n : null,\n isConversationRailCollapsed && onCreateConversation\n ? createNewConversationButton({\n label: copy.newConversation,\n onCreateConversation\n })\n : null,\n isConversationRailCollapsed && collapsedTitle\n ? createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__session-title\"\n },\n createSessionHeaderIconSlot({\n fallbackSrc: sessionIconFallbackUrl,\n src: sessionIconUrl,\n testId: \"agent-gui-window-session-icon\"\n }),\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n collapsedTitle\n ),\n sessionMenu\n )\n : null,\n isConversationRailCollapsed && secondaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__secondary-accessory\"\n },\n secondaryAccessory\n )\n : null\n ),\n !isConversationRailCollapsed && (hasExpandedIdentity || secondaryAccessory)\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__detail\"\n },\n hasExpandedIdentity\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__detail-title\",\n \"data-testid\": \"agent-gui-window-detail-title\"\n },\n createSessionHeaderIconSlot({\n fallbackSrc: sessionIconFallbackUrl,\n src: sessionIconUrl,\n testId: \"agent-gui-window-detail-title-icon\"\n }),\n sessionTitleDisplayPrompt\n ? createElement(\n Suspense,\n {\n fallback: createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n },\n createElement(LazyAgentRichTextReadonly, {\n className:\n \"agent-gui-workbench-header__title-text agent-gui-workbench-header__rich-title\",\n editorClassName:\n \"agent-gui-workbench-header__rich-title-editor\",\n value: sessionTitleDisplayPrompt\n })\n )\n : sessionTitle\n ? createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n : null,\n sessionMenu\n )\n : null,\n secondaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__secondary-accessory\"\n },\n secondaryAccessory\n )\n : null\n )\n : null\n );\n}\n\nfunction createConversationRailToggleButton({\n isAutoCollapsed,\n isCollapsed,\n label,\n onToggleConversationRail\n}: {\n isAutoCollapsed: boolean;\n isCollapsed: boolean;\n label: string;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: conversationRailToggleButtonClassName,\n \"data-agent-gui-conversation-rail-auto-collapsed\": isAutoCollapsed\n ? \"true\"\n : undefined,\n \"data-agent-gui-conversation-rail-collapsed\": isCollapsed\n ? \"true\"\n : undefined,\n \"data-testid\": \"agent-gui-toggle-conversation-rail\",\n size: \"icon-sm\",\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onToggleConversationRail(!isCollapsed);\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(PanelIcon, { className: headerChromeIconClassName })\n );\n\n return createElement(TooltipProvider, {\n children: createElement(\n Tooltip,\n null,\n createElement(TooltipTrigger, { asChild: true }, button),\n createElement(TooltipContent, { side: \"bottom\" }, label)\n ),\n delayDuration: 250,\n skipDelayDuration: 0\n });\n}\n\nfunction createDetachedWindowButton({\n label,\n onOpenDetachedWindow\n}: {\n label: string;\n onOpenDetachedWindow: () => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: detachedWindowButtonClassName,\n \"data-testid\": \"agent-gui-open-detached-window\",\n size: \"icon-sm\",\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onOpenDetachedWindow();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(\"span\", {\n \"aria-hidden\": true,\n className: headerChromeIconClassName,\n \"data-agent-gui-icon\": \"open-link-lined\",\n style: {\n backgroundColor: \"currentColor\",\n display: \"block\",\n WebkitMaskImage: `url(\"${openLinkLinedIconUrl}\")`,\n WebkitMaskPosition: \"center\",\n WebkitMaskRepeat: \"no-repeat\",\n WebkitMaskSize: \"contain\",\n maskImage: `url(\"${openLinkLinedIconUrl}\")`,\n maskPosition: \"center\",\n maskRepeat: \"no-repeat\",\n maskSize: \"contain\"\n }\n })\n );\n\n return createElement(TooltipProvider, {\n children: createElement(\n Tooltip,\n null,\n createElement(TooltipTrigger, { asChild: true }, button),\n createElement(TooltipContent, { side: \"bottom\" }, label)\n ),\n delayDuration: 250,\n skipDelayDuration: 0\n });\n}\n\nfunction createNewConversationButton({\n label,\n onCreateConversation\n}: {\n label: string;\n onCreateConversation: () => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: headerChromeIconButtonClassName,\n size: \"icon-sm\",\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onCreateConversation();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(CreateChatIcon, {\n \"aria-hidden\": true,\n className: headerChromeIconClassName\n })\n );\n\n return createElement(TooltipProvider, {\n children: createElement(\n Tooltip,\n null,\n createElement(TooltipTrigger, { asChild: true }, button),\n createElement(TooltipContent, { side: \"bottom\" }, label)\n ),\n delayDuration: 250,\n skipDelayDuration: 0\n });\n}\n\nfunction createSessionHeaderIconSlot({\n src,\n fallbackSrc,\n testId\n}: {\n src: string;\n fallbackSrc: string;\n testId: string;\n}): ReactNode {\n // While the session's provider is still resolving (e.g. a freshly created\n // session) there is no icon URL yet. Render a neutral skeleton block rather\n // than flashing a wrong/default provider icon; it is replaced once the real\n // icon arrives.\n if (!src) {\n return createElement(\"span\", {\n \"aria-hidden\": \"true\",\n className:\n \"agent-gui-workbench-header__session-icon agent-gui-workbench-header__session-icon--pending\",\n \"data-testid\": `${testId}-pending`\n });\n }\n return createElement(SessionHeaderIcon, {\n key: `${src}::${fallbackSrc}`,\n fallbackSrc,\n src,\n testId\n });\n}\n\nfunction SessionHeaderIcon({\n src,\n fallbackSrc,\n testId\n}: {\n src: string;\n fallbackSrc?: string;\n testId: string;\n}): ReactNode {\n const [useFallback, setUseFallback] = useState(false);\n const [hidden, setHidden] = useState(false);\n\n const hasFallback = Boolean(fallbackSrc) && fallbackSrc !== src;\n const effectiveSrc = useFallback && fallbackSrc ? fallbackSrc : src;\n\n if (hidden) {\n return null;\n }\n\n return createElement(\"img\", {\n alt: \"\",\n className: \"agent-gui-workbench-header__session-icon\",\n \"data-testid\": testId,\n draggable: false,\n src: effectiveSrc,\n onError: () => {\n // On load failure, fall back to the bundled provider icon once; if that\n // also fails (or there is none), hide the img so the browser's broken\n // image glyph never shows.\n if (!useFallback && hasFallback) {\n setUseFallback(true);\n } else {\n setHidden(true);\n }\n }\n });\n}\n\nfunction createTrafficLightButton(input: {\n label: string;\n onClick: () => void;\n pressed?: boolean;\n testId: string;\n tone: \"close\" | \"minimize\" | \"maximize\";\n}): ReactNode {\n const iconName =\n input.tone === \"maximize\"\n ? input.pressed\n ? \"unfullscreen\"\n : \"fullscreen\"\n : input.tone;\n return createElement(\n \"button\",\n {\n \"aria-label\": input.label,\n \"aria-pressed\": input.pressed,\n className: \"agent-gui-workbench-header__traffic-light\",\n \"data-agent-gui-workbench-traffic-light\": input.tone,\n \"data-testid\": input.testId,\n type: \"button\",\n onClick: (event) => {\n event.stopPropagation();\n input.onClick();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(TrafficLightIcon, {\n \"aria-hidden\": true,\n className: \"agent-gui-workbench-header__traffic-light-icon\",\n \"data-agent-gui-workbench-traffic-light-icon\": iconName,\n iconName\n })\n );\n}\n\nfunction TrafficLightIcon({\n className,\n iconName,\n ...props\n}: {\n className: string;\n iconName: \"close\" | \"fullscreen\" | \"minimize\" | \"unfullscreen\";\n \"aria-hidden\": true;\n \"data-agent-gui-workbench-traffic-light-icon\": string;\n}): ReactNode {\n return createElement(\n \"svg\",\n {\n ...props,\n className,\n fill: \"currentColor\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\"\n },\n createElement(\"path\", { d: trafficLightIconPathByName[iconName] })\n );\n}\n\nconst trafficLightIconPathByName = {\n close:\n \"M16.9395 4.93953C17.5253 4.35374 18.4748 4.35374 19.0606 4.93953C19.6463 5.52532 19.6464 6.47486 19.0606 7.06062L14.1212 12.0001L19.0606 16.9395C19.6463 17.5253 19.6464 18.4749 19.0606 19.0606C18.4749 19.6464 17.5253 19.6463 16.9395 19.0606L12.0001 14.1212L7.06062 19.0606C6.47486 19.6464 5.52532 19.6463 4.93953 19.0606C4.35374 18.4748 4.35374 17.5253 4.93953 16.9395L9.87898 12.0001L4.93953 7.06062C4.35374 6.47484 4.35374 5.52532 4.93953 4.93953C5.52532 4.35374 6.47484 4.35374 7.06062 4.93953L12.0001 9.87898L16.9395 4.93953Z\",\n fullscreen:\n \"M18.1465 7.85352C18.4615 7.53861 18.9999 7.76165 19 8.20703V18.5C19 18.7761 18.7761 19 18.5 19H8.20703C7.76165 18.9999 7.53861 18.4615 7.85352 18.1465L18.1465 7.85352ZM15.793 5C16.2384 5.00006 16.4614 5.53855 16.1465 5.85352L5.85352 16.1465C5.53855 16.4614 5.00006 16.2384 5 15.793V5.5C5 5.22386 5.22386 5 5.5 5H15.793Z\",\n minimize:\n \"M5 10.5H19C19.8284 10.5 20.5 11.1716 20.5 12C20.5 12.8284 19.8284 13.5 19 13.5H5C4.17157 13.5 3.5 12.8284 3.5 12C3.5 11.1716 4.17157 10.5 5 10.5Z\",\n unfullscreen:\n \"M20.793 12C21.2384 12.0001 21.4614 12.5386 21.1465 12.8536L12.8536 21.1465C12.5386 21.4614 12.0001 21.2384 12.0001 20.793V12.5C12.0001 12.2239 12.2239 12 12.5001 12H20.793ZM11.1465 2.85356C11.4615 2.53864 12 2.76166 12.0001 3.20708V11.5C12 11.7761 11.7762 12 11.5001 12H3.20708C2.76166 12 2.53864 11.4615 2.85357 11.1465L11.1465 2.85356Z\"\n} as const;\n","export default \"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cpath%20d%3D%22M14%203H21V10M20%204L10%2014%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M19%2013V19C19%2020.1046%2018.1046%2021%2017%2021H5C3.89543%2021%203%2020.1046%203%2019V7C3%205.89543%203.89543%205%205%205H11%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3C%2Fsvg%3E%0A\";","import { useSyncExternalStore } from \"react\";\n\nconst listenersByNodeId = new Map<string, Set<() => void>>();\nconst errorNodeIds = new Set<string>();\n\nexport function setAgentGuiWorkbenchBodyRenderError(\n nodeId: string,\n hasError: boolean\n): void {\n const hadError = errorNodeIds.has(nodeId);\n if (hadError === hasError) {\n return;\n }\n if (hasError) {\n errorNodeIds.add(nodeId);\n } else {\n errorNodeIds.delete(nodeId);\n }\n for (const listener of listenersByNodeId.get(nodeId) ?? []) {\n listener();\n }\n}\n\nfunction subscribeAgentGuiWorkbenchBodyRenderError(\n nodeId: string,\n listener: () => void\n): () => void {\n let listeners = listenersByNodeId.get(nodeId);\n if (!listeners) {\n listeners = new Set();\n listenersByNodeId.set(nodeId, listeners);\n }\n listeners.add(listener);\n return () => {\n listeners?.delete(listener);\n if (listeners?.size === 0) {\n listenersByNodeId.delete(nodeId);\n }\n };\n}\n\nfunction getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId: string): boolean {\n return errorNodeIds.has(nodeId);\n}\n\nexport function useAgentGuiWorkbenchBodyRenderError(nodeId: string): boolean {\n return useSyncExternalStore(\n (listener) => subscribeAgentGuiWorkbenchBodyRenderError(nodeId, listener),\n () => getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId)\n );\n}\n","import {\n useCallback,\n useRef,\n type MouseEvent,\n type PointerEvent,\n type ReactNode\n} from \"react\";\nimport { FileText, MoreHorizontal, Pencil, AtSign } from \"lucide-react\";\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"@tutti-os/ui-system\";\nimport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionMenuCopy\n} from \"./sessionActions.ts\";\n\nconst menuContentClassName =\n \"w-max min-w-44 nodrag [-webkit-app-region:no-drag]\";\n\nexport interface AgentGuiWorkbenchSessionMenuProps {\n copy: AgentGuiWorkbenchSessionMenuCopy;\n onAction: (action: AgentGuiWorkbenchSessionAction) => void;\n}\n\nexport function AgentGuiWorkbenchSessionMenu({\n copy,\n onAction\n}: AgentGuiWorkbenchSessionMenuProps): ReactNode {\n const pendingActionRef = useRef(false);\n const select = useCallback(\n (action: AgentGuiWorkbenchSessionAction) => {\n if (pendingActionRef.current) {\n return;\n }\n pendingActionRef.current = true;\n // Radix renders the menu through a React portal. Portal events still\n // bubble through the React tree, so dispatching synchronously from\n // pointerup can update/unmount header chrome while its draggable region\n // is handling the same gesture. Let the menu gesture finish first.\n window.requestAnimationFrame(() => {\n pendingActionRef.current = false;\n onAction(action);\n });\n },\n [onAction]\n );\n const actionProps = useCallback(\n (action: AgentGuiWorkbenchSessionAction) => ({\n onClick: () => select(action),\n onPointerUp: (event: PointerEvent) => {\n if (event.button === 0) {\n select(action);\n }\n },\n onSelect: () => select(action)\n }),\n [select]\n );\n return (\n <DropdownMenu\n onOpenChange={(open) => {\n if (open) {\n pendingActionRef.current = false;\n }\n }}\n >\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.moreSessionActions}\n title={copy.moreSessionActions}\n className=\"agent-gui-workbench-header__icon-button agent-gui-workbench-header__session-menu-trigger\"\n data-testid=\"agent-gui-session-menu-trigger\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <MoreHorizontal\n aria-hidden=\"true\"\n className=\"agent-gui-workbench-header__icon\"\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className={menuContentClassName}\n onClick={stopMousePropagation}\n onDoubleClick={stopMousePropagation}\n onPointerDown={stopPointerPropagation}\n onPointerUp={stopPointerPropagation}\n sideOffset={6}\n >\n <DropdownMenuItem {...actionProps(\"rename\")}>\n <Pencil aria-hidden=\"true\" />\n <span>{copy.renameSession}</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem {...actionProps(\"copy-markdown\")}>\n <FileText aria-hidden=\"true\" />\n <span>{copy.copyAsMarkdown}</span>\n </DropdownMenuItem>\n <DropdownMenuItem {...actionProps(\"copy-reference\")}>\n <AtSign aria-hidden=\"true\" />\n <span>{copy.copyAsReference}</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction stopMousePropagation(event: MouseEvent): void {\n event.stopPropagation();\n}\n\nfunction stopPointerPropagation(event: PointerEvent): void {\n event.stopPropagation();\n}\n","export const AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT =\n \"tutti:agent-gui-workbench-session-action\";\n\nexport type AgentGuiWorkbenchSessionAction =\n | \"rename\"\n | \"copy-markdown\"\n | \"copy-reference\";\n\nconst agentGuiWorkbenchSessionActions: readonly AgentGuiWorkbenchSessionAction[] =\n [\"rename\", \"copy-markdown\", \"copy-reference\"];\n\nexport function isAgentGuiWorkbenchSessionAction(\n value: unknown\n): value is AgentGuiWorkbenchSessionAction {\n return agentGuiWorkbenchSessionActions.includes(\n value as AgentGuiWorkbenchSessionAction\n );\n}\n\nexport interface AgentGuiWorkbenchSessionActionDetail {\n action: AgentGuiWorkbenchSessionAction;\n /**\n * Session the header menu was rendered for. Null lets the consumer fall\n * back to its active conversation; carrying the id pins the action to the\n * conversation the user saw when they clicked.\n */\n agentSessionId: string | null;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchSessionActionRequest {\n action: AgentGuiWorkbenchSessionAction;\n agentSessionId: string | null;\n sequence: number;\n}\n\nexport function dispatchAgentGuiWorkbenchSessionAction(\n detail: AgentGuiWorkbenchSessionActionDetail\n): void {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchSessionActionDetail>(\n AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,\n { detail }\n )\n );\n}\n\nexport interface AgentGuiWorkbenchSessionMenuCopy {\n moreSessionActions: string;\n renameSession: string;\n copyAsMarkdown: string;\n copyAsReference: string;\n}\n","import { createElement, type ReactNode } from \"react\";\nimport {\n getWorkbenchLayoutFrame,\n type WorkbenchDockPreviewContent,\n type WorkbenchFrame,\n type WorkbenchHostDockEntry,\n type WorkbenchHostDockPopupItemInput,\n type WorkbenchHostLaunchRequest,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport { agentGuiDockIconUrls } from \"../dockIcons.ts\";\nimport {\n agentGuiWorkbenchDockIdentityFromIdentifier,\n agentGuiWorkbenchTypeId,\n agentGuiWorkbenchUnifiedDockEntryId\n} from \"./launch.ts\";\nimport { normalizeAgentGuiWorkbenchState } from \"./state.ts\";\nimport {\n agentGuiWorkbenchDefaultDockProviders,\n isAgentGuiWorkbenchProvider,\n resolveAgentGuiWorkbenchProviderLabel\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\nimport {\n normalizeAgentGUIAgents,\n projectAgentGUIAgentsToInternalTargets\n} from \"../agents.ts\";\nimport type {\n AgentGUIAgentDirectoryPort,\n AgentGUIAgentTarget\n} from \"../types.ts\";\nimport type {\n AgentGuiWorkbenchContributionCopy,\n AgentGuiWorkbenchContributionCopyOverrides,\n CreateAgentGuiWorkbenchContributionInput\n} from \"./contribution.ts\";\n\nexport const agentGuiWorkbenchDefaultNodeFrame: WorkbenchFrame = {\n height: 560,\n width: 1040,\n x: 140,\n y: 48\n};\n\nexport const agentGuiWorkbenchDefaultUsableWidthRatio = 0.9;\nexport const agentGuiWorkbenchDefaultUsableHeightRatio = 0.9;\nexport const agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;\nexport const agentGuiWorkbenchNewWindowCascadeOffset = { x: 180, y: 88 };\nexport const agentGuiWorkbenchProviderRailWidthPx = 52;\nconst agentGuiWorkbenchUnifiedDockTileProviders = [\n \"codex\",\n \"claude-code\",\n \"tutti-agent\",\n \"hermes\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\nexport const agentGuiWorkbenchDefaultCopy: AgentGuiWorkbenchContributionCopy = {\n collapseConversationRail: \"Hide sidebar\",\n close: \"Close\",\n expandConversationRail: \"Show sidebar\",\n fallbackAgentLabel: \"Agent\",\n maximize: \"Maximize\",\n minimize: \"Minimize\",\n newConversation: \"New conversation\",\n nodeTitle: \"Agent\",\n openDetachedWindow: \"Open in detached window\",\n restore: \"Restore\",\n untitledConversation: \"Untitled conversation\"\n};\nexport type AgentGuiWorkbenchProviderAvailability = Partial<\n Record<\n AgentGuiWorkbenchProvider,\n | boolean\n | \"available\"\n | \"ready\"\n | \"unavailable\"\n | {\n available?: boolean | null;\n status?: string | null;\n }\n | null\n | undefined\n >\n>;\n\nexport interface BuildAgentGuiDockEntriesInput {\n agentDirectory: AgentGUIAgentDirectoryPort;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n label?: string;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId?: string;\n unifiedDockIconUrl?: string;\n}\n\nexport function buildAgentGuiDockEntries(\n input: BuildAgentGuiDockEntriesInput\n): WorkbenchHostDockEntry[] {\n const sectionId = input.sectionId ?? \"agents\";\n const launchPayload = resolveAgentGuiUnifiedDockLaunchPayload(input);\n const provider = launchPayload.provider;\n const unifiedTileIconUrls = resolveAgentGuiUnifiedDockTileIconUrls(\n input.dockIconUrls\n );\n return [\n createAgentGuiWorkbenchDockEntry({\n agentDirectory: input.agentDirectory,\n icon: input.unifiedDockIconUrl\n ? createAgentGuiWorkbenchUnifiedDockIcon({\n iconUrl: input.unifiedDockIconUrl\n })\n : createAgentGuiWorkbenchLaunchpadStyleDockIcon({\n tileIconUrls: unifiedTileIconUrls\n }),\n label: input.label ?? agentGuiWorkbenchDefaultCopy.nodeTitle,\n launchPayload,\n order: 0,\n provider,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId,\n visibility: \"always\"\n })\n ];\n}\n\nexport function resolveAgentGuiUnifiedDockLaunchPayload(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): {\n provider: AgentGuiWorkbenchProvider;\n agentTargetId?: string;\n} {\n const target = resolveUnifiedAgentGuiDockTarget(input);\n if (target) {\n return {\n provider: target.provider,\n agentTargetId: target.agentTargetId ?? target.targetId\n };\n }\n return {\n provider: resolveUnifiedAgentGuiDockProvider(input)\n };\n}\n\nexport function resolveAgentGuiWorkbenchDefaultLaunchFrame(input: {\n frame: WorkbenchFrame;\n request: Pick<\n WorkbenchHostLaunchRequest,\n \"layoutConstraints\" | \"surfaceSize\"\n >;\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.request.surfaceSize,\n input.request.layoutConstraints\n );\n const defaultHeight = Math.round(\n layoutFrame.height * agentGuiWorkbenchDefaultUsableHeightRatio\n );\n const defaultWidth = Math.round(\n layoutFrame.width * agentGuiWorkbenchDefaultUsableWidthRatio\n );\n\n return {\n ...input.frame,\n height: defaultHeight,\n width: defaultWidth,\n x: Math.round(layoutFrame.x + (layoutFrame.width - defaultWidth) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - defaultHeight) / 2)\n };\n}\n\nexport function isAgentGuiWorkbenchCompactVisibleFrame(\n frame: WorkbenchFrame,\n defaultFrame: WorkbenchFrame\n): boolean {\n return frame.width !== defaultFrame.width || frame.x !== defaultFrame.x;\n}\n\nexport function resolveAgentGuiWorkbenchContributionCopy(\n copy?: AgentGuiWorkbenchContributionCopyOverrides\n): AgentGuiWorkbenchContributionCopy {\n return {\n ...agentGuiWorkbenchDefaultCopy,\n ...copy\n };\n}\n\nfunction createAgentGuiWorkbenchDockEntry(input: {\n agentDirectory: AgentGUIAgentDirectoryPort;\n icon: ReactNode;\n label: string;\n launchPayload?: Record<string, unknown>;\n order: number;\n provider: AgentGuiWorkbenchProvider;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId: string;\n visibility: WorkbenchHostDockEntry[\"visibility\"];\n}): WorkbenchHostDockEntry {\n return {\n icon: input.icon,\n iconSize: \"large\",\n id: agentGuiWorkbenchUnifiedDockEntryId(),\n label: input.label,\n launchBehavior: \"enabled\",\n launchPayload: input.launchPayload ?? { provider: input.provider },\n newWindowLaunchPayload: {\n ...(input.launchPayload ?? { provider: input.provider }),\n openInNewWindow: true\n },\n order: input.order,\n providePopupItemPreview: (item) =>\n input.renderPreview\n ? createAgentGuiWorkbenchPreviewContent({\n agentDirectory: input.agentDirectory,\n item,\n label: input.label,\n provider: input.provider,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle\n })\n : null,\n resolvePopupItem: ({ externalNodeState }) => {\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title =\n input.resolveDockPopupIdentity?.(state)?.title ??\n input.resolveDockPopupTitle?.(state) ??\n null;\n return {\n revision: `${input.provider}\\n${title ?? \"\"}`,\n title\n };\n },\n sectionId: input.sectionId,\n typeId: agentGuiWorkbenchTypeId,\n visibility: input.visibility\n };\n}\n\nfunction resolveAgentGuiUnifiedDockTileIconUrls(\n dockIconUrls: Partial<Record<AgentGuiWorkbenchProvider, string>> | undefined\n): readonly string[] {\n return agentGuiWorkbenchUnifiedDockTileProviders.map((provider) =>\n resolveAgentGuiWorkbenchProviderIconUrl({ dockIconUrls, provider })\n );\n}\n\nexport function resolveAgentGuiWorkbenchProviderIconUrl(input: {\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n provider: AgentGuiWorkbenchProvider;\n}): string {\n return (\n input.dockIconUrls?.[input.provider] ??\n agentGuiDockIconUrls[input.provider] ??\n \"\"\n );\n}\n\nfunction createAgentGuiWorkbenchLaunchpadStyleDockIcon(input: {\n tileIconUrls: readonly string[];\n}): ReactNode {\n return createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className: \"agent-gui-workbench-dock-icon\"\n },\n input.tileIconUrls.map((src, index) =>\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-dock-icon__tile\",\n key: `${src}:${index}`\n },\n createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src\n })\n )\n )\n );\n}\n\nfunction createAgentGuiWorkbenchUnifiedDockIcon(input: {\n iconUrl: string;\n}): ReactNode {\n return createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className:\n \"agent-gui-workbench-dock-icon agent-gui-workbench-dock-icon--single\"\n },\n createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src: input.iconUrl\n })\n );\n}\n\nexport function providerFromState(\n state: unknown\n): AgentGuiWorkbenchProvider | null {\n if (!state || typeof state !== \"object\") {\n return null;\n }\n const provider = (state as { provider?: unknown }).provider;\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function providerFromActivation(\n activation: unknown\n): AgentGuiWorkbenchProvider | null {\n if (!activation || typeof activation !== \"object\") {\n return null;\n }\n const payload = (activation as { payload?: unknown }).payload;\n return providerFromState(payload);\n}\n\nexport function resolveAgentGuiWorkbenchLaunchPayload(\n request: WorkbenchHostLaunchRequest,\n input: {\n agentDirectory: AgentGUIAgentDirectoryPort;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n }\n): unknown | null {\n if (hasAgentSessionId(request.payload)) {\n return request.payload;\n }\n const snapshot = input.agentDirectory.getSnapshot();\n const agents = normalizeAgentGUIAgents(snapshot.agents);\n const payload = isRecord(request.payload) ? request.payload : {};\n const isUnifiedDockLaunch =\n request.reason === \"dock\" &&\n agentGuiWorkbenchDockIdentityFromIdentifier(request.dockEntryId)?.kind ===\n \"unifiedAggregate\";\n const explicitAgentTargetId = isUnifiedDockLaunch\n ? null\n : readTrimmedString(payload.agentTargetId);\n if (explicitAgentTargetId) {\n const explicitAgent = agents.find(\n (agent) =>\n agent.agentTargetId === explicitAgentTargetId &&\n agent.availability.status === \"ready\"\n );\n if (\n !explicitAgent ||\n !isAgentGuiWorkbenchProvider(explicitAgent.provider)\n ) {\n return null;\n }\n return {\n ...payload,\n agentTargetId: explicitAgent.agentTargetId,\n provider: explicitAgent.provider\n };\n }\n const requestedProvider = providerFromState(payload);\n const resolved = resolveAgentGuiUnifiedDockLaunchPayload({\n agentDirectory: input.agentDirectory,\n defaultProvider: requestedProvider ?? input.defaultProvider,\n providerAvailability: input.providerAvailability\n });\n if (!resolved.agentTargetId) {\n return null;\n }\n return { ...payload, ...resolved };\n}\n\nfunction hasAgentSessionId(payload: unknown): boolean {\n if (!isRecord(payload)) {\n return false;\n }\n return readTrimmedString(payload.agentSessionId) !== null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readTrimmedString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction resolveUnifiedAgentGuiDockTarget(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): AgentGUIAgentTarget | null {\n const targets = projectAgentGUIAgentsToInternalTargets(\n normalizeAgentGUIAgents(input.agentDirectory.getSnapshot().agents)\n ).filter(\n (\n target\n ): target is AgentGUIAgentTarget & {\n provider: (typeof agentGuiWorkbenchDefaultDockProviders)[number];\n } =>\n isAgentGuiWorkbenchProvider(target.provider) &&\n isUnifiedAgentGuiDockProvider(target.provider) &&\n target.disabled !== true &&\n isAgentGuiProviderAvailable(target.provider, input.providerAvailability)\n );\n if (\n input.defaultProvider &&\n isUnifiedAgentGuiDockProvider(input.defaultProvider) &&\n isAgentGuiProviderAvailable(\n input.defaultProvider,\n input.providerAvailability\n )\n ) {\n const target = preferredAgentGuiDockTargetForProvider(\n targets,\n input.defaultProvider\n );\n if (target) {\n return target;\n }\n }\n\n return targets[0] ?? null;\n}\n\nfunction resolveUnifiedAgentGuiDockProvider(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): AgentGuiWorkbenchProvider {\n if (\n input.defaultProvider &&\n isUnifiedAgentGuiDockProvider(input.defaultProvider) &&\n isAgentGuiProviderAvailable(\n input.defaultProvider,\n input.providerAvailability\n )\n ) {\n return input.defaultProvider;\n }\n const target = resolveUnifiedAgentGuiDockTarget(input);\n if (target) {\n return target.provider;\n }\n return (\n agentGuiWorkbenchDefaultDockProviders.find((provider) =>\n isAgentGuiProviderAvailable(provider, input.providerAvailability)\n ) ?? \"codex\"\n );\n}\n\nfunction isUnifiedAgentGuiDockProvider(\n provider: AgentGuiWorkbenchProvider\n): provider is (typeof agentGuiWorkbenchDefaultDockProviders)[number] {\n return agentGuiWorkbenchDefaultDockProviders.includes(\n provider as (typeof agentGuiWorkbenchDefaultDockProviders)[number]\n );\n}\n\nfunction preferredAgentGuiDockTargetForProvider(\n targets: readonly AgentGUIAgentTarget[],\n provider: AgentGuiWorkbenchProvider\n): AgentGUIAgentTarget | null {\n const agentTargets = targets.filter((target) => target.provider === provider);\n return agentTargets[0] ?? null;\n}\n\nfunction isAgentGuiProviderAvailable(\n provider: AgentGuiWorkbenchProvider,\n availability: AgentGuiWorkbenchProviderAvailability | null | undefined\n): boolean {\n const value = availability?.[provider];\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value === \"ready\" || value === \"available\";\n }\n if (typeof value.available === \"boolean\") {\n return value.available;\n }\n return value.status === \"ready\" || value.status === \"available\";\n}\n\nexport function providerTargetLaunchPayloadFromRequest(\n payload: unknown,\n _expectedProvider: AgentGuiWorkbenchProvider\n): {\n agentTargetId: string | null;\n} {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return {\n agentTargetId: null\n };\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n const providerTargetId = (payload as { providerTargetId?: unknown })\n .providerTargetId;\n return {\n agentTargetId:\n typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : typeof providerTargetId === \"string\" && providerTargetId.trim()\n ? providerTargetId.trim()\n : null\n };\n}\n\nexport function createAgentGuiWorkbenchPreviewContent(input: {\n agentDirectory: AgentGUIAgentDirectoryPort;\n item: WorkbenchHostDockPopupItemInput;\n label?: string;\n provider?: AgentGuiWorkbenchProvider;\n renderPreview: NonNullable<\n CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"]\n >;\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n}): WorkbenchDockPreviewContent {\n const { externalNodeState, node } = input.item;\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title =\n input.resolveDockPopupIdentity?.(state)?.title ??\n input.resolveDockPopupTitle?.(state) ??\n node.title;\n const agentTargetId = state.agentTargetId?.trim() ?? \"\";\n const agent = input.agentDirectory\n .getSnapshot()\n .agents.find((candidate) => candidate.agentTargetId === agentTargetId);\n const provider = input.provider ?? agent?.provider ?? null;\n const label =\n input.label ??\n agent?.name ??\n (provider ? resolveAgentGuiWorkbenchProviderLabel(provider) : node.title);\n const lines = [label, state.lastActiveAgentSessionId].filter(\n (line): line is string => Boolean(line?.trim())\n );\n return {\n element: input.renderPreview(\n createAgentGuiWorkbenchPreviewBodyContext(input.item),\n {\n agentDirectory: input.agentDirectory,\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: () => undefined,\n agentTargetId: agentTargetId || null,\n provider\n }\n ),\n kind: \"component\",\n revision: `${agentTargetId}\\n${provider ?? \"\"}\\n${title}\\n${lines.join(\"\\n\")}`\n };\n}\n\nfunction createAgentGuiWorkbenchPreviewBodyContext(\n input: WorkbenchHostDockPopupItemInput\n): WorkbenchHostNodeBodyContext<AgentGuiWorkbenchState | null, unknown> {\n return {\n activation: null,\n displayMode: input.node.displayMode,\n externalNodeState: input.externalNodeState as AgentGuiWorkbenchState | null,\n externalWorkspaceState: input.externalWorkspaceState,\n focus: () => undefined,\n host: input.host,\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n isDragging: false,\n isFocused: false,\n isResizing: false,\n node: input.node,\n previewViewport: input.previewViewport,\n setNodeRuntimeState: () => undefined,\n setSnapshotNodeState: () => undefined\n };\n}\n"],"mappings":"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","names":["createElement","Button","Button","jsx","createElement","createElement","createElement","hasAgentSessionId"]}
|
|
@@ -6,14 +6,14 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
getOptionalAgentHostApi,
|
|
8
8
|
useOptionalAgentHostApi
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RXOGBOK6.js";
|
|
10
10
|
import {
|
|
11
11
|
managedAgentRoundedIconUrl
|
|
12
12
|
} from "./chunk-EDNJMG5T.js";
|
|
13
13
|
import {
|
|
14
14
|
translate,
|
|
15
15
|
useTranslation
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OWJ7Q2DJ.js";
|
|
17
17
|
import {
|
|
18
18
|
resolveAgentWorkspaceFileVisualKind
|
|
19
19
|
} from "./chunk-PJP5BUU6.js";
|
|
@@ -3723,10 +3723,11 @@ export {
|
|
|
3723
3723
|
resolveWorkspaceFilePathCandidate,
|
|
3724
3724
|
resolveWorkspaceFileLinkAction,
|
|
3725
3725
|
resolveWorkspaceLinkAction,
|
|
3726
|
+
blobToBase64,
|
|
3726
3727
|
ZoomableImage,
|
|
3727
3728
|
MessageSquareMoreIcon,
|
|
3728
3729
|
AgentGUIConversation_styles_default,
|
|
3729
3730
|
AgentMessageMarkdown,
|
|
3730
3731
|
CustomScrollArea
|
|
3731
3732
|
};
|
|
3732
|
-
//# sourceMappingURL=chunk-
|
|
3733
|
+
//# sourceMappingURL=chunk-MX2NPLCN.js.map
|