@anvia/studio 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/{ArrowClockwise.es-CSEY3Qr6.js → ArrowClockwise.es-5vr4h4OH.js} +2 -2
- package/dist/ui/assets/{ArrowClockwise.es-CSEY3Qr6.js.map → ArrowClockwise.es-5vr4h4OH.js.map} +1 -1
- package/dist/ui/assets/{CaretDown.es-BHAPbv1R.js → CaretDown.es-CXu4Fvbf.js} +2 -2
- package/dist/ui/assets/{CaretDown.es-BHAPbv1R.js.map → CaretDown.es-CXu4Fvbf.js.map} +1 -1
- package/dist/ui/assets/{Check.es-BLChmggz.js → Check.es-DSXK9-8c.js} +2 -2
- package/dist/ui/assets/{Check.es-BLChmggz.js.map → Check.es-DSXK9-8c.js.map} +1 -1
- package/dist/ui/assets/{Wrench.es-BL6BmNv7.js → Wrench.es-Cl38Pi3C.js} +2 -2
- package/dist/ui/assets/{Wrench.es-BL6BmNv7.js.map → Wrench.es-Cl38Pi3C.js.map} +1 -1
- package/dist/ui/assets/{agents-page-DQqt45If.js → agents-page-h-83w9EN.js} +2 -2
- package/dist/ui/assets/{agents-page-DQqt45If.js.map → agents-page-h-83w9EN.js.map} +1 -1
- package/dist/ui/assets/{badge-CcajoiAt.js → badge-O3YyUN3G.js} +2 -2
- package/dist/ui/assets/{badge-CcajoiAt.js.map → badge-O3YyUN3G.js.map} +1 -1
- package/dist/ui/assets/{button-07gzSO47.js → button-Dsqwey2_.js} +2 -2
- package/dist/ui/assets/{button-07gzSO47.js.map → button-Dsqwey2_.js.map} +1 -1
- package/dist/ui/assets/dialog-DN8F1Aaq.js +2 -0
- package/dist/ui/assets/{dialog-CNNQ3hoF.js.map → dialog-DN8F1Aaq.js.map} +1 -1
- package/dist/ui/assets/{dist-CqMdRzwk.js → dist-CUv0NHNl.js} +2 -2
- package/dist/ui/assets/{dist-CqMdRzwk.js.map → dist-CUv0NHNl.js.map} +1 -1
- package/dist/ui/assets/dist-PrGeYMiK.js +2 -0
- package/dist/ui/assets/{dist-DWqJwN1i.js.map → dist-PrGeYMiK.js.map} +1 -1
- package/dist/ui/assets/es2015-Ck1KeeEx.js +42 -0
- package/dist/ui/assets/es2015-Ck1KeeEx.js.map +1 -0
- package/dist/ui/assets/{icon-CqkMSRbt.js → icon-DyadsXLr.js} +2 -2
- package/dist/ui/assets/icon-DyadsXLr.js.map +1 -0
- package/dist/ui/assets/index-Dggzi3lZ.js +75 -0
- package/dist/ui/assets/index-Dggzi3lZ.js.map +1 -0
- package/dist/ui/assets/{index-CFbK-pX6.css → index-VCdJ2Rb4.css} +1 -1
- package/dist/ui/assets/{input-BiI6gsxA.js → input-DHvac9Uq.js} +2 -2
- package/dist/ui/assets/{input-BiI6gsxA.js.map → input-DHvac9Uq.js.map} +1 -1
- package/dist/ui/assets/{knowledge-model-S51n2rKh.js → knowledge-model-B6kRb7zc.js} +1 -1
- package/dist/ui/assets/{knowledge-model-S51n2rKh.js.map → knowledge-model-B6kRb7zc.js.map} +1 -1
- package/dist/ui/assets/{knowledge-page-DZeLh92t.js → knowledge-page-DKnPrmhK.js} +2 -2
- package/dist/ui/assets/knowledge-page-DKnPrmhK.js.map +1 -0
- package/dist/ui/assets/mcps-page-MSz67ifn.js +2 -0
- package/dist/ui/assets/mcps-page-MSz67ifn.js.map +1 -0
- package/dist/ui/assets/{memory-page-D3UhjpTb.js → memory-page-2qr2eMrI.js} +2 -2
- package/dist/ui/assets/{memory-page-D3UhjpTb.js.map → memory-page-2qr2eMrI.js.map} +1 -1
- package/dist/ui/assets/pipelines-page-D1IB1tw-.js +8 -0
- package/dist/ui/assets/pipelines-page-D1IB1tw-.js.map +1 -0
- package/dist/ui/assets/renderers-BIw5yJkg.js +94 -0
- package/dist/ui/assets/renderers-BIw5yJkg.js.map +1 -0
- package/dist/ui/assets/{request-7oUPS8zY.js → request-CnFL8L6p.js} +3 -3
- package/dist/ui/assets/{request-7oUPS8zY.js.map → request-CnFL8L6p.js.map} +1 -1
- package/dist/ui/assets/rfb-NV_fh9Db.js +6 -0
- package/dist/ui/assets/{rfb-DiW3PDuT.js.map → rfb-NV_fh9Db.js.map} +1 -1
- package/dist/ui/assets/sandboxes-page-DWMtrKYJ.js +2 -0
- package/dist/ui/assets/sandboxes-page-DWMtrKYJ.js.map +1 -0
- package/dist/ui/assets/select-C1_9fsRu.js +2 -0
- package/dist/ui/assets/{select-BOYfrfck.js.map → select-C1_9fsRu.js.map} +1 -1
- package/dist/ui/assets/{sessions-page-ClXzRM9K.js → sessions-page-BIk4q-L8.js} +2 -2
- package/dist/ui/assets/{sessions-page-ClXzRM9K.js.map → sessions-page-BIk4q-L8.js.map} +1 -1
- package/dist/ui/assets/{status-page-eA8uRLZQ.js → status-page-jKTghmnz.js} +2 -2
- package/dist/ui/assets/{status-page-eA8uRLZQ.js.map → status-page-jKTghmnz.js.map} +1 -1
- package/dist/ui/assets/{studio-CeTsQ4gf.js → studio-Bh00wIF1.js} +2 -2
- package/dist/ui/assets/{studio-CeTsQ4gf.js.map → studio-Bh00wIF1.js.map} +1 -1
- package/dist/ui/assets/{textarea-DESKg_ZK.js → textarea-CZvhTJxB.js} +2 -2
- package/dist/ui/assets/{textarea-DESKg_ZK.js.map → textarea-CZvhTJxB.js.map} +1 -1
- package/dist/ui/assets/{tool-runner-D3-SlGqQ.js → tool-runner-BtaZqE3R.js} +2 -2
- package/dist/ui/assets/{tool-runner-D3-SlGqQ.js.map → tool-runner-BtaZqE3R.js.map} +1 -1
- package/dist/ui/assets/tools-page-D1ewvG0D.js +2 -0
- package/dist/ui/assets/tools-page-D1ewvG0D.js.map +1 -0
- package/dist/ui/assets/{trace-browser-D93H7Xxs.js → trace-browser-CwRUyCO6.js} +3 -3
- package/dist/ui/assets/{trace-browser-D93H7Xxs.js.map → trace-browser-CwRUyCO6.js.map} +1 -1
- package/dist/ui/assets/{transcript-item-BmjdZLbS.js → transcript-item-ChtaJvPe.js} +2 -2
- package/dist/ui/assets/{transcript-item-BmjdZLbS.js.map → transcript-item-ChtaJvPe.js.map} +1 -1
- package/dist/ui/assets/utils-DzstcfqT.js +2 -0
- package/dist/ui/assets/{utils-C9GMruoG.js.map → utils-DzstcfqT.js.map} +1 -1
- package/dist/ui/assets/{with-selector-CRZWaZzC.js → with-selector-B8ah9Wvu.js} +2 -2
- package/dist/ui/assets/{with-selector-CRZWaZzC.js.map → with-selector-B8ah9Wvu.js.map} +1 -1
- package/dist/ui/index.html +19 -20
- package/package.json +11 -11
- package/dist/ui/assets/chunk-QGX73TSQ-D9QAGlAY.js +0 -65
- package/dist/ui/assets/chunk-QGX73TSQ-D9QAGlAY.js.map +0 -1
- package/dist/ui/assets/dialog-CNNQ3hoF.js +0 -2
- package/dist/ui/assets/dist-DWqJwN1i.js +0 -2
- package/dist/ui/assets/es2015-DsZq7PFO.js +0 -42
- package/dist/ui/assets/es2015-DsZq7PFO.js.map +0 -1
- package/dist/ui/assets/icon-CqkMSRbt.js.map +0 -1
- package/dist/ui/assets/index-BtvoCaW7.js +0 -12
- package/dist/ui/assets/index-BtvoCaW7.js.map +0 -1
- package/dist/ui/assets/knowledge-page-DZeLh92t.js.map +0 -1
- package/dist/ui/assets/mcps-page-CDPMO2x9.js +0 -2
- package/dist/ui/assets/mcps-page-CDPMO2x9.js.map +0 -1
- package/dist/ui/assets/pipelines-page-BP8R6NI7.js +0 -8
- package/dist/ui/assets/pipelines-page-BP8R6NI7.js.map +0 -1
- package/dist/ui/assets/renderers-DHMEAblV.js +0 -94
- package/dist/ui/assets/renderers-DHMEAblV.js.map +0 -1
- package/dist/ui/assets/rfb-DiW3PDuT.js +0 -6
- package/dist/ui/assets/sandboxes-page-C6kokYwc.js +0 -2
- package/dist/ui/assets/sandboxes-page-C6kokYwc.js.map +0 -1
- package/dist/ui/assets/select-BOYfrfck.js +0 -2
- package/dist/ui/assets/tools-page-D3gnQf1_.js +0 -2
- package/dist/ui/assets/tools-page-D3gnQf1_.js.map +0 -1
- package/dist/ui/assets/utils-C9GMruoG.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-runner-D3-SlGqQ.js","names":[],"sources":["../../../src/ui/app/modules/tools/schema-argument-editor.tsx","../../../src/ui/app/modules/tools/tool-runner.tsx"],"sourcesContent":["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-BtaZqE3R.js","names":[],"sources":["../../../src/ui/app/modules/tools/schema-argument-editor.tsx","../../../src/ui/app/modules/tools/tool-runner.tsx"],"sourcesContent":["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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t,s as n}from"./utils-DzstcfqT.js";import{t as r}from"./button-Dsqwey2_.js";import{a as i,i as a,n as o,r as s,t as c}from"./select-C1_9fsRu.js";import{a as l,i as u,n as d,r as f,t as p}from"./studio-Bh00wIF1.js";import{t as m}from"./badge-O3YyUN3G.js";import{a as h,c as g,d as _,i as v,l as y,n as b,o as x,r as S,s as C}from"./tool-runner-BtaZqE3R.js";var w=n(e(),1),T=t();function E(e){let t=e.agents.find(t=>t.id===e.selectedAgentId)??e.agents[0],n=(0,w.useMemo)(()=>e.summary?.tools??[],[e.summary]),[r,m]=(0,w.useState)(``),[g,_]=(0,w.useState)(`{}`),[v,y]=(0,w.useState)(`idle`),[b,x]=(0,w.useState)(),[E,O]=(0,w.useState)(``),k=(0,w.useMemo)(()=>n.find(e=>e.name===r)??n[0],[r,n]),A=t===void 0||k===void 0?``:`${t.id}:${k.name}`,M=(0,w.useRef)(A),N=(0,w.useRef)(0),P=j(n);(0,w.useEffect)(()=>{if(n.length===0){m(``);return}n.some(e=>e.name===r)||m(n[0]?.name??``)},[r,n]),(0,w.useEffect)(()=>{M.current!==A&&(M.current=A,N.current+=1,y(`idle`),O(``),x(void 0))},[A]);async function F(){if(t===void 0||k===void 0)return;let e;try{e=JSON.parse(g)}catch(e){O(e instanceof Error?e.message:String(e)),x(void 0);return}y(`running`),O(``),x(void 0);let n=A,r=N.current+1;N.current=r;let i=()=>N.current===r&&M.current===n;try{let n=await fetch(`/agents/${encodeURIComponent(t.id)}/tools/${encodeURIComponent(k.name)}/runs`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({args:e})}),r=await n.json();if(!i())return;let a=C(r);if(a===void 0){O(`Unexpected Studio tool run response: ${h(r)}`);return}x(a),(!n.ok||a.status===`error`)&&O(h(a.error??a))}catch(e){i()&&O(e instanceof Error?e.message:String(e))}finally{i()&&y(`idle`)}}return(0,T.jsxs)(l,{className:`grid-rows-[auto_minmax(0,1fr)]`,"aria-label":`Tools`,children:[(0,T.jsx)(u,{title:`Tools`,description:`Tool definitions registered on Studio agents, including approval policy and input schema.`,action:(0,T.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start`,children:[(0,T.jsx)(d,{label:`tools`,value:P.total}),(0,T.jsx)(d,{label:`mcp`,value:P.mcp}),(0,T.jsx)(d,{label:`static`,value:P.static}),(0,T.jsx)(d,{label:`dynamic`,value:P.dynamic}),(0,T.jsx)(d,{label:`approvals`,value:P.approvals}),e.agents.length>1?(0,T.jsxs)(c,{value:t?.id??``,onValueChange:e.onSelectAgent,children:[(0,T.jsx)(a,{className:`h-8 min-h-8 w-64 rounded-md border-border text-xs max-sm:w-full`,children:(0,T.jsx)(i,{placeholder:`Agent`})}),(0,T.jsx)(o,{align:`end`,children:e.agents.map(e=>(0,T.jsx)(s,{value:e.id,children:e.name??e.id},e.id))})]}):null]})}),(0,T.jsx)(f,{className:`overflow-auto`,children:e.enabled?e.loading?(0,T.jsx)(p,{title:`Loading tools`,text:`Reading registered tool metadata.`}):n.length===0?(0,T.jsx)(p,{title:`No tools`,text:`The selected agent has no registered tools.`}):(0,T.jsxs)(`div`,{className:`grid w-full gap-5`,children:[(0,T.jsx)(D,{selectedToolName:k?.name??``,tools:n,onSelectTool:m}),(0,T.jsx)(S,{argsText:g,runError:E,runResponse:b,runState:v,selectedTool:k,onArgsTextChange:_,onRun:()=>void F()})]}):(0,T.jsx)(p,{title:`Tools unavailable`,text:`No registered Studio agent exposes static or dynamic tools.`})})]})}function D(e){return(0,T.jsx)(`div`,{className:`min-w-[1040px]`,children:(0,T.jsxs)(`table`,{className:`w-full border-separate border-spacing-0 text-left`,children:[(0,T.jsx)(`thead`,{className:`sticky top-0 z-10 bg-background/95 backdrop-blur`,children:(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(k,{children:`Tool`}),(0,T.jsx)(k,{children:`Origin`}),(0,T.jsx)(k,{children:`Schema`}),(0,T.jsx)(k,{children:`Approval`}),(0,T.jsx)(k,{children:`Run`})]})}),(0,T.jsx)(`tbody`,{children:e.tools.map(t=>(0,T.jsx)(O,{active:e.selectedToolName===t.name,tool:t,onSelectTool:e.onSelectTool},`${t.source}:${t.name}`))})]})})}function O(e){let t=g(e.tool.parameters);return(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(A,{children:(0,T.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,T.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,T.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.tool.name}),e.active?(0,T.jsx)(m,{className:M,children:`selected`}):null]}),(0,T.jsx)(`span`,{className:`min-w-0 truncate text-xs font-medium text-muted-foreground`,children:e.tool.agentId}),(0,T.jsx)(`p`,{className:`m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground`,children:e.tool.description})]})}),(0,T.jsx)(A,{children:(0,T.jsx)(m,{className:x(e.tool),children:_(e.tool)})}),(0,T.jsx)(A,{children:(0,T.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,T.jsx)(b,{children:y(e.tool.parameters)}),(0,T.jsxs)(b,{children:[t,` `,t===1?`field`:`fields`]})]})}),(0,T.jsx)(A,{children:(0,T.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,T.jsx)(m,{className:v(e.tool.approval.required),children:e.tool.approval.required?`required`:`none`}),e.tool.approval.reason===void 0?null:(0,T.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,T.jsx)(A,{children:(0,T.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 k(e){return(0,T.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 A(e){return(0,T.jsx)(`td`,{className:`border-b border-border/70 py-3.5 pr-5 align-top first:pl-0`,children:e.children})}function j(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 M=`border-border/80 bg-muted/45 text-foreground`;export{E as ToolsPage};
|
|
2
|
+
//# sourceMappingURL=tools-page-D1ewvG0D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-page-D1ewvG0D.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 StudioEmptyState,\n StudioHeaderMetric,\n StudioPageContent,\n StudioPageHeader,\n StudioPageShell,\n} from \"../../components/ui/studio\";\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 = useMemo(() => props.summary?.tools ?? [], [props.summary]);\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 <StudioPageShell className=\"grid-rows-[auto_minmax(0,1fr)]\" aria-label=\"Tools\">\n <StudioPageHeader\n title=\"Tools\"\n description=\"Tool definitions registered on Studio agents, including approval policy and input schema.\"\n action={\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-sm:justify-start\">\n <StudioHeaderMetric label=\"tools\" value={toolTotals.total} />\n <StudioHeaderMetric label=\"mcp\" value={toolTotals.mcp} />\n <StudioHeaderMetric label=\"static\" value={toolTotals.static} />\n <StudioHeaderMetric label=\"dynamic\" value={toolTotals.dynamic} />\n <StudioHeaderMetric 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 text-xs max-sm: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 }\n />\n\n <StudioPageContent className=\"overflow-auto\">\n {!props.enabled ? (\n <StudioEmptyState\n title=\"Tools unavailable\"\n text=\"No registered Studio agent exposes static or dynamic tools.\"\n />\n ) : props.loading ? (\n <StudioEmptyState title=\"Loading tools\" text=\"Reading registered tool metadata.\" />\n ) : tools.length === 0 ? (\n <StudioEmptyState title=\"No tools\" text=\"The selected agent has no registered tools.\" />\n ) : (\n <div className=\"grid w-full gap-5\">\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 </div>\n )}\n </StudioPageContent>\n </StudioPageShell>\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 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"],"mappings":"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"}
|