@@ -1560,11 +1530,11 @@ function ConfigurationTab({
const taskAssignLocked = agent.role === "ceo" || canCreateAgents;
const taskAssignHint =
taskAssignSource === "ceo_role"
- ? `Enabled automatically for ${VOCAB.ceo} agents.`
+ ? "Enabled automatically for CEO agents."
: taskAssignSource === "agent_creator"
? "Enabled automatically while this agent can create new agents."
: taskAssignSource === "explicit_grant"
- ? `Enabled via explicit ${VOCAB.company.toLowerCase()} permission grant.`
+ ? "Enabled via explicit company permission grant."
: "Disabled unless explicitly granted.";
return (
@@ -1808,7 +1778,7 @@ function PromptsTab({
const uploadMarkdownImage = useMutation({
mutationFn: async ({ file, namespace }: { file: File; namespace: string }) => {
- if (!selectedCompanyId) throw new Error(`Select a ${VOCAB.company.toLowerCase()} to upload images`);
+ if (!selectedCompanyId) throw new Error("Select a company to upload images");
return assetsApi.uploadImage(selectedCompanyId, file, namespace);
},
});
@@ -2008,7 +1978,7 @@ function PromptsTab({
- {`Managed: ${VOCAB.appName} stores and serves the instructions bundle. External: you provide a path on disk where the instructions live.`}
+ Managed: Paperclip stores and serves the instructions bundle. External: you provide a path on disk where the instructions live.
@@ -2063,7 +2033,7 @@ function PromptsTab({
- {`The absolute directory on disk where the instructions bundle lives. In managed mode this is set by ${VOCAB.appName} automatically.`}
+ The absolute directory on disk where the instructions bundle lives. In managed mode this is set by Paperclip automatically.
@@ -2433,7 +2403,6 @@ function AgentSkillsTab({
const queryClient = useQueryClient();
const [skillDraft, setSkillDraft] = useState([]);
const [lastSavedSkills, setLastSavedSkills] = useState([]);
- const [unmanagedOpen, setUnmanagedOpen] = useState(false);
const lastSavedSkillsRef = useRef([]);
const hasHydratedSkillSnapshotRef = useRef(false);
const skipNextSkillAutosaveRef = useRef(true);
@@ -2463,63 +2432,6 @@ function AgentSkillsTab({
},
});
- // Skill groups queries
- const agentGroupsQuery = useQuery({
- queryKey: queryKeys.skillGroups.agentGroups(agent.id),
- queryFn: () => skillGroupsApi.listAgentGroups(agent.id),
- });
-
- const allGroupsQuery = useQuery({
- queryKey: queryKeys.skillGroups.list,
- queryFn: () => skillGroupsApi.listGroups(),
- });
-
- const agentEffectiveSkillsQuery = useQuery({
- queryKey: queryKeys.skillGroups.agentSkills(agent.id),
- queryFn: () => skillGroupsApi.listAgentSkills(agent.id),
- });
-
- // Group dialog state
- const [addGroupOpen, setAddGroupOpen] = useState(false);
- const [createGroupOpen, setCreateGroupOpen] = useState(false);
- const [removeGroupConfirm, setRemoveGroupConfirm] = useState(null);
- const [groupSearch, setGroupSearch] = useState("");
- const [newGroupName, setNewGroupName] = useState("");
- const [newGroupDesc, setNewGroupDesc] = useState("");
- const [effectiveOpen, setEffectiveOpen] = useState(false);
-
- // Group mutations
- const assignGroupMut = useMutation({
- mutationFn: ({ groupId }: { groupId: string }) =>
- skillGroupsApi.assignGroup(agent.id, groupId),
- onSuccess: () => {
- void queryClient.invalidateQueries({ queryKey: queryKeys.skillGroups.agentGroups(agent.id) });
- void queryClient.invalidateQueries({ queryKey: queryKeys.skillGroups.agentSkills(agent.id) });
- setAddGroupOpen(false);
- },
- });
-
- const removeGroupMut = useMutation({
- mutationFn: ({ groupId }: { groupId: string }) =>
- skillGroupsApi.removeGroup(agent.id, groupId),
- onSuccess: () => {
- void queryClient.invalidateQueries({ queryKey: queryKeys.skillGroups.agentGroups(agent.id) });
- void queryClient.invalidateQueries({ queryKey: queryKeys.skillGroups.agentSkills(agent.id) });
- setRemoveGroupConfirm(null);
- },
- });
-
- const createGroupMut = useMutation({
- mutationFn: () =>
- skillGroupsApi.createGroup({ name: newGroupName, description: newGroupDesc || undefined }),
- onSuccess: () => {
- void queryClient.invalidateQueries({ queryKey: queryKeys.skillGroups.list });
- setCreateGroupOpen(false);
- setNewGroupName("");
- setNewGroupDesc("");
- },
- });
-
useEffect(() => {
setSkillDraft([]);
setLastSavedSkills([]);
@@ -2651,9 +2563,9 @@ function AgentSkillsTab({
const unsupportedSkillMessage = useMemo(() => {
if (skillSnapshot?.mode !== "unsupported") return null;
if (agent.adapterType === "openclaw_gateway") {
- return `${VOCAB.appName} cannot manage OpenClaw skills here. Visit your OpenClaw instance to manage this agent's skills.`;
+ return "Paperclip cannot manage OpenClaw skills here. Visit your OpenClaw instance to manage this agent's skills.";
}
- return `${VOCAB.appName} cannot manage skills for this adapter yet. Manage them in the adapter directly.`;
+ return "Paperclip cannot manage skills for this adapter yet. Manage them in the adapter directly.";
}, [agent.adapterType, skillSnapshot?.mode]);
const hasUnsavedChanges = !arraysEqual(skillDraft, lastSavedSkills);
const saveStatusLabel = syncSkills.isPending
@@ -2693,289 +2605,6 @@ function AgentSkillsTab({
) : null}
- {/* ---- Assigned Groups Section ---- */}
-
-
-
-
- Assigned Groups
-
-
- {agentGroupsQuery.isLoading ? (
-
-
-
-
-
- ) : agentGroupsQuery.data?.length === 0 ? (
-
-
No groups assigned
-
- Add a skill group to install a bundle of skills for this agent.
-
-
- ) : (
-
-
- {(agentGroupsQuery.data ?? []).map((group) => (
- setRemoveGroupConfirm(group)
- }
- removing={
- removeGroupMut.isPending && removeGroupConfirm?.id === group.id
- }
- />
- ))}
-
-
- )}
-
-
setAddGroupOpen(true)}
- className="h-7 px-2 text-xs"
- >
-
- Add Group
-
-
- {agentGroupsQuery.isError && (
-
Failed to load groups. Try again.
- )}
-
-
-
-
- {/* ---- Combined Effective Skills Section ---- */}
-
-
-
-
- Combined Effective Skills
-
-
-
- {effectiveOpen
- ? "Hide skills"
- : `Show ${agentEffectiveSkillsQuery.data?.length ?? 0} skills`}
-
-
-
-
-
-
- {agentEffectiveSkillsQuery.isLoading ? (
-
-
-
-
-
- ) : agentEffectiveSkillsQuery.data?.length === 0 ? (
-
- No skills in assigned groups. Add skills to the group definitions first.
-
- ) : (
-
-
- {(agentEffectiveSkillsQuery.data ?? []).map((entry) => (
-
- {entry.skillId}
-
- ))}
-
-
- )}
-
-
-
-
-
-
- {/* ---- Additional Individual Skills ---- */}
-
- Additional Individual Skills
-
-
- {/* ---- Add Group Dialog ---- */}
-
-
-
- Add Skill Group
-
-
-
setGroupSearch(e.target.value)}
- className="h-8 text-sm"
- />
-
- {(() => {
- const assignedIds = new Set((agentGroupsQuery.data ?? []).map((g) => g.id));
- const available = (allGroupsQuery.data ?? []).filter(
- (g) =>
- !assignedIds.has(g.id) &&
- g.name.toLowerCase().includes(groupSearch.toLowerCase()),
- );
- if (available.length === 0) {
- return (
-
- {groupSearch ? "No groups match your search." : "No groups available to add."}
-
- );
- }
- return available.map((group) => (
-
-
-
{group.name}
- {group.isBuiltin === 1 && (
-
built-in
- )}
- {group.description && (
-
{group.description}
- )}
-
-
assignGroupMut.mutate({ groupId: group.id })}
- className="shrink-0 h-7 text-xs"
- >
- {assignGroupMut.isPending ? (
-
- ) : (
- "Assign group"
- )}
-
-
- ));
- })()}
-
- {assignGroupMut.isError && (
-
- Failed to assign group. Check the server logs for details.
-
- )}
-
-
- {
- setAddGroupOpen(false);
- setCreateGroupOpen(true);
- }}
- >
- New Group
-
- setAddGroupOpen(false)}>
- Close
-
-
-
-
-
- {/* ---- Create Group Dialog ---- */}
-
-
-
- Create Skill Group
-
-
-
-
- Name
-
- setNewGroupName(e.target.value)}
- className="h-8 text-sm"
- />
-
-
-
- Description
-
-
- {createGroupMut.isError && (
-
- Failed to create group. Check the server logs for details.
-
- )}
-
-
- setCreateGroupOpen(false)}>
- Cancel
-
- createGroupMut.mutate()}
- >
- {createGroupMut.isPending ? (
-
- ) : null}
- Create Group
-
-
-
-
-
- {/* ---- Remove Group Confirmation Dialog ---- */}
-
{ if (!open) setRemoveGroupConfirm(null); }}
- >
-
-
- Remove group from agent
-
-
- Removing{" "}
- {removeGroupConfirm?.name} {" "}
- will uninstall skills that are not used by any other assigned group.
-
-
- setRemoveGroupConfirm(null)}>
- Cancel
-
- {
- if (removeGroupConfirm) {
- removeGroupMut.mutate({ groupId: removeGroupConfirm.id });
- }
- }}
- >
- {removeGroupMut.isPending ? (
-
- ) : null}
- Remove group
-
-
-
-
-
{isLoading ? (
) : (
@@ -3009,11 +2638,7 @@ function AgentSkillsTab({
)}
{skill.readOnly && skill.originLabel && (
- skill.originLabel === "Hermes skill" ? (
-
Hermes skill
- ) : (
-
{skill.originLabel}
- )
+
{skill.originLabel}
)}
{skill.readOnly && skill.locationLabel && (
Location: {skill.locationLabel}
@@ -3098,7 +2723,7 @@ function AgentSkillsTab({
- {`Required by ${VOCAB.appName}`}
+ Required by Paperclip
{requiredSkillRows.map(renderSkillRow)}
@@ -3107,21 +2732,12 @@ function AgentSkillsTab({
{unmanagedSkillRows.length > 0 && (
- setUnmanagedOpen((v) => !v)}
- onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); setUnmanagedOpen((v) => !v); } }}
- >
+
- {agent.adapterType === "hermes_local"
- ? `(${unmanagedSkillRows.length}) Hermes native skills & user-installed skills`
- : `(${unmanagedSkillRows.length}) User-installed skills, not managed by ${VOCAB.appName}`}
+ User-installed skills, not managed by Paperclip
- {unmanagedOpen ? : }
- {unmanagedOpen && unmanagedSkillRows.map(renderSkillRow)}
+ {unmanagedSkillRows.map(renderSkillRow)}
)}
>
@@ -3130,7 +2746,7 @@ function AgentSkillsTab({
{desiredOnlyMissingSkills.length > 0 && (
-
{`Requested skills missing from the ${VOCAB.company.toLowerCase()} library`}
+
Requested skills missing from the company library
{desiredOnlyMissingSkills.join(", ")}
@@ -4404,7 +4020,7 @@ function KeysTab({ agentId, companyId }: { agentId: string; companyId?: string }
Create API Key
- {`API keys allow this agent to authenticate calls to the ${VOCAB.appName} server.`}
+ API keys allow this agent to authenticate calls to the Paperclip server.