@anvia/studio 0.7.24 → 0.7.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/ui/assets/{evals-page-De52D0jd.js → evals-page-DYejWQfp.js} +2 -2
  2. package/dist/ui/assets/{evals-page-De52D0jd.js.map → evals-page-DYejWQfp.js.map} +1 -1
  3. package/dist/ui/assets/index-DxSIQUax.js +55 -0
  4. package/dist/ui/assets/index-DxSIQUax.js.map +1 -0
  5. package/dist/ui/assets/{knowledge-page-BMFlhcZx.js → knowledge-page-CpQCK-1A.js} +2 -2
  6. package/dist/ui/assets/{knowledge-page-BMFlhcZx.js.map → knowledge-page-CpQCK-1A.js.map} +1 -1
  7. package/dist/ui/assets/{mcps-page-5Px-wMNv.js → mcps-page-DwZAv13N.js} +2 -2
  8. package/dist/ui/assets/{mcps-page-5Px-wMNv.js.map → mcps-page-DwZAv13N.js.map} +1 -1
  9. package/dist/ui/assets/{memory-page-BifL831I.js → memory-page-Cn-wzJHp.js} +2 -2
  10. package/dist/ui/assets/{memory-page-BifL831I.js.map → memory-page-Cn-wzJHp.js.map} +1 -1
  11. package/dist/ui/assets/{pipelines-page-CD5d6HXu.js → pipelines-page-BA9WCR9D.js} +2 -2
  12. package/dist/ui/assets/{pipelines-page-CD5d6HXu.js.map → pipelines-page-BA9WCR9D.js.map} +1 -1
  13. package/dist/ui/assets/{sessions-page-DGJhU371.js → sessions-page-BuNnb20D.js} +2 -2
  14. package/dist/ui/assets/{sessions-page-DGJhU371.js.map → sessions-page-BuNnb20D.js.map} +1 -1
  15. package/dist/ui/assets/{status-page-dHfY3ar_.js → status-page-B8-sSeYx.js} +2 -2
  16. package/dist/ui/assets/{status-page-dHfY3ar_.js.map → status-page-B8-sSeYx.js.map} +1 -1
  17. package/dist/ui/assets/{tool-runner-D5bnjhw9.js → tool-runner-5JJHI3LO.js} +2 -2
  18. package/dist/ui/assets/{tool-runner-D5bnjhw9.js.map → tool-runner-5JJHI3LO.js.map} +1 -1
  19. package/dist/ui/assets/{tools-page-CjTxlUzN.js → tools-page-kXLllnlT.js} +2 -2
  20. package/dist/ui/assets/{tools-page-CjTxlUzN.js.map → tools-page-kXLllnlT.js.map} +1 -1
  21. package/dist/ui/assets/{trace-browser-D_YhJaZY.js → trace-browser-C0vy4e41.js} +2 -2
  22. package/dist/ui/assets/{trace-browser-D_YhJaZY.js.map → trace-browser-C0vy4e41.js.map} +1 -1
  23. package/dist/ui/assets/{transcript-item-566OinDi.js → transcript-item-cUscZoNb.js} +2 -2
  24. package/dist/ui/assets/{transcript-item-566OinDi.js.map → transcript-item-cUscZoNb.js.map} +1 -1
  25. package/dist/ui/index.html +1 -1
  26. package/package.json +4 -4
  27. package/dist/ui/assets/index-DKAuh20Y.js +0 -55
  28. package/dist/ui/assets/index-DKAuh20Y.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tool-runner-D5bnjhw9.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-5JJHI3LO.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{I as r,c as i,d as a,f as o,l as s,u as c}from"./index-DKAuh20Y.js";import{t as l}from"./badge-BH7gz3tB.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-D5bnjhw9.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)(i,{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)(o,{placeholder:`Agent`})}),(0,b.jsx)(s,{align:`end`,children:e.agents.map(e=>(0,b.jsx)(c,{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-CjTxlUzN.js.map
