@solidxai/core-ui 0.1.19-beta.1 → 0.1.20-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/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js +3 -10
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js.map +1 -1
- package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx +3 -8
- package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
- package/dist/components/layout/AdminHeaderActions.js +1 -29
- package/dist/components/layout/AdminHeaderActions.js.map +1 -1
- package/dist/components/layout/AdminHeaderActions.tsx +0 -42
- package/dist/components/layout/SolidAiStudioLayout.d.ts +0 -1
- package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.js +9 -161
- package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.tsx +7 -136
- package/dist/routes/AppEventListener.d.ts.map +1 -1
- package/dist/routes/AppEventListener.js +3 -3
- package/dist/routes/AppEventListener.js.map +1 -1
- package/dist/routes/AppEventListener.tsx +1 -2
- package/dist/routes/pages/admin/core/AgentHubTagsField.css +21 -0
- package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts +17 -0
- package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentHubTagsField.js +171 -0
- package/dist/routes/pages/admin/core/AgentHubTagsField.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentHubTagsField.tsx +125 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +7 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +65 -52
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +53 -11
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +14 -69
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +15 -83
- package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts +11 -0
- package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentToolActivationDialog.js +166 -0
- package/dist/routes/pages/admin/core/AgentToolActivationDialog.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentToolActivationDialog.tsx +140 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.css +26 -0
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +94 -71
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +60 -52
- package/package.json +1 -1
|
@@ -45,23 +45,17 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
45
45
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
49
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
50
|
-
if (ar || !(i in from)) {
|
|
51
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
52
|
-
ar[i] = from[i];
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
56
|
-
};
|
|
57
48
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
58
49
|
import React from "react";
|
|
59
|
-
import { ArrowLeft,
|
|
50
|
+
import { ArrowLeft, RefreshCw } from "lucide-react";
|
|
60
51
|
import { useDispatch } from "react-redux";
|
|
61
52
|
import { useNavigate, useParams } from "react-router-dom";
|
|
62
53
|
import { createSolidEntityApi } from "../../../../redux/api/solidEntityApi";
|
|
63
54
|
import { showToast } from "../../../../redux/features/toastSlice";
|
|
55
|
+
import { solidPatch } from "../../../../http/solidHttp";
|
|
64
56
|
import { AgentRegistryAuditPanel } from "./AgentRegistryAuditPanel";
|
|
57
|
+
import { AgentHubTagsField, agentHubTagsFrom, agentHubTagsPayload } from "./AgentHubTagsField";
|
|
58
|
+
import { AgentToolActivationDialog } from "./AgentToolActivationDialog";
|
|
65
59
|
import { AgentToolSessionsPanel } from "../../../../components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel";
|
|
66
60
|
import { AgentRegistryCardWidget } from "../../../../components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget";
|
|
67
61
|
import { SolidButton, SolidCodeEditor, SolidDialog, SolidDialogBody, SolidIconPicker, SolidInput, SolidTabGroup } from "../../../../components/shad-cn-ui";
|
|
@@ -79,19 +73,6 @@ function extractEntityRecord(response) {
|
|
|
79
73
|
}
|
|
80
74
|
return candidate && typeof candidate === "object" ? candidate : undefined;
|
|
81
75
|
}
|
|
82
|
-
function parseTags(value) {
|
|
83
|
-
if (Array.isArray(value))
|
|
84
|
-
return value.map(String).map(function (tag) { return tag.trim(); }).filter(Boolean);
|
|
85
|
-
if (typeof value !== "string" || !value.trim())
|
|
86
|
-
return [];
|
|
87
|
-
try {
|
|
88
|
-
var parsed = JSON.parse(value);
|
|
89
|
-
return Array.isArray(parsed) ? parsed.map(String).map(function (tag) { return tag.trim(); }).filter(Boolean) : [];
|
|
90
|
-
}
|
|
91
|
-
catch (_a) {
|
|
92
|
-
return value === "{}" ? [] : value.split(",").map(function (tag) { return tag.trim(); }).filter(Boolean);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
76
|
function sha256Hex(value) {
|
|
96
77
|
return __awaiter(this, void 0, void 0, function () {
|
|
97
78
|
var digest;
|
|
@@ -134,7 +115,7 @@ export function AgentToolRegistryEditorPage() {
|
|
|
134
115
|
var dispatch = useDispatch();
|
|
135
116
|
var entityApi = React.useMemo(function () { return createSolidEntityApi("agentToolRegistry"); }, []);
|
|
136
117
|
var useCreateSolidEntityMutation = entityApi.useCreateSolidEntityMutation, useGetSolidEntityByIdQuery = entityApi.useGetSolidEntityByIdQuery, useUpdateSolidEntityMutation = entityApi.useUpdateSolidEntityMutation;
|
|
137
|
-
var _c = useGetSolidEntityByIdQuery({ id: id, qs: "populate[0]=agentTools&populate[1]=agentTools.agentRegistry" }, { skip: !id || id === "new" }), response = _c.data, isLoading = _c.isLoading, isFetching = _c.isFetching, refetch = _c.refetch;
|
|
118
|
+
var _c = useGetSolidEntityByIdQuery({ id: id, qs: "populate[0]=agentTools&populate[1]=agentTools.agentRegistry&populate[2]=tags" }, { skip: !id || id === "new" }), response = _c.data, isLoading = _c.isLoading, isFetching = _c.isFetching, refetch = _c.refetch;
|
|
138
119
|
var _d = useCreateSolidEntityMutation(), createTool = _d[0], isCreating = _d[1].isLoading;
|
|
139
120
|
var _e = useUpdateSolidEntityMutation(), updateTool = _e[0], isSaving = _e[1].isLoading;
|
|
140
121
|
var record = extractEntityRecord(response);
|
|
@@ -145,50 +126,43 @@ export function AgentToolRegistryEditorPage() {
|
|
|
145
126
|
var _k = React.useState("custom"), type = _k[0], setType = _k[1];
|
|
146
127
|
var _l = React.useState(""), sourceCode = _l[0], setSourceCode = _l[1];
|
|
147
128
|
var _m = React.useState([]), tags = _m[0], setTags = _m[1];
|
|
148
|
-
var _o = React.useState(
|
|
129
|
+
var _o = React.useState(false), creatingTag = _o[0], setCreatingTag = _o[1];
|
|
149
130
|
var _p = React.useState({}), fieldErrors = _p[0], setFieldErrors = _p[1];
|
|
150
131
|
var _q = React.useState(0), auditRefreshVersion = _q[0], setAuditRefreshVersion = _q[1];
|
|
151
132
|
var _r = React.useState(false), confirmRefresh = _r[0], setConfirmRefresh = _r[1];
|
|
133
|
+
var _s = React.useState(false), activationOpen = _s[0], setActivationOpen = _s[1];
|
|
134
|
+
var _t = React.useState(null), activationTool = _t[0], setActivationTool = _t[1];
|
|
135
|
+
var preparingActivation = React.useRef(false);
|
|
152
136
|
var baseline = React.useRef("");
|
|
153
|
-
var currentForm = function () { return JSON.stringify({ name: name, iconName: iconName, description: description, type: type, sourceCode: sourceCode, tags: tags
|
|
137
|
+
var currentForm = function () { return JSON.stringify({ name: name, iconName: iconName, description: description, type: type, sourceCode: sourceCode, tags: tags }); };
|
|
154
138
|
React.useEffect(function () {
|
|
155
139
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
156
|
-
var nextTags =
|
|
140
|
+
var nextTags = agentHubTagsFrom(record === null || record === void 0 ? void 0 : record.tags);
|
|
157
141
|
setName((_a = record === null || record === void 0 ? void 0 : record.name) !== null && _a !== void 0 ? _a : "");
|
|
158
142
|
setIconName((_b = record === null || record === void 0 ? void 0 : record.iconName) !== null && _b !== void 0 ? _b : "");
|
|
159
143
|
setDescription((_c = record === null || record === void 0 ? void 0 : record.description) !== null && _c !== void 0 ? _c : "");
|
|
160
144
|
setType((_d = record === null || record === void 0 ? void 0 : record.type) !== null && _d !== void 0 ? _d : "custom");
|
|
161
145
|
setSourceCode((_e = record === null || record === void 0 ? void 0 : record.sourceCode) !== null && _e !== void 0 ? _e : "");
|
|
162
146
|
setTags(nextTags);
|
|
163
|
-
|
|
164
|
-
baseline.current = JSON.stringify({ name: (_f = record === null || record === void 0 ? void 0 : record.name) !== null && _f !== void 0 ? _f : "", iconName: (_g = record === null || record === void 0 ? void 0 : record.iconName) !== null && _g !== void 0 ? _g : "", description: (_h = record === null || record === void 0 ? void 0 : record.description) !== null && _h !== void 0 ? _h : "", type: (_j = record === null || record === void 0 ? void 0 : record.type) !== null && _j !== void 0 ? _j : "custom", sourceCode: (_k = record === null || record === void 0 ? void 0 : record.sourceCode) !== null && _k !== void 0 ? _k : "", tags: nextTags, tagDraft: "" });
|
|
147
|
+
baseline.current = JSON.stringify({ name: (_f = record === null || record === void 0 ? void 0 : record.name) !== null && _f !== void 0 ? _f : "", iconName: (_g = record === null || record === void 0 ? void 0 : record.iconName) !== null && _g !== void 0 ? _g : "", description: (_h = record === null || record === void 0 ? void 0 : record.description) !== null && _h !== void 0 ? _h : "", type: (_j = record === null || record === void 0 ? void 0 : record.type) !== null && _j !== void 0 ? _j : "custom", sourceCode: (_k = record === null || record === void 0 ? void 0 : record.sourceCode) !== null && _k !== void 0 ? _k : "", tags: nextTags });
|
|
165
148
|
}, [record]);
|
|
166
149
|
var isReadOnly = (record === null || record === void 0 ? void 0 : record.type) === "solidx";
|
|
167
150
|
var isDirty = Boolean(record === null || record === void 0 ? void 0 : record.id) && currentForm() !== baseline.current;
|
|
168
151
|
var requestRefresh = function () { return isDirty ? setConfirmRefresh(true) : void refetch(); };
|
|
169
|
-
var addTag = function () {
|
|
170
|
-
var next = tagDraft.trim();
|
|
171
|
-
if (!next)
|
|
172
|
-
return;
|
|
173
|
-
if (!tags.some(function (tag) { return tag.toLowerCase() === next.toLowerCase(); }))
|
|
174
|
-
setTags(function (current) { return __spreadArray(__spreadArray([], current, true), [next], false); });
|
|
175
|
-
setTagDraft("");
|
|
176
|
-
setFieldErrors(function (current) { return (__assign(__assign({}, current), { tags: "" })); });
|
|
177
|
-
};
|
|
178
152
|
var save = function (nextStatus) { return __awaiter(_this, void 0, void 0, function () {
|
|
179
|
-
var nextErrors, payload, _a, _b, result, createdId, error_1, errorDetail, serverFieldErrors, _i, _c, field, label;
|
|
153
|
+
var nextErrors, payload, _a, _b, result, result, createdId, error_1, errorDetail, serverFieldErrors, _i, _c, field, label;
|
|
180
154
|
var _d;
|
|
181
|
-
var _e, _f, _g;
|
|
182
|
-
return __generator(this, function (
|
|
183
|
-
switch (
|
|
155
|
+
var _e, _f, _g, _h;
|
|
156
|
+
return __generator(this, function (_j) {
|
|
157
|
+
switch (_j.label) {
|
|
184
158
|
case 0:
|
|
159
|
+
if (creatingTag)
|
|
160
|
+
return [2 /*return*/];
|
|
185
161
|
nextErrors = {};
|
|
186
162
|
if (!name.trim())
|
|
187
163
|
nextErrors.name = "Name is required.";
|
|
188
164
|
if (!description.trim())
|
|
189
165
|
nextErrors.description = "Description is required.";
|
|
190
|
-
if (tags.length === 0)
|
|
191
|
-
nextErrors.tags = "At least one tag is required.";
|
|
192
166
|
if (!type.trim())
|
|
193
167
|
nextErrors.type = "Tool type is required.";
|
|
194
168
|
if (!sourceCode.trim())
|
|
@@ -199,47 +173,45 @@ export function AgentToolRegistryEditorPage() {
|
|
|
199
173
|
dispatch(showToast({ severity: "error", summary: "Missing information", detail: Object.values(nextErrors).join(" ") }));
|
|
200
174
|
return [2 /*return*/];
|
|
201
175
|
}
|
|
202
|
-
_a = [{ name: name.trim(), iconName: iconName || null, description: description.trim(), type: type, sourceCode: sourceCode,
|
|
203
|
-
if (!
|
|
176
|
+
_a = [__assign({ name: name.trim(), iconName: iconName || null, description: description.trim(), type: type, sourceCode: sourceCode }, agentHubTagsPayload(tags))];
|
|
177
|
+
if (!["custom", "thirdparty"].includes(type)) return [3 /*break*/, 2];
|
|
204
178
|
_d = {};
|
|
205
179
|
return [4 /*yield*/, sha256Hex(sourceCode)];
|
|
206
180
|
case 1:
|
|
207
|
-
_b = (_d.checksum =
|
|
181
|
+
_b = (_d.checksum = _j.sent(), _d);
|
|
208
182
|
return [3 /*break*/, 3];
|
|
209
183
|
case 2:
|
|
210
184
|
_b = {};
|
|
211
|
-
|
|
185
|
+
_j.label = 3;
|
|
212
186
|
case 3:
|
|
213
|
-
payload = __assign.apply(void 0, [__assign.apply(void 0,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
status: nextStatus !== null && nextStatus !== void 0 ? nextStatus : ((record === null || record === void 0 ? void 0 : record.status) === "load_failed" ? "active" : (_e = record === null || record === void 0 ? void 0 : record.status) !== null && _e !== void 0 ? _e : "active") }]), ((nextStatus === "active" || (!nextStatus && (record === null || record === void 0 ? void 0 : record.status) === "load_failed")) ? { lastLoadError: null } : {})]);
|
|
217
|
-
_h.label = 4;
|
|
187
|
+
payload = __assign.apply(void 0, [__assign.apply(void 0, _a.concat([(_b)])), { status: nextStatus !== null && nextStatus !== void 0 ? nextStatus : (record && (sourceCode !== record.sourceCode || name.trim() !== record.name || type !== record.type)
|
|
188
|
+
? "inactive" : (_e = record === null || record === void 0 ? void 0 : record.status) !== null && _e !== void 0 ? _e : "inactive") }]);
|
|
189
|
+
_j.label = 4;
|
|
218
190
|
case 4:
|
|
219
|
-
|
|
191
|
+
_j.trys.push([4, 9, , 10]);
|
|
220
192
|
if (!(record === null || record === void 0 ? void 0 : record.id)) return [3 /*break*/, 6];
|
|
221
193
|
return [4 /*yield*/, updateTool({ id: record.id, data: payload }).unwrap()];
|
|
222
194
|
case 5:
|
|
223
|
-
|
|
195
|
+
result = _j.sent();
|
|
224
196
|
dispatch(showToast({ severity: "success", summary: nextStatus ? "Tool status updated" : "Saved", detail: nextStatus ? "Tool moved to ".concat(nextStatus, ". Restart linked agent processes to apply the change.") : "Tool updated successfully." }));
|
|
225
197
|
setAuditRefreshVersion(function (version) { return version + 1; });
|
|
226
198
|
refetch();
|
|
227
|
-
return [
|
|
199
|
+
return [2 /*return*/, ((_f = extractEntityRecord(result)) !== null && _f !== void 0 ? _f : __assign(__assign({}, record), payload))];
|
|
228
200
|
case 6: return [4 /*yield*/, createTool(payload).unwrap()];
|
|
229
201
|
case 7:
|
|
230
|
-
result =
|
|
231
|
-
createdId = (
|
|
202
|
+
result = _j.sent();
|
|
203
|
+
createdId = (_h = (_g = result === null || result === void 0 ? void 0 : result.data) === null || _g === void 0 ? void 0 : _g.id) !== null && _h !== void 0 ? _h : result === null || result === void 0 ? void 0 : result.id;
|
|
232
204
|
dispatch(showToast({ severity: "success", summary: "Created", detail: "Tool created successfully." }));
|
|
233
205
|
if (createdId)
|
|
234
206
|
navigate("/admin/core/solid-core/agent-tool-registry/editor/".concat(createdId), { replace: true });
|
|
235
|
-
|
|
207
|
+
_j.label = 8;
|
|
236
208
|
case 8: return [3 /*break*/, 10];
|
|
237
209
|
case 9:
|
|
238
|
-
error_1 =
|
|
210
|
+
error_1 = _j.sent();
|
|
239
211
|
errorDetail = getSaveErrorMessage(error_1);
|
|
240
212
|
serverFieldErrors = {};
|
|
241
213
|
if (/required|not be empty|cannot be empty|should not be empty/i.test(errorDetail)) {
|
|
242
|
-
for (_i = 0, _c = ["name", "description", "
|
|
214
|
+
for (_i = 0, _c = ["name", "description", "type", "sourceCode"]; _i < _c.length; _i++) {
|
|
243
215
|
field = _c[_i];
|
|
244
216
|
if (!new RegExp("\\b".concat(field, "\\b"), "i").test(errorDetail))
|
|
245
217
|
continue;
|
|
@@ -257,6 +229,49 @@ export function AgentToolRegistryEditorPage() {
|
|
|
257
229
|
}
|
|
258
230
|
});
|
|
259
231
|
}); };
|
|
232
|
+
var beginActivation = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
233
|
+
var saved, _a, checksum, _b;
|
|
234
|
+
var _c, _d;
|
|
235
|
+
return __generator(this, function (_e) {
|
|
236
|
+
switch (_e.label) {
|
|
237
|
+
case 0:
|
|
238
|
+
if (isReadOnly)
|
|
239
|
+
return [2 /*return*/];
|
|
240
|
+
if (!record || activationOpen || isSaving || preparingActivation.current)
|
|
241
|
+
return [2 /*return*/];
|
|
242
|
+
preparingActivation.current = true;
|
|
243
|
+
_e.label = 1;
|
|
244
|
+
case 1:
|
|
245
|
+
_e.trys.push([1, 6, 7, 8]);
|
|
246
|
+
if (!(isDirty || record.status === "load_failed")) return [3 /*break*/, 3];
|
|
247
|
+
return [4 /*yield*/, save("inactive")];
|
|
248
|
+
case 2:
|
|
249
|
+
_a = _e.sent();
|
|
250
|
+
return [3 /*break*/, 4];
|
|
251
|
+
case 3:
|
|
252
|
+
_a = record;
|
|
253
|
+
_e.label = 4;
|
|
254
|
+
case 4:
|
|
255
|
+
saved = _a;
|
|
256
|
+
if (!(saved === null || saved === void 0 ? void 0 : saved.id))
|
|
257
|
+
return [2 /*return*/];
|
|
258
|
+
return [4 /*yield*/, sha256Hex((_c = saved.sourceCode) !== null && _c !== void 0 ? _c : sourceCode)];
|
|
259
|
+
case 5:
|
|
260
|
+
checksum = _e.sent();
|
|
261
|
+
setActivationTool({ id: saved.id, checksum: checksum, name: (_d = saved.name) !== null && _d !== void 0 ? _d : name });
|
|
262
|
+
setActivationOpen(true);
|
|
263
|
+
return [3 /*break*/, 8];
|
|
264
|
+
case 6:
|
|
265
|
+
_b = _e.sent();
|
|
266
|
+
dispatch(showToast({ severity: "error", summary: "Activation failed", detail: "Could not prepare the saved tool source for checks." }));
|
|
267
|
+
return [3 /*break*/, 8];
|
|
268
|
+
case 7:
|
|
269
|
+
preparingActivation.current = false;
|
|
270
|
+
return [7 /*endfinally*/];
|
|
271
|
+
case 8: return [2 /*return*/];
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}); };
|
|
260
275
|
var agents = React.useMemo(function () {
|
|
261
276
|
var relatedTools = record === null || record === void 0 ? void 0 : record.agentTools;
|
|
262
277
|
var links = Array.isArray(relatedTools) ? relatedTools : relatedTools ? [relatedTools] : [];
|
|
@@ -273,23 +288,31 @@ export function AgentToolRegistryEditorPage() {
|
|
|
273
288
|
}, [record === null || record === void 0 ? void 0 : record.agentTools]);
|
|
274
289
|
var sessionAgents = React.useMemo(function () { return agents.filter(function (agent) { return agent.id !== undefined && agent.id !== null; }); }, [agents]);
|
|
275
290
|
var tabs = [
|
|
276
|
-
{ value: "general", label: "General Info", content: _jsxs("fieldset", { className: "agent-tool-editor__general", disabled: isReadOnly, children: [isReadOnly && _jsx("p", { className: "agent-tool-editor__readonly-note", children: "SolidX tools are seeded by the AgentHub runtime and cannot be edited." }), (record === null || record === void 0 ? void 0 : record.status) && _jsxs("section", { className: "agent-tool-editor__runtime-status".concat(record.status === "load_failed" ? " agent-tool-editor__runtime-status--failed" : ""), role: record.status === "load_failed" ? "alert" : "status", children: [_jsxs("div", { className: "agent-tool-editor__runtime-heading", children: [_jsx("strong", { children: "Runtime status" }), _jsx("span", { children: record.status.replace(/[_-]+/g, " ") })] }), record.status === "load_failed" ? _jsxs(_Fragment, { children: [_jsx("p", { children: "The AgentHub runtime could not load this tool. After correcting its source or checksum, restart linked agent processes so the runtime retries loading it." }), record.lastLoadError && _jsx("pre", { children: record.lastLoadError })] }) : _jsx("p", { children: record.lastLoadError || "No tool load error has been reported." })] }), _jsxs("div", { className: "agent-tool-editor__fields", children: [_jsxs("label", { className: "agent-tool-editor__field", children: [_jsxs("span", { children: ["Name ", _jsx("b", { children: "*" })] }), _jsx(SolidInput, { value: name, "aria-invalid": Boolean(fieldErrors.name), "aria-describedby": fieldErrors.name ? "agent-tool-name-error" : undefined, className: fieldErrors.name ? "agent-tool-editor__input--invalid" : undefined, onChange: function (e) { setName(e.target.value); setFieldErrors(function (current) { return (__assign(__assign({}, current), { name: "" })); }); } }), fieldErrors.name && _jsx("small", { id: "agent-tool-name-error", className: "agent-tool-editor__field-error", children: fieldErrors.name })] }), _jsxs("div", { className: "agent-tool-editor__field", children: [_jsx("span", { children: "Icon" }), _jsx(SolidIconPicker, { value: iconName, onChange: setIconName })] }), _jsxs("label", { className: "agent-tool-editor__field", children: [_jsxs("span", { children: ["Description ", _jsx("b", { children: "*" })] }), _jsx(SolidInput, { value: description, "aria-invalid": Boolean(fieldErrors.description), "aria-describedby": fieldErrors.description ? "agent-tool-description-error" : undefined, className: fieldErrors.description ? "agent-tool-editor__input--invalid" : undefined, onChange: function (e) { setDescription(e.target.value); setFieldErrors(function (current) { return (__assign(__assign({}, current), { description: "" })); }); } }), fieldErrors.description && _jsx("small", { id: "agent-tool-description-error", className: "agent-tool-editor__field-error", children: fieldErrors.description })] })] }), _jsxs("label", { className: "agent-tool-editor__field", children: [_jsxs("span", { children: ["Tool type ", _jsx("b", { children: "*" })] }), _jsxs("select", { value: type, "aria-invalid": Boolean(fieldErrors.type), "aria-describedby": fieldErrors.type ? "agent-tool-type-error" : undefined, className: fieldErrors.type ? "agent-tool-editor__input--invalid" : undefined, onChange: function (e) { setType(e.target.value); setFieldErrors(function (current) { return (__assign(__assign({}, current), { type: "" })); }); }, 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-tool-type-error", className: "agent-tool-editor__field-error", children: fieldErrors.type })] }), _jsxs("div", { className: "agent-tool-
|
|
277
|
-
setFieldErrors(function (errors) { return (__assign(__assign({}, errors), { tags: "" })); }); return next; }); }, children: _jsx(X, { size: 13 }) })] }, "".concat(tag, "-").concat(index)); }), _jsx("input", { value: tagDraft, "aria-label": "Add a tag", placeholder: "Type a tag and press Enter", onChange: function (e) { return setTagDraft(e.target.value); }, onKeyDown: function (e) { if (e.key === "Enter") {
|
|
278
|
-
e.preventDefault();
|
|
279
|
-
addTag();
|
|
280
|
-
} } }), _jsxs(SolidButton, { type: "button", variant: "secondary", size: "small", onClick: addTag, children: [_jsx(Plus, { size: 14 }), " Add"] })] }), fieldErrors.tags && _jsx("small", { className: "agent-tool-editor__field-error", children: fieldErrors.tags }), _jsx("small", { children: "Tags are saved as a JSON array." })] }), (record === null || record === void 0 ? void 0 : record.id) && _jsxs("section", { className: "agent-tool-editor__workflow", "aria-labelledby": "agent-tool-lifecycle-title", children: [_jsx("div", { className: "agent-tool-editor__workflow-head", children: _jsxs("div", { children: [_jsx("h2", { id: "agent-tool-lifecycle-title", children: "Tool lifecycle" }), _jsx("p", { children: "Activate or deactivate this tool for linked agents. Load failures are reported by AgentHub." })] }) }), _jsx("div", { className: "agent-tool-editor__workflow-stages", "aria-label": "Current tool stage: ".concat(((_a = record.status) !== null && _a !== void 0 ? _a : "active").replace(/[_-]+/g, " ")), children: [["active", "Active", "Enabled for loading into linked agents."], ["inactive", "Inactive", "Not loaded for linked agents."], ["load_failed", "Load failed", "AgentHub could not load this tool."]].map(function (_a, index) {
|
|
291
|
+
{ value: "general", label: "General Info", content: _jsxs("fieldset", { className: "agent-tool-editor__general", disabled: isReadOnly, children: [isReadOnly && _jsx("p", { className: "agent-tool-editor__readonly-note", children: "SolidX tools are seeded by the AgentHub runtime and cannot be edited." }), (record === null || record === void 0 ? void 0 : record.status) && _jsxs("section", { className: "agent-tool-editor__runtime-status".concat(record.status === "load_failed" ? " agent-tool-editor__runtime-status--failed" : ""), role: record.status === "load_failed" ? "alert" : "status", children: [_jsxs("div", { className: "agent-tool-editor__runtime-heading", children: [_jsx("strong", { children: "Runtime status" }), _jsx("span", { children: record.status.replace(/[_-]+/g, " ") })] }), record.status === "load_failed" ? _jsxs(_Fragment, { children: [_jsx("p", { children: "The AgentHub runtime could not load this tool. After correcting its source or checksum, restart linked agent processes so the runtime retries loading it." }), record.lastLoadError && _jsx("pre", { children: record.lastLoadError })] }) : _jsx("p", { children: record.lastLoadError || "No tool load error has been reported." })] }), _jsxs("div", { className: "agent-tool-editor__fields", children: [_jsxs("label", { className: "agent-tool-editor__field", children: [_jsxs("span", { children: ["Name ", _jsx("b", { children: "*" })] }), _jsx(SolidInput, { value: name, "aria-invalid": Boolean(fieldErrors.name), "aria-describedby": fieldErrors.name ? "agent-tool-name-error" : undefined, className: fieldErrors.name ? "agent-tool-editor__input--invalid" : undefined, onChange: function (e) { setName(e.target.value); setFieldErrors(function (current) { return (__assign(__assign({}, current), { name: "" })); }); } }), fieldErrors.name && _jsx("small", { id: "agent-tool-name-error", className: "agent-tool-editor__field-error", children: fieldErrors.name })] }), _jsxs("div", { className: "agent-tool-editor__field", children: [_jsx("span", { children: "Icon" }), _jsx(SolidIconPicker, { value: iconName, onChange: setIconName })] }), _jsxs("label", { className: "agent-tool-editor__field", children: [_jsxs("span", { children: ["Description ", _jsx("b", { children: "*" })] }), _jsx(SolidInput, { value: description, "aria-invalid": Boolean(fieldErrors.description), "aria-describedby": fieldErrors.description ? "agent-tool-description-error" : undefined, className: fieldErrors.description ? "agent-tool-editor__input--invalid" : undefined, onChange: function (e) { setDescription(e.target.value); setFieldErrors(function (current) { return (__assign(__assign({}, current), { description: "" })); }); } }), fieldErrors.description && _jsx("small", { id: "agent-tool-description-error", className: "agent-tool-editor__field-error", children: fieldErrors.description })] })] }), !(record === null || record === void 0 ? void 0 : record.id) && _jsxs("label", { className: "agent-tool-editor__field", children: [_jsx("span", { children: "Tool status" }), _jsx("select", { value: "inactive", disabled: true, "aria-label": "Tool status", children: _jsx("option", { value: "inactive", children: "Inactive" }) }), _jsx("small", { children: "New tools start inactive. Run configuration and initialization checks to activate." })] }), _jsxs("label", { className: "agent-tool-editor__field", children: [_jsxs("span", { children: ["Tool type ", _jsx("b", { children: "*" })] }), _jsxs("select", { value: type, "aria-invalid": Boolean(fieldErrors.type), "aria-describedby": fieldErrors.type ? "agent-tool-type-error" : undefined, className: fieldErrors.type ? "agent-tool-editor__input--invalid" : undefined, onChange: function (e) { setType(e.target.value); setFieldErrors(function (current) { return (__assign(__assign({}, current), { type: "" })); }); }, 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-tool-type-error", className: "agent-tool-editor__field-error", children: fieldErrors.type })] }), _jsx(AgentHubTagsField, { value: tags, onChange: setTags, disabled: isReadOnly || isCreating || isSaving, onBusyChange: setCreatingTag }), (record === null || record === void 0 ? void 0 : record.id) && _jsxs("section", { className: "agent-tool-editor__workflow", "aria-labelledby": "agent-tool-lifecycle-title", children: [_jsx("div", { className: "agent-tool-editor__workflow-head", children: _jsxs("div", { children: [_jsx("h2", { id: "agent-tool-lifecycle-title", children: "Tool lifecycle" }), _jsx("p", { children: "Configuration and initialization must pass before this tool can be activated." })] }) }), _jsx("div", { className: "agent-tool-editor__workflow-stages", "aria-label": "Current tool stage: ".concat(((_a = record.status) !== null && _a !== void 0 ? _a : "inactive").replace(/[_-]+/g, " ")), children: [["active", "Active", "Enabled for loading into linked agents."], ["inactive", "Inactive", "Not loaded for linked agents."], ["load_failed", "Load failed", "AgentHub could not load this tool."]].map(function (_a, index) {
|
|
281
292
|
var _b;
|
|
282
293
|
var value = _a[0], label = _a[1], description = _a[2];
|
|
283
|
-
var currentStatus = (_b = record.status) !== null && _b !== void 0 ? _b : "
|
|
294
|
+
var currentStatus = (_b = record.status) !== null && _b !== void 0 ? _b : "inactive";
|
|
284
295
|
var isCurrent = currentStatus === value;
|
|
285
296
|
var canRetry = value === "load_failed" && isCurrent;
|
|
286
|
-
var disabled = isCreating || isSaving || (!canRetry && (value === "load_failed" || isCurrent));
|
|
287
|
-
return _jsxs(React.Fragment, { children: [index > 0 && _jsx("div", { className: "agent-tool-editor__workflow-connector", "aria-hidden": "true" }), _jsxs("button", { type: "button", className: "agent-tool-editor__workflow-stage agent-tool-editor__workflow-stage--".concat(value).concat(isCurrent ? " is-current" : ""), "aria-current": isCurrent ? "step" : undefined, "aria-pressed": isCurrent, disabled: disabled, onClick: function () { return
|
|
288
|
-
}) }), record.status === "load_failed" && _jsx("small", { className: "agent-tool-editor__workflow-hint", children: "Fix the source or checksum
|
|
297
|
+
var disabled = isReadOnly || activationOpen || isCreating || isSaving || (!canRetry && (value === "load_failed" || isCurrent));
|
|
298
|
+
return _jsxs(React.Fragment, { children: [index > 0 && _jsx("div", { className: "agent-tool-editor__workflow-connector", "aria-hidden": "true" }), _jsxs("button", { type: "button", className: "agent-tool-editor__workflow-stage agent-tool-editor__workflow-stage--".concat(value).concat(isCurrent ? " is-current" : ""), "aria-current": isCurrent ? "step" : undefined, "aria-pressed": isCurrent, disabled: disabled, onClick: function () { return value === "inactive" ? void save("inactive") : void beginActivation(); }, children: [_jsx("span", { className: "agent-tool-editor__workflow-mark", children: index + 1 }), _jsxs("span", { className: "agent-tool-editor__workflow-copy", children: [_jsx("strong", { children: label }), _jsx("small", { children: description }), _jsx("small", { className: "agent-tool-editor__workflow-cta", children: canRetry ? "Run checks and retry activation" : isCurrent ? "Current stage" : value === "load_failed" ? "Set automatically by AgentHub" : value === "active" ? "Run checks to activate" : "Click to deactivate" })] }), isCurrent && _jsx("span", { className: "agent-tool-editor__workflow-current", children: "Current" })] })] }, value);
|
|
299
|
+
}) }), record.status === "load_failed" && _jsx("small", { className: "agent-tool-editor__workflow-hint", children: "Fix the source or checksum, then run configuration and initialization checks before retrying activation." }), _jsx("small", { className: "agent-tool-editor__workflow-hint", children: "Activation checks use the saved tool configuration. Restart linked agent processes to apply status changes." })] })] }) },
|
|
289
300
|
{ value: "tool", label: "Tool", content: _jsx("div", { className: "agent-tool-editor__tool", children: _jsxs("section", { className: "agent-tool-editor__panel", children: [_jsxs("header", { children: [_jsxs("h2", { children: ["Tool source code ", _jsx("b", { children: "*" })] }), _jsx("p", { children: "Write the tool's Python code here." })] }), _jsx(SolidCodeEditor, { value: sourceCode, onChange: function (value) { setSourceCode(value !== null && value !== void 0 ? value : ""); setFieldErrors(function (current) { return (__assign(__assign({}, current), { sourceCode: "" })); }); }, language: "python", readOnly: isReadOnly, fontSize: 11, height: "max(32rem, calc(100dvh - 18rem))", className: "agent-tool-editor__code".concat(fieldErrors.sourceCode ? " agent-tool-editor__code--invalid" : "") }), fieldErrors.sourceCode && _jsx("small", { className: "agent-tool-editor__field-error agent-tool-editor__code-error", children: fieldErrors.sourceCode })] }) }) },
|
|
290
301
|
{ value: "agents", label: "Agents", content: _jsxs("section", { className: "agent-tool-editor__agents", children: [_jsxs("div", { children: [_jsx("h2", { children: "Associated agents" }), _jsx("p", { children: "Agents linked to this tool. Associations are read-only here." })] }), isLoading ? _jsx("p", { children: "Loading associated agents\u2026" }) : agents.length ? _jsx("div", { className: "agent-tool-editor__agent-grid", children: agents.map(function (agent, index) { var _a, _b; return _jsx("div", { className: "agent-tool-editor__agent-card", children: _jsx(SharedAgentRegistryCard, { rowData: agent }) }, String((_b = (_a = agent.id) !== null && _a !== void 0 ? _a : agent.name) !== null && _b !== void 0 ? _b : index)); }) }) : _jsx("div", { className: "agent-tool-editor__empty", children: "No agents are currently associated with this tool." })] }) },
|
|
291
302
|
{ value: "sessions", label: "Sessions", content: _jsx(AgentToolSessionsPanel, { agents: sessionAgents }) },
|
|
292
303
|
];
|
|
293
|
-
return _jsxs("main", { className: "agent-tool-editor", children: [_jsxs("header", { className: "agent-tool-editor__header", children: [_jsx("div", { children: _jsxs("div", { className: "agent-tool-editor__heading-with-refresh", children: [_jsx("h1", { children: record ? "Edit Tool" : "Create Tool" }), (record === null || record === void 0 ? void 0 : record.id) && _jsx("button", { type: "button", className: "agent-tool-editor__refresh".concat(isFetching ? " is-loading" : ""), "aria-label": "Refresh tool", title: "Refresh tool", disabled: isFetching || isSaving, onClick: requestRefresh, children: _jsx(RefreshCw, { size: 14 }) })] }) }), _jsxs("div", { className: "agent-tool-editor__actions", children: [_jsx(SolidButton, { variant: "secondary", leftIcon: _jsx(ArrowLeft, { size: 16 }), onClick: function () { return navigate(-1); }, children: "Back" }), !isReadOnly && _jsx(SolidButton, { loading: isCreating || isSaving, onClick: function () { return void save(); }, children: "Save Tool" })] })] }), _jsx(SolidDialog, { open: confirmRefresh, onOpenChange: setConfirmRefresh, header: "Discard unsaved changes?", style: { width: "min(28rem, 94vw)" }, footer: _jsxs(_Fragment, { children: [_jsx(SolidButton, { type: "button", variant: "secondary", onClick: function () { return setConfirmRefresh(false); }, children: "Cancel" }), _jsx(SolidButton, { type: "button", disabled: isFetching, onClick: function () { setConfirmRefresh(false); void refetch(); }, children: "Refresh and discard" })] }), children: _jsx(SolidDialogBody, { children: _jsx("p", { children: "You have unsaved changes. Refreshing will discard them and load the latest tool content." }) }) }),
|
|
304
|
+
return _jsxs("main", { className: "agent-tool-editor", children: [_jsxs("header", { className: "agent-tool-editor__header", children: [_jsx("div", { children: _jsxs("div", { className: "agent-tool-editor__heading-with-refresh", children: [_jsx("h1", { children: record ? "Edit Tool" : "Create Tool" }), (record === null || record === void 0 ? void 0 : record.id) && _jsx("button", { type: "button", className: "agent-tool-editor__refresh".concat(isFetching ? " is-loading" : ""), "aria-label": "Refresh tool", title: "Refresh tool", disabled: isFetching || isSaving, onClick: requestRefresh, children: _jsx(RefreshCw, { size: 14 }) })] }) }), _jsxs("div", { className: "agent-tool-editor__actions", children: [_jsx(SolidButton, { variant: "secondary", leftIcon: _jsx(ArrowLeft, { size: 16 }), onClick: function () { return navigate(-1); }, children: "Back" }), !isReadOnly && _jsx(SolidButton, { disabled: activationOpen || creatingTag, loading: isCreating || isSaving, onClick: function () { return void save(); }, children: "Save Tool" })] })] }), _jsx(SolidDialog, { open: confirmRefresh, onOpenChange: setConfirmRefresh, header: "Discard unsaved changes?", style: { width: "min(28rem, 94vw)" }, footer: _jsxs(_Fragment, { children: [_jsx(SolidButton, { type: "button", variant: "secondary", onClick: function () { return setConfirmRefresh(false); }, children: "Cancel" }), _jsx(SolidButton, { type: "button", disabled: isFetching, onClick: function () { setConfirmRefresh(false); void refetch(); }, children: "Refresh and discard" })] }), children: _jsx(SolidDialogBody, { children: _jsx("p", { children: "You have unsaved changes. Refreshing will discard them and load the latest tool content." }) }) }), activationOpen && activationTool && _jsx(AgentToolActivationDialog, { open: activationOpen, onOpenChange: setActivationOpen, toolId: activationTool.id, checksum: activationTool.checksum, toolName: activationTool.name, onActivated: function () { return __awaiter(_this, void 0, void 0, function () {
|
|
305
|
+
return __generator(this, function (_a) {
|
|
306
|
+
switch (_a.label) {
|
|
307
|
+
case 0: return [4 /*yield*/, solidPatch("/agent-tool-registry/".concat(activationTool.id), { status: "active", checksum: activationTool.checksum })];
|
|
308
|
+
case 1:
|
|
309
|
+
_a.sent();
|
|
310
|
+
setAuditRefreshVersion(function (version) { return version + 1; });
|
|
311
|
+
void refetch();
|
|
312
|
+
dispatch(showToast({ severity: "success", summary: "Tool activated", detail: "Configuration and initialization checks passed." }));
|
|
313
|
+
return [2 /*return*/];
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}); } }), isLoading ? _jsx("div", { className: "agent-tool-editor__loading", children: "Loading tool\u2026" }) : (record === null || record === void 0 ? void 0 : record.id) ? (_jsx(AgentRegistryAuditPanel, { modelSingularName: "agentToolRegistry", recordId: record.id, refreshVersion: auditRefreshVersion, modelUserKey: record.name, children: _jsx(SolidTabGroup, { tabs: tabs, value: activeTab, onValueChange: setActiveTab, className: "agent-tool-editor__tabs", listClassName: "agent-tool-editor__tab-list", panelClassName: "agent-tool-editor__tab-panel" }) })) : _jsx(SolidTabGroup, { tabs: tabs, value: activeTab, onValueChange: setActiveTab, className: "agent-tool-editor__tabs", listClassName: "agent-tool-editor__tab-list", panelClassName: "agent-tool-editor__tab-panel" })] });
|
|
294
317
|
}
|
|
295
318
|
//# sourceMappingURL=AgentToolRegistryEditorPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentToolRegistryEditorPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { ArrowLeft, Plus, RefreshCw, X } 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 { AgentToolSessionsPanel } from \"../../../../components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel\";\nimport { AgentRegistryCardWidget } from \"../../../../components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget\";\nimport { SolidButton, SolidCodeEditor, SolidDialog, SolidDialogBody, SolidIconPicker, SolidInput, SolidTabGroup } from \"../../../../components/shad-cn-ui\";\nimport \"./AgentToolRegistryEditorPage.css\";\n\nconst SharedAgentRegistryCard = AgentRegistryCardWidget as React.ComponentType<{ rowData: Record<string, any> }>;\n\ntype Agent = { id?: number | string; name?: string; title?: string; [key: string]: any };\ntype AgentToolLink = { agentRegistry?: Agent | number | string | null };\ntype ToolRecord = {\n id: number;\n name?: string;\n iconName?: string | null;\n description?: string;\n tags?: unknown;\n type?: string;\n status?: string | null;\n lastLoadError?: string | null;\n sourceCode?: string;\n agentTools?: AgentToolLink[] | AgentToolLink | 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 parseTags(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String).map((tag) => tag.trim()).filter(Boolean);\n if (typeof value !== \"string\" || !value.trim()) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.map(String).map((tag) => tag.trim()).filter(Boolean) : [];\n } catch {\n return value === \"{}\" ? [] : value.split(\",\").map((tag) => tag.trim()).filter(Boolean);\n }\n}\n\nasync function sha256Hex(value: string): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(value));\n return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\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 tool.\";\n const apiError = error as Record<string, any>;\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 tool.\";\n}\n\nexport function AgentToolRegistryEditorPage() {\n const { id = \"\" } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const entityApi = React.useMemo(() => createSolidEntityApi(\"agentToolRegistry\"), []);\n const { useCreateSolidEntityMutation, useGetSolidEntityByIdQuery, useUpdateSolidEntityMutation } = entityApi;\n const { data: response, isLoading, isFetching, refetch } = useGetSolidEntityByIdQuery(\n { id, qs: \"populate[0]=agentTools&populate[1]=agentTools.agentRegistry\" },\n { skip: !id || id === \"new\" },\n );\n const [createTool, { isLoading: isCreating }] = useCreateSolidEntityMutation();\n const [updateTool, { isLoading: isSaving }] = useUpdateSolidEntityMutation();\n const record = extractEntityRecord(response) as ToolRecord | undefined;\n const [activeTab, setActiveTab] = React.useState(\"general\");\n const [name, setName] = React.useState(\"\");\n const [iconName, setIconName] = React.useState(\"\");\n const [description, setDescription] = React.useState(\"\");\n const [type, setType] = React.useState(\"custom\");\n const [sourceCode, setSourceCode] = React.useState(\"\");\n const [tags, setTags] = React.useState<string[]>([]);\n const [tagDraft, setTagDraft] = React.useState(\"\");\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\n const currentForm = () => JSON.stringify({ name, iconName, description, type, sourceCode, tags, tagDraft });\n\n React.useEffect(() => {\n const nextTags = parseTags(record?.tags);\n setName(record?.name ?? \"\");\n setIconName(record?.iconName ?? \"\");\n setDescription(record?.description ?? \"\");\n setType(record?.type ?? \"custom\");\n setSourceCode(record?.sourceCode ?? \"\");\n setTags(nextTags);\n setTagDraft(\"\");\n baseline.current = JSON.stringify({ name: record?.name ?? \"\", iconName: record?.iconName ?? \"\", description: record?.description ?? \"\", type: record?.type ?? \"custom\", sourceCode: record?.sourceCode ?? \"\", tags: nextTags, tagDraft: \"\" });\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 addTag = () => {\n const next = tagDraft.trim();\n if (!next) return;\n if (!tags.some((tag) => tag.toLowerCase() === next.toLowerCase())) setTags((current) => [...current, next]);\n setTagDraft(\"\");\n setFieldErrors((current) => ({ ...current, tags: \"\" }));\n };\n\n const save = async (nextStatus?: \"active\" | \"inactive\") => {\n const nextErrors: Record<string, string> = {};\n if (!name.trim()) nextErrors.name = \"Name is required.\";\n if (!description.trim()) nextErrors.description = \"Description is required.\";\n if (tags.length === 0) nextErrors.tags = \"At least one tag is required.\";\n if (!type.trim()) nextErrors.type = \"Tool type is required.\";\n if (!sourceCode.trim()) nextErrors.sourceCode = \"Tool source code is required.\";\n\n setFieldErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n setActiveTab(nextErrors.sourceCode ? \"tool\" : \"general\");\n dispatch(showToast({ severity: \"error\", summary: \"Missing information\", detail: Object.values(nextErrors).join(\" \") }));\n return;\n }\n const payload = {\n name: name.trim(), iconName: iconName || null, description: description.trim(), type,\n sourceCode, tags: JSON.stringify(tags),\n ...(type === \"custom\" ? { checksum: await sha256Hex(sourceCode) } : {}),\n // Status is required by the agentToolRegistry metadata, including partial\n // updates. Preserve the current lifecycle state for ordinary saves.\n status: nextStatus ?? (record?.status === \"load_failed\" ? \"active\" : record?.status ?? \"active\"),\n ...((nextStatus === \"active\" || (!nextStatus && record?.status === \"load_failed\")) ? { lastLoadError: null } : {}),\n };\n try {\n if (record?.id) {\n await updateTool({ id: record.id, data: payload }).unwrap();\n dispatch(showToast({ severity: \"success\", summary: nextStatus ? \"Tool status updated\" : \"Saved\", detail: nextStatus ? `Tool moved to ${nextStatus}. Restart linked agent processes to apply the change.` : \"Tool updated successfully.\" }));\n setAuditRefreshVersion((version) => version + 1);\n refetch();\n } else {\n const result: any = await createTool(payload).unwrap();\n const createdId = result?.data?.id ?? result?.id;\n dispatch(showToast({ severity: \"success\", summary: \"Created\", detail: \"Tool created successfully.\" }));\n if (createdId) navigate(`/admin/core/solid-core/agent-tool-registry/editor/${createdId}`, { replace: true });\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\", \"description\", \"tags\", \"type\", \"sourceCode\"]) {\n if (!new RegExp(`\\\\b${field}\\\\b`, \"i\").test(errorDetail)) continue;\n const label = field === \"sourceCode\" ? \"Tool source code\" : 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.sourceCode ? \"tool\" : \"general\");\n }\n dispatch(showToast({ severity: \"error\", summary: \"Save failed\", detail: errorDetail }));\n }\n };\n\n const agents = React.useMemo(() => {\n const relatedTools = record?.agentTools;\n const links = Array.isArray(relatedTools) ? relatedTools : relatedTools ? [relatedTools] : [];\n const seen = new Set<string>();\n return links.map((link) => link.agentRegistry).filter((agent): agent is Agent => 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 }, [record?.agentTools]);\n const sessionAgents = React.useMemo(() => agents.filter((agent): agent is Agent & { id: number | string } => agent.id !== undefined && agent.id !== null), [agents]);\n const tabs = [\n { value: \"general\", label: \"General Info\", content: <fieldset className=\"agent-tool-editor__general\" disabled={isReadOnly}>\n {isReadOnly && <p className=\"agent-tool-editor__readonly-note\">SolidX tools are seeded by the AgentHub runtime and cannot be edited.</p>}\n {record?.status && <section className={`agent-tool-editor__runtime-status${record.status === \"load_failed\" ? \" agent-tool-editor__runtime-status--failed\" : \"\"}`} role={record.status === \"load_failed\" ? \"alert\" : \"status\"}>\n <div className=\"agent-tool-editor__runtime-heading\"><strong>Runtime status</strong><span>{record.status.replace(/[_-]+/g, \" \")}</span></div>\n {record.status === \"load_failed\" ? <>\n <p>The AgentHub runtime could not load this tool. After correcting its source or checksum, restart linked agent processes so the runtime retries loading it.</p>\n {record.lastLoadError && <pre>{record.lastLoadError}</pre>}\n </> : <p>{record.lastLoadError || \"No tool load error has been reported.\"}</p>}\n </section>}\n <div className=\"agent-tool-editor__fields\">\n <label className=\"agent-tool-editor__field\"><span>Name <b>*</b></span><SolidInput value={name} aria-invalid={Boolean(fieldErrors.name)} aria-describedby={fieldErrors.name ? \"agent-tool-name-error\" : undefined} className={fieldErrors.name ? \"agent-tool-editor__input--invalid\" : undefined} onChange={(e) => { setName(e.target.value); setFieldErrors((current) => ({ ...current, name: \"\" })); }} />{fieldErrors.name && <small id=\"agent-tool-name-error\" className=\"agent-tool-editor__field-error\">{fieldErrors.name}</small>}</label>\n <div className=\"agent-tool-editor__field\"><span>Icon</span><SolidIconPicker value={iconName} onChange={setIconName} /></div>\n <label className=\"agent-tool-editor__field\"><span>Description <b>*</b></span><SolidInput value={description} aria-invalid={Boolean(fieldErrors.description)} aria-describedby={fieldErrors.description ? \"agent-tool-description-error\" : undefined} className={fieldErrors.description ? \"agent-tool-editor__input--invalid\" : undefined} onChange={(e) => { setDescription(e.target.value); setFieldErrors((current) => ({ ...current, description: \"\" })); }} />{fieldErrors.description && <small id=\"agent-tool-description-error\" className=\"agent-tool-editor__field-error\">{fieldErrors.description}</small>}</label>\n </div>\n <label className=\"agent-tool-editor__field\"><span>Tool type <b>*</b></span><select value={type} aria-invalid={Boolean(fieldErrors.type)} aria-describedby={fieldErrors.type ? \"agent-tool-type-error\" : undefined} className={fieldErrors.type ? \"agent-tool-editor__input--invalid\" : undefined} onChange={(e) => { setType(e.target.value); setFieldErrors((current) => ({ ...current, type: \"\" })); }}>\n {isReadOnly && <option value=\"solidx\">SolidX</option>}<option value=\"thirdparty\">Third Party</option><option value=\"custom\">Custom</option>\n </select>{fieldErrors.type && <small id=\"agent-tool-type-error\" className=\"agent-tool-editor__field-error\">{fieldErrors.type}</small>}</label>\n <div className=\"agent-tool-editor__field\"><span>Tags <b>*</b></span><div className={`agent-tool-editor__tag-input${fieldErrors.tags ? \" agent-tool-editor__tag-input--invalid\" : \"\"}`}>\n {tags.map((tag, index) => <span className=\"agent-tool-editor__tag\" key={`${tag}-${index}`}>{tag}<button type=\"button\" aria-label={`Remove ${tag}`} onClick={() => setTags((current) => { const next = current.filter((_, i) => i !== index); if (next.length) setFieldErrors((errors) => ({ ...errors, tags: \"\" })); return next; })}><X size={13} /></button></span>)}\n <input value={tagDraft} aria-label=\"Add a tag\" placeholder=\"Type a tag and press Enter\" onChange={(e) => setTagDraft(e.target.value)} onKeyDown={(e) => { if (e.key === \"Enter\") { e.preventDefault(); addTag(); } }} />\n <SolidButton type=\"button\" variant=\"secondary\" size=\"small\" onClick={addTag}><Plus size={14} /> Add</SolidButton>\n </div>{fieldErrors.tags && <small className=\"agent-tool-editor__field-error\">{fieldErrors.tags}</small>}<small>Tags are saved as a JSON array.</small></div>\n {record?.id && <section className=\"agent-tool-editor__workflow\" aria-labelledby=\"agent-tool-lifecycle-title\">\n <div className=\"agent-tool-editor__workflow-head\"><div><h2 id=\"agent-tool-lifecycle-title\">Tool lifecycle</h2><p>Activate or deactivate this tool for linked agents. Load failures are reported by AgentHub.</p></div></div>\n <div className=\"agent-tool-editor__workflow-stages\" aria-label={`Current tool stage: ${(record.status ?? \"active\").replace(/[_-]+/g, \" \")}`}>\n {([ [\"active\", \"Active\", \"Enabled for loading into linked agents.\"], [\"inactive\", \"Inactive\", \"Not loaded for linked agents.\"], [\"load_failed\", \"Load failed\", \"AgentHub could not load this tool.\"] ] as const).map(([value, label, description], index) => {\n const currentStatus = record.status ?? \"active\";\n const isCurrent = currentStatus === value;\n const canRetry = value === \"load_failed\" && isCurrent;\n const disabled = isCreating || isSaving || (!canRetry && (value === \"load_failed\" || isCurrent));\n return <React.Fragment key={value}>\n {index > 0 && <div className=\"agent-tool-editor__workflow-connector\" aria-hidden=\"true\" />}\n <button type=\"button\" className={`agent-tool-editor__workflow-stage agent-tool-editor__workflow-stage--${value}${isCurrent ? \" is-current\" : \"\"}`}\n aria-current={isCurrent ? \"step\" : undefined} aria-pressed={isCurrent} disabled={disabled}\n onClick={() => void save(value === \"load_failed\" ? \"active\" : value)}>\n <span className=\"agent-tool-editor__workflow-mark\">{index + 1}</span>\n <span className=\"agent-tool-editor__workflow-copy\"><strong>{label}</strong><small>{description}</small><small className=\"agent-tool-editor__workflow-cta\">{canRetry ? \"Click to retry loading\" : isCurrent ? \"Current stage\" : value === \"load_failed\" ? \"Set automatically by AgentHub\" : \"Click to move to this stage\"}</small></span>\n {isCurrent && <span className=\"agent-tool-editor__workflow-current\">Current</span>}\n </button>\n </React.Fragment>;\n })}\n </div>\n {record.status === \"load_failed\" && <small className=\"agent-tool-editor__workflow-hint\">Fix the source or checksum first. Retrying saves the current tool configuration and clears the reported error; restart linked agent processes to load the updated tool.</small>}\n <small className=\"agent-tool-editor__workflow-hint\">Changing stage saves the current tool configuration. Restart linked agent processes to apply the change.</small>\n </section>}\n </fieldset> },\n { value: \"tool\", label: \"Tool\", content: <div className=\"agent-tool-editor__tool\">\n <section className=\"agent-tool-editor__panel\">\n <header><h2>Tool source code <b>*</b></h2><p>Write the tool's Python code here.</p></header>\n <SolidCodeEditor value={sourceCode} onChange={(value) => { setSourceCode(value ?? \"\"); setFieldErrors((current) => ({ ...current, sourceCode: \"\" })); }} language=\"python\" readOnly={isReadOnly} fontSize={11} height=\"max(32rem, calc(100dvh - 18rem))\" className={`agent-tool-editor__code${fieldErrors.sourceCode ? \" agent-tool-editor__code--invalid\" : \"\"}`} />\n {fieldErrors.sourceCode && <small className=\"agent-tool-editor__field-error agent-tool-editor__code-error\">{fieldErrors.sourceCode}</small>}\n </section>\n </div> },\n { value: \"agents\", label: \"Agents\", content: <section className=\"agent-tool-editor__agents\"><div><h2>Associated agents</h2><p>Agents linked to this tool. Associations are read-only here.</p></div>\n {isLoading ? <p>Loading associated agents…</p> : agents.length ? <div className=\"agent-tool-editor__agent-grid\">{agents.map((agent, index) => <div className=\"agent-tool-editor__agent-card\" key={String(agent.id ?? agent.name ?? index)}><SharedAgentRegistryCard rowData={agent} /></div>)}</div> : <div className=\"agent-tool-editor__empty\">No agents are currently associated with this tool.</div>}\n </section> },\n { value: \"sessions\", label: \"Sessions\", content: <AgentToolSessionsPanel agents={sessionAgents} /> },\n ];\n\n return <main className=\"agent-tool-editor\">\n <header className=\"agent-tool-editor__header\"><div><div className=\"agent-tool-editor__heading-with-refresh\"><h1>{record ? \"Edit Tool\" : \"Create Tool\"}</h1>{record?.id && <button type=\"button\" className={`agent-tool-editor__refresh${isFetching ? \" is-loading\" : \"\"}`} aria-label=\"Refresh tool\" title=\"Refresh tool\" disabled={isFetching || isSaving} onClick={requestRefresh}><RefreshCw size={14} /></button>}</div></div><div className=\"agent-tool-editor__actions\">\n <SolidButton variant=\"secondary\" leftIcon={<ArrowLeft size={16} />} onClick={() => navigate(-1)}>Back</SolidButton>\n {!isReadOnly && <SolidButton loading={isCreating || isSaving} onClick={() => void save()}>Save Tool</SolidButton>}\n </div></header>\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 tool content.</p></SolidDialogBody>\n </SolidDialog>\n {isLoading ? <div className=\"agent-tool-editor__loading\">Loading tool…</div> : record?.id ? (\n <AgentRegistryAuditPanel modelSingularName=\"agentToolRegistry\" recordId={record.id} refreshVersion={auditRefreshVersion} modelUserKey={record.name}>\n <SolidTabGroup tabs={tabs} value={activeTab} onValueChange={setActiveTab} className=\"agent-tool-editor__tabs\" listClassName=\"agent-tool-editor__tab-list\" panelClassName=\"agent-tool-editor__tab-panel\" />\n </AgentRegistryAuditPanel>\n ) : <SolidTabGroup tabs={tabs} value={activeTab} onValueChange={setActiveTab} className=\"agent-tool-editor__tabs\" listClassName=\"agent-tool-editor__tab-list\" panelClassName=\"agent-tool-editor__tab-panel\" />}\n </main>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentToolRegistryEditorPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/AgentToolRegistryEditorPage.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 { solidPatch } from \"../../../../http/solidHttp\";\nimport { AgentRegistryAuditPanel } from \"./AgentRegistryAuditPanel\";\nimport { AgentHubTagsField, agentHubTagsFrom, agentHubTagsPayload, type AgentHubTag } from \"./AgentHubTagsField\";\nimport { AgentToolActivationDialog } from \"./AgentToolActivationDialog\";\nimport { AgentToolSessionsPanel } from \"../../../../components/core/extension/solid-core/agentToolRegistry/AgentToolSessionsPanel\";\nimport { AgentRegistryCardWidget } from \"../../../../components/core/extension/solid-core/agentRegistry/card/AgentRegistryCardWidget\";\nimport { SolidButton, SolidCodeEditor, SolidDialog, SolidDialogBody, SolidIconPicker, SolidInput, SolidTabGroup } from \"../../../../components/shad-cn-ui\";\nimport \"./AgentToolRegistryEditorPage.css\";\n\nconst SharedAgentRegistryCard = AgentRegistryCardWidget as React.ComponentType<{ rowData: Record<string, any> }>;\n\ntype Agent = { id?: number | string; name?: string; title?: string; [key: string]: any };\ntype AgentToolLink = { agentRegistry?: Agent | number | string | null };\ntype ToolRecord = {\n id: number;\n name?: string;\n iconName?: string | null;\n description?: string;\n tags?: AgentHubTag[];\n type?: string;\n status?: string | null;\n lastLoadError?: string | null;\n sourceCode?: string;\n checksum?: string;\n agentTools?: AgentToolLink[] | AgentToolLink | 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\nasync function sha256Hex(value: string): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(value));\n return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\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 tool.\";\n const apiError = error as Record<string, any>;\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 tool.\";\n}\n\nexport function AgentToolRegistryEditorPage() {\n const { id = \"\" } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const entityApi = React.useMemo(() => createSolidEntityApi(\"agentToolRegistry\"), []);\n const { useCreateSolidEntityMutation, useGetSolidEntityByIdQuery, useUpdateSolidEntityMutation } = entityApi;\n const { data: response, isLoading, isFetching, refetch } = useGetSolidEntityByIdQuery(\n { id, qs: \"populate[0]=agentTools&populate[1]=agentTools.agentRegistry&populate[2]=tags\" },\n { skip: !id || id === \"new\" },\n );\n const [createTool, { isLoading: isCreating }] = useCreateSolidEntityMutation();\n const [updateTool, { isLoading: isSaving }] = useUpdateSolidEntityMutation();\n const record = extractEntityRecord(response) as ToolRecord | undefined;\n const [activeTab, setActiveTab] = React.useState(\"general\");\n const [name, setName] = React.useState(\"\");\n const [iconName, setIconName] = React.useState(\"\");\n const [description, setDescription] = React.useState(\"\");\n const [type, setType] = React.useState(\"custom\");\n const [sourceCode, setSourceCode] = 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 [activationOpen, setActivationOpen] = React.useState(false);\n const [activationTool, setActivationTool] = React.useState<{ id: number; checksum: string; name: string } | null>(null);\n const preparingActivation = React.useRef(false);\n const baseline = React.useRef(\"\");\n\n const currentForm = () => JSON.stringify({ name, iconName, description, type, sourceCode, tags });\n\n React.useEffect(() => {\n const nextTags = agentHubTagsFrom(record?.tags);\n setName(record?.name ?? \"\");\n setIconName(record?.iconName ?? \"\");\n setDescription(record?.description ?? \"\");\n setType(record?.type ?? \"custom\");\n setSourceCode(record?.sourceCode ?? \"\");\n setTags(nextTags);\n baseline.current = JSON.stringify({ name: record?.name ?? \"\", iconName: record?.iconName ?? \"\", description: record?.description ?? \"\", type: record?.type ?? \"custom\", sourceCode: record?.sourceCode ?? \"\", 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 save = async (nextStatus?: \"inactive\") => {\n if (creatingTag) return;\n const nextErrors: Record<string, string> = {};\n if (!name.trim()) nextErrors.name = \"Name is required.\";\n if (!description.trim()) nextErrors.description = \"Description is required.\";\n if (!type.trim()) nextErrors.type = \"Tool type is required.\";\n if (!sourceCode.trim()) nextErrors.sourceCode = \"Tool source code is required.\";\n\n setFieldErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n setActiveTab(nextErrors.sourceCode ? \"tool\" : \"general\");\n dispatch(showToast({ severity: \"error\", summary: \"Missing information\", detail: Object.values(nextErrors).join(\" \") }));\n return;\n }\n const payload = {\n name: name.trim(), iconName: iconName || null, description: description.trim(), type,\n sourceCode, ...agentHubTagsPayload(tags),\n ...([\"custom\", \"thirdparty\"].includes(type) ? { checksum: await sha256Hex(sourceCode) } : {}),\n status: nextStatus ?? (record && (sourceCode !== record.sourceCode || name.trim() !== record.name || type !== record.type)\n ? \"inactive\" : record?.status ?? \"inactive\"),\n };\n try {\n if (record?.id) {\n const result = await updateTool({ id: record.id, data: payload }).unwrap();\n dispatch(showToast({ severity: \"success\", summary: nextStatus ? \"Tool status updated\" : \"Saved\", detail: nextStatus ? `Tool moved to ${nextStatus}. Restart linked agent processes to apply the change.` : \"Tool updated successfully.\" }));\n setAuditRefreshVersion((version) => version + 1);\n refetch();\n return (extractEntityRecord(result) ?? { ...record, ...payload }) as ToolRecord;\n } else {\n const result: any = await createTool(payload).unwrap();\n const createdId = result?.data?.id ?? result?.id;\n dispatch(showToast({ severity: \"success\", summary: \"Created\", detail: \"Tool created successfully.\" }));\n if (createdId) navigate(`/admin/core/solid-core/agent-tool-registry/editor/${createdId}`, { replace: true });\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\", \"description\", \"type\", \"sourceCode\"]) {\n if (!new RegExp(`\\\\b${field}\\\\b`, \"i\").test(errorDetail)) continue;\n const label = field === \"sourceCode\" ? \"Tool source code\" : 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.sourceCode ? \"tool\" : \"general\");\n }\n dispatch(showToast({ severity: \"error\", summary: \"Save failed\", detail: errorDetail }));\n }\n };\n\n const beginActivation = async () => {\n if (isReadOnly) return;\n if (!record || activationOpen || isSaving || preparingActivation.current) return;\n preparingActivation.current = true;\n try {\n const saved = isDirty || record.status === \"load_failed\" ? await save(\"inactive\") : record;\n if (!saved?.id) return;\n const checksum = await sha256Hex(saved.sourceCode ?? sourceCode);\n setActivationTool({ id: saved.id, checksum, name: saved.name ?? name });\n setActivationOpen(true);\n } catch {\n dispatch(showToast({ severity: \"error\", summary: \"Activation failed\", detail: \"Could not prepare the saved tool source for checks.\" }));\n } finally {\n preparingActivation.current = false;\n }\n };\n\n const agents = React.useMemo(() => {\n const relatedTools = record?.agentTools;\n const links = Array.isArray(relatedTools) ? relatedTools : relatedTools ? [relatedTools] : [];\n const seen = new Set<string>();\n return links.map((link) => link.agentRegistry).filter((agent): agent is Agent => 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 }, [record?.agentTools]);\n const sessionAgents = React.useMemo(() => agents.filter((agent): agent is Agent & { id: number | string } => agent.id !== undefined && agent.id !== null), [agents]);\n const tabs = [\n { value: \"general\", label: \"General Info\", content: <fieldset className=\"agent-tool-editor__general\" disabled={isReadOnly}>\n {isReadOnly && <p className=\"agent-tool-editor__readonly-note\">SolidX tools are seeded by the AgentHub runtime and cannot be edited.</p>}\n {record?.status && <section className={`agent-tool-editor__runtime-status${record.status === \"load_failed\" ? \" agent-tool-editor__runtime-status--failed\" : \"\"}`} role={record.status === \"load_failed\" ? \"alert\" : \"status\"}>\n <div className=\"agent-tool-editor__runtime-heading\"><strong>Runtime status</strong><span>{record.status.replace(/[_-]+/g, \" \")}</span></div>\n {record.status === \"load_failed\" ? <>\n <p>The AgentHub runtime could not load this tool. After correcting its source or checksum, restart linked agent processes so the runtime retries loading it.</p>\n {record.lastLoadError && <pre>{record.lastLoadError}</pre>}\n </> : <p>{record.lastLoadError || \"No tool load error has been reported.\"}</p>}\n </section>}\n <div className=\"agent-tool-editor__fields\">\n <label className=\"agent-tool-editor__field\"><span>Name <b>*</b></span><SolidInput value={name} aria-invalid={Boolean(fieldErrors.name)} aria-describedby={fieldErrors.name ? \"agent-tool-name-error\" : undefined} className={fieldErrors.name ? \"agent-tool-editor__input--invalid\" : undefined} onChange={(e) => { setName(e.target.value); setFieldErrors((current) => ({ ...current, name: \"\" })); }} />{fieldErrors.name && <small id=\"agent-tool-name-error\" className=\"agent-tool-editor__field-error\">{fieldErrors.name}</small>}</label>\n <div className=\"agent-tool-editor__field\"><span>Icon</span><SolidIconPicker value={iconName} onChange={setIconName} /></div>\n <label className=\"agent-tool-editor__field\"><span>Description <b>*</b></span><SolidInput value={description} aria-invalid={Boolean(fieldErrors.description)} aria-describedby={fieldErrors.description ? \"agent-tool-description-error\" : undefined} className={fieldErrors.description ? \"agent-tool-editor__input--invalid\" : undefined} onChange={(e) => { setDescription(e.target.value); setFieldErrors((current) => ({ ...current, description: \"\" })); }} />{fieldErrors.description && <small id=\"agent-tool-description-error\" className=\"agent-tool-editor__field-error\">{fieldErrors.description}</small>}</label>\n </div>\n {!record?.id && <label className=\"agent-tool-editor__field\"><span>Tool status</span><select value=\"inactive\" disabled aria-label=\"Tool status\"><option value=\"inactive\">Inactive</option></select><small>New tools start inactive. Run configuration and initialization checks to activate.</small></label>}\n <label className=\"agent-tool-editor__field\"><span>Tool type <b>*</b></span><select value={type} aria-invalid={Boolean(fieldErrors.type)} aria-describedby={fieldErrors.type ? \"agent-tool-type-error\" : undefined} className={fieldErrors.type ? \"agent-tool-editor__input--invalid\" : undefined} onChange={(e) => { setType(e.target.value); setFieldErrors((current) => ({ ...current, type: \"\" })); }}>\n {isReadOnly && <option value=\"solidx\">SolidX</option>}<option value=\"thirdparty\">Third Party</option><option value=\"custom\">Custom</option>\n </select>{fieldErrors.type && <small id=\"agent-tool-type-error\" className=\"agent-tool-editor__field-error\">{fieldErrors.type}</small>}</label>\n <AgentHubTagsField value={tags} onChange={setTags} disabled={isReadOnly || isCreating || isSaving} onBusyChange={setCreatingTag} />\n {record?.id && <section className=\"agent-tool-editor__workflow\" aria-labelledby=\"agent-tool-lifecycle-title\">\n <div className=\"agent-tool-editor__workflow-head\"><div><h2 id=\"agent-tool-lifecycle-title\">Tool lifecycle</h2><p>Configuration and initialization must pass before this tool can be activated.</p></div></div>\n <div className=\"agent-tool-editor__workflow-stages\" aria-label={`Current tool stage: ${(record.status ?? \"inactive\").replace(/[_-]+/g, \" \")}`}>\n {([ [\"active\", \"Active\", \"Enabled for loading into linked agents.\"], [\"inactive\", \"Inactive\", \"Not loaded for linked agents.\"], [\"load_failed\", \"Load failed\", \"AgentHub could not load this tool.\"] ] as const).map(([value, label, description], index) => {\n const currentStatus = record.status ?? \"inactive\";\n const isCurrent = currentStatus === value;\n const canRetry = value === \"load_failed\" && isCurrent;\n const disabled = isReadOnly || activationOpen || isCreating || isSaving || (!canRetry && (value === \"load_failed\" || isCurrent));\n return <React.Fragment key={value}>\n {index > 0 && <div className=\"agent-tool-editor__workflow-connector\" aria-hidden=\"true\" />}\n <button type=\"button\" className={`agent-tool-editor__workflow-stage agent-tool-editor__workflow-stage--${value}${isCurrent ? \" is-current\" : \"\"}`}\n aria-current={isCurrent ? \"step\" : undefined} aria-pressed={isCurrent} disabled={disabled}\n onClick={() => value === \"inactive\" ? void save(\"inactive\") : void beginActivation()}>\n <span className=\"agent-tool-editor__workflow-mark\">{index + 1}</span>\n <span className=\"agent-tool-editor__workflow-copy\"><strong>{label}</strong><small>{description}</small><small className=\"agent-tool-editor__workflow-cta\">{canRetry ? \"Run checks and retry activation\" : isCurrent ? \"Current stage\" : value === \"load_failed\" ? \"Set automatically by AgentHub\" : value === \"active\" ? \"Run checks to activate\" : \"Click to deactivate\"}</small></span>\n {isCurrent && <span className=\"agent-tool-editor__workflow-current\">Current</span>}\n </button>\n </React.Fragment>;\n })}\n </div>\n {record.status === \"load_failed\" && <small className=\"agent-tool-editor__workflow-hint\">Fix the source or checksum, then run configuration and initialization checks before retrying activation.</small>}\n <small className=\"agent-tool-editor__workflow-hint\">Activation checks use the saved tool configuration. Restart linked agent processes to apply status changes.</small>\n </section>}\n </fieldset> },\n { value: \"tool\", label: \"Tool\", content: <div className=\"agent-tool-editor__tool\">\n <section className=\"agent-tool-editor__panel\">\n <header><h2>Tool source code <b>*</b></h2><p>Write the tool's Python code here.</p></header>\n <SolidCodeEditor value={sourceCode} onChange={(value) => { setSourceCode(value ?? \"\"); setFieldErrors((current) => ({ ...current, sourceCode: \"\" })); }} language=\"python\" readOnly={isReadOnly} fontSize={11} height=\"max(32rem, calc(100dvh - 18rem))\" className={`agent-tool-editor__code${fieldErrors.sourceCode ? \" agent-tool-editor__code--invalid\" : \"\"}`} />\n {fieldErrors.sourceCode && <small className=\"agent-tool-editor__field-error agent-tool-editor__code-error\">{fieldErrors.sourceCode}</small>}\n </section>\n </div> },\n { value: \"agents\", label: \"Agents\", content: <section className=\"agent-tool-editor__agents\"><div><h2>Associated agents</h2><p>Agents linked to this tool. Associations are read-only here.</p></div>\n {isLoading ? <p>Loading associated agents…</p> : agents.length ? <div className=\"agent-tool-editor__agent-grid\">{agents.map((agent, index) => <div className=\"agent-tool-editor__agent-card\" key={String(agent.id ?? agent.name ?? index)}><SharedAgentRegistryCard rowData={agent} /></div>)}</div> : <div className=\"agent-tool-editor__empty\">No agents are currently associated with this tool.</div>}\n </section> },\n { value: \"sessions\", label: \"Sessions\", content: <AgentToolSessionsPanel agents={sessionAgents} /> },\n ];\n\n return <main className=\"agent-tool-editor\">\n <header className=\"agent-tool-editor__header\"><div><div className=\"agent-tool-editor__heading-with-refresh\"><h1>{record ? \"Edit Tool\" : \"Create Tool\"}</h1>{record?.id && <button type=\"button\" className={`agent-tool-editor__refresh${isFetching ? \" is-loading\" : \"\"}`} aria-label=\"Refresh tool\" title=\"Refresh tool\" disabled={isFetching || isSaving} onClick={requestRefresh}><RefreshCw size={14} /></button>}</div></div><div className=\"agent-tool-editor__actions\">\n <SolidButton variant=\"secondary\" leftIcon={<ArrowLeft size={16} />} onClick={() => navigate(-1)}>Back</SolidButton>\n {!isReadOnly && <SolidButton disabled={activationOpen || creatingTag} loading={isCreating || isSaving} onClick={() => void save()}>Save Tool</SolidButton>}\n </div></header>\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 tool content.</p></SolidDialogBody>\n </SolidDialog>\n {activationOpen && activationTool && <AgentToolActivationDialog open={activationOpen} onOpenChange={setActivationOpen}\n toolId={activationTool.id} checksum={activationTool.checksum} toolName={activationTool.name}\n onActivated={async () => {\n await solidPatch(`/agent-tool-registry/${activationTool.id}`, { status: \"active\", checksum: activationTool.checksum });\n setAuditRefreshVersion((version) => version + 1);\n void refetch();\n dispatch(showToast({ severity: \"success\", summary: \"Tool activated\", detail: \"Configuration and initialization checks passed.\" }));\n }} />}\n {isLoading ? <div className=\"agent-tool-editor__loading\">Loading tool…</div> : record?.id ? (\n <AgentRegistryAuditPanel modelSingularName=\"agentToolRegistry\" recordId={record.id} refreshVersion={auditRefreshVersion} modelUserKey={record.name}>\n <SolidTabGroup tabs={tabs} value={activeTab} onValueChange={setActiveTab} className=\"agent-tool-editor__tabs\" listClassName=\"agent-tool-editor__tab-list\" panelClassName=\"agent-tool-editor__tab-panel\" />\n </AgentRegistryAuditPanel>\n ) : <SolidTabGroup tabs={tabs} value={activeTab} onValueChange={setActiveTab} className=\"agent-tool-editor__tabs\" listClassName=\"agent-tool-editor__tab-list\" panelClassName=\"agent-tool-editor__tab-panel\" />}\n </main>;\n}\n"]}
|