@anvia/studio 0.7.38 → 0.7.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/ui/assets/{agents-page-BdDnlVyJ.js → agents-page-DQSUqZIF.js} +2 -2
  2. package/dist/ui/assets/{agents-page-BdDnlVyJ.js.map → agents-page-DQSUqZIF.js.map} +1 -1
  3. package/dist/ui/assets/{badge-CeTBFuRX.js → badge-DFrH2vyb.js} +1 -1
  4. package/dist/ui/assets/{badge-CeTBFuRX.js.map → badge-DFrH2vyb.js.map} +1 -1
  5. package/dist/ui/assets/{chunk-HU55YP24-CBgJL7lU.js → chunk-TIV3WFSR-BCFNcVBW.js} +1 -1
  6. package/dist/ui/assets/{chunk-HU55YP24-CBgJL7lU.js.map → chunk-TIV3WFSR-BCFNcVBW.js.map} +1 -1
  7. package/dist/ui/assets/evals-page-TgqTalZG.js +2 -0
  8. package/dist/ui/assets/{evals-page-BmTgQBv0.js.map → evals-page-TgqTalZG.js.map} +1 -1
  9. package/dist/ui/assets/index-CaB9mtgz.js +56 -0
  10. package/dist/ui/assets/index-CaB9mtgz.js.map +1 -0
  11. package/dist/ui/assets/knowledge-page-G2p0MC9Q.js +2 -0
  12. package/dist/ui/assets/{knowledge-page-DslSMRHu.js.map → knowledge-page-G2p0MC9Q.js.map} +1 -1
  13. package/dist/ui/assets/{mcps-page-BXjUENcS.js → mcps-page-BTofFyB1.js} +2 -2
  14. package/dist/ui/assets/{mcps-page-BXjUENcS.js.map → mcps-page-BTofFyB1.js.map} +1 -1
  15. package/dist/ui/assets/{memory-page-DAsgFJT2.js → memory-page-Dyv23uzY.js} +2 -2
  16. package/dist/ui/assets/{memory-page-DAsgFJT2.js.map → memory-page-Dyv23uzY.js.map} +1 -1
  17. package/dist/ui/assets/{pipelines-page-DtxX27Jz.css → pipelines-page-DLioOiRN.css} +1 -1
  18. package/dist/ui/assets/pipelines-page-DdItgiZv.js +8 -0
  19. package/dist/ui/assets/pipelines-page-DdItgiZv.js.map +1 -0
  20. package/dist/ui/assets/renderers-Cr02ATaq.js +93 -0
  21. package/dist/ui/assets/renderers-Cr02ATaq.js.map +1 -0
  22. package/dist/ui/assets/sandboxes-page-DqkqS92e.js +2 -0
  23. package/dist/ui/assets/sandboxes-page-DqkqS92e.js.map +1 -0
  24. package/dist/ui/assets/sessions-page-kJcWll7-.js +2 -0
  25. package/dist/ui/assets/sessions-page-kJcWll7-.js.map +1 -0
  26. package/dist/ui/assets/{status-page-BjcUSlw5.js → status-page-RKMaWBCx.js} +2 -2
  27. package/dist/ui/assets/{status-page-BjcUSlw5.js.map → status-page-RKMaWBCx.js.map} +1 -1
  28. package/dist/ui/assets/{tool-runner-MaS0O-R0.js → tool-runner-9bssZrO4.js} +2 -2
  29. package/dist/ui/assets/{tool-runner-MaS0O-R0.js.map → tool-runner-9bssZrO4.js.map} +1 -1
  30. package/dist/ui/assets/{tools-page-owaTKYO7.js → tools-page-Mu5-Dl6L.js} +2 -2
  31. package/dist/ui/assets/{tools-page-owaTKYO7.js.map → tools-page-Mu5-Dl6L.js.map} +1 -1
  32. package/dist/ui/assets/trace-browser-BT1WTtkX.js +10 -0
  33. package/dist/ui/assets/trace-browser-BT1WTtkX.js.map +1 -0
  34. package/dist/ui/assets/transcript-item-B0HTdQVL.js +3 -0
  35. package/dist/ui/assets/transcript-item-B0HTdQVL.js.map +1 -0
  36. package/dist/ui/index.html +2 -2
  37. package/package.json +15 -15
  38. package/dist/ui/assets/PathIcon-B7p7vF2d.js +0 -2
  39. package/dist/ui/assets/PathIcon-B7p7vF2d.js.map +0 -1
  40. package/dist/ui/assets/PlayIcon-Dt2gGfiW.js +0 -2
  41. package/dist/ui/assets/PlayIcon-Dt2gGfiW.js.map +0 -1
  42. package/dist/ui/assets/RefreshIcon-BOrxG7tt.js +0 -2
  43. package/dist/ui/assets/RefreshIcon-BOrxG7tt.js.map +0 -1
  44. package/dist/ui/assets/evals-page-BmTgQBv0.js +0 -2
  45. package/dist/ui/assets/index-CVaGs3Mg.js +0 -56
  46. package/dist/ui/assets/index-CVaGs3Mg.js.map +0 -1
  47. package/dist/ui/assets/knowledge-page-DslSMRHu.js +0 -2
  48. package/dist/ui/assets/pipelines-page-DPfbYugP.js +0 -8
  49. package/dist/ui/assets/pipelines-page-DPfbYugP.js.map +0 -1
  50. package/dist/ui/assets/renderers-Cvw2zSQ7.js +0 -85
  51. package/dist/ui/assets/renderers-Cvw2zSQ7.js.map +0 -1
  52. package/dist/ui/assets/sandboxes-page-D4OaKCZP.js +0 -2
  53. package/dist/ui/assets/sandboxes-page-D4OaKCZP.js.map +0 -1
  54. package/dist/ui/assets/sessions-page-CczZ85AR.js +0 -2
  55. package/dist/ui/assets/sessions-page-CczZ85AR.js.map +0 -1
  56. package/dist/ui/assets/trace-browser-BxEFkW7o.js +0 -10
  57. package/dist/ui/assets/trace-browser-BxEFkW7o.js.map +0 -1
  58. package/dist/ui/assets/transcript-item-CNHIhoYq.js +0 -3
  59. package/dist/ui/assets/transcript-item-CNHIhoYq.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tool-runner-MaS0O-R0.js","names":[],"sources":["../../../src/ui/app/components/ui/input.tsx","../../../src/ui/app/modules/tools/schema-argument-editor.tsx","../../../src/ui/app/modules/tools/tool-runner.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n className={cn(\n \"h-9 w-full rounded-lg border border-input bg-card/90 px-3 text-foreground outline-none transition duration-200 placeholder:text-muted-foreground/65 focus:border-muted-foreground/60 focus:ring-2 focus:ring-muted-foreground/20\",\n className,\n )}\n {...props}\n />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/ui/button\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { isRecord } from \"../shared/object\";\n\ntype ArgumentMode = \"form\" | \"json\";\ntype JsonPath = Array<string | number>;\ntype ParseResult = { ok: true; value: unknown } | { ok: false; error: string };\n\nexport function SchemaArgumentEditor(props: {\n schema: unknown;\n value: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n}) {\n const [mode, setMode] = useState<ArgumentMode>(\"form\");\n const rootFields = useMemo(() => schemaFields(props.schema), [props.schema]);\n const parsed = useMemo(() => parseJson(props.value), [props.value]);\n const disabled = props.disabled === true;\n const canRenderForm = rootFields.length > 0;\n const effectiveMode = canRenderForm ? mode : \"json\";\n const rootValue = parsed.ok && isRecord(parsed.value) ? parsed.value : undefined;\n\n function updatePath(path: JsonPath, value: unknown | undefined) {\n const base = rootValue ?? {};\n props.onChange(formatEditorJson(setValueAtPath(base, path, value)));\n }\n\n function removePathItem(path: JsonPath, index: number) {\n const base = rootValue ?? {};\n const arrayValue = getValueAtPath(base, path);\n if (!Array.isArray(arrayValue)) {\n return;\n }\n props.onChange(\n formatEditorJson(\n setValueAtPath(\n base,\n path,\n arrayValue.filter((_, itemIndex) => itemIndex !== index),\n ),\n ),\n );\n }\n\n return (\n <div className=\"grid min-w-0 gap-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Arguments\n </span>\n {canRenderForm ? (\n <div className=\"inline-grid h-8 grid-cols-2 overflow-hidden rounded-md border border-border/80 bg-background/45 p-0.5\">\n <ModeButton active={effectiveMode === \"form\"} onClick={() => setMode(\"form\")}>\n Form\n </ModeButton>\n <ModeButton active={effectiveMode === \"json\"} onClick={() => setMode(\"json\")}>\n JSON\n </ModeButton>\n </div>\n ) : (\n <span className=\"text-xs font-medium text-muted-foreground\">JSON</span>\n )}\n </div>\n\n {effectiveMode === \"json\" || rootValue === undefined ? (\n <RawJsonEditor\n disabled={disabled}\n error={parsed.ok ? \"\" : parsed.error}\n value={props.value}\n onChange={props.onChange}\n />\n ) : (\n <div className=\"grid gap-3\">\n {rootFields.map((field) => (\n <SchemaField\n disabled={disabled}\n field={field}\n key={field.name}\n path={[field.name]}\n rootValue={rootValue}\n onChange={updatePath}\n onRemoveArrayItem={removePathItem}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ModeButton(props: { active: boolean; children: string; onClick: () => void }) {\n return (\n <button\n className={\n props.active\n ? \"rounded-[5px] bg-muted/55 px-3 text-xs font-semibold text-foreground\"\n : \"rounded-[5px] px-3 text-xs font-medium text-muted-foreground transition hover:text-foreground\"\n }\n type=\"button\"\n onClick={props.onClick}\n >\n {props.children}\n </button>\n );\n}\n\nfunction RawJsonEditor(props: {\n value: string;\n error: string;\n disabled: boolean;\n onChange: (value: string) => void;\n}) {\n return (\n <div className=\"grid gap-2\">\n <Textarea\n className=\"min-h-36 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5\"\n disabled={props.disabled}\n value={props.value}\n spellCheck={false}\n onChange={(event) => props.onChange(event.target.value)}\n />\n {props.error.length === 0 ? null : (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {props.error}\n </div>\n )}\n </div>\n );\n}\n\ntype SchemaFieldDefinition = {\n name: string;\n schema: Record<string, unknown>;\n required: boolean;\n};\n\nfunction SchemaField(props: {\n field: SchemaFieldDefinition;\n path: JsonPath;\n rootValue: Record<string, unknown>;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n onRemoveArrayItem: (path: JsonPath, index: number) => void;\n}) {\n const value = getValueAtPath(props.rootValue, props.path);\n const label = schemaLabel(props.field.schema, props.field.name);\n const description = schemaDescription(props.field.schema);\n const type = schemaPrimaryType(props.field.schema);\n\n if (type === \"object\") {\n const fields = schemaFields(props.field.schema);\n return (\n <fieldset className=\"grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <legend className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {label}\n </legend>\n {props.field.required ? <RequiredBadge /> : null}\n </div>\n {description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{description}</p>\n )}\n {fields.length === 0 ? (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={value}\n onChange={props.onChange}\n />\n ) : (\n <div className=\"grid gap-3 border-l border-border/70 pl-3\">\n {fields.map((field) => (\n <SchemaField\n disabled={props.disabled}\n field={field}\n key={field.name}\n path={[...props.path, field.name]}\n rootValue={props.rootValue}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n ))}\n </div>\n )}\n </fieldset>\n );\n }\n\n if (type === \"array\") {\n return (\n <ArrayField\n description={description}\n disabled={props.disabled}\n field={props.field}\n label={label}\n path={props.path}\n rootValue={props.rootValue}\n value={value}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n );\n }\n\n return (\n <div className=\"grid min-w-0 gap-2 border-b border-border/70 pb-3 last:border-b-0\">\n <FieldHeader label={label} required={props.field.required} />\n {description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{description}</p>\n )}\n <ScalarFieldControl\n disabled={props.disabled}\n path={props.path}\n required={props.field.required}\n schema={props.field.schema}\n value={value}\n onChange={props.onChange}\n />\n </div>\n );\n}\n\nfunction ArrayField(props: {\n field: SchemaFieldDefinition;\n label: string;\n description: string | undefined;\n path: JsonPath;\n rootValue: Record<string, unknown>;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n onRemoveArrayItem: (path: JsonPath, index: number) => void;\n}) {\n const itemSchema = schemaItems(props.field.schema);\n const items = Array.isArray(props.value) ? props.value : [];\n const itemEntries = items.map((item, index) => ({\n index,\n key: `${formatPath(props.path)}:${index}:${formatEnumValue(item)}`,\n }));\n return (\n <div className=\"grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <FieldHeader label={props.label} required={props.field.required} />\n {itemSchema === undefined ? null : (\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"secondary\"\n onClick={() =>\n props.onChange(props.path, [...items, defaultValueForSchema(itemSchema)])\n }\n >\n Add\n </Button>\n )}\n </div>\n {props.description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{props.description}</p>\n )}\n {itemSchema === undefined ? (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={props.value}\n onChange={props.onChange}\n />\n ) : items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border/70 px-3 py-2 text-xs text-muted-foreground\">\n Empty array\n </div>\n ) : (\n <div className=\"grid gap-3 border-l border-border/70 pl-3\">\n {itemEntries.map((item) => (\n <div className=\"grid gap-2\" key={item.key}>\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Item {item.index + 1}\n </span>\n <Button\n className=\"h-7 min-h-7 rounded-md px-2 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onRemoveArrayItem(props.path, item.index)}\n >\n Remove\n </Button>\n </div>\n <SchemaField\n disabled={props.disabled}\n field={{\n name: String(item.index + 1),\n required: true,\n schema: itemSchema,\n }}\n path={[...props.path, item.index]}\n rootValue={props.rootValue}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction FieldHeader(props: { label: string; required: boolean }) {\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">{props.label}</span>\n {props.required ? <RequiredBadge /> : null}\n </div>\n );\n}\n\nfunction RequiredBadge() {\n return (\n <span className=\"rounded-md bg-muted/35 px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n required\n </span>\n );\n}\n\nfunction ScalarFieldControl(props: {\n schema: Record<string, unknown>;\n path: JsonPath;\n value: unknown;\n required: boolean;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const enumOptions = schemaEnum(props.schema);\n if (enumOptions.length > 0) {\n const selectedIndex = enumOptions.findIndex((option) => jsonEqual(option, props.value));\n const optionEntries = enumOptions.map((option, index) => ({\n label: formatEnumValue(option),\n value: String(index),\n key: `${index}:${formatEnumValue(option)}`,\n }));\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n <Select\n value={selectedIndex === -1 ? \"\" : String(selectedIndex)}\n disabled={props.disabled}\n onValueChange={(value) => props.onChange(props.path, enumOptions[Number(value)])}\n >\n <SelectTrigger className=\"h-9 min-h-9 rounded-md border-border bg-background/45 text-sm\">\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n {optionEntries.map((option) => (\n <SelectItem value={option.value} key={option.key}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedIndex === -1 || props.required ? null : (\n <Button\n className=\"h-9 min-h-9 rounded-md px-3 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onChange(props.path, undefined)}\n >\n Clear\n </Button>\n )}\n </div>\n );\n }\n\n const type = schemaPrimaryType(props.schema);\n if (type === \"boolean\") {\n return (\n <label className=\"flex min-h-9 w-fit cursor-pointer items-center gap-2 rounded-md border border-border/70 bg-background/45 px-3 text-sm text-foreground\">\n <input\n checked={props.value === true}\n disabled={props.disabled}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-foreground\"\n onChange={(event) => props.onChange(props.path, event.target.checked)}\n />\n Enabled\n </label>\n );\n }\n\n if (type === \"number\" || type === \"integer\") {\n return (\n <NumberFieldControl\n disabled={props.disabled}\n path={props.path}\n schema={props.schema}\n type={type}\n value={props.value}\n onChange={props.onChange}\n />\n );\n }\n\n if (type === \"string\") {\n return (\n <Input\n className=\"h-9 rounded-md border-border bg-background/45 text-sm\"\n disabled={props.disabled}\n type=\"text\"\n value={typeof props.value === \"string\" ? props.value : \"\"}\n placeholder={schemaDefaultPlaceholder(props.schema)}\n onChange={(event) => {\n const nextValue = event.target.value;\n props.onChange(\n props.path,\n nextValue.length === 0 && !props.required ? undefined : nextValue,\n );\n }}\n />\n );\n }\n\n return (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={props.value}\n onChange={props.onChange}\n />\n );\n}\n\nfunction NumberFieldControl(props: {\n schema: Record<string, unknown>;\n type: \"number\" | \"integer\";\n path: JsonPath;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const externalValue = typeof props.value === \"number\" ? String(props.value) : \"\";\n const [draft, setDraft] = useState(externalValue);\n\n useEffect(() => {\n setDraft(externalValue);\n }, [externalValue]);\n\n return (\n <Input\n className=\"h-9 rounded-md border-border bg-background/45 text-sm\"\n disabled={props.disabled}\n inputMode={props.type === \"integer\" ? \"numeric\" : \"decimal\"}\n type=\"text\"\n value={draft}\n placeholder={schemaDefaultPlaceholder(props.schema)}\n onBlur={() => {\n if (draft.trim().length === 0) {\n setDraft(\"\");\n return;\n }\n const nextValue = parseNumberDraft(draft, props.type);\n setDraft(nextValue.ok ? String(nextValue.value) : externalValue);\n }}\n onChange={(event) => {\n const nextDraft = event.target.value;\n setDraft(nextDraft);\n if (nextDraft.trim().length === 0) {\n props.onChange(props.path, undefined);\n return;\n }\n const nextValue = parseNumberDraft(nextDraft, props.type);\n if (nextValue.ok) {\n props.onChange(props.path, nextValue.value);\n }\n }}\n />\n );\n}\n\nfunction JsonValueField(props: {\n path: JsonPath;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const externalValue = useMemo(() => fieldJsonValue(props.value), [props.value]);\n const [draft, setDraft] = useState(externalValue);\n const parsed = useMemo(() => parseJson(draft), [draft]);\n\n useEffect(() => {\n setDraft(externalValue);\n }, [externalValue]);\n\n return (\n <div className=\"grid gap-2\">\n <Textarea\n className=\"min-h-24 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5\"\n disabled={props.disabled}\n value={draft}\n spellCheck={false}\n onChange={(event) => {\n const nextDraft = event.target.value;\n setDraft(nextDraft);\n if (nextDraft.trim().length === 0) {\n props.onChange(props.path, undefined);\n return;\n }\n const nextValue = parseJson(nextDraft);\n if (nextValue.ok) {\n props.onChange(props.path, nextValue.value);\n }\n }}\n />\n {parsed.ok || draft.trim().length === 0 ? null : (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {parsed.error}\n </div>\n )}\n </div>\n );\n}\n\nfunction schemaFields(schema: unknown): SchemaFieldDefinition[] {\n if (!isRecord(schema)) {\n return [];\n }\n const properties = schema.properties;\n if (!isRecord(properties)) {\n return [];\n }\n const required = schemaRequired(schema);\n return Object.entries(properties).map(([name, propertySchema]) => ({\n name,\n required: required.has(name),\n schema: isRecord(propertySchema) ? propertySchema : {},\n }));\n}\n\nfunction schemaRequired(schema: Record<string, unknown>): Set<string> {\n const required = schema.required;\n if (!Array.isArray(required)) {\n return new Set();\n }\n return new Set(required.filter((item): item is string => typeof item === \"string\"));\n}\n\nfunction schemaPrimaryType(schema: Record<string, unknown>): string {\n const type = schema.type;\n if (typeof type === \"string\") {\n return type;\n }\n if (Array.isArray(type)) {\n const firstType = type.find(\n (item): item is string => typeof item === \"string\" && item !== \"null\",\n );\n if (firstType !== undefined) {\n return firstType;\n }\n }\n if (schemaEnum(schema).length > 0) {\n return \"enum\";\n }\n if (isRecord(schema.properties)) {\n return \"object\";\n }\n if (schema.items !== undefined) {\n return \"array\";\n }\n return \"unknown\";\n}\n\nfunction schemaItems(schema: Record<string, unknown>): Record<string, unknown> | undefined {\n return isRecord(schema.items) ? schema.items : undefined;\n}\n\nfunction schemaEnum(schema: Record<string, unknown>): unknown[] {\n return Array.isArray(schema.enum) ? schema.enum : [];\n}\n\nfunction schemaLabel(schema: Record<string, unknown>, fallback: string): string {\n return typeof schema.title === \"string\" && schema.title.length > 0\n ? schema.title\n : formatFieldName(fallback);\n}\n\nfunction schemaDescription(schema: Record<string, unknown>): string | undefined {\n return typeof schema.description === \"string\" && schema.description.length > 0\n ? schema.description\n : undefined;\n}\n\nfunction schemaDefaultPlaceholder(schema: Record<string, unknown>): string | undefined {\n return Object.hasOwn(schema, \"default\") ? formatEnumValue(schema.default) : undefined;\n}\n\nfunction defaultValueForSchema(schema: Record<string, unknown>): unknown {\n if (Object.hasOwn(schema, \"default\")) {\n return schema.default;\n }\n const enumOptions = schemaEnum(schema);\n if (enumOptions.length > 0) {\n return enumOptions[0];\n }\n const type = schemaPrimaryType(schema);\n if (type === \"boolean\") {\n return false;\n }\n if (type === \"integer\" || type === \"number\") {\n return 0;\n }\n if (type === \"array\") {\n return [];\n }\n if (type === \"object\") {\n return {};\n }\n if (type === \"string\") {\n return \"\";\n }\n return null;\n}\n\nfunction getValueAtPath(root: unknown, path: JsonPath): unknown {\n let current = root;\n for (const segment of path) {\n if (typeof segment === \"number\") {\n if (!Array.isArray(current)) {\n return undefined;\n }\n current = current[segment];\n continue;\n }\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction setValueAtPath(root: unknown, path: JsonPath, value: unknown | undefined): unknown {\n if (path.length === 0) {\n return value;\n }\n const [segment, ...rest] = path;\n const nextRoot = Array.isArray(root) ? [...root] : isRecord(root) ? { ...root } : {};\n if (rest.length === 0) {\n if (value === undefined) {\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot.splice(segment, 1);\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n delete nextRoot[segment];\n }\n return nextRoot;\n }\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot[segment] = value;\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n nextRoot[segment] = value;\n }\n return nextRoot;\n }\n const currentValue =\n Array.isArray(nextRoot) && typeof segment === \"number\"\n ? nextRoot[segment]\n : !Array.isArray(nextRoot) && typeof segment === \"string\"\n ? nextRoot[segment]\n : undefined;\n const nextValue = setValueAtPath(currentValue, rest, value);\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot[segment] = nextValue;\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n nextRoot[segment] = nextValue;\n }\n return nextRoot;\n}\n\nfunction parseJson(value: string): ParseResult {\n if (value.trim().length === 0) {\n return { ok: true, value: undefined };\n }\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\ntype NumberParseResult = { ok: true; value: number } | { ok: false };\n\nfunction parseNumberDraft(value: string, type: \"number\" | \"integer\"): NumberParseResult {\n const normalized = value.trim();\n if (normalized.length === 0 || isIncompleteNumberDraft(normalized)) {\n return { ok: false };\n }\n const parsed = Number(normalized);\n if (!Number.isFinite(parsed)) {\n return { ok: false };\n }\n if (type === \"integer\" && !Number.isInteger(parsed)) {\n return { ok: false };\n }\n return { ok: true, value: parsed };\n}\n\nfunction isIncompleteNumberDraft(value: string): boolean {\n return (\n value === \"-\" ||\n value === \"+\" ||\n value === \".\" ||\n value === \"-.\" ||\n value === \"+.\" ||\n /^[+-]?\\d+\\.$/.test(value) ||\n /[eE][+-]?$/.test(value)\n );\n}\n\nfunction fieldJsonValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n return formatEditorJson(value);\n}\n\nfunction formatEditorJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction formatEnumValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value === null) {\n return \"null\";\n }\n return JSON.stringify(value);\n}\n\nfunction formatPath(path: JsonPath): string {\n return path.join(\".\");\n}\n\nfunction formatFieldName(value: string): string {\n return value\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n","import type { ReactNode } from \"react\";\nimport type { StudioAgentToolMetadata, StudioToolRunResponse } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { parseToolDisplayValue } from \"../shared/format\";\nimport { isRecord } from \"../shared/object\";\nimport { JsonSyntax } from \"../shared/renderers\";\nimport { SchemaArgumentEditor } from \"./schema-argument-editor\";\n\nexport type ToolRunState = \"idle\" | \"running\";\n\nexport function ToolRunner(props: {\n selectedTool: StudioAgentToolMetadata | undefined;\n argsText: string;\n runState: ToolRunState;\n runError: string;\n runResponse: StudioToolRunResponse | undefined;\n onArgsTextChange: (value: string) => void;\n onRun: () => void;\n}) {\n const propertyCount =\n props.selectedTool === undefined ? 0 : schemaPropertyCount(props.selectedTool.parameters);\n return (\n <section className=\"grid gap-4 border-t border-border/80 pt-4 xl:grid-cols-[minmax(260px,0.42fr)_minmax(0,1fr)]\">\n <div className=\"grid content-start gap-3\">\n <div className=\"grid gap-1.5\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">Runner</h2>\n {props.selectedTool === undefined ? (\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">No tool selected</p>\n ) : (\n <>\n <p className=\"m-0 break-all text-sm font-semibold leading-6 text-foreground\">\n {props.selectedTool.name}\n </p>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {props.selectedTool.description}\n </p>\n </>\n )}\n </div>\n {props.selectedTool === undefined ? null : (\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <Badge className={originBadgeClass(props.selectedTool)}>\n {toolOriginLabel(props.selectedTool)}\n </Badge>\n <Badge className={approvalBadgeClass(props.selectedTool.approval.required)}>\n approval {props.selectedTool.approval.required ? \"required\" : \"none\"}\n </Badge>\n <ToolMetaPill>\n {propertyCount} {propertyCount === 1 ? \"field\" : \"fields\"}\n </ToolMetaPill>\n </div>\n )}\n {props.selectedTool?.approval.reason === undefined ? null : (\n <p className=\"m-0 border-l border-border/80 pl-3 text-xs leading-5 text-muted-foreground\">\n {props.selectedTool.approval.reason}\n </p>\n )}\n </div>\n <div className=\"grid min-w-0 gap-3\">\n <SchemaArgumentEditor\n disabled={props.selectedTool === undefined}\n schema={props.selectedTool?.parameters}\n value={props.argsText}\n onChange={props.onArgsTextChange}\n />\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-xs text-muted-foreground\">\n Arguments must be valid JSON.\n </span>\n <Button\n className=\"h-8 min-h-8 rounded-md px-4 text-xs\"\n type=\"button\"\n disabled={props.runState === \"running\" || props.selectedTool === undefined}\n onClick={props.onRun}\n >\n {props.runState === \"running\" ? \"Running\" : \"Run\"}\n </Button>\n </div>\n {props.runError.length > 0 ? (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {props.runError}\n </div>\n ) : null}\n {props.selectedTool === undefined ? null : (\n <details className=\"group border-t border-border/70 pt-3\">\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Parameter schema\n <span className=\"font-medium normal-case tracking-normal\">\n {schemaType(props.selectedTool.parameters)}\n </span>\n </summary>\n <div className=\"mt-3\">\n <SchemaBlock value={props.selectedTool.parameters} title=\"JSON schema\" />\n </div>\n </details>\n )}\n {props.runResponse === undefined ? null : <ToolRunResult response={props.runResponse} />}\n </div>\n </section>\n );\n}\n\nfunction ToolRunResult(props: { response: StudioToolRunResponse }) {\n const hasResult = Object.hasOwn(props.response, \"result\");\n const primaryValue = hasResult ? props.response.result : props.response.error;\n const title = hasResult ? \"Tool result\" : \"Tool error\";\n\n return (\n <div className=\"grid gap-3\">\n <SchemaBlock value={displayToolRunValue(primaryValue)} title={title} />\n <details className=\"group border-t border-border/70 pt-3\">\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Raw run response\n <span className=\"font-medium normal-case tracking-normal\">\n {props.response.status} / {props.response.durationMs}ms\n </span>\n </summary>\n <div className=\"mt-3\">\n <SchemaBlock value={props.response} title=\"Studio envelope\" />\n </div>\n </details>\n </div>\n );\n}\n\nexport function SchemaBlock(props: { value: unknown; title: string }) {\n return (\n <section className=\"grid min-w-0 content-start overflow-hidden rounded-lg bg-background/45\">\n <div className=\"flex min-h-9 items-center justify-between gap-3 bg-muted/20 px-4\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n {props.title}\n </span>\n <span className=\" text-xs text-muted-foreground\">{schemaType(props.value)}</span>\n </div>\n <div className=\"min-w-0 overflow-x-auto\">\n <pre className=\"m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={formatSchema(props.value)} />\n </code>\n </pre>\n </div>\n </section>\n );\n}\n\nexport function ToolMetaPill(props: { children: ReactNode }) {\n return (\n <span className=\"inline-flex min-h-7 items-center rounded-md bg-muted/25 px-2.5 text-xs font-medium text-muted-foreground\">\n {props.children}\n </span>\n );\n}\n\nexport function approvalBadgeClass(required: boolean): string {\n return required\n ? \"border-border/80 bg-muted/35 text-foreground\"\n : \"border-transparent bg-transparent text-muted-foreground/60\";\n}\n\nexport function sourceBadgeClass(source: \"static\" | \"dynamic\"): string {\n return source === \"dynamic\"\n ? \"border-border/80 bg-muted/45 text-foreground\"\n : \"border-border/80 bg-muted/55 text-muted-foreground\";\n}\n\nexport function originBadgeClass(tool: StudioAgentToolMetadata): string {\n return tool.mcpServerName === undefined\n ? sourceBadgeClass(tool.source)\n : \"border-border/80 bg-muted/35 text-foreground\";\n}\n\nexport function toolOriginLabel(tool: StudioAgentToolMetadata): string {\n return tool.mcpServerName === undefined ? tool.source : `MCP / ${tool.mcpServerName}`;\n}\n\nexport function schemaType(value: unknown): string {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return \"value\";\n }\n const type = (value as { type?: unknown }).type;\n return typeof type === \"string\" ? type : \"object\";\n}\n\nexport function schemaPropertyCount(value: unknown): number {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return 0;\n }\n const properties = (value as { properties?: unknown }).properties;\n return typeof properties === \"object\" && properties !== null && !Array.isArray(properties)\n ? Object.keys(properties).length\n : 0;\n}\n\nexport function formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function parseStudioToolRunResponse(value: unknown): StudioToolRunResponse | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n if (typeof value.agentId !== \"string\" || value.agentId.length === 0) {\n return undefined;\n }\n if (typeof value.toolName !== \"string\" || value.toolName.length === 0) {\n return undefined;\n }\n if (value.status !== \"success\" && value.status !== \"error\") {\n return undefined;\n }\n if (typeof value.durationMs !== \"number\" || !Number.isFinite(value.durationMs)) {\n return undefined;\n }\n if (typeof value.startedAt !== \"string\" || typeof value.endedAt !== \"string\") {\n return undefined;\n }\n if (!Array.isArray(value.events)) {\n return undefined;\n }\n return value as StudioToolRunResponse;\n}\n\nfunction displayToolRunValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const parsed = parseToolDisplayValue(value);\n return parsed.kind === \"json\" ? parsed.value : value;\n}\n\nfunction formatSchema(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tool-runner-9bssZrO4.js","names":[],"sources":["../../../src/ui/app/components/ui/input.tsx","../../../src/ui/app/modules/tools/schema-argument-editor.tsx","../../../src/ui/app/modules/tools/tool-runner.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n className={cn(\n \"h-9 w-full rounded-lg border border-input bg-card/90 px-3 text-foreground outline-none transition duration-200 placeholder:text-muted-foreground/65 focus:border-muted-foreground/60 focus:ring-2 focus:ring-muted-foreground/20\",\n className,\n )}\n {...props}\n />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/ui/button\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { isRecord } from \"../shared/object\";\n\ntype ArgumentMode = \"form\" | \"json\";\ntype JsonPath = Array<string | number>;\ntype ParseResult = { ok: true; value: unknown } | { ok: false; error: string };\n\nexport function SchemaArgumentEditor(props: {\n schema: unknown;\n value: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n}) {\n const [mode, setMode] = useState<ArgumentMode>(\"form\");\n const rootFields = useMemo(() => schemaFields(props.schema), [props.schema]);\n const parsed = useMemo(() => parseJson(props.value), [props.value]);\n const disabled = props.disabled === true;\n const canRenderForm = rootFields.length > 0;\n const effectiveMode = canRenderForm ? mode : \"json\";\n const rootValue = parsed.ok && isRecord(parsed.value) ? parsed.value : undefined;\n\n function updatePath(path: JsonPath, value: unknown | undefined) {\n const base = rootValue ?? {};\n props.onChange(formatEditorJson(setValueAtPath(base, path, value)));\n }\n\n function removePathItem(path: JsonPath, index: number) {\n const base = rootValue ?? {};\n const arrayValue = getValueAtPath(base, path);\n if (!Array.isArray(arrayValue)) {\n return;\n }\n props.onChange(\n formatEditorJson(\n setValueAtPath(\n base,\n path,\n arrayValue.filter((_, itemIndex) => itemIndex !== index),\n ),\n ),\n );\n }\n\n return (\n <div className=\"grid min-w-0 gap-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Arguments\n </span>\n {canRenderForm ? (\n <div className=\"inline-grid h-8 grid-cols-2 overflow-hidden rounded-md border border-border/80 bg-background/45 p-0.5\">\n <ModeButton active={effectiveMode === \"form\"} onClick={() => setMode(\"form\")}>\n Form\n </ModeButton>\n <ModeButton active={effectiveMode === \"json\"} onClick={() => setMode(\"json\")}>\n JSON\n </ModeButton>\n </div>\n ) : (\n <span className=\"text-xs font-medium text-muted-foreground\">JSON</span>\n )}\n </div>\n\n {effectiveMode === \"json\" || rootValue === undefined ? (\n <RawJsonEditor\n disabled={disabled}\n error={parsed.ok ? \"\" : parsed.error}\n value={props.value}\n onChange={props.onChange}\n />\n ) : (\n <div className=\"grid gap-3\">\n {rootFields.map((field) => (\n <SchemaField\n disabled={disabled}\n field={field}\n key={field.name}\n path={[field.name]}\n rootValue={rootValue}\n onChange={updatePath}\n onRemoveArrayItem={removePathItem}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ModeButton(props: { active: boolean; children: string; onClick: () => void }) {\n return (\n <button\n className={\n props.active\n ? \"rounded-[5px] bg-muted/55 px-3 text-xs font-semibold text-foreground\"\n : \"rounded-[5px] px-3 text-xs font-medium text-muted-foreground transition hover:text-foreground\"\n }\n type=\"button\"\n onClick={props.onClick}\n >\n {props.children}\n </button>\n );\n}\n\nfunction RawJsonEditor(props: {\n value: string;\n error: string;\n disabled: boolean;\n onChange: (value: string) => void;\n}) {\n return (\n <div className=\"grid gap-2\">\n <Textarea\n className=\"min-h-36 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5\"\n disabled={props.disabled}\n value={props.value}\n spellCheck={false}\n onChange={(event) => props.onChange(event.target.value)}\n />\n {props.error.length === 0 ? null : (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {props.error}\n </div>\n )}\n </div>\n );\n}\n\ntype SchemaFieldDefinition = {\n name: string;\n schema: Record<string, unknown>;\n required: boolean;\n};\n\nfunction SchemaField(props: {\n field: SchemaFieldDefinition;\n path: JsonPath;\n rootValue: Record<string, unknown>;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n onRemoveArrayItem: (path: JsonPath, index: number) => void;\n}) {\n const value = getValueAtPath(props.rootValue, props.path);\n const label = schemaLabel(props.field.schema, props.field.name);\n const description = schemaDescription(props.field.schema);\n const type = schemaPrimaryType(props.field.schema);\n\n if (type === \"object\") {\n const fields = schemaFields(props.field.schema);\n return (\n <fieldset className=\"grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <legend className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {label}\n </legend>\n {props.field.required ? <RequiredBadge /> : null}\n </div>\n {description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{description}</p>\n )}\n {fields.length === 0 ? (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={value}\n onChange={props.onChange}\n />\n ) : (\n <div className=\"grid gap-3 border-l border-border/70 pl-3\">\n {fields.map((field) => (\n <SchemaField\n disabled={props.disabled}\n field={field}\n key={field.name}\n path={[...props.path, field.name]}\n rootValue={props.rootValue}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n ))}\n </div>\n )}\n </fieldset>\n );\n }\n\n if (type === \"array\") {\n return (\n <ArrayField\n description={description}\n disabled={props.disabled}\n field={props.field}\n label={label}\n path={props.path}\n rootValue={props.rootValue}\n value={value}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n );\n }\n\n return (\n <div className=\"grid min-w-0 gap-2 border-b border-border/70 pb-3 last:border-b-0\">\n <FieldHeader label={label} required={props.field.required} />\n {description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{description}</p>\n )}\n <ScalarFieldControl\n disabled={props.disabled}\n path={props.path}\n required={props.field.required}\n schema={props.field.schema}\n value={value}\n onChange={props.onChange}\n />\n </div>\n );\n}\n\nfunction ArrayField(props: {\n field: SchemaFieldDefinition;\n label: string;\n description: string | undefined;\n path: JsonPath;\n rootValue: Record<string, unknown>;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n onRemoveArrayItem: (path: JsonPath, index: number) => void;\n}) {\n const itemSchema = schemaItems(props.field.schema);\n const items = Array.isArray(props.value) ? props.value : [];\n const itemEntries = items.map((item, index) => ({\n index,\n key: `${formatPath(props.path)}:${index}:${formatEnumValue(item)}`,\n }));\n return (\n <div className=\"grid min-w-0 gap-3 border-b border-border/70 pb-3 last:border-b-0\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <FieldHeader label={props.label} required={props.field.required} />\n {itemSchema === undefined ? null : (\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"secondary\"\n onClick={() =>\n props.onChange(props.path, [...items, defaultValueForSchema(itemSchema)])\n }\n >\n Add\n </Button>\n )}\n </div>\n {props.description === undefined ? null : (\n <p className=\"m-0 text-xs leading-5 text-muted-foreground\">{props.description}</p>\n )}\n {itemSchema === undefined ? (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={props.value}\n onChange={props.onChange}\n />\n ) : items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border/70 px-3 py-2 text-xs text-muted-foreground\">\n Empty array\n </div>\n ) : (\n <div className=\"grid gap-3 border-l border-border/70 pl-3\">\n {itemEntries.map((item) => (\n <div className=\"grid gap-2\" key={item.key}>\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Item {item.index + 1}\n </span>\n <Button\n className=\"h-7 min-h-7 rounded-md px-2 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onRemoveArrayItem(props.path, item.index)}\n >\n Remove\n </Button>\n </div>\n <SchemaField\n disabled={props.disabled}\n field={{\n name: String(item.index + 1),\n required: true,\n schema: itemSchema,\n }}\n path={[...props.path, item.index]}\n rootValue={props.rootValue}\n onChange={props.onChange}\n onRemoveArrayItem={props.onRemoveArrayItem}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction FieldHeader(props: { label: string; required: boolean }) {\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">{props.label}</span>\n {props.required ? <RequiredBadge /> : null}\n </div>\n );\n}\n\nfunction RequiredBadge() {\n return (\n <span className=\"rounded-md bg-muted/35 px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n required\n </span>\n );\n}\n\nfunction ScalarFieldControl(props: {\n schema: Record<string, unknown>;\n path: JsonPath;\n value: unknown;\n required: boolean;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const enumOptions = schemaEnum(props.schema);\n if (enumOptions.length > 0) {\n const selectedIndex = enumOptions.findIndex((option) => jsonEqual(option, props.value));\n const optionEntries = enumOptions.map((option, index) => ({\n label: formatEnumValue(option),\n value: String(index),\n key: `${index}:${formatEnumValue(option)}`,\n }));\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n <Select\n value={selectedIndex === -1 ? \"\" : String(selectedIndex)}\n disabled={props.disabled}\n onValueChange={(value) => props.onChange(props.path, enumOptions[Number(value)])}\n >\n <SelectTrigger className=\"h-9 min-h-9 rounded-md border-border bg-background/45 text-sm\">\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n {optionEntries.map((option) => (\n <SelectItem value={option.value} key={option.key}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedIndex === -1 || props.required ? null : (\n <Button\n className=\"h-9 min-h-9 rounded-md px-3 text-xs\"\n disabled={props.disabled}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onChange(props.path, undefined)}\n >\n Clear\n </Button>\n )}\n </div>\n );\n }\n\n const type = schemaPrimaryType(props.schema);\n if (type === \"boolean\") {\n return (\n <label className=\"flex min-h-9 w-fit cursor-pointer items-center gap-2 rounded-md border border-border/70 bg-background/45 px-3 text-sm text-foreground\">\n <input\n checked={props.value === true}\n disabled={props.disabled}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-foreground\"\n onChange={(event) => props.onChange(props.path, event.target.checked)}\n />\n Enabled\n </label>\n );\n }\n\n if (type === \"number\" || type === \"integer\") {\n return (\n <NumberFieldControl\n disabled={props.disabled}\n path={props.path}\n schema={props.schema}\n type={type}\n value={props.value}\n onChange={props.onChange}\n />\n );\n }\n\n if (type === \"string\") {\n return (\n <Input\n className=\"h-9 rounded-md border-border bg-background/45 text-sm\"\n disabled={props.disabled}\n type=\"text\"\n value={typeof props.value === \"string\" ? props.value : \"\"}\n placeholder={schemaDefaultPlaceholder(props.schema)}\n onChange={(event) => {\n const nextValue = event.target.value;\n props.onChange(\n props.path,\n nextValue.length === 0 && !props.required ? undefined : nextValue,\n );\n }}\n />\n );\n }\n\n return (\n <JsonValueField\n disabled={props.disabled}\n path={props.path}\n value={props.value}\n onChange={props.onChange}\n />\n );\n}\n\nfunction NumberFieldControl(props: {\n schema: Record<string, unknown>;\n type: \"number\" | \"integer\";\n path: JsonPath;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const externalValue = typeof props.value === \"number\" ? String(props.value) : \"\";\n const [draft, setDraft] = useState(externalValue);\n\n useEffect(() => {\n setDraft(externalValue);\n }, [externalValue]);\n\n return (\n <Input\n className=\"h-9 rounded-md border-border bg-background/45 text-sm\"\n disabled={props.disabled}\n inputMode={props.type === \"integer\" ? \"numeric\" : \"decimal\"}\n type=\"text\"\n value={draft}\n placeholder={schemaDefaultPlaceholder(props.schema)}\n onBlur={() => {\n if (draft.trim().length === 0) {\n setDraft(\"\");\n return;\n }\n const nextValue = parseNumberDraft(draft, props.type);\n setDraft(nextValue.ok ? String(nextValue.value) : externalValue);\n }}\n onChange={(event) => {\n const nextDraft = event.target.value;\n setDraft(nextDraft);\n if (nextDraft.trim().length === 0) {\n props.onChange(props.path, undefined);\n return;\n }\n const nextValue = parseNumberDraft(nextDraft, props.type);\n if (nextValue.ok) {\n props.onChange(props.path, nextValue.value);\n }\n }}\n />\n );\n}\n\nfunction JsonValueField(props: {\n path: JsonPath;\n value: unknown;\n disabled: boolean;\n onChange: (path: JsonPath, value: unknown | undefined) => void;\n}) {\n const externalValue = useMemo(() => fieldJsonValue(props.value), [props.value]);\n const [draft, setDraft] = useState(externalValue);\n const parsed = useMemo(() => parseJson(draft), [draft]);\n\n useEffect(() => {\n setDraft(externalValue);\n }, [externalValue]);\n\n return (\n <div className=\"grid gap-2\">\n <Textarea\n className=\"min-h-24 resize-y rounded-md border-border bg-background/45 p-3 text-xs leading-5\"\n disabled={props.disabled}\n value={draft}\n spellCheck={false}\n onChange={(event) => {\n const nextDraft = event.target.value;\n setDraft(nextDraft);\n if (nextDraft.trim().length === 0) {\n props.onChange(props.path, undefined);\n return;\n }\n const nextValue = parseJson(nextDraft);\n if (nextValue.ok) {\n props.onChange(props.path, nextValue.value);\n }\n }}\n />\n {parsed.ok || draft.trim().length === 0 ? null : (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {parsed.error}\n </div>\n )}\n </div>\n );\n}\n\nfunction schemaFields(schema: unknown): SchemaFieldDefinition[] {\n if (!isRecord(schema)) {\n return [];\n }\n const properties = schema.properties;\n if (!isRecord(properties)) {\n return [];\n }\n const required = schemaRequired(schema);\n return Object.entries(properties).map(([name, propertySchema]) => ({\n name,\n required: required.has(name),\n schema: isRecord(propertySchema) ? propertySchema : {},\n }));\n}\n\nfunction schemaRequired(schema: Record<string, unknown>): Set<string> {\n const required = schema.required;\n if (!Array.isArray(required)) {\n return new Set();\n }\n return new Set(required.filter((item): item is string => typeof item === \"string\"));\n}\n\nfunction schemaPrimaryType(schema: Record<string, unknown>): string {\n const type = schema.type;\n if (typeof type === \"string\") {\n return type;\n }\n if (Array.isArray(type)) {\n const firstType = type.find(\n (item): item is string => typeof item === \"string\" && item !== \"null\",\n );\n if (firstType !== undefined) {\n return firstType;\n }\n }\n if (schemaEnum(schema).length > 0) {\n return \"enum\";\n }\n if (isRecord(schema.properties)) {\n return \"object\";\n }\n if (schema.items !== undefined) {\n return \"array\";\n }\n return \"unknown\";\n}\n\nfunction schemaItems(schema: Record<string, unknown>): Record<string, unknown> | undefined {\n return isRecord(schema.items) ? schema.items : undefined;\n}\n\nfunction schemaEnum(schema: Record<string, unknown>): unknown[] {\n return Array.isArray(schema.enum) ? schema.enum : [];\n}\n\nfunction schemaLabel(schema: Record<string, unknown>, fallback: string): string {\n return typeof schema.title === \"string\" && schema.title.length > 0\n ? schema.title\n : formatFieldName(fallback);\n}\n\nfunction schemaDescription(schema: Record<string, unknown>): string | undefined {\n return typeof schema.description === \"string\" && schema.description.length > 0\n ? schema.description\n : undefined;\n}\n\nfunction schemaDefaultPlaceholder(schema: Record<string, unknown>): string | undefined {\n return Object.hasOwn(schema, \"default\") ? formatEnumValue(schema.default) : undefined;\n}\n\nfunction defaultValueForSchema(schema: Record<string, unknown>): unknown {\n if (Object.hasOwn(schema, \"default\")) {\n return schema.default;\n }\n const enumOptions = schemaEnum(schema);\n if (enumOptions.length > 0) {\n return enumOptions[0];\n }\n const type = schemaPrimaryType(schema);\n if (type === \"boolean\") {\n return false;\n }\n if (type === \"integer\" || type === \"number\") {\n return 0;\n }\n if (type === \"array\") {\n return [];\n }\n if (type === \"object\") {\n return {};\n }\n if (type === \"string\") {\n return \"\";\n }\n return null;\n}\n\nfunction getValueAtPath(root: unknown, path: JsonPath): unknown {\n let current = root;\n for (const segment of path) {\n if (typeof segment === \"number\") {\n if (!Array.isArray(current)) {\n return undefined;\n }\n current = current[segment];\n continue;\n }\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction setValueAtPath(root: unknown, path: JsonPath, value: unknown | undefined): unknown {\n if (path.length === 0) {\n return value;\n }\n const [segment, ...rest] = path;\n const nextRoot = Array.isArray(root) ? [...root] : isRecord(root) ? { ...root } : {};\n if (rest.length === 0) {\n if (value === undefined) {\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot.splice(segment, 1);\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n delete nextRoot[segment];\n }\n return nextRoot;\n }\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot[segment] = value;\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n nextRoot[segment] = value;\n }\n return nextRoot;\n }\n const currentValue =\n Array.isArray(nextRoot) && typeof segment === \"number\"\n ? nextRoot[segment]\n : !Array.isArray(nextRoot) && typeof segment === \"string\"\n ? nextRoot[segment]\n : undefined;\n const nextValue = setValueAtPath(currentValue, rest, value);\n if (Array.isArray(nextRoot) && typeof segment === \"number\") {\n nextRoot[segment] = nextValue;\n } else if (!Array.isArray(nextRoot) && typeof segment === \"string\") {\n nextRoot[segment] = nextValue;\n }\n return nextRoot;\n}\n\nfunction parseJson(value: string): ParseResult {\n if (value.trim().length === 0) {\n return { ok: true, value: undefined };\n }\n try {\n return { ok: true, value: JSON.parse(value) };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\ntype NumberParseResult = { ok: true; value: number } | { ok: false };\n\nfunction parseNumberDraft(value: string, type: \"number\" | \"integer\"): NumberParseResult {\n const normalized = value.trim();\n if (normalized.length === 0 || isIncompleteNumberDraft(normalized)) {\n return { ok: false };\n }\n const parsed = Number(normalized);\n if (!Number.isFinite(parsed)) {\n return { ok: false };\n }\n if (type === \"integer\" && !Number.isInteger(parsed)) {\n return { ok: false };\n }\n return { ok: true, value: parsed };\n}\n\nfunction isIncompleteNumberDraft(value: string): boolean {\n return (\n value === \"-\" ||\n value === \"+\" ||\n value === \".\" ||\n value === \"-.\" ||\n value === \"+.\" ||\n /^[+-]?\\d+\\.$/.test(value) ||\n /[eE][+-]?$/.test(value)\n );\n}\n\nfunction fieldJsonValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n return formatEditorJson(value);\n}\n\nfunction formatEditorJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction formatEnumValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value === null) {\n return \"null\";\n }\n return JSON.stringify(value);\n}\n\nfunction formatPath(path: JsonPath): string {\n return path.join(\".\");\n}\n\nfunction formatFieldName(value: string): string {\n return value\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n","import type { ReactNode } from \"react\";\nimport type { StudioAgentToolMetadata, StudioToolRunResponse } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { parseToolDisplayValue } from \"../shared/format\";\nimport { isRecord } from \"../shared/object\";\nimport { JsonSyntax } from \"../shared/renderers\";\nimport { SchemaArgumentEditor } from \"./schema-argument-editor\";\n\nexport type ToolRunState = \"idle\" | \"running\";\n\nexport function ToolRunner(props: {\n selectedTool: StudioAgentToolMetadata | undefined;\n argsText: string;\n runState: ToolRunState;\n runError: string;\n runResponse: StudioToolRunResponse | undefined;\n onArgsTextChange: (value: string) => void;\n onRun: () => void;\n}) {\n const propertyCount =\n props.selectedTool === undefined ? 0 : schemaPropertyCount(props.selectedTool.parameters);\n return (\n <section className=\"grid gap-4 border-t border-border/80 pt-4 xl:grid-cols-[minmax(260px,0.42fr)_minmax(0,1fr)]\">\n <div className=\"grid content-start gap-3\">\n <div className=\"grid gap-1.5\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">Runner</h2>\n {props.selectedTool === undefined ? (\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">No tool selected</p>\n ) : (\n <>\n <p className=\"m-0 break-all text-sm font-semibold leading-6 text-foreground\">\n {props.selectedTool.name}\n </p>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n {props.selectedTool.description}\n </p>\n </>\n )}\n </div>\n {props.selectedTool === undefined ? null : (\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <Badge className={originBadgeClass(props.selectedTool)}>\n {toolOriginLabel(props.selectedTool)}\n </Badge>\n <Badge className={approvalBadgeClass(props.selectedTool.approval.required)}>\n approval {props.selectedTool.approval.required ? \"required\" : \"none\"}\n </Badge>\n <ToolMetaPill>\n {propertyCount} {propertyCount === 1 ? \"field\" : \"fields\"}\n </ToolMetaPill>\n </div>\n )}\n {props.selectedTool?.approval.reason === undefined ? null : (\n <p className=\"m-0 border-l border-border/80 pl-3 text-xs leading-5 text-muted-foreground\">\n {props.selectedTool.approval.reason}\n </p>\n )}\n </div>\n <div className=\"grid min-w-0 gap-3\">\n <SchemaArgumentEditor\n disabled={props.selectedTool === undefined}\n schema={props.selectedTool?.parameters}\n value={props.argsText}\n onChange={props.onArgsTextChange}\n />\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"min-w-0 truncate text-xs text-muted-foreground\">\n Arguments must be valid JSON.\n </span>\n <Button\n className=\"h-8 min-h-8 rounded-md px-4 text-xs\"\n type=\"button\"\n disabled={props.runState === \"running\" || props.selectedTool === undefined}\n onClick={props.onRun}\n >\n {props.runState === \"running\" ? \"Running\" : \"Run\"}\n </Button>\n </div>\n {props.runError.length > 0 ? (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs leading-5 text-destructive\">\n {props.runError}\n </div>\n ) : null}\n {props.selectedTool === undefined ? null : (\n <details className=\"group border-t border-border/70 pt-3\">\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Parameter schema\n <span className=\"font-medium normal-case tracking-normal\">\n {schemaType(props.selectedTool.parameters)}\n </span>\n </summary>\n <div className=\"mt-3\">\n <SchemaBlock value={props.selectedTool.parameters} title=\"JSON schema\" />\n </div>\n </details>\n )}\n {props.runResponse === undefined ? null : <ToolRunResult response={props.runResponse} />}\n </div>\n </section>\n );\n}\n\nfunction ToolRunResult(props: { response: StudioToolRunResponse }) {\n const hasResult = Object.hasOwn(props.response, \"result\");\n const primaryValue = hasResult ? props.response.result : props.response.error;\n const title = hasResult ? \"Tool result\" : \"Tool error\";\n\n return (\n <div className=\"grid gap-3\">\n <SchemaBlock value={displayToolRunValue(primaryValue)} title={title} />\n <details className=\"group border-t border-border/70 pt-3\">\n <summary className=\"flex cursor-pointer list-none items-center justify-between gap-3 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground marker:hidden\">\n Raw run response\n <span className=\"font-medium normal-case tracking-normal\">\n {props.response.status} / {props.response.durationMs}ms\n </span>\n </summary>\n <div className=\"mt-3\">\n <SchemaBlock value={props.response} title=\"Studio envelope\" />\n </div>\n </details>\n </div>\n );\n}\n\nexport function SchemaBlock(props: { value: unknown; title: string }) {\n return (\n <section className=\"grid min-w-0 content-start overflow-hidden rounded-lg bg-background/45\">\n <div className=\"flex min-h-9 items-center justify-between gap-3 bg-muted/20 px-4\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n {props.title}\n </span>\n <span className=\" text-xs text-muted-foreground\">{schemaType(props.value)}</span>\n </div>\n <div className=\"min-w-0 overflow-x-auto\">\n <pre className=\"m-0 max-h-96 min-w-max p-4 text-xs leading-5 text-foreground\">\n <code>\n <JsonSyntax text={formatSchema(props.value)} />\n </code>\n </pre>\n </div>\n </section>\n );\n}\n\nexport function ToolMetaPill(props: { children: ReactNode }) {\n return (\n <span className=\"inline-flex min-h-7 items-center rounded-md bg-muted/25 px-2.5 text-xs font-medium text-muted-foreground\">\n {props.children}\n </span>\n );\n}\n\nexport function approvalBadgeClass(required: boolean): string {\n return required\n ? \"border-border/80 bg-muted/35 text-foreground\"\n : \"border-transparent bg-transparent text-muted-foreground/60\";\n}\n\nexport function sourceBadgeClass(source: \"static\" | \"dynamic\"): string {\n return source === \"dynamic\"\n ? \"border-border/80 bg-muted/45 text-foreground\"\n : \"border-border/80 bg-muted/55 text-muted-foreground\";\n}\n\nexport function originBadgeClass(tool: StudioAgentToolMetadata): string {\n return tool.mcpServerName === undefined\n ? sourceBadgeClass(tool.source)\n : \"border-border/80 bg-muted/35 text-foreground\";\n}\n\nexport function toolOriginLabel(tool: StudioAgentToolMetadata): string {\n return tool.mcpServerName === undefined ? tool.source : `MCP / ${tool.mcpServerName}`;\n}\n\nexport function schemaType(value: unknown): string {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return \"value\";\n }\n const type = (value as { type?: unknown }).type;\n return typeof type === \"string\" ? type : \"object\";\n}\n\nexport function schemaPropertyCount(value: unknown): number {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return 0;\n }\n const properties = (value as { properties?: unknown }).properties;\n return typeof properties === \"object\" && properties !== null && !Array.isArray(properties)\n ? Object.keys(properties).length\n : 0;\n}\n\nexport function formatJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function parseStudioToolRunResponse(value: unknown): StudioToolRunResponse | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n if (typeof value.agentId !== \"string\" || value.agentId.length === 0) {\n return undefined;\n }\n if (typeof value.toolName !== \"string\" || value.toolName.length === 0) {\n return undefined;\n }\n if (value.status !== \"success\" && value.status !== \"error\") {\n return undefined;\n }\n if (typeof value.durationMs !== \"number\" || !Number.isFinite(value.durationMs)) {\n return undefined;\n }\n if (typeof value.startedAt !== \"string\" || typeof value.endedAt !== \"string\") {\n return undefined;\n }\n if (!Array.isArray(value.events)) {\n return undefined;\n }\n return value as StudioToolRunResponse;\n}\n\nfunction displayToolRunValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const parsed = parseToolDisplayValue(value);\n return parsed.kind === \"json\" ? parsed.value : value;\n}\n\nfunction formatSchema(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{L as r,d as i,f as a,l as o,p as s,u as c}from"./index-CVaGs3Mg.js";import{t as l}from"./badge-CeTBFuRX.js";import{a as u,c as d,d as f,i as p,l as m,n as h,o as g,r as _,s as v}from"./tool-runner-MaS0O-R0.js";var y=n(e(),1),b=t();function x(e){let t=e.agents.find(t=>t.id===e.selectedAgentId)??e.agents[0],n=e.summary?.tools??[],[r,l]=(0,y.useState)(``),[d,f]=(0,y.useState)(`{}`),[p,m]=(0,y.useState)(`idle`),[h,g]=(0,y.useState)(),[x,C]=(0,y.useState)(``),w=(0,y.useMemo)(()=>n.find(e=>e.name===r)??n[0],[r,n]),T=t===void 0||w===void 0?``:`${t.id}:${w.name}`,O=(0,y.useRef)(T),A=(0,y.useRef)(0),j=D(n);(0,y.useEffect)(()=>{if(n.length===0){l(``);return}n.some(e=>e.name===r)||l(n[0]?.name??``)},[r,n]),(0,y.useEffect)(()=>{O.current!==T&&(O.current=T,A.current+=1,m(`idle`),C(``),g(void 0))},[T]);async function M(){if(t===void 0||w===void 0)return;let e;try{e=JSON.parse(d)}catch(e){C(e instanceof Error?e.message:String(e)),g(void 0);return}m(`running`),C(``),g(void 0);let n=T,r=A.current+1;A.current=r;let i=()=>A.current===r&&O.current===n;try{let n=await fetch(`/agents/${encodeURIComponent(t.id)}/tools/${encodeURIComponent(w.name)}/runs`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({args:e})}),r=await n.json();if(!i())return;let a=v(r);if(a===void 0){C(`Unexpected Studio tool run response: ${u(r)}`);return}g(a),(!n.ok||a.status===`error`)&&C(u(a.error??a))}catch(e){i()&&C(e instanceof Error?e.message:String(e))}finally{i()&&m(`idle`)}}return(0,b.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,"aria-label":`Tools`,children:[(0,b.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,b.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,b.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:`Tools`}),(0,b.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:`Tool definitions registered on Studio agents, including approval policy and input schema.`})]}),(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,b.jsx)(E,{label:`tools`,value:j.total}),(0,b.jsx)(E,{label:`mcp`,value:j.mcp}),(0,b.jsx)(E,{label:`static`,value:j.static}),(0,b.jsx)(E,{label:`dynamic`,value:j.dynamic}),(0,b.jsx)(E,{label:`approvals`,value:j.approvals}),e.agents.length>1?(0,b.jsxs)(o,{value:t?.id??``,onValueChange:e.onSelectAgent,children:[(0,b.jsx)(a,{className:`h-8 min-h-8 w-64 rounded-md border-border bg-background/45 text-xs max-md:w-full`,children:(0,b.jsx)(s,{placeholder:`Agent`})}),(0,b.jsx)(c,{align:`end`,children:e.agents.map(e=>(0,b.jsx)(i,{value:e.id,children:e.name??e.id},e.id))})]}):null]})]})}),(0,b.jsx)(`div`,{className:`min-h-0 overflow-auto pb-6 pl-4 pr-6`,children:(0,b.jsx)(`div`,{className:`grid w-full gap-5`,children:e.enabled?e.loading?(0,b.jsx)(k,{title:`Loading tools`,message:`Reading registered tool metadata.`}):n.length===0?(0,b.jsx)(k,{title:`No tools`,message:`The selected agent has no registered tools.`}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(S,{selectedToolName:w?.name??``,tools:n,onSelectTool:l}),(0,b.jsx)(_,{argsText:d,runError:x,runResponse:h,runState:p,selectedTool:w,onArgsTextChange:f,onRun:()=>void M()})]}):(0,b.jsx)(k,{title:`Tools unavailable`,message:`No registered Studio agent exposes static or dynamic tools.`})})})]})}function S(e){return(0,b.jsx)(`div`,{className:`min-w-[1040px]`,children:(0,b.jsxs)(`table`,{className:`w-full border-separate border-spacing-0 text-left`,children:[(0,b.jsx)(`thead`,{className:`sticky top-0 z-10 bg-background/95 backdrop-blur`,children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(w,{children:`Tool`}),(0,b.jsx)(w,{children:`Origin`}),(0,b.jsx)(w,{children:`Schema`}),(0,b.jsx)(w,{children:`Approval`}),(0,b.jsx)(w,{children:`Run`})]})}),(0,b.jsx)(`tbody`,{children:e.tools.map(t=>(0,b.jsx)(C,{active:e.selectedToolName===t.name,tool:t,onSelectTool:e.onSelectTool},`${t.source}:${t.name}`))})]})})}function C(e){let t=d(e.tool.parameters);return(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(T,{children:(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.tool.name}),e.active?(0,b.jsx)(l,{className:O,children:`selected`}):null]}),(0,b.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:e.tool.agentId}),(0,b.jsx)(`p`,{className:`m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground`,children:e.tool.description})]})}),(0,b.jsx)(T,{children:(0,b.jsx)(l,{className:g(e.tool),children:f(e.tool)})}),(0,b.jsx)(T,{children:(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,b.jsx)(h,{children:m(e.tool.parameters)}),(0,b.jsxs)(h,{children:[t,` `,t===1?`field`:`fields`]})]})}),(0,b.jsx)(T,{children:(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,b.jsx)(l,{className:p(e.tool.approval.required),children:e.tool.approval.required?`required`:`none`}),e.tool.approval.reason===void 0?null:(0,b.jsx)(`span`,{className:`max-w-[280px] truncate text-xs leading-5 text-muted-foreground`,title:e.tool.approval.reason,children:e.tool.approval.reason})]})}),(0,b.jsx)(T,{children:(0,b.jsx)(r,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:e.active?`secondary`:`ghost`,onClick:()=>e.onSelectTool(e.tool.name),children:e.active?`Selected`:`Use`})})]})}function w(e){return(0,b.jsx)(`th`,{className:`border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0`,children:e.children})}function T(e){return(0,b.jsx)(`td`,{className:`border-b border-border/70 py-3.5 pr-5 align-top first:pl-0`,children:e.children})}function E(e){return(0,b.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,b.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function D(e){return e.reduce((e,t)=>(e.total+=1,t.source===`dynamic`?e.dynamic+=1:e.static+=1,t.mcpServerName!==void 0&&(e.mcp+=1),t.approval.required&&(e.approvals+=1),e),{approvals:0,dynamic:0,mcp:0,static:0,total:0})}var O=`border-border/80 bg-muted/45 text-foreground`;function k(e){return(0,b.jsx)(`div`,{className:`grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center`,children:(0,b.jsxs)(`div`,{className:`grid max-w-md gap-2`,children:[(0,b.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:e.title}),(0,b.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:e.message})]})})}export{x as ToolsPage};
2
- //# sourceMappingURL=tools-page-owaTKYO7.js.map
1
+ import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{L as r,d as i,f as a,l as o,p as s,u as c}from"./index-CaB9mtgz.js";import{t as l}from"./badge-DFrH2vyb.js";import{a as u,c as d,d as f,i as p,l as m,n as h,o as g,r as _,s as v}from"./tool-runner-9bssZrO4.js";var y=n(e(),1),b=t();function x(e){let t=e.agents.find(t=>t.id===e.selectedAgentId)??e.agents[0],n=e.summary?.tools??[],[r,l]=(0,y.useState)(``),[d,f]=(0,y.useState)(`{}`),[p,m]=(0,y.useState)(`idle`),[h,g]=(0,y.useState)(),[x,C]=(0,y.useState)(``),w=(0,y.useMemo)(()=>n.find(e=>e.name===r)??n[0],[r,n]),T=t===void 0||w===void 0?``:`${t.id}:${w.name}`,O=(0,y.useRef)(T),A=(0,y.useRef)(0),j=D(n);(0,y.useEffect)(()=>{if(n.length===0){l(``);return}n.some(e=>e.name===r)||l(n[0]?.name??``)},[r,n]),(0,y.useEffect)(()=>{O.current!==T&&(O.current=T,A.current+=1,m(`idle`),C(``),g(void 0))},[T]);async function M(){if(t===void 0||w===void 0)return;let e;try{e=JSON.parse(d)}catch(e){C(e instanceof Error?e.message:String(e)),g(void 0);return}m(`running`),C(``),g(void 0);let n=T,r=A.current+1;A.current=r;let i=()=>A.current===r&&O.current===n;try{let n=await fetch(`/agents/${encodeURIComponent(t.id)}/tools/${encodeURIComponent(w.name)}/runs`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({args:e})}),r=await n.json();if(!i())return;let a=v(r);if(a===void 0){C(`Unexpected Studio tool run response: ${u(r)}`);return}g(a),(!n.ok||a.status===`error`)&&C(u(a.error??a))}catch(e){i()&&C(e instanceof Error?e.message:String(e))}finally{i()&&m(`idle`)}}return(0,b.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,"aria-label":`Tools`,children:[(0,b.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,b.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,b.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:`Tools`}),(0,b.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:`Tool definitions registered on Studio agents, including approval policy and input schema.`})]}),(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,b.jsx)(E,{label:`tools`,value:j.total}),(0,b.jsx)(E,{label:`mcp`,value:j.mcp}),(0,b.jsx)(E,{label:`static`,value:j.static}),(0,b.jsx)(E,{label:`dynamic`,value:j.dynamic}),(0,b.jsx)(E,{label:`approvals`,value:j.approvals}),e.agents.length>1?(0,b.jsxs)(o,{value:t?.id??``,onValueChange:e.onSelectAgent,children:[(0,b.jsx)(a,{className:`h-8 min-h-8 w-64 rounded-md border-border bg-background/45 text-xs max-md:w-full`,children:(0,b.jsx)(s,{placeholder:`Agent`})}),(0,b.jsx)(c,{align:`end`,children:e.agents.map(e=>(0,b.jsx)(i,{value:e.id,children:e.name??e.id},e.id))})]}):null]})]})}),(0,b.jsx)(`div`,{className:`min-h-0 overflow-auto pb-6 pl-4 pr-6`,children:(0,b.jsx)(`div`,{className:`grid w-full gap-5`,children:e.enabled?e.loading?(0,b.jsx)(k,{title:`Loading tools`,message:`Reading registered tool metadata.`}):n.length===0?(0,b.jsx)(k,{title:`No tools`,message:`The selected agent has no registered tools.`}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(S,{selectedToolName:w?.name??``,tools:n,onSelectTool:l}),(0,b.jsx)(_,{argsText:d,runError:x,runResponse:h,runState:p,selectedTool:w,onArgsTextChange:f,onRun:()=>void M()})]}):(0,b.jsx)(k,{title:`Tools unavailable`,message:`No registered Studio agent exposes static or dynamic tools.`})})})]})}function S(e){return(0,b.jsx)(`div`,{className:`min-w-[1040px]`,children:(0,b.jsxs)(`table`,{className:`w-full border-separate border-spacing-0 text-left`,children:[(0,b.jsx)(`thead`,{className:`sticky top-0 z-10 bg-background/95 backdrop-blur`,children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(w,{children:`Tool`}),(0,b.jsx)(w,{children:`Origin`}),(0,b.jsx)(w,{children:`Schema`}),(0,b.jsx)(w,{children:`Approval`}),(0,b.jsx)(w,{children:`Run`})]})}),(0,b.jsx)(`tbody`,{children:e.tools.map(t=>(0,b.jsx)(C,{active:e.selectedToolName===t.name,tool:t,onSelectTool:e.onSelectTool},`${t.source}:${t.name}`))})]})})}function C(e){let t=d(e.tool.parameters);return(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(T,{children:(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,b.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.tool.name}),e.active?(0,b.jsx)(l,{className:O,children:`selected`}):null]}),(0,b.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:e.tool.agentId}),(0,b.jsx)(`p`,{className:`m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground`,children:e.tool.description})]})}),(0,b.jsx)(T,{children:(0,b.jsx)(l,{className:g(e.tool),children:f(e.tool)})}),(0,b.jsx)(T,{children:(0,b.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,b.jsx)(h,{children:m(e.tool.parameters)}),(0,b.jsxs)(h,{children:[t,` `,t===1?`field`:`fields`]})]})}),(0,b.jsx)(T,{children:(0,b.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,b.jsx)(l,{className:p(e.tool.approval.required),children:e.tool.approval.required?`required`:`none`}),e.tool.approval.reason===void 0?null:(0,b.jsx)(`span`,{className:`max-w-[280px] truncate text-xs leading-5 text-muted-foreground`,title:e.tool.approval.reason,children:e.tool.approval.reason})]})}),(0,b.jsx)(T,{children:(0,b.jsx)(r,{className:`h-8 min-h-8 rounded-md px-3 text-xs`,type:`button`,variant:e.active?`secondary`:`ghost`,onClick:()=>e.onSelectTool(e.tool.name),children:e.active?`Selected`:`Use`})})]})}function w(e){return(0,b.jsx)(`th`,{className:`border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0`,children:e.children})}function T(e){return(0,b.jsx)(`td`,{className:`border-b border-border/70 py-3.5 pr-5 align-top first:pl-0`,children:e.children})}function E(e){return(0,b.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,b.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function D(e){return e.reduce((e,t)=>(e.total+=1,t.source===`dynamic`?e.dynamic+=1:e.static+=1,t.mcpServerName!==void 0&&(e.mcp+=1),t.approval.required&&(e.approvals+=1),e),{approvals:0,dynamic:0,mcp:0,static:0,total:0})}var O=`border-border/80 bg-muted/45 text-foreground`;function k(e){return(0,b.jsx)(`div`,{className:`grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center`,children:(0,b.jsxs)(`div`,{className:`grid max-w-md gap-2`,children:[(0,b.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:e.title}),(0,b.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:e.message})]})})}export{x as ToolsPage};
2
+ //# sourceMappingURL=tools-page-Mu5-Dl6L.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools-page-owaTKYO7.js","names":[],"sources":["../../../src/ui/app/modules/tools/tools-page.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioAgentToolMetadata,\n StudioAgentToolsSummary,\n StudioConfig,\n StudioToolRunResponse,\n} from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n approvalBadgeClass,\n formatJson,\n originBadgeClass,\n parseStudioToolRunResponse,\n schemaPropertyCount,\n schemaType,\n ToolMetaPill,\n ToolRunner,\n toolOriginLabel,\n} from \"./tool-runner\";\n\nexport function ToolsPage(props: {\n agents: StudioConfig[\"agents\"];\n selectedAgentId: string;\n summary: StudioAgentToolsSummary | undefined;\n enabled: boolean;\n loading: boolean;\n onSelectAgent: (agentId: string) => void;\n}) {\n const selectedAgent =\n props.agents.find((agent) => agent.id === props.selectedAgentId) ?? props.agents[0];\n const tools = props.summary?.tools ?? [];\n const [selectedToolName, setSelectedToolName] = useState(\"\");\n const [argsText, setArgsText] = useState(\"{}\");\n const [runState, setRunState] = useState<\"idle\" | \"running\">(\"idle\");\n const [runResponse, setRunResponse] = useState<StudioToolRunResponse | undefined>();\n const [runError, setRunError] = useState(\"\");\n const selectedTool = useMemo(\n () => tools.find((tool) => tool.name === selectedToolName) ?? tools[0],\n [selectedToolName, tools],\n );\n const selectedToolRunKey =\n selectedAgent === undefined || selectedTool === undefined\n ? \"\"\n : `${selectedAgent.id}:${selectedTool.name}`;\n const selectedToolRunKeyRef = useRef(selectedToolRunKey);\n const runRequestIdRef = useRef(0);\n const toolTotals = summarizeTools(tools);\n\n useEffect(() => {\n if (tools.length === 0) {\n setSelectedToolName(\"\");\n return;\n }\n if (!tools.some((tool) => tool.name === selectedToolName)) {\n setSelectedToolName(tools[0]?.name ?? \"\");\n }\n }, [selectedToolName, tools]);\n\n useEffect(() => {\n if (selectedToolRunKeyRef.current === selectedToolRunKey) {\n return;\n }\n selectedToolRunKeyRef.current = selectedToolRunKey;\n runRequestIdRef.current += 1;\n setRunState(\"idle\");\n setRunError(\"\");\n setRunResponse(undefined);\n }, [selectedToolRunKey]);\n\n async function runSelectedTool() {\n if (selectedAgent === undefined || selectedTool === undefined) {\n return;\n }\n let args: unknown;\n try {\n args = JSON.parse(argsText);\n } catch (parseError) {\n setRunError(parseError instanceof Error ? parseError.message : String(parseError));\n setRunResponse(undefined);\n return;\n }\n\n setRunState(\"running\");\n setRunError(\"\");\n setRunResponse(undefined);\n const runToolKey = selectedToolRunKey;\n const requestId = runRequestIdRef.current + 1;\n runRequestIdRef.current = requestId;\n const isCurrentRun = () =>\n runRequestIdRef.current === requestId && selectedToolRunKeyRef.current === runToolKey;\n try {\n const response = await fetch(\n `/agents/${encodeURIComponent(selectedAgent.id)}/tools/${encodeURIComponent(\n selectedTool.name,\n )}/runs`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ args }),\n },\n );\n const rawBody = await response.json();\n if (!isCurrentRun()) {\n return;\n }\n const body = parseStudioToolRunResponse(rawBody);\n if (body === undefined) {\n setRunError(`Unexpected Studio tool run response: ${formatJson(rawBody)}`);\n return;\n }\n setRunResponse(body);\n if (!response.ok || body.status === \"error\") {\n setRunError(formatJson(body.error ?? body));\n }\n } catch (error) {\n if (isCurrentRun()) {\n setRunError(error instanceof Error ? error.message : String(error));\n }\n } finally {\n if (isCurrentRun()) {\n setRunState(\"idle\");\n }\n }\n }\n\n return (\n <section\n className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55\"\n aria-label=\"Tools\"\n >\n <header className=\"bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur\">\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-2\">\n <h1 className=\"m-0 text-2xl font-semibold leading-none tracking-tight text-foreground\">\n Tools\n </h1>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n Tool definitions registered on Studio agents, including approval policy and input\n schema.\n </p>\n </div>\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start\">\n <HeaderMetric label=\"tools\" value={toolTotals.total} />\n <HeaderMetric label=\"mcp\" value={toolTotals.mcp} />\n <HeaderMetric label=\"static\" value={toolTotals.static} />\n <HeaderMetric label=\"dynamic\" value={toolTotals.dynamic} />\n <HeaderMetric label=\"approvals\" value={toolTotals.approvals} />\n {props.agents.length > 1 ? (\n <Select value={selectedAgent?.id ?? \"\"} onValueChange={props.onSelectAgent}>\n <SelectTrigger className=\"h-8 min-h-8 w-64 rounded-md border-border bg-background/45 text-xs max-md:w-full\">\n <SelectValue placeholder=\"Agent\" />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {props.agents.map((agent) => (\n <SelectItem value={agent.id} key={agent.id}>\n {agent.name ?? agent.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\n </div>\n </header>\n\n <div className=\"min-h-0 overflow-auto pb-6 pl-4 pr-6\">\n <div className=\"grid w-full gap-5\">\n {!props.enabled ? (\n <EmptyState\n title=\"Tools unavailable\"\n message=\"No registered Studio agent exposes static or dynamic tools.\"\n />\n ) : props.loading ? (\n <EmptyState title=\"Loading tools\" message=\"Reading registered tool metadata.\" />\n ) : tools.length === 0 ? (\n <EmptyState title=\"No tools\" message=\"The selected agent has no registered tools.\" />\n ) : (\n <>\n <ToolRegistryTable\n selectedToolName={selectedTool?.name ?? \"\"}\n tools={tools}\n onSelectTool={setSelectedToolName}\n />\n <ToolRunner\n argsText={argsText}\n runError={runError}\n runResponse={runResponse}\n runState={runState}\n selectedTool={selectedTool}\n onArgsTextChange={setArgsText}\n onRun={() => void runSelectedTool()}\n />\n </>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nfunction ToolRegistryTable(props: {\n tools: StudioAgentToolMetadata[];\n selectedToolName: string;\n onSelectTool: (toolName: string) => void;\n}) {\n return (\n <div className=\"min-w-[1040px]\">\n <table className=\"w-full border-separate border-spacing-0 text-left\">\n <thead className=\"sticky top-0 z-10 bg-background/95 backdrop-blur\">\n <tr>\n <ToolTableHead>Tool</ToolTableHead>\n <ToolTableHead>Origin</ToolTableHead>\n <ToolTableHead>Schema</ToolTableHead>\n <ToolTableHead>Approval</ToolTableHead>\n <ToolTableHead>Run</ToolTableHead>\n </tr>\n </thead>\n <tbody>\n {props.tools.map((tool) => (\n <ToolRegistryRow\n active={props.selectedToolName === tool.name}\n key={`${tool.source}:${tool.name}`}\n tool={tool}\n onSelectTool={props.onSelectTool}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction ToolRegistryRow(props: {\n tool: StudioAgentToolMetadata;\n active: boolean;\n onSelectTool: (toolName: string) => void;\n}) {\n const propertyCount = schemaPropertyCount(props.tool.parameters);\n return (\n <tr>\n <ToolTableCell>\n <div className=\"grid min-w-0 gap-1.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.tool.name}\n </span>\n {props.active ? <Badge className={selectedBadge}>selected</Badge> : null}\n </div>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {props.tool.agentId}\n </span>\n <p className=\"m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground\">\n {props.tool.description}\n </p>\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <Badge className={originBadgeClass(props.tool)}>{toolOriginLabel(props.tool)}</Badge>\n </ToolTableCell>\n <ToolTableCell>\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <ToolMetaPill>{schemaType(props.tool.parameters)}</ToolMetaPill>\n <ToolMetaPill>\n {propertyCount} {propertyCount === 1 ? \"field\" : \"fields\"}\n </ToolMetaPill>\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <div className=\"grid min-w-0 gap-1.5\">\n <Badge className={approvalBadgeClass(props.tool.approval.required)}>\n {props.tool.approval.required ? \"required\" : \"none\"}\n </Badge>\n {props.tool.approval.reason === undefined ? null : (\n <span\n className=\"max-w-[280px] truncate text-xs leading-5 text-muted-foreground\"\n title={props.tool.approval.reason}\n >\n {props.tool.approval.reason}\n </span>\n )}\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant={props.active ? \"secondary\" : \"ghost\"}\n onClick={() => props.onSelectTool(props.tool.name)}\n >\n {props.active ? \"Selected\" : \"Use\"}\n </Button>\n </ToolTableCell>\n </tr>\n );\n}\n\nfunction ToolTableHead(props: { children: string }) {\n return (\n <th className=\"border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0\">\n {props.children}\n </th>\n );\n}\n\nfunction ToolTableCell(props: { children: ReactNode }) {\n return (\n <td className=\"border-b border-border/70 py-3.5 pr-5 align-top first:pl-0\">{props.children}</td>\n );\n}\n\nfunction HeaderMetric(props: { label: string; value: number }) {\n return (\n <span className=\"inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground\">\n <span className=\"font-semibold tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nfunction summarizeTools(tools: StudioAgentToolMetadata[]) {\n return tools.reduce(\n (totals, tool) => {\n totals.total += 1;\n if (tool.source === \"dynamic\") {\n totals.dynamic += 1;\n } else {\n totals.static += 1;\n }\n if (tool.mcpServerName !== undefined) {\n totals.mcp += 1;\n }\n if (tool.approval.required) {\n totals.approvals += 1;\n }\n return totals;\n },\n { approvals: 0, dynamic: 0, mcp: 0, static: 0, total: 0 },\n );\n}\n\nconst selectedBadge = \"border-border/80 bg-muted/45 text-foreground\";\n\nfunction EmptyState(props: { title: string; message: string }) {\n return (\n <div className=\"grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center\">\n <div className=\"grid max-w-md gap-2\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">{props.title}</h2>\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">{props.message}</p>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tools-page-Mu5-Dl6L.js","names":[],"sources":["../../../src/ui/app/modules/tools/tools-page.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n StudioAgentToolMetadata,\n StudioAgentToolsSummary,\n StudioConfig,\n StudioToolRunResponse,\n} from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n approvalBadgeClass,\n formatJson,\n originBadgeClass,\n parseStudioToolRunResponse,\n schemaPropertyCount,\n schemaType,\n ToolMetaPill,\n ToolRunner,\n toolOriginLabel,\n} from \"./tool-runner\";\n\nexport function ToolsPage(props: {\n agents: StudioConfig[\"agents\"];\n selectedAgentId: string;\n summary: StudioAgentToolsSummary | undefined;\n enabled: boolean;\n loading: boolean;\n onSelectAgent: (agentId: string) => void;\n}) {\n const selectedAgent =\n props.agents.find((agent) => agent.id === props.selectedAgentId) ?? props.agents[0];\n const tools = props.summary?.tools ?? [];\n const [selectedToolName, setSelectedToolName] = useState(\"\");\n const [argsText, setArgsText] = useState(\"{}\");\n const [runState, setRunState] = useState<\"idle\" | \"running\">(\"idle\");\n const [runResponse, setRunResponse] = useState<StudioToolRunResponse | undefined>();\n const [runError, setRunError] = useState(\"\");\n const selectedTool = useMemo(\n () => tools.find((tool) => tool.name === selectedToolName) ?? tools[0],\n [selectedToolName, tools],\n );\n const selectedToolRunKey =\n selectedAgent === undefined || selectedTool === undefined\n ? \"\"\n : `${selectedAgent.id}:${selectedTool.name}`;\n const selectedToolRunKeyRef = useRef(selectedToolRunKey);\n const runRequestIdRef = useRef(0);\n const toolTotals = summarizeTools(tools);\n\n useEffect(() => {\n if (tools.length === 0) {\n setSelectedToolName(\"\");\n return;\n }\n if (!tools.some((tool) => tool.name === selectedToolName)) {\n setSelectedToolName(tools[0]?.name ?? \"\");\n }\n }, [selectedToolName, tools]);\n\n useEffect(() => {\n if (selectedToolRunKeyRef.current === selectedToolRunKey) {\n return;\n }\n selectedToolRunKeyRef.current = selectedToolRunKey;\n runRequestIdRef.current += 1;\n setRunState(\"idle\");\n setRunError(\"\");\n setRunResponse(undefined);\n }, [selectedToolRunKey]);\n\n async function runSelectedTool() {\n if (selectedAgent === undefined || selectedTool === undefined) {\n return;\n }\n let args: unknown;\n try {\n args = JSON.parse(argsText);\n } catch (parseError) {\n setRunError(parseError instanceof Error ? parseError.message : String(parseError));\n setRunResponse(undefined);\n return;\n }\n\n setRunState(\"running\");\n setRunError(\"\");\n setRunResponse(undefined);\n const runToolKey = selectedToolRunKey;\n const requestId = runRequestIdRef.current + 1;\n runRequestIdRef.current = requestId;\n const isCurrentRun = () =>\n runRequestIdRef.current === requestId && selectedToolRunKeyRef.current === runToolKey;\n try {\n const response = await fetch(\n `/agents/${encodeURIComponent(selectedAgent.id)}/tools/${encodeURIComponent(\n selectedTool.name,\n )}/runs`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ args }),\n },\n );\n const rawBody = await response.json();\n if (!isCurrentRun()) {\n return;\n }\n const body = parseStudioToolRunResponse(rawBody);\n if (body === undefined) {\n setRunError(`Unexpected Studio tool run response: ${formatJson(rawBody)}`);\n return;\n }\n setRunResponse(body);\n if (!response.ok || body.status === \"error\") {\n setRunError(formatJson(body.error ?? body));\n }\n } catch (error) {\n if (isCurrentRun()) {\n setRunError(error instanceof Error ? error.message : String(error));\n }\n } finally {\n if (isCurrentRun()) {\n setRunState(\"idle\");\n }\n }\n }\n\n return (\n <section\n className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55\"\n aria-label=\"Tools\"\n >\n <header className=\"bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur\">\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-2\">\n <h1 className=\"m-0 text-2xl font-semibold leading-none tracking-tight text-foreground\">\n Tools\n </h1>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n Tool definitions registered on Studio agents, including approval policy and input\n schema.\n </p>\n </div>\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start\">\n <HeaderMetric label=\"tools\" value={toolTotals.total} />\n <HeaderMetric label=\"mcp\" value={toolTotals.mcp} />\n <HeaderMetric label=\"static\" value={toolTotals.static} />\n <HeaderMetric label=\"dynamic\" value={toolTotals.dynamic} />\n <HeaderMetric label=\"approvals\" value={toolTotals.approvals} />\n {props.agents.length > 1 ? (\n <Select value={selectedAgent?.id ?? \"\"} onValueChange={props.onSelectAgent}>\n <SelectTrigger className=\"h-8 min-h-8 w-64 rounded-md border-border bg-background/45 text-xs max-md:w-full\">\n <SelectValue placeholder=\"Agent\" />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {props.agents.map((agent) => (\n <SelectItem value={agent.id} key={agent.id}>\n {agent.name ?? agent.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\n </div>\n </header>\n\n <div className=\"min-h-0 overflow-auto pb-6 pl-4 pr-6\">\n <div className=\"grid w-full gap-5\">\n {!props.enabled ? (\n <EmptyState\n title=\"Tools unavailable\"\n message=\"No registered Studio agent exposes static or dynamic tools.\"\n />\n ) : props.loading ? (\n <EmptyState title=\"Loading tools\" message=\"Reading registered tool metadata.\" />\n ) : tools.length === 0 ? (\n <EmptyState title=\"No tools\" message=\"The selected agent has no registered tools.\" />\n ) : (\n <>\n <ToolRegistryTable\n selectedToolName={selectedTool?.name ?? \"\"}\n tools={tools}\n onSelectTool={setSelectedToolName}\n />\n <ToolRunner\n argsText={argsText}\n runError={runError}\n runResponse={runResponse}\n runState={runState}\n selectedTool={selectedTool}\n onArgsTextChange={setArgsText}\n onRun={() => void runSelectedTool()}\n />\n </>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nfunction ToolRegistryTable(props: {\n tools: StudioAgentToolMetadata[];\n selectedToolName: string;\n onSelectTool: (toolName: string) => void;\n}) {\n return (\n <div className=\"min-w-[1040px]\">\n <table className=\"w-full border-separate border-spacing-0 text-left\">\n <thead className=\"sticky top-0 z-10 bg-background/95 backdrop-blur\">\n <tr>\n <ToolTableHead>Tool</ToolTableHead>\n <ToolTableHead>Origin</ToolTableHead>\n <ToolTableHead>Schema</ToolTableHead>\n <ToolTableHead>Approval</ToolTableHead>\n <ToolTableHead>Run</ToolTableHead>\n </tr>\n </thead>\n <tbody>\n {props.tools.map((tool) => (\n <ToolRegistryRow\n active={props.selectedToolName === tool.name}\n key={`${tool.source}:${tool.name}`}\n tool={tool}\n onSelectTool={props.onSelectTool}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction ToolRegistryRow(props: {\n tool: StudioAgentToolMetadata;\n active: boolean;\n onSelectTool: (toolName: string) => void;\n}) {\n const propertyCount = schemaPropertyCount(props.tool.parameters);\n return (\n <tr>\n <ToolTableCell>\n <div className=\"grid min-w-0 gap-1.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.tool.name}\n </span>\n {props.active ? <Badge className={selectedBadge}>selected</Badge> : null}\n </div>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {props.tool.agentId}\n </span>\n <p className=\"m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground\">\n {props.tool.description}\n </p>\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <Badge className={originBadgeClass(props.tool)}>{toolOriginLabel(props.tool)}</Badge>\n </ToolTableCell>\n <ToolTableCell>\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <ToolMetaPill>{schemaType(props.tool.parameters)}</ToolMetaPill>\n <ToolMetaPill>\n {propertyCount} {propertyCount === 1 ? \"field\" : \"fields\"}\n </ToolMetaPill>\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <div className=\"grid min-w-0 gap-1.5\">\n <Badge className={approvalBadgeClass(props.tool.approval.required)}>\n {props.tool.approval.required ? \"required\" : \"none\"}\n </Badge>\n {props.tool.approval.reason === undefined ? null : (\n <span\n className=\"max-w-[280px] truncate text-xs leading-5 text-muted-foreground\"\n title={props.tool.approval.reason}\n >\n {props.tool.approval.reason}\n </span>\n )}\n </div>\n </ToolTableCell>\n <ToolTableCell>\n <Button\n className=\"h-8 min-h-8 rounded-md px-3 text-xs\"\n type=\"button\"\n variant={props.active ? \"secondary\" : \"ghost\"}\n onClick={() => props.onSelectTool(props.tool.name)}\n >\n {props.active ? \"Selected\" : \"Use\"}\n </Button>\n </ToolTableCell>\n </tr>\n );\n}\n\nfunction ToolTableHead(props: { children: string }) {\n return (\n <th className=\"border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0\">\n {props.children}\n </th>\n );\n}\n\nfunction ToolTableCell(props: { children: ReactNode }) {\n return (\n <td className=\"border-b border-border/70 py-3.5 pr-5 align-top first:pl-0\">{props.children}</td>\n );\n}\n\nfunction HeaderMetric(props: { label: string; value: number }) {\n return (\n <span className=\"inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground\">\n <span className=\"font-semibold tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nfunction summarizeTools(tools: StudioAgentToolMetadata[]) {\n return tools.reduce(\n (totals, tool) => {\n totals.total += 1;\n if (tool.source === \"dynamic\") {\n totals.dynamic += 1;\n } else {\n totals.static += 1;\n }\n if (tool.mcpServerName !== undefined) {\n totals.mcp += 1;\n }\n if (tool.approval.required) {\n totals.approvals += 1;\n }\n return totals;\n },\n { approvals: 0, dynamic: 0, mcp: 0, static: 0, total: 0 },\n );\n}\n\nconst selectedBadge = \"border-border/80 bg-muted/45 text-foreground\";\n\nfunction EmptyState(props: { title: string; message: string }) {\n return (\n <div className=\"grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center\">\n <div className=\"grid max-w-md gap-2\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">{props.title}</h2>\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">{props.message}</p>\n </div>\n </div>\n );\n}\n"],"mappings":"oSA4BA,SAAgB,EAAU,EAOvB,CACD,IAAM,EACJ,EAAM,OAAO,KAAM,GAAU,EAAM,KAAO,EAAM,gBAAgB,EAAI,EAAM,OAAO,GAC7E,EAAQ,EAAM,SAAS,OAAS,EAAE,CAClC,CAAC,EAAkB,IAAA,EAAA,EAAA,UAAgC,GAAG,CACtD,CAAC,EAAU,IAAA,EAAA,EAAA,UAAwB,KAAK,CACxC,CAAC,EAAU,IAAA,EAAA,EAAA,UAA4C,OAAO,CAC9D,CAAC,EAAa,IAAA,EAAA,EAAA,WAA+D,CAC7E,CAAC,EAAU,IAAA,EAAA,EAAA,UAAwB,GAAG,CACtC,GAAA,EAAA,EAAA,aACE,EAAM,KAAM,GAAS,EAAK,OAAS,EAAiB,EAAI,EAAM,GACpE,CAAC,EAAkB,EAAM,CAC1B,CACK,EACJ,IAAkB,IAAA,IAAa,IAAiB,IAAA,GAC5C,GACA,GAAG,EAAc,GAAG,GAAG,EAAa,OACpC,GAAA,EAAA,EAAA,QAA+B,EAAmB,CAClD,GAAA,EAAA,EAAA,QAAyB,EAAE,CAC3B,EAAa,EAAe,EAAM,EAExC,EAAA,EAAA,eAAgB,CACd,GAAI,EAAM,SAAW,EAAG,CACtB,EAAoB,GAAG,CACvB,OAEG,EAAM,KAAM,GAAS,EAAK,OAAS,EAAiB,EACvD,EAAoB,EAAM,IAAI,MAAQ,GAAG,EAE1C,CAAC,EAAkB,EAAM,CAAC,EAE7B,EAAA,EAAA,eAAgB,CACV,EAAsB,UAAY,IAGtC,EAAsB,QAAU,EAChC,EAAgB,SAAW,EAC3B,EAAY,OAAO,CACnB,EAAY,GAAG,CACf,EAAe,IAAA,GAAU,GACxB,CAAC,EAAmB,CAAC,CAExB,eAAe,GAAkB,CAC/B,GAAI,IAAkB,IAAA,IAAa,IAAiB,IAAA,GAClD,OAEF,IAAI,EACJ,GAAI,CACF,EAAO,KAAK,MAAM,EAAS,OACpB,EAAY,CACnB,EAAY,aAAsB,MAAQ,EAAW,QAAU,OAAO,EAAW,CAAC,CAClF,EAAe,IAAA,GAAU,CACzB,OAGF,EAAY,UAAU,CACtB,EAAY,GAAG,CACf,EAAe,IAAA,GAAU,CACzB,IAAM,EAAa,EACb,EAAY,EAAgB,QAAU,EAC5C,EAAgB,QAAU,EAC1B,IAAM,MACJ,EAAgB,UAAY,GAAa,EAAsB,UAAY,EAC7E,GAAI,CACF,IAAM,EAAW,MAAM,MACrB,WAAW,mBAAmB,EAAc,GAAG,CAAC,SAAS,mBACvD,EAAa,KACd,CAAC,OACF,CACE,OAAQ,OACR,QAAS,CACP,eAAgB,mBACjB,CACD,KAAM,KAAK,UAAU,CAAE,OAAM,CAAC,CAC/B,CACF,CACK,EAAU,MAAM,EAAS,MAAM,CACrC,GAAI,CAAC,GAAc,CACjB,OAEF,IAAM,EAAO,EAA2B,EAAQ,CAChD,GAAI,IAAS,IAAA,GAAW,CACtB,EAAY,wCAAwC,EAAW,EAAQ,GAAG,CAC1E,OAEF,EAAe,EAAK,EAChB,CAAC,EAAS,IAAM,EAAK,SAAW,UAClC,EAAY,EAAW,EAAK,OAAS,EAAK,CAAC,OAEtC,EAAO,CACV,GAAc,EAChB,EAAY,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAAC,QAE7D,CACJ,GAAc,EAChB,EAAY,OAAO,EAKzB,OACE,EAAA,EAAA,MAAC,UAAD,CACE,UAAU,+EACV,aAAW,iBAFb,EAIE,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,+DAChB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yFAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,8BAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,kFAAyE,QAElF,CAAA,EACL,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,oEAA2D,4FAGpE,CAAA,CACA,IACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yEAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,QAAQ,MAAO,EAAW,MAAS,CAAA,EACvD,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,MAAM,MAAO,EAAW,IAAO,CAAA,EACnD,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,SAAS,MAAO,EAAW,OAAU,CAAA,EACzD,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,UAAU,MAAO,EAAW,QAAW,CAAA,EAC3D,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,YAAY,MAAO,EAAW,UAAa,CAAA,CAC9D,EAAM,OAAO,OAAS,GACrB,EAAA,EAAA,MAAC,EAAD,CAAQ,MAAO,GAAe,IAAM,GAAI,cAAe,EAAM,uBAA7D,EACE,EAAA,EAAA,KAAC,EAAD,CAAe,UAAU,6FACvB,EAAA,EAAA,KAAC,EAAD,CAAa,YAAY,QAAU,CAAA,CACrB,CAAA,EAChB,EAAA,EAAA,KAAC,EAAD,CAAe,MAAM,eAClB,EAAM,OAAO,IAAK,IACjB,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAM,YACtB,EAAM,MAAQ,EAAM,GACV,CAFqB,EAAM,GAE3B,CACb,CACY,CAAA,CACT,GACP,KACA,GACF,GACC,CAAA,EAET,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iDACb,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BACX,EAAM,QAKJ,EAAM,SACR,EAAA,EAAA,KAAC,EAAD,CAAY,MAAM,gBAAgB,QAAQ,oCAAsC,CAAA,CAC9E,EAAM,SAAW,GACnB,EAAA,EAAA,KAAC,EAAD,CAAY,MAAM,WAAW,QAAQ,8CAAgD,CAAA,EAErF,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CACE,iBAAkB,GAAc,MAAQ,GACjC,QACP,aAAc,EACd,CAAA,EACF,EAAA,EAAA,KAAC,EAAD,CACY,WACA,WACG,cACH,WACI,eACd,iBAAkB,EAClB,UAAa,KAAK,GAAiB,CACnC,CAAA,CACD,CAAA,CAAA,EAxBH,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,oBACN,QAAQ,8DACR,CAAA,CAuBA,CAAA,CACF,CAAA,CACE,GAId,SAAS,EAAkB,EAIxB,CACD,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2BACb,EAAA,EAAA,MAAC,QAAD,CAAO,UAAU,6DAAjB,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAU,6DACf,EAAA,EAAA,MAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAe,OAAoB,CAAA,EACnC,EAAA,EAAA,KAAC,EAAD,CAAA,SAAe,SAAsB,CAAA,EACrC,EAAA,EAAA,KAAC,EAAD,CAAA,SAAe,SAAsB,CAAA,EACrC,EAAA,EAAA,KAAC,EAAD,CAAA,SAAe,WAAwB,CAAA,EACvC,EAAA,EAAA,KAAC,EAAD,CAAA,SAAe,MAAmB,CAAA,CAC/B,CAAA,CAAA,CACC,CAAA,EACR,EAAA,EAAA,KAAC,QAAD,CAAA,SACG,EAAM,MAAM,IAAK,IAChB,EAAA,EAAA,KAAC,EAAD,CACE,OAAQ,EAAM,mBAAqB,EAAK,KAElC,OACN,aAAc,EAAM,aACpB,CAHK,GAAG,EAAK,OAAO,GAAG,EAAK,OAG5B,CACF,CACI,CAAA,CACF,GACJ,CAAA,CAIV,SAAS,EAAgB,EAItB,CACD,IAAM,EAAgB,EAAoB,EAAM,KAAK,WAAW,CAChE,OACE,EAAA,EAAA,MAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gCAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,kEACb,EAAM,KAAK,KACP,CAAA,CACN,EAAM,QAAS,EAAA,EAAA,KAAC,EAAD,CAAO,UAAW,WAAe,WAAgB,CAAA,CAAG,KAChE,IACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sEACb,EAAM,KAAK,QACP,CAAA,EACP,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,6EACV,EAAM,KAAK,YACV,CAAA,CACA,GACQ,CAAA,EAChB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAD,CAAO,UAAW,EAAiB,EAAM,KAAK,UAAG,EAAgB,EAAM,KAAK,CAAS,CAAA,CACvE,CAAA,EAChB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAe,EAAW,EAAM,KAAK,WAAW,CAAgB,CAAA,EAChE,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,CACG,EAAc,IAAE,IAAkB,EAAI,QAAU,SACpC,CAAA,CAAA,CACX,GACQ,CAAA,EAChB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAO,UAAW,EAAmB,EAAM,KAAK,SAAS,SAAS,UAC/D,EAAM,KAAK,SAAS,SAAW,WAAa,OACvC,CAAA,CACP,EAAM,KAAK,SAAS,SAAW,IAAA,GAAY,MAC1C,EAAA,EAAA,KAAC,OAAD,CACE,UAAU,iEACV,MAAO,EAAM,KAAK,SAAS,gBAE1B,EAAM,KAAK,SAAS,OAChB,CAAA,CAEL,GACQ,CAAA,EAChB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,sCACV,KAAK,SACL,QAAS,EAAM,OAAS,YAAc,QACtC,YAAe,EAAM,aAAa,EAAM,KAAK,KAAK,UAEjD,EAAM,OAAS,WAAa,MACtB,CAAA,CACK,CAAA,CACb,CAAA,CAAA,CAIT,SAAS,EAAc,EAA6B,CAClD,OACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,oIACX,EAAM,SACJ,CAAA,CAIT,SAAS,EAAc,EAAgC,CACrD,OACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,sEAA8D,EAAM,SAAc,CAAA,CAIpG,SAAS,EAAa,EAAyC,CAC7D,OACE,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,mJAAhB,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sDAA8C,EAAM,MAAa,CAAA,CAChF,EAAM,MACF,GAIX,SAAS,EAAe,EAAkC,CACxD,OAAO,EAAM,QACV,EAAQ,KACP,EAAO,OAAS,EACZ,EAAK,SAAW,UAClB,EAAO,SAAW,EAElB,EAAO,QAAU,EAEf,EAAK,gBAAkB,IAAA,KACzB,EAAO,KAAO,GAEZ,EAAK,SAAS,WAChB,EAAO,WAAa,GAEf,GAET,CAAE,UAAW,EAAG,QAAS,EAAG,IAAK,EAAG,OAAQ,EAAG,MAAO,EAAG,CAC1D,CAGH,IAAM,EAAgB,+CAEtB,SAAS,EAAW,EAA2C,CAC7D,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0HACb,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+BAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,uDAA+C,EAAM,MAAW,CAAA,EAC9E,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,uDAA+C,EAAM,QAAY,CAAA,CAC1E,GACF,CAAA"}
@@ -0,0 +1,10 @@
1
+ import{i as e,r as t,s as n,t as r}from"./utils-BN2yP0LH.js";import{a as i,c as a,l as o,m as s,p as c,r as l,s as u,u as d}from"./format-D43vTqrO.js";import{A as f,D as p,E as m,H as h,I as g,K as _,L as v,O as y,T as b,U as x,V as S,W as C,X as w,_ as T,at as E,b as ee,ct as D,k as O,nt as te,ot as ne,st as re,tt as ie,z as k}from"./index-CaB9mtgz.js";import{t as ae}from"./badge-DFrH2vyb.js";var A=n(e(),1),j=t();function oe(e){try{return JSON.stringify(e,null,2)??`undefined`}catch{return String(e)}}function se(e){return(0,j.jsx)(`div`,{className:`overflow-x-auto rounded-lg bg-card/85 px-4 py-4 text-sm leading-6 text-foreground`,children:(0,j.jsx)(ue,{depth:0,path:`$`,value:e.value})})}var ce=16,le=20;function ue(e){return pe(e.value)?(0,j.jsx)(de,{arrayIndex:e.arrayIndex,depth:e.depth,path:e.path,propertyKey:e.propertyKey,trailingComma:e.trailingComma,value:e.value}):(0,j.jsxs)(`div`,{className:`min-w-max whitespace-pre`,style:{paddingLeft:`${M(e.depth)}px`},children:[(0,j.jsx)(N,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),(0,j.jsx)(fe,{value:e.value}),e.trailingComma?(0,j.jsx)(`span`,{className:`text-foreground`,children:`,`}):null]})}function de(e){let[t,n]=(0,A.useState)(e.depth===0),r=Array.isArray(e.value)?e.value:void 0,i=r===void 0?Object.entries(e.value):r.map((e,t)=>[String(t),e]),a=r===void 0?`{`:`[`,o=r===void 0?`}`:`]`,s=r===void 0?`{…}`:`[…]`;return i.length===0?(0,j.jsxs)(`div`,{className:`min-w-max whitespace-pre`,style:{paddingLeft:`${M(e.depth)}px`},children:[(0,j.jsx)(N,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),(0,j.jsxs)(`span`,{className:`text-foreground`,children:[a,o,e.trailingComma?`,`:``]})]}):(0,j.jsxs)(`div`,{className:`grid min-w-max`,children:[(0,j.jsxs)(`button`,{"aria-expanded":t,className:`grid min-w-max grid-cols-[16px_auto] items-center gap-1 rounded-lg py-0.5 pr-2 text-left transition duration-200 hover:bg-accent/45 hover:text-accent-foreground`,onClick:()=>n(e=>!e),style:{paddingLeft:`${e.depth*ce}px`},type:`button`,children:[(0,j.jsx)(`span`,{className:`grid h-4 w-4 place-items-center text-muted-foreground [&_svg]:h-3 [&_svg]:w-3`,children:t?(0,j.jsx)(g,{icon:S,"aria-hidden":`true`}):(0,j.jsx)(g,{icon:x,"aria-hidden":`true`})}),(0,j.jsxs)(`span`,{className:`whitespace-pre`,children:[(0,j.jsx)(N,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),t?(0,j.jsx)(`span`,{className:`text-foreground`,children:a}):(0,j.jsx)(`span`,{className:`text-muted-foreground`,children:s}),!t&&e.trailingComma?(0,j.jsx)(`span`,{className:`text-foreground`,children:`,`}):null]})]}),t?(0,j.jsxs)(j.Fragment,{children:[i.map(([t,n],a)=>(0,j.jsx)(ue,{arrayIndex:r===void 0?void 0:Number(t),depth:e.depth+1,path:`${e.path}.${t}`,propertyKey:r===void 0?t:void 0,trailingComma:a<i.length-1,value:n},`${e.path}.${t}`)),(0,j.jsxs)(`div`,{className:`min-w-max whitespace-pre text-foreground`,style:{paddingLeft:`${M(e.depth)}px`},children:[o,e.trailingComma?`,`:``]})]}):null]})}function M(e){return e*ce+le}function N(e){return e.propertyKey===void 0?e.arrayIndex===void 0?null:(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`span`,{className:`text-muted-foreground`,children:[`[`,e.arrayIndex,`]`]}),(0,j.jsx)(`span`,{className:`text-foreground`,children:` `})]}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`text-muted-foreground`,children:JSON.stringify(e.propertyKey)}),(0,j.jsx)(`span`,{className:`text-foreground`,children:`: `})]})}function fe(e){return typeof e.value==`string`?(0,j.jsx)(`span`,{className:`text-foreground`,children:JSON.stringify(e.value)}):typeof e.value==`number`?(0,j.jsx)(`span`,{className:`text-foreground`,children:String(e.value)}):typeof e.value==`boolean`?(0,j.jsx)(`span`,{className:`text-chart-4`,children:String(e.value)}):e.value===null?(0,j.jsx)(`span`,{className:`text-muted-foreground`,children:`null`}):e.value===void 0?(0,j.jsx)(`span`,{className:`text-muted-foreground`,children:`undefined`}):(0,j.jsx)(`span`,{className:`text-foreground`,children:oe(e.value)})}function pe(e){return Array.isArray(e)||s(e)}function me(e){return e.label===`Message Id`}function he(e){let t=`h-3.5 w-3.5 shrink-0`;switch(e.label){case`System prompt`:return(0,j.jsx)(g,{icon:ne,"aria-hidden":`true`,className:t});case`Prompt`:return(0,j.jsx)(g,{icon:_,"aria-hidden":`true`,className:t});case`Output`:case`Assistant output`:return(0,j.jsx)(g,{icon:C,"aria-hidden":`true`,className:t});default:return null}}function ge(e,t){if(e===`Output`){let e=_e(t);if(e.length>0)return e}let n=P(t,e);if(n.length>0)return n;if(!s(t))return[{label:e,text:xe(t)}];let r=[];for(let[e,n]of Object.entries(t)){let t=P(n,e);if(t.length>0){r.push(...t);continue}r.push({label:I(e),text:xe(n)})}return r.length>0?r:[{label:e,text:`Empty object`}]}function _e(e){if(!s(e))return[];let t=[],n=P(e.choice,`choice`);return t.push(...n),typeof e.messageId==`string`&&e.messageId.length>0&&t.push({label:`Message Id`,text:e.messageId}),t}function P(e,t){if(typeof e==`string`&&t===void 0)return[{label:`Value`,text:e}];if(Array.isArray(e))return t===`chatHistory`?ve(e):t===`history`?ye(e):e.map((e,n)=>({label:F(e,n,t),text:D(e)||u(e)})).filter(e=>e.text.length>0);if(!s(e))return[];let n=Array.isArray(e.chatHistory)?e.chatHistory:void 0;if(n!==void 0){let t=be(e);return t.push(...P(n,`chatHistory`)),t}if(Array.isArray(e.prompt))return P(e.prompt,`prompt`);let r=[];r.push(...be(e));let i=Array.isArray(e.history)?e.history:[];i.length>0&&r.push(...P(i,`history`));let a=D(e.prompt);return a.length>0&&r.push({label:i.length>0?`Current prompt`:`Prompt`,text:a}),r}function ve(e){let t=e.map((e,t)=>({label:F(e,t,`chatHistory`),text:D(e)||u(e)})).filter(e=>e.text.length>0),n=t.at(-1),r=t.slice(0,-1),i=[];return r.length>0&&i.push({label:`Conversation history (${r.length})`,text:r.map((e,t)=>`${t+1}. ${e.label}\n${e.text}`).join(`
2
+
3
+ `)}),n!==void 0&&i.push({label:r.length>0?`Current prompt`:`Prompt`,text:n.text}),i}function ye(e){let t=e.map((e,t)=>({label:F(e,t,`history`),text:D(e)||u(e)})).filter(e=>e.text.length>0);return t.length===0?[]:[{label:`Conversation history (${t.length})`,text:t.map((e,t)=>`${t+1}. ${e.label}\n${e.text}`).join(`
4
+
5
+ `)}]}function F(e,t,n){if(s(e)){let t=typeof e.type==`string`?e.type:void 0;if(n===`choice`){if(t===`text`)return`Assistant output`;if(t===`reasoning`)return`Reasoning`}if(t===`reasoning`)return`Reasoning`;if(typeof e.role==`string`)return I(e.role);if(t!==void 0)return I(t)}return`${n===void 0?`Item`:`${I(n)} item`} ${t+1}`}function I(e){return e.replace(/[_-]+/g,` `).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).trim().replace(/\b\w/g,e=>e.toUpperCase())}function be(e){let t=e.instructions;return typeof t!=`string`||t.trim().length===0?[]:[{label:`System prompt`,text:t}]}function xe(e){if(e===void 0)return`undefined`;if(e===null)return`null`;if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e,null,2)}catch{return String(e)}}function Se(e){let t=new Map;for(let n of e.observations){let e=Number.isFinite(n.turn)?n.turn:t.size+1;t.set(e,[...t.get(e)??[],n])}return[...t.entries()].sort(([e],[t])=>e-t).map(([e,t])=>({turn:e,observations:t,durationMs:t.reduce((e,t)=>e+(t.durationMs??0),0)}))}function Ce(e){let t=new Map;for(let n of e)t.set(n.id,{observation:n,children:[]});let n=[];for(let r of e){let e=t.get(r.id);if(e===void 0)continue;let i=r.parentObservationId,a=i===void 0?void 0:t.get(i);a===void 0?n.push(e):a.children.push(e)}return n}function we(e,t,n){if(n===`agent`)return{title:`agent.run`,tone:`agent`,startedAt:o(e.startedAt),durationMs:e.durationMs,firstDeltaMs:R(e.observations),usage:d(e.usage),input:e.input,output:e.output,error:e.error,metadata:Te(e)};if(n.startsWith(`turn:`)){let r=Number(n.slice(5)),i=t.find(e=>e.turn===r);return{title:`turn.${Number.isFinite(r)?r:1}`,tone:`turn`,startedAt:o(i?.observations[0]?.startedAt??e.startedAt),durationMs:i?.durationMs,firstDeltaMs:R(i?.observations??[]),usage:Be(i?.observations??[]),input:i?.observations[0]?.input,output:i?.observations.at(-1)?.output,metadata:Ee(r,i?.observations??[])}}if(n.startsWith(`observation:`)){let t=n.slice(12),r=e.observations.find(e=>e.id===t);if(r!==void 0)return{title:Fe(r),tone:r.kind,startedAt:o(r.startedAt),durationMs:r.durationMs,firstDeltaMs:Ie(r.metadata),usage:z(r),input:r.input,output:r.output,error:r.error,metadata:De(r)}}return{title:e.name??`Agent`,tone:`trace`,startedAt:o(e.startedAt),durationMs:e.durationMs,firstDeltaMs:R(e.observations),usage:d(e.usage),input:e.input,output:e.output,error:e.error,metadata:Te(e)}}function Te(e){let t=s(e.metadata)?e.metadata:{},n=L({status:e.status,traceId:e.trace?.traceId??e.id,observationId:e.trace?.observationId,sessionId:e.sessionId,observationCount:e.observationCount,messageCount:Pe(t.messages),startedAt:e.startedAt,endedAt:e.endedAt,durationMs:e.durationMs});return L({...t,status:e.status,traceId:e.trace?.traceId??e.id,observationId:e.trace?.observationId,sessionId:e.sessionId,observationCount:e.observationCount,messageCount:Pe(t.messages),startedAt:e.startedAt,endedAt:e.endedAt,durationMs:e.durationMs,trace:s(t.trace)?t.trace:n})}function Ee(e,t){return L({turn:e,observationCount:t.length,generationCount:t.filter(e=>e.kind===`generation`).length,toolCount:t.filter(e=>e.kind===`tool`).length,agentCount:t.filter(e=>e.kind===`agent`).length,firstDeltaMs:R(t),status:Ne(t),startedAt:t[0]?.startedAt,endedAt:t.at(-1)?.endedAt})}function De(e){let t=L({...s(e.metadata)?e.metadata:{},status:e.status,kind:e.kind,turn:e.turn,parentObservationId:e.parentObservationId??null,startedAt:e.startedAt,endedAt:e.endedAt??null,durationMs:e.durationMs});return L({...t,trace:s(t.trace)?t.trace:L({status:e.status,kind:e.kind,turn:e.turn,parentObservationId:e.parentObservationId??null,startedAt:e.startedAt,endedAt:e.endedAt??null,durationMs:e.durationMs}),modelInfo:s(t.modelInfo)?t.modelInfo:Oe(t),modelCall:s(t.modelCall)?t.modelCall:ke(t),response:s(t.response)?t.response:Ae(t),tools:s(t.tools)?t.tools:je(t),timing:s(t.timing)?t.timing:Me(t)})}function Oe(e){let t=L({provider:e.provider,model:e.model,requestedModel:e.requestedModel,defaultModel:e.defaultModel});return Object.keys(t).length===0?void 0:t}function ke(e){let t=L({messageCount:e.historyCount,documentCount:e.documentCount,toolCount:e.toolCount,toolNames:e.toolNames,temperature:e.temperature,maxTokens:e.maxTokens,toolChoice:e.toolChoice,hasOutputSchema:e.hasOutputSchema,additionalParamKeys:e.additionalParamKeys}),n=L({request:Object.keys(t).length===0?void 0:t,providerRequest:e.providerRequest});return Object.keys(n).length===0?void 0:n}function Ae(e){let t=L({messageId:e.messageId,usage:e.usage,providerResponse:e.providerResponse});return Object.keys(t).length===0?void 0:t}function je(e){let t=L({count:e.toolCount,names:e.toolNames,toolChoice:e.toolChoice,internalCallId:e.internalCallId,toolCallId:e.toolCallId,skipped:e.skipped,description:e.toolDescription,parameterKeys:e.parameterKeys,requiredParameterKeys:e.requiredParameterKeys,approvalRequired:e.approvalRequired,mcpServerName:e.mcpServerName,argumentBytes:e.argumentBytes,resultBytes:e.resultBytes});return Object.keys(t).length===0?void 0:t}function Me(e){let t=L({firstDeltaMs:e.firstDeltaMs,durationMs:e.durationMs,startedAt:e.startedAt,endedAt:e.endedAt});return Object.keys(t).length===0?void 0:t}function Ne(e){return e.length===0?`empty`:e.some(e=>e.status===`error`)?`error`:e.some(e=>e.status===`running`)?`running`:`success`}function Pe(e){return Array.isArray(e)?e.length:void 0}function L(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function Fe(e){return e.kind===`agent`?e.name:e.kind===`tool`?`tool.${e.name}`:e.name}function R(e){for(let t of e){let e=Ie(t.metadata);if(e!==void 0)return e}}function Ie(e){if(!(!s(e)||typeof e.firstDeltaMs!=`number`))return e.firstDeltaMs}function Le(e){switch(e){case`success`:return`bg-foreground`;case`error`:return`bg-destructive`;case`running`:return`bg-muted-foreground`}}function Re(e){switch(e.tone){case`trace`:return(0,j.jsx)(g,{icon:te,"aria-hidden":`true`});case`agent`:return(0,j.jsx)(g,{icon:E,"aria-hidden":`true`});case`turn`:return(0,j.jsx)(g,{icon:ie,"aria-hidden":`true`});case`generation`:return(0,j.jsx)(g,{icon:w,"aria-hidden":`true`});case`tool`:return(0,j.jsx)(g,{icon:re,"aria-hidden":`true`})}}function ze(e){switch(e){case`trace`:return`bg-foreground text-background`;case`agent`:return`bg-muted-foreground text-background`;case`turn`:return`bg-chart-4 text-background`;case`generation`:return`bg-foreground text-background`;case`tool`:return`bg-destructive text-background`}}function z(e){return!s(e.output)||!s(e.output.usage)?``:Ve(e.output.usage)}function Be(e){return e.map(z).filter(e=>e.length>0).join(` + `)}function Ve(e){let t=typeof e.inputTokens==`number`?e.inputTokens:0,n=typeof e.outputTokens==`number`?e.outputTokens:0,r=typeof e.totalTokens==`number`?e.totalTokens:t+n;return r===0?``:`${t} -> ${n} (Σ ${r})`}function He({className:e,...t}){return(0,j.jsx)(`div`,{className:r(`rounded-xl border border-border/80 bg-card/95 text-card-foreground shadow-sm shadow-black/20`,e),...t})}var Ue=Object.defineProperty,B=(e,t)=>Ue(e,`name`,{value:t,configurable:!0});function We(e,t){return A.useReducer((e,n)=>t[e][n]??e,e)}B(We,`useStateMachine`);var Ge=`ScrollArea`,[Ke,qe]=y(Ge),[Je,V]=Ke(Ge),Ye=A.forwardRef(B(function(e,t){let{__scopeScrollArea:n,type:r=`hover`,dir:i,scrollHideDelay:a=600,...o}=e,[s,c]=A.useState(null),[l,u]=A.useState(null),[d,f]=A.useState(null),[h,g]=A.useState(null),[_,v]=A.useState(null),[y,b]=A.useState(0),[x,S]=A.useState(0),[C,w]=A.useState(!1),[T,E]=A.useState(!1),ee=k(t,c),D=p(i);return(0,j.jsx)(Je,{scope:n,type:r,dir:D,scrollHideDelay:a,scrollArea:s,viewport:l,onViewportChange:u,content:d,onContentChange:f,scrollbarX:h,onScrollbarXChange:g,scrollbarXEnabled:C,onScrollbarXEnabledChange:w,scrollbarY:_,onScrollbarYChange:v,scrollbarYEnabled:T,onScrollbarYEnabledChange:E,onCornerWidthChange:b,onCornerHeightChange:S,children:(0,j.jsx)(m.div,{dir:D,...o,ref:ee,style:{position:`relative`,"--radix-scroll-area-corner-width":y+`px`,"--radix-scroll-area-corner-height":x+`px`,...e.style}})})},`ScrollArea`)),Xe=`ScrollAreaViewport`,Ze=A.forwardRef(B(function(e,t){let{__scopeScrollArea:n,children:r,nonce:i,...a}=e,o=V(Xe,n),s=k(t,A.useRef(null),o.onViewportChange);return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(Qe,{nonce:i}),(0,j.jsx)(m.div,{"data-radix-scroll-area-viewport":``,...a,ref:s,style:{overflowX:o.scrollbarXEnabled?`scroll`:`hidden`,overflowY:o.scrollbarYEnabled?`scroll`:`hidden`,...e.style},children:(0,j.jsx)(`div`,{ref:o.onContentChange,style:{minWidth:`100%`,display:`table`},children:r})})]})},`ScrollAreaViewport`)),Qe=A.memo(B(function({nonce:e}){return(0,j.jsx)(`style`,{dangerouslySetInnerHTML:{__html:`[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`},nonce:e})},`ScrollAreaViewportStyle`),(e,t)=>e.nonce===t.nonce),H=`ScrollAreaScrollbar`,$e=A.forwardRef(B(function(e,t){let{forceMount:n,...r}=e,i=V(H,e.__scopeScrollArea),{onScrollbarXEnabledChange:a,onScrollbarYEnabledChange:o}=i,s=e.orientation===`horizontal`;return A.useEffect(()=>(s?a(!0):o(!0),()=>{s?a(!1):o(!1)}),[s,a,o]),i.type===`hover`?(0,j.jsx)(et,{...r,ref:t,forceMount:n}):i.type===`scroll`?(0,j.jsx)(tt,{...r,ref:t,forceMount:n}):i.type===`auto`?(0,j.jsx)(nt,{...r,ref:t,forceMount:n}):i.type===`always`?(0,j.jsx)(U,{...r,ref:t,"data-state":`visible`}):null},`ScrollAreaScrollbar`)),et=A.forwardRef(B(function(e,t){let{forceMount:n,...r}=e,i=V(H,e.__scopeScrollArea),[a,o]=A.useState(!1);return A.useEffect(()=>{let e=i.scrollArea,t=0;if(e){let n=B(()=>{window.clearTimeout(t),o(!0)},`handlePointerEnter`),r=B(()=>{t=window.setTimeout(()=>o(!1),i.scrollHideDelay)},`handlePointerLeave`);return e.addEventListener(`pointerenter`,n),e.addEventListener(`pointerleave`,r),()=>{window.clearTimeout(t),e.removeEventListener(`pointerenter`,n),e.removeEventListener(`pointerleave`,r)}}},[i.scrollArea,i.scrollHideDelay]),(0,j.jsx)(T,{present:n||a,children:(0,j.jsx)(nt,{"data-state":a?`visible`:`hidden`,...r,ref:t})})},`ScrollAreaScrollbarHover`)),tt=A.forwardRef(B(function(e,t){let{forceMount:n,...r}=e,i=V(H,e.__scopeScrollArea),a=e.orientation===`horizontal`,o=X(()=>c(`SCROLL_END`),100),[s,c]=We(`hidden`,{hidden:{SCROLL:`scrolling`},scrolling:{SCROLL_END:`idle`,POINTER_ENTER:`interacting`},interacting:{SCROLL:`interacting`,POINTER_LEAVE:`idle`},idle:{HIDE:`hidden`,SCROLL:`scrolling`,POINTER_ENTER:`interacting`}});return A.useEffect(()=>{if(s===`idle`){let e=window.setTimeout(()=>c(`HIDE`),i.scrollHideDelay);return()=>window.clearTimeout(e)}},[s,i.scrollHideDelay,c]),A.useEffect(()=>{let e=i.viewport,t=a?`scrollLeft`:`scrollTop`;if(e){let n=e[t],r=B(()=>{let r=e[t];n!==r&&(c(`SCROLL`),o()),n=r},`handleScroll`);return e.addEventListener(`scroll`,r),()=>e.removeEventListener(`scroll`,r)}},[i.viewport,a,c,o]),(0,j.jsx)(T,{present:n||s!==`hidden`,children:(0,j.jsx)(U,{"data-state":s===`hidden`?`hidden`:`visible`,...r,ref:t,onPointerEnter:O(e.onPointerEnter,()=>c(`POINTER_ENTER`)),onPointerLeave:O(e.onPointerLeave,()=>c(`POINTER_LEAVE`))})})},`ScrollAreaScrollbarScroll`)),nt=A.forwardRef(B(function(e,t){let n=V(H,e.__scopeScrollArea),{forceMount:r,...i}=e,[a,o]=A.useState(!1),s=e.orientation===`horizontal`,c=X(()=>{if(n.viewport){let e=n.viewport.offsetWidth<n.viewport.scrollWidth,t=n.viewport.offsetHeight<n.viewport.scrollHeight;o(s?e:t)}},10);return Z(n.viewport,c),Z(n.content,c),(0,j.jsx)(T,{present:r||a,children:(0,j.jsx)(U,{"data-state":a?`visible`:`hidden`,...i,ref:t})})},`ScrollAreaScrollbarAuto`)),U=A.forwardRef(B(function(e,t){let{orientation:n=`vertical`,...r}=e,i=V(H,e.__scopeScrollArea),a=A.useRef(null),o=A.useRef(0),[s,c]=A.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),l=K(s.viewport,s.content),u={...r,sizes:s,onSizesChange:c,hasThumb:l>0&&l<1,onThumbChange:B(e=>a.current=e,`onThumbChange`),onThumbPointerUp:B(()=>o.current=0,`onThumbPointerUp`),onThumbPointerDown:B(e=>o.current=e,`onThumbPointerDown`)};function d(e,t){return pt(e,o.current,s,t)}return B(d,`getScrollPosition`),n===`horizontal`?(0,j.jsx)(rt,{...u,ref:t,onThumbPositionChange:()=>{if(i.viewport&&a.current){let e=i.viewport.scrollLeft,t=J(e,s,i.dir);a.current.style.transform=`translate3d(${t}px, 0, 0)`}},onWheelScroll:e=>{i.viewport&&(i.viewport.scrollLeft=e)},onDragScroll:e=>{i.viewport&&(i.viewport.scrollLeft=d(e,i.dir))}}):n===`vertical`?(0,j.jsx)(it,{...u,ref:t,onThumbPositionChange:()=>{if(i.viewport&&a.current){let e=i.viewport.scrollTop,t=J(e,s);a.current.style.transform=`translate3d(0, ${t}px, 0)`}},onWheelScroll:e=>{i.viewport&&(i.viewport.scrollTop=e)},onDragScroll:e=>{i.viewport&&(i.viewport.scrollTop=d(e))}}):null},`ScrollAreaScrollbarVisible`)),rt=A.forwardRef(B(function(e,t){let{sizes:n,onSizesChange:r,...i}=e,a=V(H,e.__scopeScrollArea),[o,s]=A.useState(),c=A.useRef(null),l=k(t,c,a.onScrollbarXChange);return A.useEffect(()=>{c.current&&s(getComputedStyle(c.current))},[c]),(0,j.jsx)(st,{"data-orientation":`horizontal`,...i,ref:l,sizes:n,style:{bottom:0,left:a.dir===`rtl`?`var(--radix-scroll-area-corner-width)`:0,right:a.dir===`ltr`?`var(--radix-scroll-area-corner-width)`:0,"--radix-scroll-area-thumb-width":q(n)+`px`,...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.x),onDragScroll:t=>e.onDragScroll(t.x),onWheelScroll:(t,n)=>{if(a.viewport){let r=a.viewport.scrollLeft+t.deltaX;e.onWheelScroll(r),mt(r,n)&&t.preventDefault()}},onResize:()=>{c.current&&a.viewport&&o&&r({content:a.viewport.scrollWidth,viewport:a.viewport.offsetWidth,scrollbar:{size:c.current.clientWidth,paddingStart:G(o.paddingLeft),paddingEnd:G(o.paddingRight)}})}})},`ScrollAreaScrollbarX`)),it=A.forwardRef(B(function(e,t){let{sizes:n,onSizesChange:r,...i}=e,a=V(H,e.__scopeScrollArea),[o,s]=A.useState(),c=A.useRef(null),l=k(t,c,a.onScrollbarYChange);return A.useEffect(()=>{c.current&&s(getComputedStyle(c.current))},[c]),(0,j.jsx)(st,{"data-orientation":`vertical`,...i,ref:l,sizes:n,style:{top:0,right:a.dir===`ltr`?0:void 0,left:a.dir===`rtl`?0:void 0,bottom:`var(--radix-scroll-area-corner-height)`,"--radix-scroll-area-thumb-height":q(n)+`px`,...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.y),onDragScroll:t=>e.onDragScroll(t.y),onWheelScroll:(t,n)=>{if(a.viewport){let r=a.viewport.scrollTop+t.deltaY;e.onWheelScroll(r),mt(r,n)&&t.preventDefault()}},onResize:()=>{c.current&&a.viewport&&o&&r({content:a.viewport.scrollHeight,viewport:a.viewport.offsetHeight,scrollbar:{size:c.current.clientHeight,paddingStart:G(o.paddingTop),paddingEnd:G(o.paddingBottom)}})}})},`ScrollAreaScrollbarY`)),[at,ot]=Ke(H),st=A.forwardRef(B(function(e,t){let{__scopeScrollArea:n,sizes:r,hasThumb:i,onThumbChange:a,onThumbPointerUp:o,onThumbPointerDown:s,onThumbPositionChange:c,onDragScroll:l,onWheelScroll:u,onResize:d,...f}=e,p=V(H,n),[h,g]=A.useState(null),_=k(t,g),v=A.useRef(null),y=A.useRef(``),x=p.viewport,S=r.content-r.viewport,C=b(u),w=b(c),T=X(d,10);function E(e){v.current&&l({x:e.clientX-v.current.left,y:e.clientY-v.current.top})}return B(E,`handleDragScroll`),A.useEffect(()=>{let e=B(e=>{let t=e.target;h?.contains(t)&&C(e,S)},`handleWheel`);return document.addEventListener(`wheel`,e,{passive:!1}),()=>document.removeEventListener(`wheel`,e,{passive:!1})},[x,h,S,C]),A.useEffect(w,[r,w]),Z(h,T),Z(p.content,T),(0,j.jsx)(at,{scope:n,scrollbar:h,hasThumb:i,onThumbChange:b(a),onThumbPointerUp:b(o),onThumbPositionChange:w,onThumbPointerDown:b(s),children:(0,j.jsx)(m.div,{...f,ref:_,style:{position:`absolute`,...f.style},onPointerDown:O(e.onPointerDown,e=>{e.button===0&&(e.target.setPointerCapture(e.pointerId),v.current=h.getBoundingClientRect(),y.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect=`none`,p.viewport&&(p.viewport.style.scrollBehavior=`auto`),E(e))}),onPointerMove:O(e.onPointerMove,E),onPointerUp:O(e.onPointerUp,e=>{let t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=y.current,p.viewport&&(p.viewport.style.scrollBehavior=``),v.current=null})})})},`ScrollAreaScrollbarImpl`)),W=`ScrollAreaThumb`,ct=A.forwardRef(B(function(e,t){let{forceMount:n,...r}=e,i=ot(W,e.__scopeScrollArea);return(0,j.jsx)(T,{present:n||i.hasThumb,children:(0,j.jsx)(lt,{ref:t,...r})})},`ScrollAreaThumb`)),lt=A.forwardRef(B(function(e,t){let{__scopeScrollArea:n,style:r,...i}=e,a=V(W,n),o=ot(W,n),{onThumbPositionChange:s}=o,c=k(t,o.onThumbChange),l=A.useRef(void 0),u=X(()=>{l.current&&=(l.current(),void 0)},100);return A.useEffect(()=>{let e=a.viewport;if(e){let t=B(()=>{u(),l.current||(l.current=ht(e,s),s())},`handleScroll`);return s(),e.addEventListener(`scroll`,t),()=>e.removeEventListener(`scroll`,t)}},[a.viewport,u,s]),(0,j.jsx)(m.div,{"data-state":o.hasThumb?`visible`:`hidden`,...i,ref:c,style:{width:`var(--radix-scroll-area-thumb-width)`,height:`var(--radix-scroll-area-thumb-height)`,...r},onPointerDownCapture:O(e.onPointerDownCapture,e=>{let t=e.target.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;o.onThumbPointerDown({x:n,y:r})}),onPointerUp:O(e.onPointerUp,o.onThumbPointerUp)})},`ScrollAreaThumbImpl`)),ut=`ScrollAreaCorner`,dt=A.forwardRef(B(function(e,t){let n=V(ut,e.__scopeScrollArea),r=!!(n.scrollbarX&&n.scrollbarY);return n.type!==`scroll`&&r?(0,j.jsx)(ft,{...e,ref:t}):null},`ScrollAreaCorner`)),ft=A.forwardRef(B(function(e,t){let{__scopeScrollArea:n,...r}=e,i=V(ut,n),[a,o]=A.useState(0),[s,c]=A.useState(0),l=!!(a&&s),{onCornerWidthChange:u,onCornerHeightChange:d}=i;return Z(i.scrollbarX,()=>{let e=i.scrollbarX?.offsetHeight||0;i.onCornerHeightChange(e),c(e)}),Z(i.scrollbarY,()=>{let e=i.scrollbarY?.offsetWidth||0;i.onCornerWidthChange(e),o(e)}),A.useEffect(()=>()=>{u(0),d(0)},[u,d]),l?(0,j.jsx)(m.div,{...r,ref:t,style:{width:a,height:s,position:`absolute`,right:i.dir===`ltr`?0:void 0,left:i.dir===`rtl`?0:void 0,bottom:0,...e.style}}):null},`ScrollAreaCornerImpl`));function G(e){return e?parseInt(e,10):0}B(G,`toInt`);function K(e,t){let n=e/t;return isNaN(n)?0:n}B(K,`getThumbRatio`);function q(e){let t=K(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}B(q,`getThumbSize`);function pt(e,t,n,r=`ltr`){let i=q(n),a=i/2,o=t||a,s=i-o,c=n.scrollbar.paddingStart+o,l=n.scrollbar.size-n.scrollbar.paddingEnd-s,u=n.content-n.viewport,d=r===`ltr`?[0,u]:[u*-1,0];return Y([c,l],d)(e)}B(pt,`getScrollPositionFromPointer`);function J(e,t,n=`ltr`){let r=q(t),i=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,a=t.scrollbar.size-i,o=t.content-t.viewport,s=a-r,c=f(e,n===`ltr`?[0,o]:[o*-1,0]);return Y([0,o],[0,s])(c)}B(J,`getThumbOffsetFromScroll`);function Y(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];let r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}B(Y,`linearScale`);function mt(e,t){return e>0&&e<t}B(mt,`isScrollingWithinScrollbarBounds`);var ht=B((e,t=()=>{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return B((function i(){let a={left:e.scrollLeft,top:e.scrollTop},o=n.left!==a.left,s=n.top!==a.top;(o||s)&&t(),n=a,r=window.requestAnimationFrame(i)}),`loop`)(),()=>window.cancelAnimationFrame(r)},`addUnlinkedScrollListener`);function X(e,t){let n=b(e),r=A.useRef(0);return A.useEffect(()=>()=>window.clearTimeout(r.current),[]),A.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}B(X,`useDebounceCallback`);function Z(e,t){let n=b(t);ee(()=>{let t=0;if(e){let r=new ResizeObserver(()=>{cancelAnimationFrame(t),t=window.requestAnimationFrame(n)});return r.observe(e),()=>{window.cancelAnimationFrame(t),r.unobserve(e)}}},[e,n])}B(Z,`useResizeObserver`);var gt=Ye,_t=Ze,vt=dt;function yt({className:e,children:t,...n}){return(0,j.jsxs)(gt,{className:r(`relative overflow-hidden`,e),...n,children:[(0,j.jsx)(_t,{className:`h-full w-full rounded-[inherit]`,children:t}),(0,j.jsx)(bt,{}),(0,j.jsx)(vt,{})]})}function bt({className:e,orientation:t=`vertical`,...n}){return(0,j.jsx)($e,{orientation:t,className:r(`flex touch-none select-none transition-colors`,t===`vertical`&&`h-full w-2.5 border-l border-l-transparent p-px`,t===`horizontal`&&`h-2.5 flex-col border-t border-t-transparent p-px`,e),...n,children:(0,j.jsx)(ct,{className:`relative flex-1 rounded-lg bg-muted-foreground/40`})})}function xt(e){if(!e.tracesEnabled)return(0,j.jsx)(`div`,{className:`w-full rounded-lg border border-dashed border-border p-8 text-sm font-medium text-muted-foreground`,children:`Tracing is disabled`});let t=e.selectedTraceId.length===0?void 0:e.traces.find(t=>t.id===e.selectedTraceId),n=t===void 0||e.traceSessionDetailId!==t.sessionId?[]:e.traces.filter(e=>e.sessionId===t.sessionId);return(0,j.jsx)(`section`,{className:`grid h-full min-h-0 w-full content-stretch pb-6 pl-0 pr-6`,"aria-label":`Tracing`,children:e.selectedTraceId.length===0?(0,j.jsx)(St,{agents:e.agents,traces:e.traces,traceLoadState:e.traceLoadState,onSelectTrace:e.onSelectTrace}):(0,j.jsx)(Ct,{selectedTrace:t,selectedSessionTraces:n,selectedTraceId:e.selectedTraceId,traceLoadState:e.traceLoadState,onBack:()=>e.onSelectTrace(``),onShowSessionTraces:e.onShowSessionTraces})})}function St(e){return(0,j.jsx)(He,{className:`min-h-0 overflow-hidden rounded-xl border-border/80 bg-card/80`,"aria-label":`Traces`,children:(0,j.jsx)(yt,{className:`h-full min-h-0`,children:(0,j.jsxs)(`div`,{className:`grid min-w-280 gap-1 p-2`,children:[(0,j.jsxs)(`div`,{className:`sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_150px_120px_120px_120px_120px_110px_90px] items-center gap-4 rounded-lg border border-border/60 bg-card/95 px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur`,children:[(0,j.jsx)(`span`,{children:`Trace`}),(0,j.jsx)(`span`,{children:`Session`}),(0,j.jsx)(`span`,{children:`Agent`}),(0,j.jsx)(`span`,{children:`Status`}),(0,j.jsx)(`span`,{children:`Started`}),(0,j.jsx)(`span`,{children:`Duration`}),(0,j.jsx)(`span`,{children:`First delta`}),(0,j.jsx)(`span`,{children:`Events`})]}),e.traceLoadState===`loading`&&e.traces.length===0?(0,j.jsx)(`div`,{className:`px-5 py-4 text-sm font-medium text-muted-foreground`,children:`Loading traces`}):null,e.traceLoadState===`idle`&&e.traces.length===0?(0,j.jsx)(`div`,{className:`px-5 py-4 text-sm font-medium text-muted-foreground`,children:`No traces found`}):null,e.traces.map(t=>(0,j.jsxs)(v,{className:`grid h-auto min-h-14 w-full grid-cols-[minmax(220px,1.3fr)_150px_120px_120px_120px_120px_110px_90px] items-center justify-start gap-4 whitespace-normal rounded-lg border border-transparent bg-transparent px-4 py-2.5 text-left text-muted-foreground shadow-none transition duration-200 hover:border-border/70 hover:bg-accent/70 hover:text-accent-foreground`,type:`button`,variant:`ghost`,onClick:()=>e.onSelectTrace(t.id),children:[(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:t.id}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium`,children:t.sessionId}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium`,children:c(e.agents,t)}),(0,j.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2 text-xs font-medium capitalize`,children:[(0,j.jsx)(`span`,{className:r(`h-2.5 w-2.5 shrink-0 rounded-lg`,Le(t.status))}),(0,j.jsx)(`span`,{className:`min-w-0 truncate`,children:t.status})]}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium`,children:a(t.startedAt)}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium`,children:l(i(t.durationMs))}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium`,children:l(i(R(t.observations)))}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium tabular-nums`,children:t.observationCount})]},t.id))]})})})}function Ct(e){return(0,j.jsxs)(`div`,{className:`grid h-full min-h-0 min-w-0 grid-rows-[auto_minmax(0,1fr)] gap-2 overflow-hidden rounded-xl border border-border/80 bg-card/70 p-2 shadow-sm`,children:[(0,j.jsxs)(`header`,{className:`grid min-h-16 grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 overflow-hidden rounded-lg border border-border/60 bg-card/95 px-4 py-3`,children:[(0,j.jsx)(v,{"aria-label":`Back to traces`,className:`h-8 min-h-8 w-8 text-muted-foreground hover:text-foreground`,size:`icon`,type:`button`,variant:`ghost`,onClick:e.onBack,children:(0,j.jsx)(g,{icon:h,"aria-hidden":`true`})}),(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,j.jsx)(`strong`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.selectedTrace?.name??`Trace detail`}),(0,j.jsx)(`span`,{className:`flex min-w-0 items-center gap-2 overflow-hidden text-xs font-medium text-muted-foreground`,children:e.selectedTrace===void 0?e.traceLoadState===`loading`?`Loading trace`:`Trace not found`:(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:r(`h-2 w-2 shrink-0 rounded-lg`,Le(e.selectedTrace.status))}),(0,j.jsx)(`span`,{className:`shrink-0 capitalize`,children:e.selectedTrace.status}),(0,j.jsx)(`span`,{className:`shrink-0`,"aria-hidden":`true`,children:`/`}),(0,j.jsxs)(`span`,{className:`min-w-0 flex-1 truncate`,children:[`Session `,(0,j.jsx)(`span`,{className:` font-semibold`,children:e.selectedTrace.sessionId})]})]})})]}),(0,j.jsx)(`span`,{className:`hidden max-w-[42vw] truncate rounded-lg bg-muted px-2 py-1 text-xs font-medium text-muted-foreground md:block`,children:e.selectedTraceId})]}),(0,j.jsx)(`div`,{className:`min-h-0 min-w-0 overflow-hidden`,children:e.selectedTrace===void 0?(0,j.jsx)(He,{className:`grid h-full place-items-center rounded-lg border-border bg-card p-6 text-sm font-medium text-muted-foreground`,children:e.traceLoadState===`loading`?`Loading trace`:`Trace not found`}):(0,j.jsx)(wt,{traces:e.selectedSessionTraces.length>0?e.selectedSessionTraces:[e.selectedTrace],onShowSessionTraces:e.onShowSessionTraces})})]})}function wt(e){let t=(0,A.useMemo)(()=>[...e.traces].sort((e,t)=>Date.parse(e.startedAt)-Date.parse(t.startedAt)),[e.traces]),n=t[0]?.id??``,[r,a]=(0,A.useState)(n),[o,s]=(0,A.useState)(`trace`);(0,A.useEffect)(()=>{a(n),s(`trace`)},[n]);let c=t.find(e=>e.id===r)??t[0],l=c===void 0?[]:Se(c),u=(e,t)=>{a(e),s(t)};return c===void 0?(0,j.jsx)(`section`,{className:`grid h-full min-h-0 w-full place-items-center text-sm font-medium text-muted-foreground`,"aria-label":`Traces`,children:`No trace selected`}):(0,j.jsx)(`section`,{className:`grid h-full min-h-0 w-full content-stretch overflow-hidden`,"aria-label":`Traces`,children:(0,j.jsxs)(`div`,{className:`grid h-full min-h-0 grid-cols-[320px_minmax(0,1fr)] overflow-hidden max-md:grid-cols-1`,children:[(0,j.jsxs)(`nav`,{className:`grid min-h-0 auto-rows-min content-start overflow-auto border-r border-border/80 bg-card/35 pr-2 max-md:max-h-80 max-md:border-b max-md:border-r-0`,"aria-label":`Trace timeline`,children:[(0,j.jsxs)(`div`,{className:`sticky top-0 z-30 flex min-h-11 items-center justify-between bg-card/90 py-0 pl-0 pr-5 text-xs font-medium text-muted-foreground backdrop-blur`,children:[(0,j.jsx)(`span`,{children:`Search`}),(0,j.jsx)(`strong`,{className:`text-foreground`,children:`Timeline`})]}),t.map(e=>{let t=c.id===e.id,n=Se(e);return(0,j.jsxs)(`div`,{className:`contents`,children:[(0,j.jsx)(Q,{active:t&&o===`trace`,ancestorLevels:[],hasChildren:!0,isLastSibling:!0,level:0,tone:`trace`,title:e.name??`Agent`,subtitle:i(e.durationMs),onSelect:()=>u(e.id,`trace`)}),(0,j.jsx)(Q,{active:t&&o===`agent`,ancestorLevels:[],hasChildren:n.length>0,isLastSibling:!0,level:1,tone:`agent`,title:`agent.run`,subtitle:i(e.durationMs),onSelect:()=>u(e.id,`agent`)}),n.map(r=>(0,j.jsxs)(`div`,{className:`contents`,children:[(0,j.jsx)(Q,{active:t&&o===`turn:${r.turn}`,ancestorLevels:[],hasChildren:r.observations.length>0,isLastSibling:r.turn===n.at(-1)?.turn,level:2,tone:`turn`,title:`turn.${r.turn}`,subtitle:i(r.durationMs),onSelect:()=>u(e.id,`turn:${r.turn}`)}),(0,j.jsx)(Tt,{activeKey:o,isLastTurn:r.turn===n.at(-1)?.turn,observations:r.observations,onSelect:t=>u(e.id,`observation:${t}`),traceActive:t})]},`${e.id}:turn:${r.turn}`))]},e.id)})]}),(0,j.jsx)(Dt,{trace:c,turns:l,activeKey:o,onShowSessionTraces:e.onShowSessionTraces})]})})}function Q(e){let t=e=>22+e*22;return(0,j.jsxs)(v,{className:r(`relative grid h-auto min-h-0 w-full min-w-0 grid-cols-[20px_minmax(0,1fr)] items-start justify-start gap-2 whitespace-normal rounded-lg border-0 bg-transparent px-3 py-2.5 text-left text-muted-foreground shadow-none transition duration-200 hover:bg-accent/70 hover:text-accent-foreground`,e.active&&`bg-muted/45 text-foreground hover:bg-muted/45 hover:text-foreground`),type:`button`,variant:`ghost`,onClick:e.onSelect,style:{paddingLeft:`${12+e.level*22}px`},children:[e.ancestorLevels.map(e=>(0,j.jsx)(`span`,{className:`pointer-events-none absolute inset-y-0 w-px bg-muted-foreground/35`,style:{left:`${t(e)}px`},"aria-hidden":`true`},`ancestor-line-${e}`)),e.level>0?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`pointer-events-none absolute top-0 w-px bg-muted-foreground/35`,style:{left:`${t(e.level-1)}px`,height:`18px`},"aria-hidden":`true`}),e.isLastSibling?null:(0,j.jsx)(`span`,{className:`pointer-events-none absolute bottom-0 w-px bg-muted-foreground/35`,style:{left:`${t(e.level-1)}px`,top:`18px`},"aria-hidden":`true`}),(0,j.jsx)(`span`,{className:`pointer-events-none absolute h-px bg-muted-foreground/35`,style:{left:`${t(e.level-1)}px`,top:`18px`,width:`22px`},"aria-hidden":`true`})]}):null,e.hasChildren?(0,j.jsx)(`span`,{className:`pointer-events-none absolute bottom-0 w-px bg-muted-foreground/35`,style:{left:`${t(e.level)}px`,top:`18px`},"aria-hidden":`true`}):null,(0,j.jsx)(`span`,{className:r(`relative z-10 grid h-5 w-5 place-items-center rounded-lg bg-transparent [&_svg]:h-3 [&_svg]:w-3 [&_svg]:opacity-100`,ze(e.tone)),children:(0,j.jsx)(Re,{tone:e.tone})}),(0,j.jsxs)(`span`,{className:`grid min-w-0 gap-0.5`,children:[(0,j.jsx)(`strong`,{className:`min-w-0 truncate text-sm font-medium leading-5 text-current`,children:e.title}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:e.subtitle})]})]})}function Tt(e){let t=Ce(e.observations);return(0,j.jsx)(j.Fragment,{children:t.map((n,r)=>(0,j.jsx)(Et,{activeKey:e.activeKey,ancestorLevels:e.isLastTurn?[]:[1],isLastSibling:r===t.length-1,level:3,node:n,onSelect:e.onSelect,traceActive:e.traceActive},n.observation.id))})}function Et(e){let t=z(e.node.observation),n=e.isLastSibling?e.ancestorLevels:[...e.ancestorLevels,e.level];return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(Q,{active:e.traceActive&&e.activeKey===`observation:${e.node.observation.id}`,ancestorLevels:e.ancestorLevels,hasChildren:e.node.children.length>0,isLastSibling:e.isLastSibling,level:e.level,tone:e.node.observation.kind,title:Fe(e.node.observation),subtitle:t.length>0?`${i(e.node.observation.durationMs)} · ${t}`:i(e.node.observation.durationMs),onSelect:()=>e.onSelect(e.node.observation.id)}),e.node.children.map((t,r)=>(0,j.jsx)(Et,{activeKey:e.activeKey,ancestorLevels:n,isLastSibling:r===e.node.children.length-1,level:e.level+1,node:t,onSelect:e.onSelect,traceActive:e.traceActive},t.observation.id))]})}function Dt(e){let t=we(e.trace,e.turns,e.activeKey);return(0,j.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-card/70`,"aria-label":`Trace detail`,children:[(0,j.jsx)(`header`,{className:`border-b border-border/60 bg-card/70 px-6 py-5`,children:(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-5`,children:[(0,j.jsx)(`div`,{className:`flex min-w-0 items-start justify-between gap-4`,children:(0,j.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[(0,j.jsx)(`span`,{className:r(`grid h-8 w-8 shrink-0 place-items-center rounded-lg bg-foreground text-background [&_svg]:h-4 [&_svg]:w-4 [&_svg]:opacity-100`,t.tone!==`trace`&&`bg-muted text-foreground`,ze(t.tone)),children:(0,j.jsx)(Re,{tone:t.tone})}),(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,j.jsx)(`h2`,{className:`m-0 min-w-0 truncate text-2xl font-semibold leading-none tracking-[-0.01em] text-foreground`,children:t.title}),(0,j.jsx)(`div`,{className:` text-xs font-medium text-muted-foreground`,children:t.startedAt})]})]})}),(0,j.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[repeat(auto-fit,minmax(150px,1fr))] gap-2`,children:[(0,j.jsx)(Ot,{label:`Duration`,value:i(t.durationMs)}),t.firstDeltaMs===void 0?null:(0,j.jsx)(Ot,{label:`First delta`,value:i(t.firstDeltaMs)}),t.usage.length===0?null:(0,j.jsx)(Ot,{label:`Usage`,value:t.usage}),(0,j.jsxs)(`button`,{className:`grid min-w-0 gap-1 rounded-lg bg-card/85 px-4 py-3 text-left transition duration-200 hover:bg-accent hover:text-accent-foreground`,type:`button`,onClick:()=>e.onShowSessionTraces(e.trace.sessionId),children:[(0,j.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Session`}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-current`,children:e.trace.sessionId})]})]})]})}),(0,j.jsx)(`div`,{className:`min-w-0 overflow-auto`,children:(0,j.jsxs)(`div`,{className:`grid min-w-0 content-start gap-6 p-6`,children:[t.input===void 0?null:(0,j.jsx)($,{title:`Input`,value:t.input}),t.output===void 0?null:(0,j.jsx)($,{title:`Output`,value:t.output,tone:`success`}),t.error===void 0?null:(0,j.jsx)($,{title:`Error`,value:t.error,tone:`error`}),(0,j.jsx)($,{title:`Metadata`,value:t.metadata,rawJson:!0})]})})]})}function Ot(e){return(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-1 rounded-lg bg-card/85 px-4 py-3`,children:[(0,j.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.label}),(0,j.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.value})]})}function $(e){let t=ge(e.title,e.value);return(0,j.jsxs)(`section`,{className:`grid min-w-0 gap-3`,children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,j.jsx)(`h3`,{className:`m-0 text-lg font-semibold leading-tight text-foreground`,children:e.title}),(0,j.jsx)(`span`,{className:`h-px flex-1 bg-border/80`,"aria-hidden":`true`})]}),e.rawJson?(0,j.jsx)(se,{value:e.value}):(0,j.jsx)(`div`,{className:`grid min-w-0 gap-3`,children:t.map(t=>(0,j.jsxs)(`article`,{className:r(`grid min-w-0 gap-3 rounded-lg bg-card/85 px-4 py-4`,e.compact&&`grid-cols-[150px_minmax(0,1fr)] items-start gap-4 max-lg:grid-cols-1`),children:[(0,j.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:[(0,j.jsx)(he,{label:t.label}),t.label]}),(0,j.jsx)(kt,{compact:e.compact,item:t,tone:e.tone})]},`${t.label}-${t.text}`))})]})}function kt(e){let t=At(e.item);return t.length>0?(0,j.jsx)(`div`,{className:`grid min-w-0 gap-5`,children:t.map(e=>(0,j.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,j.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,j.jsx)(`span`,{className:` text-xs font-semibold tabular-nums text-muted-foreground`,children:e.index}),(0,j.jsx)(ae,{className:r(`px-1.5 py-0.5`,e.role===`User`&&`border-border/80 bg-muted-foreground/15 text-muted-foreground`,e.role===`Assistant`&&`border-border/80 bg-foreground/15 text-foreground`,e.role===`Tool`&&`border-destructive/40 bg-destructive/15 text-destructive`),children:e.role})]}),(0,j.jsx)(`p`,{className:`m-0 whitespace-pre-wrap text-sm leading-7 text-foreground [overflow-wrap:anywhere]`,children:e.text})]},`${e.index}-${e.role}-${e.text}`))}):(0,j.jsx)(`p`,{className:r(`m-0 whitespace-pre-wrap text-sm leading-7 text-foreground [overflow-wrap:anywhere]`,e.compact&&` text-sm leading-6`,e.tone===`success`&&!me(e.item)&&`text-foreground`,e.tone===`error`&&`text-destructive`),children:e.item.text})}function At(e){return e.label.startsWith(`Conversation history`)?e.text.split(`
6
+
7
+ `).flatMap(e=>{let[t,...n]=e.split(`
8
+ `),r=/^(\d+)\.\s+(.+)$/.exec(t??``);return r===null?[]:[{index:r[1]??``,role:r[2]??`Message`,text:n.join(`
9
+ `)}]}):[]}export{xt as TraceBrowser};
10
+ //# sourceMappingURL=trace-browser-BT1WTtkX.js.map