{"$schema":"https:\/\/ui.particle.academy\/schema\/registry-item.json","name":"agents-editor","type":"registry:ui","title":"AgentsEditor","description":"\/AGENTS register editor \u2014 per-agent allow\/deny policy + scope.","package":"fancy-x-files-ui","dependencies":["@particle-academy\/react-fancy"],"registryDependencies":["model.js","validate.js"],"files":[{"path":"components\/fancy\/agents-editor\/AgentsEditor.tsx","content":"import { Button, Input, Select } from \"@particle-academy\/react-fancy\";\r\nimport type { AgentEntry, AgentsModel } from \"..\/model.js\";\r\nimport { validateAgents } from \"..\/validate.js\";\r\nimport { IssueList, Section } from \".\/internal.js\";\r\n\r\nexport interface AgentsEditorProps {\r\n  value: AgentsModel;\r\n  onChange: (next: AgentsModel) => void;\r\n  hideIssues?: boolean;\r\n  className?: string;\r\n}\r\n\r\n\/** Controlled \/AGENTS register editor: per-agent allow\/deny policy. *\/\r\nexport function AgentsEditor({\r\n  value,\r\n  onChange,\r\n  hideIssues,\r\n  className,\r\n}: AgentsEditorProps) {\r\n  const issues = validateAgents(value);\r\n  const patch = (next: Partial<AgentsModel>) => onChange({ ...value, ...next });\r\n\r\n  const updateAgent = (index: number, next: Partial<AgentEntry>) =>\r\n    patch({\r\n      agents: value.agents.map((a, i) =>\r\n        i === index ? { ...a, ...next } : a,\r\n      ),\r\n    });\r\n\r\n  const addAgent = () =>\r\n    patch({ agents: [...value.agents, { id: \"\", policy: \"allow\" }] });\r\n\r\n  const removeAgent = (index: number) =>\r\n    patch({ agents: value.agents.filter((_, i) => i !== index) });\r\n\r\n  return (\r\n    <div className={className} data-x-editor=\"agents\">\r\n      <Section title=\"Policy contact\" handle=\"agents-contact\">\r\n        <Input\r\n          value={value.contact ?? \"\"}\r\n          onValueChange={(v) => patch({ contact: v || undefined })}\r\n          placeholder=\"mailto:agents@example.com\"\r\n          data-x-input=\"agents-contact\"\r\n        \/>\r\n      <\/Section>\r\n\r\n      <Section\r\n        title=\"Agents\"\r\n        handle=\"agents-list\"\r\n        action={\r\n          <Button\r\n            type=\"button\"\r\n            variant=\"ghost\"\r\n            onClick={addAgent}\r\n            data-x-add=\"agents-agent\"\r\n          >\r\n            Add agent\r\n          <\/Button>\r\n        }\r\n      >\r\n        {value.agents.map((agent, i) => (\r\n          <div\r\n            key={i}\r\n            data-x-agent={i}\r\n            style={{\r\n              border: \"1px solid var(--rf-border, #e5e7eb)\",\r\n              borderRadius: \"0.5rem\",\r\n              padding: \"0.6rem\",\r\n              display: \"flex\",\r\n              flexDirection: \"column\",\r\n              gap: \"0.4rem\",\r\n            }}\r\n          >\r\n            <div\r\n              style={{\r\n                display: \"flex\",\r\n                gap: \"0.4rem\",\r\n                alignItems: \"end\",\r\n                flexWrap: \"wrap\",\r\n              }}\r\n            >\r\n              <div style={{ flex: \"1 1 8rem\" }}>\r\n                <Input\r\n                  label=\"id\"\r\n                  value={agent.id}\r\n                  onValueChange={(id) => updateAgent(i, { id })}\r\n                  placeholder=\"gptbot\"\r\n                  data-x-input={`agents-id:${i}`}\r\n                \/>\r\n              <\/div>\r\n              <div style={{ flex: \"1 1 8rem\" }}>\r\n                <Input\r\n                  label=\"name\"\r\n                  value={agent.name ?? \"\"}\r\n                  onValueChange={(v) => updateAgent(i, { name: v || undefined })}\r\n                  placeholder=\"GPTBot\"\r\n                  data-x-input={`agents-name:${i}`}\r\n                \/>\r\n              <\/div>\r\n              <div style={{ flex: \"0 1 7rem\" }}>\r\n                <Select\r\n                  label=\"policy\"\r\n                  value={agent.policy}\r\n                  list={[\"allow\", \"deny\"]}\r\n                  onValueChange={(v) =>\r\n                    updateAgent(i, { policy: v as AgentEntry[\"policy\"] })\r\n                  }\r\n                  data-x-input={`agents-policy:${i}`}\r\n                \/>\r\n              <\/div>\r\n              <Button\r\n                type=\"button\"\r\n                variant=\"ghost\"\r\n                color=\"red\"\r\n                onClick={() => removeAgent(i)}\r\n                data-x-remove={`agents-agent:${i}`}\r\n              >\r\n                \u00d7\r\n              <\/Button>\r\n            <\/div>\r\n            <div style={{ display: \"flex\", gap: \"0.4rem\", flexWrap: \"wrap\" }}>\r\n              <div style={{ flex: \"1 1 9rem\" }}>\r\n                <Input\r\n                  label=\"url\"\r\n                  value={agent.url ?? \"\"}\r\n                  onValueChange={(v) => updateAgent(i, { url: v || undefined })}\r\n                  placeholder=\"https:\/\/example.com\/bot\"\r\n                  data-x-input={`agents-url:${i}`}\r\n                \/>\r\n              <\/div>\r\n              <div style={{ flex: \"2 1 12rem\" }}>\r\n                <Input\r\n                  label=\"scope\"\r\n                  value={agent.scope ?? \"\"}\r\n                  onValueChange={(v) =>\r\n                    updateAgent(i, { scope: v || undefined })\r\n                  }\r\n                  placeholder=\"read-only crawl of \/docs\"\r\n                  data-x-input={`agents-scope:${i}`}\r\n                \/>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        ))}\r\n      <\/Section>\r\n\r\n      {hideIssues ? null : <IssueList issues={issues} testid=\"agents\" \/>}\r\n    <\/div>\r\n  );\r\n}\r\n","type":"registry:ui","target":"components\/fancy\/agents-editor\/AgentsEditor.tsx"}]}