@solidxai/core-ui 0.1.20-beta.1 → 0.1.21-beta.0
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/dist/components/common/FileReaderExt.d.ts.map +1 -1
- package/dist/components/common/FileReaderExt.js +22 -11
- package/dist/components/common/FileReaderExt.js.map +1 -1
- package/dist/components/common/FileReaderExt.tsx +27 -14
- package/dist/components/common/SocialMediaLogin.d.ts.map +1 -1
- package/dist/components/common/SocialMediaLogin.js +1 -1
- package/dist/components/common/SocialMediaLogin.js.map +1 -1
- package/dist/components/common/SocialMediaLogin.tsx +50 -19
- package/dist/components/common/solid-export.css +75 -0
- package/dist/components/core/common/SolidGenericImport/SolidImport.module.css +71 -0
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +14 -0
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +13 -0
- package/dist/components/core/form/fields/SolidMediaMultipleField.js +3 -3
- package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaMultipleField.tsx +3 -3
- package/dist/components/core/form/fields/SolidMediaSingleField.js +2 -2
- package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.tsx +2 -2
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +2 -2
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +4 -4
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +3 -3
- package/dist/components/core/solid-agent/SolidAgentChat.d.ts +3 -1
- package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentChat.js +150 -22
- package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentChat.tsx +76 -15
- package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts +2 -0
- package/dist/components/core/solid-agent/SolidAgentEmbedded.d.ts.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentEmbedded.js +4 -4
- package/dist/components/core/solid-agent/SolidAgentEmbedded.js.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentEmbedded.tsx +7 -1
- package/dist/components/core/solid-agent/SolidAgentHost.d.ts.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentHost.js +79 -1
- package/dist/components/core/solid-agent/SolidAgentHost.js.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentHost.tsx +69 -2
- package/dist/components/core/solid-agent/agentEvents.d.ts.map +1 -1
- package/dist/components/core/solid-agent/agentEvents.js +1 -3
- package/dist/components/core/solid-agent/agentEvents.js.map +1 -1
- package/dist/components/core/solid-agent/agentEvents.ts +5 -3
- package/dist/components/core/solid-agent/client/agentPublicEvents.d.ts +88 -0
- package/dist/components/core/solid-agent/client/agentPublicEvents.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/agentPublicEvents.js +26 -0
- package/dist/components/core/solid-agent/client/agentPublicEvents.js.map +1 -0
- package/dist/components/core/solid-agent/client/agentPublicEvents.ts +66 -0
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts +18 -3
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -1
- package/dist/components/core/solid-agent/client/agentRuntime.js +173 -31
- package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -1
- package/dist/components/core/solid-agent/client/agentRuntime.ts +126 -16
- package/dist/components/core/solid-agent/client/agentSocket.d.ts +3 -0
- package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -1
- package/dist/components/core/solid-agent/client/agentSocket.js +19 -1
- package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -1
- package/dist/components/core/solid-agent/client/agentSocket.ts +11 -1
- package/dist/components/core/solid-agent/client/beforeUserMessageSend.d.ts +9 -0
- package/dist/components/core/solid-agent/client/beforeUserMessageSend.d.ts.map +1 -0
- package/dist/components/core/solid-agent/client/beforeUserMessageSend.js +53 -0
- package/dist/components/core/solid-agent/client/beforeUserMessageSend.js.map +1 -0
- package/dist/components/core/solid-agent/client/beforeUserMessageSend.ts +26 -0
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.d.ts.map +1 -1
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +4 -3
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -1
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +4 -2
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +29 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +45 -2
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +49 -2
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts +1 -0
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.d.ts.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.js +2 -1
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.js.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedSamples.ts +15 -1
- package/dist/components/core/solid-agent/types.d.ts +13 -0
- package/dist/components/core/solid-agent/types.d.ts.map +1 -1
- package/dist/components/core/solid-agent/types.js.map +1 -1
- package/dist/components/core/solid-agent/types.ts +8 -0
- package/dist/components/core/solid-agent/useAgentChat.d.ts +1 -1
- package/dist/components/core/solid-agent/useAgentChat.d.ts.map +1 -1
- package/dist/components/core/solid-agent/useAgentChat.js +7 -4
- package/dist/components/core/solid-agent/useAgentChat.js.map +1 -1
- package/dist/components/core/solid-agent/useAgentChat.ts +9 -5
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.d.ts.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +12 -4
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +18 -0
- package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.d.ts +4 -0
- package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.d.ts.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.js +30 -0
- package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.js.map +1 -0
- package/dist/components/core/solid-agent/widgets/SolidNavigationIntentChatWidget.tsx +41 -0
- package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +39 -0
- package/dist/components/shad-cn-ui/SolidCodeEditor.d.ts +2 -1
- package/dist/components/shad-cn-ui/SolidCodeEditor.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidCodeEditor.js +3 -2
- package/dist/components/shad-cn-ui/SolidCodeEditor.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidCodeEditor.tsx +3 -0
- package/dist/helpers/adminViewRefresh.d.ts +13 -0
- package/dist/helpers/adminViewRefresh.d.ts.map +1 -0
- package/dist/helpers/adminViewRefresh.js +14 -0
- package/dist/helpers/adminViewRefresh.js.map +1 -0
- package/dist/helpers/adminViewRefresh.ts +26 -0
- package/dist/helpers/eventBus.d.ts +1 -0
- package/dist/helpers/eventBus.d.ts.map +1 -1
- package/dist/helpers/eventBus.js +1 -0
- package/dist/helpers/eventBus.js.map +1 -1
- package/dist/helpers/eventBus.ts +1 -0
- package/dist/helpers/fileTypeIcon.d.ts.map +1 -1
- package/dist/helpers/fileTypeIcon.js +4 -1
- package/dist/helpers/fileTypeIcon.js.map +1 -1
- package/dist/helpers/fileTypeIcon.tsx +15 -0
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +2 -0
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +2 -0
- package/dist/helpers/routePaths.d.ts +13 -0
- package/dist/helpers/routePaths.d.ts.map +1 -1
- package/dist/helpers/routePaths.js +39 -0
- package/dist/helpers/routePaths.js.map +1 -1
- package/dist/helpers/routePaths.ts +48 -0
- package/dist/redux/features/agentSlice.d.ts +2 -1
- package/dist/redux/features/agentSlice.d.ts.map +1 -1
- package/dist/redux/features/agentSlice.js +2 -2
- package/dist/redux/features/agentSlice.js.map +1 -1
- package/dist/redux/features/agentSlice.ts +8 -3
- package/dist/resources/solid-custom.css +42 -0
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/routes/pages/admin/core/AgentHubModuleField.css +15 -0
- package/dist/routes/pages/admin/core/AgentHubModuleField.d.ts +22 -0
- package/dist/routes/pages/admin/core/AgentHubModuleField.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentHubModuleField.js +42 -0
- package/dist/routes/pages/admin/core/AgentHubModuleField.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentHubModuleField.tsx +54 -0
- package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts +3 -1
- package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentHubTagsField.js +3 -3
- package/dist/routes/pages/admin/core/AgentHubTagsField.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentHubTagsField.tsx +7 -3
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +37 -29
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +12 -6
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +22 -15
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +17 -7
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +21 -15
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +16 -9
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js +149 -37
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js.map +1 -1
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.tsx +283 -73
- package/dist/routes/pages/admin/core/CardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/CardPage.js +9 -1
- package/dist/routes/pages/admin/core/CardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/CardPage.tsx +9 -1
- package/dist/routes/pages/admin/core/KanbanPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/KanbanPage.js +9 -1
- package/dist/routes/pages/admin/core/KanbanPage.js.map +1 -1
- package/dist/routes/pages/admin/core/KanbanPage.tsx +9 -1
- package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/ListPage.js +10 -1
- package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
- package/dist/routes/pages/admin/core/ListPage.tsx +10 -1
- package/dist/routes/pages/admin/core/TreePage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/TreePage.js +9 -1
- package/dist/routes/pages/admin/core/TreePage.js.map +1 -1
- package/dist/routes/pages/admin/core/TreePage.tsx +9 -1
- package/dist/routes/pages/embed/AgentEmbedPage.d.ts.map +1 -1
- package/dist/routes/pages/embed/AgentEmbedPage.js +67 -4
- package/dist/routes/pages/embed/AgentEmbedPage.js.map +1 -1
- package/dist/routes/pages/embed/AgentEmbedPage.tsx +61 -4
- package/package.json +1 -1
|
@@ -9,6 +9,7 @@ import { showToast } from "../../../../redux/features/toastSlice";
|
|
|
9
9
|
import { AgentRegistryAuditPanel } from "./AgentRegistryAuditPanel";
|
|
10
10
|
import { AgentPersonaHistory } from "./AgentPersonaHistory";
|
|
11
11
|
import { AgentHubTagsField, agentHubTagsFrom, agentHubTagsPayload, type AgentHubTag } from "./AgentHubTagsField";
|
|
12
|
+
import { AgentHubModuleField, agentHubModuleFrom, agentHubModulePayload, type AgentHubModule } from "./AgentHubModuleField";
|
|
12
13
|
import { AgentResourceCardWidget } from "../../../../components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget";
|
|
13
14
|
import { AgentSessionsPanel } from "../../../../components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel";
|
|
14
15
|
import { AgentProcessesPanel } from "../../../../components/core/extension/solid-core/agentToolRegistry/AgentProcessesPanel";
|
|
@@ -165,7 +166,7 @@ const detailFields = [
|
|
|
165
166
|
];
|
|
166
167
|
|
|
167
168
|
const detailQuery = [
|
|
168
|
-
"agentRoles", "agentRoles.roleMetadata", "agentSecrets", "agentSecrets.secret", "tags",
|
|
169
|
+
"agentRoles", "agentRoles.roleMetadata", "agentSecrets", "agentSecrets.secret", "tags", "module",
|
|
169
170
|
].map((name, index) => `populate[${index}]=${name}`).join("&") + "&" + fieldsQuery(detailFields);
|
|
170
171
|
|
|
171
172
|
// Group by link ID to project summary columns without populating full registry records.
|
|
@@ -205,7 +206,7 @@ function agentFormFromRecord(record: Agent) {
|
|
|
205
206
|
name: record.name ?? "", title: record.title ?? "", description: record.description ?? "", iconName: record.iconName ?? "",
|
|
206
207
|
inputs: parseInputs(record.requiredInputs), reasoningModelKey: record.reasoningModelKey ?? "", fastModelKey: record.fastModelKey ?? "",
|
|
207
208
|
systemPrompt: record.systemPrompt ?? "", stepLimit: record.stepLimit ?? 100, turnStepLimit: record.turnStepLimit ?? 20,
|
|
208
|
-
costLimit: Number(record.costLimit ?? 3), tags: agentHubTagsFrom(record.tags), skillIds: skills.map((link) => link.agentSkillRegistry?.id).filter(Boolean),
|
|
209
|
+
costLimit: Number(record.costLimit ?? 3), tags: agentHubTagsFrom(record.tags), moduleId: agentHubModuleFrom(record.module)?.id ?? null, skillIds: skills.map((link) => link.agentSkillRegistry?.id).filter(Boolean),
|
|
209
210
|
toolIds: tools.map((link) => link.agentToolRegistry?.id).filter(Boolean),
|
|
210
211
|
roleIds: items(record.agentRoles).map((link) => link.roleMetadata?.id).filter(Boolean),
|
|
211
212
|
secretIds: secrets.map((link) => link.secret?.id).filter(Boolean),
|
|
@@ -392,6 +393,7 @@ export function AgentRegistryEditorPage() {
|
|
|
392
393
|
const [turnStepLimit, setTurnStepLimit] = React.useState(20);
|
|
393
394
|
const [costLimit, setCostLimit] = React.useState(3);
|
|
394
395
|
const [tags, setTags] = React.useState<AgentHubTag[]>([]);
|
|
396
|
+
const [module, setModule] = React.useState<AgentHubModule | null>(null);
|
|
395
397
|
const [creatingTag, setCreatingTag] = React.useState(false);
|
|
396
398
|
const [skillIds, setSkillIds] = React.useState<number[]>([]);
|
|
397
399
|
const [toolIds, setToolIds] = React.useState<number[]>([]);
|
|
@@ -409,7 +411,7 @@ export function AgentRegistryEditorPage() {
|
|
|
409
411
|
const baseline = React.useRef("");
|
|
410
412
|
|
|
411
413
|
const currentForm = () => JSON.stringify({ name, title, description, iconName, inputs, reasoningModelKey, fastModelKey, systemPrompt,
|
|
412
|
-
stepLimit: Number(stepLimit), turnStepLimit: Number(turnStepLimit), costLimit: Number(costLimit), tags, skillIds, toolIds, roleIds, secretIds,
|
|
414
|
+
stepLimit: Number(stepLimit), turnStepLimit: Number(turnStepLimit), costLimit: Number(costLimit), tags, moduleId: module?.id ?? null, skillIds, toolIds, roleIds, secretIds,
|
|
413
415
|
alwaysIncludeValues, requiresApprovalValues, secretEnvVarNames });
|
|
414
416
|
|
|
415
417
|
React.useEffect(() => {
|
|
@@ -421,6 +423,7 @@ export function AgentRegistryEditorPage() {
|
|
|
421
423
|
setSystemPrompt(record.systemPrompt ?? ""); setStepLimit(record.stepLimit ?? 100);
|
|
422
424
|
setTurnStepLimit(record.turnStepLimit ?? 20); setCostLimit(Number(record.costLimit ?? 3));
|
|
423
425
|
setTags(agentHubTagsFrom(record.tags));
|
|
426
|
+
setModule(agentHubModuleFrom(record.module));
|
|
424
427
|
setSkillIds(items(record.agentSkills).map((link) => link.agentSkillRegistry?.id).filter(Boolean));
|
|
425
428
|
setToolIds(items(record.agentTools).map((link) => link.agentToolRegistry?.id).filter(Boolean));
|
|
426
429
|
setRoleIds(items(record.agentRoles).map((link) => link.roleMetadata?.id).filter(Boolean));
|
|
@@ -482,7 +485,7 @@ export function AgentRegistryEditorPage() {
|
|
|
482
485
|
}
|
|
483
486
|
const existing = links.find((link) => (link as any)[field]?.id === targetId);
|
|
484
487
|
if (existing && Object.entries(values).some(([key, value]) => (existing as any)[key] !== value)) {
|
|
485
|
-
await update({ id: existing.id, data: values }).unwrap();
|
|
488
|
+
await update({ id: existing.id, data: { agentRegistryId: agentId, [`${field}Id`]: targetId, ...values } }).unwrap();
|
|
486
489
|
}
|
|
487
490
|
}
|
|
488
491
|
};
|
|
@@ -492,6 +495,7 @@ export function AgentRegistryEditorPage() {
|
|
|
492
495
|
const next: Record<string, string> = {};
|
|
493
496
|
if (!name.trim()) next.name = "Name is required.";
|
|
494
497
|
if (!title.trim()) next.title = "Title is required.";
|
|
498
|
+
if (!module) next.module = "Module is required. Select a module before saving this agent.";
|
|
495
499
|
if (!systemPrompt.trim()) next.systemPrompt = "Persona instructions are required.";
|
|
496
500
|
if (!isValidModelKey(reasoningModelKey)) next.reasoningModelKey = "Choose an enabled reasoning provider and model.";
|
|
497
501
|
if (!isValidModelKey(fastModelKey)) next.fastModelKey = "Choose an enabled fast provider and model.";
|
|
@@ -520,6 +524,7 @@ export function AgentRegistryEditorPage() {
|
|
|
520
524
|
reasoningModelKey, fastModelKey, systemPrompt, stepLimit: Number(stepLimit),
|
|
521
525
|
turnStepLimit: Number(turnStepLimit), costLimit: Number(costLimit),
|
|
522
526
|
...agentHubTagsPayload(tags),
|
|
527
|
+
...agentHubModulePayload(module),
|
|
523
528
|
status: nextStatus ?? record?.status ?? "draft",
|
|
524
529
|
};
|
|
525
530
|
let newlyCreatedId: number | undefined;
|
|
@@ -593,8 +598,9 @@ export function AgentRegistryEditorPage() {
|
|
|
593
598
|
{ value: "basics", label: "Basics", content: <div className="agent-editor__stack">
|
|
594
599
|
<div className="agent-editor__grid">{field("Name", name, setName, "name", true)}{field("Title", title, setTitle, "title", true)}
|
|
595
600
|
{field("Description", description, setDescription, "description")}<div className="agent-editor__field"><span>Icon</span><SolidIconPicker value={iconName} onChange={setIconName} /></div>
|
|
601
|
+
<AgentHubModuleField className="agent-editor__field" value={module} onChange={(value) => { setModule(value); setErrors((current) => ({ ...current, module: "" })); }} disabled={creating || updating || isLoading || isFetching || isError} clearable={false} required error={errors.module} />
|
|
596
602
|
</div>
|
|
597
|
-
<AgentHubTagsField value={tags} onChange={setTags} disabled={creating || updating || isLoading || isFetching || isError} onBusyChange={setCreatingTag} />
|
|
603
|
+
<AgentHubTagsField value={tags} onChange={setTags} module={module} disabled={creating || updating || isLoading || isFetching || isError} onBusyChange={setCreatingTag} />
|
|
598
604
|
<section className="agent-editor__section"><div className="agent-editor__section-head"><div><h2>Inputs</h2><p>Define the variables this agent can use. Mark inputs optional or provide a default value when people do not need to enter them.</p></div>
|
|
599
605
|
{inputs.length > 0 && <SolidButton type="button" variant="secondary" size="small" onClick={() => setInputs((current) => [...current, { name: "", description: "", dataType: "string", defaultValue: null, optional: false }])}><Plus size={15} /> Add input</SolidButton>}
|
|
600
606
|
</div>
|
|
@@ -638,7 +644,7 @@ export function AgentRegistryEditorPage() {
|
|
|
638
644
|
</div> },
|
|
639
645
|
{ value: "persona", label: "Persona", content: <section className="agent-editor__section agent-editor__persona"><div className="agent-editor__section-head"><div><h2>System prompt *</h2><p>Describe the agent's role, behavior, and instructions in Markdown.</p></div>
|
|
640
646
|
{record?.id && <AgentPersonaHistory agentId={record.id} savedPrompt={record.systemPrompt ?? ""} refreshVersion={auditVersion} />}</div>
|
|
641
|
-
<SolidCodeEditor value={systemPrompt} onChange={(value) => { setSystemPrompt(value ?? ""); setErrors((current) => ({ ...current, systemPrompt: "" })); }} language="markdown" fontSize={11} height="max(34rem, calc(100dvh - 18rem))" />
|
|
647
|
+
<SolidCodeEditor value={systemPrompt} onChange={(value) => { setSystemPrompt(value ?? ""); setErrors((current) => ({ ...current, systemPrompt: "" })); }} language="markdown" wordWrap="on" fontSize={11} height="max(34rem, calc(100dvh - 18rem))" />
|
|
642
648
|
{errors.systemPrompt && <small className="agent-editor__error">{errors.systemPrompt}</small>}</section> },
|
|
643
649
|
{ value: "skills", label: "Skills", content: <LinkPicker label="Skills" description="Skills available to this agent." options={skills.records} selected={linked(skillIds, skills.records, items(record?.agentSkills).map((link) => link.agentSkillRegistry).filter(Boolean))}
|
|
644
650
|
onAdd={(id) => toggle(setSkillIds, id)} onRemove={(id) => toggle(setSkillIds, id)} createUrl="/admin/core/solid-core/agent-skill-registry/editor/new"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentSkillRegistryEditorPage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AgentSkillRegistryEditorPage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx"],"names":[],"mappings":"AAkBA,OAAO,oCAAoC,CAAC;AA+E5C,wBAAgB,4BAA4B,4CAgT3C"}
|
|
@@ -54,6 +54,7 @@ import { createSolidEntityApi } from "../../../../redux/api/solidEntityApi";
|
|
|
54
54
|
import { showToast } from "../../../../redux/features/toastSlice";
|
|
55
55
|
import { AgentRegistryAuditPanel } from "./AgentRegistryAuditPanel";
|
|
56
56
|
import { AgentHubTagsField, agentHubTagsFrom, agentHubTagsPayload } from "./AgentHubTagsField";
|
|
57
|
+
import { AgentHubModuleField, agentHubModuleFrom, agentHubModulePayload } from "./AgentHubModuleField";
|
|
57
58
|
import { SolidButton, SolidCodeEditor, SolidDialog, SolidDialogBody, SolidIconPicker, SolidInput, SolidTabGroup, } from "../../../../components/shad-cn-ui";
|
|
58
59
|
import "./AgentSkillRegistryEditorPage.css";
|
|
59
60
|
function extractEntityRecord(response) {
|
|
@@ -120,7 +121,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
120
121
|
var useCreateSolidEntityMutation = entityApi.useCreateSolidEntityMutation, useGetSolidEntityByIdQuery = entityApi.useGetSolidEntityByIdQuery, useUpdateSolidEntityMutation = entityApi.useUpdateSolidEntityMutation;
|
|
121
122
|
var _b = useGetSolidEntityByIdQuery({
|
|
122
123
|
id: id,
|
|
123
|
-
qs: "populate[0]=agentSkills&populate[1]=agentSkills.agentRegistry&populate[2]=tags",
|
|
124
|
+
qs: "populate[0]=agentSkills&populate[1]=agentSkills.agentRegistry&populate[2]=tags&populate[3]=module",
|
|
124
125
|
}, { skip: !id || id === "new" }), response = _b.data, isLoading = _b.isLoading, isFetching = _b.isFetching, refetch = _b.refetch;
|
|
125
126
|
var _c = useCreateSolidEntityMutation(), createSkill = _c[0], isCreating = _c[1].isLoading;
|
|
126
127
|
var _d = useUpdateSolidEntityMutation(), updateSkill = _d[0], isSaving = _d[1].isLoading;
|
|
@@ -132,28 +133,31 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
132
133
|
var _j = React.useState(""), description = _j[0], setDescription = _j[1];
|
|
133
134
|
var _k = React.useState(""), body = _k[0], setBody = _k[1];
|
|
134
135
|
var _l = React.useState([]), tags = _l[0], setTags = _l[1];
|
|
135
|
-
var _m = React.useState(
|
|
136
|
-
var _o = React.useState(
|
|
137
|
-
var _p = React.useState(
|
|
138
|
-
var _q = React.useState(
|
|
136
|
+
var _m = React.useState(null), module = _m[0], setModule = _m[1];
|
|
137
|
+
var _o = React.useState(false), creatingTag = _o[0], setCreatingTag = _o[1];
|
|
138
|
+
var _p = React.useState({}), fieldErrors = _p[0], setFieldErrors = _p[1];
|
|
139
|
+
var _q = React.useState(0), auditRefreshVersion = _q[0], setAuditRefreshVersion = _q[1];
|
|
140
|
+
var _r = React.useState(false), confirmRefresh = _r[0], setConfirmRefresh = _r[1];
|
|
139
141
|
var baseline = React.useRef("");
|
|
140
|
-
var currentForm = function () { return JSON.stringify({ name: name, type: type, iconName: iconName, description: description, body: body, tags: tags }); };
|
|
142
|
+
var currentForm = function () { var _a; return JSON.stringify({ name: name, type: type, iconName: iconName, description: description, body: body, tags: tags, moduleId: (_a = module === null || module === void 0 ? void 0 : module.id) !== null && _a !== void 0 ? _a : null }); };
|
|
141
143
|
React.useEffect(function () {
|
|
142
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
144
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
143
145
|
var nextTags = agentHubTagsFrom(record === null || record === void 0 ? void 0 : record.tags);
|
|
146
|
+
var nextModule = agentHubModuleFrom(record === null || record === void 0 ? void 0 : record.module);
|
|
144
147
|
setName((_a = record === null || record === void 0 ? void 0 : record.name) !== null && _a !== void 0 ? _a : "");
|
|
145
148
|
setType((_b = record === null || record === void 0 ? void 0 : record.type) !== null && _b !== void 0 ? _b : "custom");
|
|
146
149
|
setIconName((_c = record === null || record === void 0 ? void 0 : record.iconName) !== null && _c !== void 0 ? _c : "");
|
|
147
150
|
setDescription((_d = record === null || record === void 0 ? void 0 : record.description) !== null && _d !== void 0 ? _d : "");
|
|
148
151
|
setBody((_e = record === null || record === void 0 ? void 0 : record.body) !== null && _e !== void 0 ? _e : "");
|
|
149
152
|
setTags(nextTags);
|
|
150
|
-
|
|
153
|
+
setModule(nextModule);
|
|
154
|
+
baseline.current = JSON.stringify({ name: (_f = record === null || record === void 0 ? void 0 : record.name) !== null && _f !== void 0 ? _f : "", type: (_g = record === null || record === void 0 ? void 0 : record.type) !== null && _g !== void 0 ? _g : "custom", iconName: (_h = record === null || record === void 0 ? void 0 : record.iconName) !== null && _h !== void 0 ? _h : "", description: (_j = record === null || record === void 0 ? void 0 : record.description) !== null && _j !== void 0 ? _j : "", body: (_k = record === null || record === void 0 ? void 0 : record.body) !== null && _k !== void 0 ? _k : "", tags: nextTags, moduleId: (_l = nextModule === null || nextModule === void 0 ? void 0 : nextModule.id) !== null && _l !== void 0 ? _l : null });
|
|
151
155
|
}, [record]);
|
|
152
156
|
var isReadOnly = (record === null || record === void 0 ? void 0 : record.type) === "solidx";
|
|
153
157
|
var isDirty = Boolean(record === null || record === void 0 ? void 0 : record.id) && currentForm() !== baseline.current;
|
|
154
158
|
var requestRefresh = function () { return isDirty ? setConfirmRefresh(true) : void refetch(); };
|
|
155
159
|
var handleSave = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
156
|
-
var nextErrors, payload, result, createdId, error_1, errorDetail, serverFieldErrors, _i, _a, field;
|
|
160
|
+
var nextErrors, payload, result, createdId, error_1, errorDetail, serverFieldErrors, _i, _a, field, label;
|
|
157
161
|
var _b, _c;
|
|
158
162
|
return __generator(this, function (_d) {
|
|
159
163
|
switch (_d.label) {
|
|
@@ -169,6 +173,8 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
169
173
|
nextErrors.description = "Description is required.";
|
|
170
174
|
if (!body.trim())
|
|
171
175
|
nextErrors.body = "Skill instructions are required.";
|
|
176
|
+
if (!module)
|
|
177
|
+
nextErrors.module = "Module is required. Select a module before saving this skill.";
|
|
172
178
|
setFieldErrors(nextErrors);
|
|
173
179
|
if (Object.keys(nextErrors).length > 0) {
|
|
174
180
|
setActiveTab(nextErrors.body ? "skill" : "general");
|
|
@@ -179,7 +185,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
179
185
|
}));
|
|
180
186
|
return [2 /*return*/];
|
|
181
187
|
}
|
|
182
|
-
payload = __assign({ name: name.trim(), type: type, iconName: iconName || null, description: description.trim(), body: body }, agentHubTagsPayload(tags));
|
|
188
|
+
payload = __assign(__assign({ name: name.trim(), type: type, iconName: iconName || null, description: description.trim(), body: body }, agentHubTagsPayload(tags)), agentHubModulePayload(module));
|
|
183
189
|
_d.label = 1;
|
|
184
190
|
case 1:
|
|
185
191
|
_d.trys.push([1, 6, , 7]);
|
|
@@ -216,11 +222,12 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
216
222
|
errorDetail = getSaveErrorMessage(error_1);
|
|
217
223
|
serverFieldErrors = {};
|
|
218
224
|
if (/required|not be empty|cannot be empty|should not be empty/i.test(errorDetail)) {
|
|
219
|
-
for (_i = 0, _a = ["name", "type", "description", "body"]; _i < _a.length; _i++) {
|
|
225
|
+
for (_i = 0, _a = ["name", "type", "description", "body", "module"]; _i < _a.length; _i++) {
|
|
220
226
|
field = _a[_i];
|
|
221
227
|
if (!new RegExp("\\b".concat(field, "\\b"), "i").test(errorDetail))
|
|
222
228
|
continue;
|
|
223
|
-
|
|
229
|
+
label = field === "body" ? "Skill instructions" : field === "module" ? "Module" : field[0].toUpperCase() + field.slice(1);
|
|
230
|
+
serverFieldErrors[field] = "".concat(label, " is required.");
|
|
224
231
|
}
|
|
225
232
|
}
|
|
226
233
|
if (Object.keys(serverFieldErrors).length > 0) {
|
|
@@ -242,7 +249,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
242
249
|
{
|
|
243
250
|
value: "general",
|
|
244
251
|
label: "General Info",
|
|
245
|
-
content: (_jsxs("fieldset", { className: "agent-skill-editor__general", disabled: isReadOnly, children: [isReadOnly && _jsx("p", { className: "agent-skill-editor__readonly-note", children: "SolidX skills
|
|
252
|
+
content: (_jsxs("fieldset", { className: "agent-skill-editor__general", disabled: isReadOnly, children: [isReadOnly && _jsx("p", { className: "agent-skill-editor__readonly-note", children: "SolidX skills cannot be edited." }), _jsxs("div", { className: "agent-skill-editor__fields", children: [_jsxs("label", { className: "agent-skill-editor__field", children: [_jsxs("span", { children: ["Name ", _jsx("b", { children: "*" })] }), _jsx(SolidInput, { value: name, "aria-invalid": Boolean(fieldErrors.name), "aria-describedby": fieldErrors.name ? "agent-skill-name-error" : undefined, className: fieldErrors.name ? "agent-skill-editor__input--invalid" : undefined, onChange: function (event) {
|
|
246
253
|
setName(event.target.value);
|
|
247
254
|
setFieldErrors(function (current) { return (__assign(__assign({}, current), { name: "" })); });
|
|
248
255
|
} }), fieldErrors.name && _jsx("small", { id: "agent-skill-name-error", className: "agent-skill-editor__field-error", children: fieldErrors.name })] }), _jsxs("div", { className: "agent-skill-editor__field", children: [_jsx("span", { children: "Icon" }), _jsx(SolidIconPicker, { value: iconName, onChange: setIconName })] }), _jsxs("label", { className: "agent-skill-editor__field", children: [_jsxs("span", { children: ["Description ", _jsx("b", { children: "*" })] }), _jsx(SolidInput, { value: description, "aria-invalid": Boolean(fieldErrors.description), "aria-describedby": fieldErrors.description ? "agent-skill-description-error" : undefined, className: fieldErrors.description ? "agent-skill-editor__input--invalid" : undefined, onChange: function (event) {
|
|
@@ -251,7 +258,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
251
258
|
} }), fieldErrors.description && _jsx("small", { id: "agent-skill-description-error", className: "agent-skill-editor__field-error", children: fieldErrors.description })] })] }), _jsxs("label", { className: "agent-skill-editor__field", children: [_jsxs("span", { children: ["Skill type ", _jsx("b", { children: "*" })] }), _jsxs("select", { value: type, "aria-invalid": Boolean(fieldErrors.type), "aria-describedby": fieldErrors.type ? "agent-skill-type-error" : undefined, className: fieldErrors.type ? "agent-skill-editor__input--invalid" : undefined, onChange: function (event) {
|
|
252
259
|
setType(event.target.value);
|
|
253
260
|
setFieldErrors(function (current) { return (__assign(__assign({}, current), { type: "" })); });
|
|
254
|
-
}, children: [isReadOnly && _jsx("option", { value: "solidx", children: "SolidX" }), _jsx("option", { value: "thirdparty", children: "Third Party" }), _jsx("option", { value: "custom", children: "Custom" })] }), fieldErrors.type && _jsx("small", { id: "agent-skill-type-error", className: "agent-skill-editor__field-error", children: fieldErrors.type })] }), _jsx(AgentHubTagsField, { value: tags, onChange: setTags, disabled: isReadOnly || isCreating || isSaving, onBusyChange: setCreatingTag })] })),
|
|
261
|
+
}, children: [isReadOnly && _jsx("option", { value: "solidx", children: "SolidX" }), _jsx("option", { value: "thirdparty", children: "Third Party" }), _jsx("option", { value: "custom", children: "Custom" })] }), fieldErrors.type && _jsx("small", { id: "agent-skill-type-error", className: "agent-skill-editor__field-error", children: fieldErrors.type })] }), _jsx(AgentHubModuleField, { className: "agent-skill-editor__field", value: module, onChange: function (value) { setModule(value); setFieldErrors(function (current) { return (__assign(__assign({}, current), { module: "" })); }); }, disabled: isReadOnly || isCreating || isSaving, clearable: false, required: true, error: fieldErrors.module }), _jsx(AgentHubTagsField, { value: tags, onChange: setTags, module: module, disabled: isReadOnly || isCreating || isSaving, onBusyChange: setCreatingTag })] })),
|
|
255
262
|
},
|
|
256
263
|
{
|
|
257
264
|
value: "skill",
|
|
@@ -259,7 +266,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
259
266
|
content: (_jsx("div", { className: "agent-skill-editor__skill", children: _jsxs("section", { className: "agent-skill-editor__panel", children: [_jsxs("header", { children: [_jsxs("h2", { children: ["Skill instructions ", _jsx("b", { children: "*" })] }), _jsx("p", { children: "Write the skill's Markdown body here." })] }), _jsx(SolidCodeEditor, { value: body, onChange: function (value) {
|
|
260
267
|
setBody(value !== null && value !== void 0 ? value : "");
|
|
261
268
|
setFieldErrors(function (current) { return (__assign(__assign({}, current), { body: "" })); });
|
|
262
|
-
}, language: "markdown", readOnly: isReadOnly, fontSize: 11, height: "max(32rem, calc(100dvh - 18rem))", className: "agent-skill-editor__code".concat(fieldErrors.body ? " agent-skill-editor__code--invalid" : "") }), fieldErrors.body && _jsx("small", { className: "agent-skill-editor__field-error agent-skill-editor__body-error", children: fieldErrors.body })] }) })),
|
|
269
|
+
}, language: "markdown", wordWrap: "on", readOnly: isReadOnly, fontSize: 11, height: "max(32rem, calc(100dvh - 18rem))", className: "agent-skill-editor__code".concat(fieldErrors.body ? " agent-skill-editor__code--invalid" : "") }), fieldErrors.body && _jsx("small", { className: "agent-skill-editor__field-error agent-skill-editor__body-error", children: fieldErrors.body })] }) })),
|
|
263
270
|
},
|
|
264
271
|
{
|
|
265
272
|
value: "agents",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentSkillRegistryEditorPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { ArrowLeft, RefreshCw } from \"lucide-react\";\nimport { useDispatch } from \"react-redux\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport { createSolidEntityApi } from \"../../../../redux/api/solidEntityApi\";\nimport { showToast } from \"../../../../redux/features/toastSlice\";\nimport { AgentRegistryAuditPanel } from \"./AgentRegistryAuditPanel\";\nimport { AgentHubTagsField, agentHubTagsFrom, agentHubTagsPayload, type AgentHubTag } from \"./AgentHubTagsField\";\nimport {\n SolidButton,\n SolidCodeEditor,\n SolidDialog,\n SolidDialogBody,\n SolidIconPicker,\n SolidInput,\n SolidTabGroup,\n} from \"../../../../components/shad-cn-ui\";\nimport \"./AgentSkillRegistryEditorPage.css\";\n\ntype AgentReference = {\n id?: number | string;\n name?: string;\n title?: string;\n agentRegistry?: AgentReference | number | string | null;\n};\n\ntype SkillRecord = {\n id: number;\n name?: string;\n type?: string;\n iconName?: string | null;\n description?: string;\n body?: string;\n tags?: AgentHubTag[];\n agentSkills?: AgentReference[] | AgentReference | null;\n};\n\nfunction extractEntityRecord(response: unknown): Record<string, any> | undefined {\n let candidate: unknown = response;\n for (let depth = 0; depth < 3; depth += 1) {\n if (!candidate || typeof candidate !== \"object\") return undefined;\n const value = candidate as Record<string, unknown>;\n if (\"id\" in value || \"name\" in value) return value;\n candidate = value.data;\n }\n return candidate && typeof candidate === \"object\" ? candidate as Record<string, any> : undefined;\n}\n\nfunction formatErrorMessage(value: unknown): string | undefined {\n if (typeof value === \"string\") return value.trim() || undefined;\n if (Array.isArray(value)) {\n const messages = value.map(formatErrorMessage).filter((message): message is string => Boolean(message));\n return messages.length ? messages.join(\"; \") : undefined;\n }\n if (value && typeof value === \"object\") {\n const error = value as Record<string, unknown>;\n return formatErrorMessage(error.message)\n ?? formatErrorMessage(error.constraints)\n ?? formatErrorMessage(error.error);\n }\n return undefined;\n}\n\nfunction getSaveErrorMessage(error: unknown): string {\n if (!error || typeof error !== \"object\") return \"Failed to save skill.\";\n const apiError = error as Record<string, any>;\n // Nest validation details are nested at data.data.message; prefer them over\n // the generic outer \"Bad Request Exception\" message.\n return formatErrorMessage(apiError.data?.data?.message)\n ?? formatErrorMessage(apiError.data?.message)\n ?? formatErrorMessage(apiError.data?.error)\n ?? formatErrorMessage(apiError.message)\n ?? \"Failed to save skill.\";\n}\n\nfunction skillAgents(record?: SkillRecord): AgentReference[] {\n const related = record?.agentSkills;\n const links = Array.isArray(related)\n ? related\n : related\n ? [related]\n : [];\n const seen = new Set<string>();\n\n return links\n .map((link) => link.agentRegistry)\n .filter((agent): agent is AgentReference => Boolean(agent && typeof agent === \"object\"))\n .filter((agent) => {\n const key = String(agent.id ?? agent.name ?? agent.title ?? \"\");\n if (!key || seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function AgentSkillRegistryEditorPage() {\n const { id = \"\" } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const entityApi = React.useMemo(() => createSolidEntityApi(\"agentSkillRegistry\"), []);\n const {\n useCreateSolidEntityMutation,\n useGetSolidEntityByIdQuery,\n useUpdateSolidEntityMutation,\n } = entityApi;\n\n const { data: response, isLoading, isFetching, refetch } = useGetSolidEntityByIdQuery(\n {\n id,\n qs: \"populate[0]=agentSkills&populate[1]=agentSkills.agentRegistry&populate[2]=tags\",\n },\n { skip: !id || id === \"new\" },\n );\n const [createSkill, { isLoading: isCreating }] = useCreateSolidEntityMutation();\n const [updateSkill, { isLoading: isSaving }] = useUpdateSolidEntityMutation();\n const record = extractEntityRecord(response) as SkillRecord | undefined;\n\n const [activeTab, setActiveTab] = React.useState(\"general\");\n const [name, setName] = React.useState(\"\");\n const [type, setType] = React.useState(\"custom\");\n const [iconName, setIconName] = React.useState(\"\");\n const [description, setDescription] = React.useState(\"\");\n const [body, setBody] = React.useState(\"\");\n const [tags, setTags] = React.useState<AgentHubTag[]>([]);\n const [creatingTag, setCreatingTag] = React.useState(false);\n const [fieldErrors, setFieldErrors] = React.useState<Record<string, string>>({});\n const [auditRefreshVersion, setAuditRefreshVersion] = React.useState(0);\n const [confirmRefresh, setConfirmRefresh] = React.useState(false);\n const baseline = React.useRef(\"\");\n const currentForm = () => JSON.stringify({ name, type, iconName, description, body, tags });\n\n React.useEffect(() => {\n const nextTags = agentHubTagsFrom(record?.tags);\n setName(record?.name ?? \"\");\n setType(record?.type ?? \"custom\");\n setIconName(record?.iconName ?? \"\");\n setDescription(record?.description ?? \"\");\n setBody(record?.body ?? \"\");\n setTags(nextTags);\n baseline.current = JSON.stringify({ name: record?.name ?? \"\", type: record?.type ?? \"custom\", iconName: record?.iconName ?? \"\", description: record?.description ?? \"\", body: record?.body ?? \"\", tags: nextTags });\n }, [record]);\n\n const isReadOnly = record?.type === \"solidx\";\n const isDirty = Boolean(record?.id) && currentForm() !== baseline.current;\n const requestRefresh = () => isDirty ? setConfirmRefresh(true) : void refetch();\n\n const handleSave = async () => {\n if (creatingTag) return;\n const nextErrors: Record<string, string> = {};\n if (!name.trim()) nextErrors.name = \"Name is required.\";\n if (!type.trim()) nextErrors.type = \"Skill type is required.\";\n if (!description.trim()) nextErrors.description = \"Description is required.\";\n if (!body.trim()) nextErrors.body = \"Skill instructions are required.\";\n\n setFieldErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n setActiveTab(nextErrors.body ? \"skill\" : \"general\");\n dispatch(showToast({\n severity: \"error\",\n summary: \"Missing information\",\n detail: Object.values(nextErrors).join(\" \"),\n }));\n return;\n }\n\n const payload = {\n name: name.trim(),\n type,\n iconName: iconName || null,\n description: description.trim(),\n body,\n ...agentHubTagsPayload(tags),\n };\n\n try {\n if (record?.id) {\n await updateSkill({ id: record.id, data: payload }).unwrap();\n dispatch(showToast({\n severity: \"success\",\n summary: \"Saved\",\n detail: \"Skill updated successfully.\",\n }));\n setAuditRefreshVersion((version) => version + 1);\n refetch();\n } else {\n const result: any = await createSkill(payload).unwrap();\n const createdId = result?.data?.id ?? result?.id;\n dispatch(showToast({\n severity: \"success\",\n summary: \"Created\",\n detail: \"Skill created successfully.\",\n }));\n if (createdId) {\n navigate(`/admin/core/solid-core/agent-skill-registry/editor/${createdId}`, {\n replace: true,\n });\n }\n }\n } catch (error: any) {\n const errorDetail = getSaveErrorMessage(error);\n const serverFieldErrors: Record<string, string> = {};\n if (/required|not be empty|cannot be empty|should not be empty/i.test(errorDetail)) {\n for (const field of [\"name\", \"type\", \"description\", \"body\"]) {\n if (!new RegExp(`\\\\b${field}\\\\b`, \"i\").test(errorDetail)) continue;\n serverFieldErrors[field] = `${field === \"body\" ? \"Skill instructions\" : field[0].toUpperCase() + field.slice(1)} is required.`;\n }\n }\n if (Object.keys(serverFieldErrors).length > 0) {\n setFieldErrors(serverFieldErrors);\n setActiveTab(serverFieldErrors.body ? \"skill\" : \"general\");\n }\n dispatch(showToast({\n severity: \"error\",\n summary: \"Save failed\",\n detail: errorDetail,\n }));\n }\n };\n\n const agents = skillAgents(record);\n const tabs = [\n {\n value: \"general\",\n label: \"General Info\",\n content: (\n <fieldset className=\"agent-skill-editor__general\" disabled={isReadOnly}>\n {isReadOnly && <p className=\"agent-skill-editor__readonly-note\">SolidX skills are seeded by the AgentHub runtime and cannot be edited.</p>}\n <div className=\"agent-skill-editor__fields\">\n <label className=\"agent-skill-editor__field\">\n <span>Name <b>*</b></span>\n <SolidInput\n value={name}\n aria-invalid={Boolean(fieldErrors.name)}\n aria-describedby={fieldErrors.name ? \"agent-skill-name-error\" : undefined}\n className={fieldErrors.name ? \"agent-skill-editor__input--invalid\" : undefined}\n onChange={(event) => {\n setName(event.target.value);\n setFieldErrors((current) => ({ ...current, name: \"\" }));\n }}\n />\n {fieldErrors.name && <small id=\"agent-skill-name-error\" className=\"agent-skill-editor__field-error\">{fieldErrors.name}</small>}\n </label>\n <div className=\"agent-skill-editor__field\">\n <span>Icon</span>\n <SolidIconPicker value={iconName} onChange={setIconName} />\n </div>\n <label className=\"agent-skill-editor__field\">\n <span>Description <b>*</b></span>\n <SolidInput\n value={description}\n aria-invalid={Boolean(fieldErrors.description)}\n aria-describedby={fieldErrors.description ? \"agent-skill-description-error\" : undefined}\n className={fieldErrors.description ? \"agent-skill-editor__input--invalid\" : undefined}\n onChange={(event) => {\n setDescription(event.target.value);\n setFieldErrors((current) => ({ ...current, description: \"\" }));\n }}\n />\n {fieldErrors.description && <small id=\"agent-skill-description-error\" className=\"agent-skill-editor__field-error\">{fieldErrors.description}</small>}\n </label>\n </div>\n <label className=\"agent-skill-editor__field\">\n <span>Skill type <b>*</b></span>\n <select\n value={type}\n aria-invalid={Boolean(fieldErrors.type)}\n aria-describedby={fieldErrors.type ? \"agent-skill-type-error\" : undefined}\n className={fieldErrors.type ? \"agent-skill-editor__input--invalid\" : undefined}\n onChange={(event) => {\n setType(event.target.value);\n setFieldErrors((current) => ({ ...current, type: \"\" }));\n }}\n >\n {isReadOnly && <option value=\"solidx\">SolidX</option>}\n <option value=\"thirdparty\">Third Party</option>\n <option value=\"custom\">Custom</option>\n </select>\n {fieldErrors.type && <small id=\"agent-skill-type-error\" className=\"agent-skill-editor__field-error\">{fieldErrors.type}</small>}\n </label>\n <AgentHubTagsField value={tags} onChange={setTags} disabled={isReadOnly || isCreating || isSaving} onBusyChange={setCreatingTag} />\n </fieldset>\n ),\n },\n {\n value: \"skill\",\n label: \"Skill\",\n content: (\n <div className=\"agent-skill-editor__skill\">\n <section className=\"agent-skill-editor__panel\">\n <header>\n <h2>Skill instructions <b>*</b></h2>\n <p>Write the skill's Markdown body here.</p>\n </header>\n <SolidCodeEditor\n value={body}\n onChange={(value) => {\n setBody(value ?? \"\");\n setFieldErrors((current) => ({ ...current, body: \"\" }));\n }}\n language=\"markdown\"\n readOnly={isReadOnly}\n fontSize={11}\n height=\"max(32rem, calc(100dvh - 18rem))\"\n className={`agent-skill-editor__code${fieldErrors.body ? \" agent-skill-editor__code--invalid\" : \"\"}`}\n />\n {fieldErrors.body && <small className=\"agent-skill-editor__field-error agent-skill-editor__body-error\">{fieldErrors.body}</small>}\n </section>\n </div>\n ),\n },\n {\n value: \"agents\",\n label: \"Agents\",\n content: (\n <section className=\"agent-skill-editor__agents\">\n <div>\n <h2>Associated agents</h2>\n <p>Agents linked to this skill. Associations are read-only here.</p>\n </div>\n {isLoading ? (\n <p>Loading associated agents…</p>\n ) : agents.length ? (\n <div className=\"agent-skill-editor__agent-grid\">\n {agents.map((agent, index) => (\n <article className=\"agent-skill-editor__agent-card\" key={String(agent.id ?? agent.name ?? index)}>\n <span>{(agent.name ?? agent.title ?? \"A\").slice(0, 1).toUpperCase()}</span>\n <strong>{agent.name ?? agent.title ?? \"Unnamed agent\"}</strong>\n </article>\n ))}\n </div>\n ) : (\n <div className=\"agent-skill-editor__empty\">No agents are currently associated with this skill.</div>\n )}\n </section>\n ),\n },\n ];\n\n return (\n <main className=\"agent-skill-editor\">\n <header className=\"agent-skill-editor__header\">\n <div>\n <div className=\"agent-skill-editor__heading-with-refresh\"><h1>{record ? \"Edit Skill\" : \"Create Skill\"}</h1>{record?.id && <button type=\"button\" className={`agent-skill-editor__refresh${isFetching ? \" is-loading\" : \"\"}`} aria-label=\"Refresh skill\" title=\"Refresh skill\" disabled={isFetching || isSaving} onClick={requestRefresh}><RefreshCw size={14} /></button>}</div>\n </div>\n <div className=\"agent-skill-editor__actions\">\n <SolidButton variant=\"secondary\" leftIcon={<ArrowLeft size={16} />} onClick={() => navigate(-1)}>\n Back\n </SolidButton>\n {!isReadOnly && (\n <SolidButton loading={isCreating || isSaving} disabled={creatingTag} onClick={handleSave}>\n Save Skill\n </SolidButton>\n )}\n </div>\n </header>\n\n <SolidDialog open={confirmRefresh} onOpenChange={setConfirmRefresh} header=\"Discard unsaved changes?\" style={{ width: \"min(28rem, 94vw)\" }}\n footer={<><SolidButton type=\"button\" variant=\"secondary\" onClick={() => setConfirmRefresh(false)}>Cancel</SolidButton><SolidButton type=\"button\" disabled={isFetching} onClick={() => { setConfirmRefresh(false); void refetch(); }}>Refresh and discard</SolidButton></>}>\n <SolidDialogBody><p>You have unsaved changes. Refreshing will discard them and load the latest skill content.</p></SolidDialogBody>\n </SolidDialog>\n\n {isLoading ? (\n <div className=\"agent-skill-editor__loading\">Loading skill…</div>\n ) : record?.id ? (\n <AgentRegistryAuditPanel\n modelSingularName=\"agentSkillRegistry\"\n recordId={record.id}\n refreshVersion={auditRefreshVersion}\n modelUserKey={record.name}\n >\n <SolidTabGroup\n tabs={tabs}\n value={activeTab}\n onValueChange={setActiveTab}\n className=\"agent-skill-editor__tabs\"\n listClassName=\"agent-skill-editor__tab-list\"\n panelClassName=\"agent-skill-editor__tab-panel\"\n />\n </AgentRegistryAuditPanel>\n ) : (\n <SolidTabGroup\n tabs={tabs}\n value={activeTab}\n onValueChange={setActiveTab}\n className=\"agent-skill-editor__tabs\"\n listClassName=\"agent-skill-editor__tab-list\"\n panelClassName=\"agent-skill-editor__tab-panel\"\n />\n )}\n </main>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentSkillRegistryEditorPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { ArrowLeft, RefreshCw } from \"lucide-react\";\nimport { useDispatch } from \"react-redux\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport { createSolidEntityApi } from \"../../../../redux/api/solidEntityApi\";\nimport { showToast } from \"../../../../redux/features/toastSlice\";\nimport { AgentRegistryAuditPanel } from \"./AgentRegistryAuditPanel\";\nimport { AgentHubTagsField, agentHubTagsFrom, agentHubTagsPayload, type AgentHubTag } from \"./AgentHubTagsField\";\nimport { AgentHubModuleField, agentHubModuleFrom, agentHubModulePayload, type AgentHubModule } from \"./AgentHubModuleField\";\nimport {\n SolidButton,\n SolidCodeEditor,\n SolidDialog,\n SolidDialogBody,\n SolidIconPicker,\n SolidInput,\n SolidTabGroup,\n} from \"../../../../components/shad-cn-ui\";\nimport \"./AgentSkillRegistryEditorPage.css\";\n\ntype AgentReference = {\n id?: number | string;\n name?: string;\n title?: string;\n agentRegistry?: AgentReference | number | string | null;\n};\n\ntype SkillRecord = {\n id: number;\n name?: string;\n type?: string;\n iconName?: string | null;\n description?: string;\n body?: string;\n tags?: AgentHubTag[];\n module?: AgentHubModule | null;\n agentSkills?: AgentReference[] | AgentReference | null;\n};\n\nfunction extractEntityRecord(response: unknown): Record<string, any> | undefined {\n let candidate: unknown = response;\n for (let depth = 0; depth < 3; depth += 1) {\n if (!candidate || typeof candidate !== \"object\") return undefined;\n const value = candidate as Record<string, unknown>;\n if (\"id\" in value || \"name\" in value) return value;\n candidate = value.data;\n }\n return candidate && typeof candidate === \"object\" ? candidate as Record<string, any> : undefined;\n}\n\nfunction formatErrorMessage(value: unknown): string | undefined {\n if (typeof value === \"string\") return value.trim() || undefined;\n if (Array.isArray(value)) {\n const messages = value.map(formatErrorMessage).filter((message): message is string => Boolean(message));\n return messages.length ? messages.join(\"; \") : undefined;\n }\n if (value && typeof value === \"object\") {\n const error = value as Record<string, unknown>;\n return formatErrorMessage(error.message)\n ?? formatErrorMessage(error.constraints)\n ?? formatErrorMessage(error.error);\n }\n return undefined;\n}\n\nfunction getSaveErrorMessage(error: unknown): string {\n if (!error || typeof error !== \"object\") return \"Failed to save skill.\";\n const apiError = error as Record<string, any>;\n // Nest validation details are nested at data.data.message; prefer them over\n // the generic outer \"Bad Request Exception\" message.\n return formatErrorMessage(apiError.data?.data?.message)\n ?? formatErrorMessage(apiError.data?.message)\n ?? formatErrorMessage(apiError.data?.error)\n ?? formatErrorMessage(apiError.message)\n ?? \"Failed to save skill.\";\n}\n\nfunction skillAgents(record?: SkillRecord): AgentReference[] {\n const related = record?.agentSkills;\n const links = Array.isArray(related)\n ? related\n : related\n ? [related]\n : [];\n const seen = new Set<string>();\n\n return links\n .map((link) => link.agentRegistry)\n .filter((agent): agent is AgentReference => Boolean(agent && typeof agent === \"object\"))\n .filter((agent) => {\n const key = String(agent.id ?? agent.name ?? agent.title ?? \"\");\n if (!key || seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function AgentSkillRegistryEditorPage() {\n const { id = \"\" } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const entityApi = React.useMemo(() => createSolidEntityApi(\"agentSkillRegistry\"), []);\n const {\n useCreateSolidEntityMutation,\n useGetSolidEntityByIdQuery,\n useUpdateSolidEntityMutation,\n } = entityApi;\n\n const { data: response, isLoading, isFetching, refetch } = useGetSolidEntityByIdQuery(\n {\n id,\n qs: \"populate[0]=agentSkills&populate[1]=agentSkills.agentRegistry&populate[2]=tags&populate[3]=module\",\n },\n { skip: !id || id === \"new\" },\n );\n const [createSkill, { isLoading: isCreating }] = useCreateSolidEntityMutation();\n const [updateSkill, { isLoading: isSaving }] = useUpdateSolidEntityMutation();\n const record = extractEntityRecord(response) as SkillRecord | undefined;\n\n const [activeTab, setActiveTab] = React.useState(\"general\");\n const [name, setName] = React.useState(\"\");\n const [type, setType] = React.useState(\"custom\");\n const [iconName, setIconName] = React.useState(\"\");\n const [description, setDescription] = React.useState(\"\");\n const [body, setBody] = React.useState(\"\");\n const [tags, setTags] = React.useState<AgentHubTag[]>([]);\n const [module, setModule] = React.useState<AgentHubModule | null>(null);\n const [creatingTag, setCreatingTag] = React.useState(false);\n const [fieldErrors, setFieldErrors] = React.useState<Record<string, string>>({});\n const [auditRefreshVersion, setAuditRefreshVersion] = React.useState(0);\n const [confirmRefresh, setConfirmRefresh] = React.useState(false);\n const baseline = React.useRef(\"\");\n const currentForm = () => JSON.stringify({ name, type, iconName, description, body, tags, moduleId: module?.id ?? null });\n\n React.useEffect(() => {\n const nextTags = agentHubTagsFrom(record?.tags);\n const nextModule = agentHubModuleFrom(record?.module);\n setName(record?.name ?? \"\");\n setType(record?.type ?? \"custom\");\n setIconName(record?.iconName ?? \"\");\n setDescription(record?.description ?? \"\");\n setBody(record?.body ?? \"\");\n setTags(nextTags);\n setModule(nextModule);\n baseline.current = JSON.stringify({ name: record?.name ?? \"\", type: record?.type ?? \"custom\", iconName: record?.iconName ?? \"\", description: record?.description ?? \"\", body: record?.body ?? \"\", tags: nextTags, moduleId: nextModule?.id ?? null });\n }, [record]);\n\n const isReadOnly = record?.type === \"solidx\";\n const isDirty = Boolean(record?.id) && currentForm() !== baseline.current;\n const requestRefresh = () => isDirty ? setConfirmRefresh(true) : void refetch();\n\n const handleSave = async () => {\n if (creatingTag) return;\n const nextErrors: Record<string, string> = {};\n if (!name.trim()) nextErrors.name = \"Name is required.\";\n if (!type.trim()) nextErrors.type = \"Skill type is required.\";\n if (!description.trim()) nextErrors.description = \"Description is required.\";\n if (!body.trim()) nextErrors.body = \"Skill instructions are required.\";\n if (!module) nextErrors.module = \"Module is required. Select a module before saving this skill.\";\n\n setFieldErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n setActiveTab(nextErrors.body ? \"skill\" : \"general\");\n dispatch(showToast({\n severity: \"error\",\n summary: \"Missing information\",\n detail: Object.values(nextErrors).join(\" \"),\n }));\n return;\n }\n\n const payload = {\n name: name.trim(),\n type,\n iconName: iconName || null,\n description: description.trim(),\n body,\n ...agentHubTagsPayload(tags),\n ...agentHubModulePayload(module),\n };\n\n try {\n if (record?.id) {\n await updateSkill({ id: record.id, data: payload }).unwrap();\n dispatch(showToast({\n severity: \"success\",\n summary: \"Saved\",\n detail: \"Skill updated successfully.\",\n }));\n setAuditRefreshVersion((version) => version + 1);\n refetch();\n } else {\n const result: any = await createSkill(payload).unwrap();\n const createdId = result?.data?.id ?? result?.id;\n dispatch(showToast({\n severity: \"success\",\n summary: \"Created\",\n detail: \"Skill created successfully.\",\n }));\n if (createdId) {\n navigate(`/admin/core/solid-core/agent-skill-registry/editor/${createdId}`, {\n replace: true,\n });\n }\n }\n } catch (error: any) {\n const errorDetail = getSaveErrorMessage(error);\n const serverFieldErrors: Record<string, string> = {};\n if (/required|not be empty|cannot be empty|should not be empty/i.test(errorDetail)) {\n for (const field of [\"name\", \"type\", \"description\", \"body\", \"module\"]) {\n if (!new RegExp(`\\\\b${field}\\\\b`, \"i\").test(errorDetail)) continue;\n const label = field === \"body\" ? \"Skill instructions\" : field === \"module\" ? \"Module\" : field[0].toUpperCase() + field.slice(1);\n serverFieldErrors[field] = `${label} is required.`;\n }\n }\n if (Object.keys(serverFieldErrors).length > 0) {\n setFieldErrors(serverFieldErrors);\n setActiveTab(serverFieldErrors.body ? \"skill\" : \"general\");\n }\n dispatch(showToast({\n severity: \"error\",\n summary: \"Save failed\",\n detail: errorDetail,\n }));\n }\n };\n\n const agents = skillAgents(record);\n const tabs = [\n {\n value: \"general\",\n label: \"General Info\",\n content: (\n <fieldset className=\"agent-skill-editor__general\" disabled={isReadOnly}>\n {isReadOnly && <p className=\"agent-skill-editor__readonly-note\">SolidX skills cannot be edited.</p>}\n <div className=\"agent-skill-editor__fields\">\n <label className=\"agent-skill-editor__field\">\n <span>Name <b>*</b></span>\n <SolidInput\n value={name}\n aria-invalid={Boolean(fieldErrors.name)}\n aria-describedby={fieldErrors.name ? \"agent-skill-name-error\" : undefined}\n className={fieldErrors.name ? \"agent-skill-editor__input--invalid\" : undefined}\n onChange={(event) => {\n setName(event.target.value);\n setFieldErrors((current) => ({ ...current, name: \"\" }));\n }}\n />\n {fieldErrors.name && <small id=\"agent-skill-name-error\" className=\"agent-skill-editor__field-error\">{fieldErrors.name}</small>}\n </label>\n <div className=\"agent-skill-editor__field\">\n <span>Icon</span>\n <SolidIconPicker value={iconName} onChange={setIconName} />\n </div>\n <label className=\"agent-skill-editor__field\">\n <span>Description <b>*</b></span>\n <SolidInput\n value={description}\n aria-invalid={Boolean(fieldErrors.description)}\n aria-describedby={fieldErrors.description ? \"agent-skill-description-error\" : undefined}\n className={fieldErrors.description ? \"agent-skill-editor__input--invalid\" : undefined}\n onChange={(event) => {\n setDescription(event.target.value);\n setFieldErrors((current) => ({ ...current, description: \"\" }));\n }}\n />\n {fieldErrors.description && <small id=\"agent-skill-description-error\" className=\"agent-skill-editor__field-error\">{fieldErrors.description}</small>}\n </label>\n </div>\n <label className=\"agent-skill-editor__field\">\n <span>Skill type <b>*</b></span>\n <select\n value={type}\n aria-invalid={Boolean(fieldErrors.type)}\n aria-describedby={fieldErrors.type ? \"agent-skill-type-error\" : undefined}\n className={fieldErrors.type ? \"agent-skill-editor__input--invalid\" : undefined}\n onChange={(event) => {\n setType(event.target.value);\n setFieldErrors((current) => ({ ...current, type: \"\" }));\n }}\n >\n {isReadOnly && <option value=\"solidx\">SolidX</option>}\n <option value=\"thirdparty\">Third Party</option>\n <option value=\"custom\">Custom</option>\n </select>\n {fieldErrors.type && <small id=\"agent-skill-type-error\" className=\"agent-skill-editor__field-error\">{fieldErrors.type}</small>}\n </label>\n <AgentHubModuleField className=\"agent-skill-editor__field\" value={module} onChange={(value) => { setModule(value); setFieldErrors((current) => ({ ...current, module: \"\" })); }} disabled={isReadOnly || isCreating || isSaving} clearable={false} required error={fieldErrors.module} />\n <AgentHubTagsField value={tags} onChange={setTags} module={module} disabled={isReadOnly || isCreating || isSaving} onBusyChange={setCreatingTag} />\n </fieldset>\n ),\n },\n {\n value: \"skill\",\n label: \"Skill\",\n content: (\n <div className=\"agent-skill-editor__skill\">\n <section className=\"agent-skill-editor__panel\">\n <header>\n <h2>Skill instructions <b>*</b></h2>\n <p>Write the skill's Markdown body here.</p>\n </header>\n <SolidCodeEditor\n value={body}\n onChange={(value) => {\n setBody(value ?? \"\");\n setFieldErrors((current) => ({ ...current, body: \"\" }));\n }}\n language=\"markdown\"\n wordWrap=\"on\"\n readOnly={isReadOnly}\n fontSize={11}\n height=\"max(32rem, calc(100dvh - 18rem))\"\n className={`agent-skill-editor__code${fieldErrors.body ? \" agent-skill-editor__code--invalid\" : \"\"}`}\n />\n {fieldErrors.body && <small className=\"agent-skill-editor__field-error agent-skill-editor__body-error\">{fieldErrors.body}</small>}\n </section>\n </div>\n ),\n },\n {\n value: \"agents\",\n label: \"Agents\",\n content: (\n <section className=\"agent-skill-editor__agents\">\n <div>\n <h2>Associated agents</h2>\n <p>Agents linked to this skill. Associations are read-only here.</p>\n </div>\n {isLoading ? (\n <p>Loading associated agents…</p>\n ) : agents.length ? (\n <div className=\"agent-skill-editor__agent-grid\">\n {agents.map((agent, index) => (\n <article className=\"agent-skill-editor__agent-card\" key={String(agent.id ?? agent.name ?? index)}>\n <span>{(agent.name ?? agent.title ?? \"A\").slice(0, 1).toUpperCase()}</span>\n <strong>{agent.name ?? agent.title ?? \"Unnamed agent\"}</strong>\n </article>\n ))}\n </div>\n ) : (\n <div className=\"agent-skill-editor__empty\">No agents are currently associated with this skill.</div>\n )}\n </section>\n ),\n },\n ];\n\n return (\n <main className=\"agent-skill-editor\">\n <header className=\"agent-skill-editor__header\">\n <div>\n <div className=\"agent-skill-editor__heading-with-refresh\"><h1>{record ? \"Edit Skill\" : \"Create Skill\"}</h1>{record?.id && <button type=\"button\" className={`agent-skill-editor__refresh${isFetching ? \" is-loading\" : \"\"}`} aria-label=\"Refresh skill\" title=\"Refresh skill\" disabled={isFetching || isSaving} onClick={requestRefresh}><RefreshCw size={14} /></button>}</div>\n </div>\n <div className=\"agent-skill-editor__actions\">\n <SolidButton variant=\"secondary\" leftIcon={<ArrowLeft size={16} />} onClick={() => navigate(-1)}>\n Back\n </SolidButton>\n {!isReadOnly && (\n <SolidButton loading={isCreating || isSaving} disabled={creatingTag} onClick={handleSave}>\n Save Skill\n </SolidButton>\n )}\n </div>\n </header>\n\n <SolidDialog open={confirmRefresh} onOpenChange={setConfirmRefresh} header=\"Discard unsaved changes?\" style={{ width: \"min(28rem, 94vw)\" }}\n footer={<><SolidButton type=\"button\" variant=\"secondary\" onClick={() => setConfirmRefresh(false)}>Cancel</SolidButton><SolidButton type=\"button\" disabled={isFetching} onClick={() => { setConfirmRefresh(false); void refetch(); }}>Refresh and discard</SolidButton></>}>\n <SolidDialogBody><p>You have unsaved changes. Refreshing will discard them and load the latest skill content.</p></SolidDialogBody>\n </SolidDialog>\n\n {isLoading ? (\n <div className=\"agent-skill-editor__loading\">Loading skill…</div>\n ) : record?.id ? (\n <AgentRegistryAuditPanel\n modelSingularName=\"agentSkillRegistry\"\n recordId={record.id}\n refreshVersion={auditRefreshVersion}\n modelUserKey={record.name}\n >\n <SolidTabGroup\n tabs={tabs}\n value={activeTab}\n onValueChange={setActiveTab}\n className=\"agent-skill-editor__tabs\"\n listClassName=\"agent-skill-editor__tab-list\"\n panelClassName=\"agent-skill-editor__tab-panel\"\n />\n </AgentRegistryAuditPanel>\n ) : (\n <SolidTabGroup\n tabs={tabs}\n value={activeTab}\n onValueChange={setActiveTab}\n className=\"agent-skill-editor__tabs\"\n listClassName=\"agent-skill-editor__tab-list\"\n panelClassName=\"agent-skill-editor__tab-panel\"\n />\n )}\n </main>\n );\n}\n"]}
|
|
@@ -6,6 +6,7 @@ import { createSolidEntityApi } from "../../../../redux/api/solidEntityApi";
|
|
|
6
6
|
import { showToast } from "../../../../redux/features/toastSlice";
|
|
7
7
|
import { AgentRegistryAuditPanel } from "./AgentRegistryAuditPanel";
|
|
8
8
|
import { AgentHubTagsField, agentHubTagsFrom, agentHubTagsPayload, type AgentHubTag } from "./AgentHubTagsField";
|
|
9
|
+
import { AgentHubModuleField, agentHubModuleFrom, agentHubModulePayload, type AgentHubModule } from "./AgentHubModuleField";
|
|
9
10
|
import {
|
|
10
11
|
SolidButton,
|
|
11
12
|
SolidCodeEditor,
|
|
@@ -32,6 +33,7 @@ type SkillRecord = {
|
|
|
32
33
|
description?: string;
|
|
33
34
|
body?: string;
|
|
34
35
|
tags?: AgentHubTag[];
|
|
36
|
+
module?: AgentHubModule | null;
|
|
35
37
|
agentSkills?: AgentReference[] | AgentReference | null;
|
|
36
38
|
};
|
|
37
39
|
|
|
@@ -107,7 +109,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
107
109
|
const { data: response, isLoading, isFetching, refetch } = useGetSolidEntityByIdQuery(
|
|
108
110
|
{
|
|
109
111
|
id,
|
|
110
|
-
qs: "populate[0]=agentSkills&populate[1]=agentSkills.agentRegistry&populate[2]=tags",
|
|
112
|
+
qs: "populate[0]=agentSkills&populate[1]=agentSkills.agentRegistry&populate[2]=tags&populate[3]=module",
|
|
111
113
|
},
|
|
112
114
|
{ skip: !id || id === "new" },
|
|
113
115
|
);
|
|
@@ -122,22 +124,25 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
122
124
|
const [description, setDescription] = React.useState("");
|
|
123
125
|
const [body, setBody] = React.useState("");
|
|
124
126
|
const [tags, setTags] = React.useState<AgentHubTag[]>([]);
|
|
127
|
+
const [module, setModule] = React.useState<AgentHubModule | null>(null);
|
|
125
128
|
const [creatingTag, setCreatingTag] = React.useState(false);
|
|
126
129
|
const [fieldErrors, setFieldErrors] = React.useState<Record<string, string>>({});
|
|
127
130
|
const [auditRefreshVersion, setAuditRefreshVersion] = React.useState(0);
|
|
128
131
|
const [confirmRefresh, setConfirmRefresh] = React.useState(false);
|
|
129
132
|
const baseline = React.useRef("");
|
|
130
|
-
const currentForm = () => JSON.stringify({ name, type, iconName, description, body, tags });
|
|
133
|
+
const currentForm = () => JSON.stringify({ name, type, iconName, description, body, tags, moduleId: module?.id ?? null });
|
|
131
134
|
|
|
132
135
|
React.useEffect(() => {
|
|
133
136
|
const nextTags = agentHubTagsFrom(record?.tags);
|
|
137
|
+
const nextModule = agentHubModuleFrom(record?.module);
|
|
134
138
|
setName(record?.name ?? "");
|
|
135
139
|
setType(record?.type ?? "custom");
|
|
136
140
|
setIconName(record?.iconName ?? "");
|
|
137
141
|
setDescription(record?.description ?? "");
|
|
138
142
|
setBody(record?.body ?? "");
|
|
139
143
|
setTags(nextTags);
|
|
140
|
-
|
|
144
|
+
setModule(nextModule);
|
|
145
|
+
baseline.current = JSON.stringify({ name: record?.name ?? "", type: record?.type ?? "custom", iconName: record?.iconName ?? "", description: record?.description ?? "", body: record?.body ?? "", tags: nextTags, moduleId: nextModule?.id ?? null });
|
|
141
146
|
}, [record]);
|
|
142
147
|
|
|
143
148
|
const isReadOnly = record?.type === "solidx";
|
|
@@ -151,6 +156,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
151
156
|
if (!type.trim()) nextErrors.type = "Skill type is required.";
|
|
152
157
|
if (!description.trim()) nextErrors.description = "Description is required.";
|
|
153
158
|
if (!body.trim()) nextErrors.body = "Skill instructions are required.";
|
|
159
|
+
if (!module) nextErrors.module = "Module is required. Select a module before saving this skill.";
|
|
154
160
|
|
|
155
161
|
setFieldErrors(nextErrors);
|
|
156
162
|
if (Object.keys(nextErrors).length > 0) {
|
|
@@ -170,6 +176,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
170
176
|
description: description.trim(),
|
|
171
177
|
body,
|
|
172
178
|
...agentHubTagsPayload(tags),
|
|
179
|
+
...agentHubModulePayload(module),
|
|
173
180
|
};
|
|
174
181
|
|
|
175
182
|
try {
|
|
@@ -200,9 +207,10 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
200
207
|
const errorDetail = getSaveErrorMessage(error);
|
|
201
208
|
const serverFieldErrors: Record<string, string> = {};
|
|
202
209
|
if (/required|not be empty|cannot be empty|should not be empty/i.test(errorDetail)) {
|
|
203
|
-
for (const field of ["name", "type", "description", "body"]) {
|
|
210
|
+
for (const field of ["name", "type", "description", "body", "module"]) {
|
|
204
211
|
if (!new RegExp(`\\b${field}\\b`, "i").test(errorDetail)) continue;
|
|
205
|
-
|
|
212
|
+
const label = field === "body" ? "Skill instructions" : field === "module" ? "Module" : field[0].toUpperCase() + field.slice(1);
|
|
213
|
+
serverFieldErrors[field] = `${label} is required.`;
|
|
206
214
|
}
|
|
207
215
|
}
|
|
208
216
|
if (Object.keys(serverFieldErrors).length > 0) {
|
|
@@ -224,7 +232,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
224
232
|
label: "General Info",
|
|
225
233
|
content: (
|
|
226
234
|
<fieldset className="agent-skill-editor__general" disabled={isReadOnly}>
|
|
227
|
-
{isReadOnly && <p className="agent-skill-editor__readonly-note">SolidX skills
|
|
235
|
+
{isReadOnly && <p className="agent-skill-editor__readonly-note">SolidX skills cannot be edited.</p>}
|
|
228
236
|
<div className="agent-skill-editor__fields">
|
|
229
237
|
<label className="agent-skill-editor__field">
|
|
230
238
|
<span>Name <b>*</b></span>
|
|
@@ -277,7 +285,8 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
277
285
|
</select>
|
|
278
286
|
{fieldErrors.type && <small id="agent-skill-type-error" className="agent-skill-editor__field-error">{fieldErrors.type}</small>}
|
|
279
287
|
</label>
|
|
280
|
-
<
|
|
288
|
+
<AgentHubModuleField className="agent-skill-editor__field" value={module} onChange={(value) => { setModule(value); setFieldErrors((current) => ({ ...current, module: "" })); }} disabled={isReadOnly || isCreating || isSaving} clearable={false} required error={fieldErrors.module} />
|
|
289
|
+
<AgentHubTagsField value={tags} onChange={setTags} module={module} disabled={isReadOnly || isCreating || isSaving} onBusyChange={setCreatingTag} />
|
|
281
290
|
</fieldset>
|
|
282
291
|
),
|
|
283
292
|
},
|
|
@@ -298,6 +307,7 @@ export function AgentSkillRegistryEditorPage() {
|
|
|
298
307
|
setFieldErrors((current) => ({ ...current, body: "" }));
|
|
299
308
|
}}
|
|
300
309
|
language="markdown"
|
|
310
|
+
wordWrap="on"
|
|
301
311
|
readOnly={isReadOnly}
|
|
302
312
|
fontSize={11}
|
|
303
313
|
height="max(32rem, calc(100dvh - 18rem))"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentToolRegistryEditorPage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AgentToolRegistryEditorPage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx"],"names":[],"mappings":"AAcA,OAAO,mCAAmC,CAAC;AA8D3C,wBAAgB,2BAA2B,4CAqN1C"}
|