1
+ import{i as e,r as t,s as n}from"./utils-BN2yP0LH.js";import{I as r,c as i,d as a,f as o,l as s,u as c}from"./index-DxSIQUax.js";import{t as l}from"./badge-BH7gz3tB.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-5JJHI3LO.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)(i,{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)(o,{placeholder:`Agent`})}),(0,b.jsx)(s,{align:`end`,children:e.agents.map(e=>(0,b.jsx)(c,{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-kXLllnlT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools-page-CjTxlUzN.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-kXLllnlT.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,4 +1,4 @@
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-C9HPGfkW.js";import{t as f}from"./PathIcon-DX1w_Nk9.js";import{B as p,C as m,D as h,E as ee,F as g,H as _,I as v,O as y,R as b,T as x,V as S,W as C,g as w,k as T,w as E,z as D}from"./index-DKAuh20Y.js";import{t as O}from"./badge-BH7gz3tB.js";var te=[[`path`,{d:`M5.5 12.002H19`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M10.9999 18.002C10.9999 18.002 4.99998 13.583 4.99997 12.0019C4.99996 10.4208 11 6.00195 11 6.00195`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}]],ne=[[`path`,{d:`M9.00005 6C9.00005 6 15 10.4189 15 12C15 13.5812 9 18 9 18`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}]],re=[[`path`,{d:`M11 6H15.5C17.9853 6 20 8.01472 20 10.5C20 12.9853 17.9853 15 15.5 15H4`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M6.99998 12C6.99998 12 4.00001 14.2095 4 15C3.99999 15.7906 7 18 7 18`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}]],ie=[[`path`,{d:`M4 12C4 8.22876 4 6.34315 5.17157 5.17157C6.34315 4 8.22876 4 12 4C15.7712 4 17.6569 4 18.8284 5.17157C20 6.34315 20 8.22876 20 12C20 15.7712 20 17.6569 18.8284 18.8284C17.6569 20 15.7712 20 12 20C8.22876 20 6.34315 20 5.17157 18.8284C4 17.6569 4 15.7712 4 12Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M9.5 2V4`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`path`,{d:`M14.5 2V4`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`2`}],[`path`,{d:`M9.5 20V22`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`3`}],[`path`,{d:`M14.5 20V22`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`4`}],[`path`,{d:`M13 9L9 13`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`5`}],[`path`,{d:`M15 13L13 15`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`6`}],[`path`,{d:`M22 14.5L20 14.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`7`}],[`path`,{d:`M4 9.5L2 9.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`8`}],[`path`,{d:`M4 14.5L2 14.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`9`}],[`path`,{d:`M22 9.5L20 9.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`10`}]],ae=[[`path`,{d:`M7 19H13C15.8284 19 17.2426 19 18.1213 18.1213C19 17.2426 19 15.8284 19 13V10M19 10C19.7002 10 21.0085 11.9943 21.5 12.5M19 10C18.2998 10 16.9915 11.9943 16.5 12.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M5 7L5 17`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`circle`,{cx:`5`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`2`}],[`circle`,{cx:`19`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`3`}],[`circle`,{cx:`5`,cy:`19`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`4`}]],oe=[[`path`,{d:`M15.5 12C15.5 13.933 13.933 15.5 12 15.5C10.067 15.5 8.5 13.933 8.5 12C8.5 10.067 10.067 8.5 12 8.5C13.933 8.5 15.5 10.067 15.5 12Z`,stroke:`currentColor`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M21.011 14.0965C21.5329 13.9558 21.7939 13.8854 21.8969 13.7508C22 13.6163 22 13.3998 22 12.9669V11.0332C22 10.6003 22 10.3838 21.8969 10.2493C21.7938 10.1147 21.5329 10.0443 21.011 9.90358C19.0606 9.37759 17.8399 7.33851 18.3433 5.40087C18.4817 4.86799 18.5509 4.60156 18.4848 4.44529C18.4187 4.28902 18.2291 4.18134 17.8497 3.96596L16.125 2.98673C15.7528 2.77539 15.5667 2.66972 15.3997 2.69222C15.2326 2.71472 15.0442 2.90273 14.6672 3.27873C13.208 4.73448 10.7936 4.73442 9.33434 3.27864C8.95743 2.90263 8.76898 2.71463 8.60193 2.69212C8.43489 2.66962 8.24877 2.77529 7.87653 2.98663L6.15184 3.96587C5.77253 4.18123 5.58287 4.28891 5.51678 4.44515C5.45068 4.6014 5.51987 4.86787 5.65825 5.4008C6.16137 7.3385 4.93972 9.37763 2.98902 9.9036C2.46712 10.0443 2.20617 10.1147 2.10308 10.2492C2 10.3838 2 10.6003 2 11.0332V12.9669C2 13.3998 2 13.6163 2.10308 13.7508C2.20615 13.8854 2.46711 13.9558 2.98902 14.0965C4.9394 14.6225 6.16008 16.6616 5.65672 18.5992C5.51829 19.1321 5.44907 19.3985 5.51516 19.5548C5.58126 19.7111 5.77092 19.8188 6.15025 20.0341L7.87495 21.0134C8.24721 21.2247 8.43334 21.3304 8.6004 21.3079C8.76746 21.2854 8.95588 21.0973 9.33271 20.7213C10.7927 19.2644 13.2088 19.2643 14.6689 20.7212C15.0457 21.0973 15.2341 21.2853 15.4012 21.3078C15.5682 21.3303 15.7544 21.2246 16.1266 21.0133L17.8513 20.034C18.2307 19.8187 18.4204 19.711 18.4864 19.5547C18.5525 19.3984 18.4833 19.132 18.3448 18.5991C17.8412 16.6616 19.0609 14.6226 21.011 14.0965Z`,stroke:`currentColor`,strokeLinecap:`round`,strokeWidth:`1.5`,key:`1`}]],k=n(e(),1),A=t();function se(e){try{return JSON.stringify(e,null,2)??`undefined`}catch{return String(e)}}function ce(e){return(0,A.jsx)(`div`,{className:`overflow-x-auto rounded-lg bg-card/85 px-4 py-4 text-sm leading-6 text-foreground`,children:(0,A.jsx)(de,{depth:0,path:`$`,value:e.value})})}var le=16,ue=20;function de(e){return me(e.value)?(0,A.jsx)(fe,{arrayIndex:e.arrayIndex,depth:e.depth,path:e.path,propertyKey:e.propertyKey,trailingComma:e.trailingComma,value:e.value}):(0,A.jsxs)(`div`,{className:`min-w-max whitespace-pre`,style:{paddingLeft:`${j(e.depth)}px`},children:[(0,A.jsx)(M,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),(0,A.jsx)(pe,{value:e.value}),e.trailingComma?(0,A.jsx)(`span`,{className:`text-foreground`,children:`,`}):null]})}function fe(e){let[t,n]=(0,k.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,A.jsxs)(`div`,{className:`min-w-max whitespace-pre`,style:{paddingLeft:`${j(e.depth)}px`},children:[(0,A.jsx)(M,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),(0,A.jsxs)(`span`,{className:`text-foreground`,children:[a,o,e.trailingComma?`,`:``]})]}):(0,A.jsxs)(`div`,{className:`grid min-w-max`,children:[(0,A.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*le}px`},type:`button`,children:[(0,A.jsx)(`span`,{className:`grid h-4 w-4 place-items-center text-muted-foreground [&_svg]:h-3 [&_svg]:w-3`,children:t?(0,A.jsx)(g,{icon:_,"aria-hidden":`true`}):(0,A.jsx)(g,{icon:ne,"aria-hidden":`true`})}),(0,A.jsxs)(`span`,{className:`whitespace-pre`,children:[(0,A.jsx)(M,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),t?(0,A.jsx)(`span`,{className:`text-foreground`,children:a}):(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:s}),!t&&e.trailingComma?(0,A.jsx)(`span`,{className:`text-foreground`,children:`,`}):null]})]}),t?(0,A.jsxs)(A.Fragment,{children:[i.map(([t,n],a)=>(0,A.jsx)(de,{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,A.jsxs)(`div`,{className:`min-w-max whitespace-pre text-foreground`,style:{paddingLeft:`${j(e.depth)}px`},children:[o,e.trailingComma?`,`:``]})]}):null]})}function j(e){return e*le+ue}function M(e){return e.propertyKey===void 0?e.arrayIndex===void 0?null:(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`span`,{className:`text-muted-foreground`,children:[`[`,e.arrayIndex,`]`]}),(0,A.jsx)(`span`,{className:`text-foreground`,children:` `})]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:JSON.stringify(e.propertyKey)}),(0,A.jsx)(`span`,{className:`text-foreground`,children:`: `})]})}function pe(e){return typeof e.value==`string`?(0,A.jsx)(`span`,{className:`text-foreground`,children:JSON.stringify(e.value)}):typeof e.value==`number`?(0,A.jsx)(`span`,{className:`text-foreground`,children:String(e.value)}):typeof e.value==`boolean`?(0,A.jsx)(`span`,{className:`text-chart-4`,children:String(e.value)}):e.value===null?(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:`null`}):e.value===void 0?(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:`undefined`}):(0,A.jsx)(`span`,{className:`text-foreground`,children:se(e.value)})}function me(e){return Array.isArray(e)||s(e)}function he(e){return e.label===`Message Id`}function ge(e){let t=`h-3.5 w-3.5 shrink-0`;switch(e.label){case`System prompt`:return(0,A.jsx)(g,{icon:oe,"aria-hidden":`true`,className:t});case`Prompt`:return(0,A.jsx)(g,{icon:S,"aria-hidden":`true`,className:t});case`Output`:case`Assistant output`:return(0,A.jsx)(g,{icon:re,"aria-hidden":`true`,className:t});default:return null}}function _e(e,t){if(e===`Output`){let e=ve(t);if(e.length>0)return e}let n=N(t,e);if(n.length>0)return n;if(!s(t))return[{label:e,text:Se(t)}];let r=[];for(let[e,n]of Object.entries(t)){let t=N(n,e);if(t.length>0){r.push(...t);continue}r.push({label:F(e),text:Se(n)})}return r.length>0?r:[{label:e,text:`Empty object`}]}function ve(e){if(!s(e))return[];let t=[],n=N(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 N(e,t){if(typeof e==`string`&&t===void 0)return[{label:`Value`,text:e}];if(Array.isArray(e))return t===`chatHistory`?ye(e):t===`history`?be(e):e.map((e,n)=>({label:P(e,n,t),text:C(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=xe(e);return t.push(...N(n,`chatHistory`)),t}if(Array.isArray(e.prompt))return N(e.prompt,`prompt`);let r=[];r.push(...xe(e));let i=Array.isArray(e.history)?e.history:[];i.length>0&&r.push(...N(i,`history`));let a=C(e.prompt);return a.length>0&&r.push({label:i.length>0?`Current prompt`:`Prompt`,text:a}),r}function ye(e){let t=e.map((e,t)=>({label:P(e,t,`chatHistory`),text:C(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(`
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-C9HPGfkW.js";import{t as f}from"./PathIcon-DX1w_Nk9.js";import{B as p,C as m,D as h,E as ee,F as g,H as _,I as v,O as y,R as b,T as x,V as S,W as C,g as w,k as T,w as E,z as D}from"./index-DxSIQUax.js";import{t as O}from"./badge-BH7gz3tB.js";var te=[[`path`,{d:`M5.5 12.002H19`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M10.9999 18.002C10.9999 18.002 4.99998 13.583 4.99997 12.0019C4.99996 10.4208 11 6.00195 11 6.00195`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}]],ne=[[`path`,{d:`M9.00005 6C9.00005 6 15 10.4189 15 12C15 13.5812 9 18 9 18`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}]],re=[[`path`,{d:`M11 6H15.5C17.9853 6 20 8.01472 20 10.5C20 12.9853 17.9853 15 15.5 15H4`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M6.99998 12C6.99998 12 4.00001 14.2095 4 15C3.99999 15.7906 7 18 7 18`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}]],ie=[[`path`,{d:`M4 12C4 8.22876 4 6.34315 5.17157 5.17157C6.34315 4 8.22876 4 12 4C15.7712 4 17.6569 4 18.8284 5.17157C20 6.34315 20 8.22876 20 12C20 15.7712 20 17.6569 18.8284 18.8284C17.6569 20 15.7712 20 12 20C8.22876 20 6.34315 20 5.17157 18.8284C4 17.6569 4 15.7712 4 12Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M9.5 2V4`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`path`,{d:`M14.5 2V4`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`2`}],[`path`,{d:`M9.5 20V22`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`3`}],[`path`,{d:`M14.5 20V22`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`4`}],[`path`,{d:`M13 9L9 13`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`5`}],[`path`,{d:`M15 13L13 15`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`6`}],[`path`,{d:`M22 14.5L20 14.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`7`}],[`path`,{d:`M4 9.5L2 9.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`8`}],[`path`,{d:`M4 14.5L2 14.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`9`}],[`path`,{d:`M22 9.5L20 9.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`10`}]],ae=[[`path`,{d:`M7 19H13C15.8284 19 17.2426 19 18.1213 18.1213C19 17.2426 19 15.8284 19 13V10M19 10C19.7002 10 21.0085 11.9943 21.5 12.5M19 10C18.2998 10 16.9915 11.9943 16.5 12.5`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M5 7L5 17`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}],[`circle`,{cx:`5`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`2`}],[`circle`,{cx:`19`,cy:`5`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`3`}],[`circle`,{cx:`5`,cy:`19`,r:`2`,stroke:`currentColor`,strokeWidth:`1.5`,key:`4`}]],oe=[[`path`,{d:`M15.5 12C15.5 13.933 13.933 15.5 12 15.5C10.067 15.5 8.5 13.933 8.5 12C8.5 10.067 10.067 8.5 12 8.5C13.933 8.5 15.5 10.067 15.5 12Z`,stroke:`currentColor`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M21.011 14.0965C21.5329 13.9558 21.7939 13.8854 21.8969 13.7508C22 13.6163 22 13.3998 22 12.9669V11.0332C22 10.6003 22 10.3838 21.8969 10.2493C21.7938 10.1147 21.5329 10.0443 21.011 9.90358C19.0606 9.37759 17.8399 7.33851 18.3433 5.40087C18.4817 4.86799 18.5509 4.60156 18.4848 4.44529C18.4187 4.28902 18.2291 4.18134 17.8497 3.96596L16.125 2.98673C15.7528 2.77539 15.5667 2.66972 15.3997 2.69222C15.2326 2.71472 15.0442 2.90273 14.6672 3.27873C13.208 4.73448 10.7936 4.73442 9.33434 3.27864C8.95743 2.90263 8.76898 2.71463 8.60193 2.69212C8.43489 2.66962 8.24877 2.77529 7.87653 2.98663L6.15184 3.96587C5.77253 4.18123 5.58287 4.28891 5.51678 4.44515C5.45068 4.6014 5.51987 4.86787 5.65825 5.4008C6.16137 7.3385 4.93972 9.37763 2.98902 9.9036C2.46712 10.0443 2.20617 10.1147 2.10308 10.2492C2 10.3838 2 10.6003 2 11.0332V12.9669C2 13.3998 2 13.6163 2.10308 13.7508C2.20615 13.8854 2.46711 13.9558 2.98902 14.0965C4.9394 14.6225 6.16008 16.6616 5.65672 18.5992C5.51829 19.1321 5.44907 19.3985 5.51516 19.5548C5.58126 19.7111 5.77092 19.8188 6.15025 20.0341L7.87495 21.0134C8.24721 21.2247 8.43334 21.3304 8.6004 21.3079C8.76746 21.2854 8.95588 21.0973 9.33271 20.7213C10.7927 19.2644 13.2088 19.2643 14.6689 20.7212C15.0457 21.0973 15.2341 21.2853 15.4012 21.3078C15.5682 21.3303 15.7544 21.2246 16.1266 21.0133L17.8513 20.034C18.2307 19.8187 18.4204 19.711 18.4864 19.5547C18.5525 19.3984 18.4833 19.132 18.3448 18.5991C17.8412 16.6616 19.0609 14.6226 21.011 14.0965Z`,stroke:`currentColor`,strokeLinecap:`round`,strokeWidth:`1.5`,key:`1`}]],k=n(e(),1),A=t();function se(e){try{return JSON.stringify(e,null,2)??`undefined`}catch{return String(e)}}function ce(e){return(0,A.jsx)(`div`,{className:`overflow-x-auto rounded-lg bg-card/85 px-4 py-4 text-sm leading-6 text-foreground`,children:(0,A.jsx)(de,{depth:0,path:`$`,value:e.value})})}var le=16,ue=20;function de(e){return me(e.value)?(0,A.jsx)(fe,{arrayIndex:e.arrayIndex,depth:e.depth,path:e.path,propertyKey:e.propertyKey,trailingComma:e.trailingComma,value:e.value}):(0,A.jsxs)(`div`,{className:`min-w-max whitespace-pre`,style:{paddingLeft:`${j(e.depth)}px`},children:[(0,A.jsx)(M,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),(0,A.jsx)(pe,{value:e.value}),e.trailingComma?(0,A.jsx)(`span`,{className:`text-foreground`,children:`,`}):null]})}function fe(e){let[t,n]=(0,k.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,A.jsxs)(`div`,{className:`min-w-max whitespace-pre`,style:{paddingLeft:`${j(e.depth)}px`},children:[(0,A.jsx)(M,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),(0,A.jsxs)(`span`,{className:`text-foreground`,children:[a,o,e.trailingComma?`,`:``]})]}):(0,A.jsxs)(`div`,{className:`grid min-w-max`,children:[(0,A.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*le}px`},type:`button`,children:[(0,A.jsx)(`span`,{className:`grid h-4 w-4 place-items-center text-muted-foreground [&_svg]:h-3 [&_svg]:w-3`,children:t?(0,A.jsx)(g,{icon:_,"aria-hidden":`true`}):(0,A.jsx)(g,{icon:ne,"aria-hidden":`true`})}),(0,A.jsxs)(`span`,{className:`whitespace-pre`,children:[(0,A.jsx)(M,{arrayIndex:e.arrayIndex,propertyKey:e.propertyKey}),t?(0,A.jsx)(`span`,{className:`text-foreground`,children:a}):(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:s}),!t&&e.trailingComma?(0,A.jsx)(`span`,{className:`text-foreground`,children:`,`}):null]})]}),t?(0,A.jsxs)(A.Fragment,{children:[i.map(([t,n],a)=>(0,A.jsx)(de,{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,A.jsxs)(`div`,{className:`min-w-max whitespace-pre text-foreground`,style:{paddingLeft:`${j(e.depth)}px`},children:[o,e.trailingComma?`,`:``]})]}):null]})}function j(e){return e*le+ue}function M(e){return e.propertyKey===void 0?e.arrayIndex===void 0?null:(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`span`,{className:`text-muted-foreground`,children:[`[`,e.arrayIndex,`]`]}),(0,A.jsx)(`span`,{className:`text-foreground`,children:` `})]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:JSON.stringify(e.propertyKey)}),(0,A.jsx)(`span`,{className:`text-foreground`,children:`: `})]})}function pe(e){return typeof e.value==`string`?(0,A.jsx)(`span`,{className:`text-foreground`,children:JSON.stringify(e.value)}):typeof e.value==`number`?(0,A.jsx)(`span`,{className:`text-foreground`,children:String(e.value)}):typeof e.value==`boolean`?(0,A.jsx)(`span`,{className:`text-chart-4`,children:String(e.value)}):e.value===null?(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:`null`}):e.value===void 0?(0,A.jsx)(`span`,{className:`text-muted-foreground`,children:`undefined`}):(0,A.jsx)(`span`,{className:`text-foreground`,children:se(e.value)})}function me(e){return Array.isArray(e)||s(e)}function he(e){return e.label===`Message Id`}function ge(e){let t=`h-3.5 w-3.5 shrink-0`;switch(e.label){case`System prompt`:return(0,A.jsx)(g,{icon:oe,"aria-hidden":`true`,className:t});case`Prompt`:return(0,A.jsx)(g,{icon:S,"aria-hidden":`true`,className:t});case`Output`:case`Assistant output`:return(0,A.jsx)(g,{icon:re,"aria-hidden":`true`,className:t});default:return null}}function _e(e,t){if(e===`Output`){let e=ve(t);if(e.length>0)return e}let n=N(t,e);if(n.length>0)return n;if(!s(t))return[{label:e,text:Se(t)}];let r=[];for(let[e,n]of Object.entries(t)){let t=N(n,e);if(t.length>0){r.push(...t);continue}r.push({label:F(e),text:Se(n)})}return r.length>0?r:[{label:e,text:`Empty object`}]}function ve(e){if(!s(e))return[];let t=[],n=N(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 N(e,t){if(typeof e==`string`&&t===void 0)return[{label:`Value`,text:e}];if(Array.isArray(e))return t===`chatHistory`?ye(e):t===`history`?be(e):e.map((e,n)=>({label:P(e,n,t),text:C(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=xe(e);return t.push(...N(n,`chatHistory`)),t}if(Array.isArray(e.prompt))return N(e.prompt,`prompt`);let r=[];r.push(...xe(e));let i=Array.isArray(e.history)?e.history:[];i.length>0&&r.push(...N(i,`history`));let a=C(e.prompt);return a.length>0&&r.push({label:i.length>0?`Current prompt`:`Prompt`,text:a}),r}function ye(e){let t=e.map((e,t)=>({label:P(e,t,`chatHistory`),text:C(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
2
 
3
3
  `)}),n!==void 0&&i.push({label:r.length>0?`Current prompt`:`Prompt`,text:n.text}),i}function be(e){let t=e.map((e,t)=>({label:P(e,t,`history`),text:C(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
4
 
@@ -7,4 +7,4 @@ import{i as e,r as t,s as n,t as r}from"./utils-BN2yP0LH.js";import{a as i,c as
7
7
  `).flatMap(e=>{let[t,...n]=e.split(`
8
8
  `),r=/^(\d+)\.\s+(.+)$/.exec(t??``);return r===null?[]:[{index:r[1]??``,role:r[2]??`Message`,text:n.join(`
9
9
  `)}]}):[]}export{bt as TraceBrowser};
10
- //# sourceMappingURL=trace-browser-D_YhJaZY.js.map
10
+ //# sourceMappingURL=trace-browser-C0vy4e41.js.map