mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-20 00:14:50 +00:00
Name every person on agent pages by one rule
people_named_to decides whom the edit page and the share dialog name: the reader, the holder's owner, anyone sharing a team with the reader and, for the owner, whoever sponsored something on the holder. A resource's owner, named as whom to ask or whose credentials a tool uses, also needs the reader to see that resource. Sponsors, runs_as, contact and account in resource_states and sponsors in sponsor_details all follow it; anyone else is left unnamed and the pages say someone else. A tool's run details (note, credential_mode, account, writes) come from one function and only for a tool that runs. The share dialog keys each person's own account on the per_user_account note, as the notice does, and the unused noteKey helper and its string are gone.
This commit is contained in:
1 parent
3cab8af753
commit
4b08e94be7
15 files changed
+435
-195
No files matched your search
@@ -142,6 +142,7 @@ describe('AgentUsesSection', () => {
|
||||
id: 't3',
|
||||
name: 'Slack tool',
|
||||
credential_mode: 'member',
|
||||
note: 'per_user_account',
|
||||
connection: { id: 'c1', connector_key: 'slack', name: 'Slack' },
|
||||
}),
|
||||
item({
|
||||
@@ -193,6 +194,7 @@ describe('AgentUsesSection', () => {
|
||||
id: 't3',
|
||||
name: 'Slack tool',
|
||||
credential_mode: 'member',
|
||||
note: 'per_user_account',
|
||||
connection: { id: null, connector_key: 'slack', name: 'Slack' },
|
||||
}),
|
||||
],
|
||||
@@ -223,6 +225,54 @@ describe('AgentUsesSection', () => {
|
||||
expect(rowOf('Once sponsored')?.textContent).not.toContain('bob');
|
||||
});
|
||||
|
||||
it('says someone else for a sponsor the reader does not know', async () => {
|
||||
await render(
|
||||
agentWith(
|
||||
[
|
||||
item({
|
||||
id: 't1',
|
||||
name: 'Runs as a stranger',
|
||||
sponsor: { user_id: null, label: null },
|
||||
runs_as: { user_id: null, label: null },
|
||||
}),
|
||||
item({
|
||||
id: 't2',
|
||||
name: 'Stopped',
|
||||
state: 'stopped',
|
||||
reason: 'sponsor_cannot_edit_agent',
|
||||
sponsor: { user_id: null, label: null },
|
||||
}),
|
||||
],
|
||||
{ access: 'editor', allowed_actions: ['edit', 'share', 'use'] },
|
||||
),
|
||||
);
|
||||
await open();
|
||||
expect(rowOf('Runs as a stranger')?.textContent).toContain(
|
||||
`${K}.access.other`,
|
||||
);
|
||||
expect(rowOf('Stopped')?.textContent).toContain(
|
||||
'agents.form.resourceStates.reason.sponsorCannotEditAgentOther',
|
||||
);
|
||||
});
|
||||
|
||||
it('reads the per_user_account note for a tool each person connects', async () => {
|
||||
await render(
|
||||
agentWith([
|
||||
item({
|
||||
id: 't1',
|
||||
name: 'Slack tool',
|
||||
credential_mode: 'member',
|
||||
note: 'per_user_account',
|
||||
connection: { id: 'c1', connector_key: 'slack', name: 'Slack' },
|
||||
}),
|
||||
]),
|
||||
);
|
||||
await open();
|
||||
expect(rowOf('Slack tool')?.textContent).toContain(
|
||||
`${K}.access.member(service=Slack)`,
|
||||
);
|
||||
});
|
||||
|
||||
it('names whose saved credentials a tool without a connection uses', async () => {
|
||||
await render(
|
||||
agentWith([
|
||||
@@ -329,6 +379,7 @@ describe('AgentUsesSection', () => {
|
||||
id: 't1',
|
||||
name: 'Slack tool',
|
||||
credential_mode: 'member',
|
||||
note: 'per_user_account',
|
||||
connection: { id: null, connector_key: 'slack', name: 'Slack' },
|
||||
owner_credential_writes: ['send'],
|
||||
}),
|
||||
@@ -347,6 +398,7 @@ describe('AgentUsesSection', () => {
|
||||
id: 't2',
|
||||
name: 'Slack tool',
|
||||
credential_mode: 'member',
|
||||
note: 'per_user_account',
|
||||
owner_credential_writes: ['send'],
|
||||
}),
|
||||
]),
|
||||
|
||||
@@ -77,6 +77,9 @@ export default function AgentUsesSection({
|
||||
// Without a user id (authentication off) the one local user is everyone.
|
||||
const isYou = (userId: string) =>
|
||||
readerId ? userId === readerId : ownerReads;
|
||||
// A tool each person connects runs on their own account (the notice's
|
||||
// note), except for API and widget users.
|
||||
const perUser = (item: ResourceState) => item.note === 'per_user_account';
|
||||
const allowlist = agent.config?.api_write_allowlist ?? [];
|
||||
const nameOf = (item: ResourceState) =>
|
||||
item.name || t('agents.form.sponsors.unknownItem');
|
||||
@@ -86,7 +89,7 @@ export default function AgentUsesSection({
|
||||
const service = item.connection?.name;
|
||||
const suffix = service ? '' : 'NoService';
|
||||
const named = service ? { ...plain, service } : plain;
|
||||
if (item.credential_mode === 'member')
|
||||
if (perUser(item))
|
||||
// API and widget callers run the agent as its owner, so they use the
|
||||
// owner's own account.
|
||||
return t(
|
||||
@@ -111,18 +114,18 @@ export default function AgentUsesSection({
|
||||
const accessLabel = (item: ResourceState): string => {
|
||||
const credentials = credentialsLabel(item);
|
||||
if (credentials) return credentials;
|
||||
if (item.runs_as)
|
||||
return isYou(item.runs_as.user_id)
|
||||
if (item.runs_as) {
|
||||
const { user_id: userId, label } = item.runs_as;
|
||||
if (!userId) return t(`${K}.access.other`);
|
||||
return isYou(userId)
|
||||
? t(`${K}.access.you`)
|
||||
: t(`${K}.access.person`, {
|
||||
...plain,
|
||||
person: item.runs_as.label || item.runs_as.user_id,
|
||||
});
|
||||
: t(`${K}.access.person`, { ...plain, person: label || userId });
|
||||
}
|
||||
return ownerReads ? t(`${K}.access.you`) : t(`${K}.access.owner`);
|
||||
};
|
||||
|
||||
const stoppedText = (item: ResourceState) =>
|
||||
t(reasonKey(item.reason, ownerReads), {
|
||||
t(reasonKey(item.reason, ownerReads, Boolean(item.sponsor?.user_id)), {
|
||||
...plain,
|
||||
name: nameOf(item),
|
||||
service:
|
||||
@@ -154,12 +157,8 @@ export default function AgentUsesSection({
|
||||
item.writes_allowed !== false &&
|
||||
blockedWrites(item, allowlist).length > 0,
|
||||
);
|
||||
const blockedMember = blocked.some(
|
||||
(item) => item.credential_mode === 'member',
|
||||
);
|
||||
const blockedOwned = blocked.some(
|
||||
(item) => item.credential_mode !== 'member',
|
||||
);
|
||||
const blockedMember = blocked.some(perUser);
|
||||
const blockedOwned = blocked.some((item) => !perUser(item));
|
||||
const editor = ownerReads ? '' : 'Editor';
|
||||
const writesNote = blockedOwned
|
||||
? [
|
||||
|
||||
@@ -6,7 +6,6 @@ import { initReactI18next } from 'react-i18next';
|
||||
|
||||
import type { Agent, ResourceSponsor, ResourceState } from '../types';
|
||||
import ResourceStatusNotice, {
|
||||
noteKey,
|
||||
unnamedResourceLabel,
|
||||
} from './ResourceStatusNotice';
|
||||
|
||||
@@ -202,6 +201,38 @@ describe('ResourceStatusNotice', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('says someone else for a sponsor the reader does not know', async () => {
|
||||
await render(
|
||||
{
|
||||
...editorAgent,
|
||||
resource_sponsors: [
|
||||
sponsor({ id: 't1', user_id: null, label: null }),
|
||||
sponsor({ id: 't2', user_id: null, label: null }),
|
||||
],
|
||||
},
|
||||
[
|
||||
stoppedItem({
|
||||
reason: 'sponsor_cannot_edit_resource',
|
||||
sponsor: { user_id: null, label: null },
|
||||
}),
|
||||
stoppedItem({
|
||||
key: 'tool:t3',
|
||||
id: 't3',
|
||||
reason: 'sponsor_cannot_edit_agent',
|
||||
sponsor: { user_id: 'bob', label: 'bob@example.com' },
|
||||
}),
|
||||
],
|
||||
);
|
||||
const text = container.textContent ?? '';
|
||||
expect(text).toContain('agents.form.sponsors.addedByOther');
|
||||
expect(text).not.toContain('agents.form.sponsors.addedBy.');
|
||||
expect(text).toContain(
|
||||
'agents.form.resourceStates.reason.sponsorCannotEditItemOther',
|
||||
);
|
||||
// A sponsor the reader knows is named.
|
||||
expect(text).toMatch(/reason\.sponsorCannotEditAgent(?!Other)/);
|
||||
});
|
||||
|
||||
it('tells the owner they lost access, and an editor that the owner did', async () => {
|
||||
const item = stoppedItem({ reason: 'owner_lost_access' });
|
||||
await render(baseAgent, [item]);
|
||||
@@ -280,13 +311,6 @@ describe('ResourceStatusNotice', () => {
|
||||
).toBe('agents.form.resourceStates.unnamed.source|0f1e2d3c');
|
||||
});
|
||||
|
||||
it("has words for a tool on each person's own account", () => {
|
||||
expect(noteKey('per_user_account')).toBe(
|
||||
'agents.form.resourceStates.note.perUserAccount',
|
||||
);
|
||||
expect(noteKey(null)).toBeNull();
|
||||
});
|
||||
|
||||
it('notes that a stopped prompt falls back to the default', async () => {
|
||||
await render(baseAgent, [
|
||||
stoppedItem({ key: 'prompt:p1', type: 'prompt', id: 'p1' }),
|
||||
|
||||
@@ -11,7 +11,6 @@ import type {
|
||||
Agent,
|
||||
ResourceSponsor,
|
||||
ResourceState,
|
||||
ResourceStateNote,
|
||||
ResourceStateReason,
|
||||
} from '../types';
|
||||
|
||||
@@ -39,11 +38,16 @@ type ResourceStatusNoticeProps = {
|
||||
showAttachNote?: boolean;
|
||||
};
|
||||
|
||||
/** The message key that says why an item stopped. */
|
||||
/**
|
||||
* The message key that says why an item stopped. `sponsorNamed` is false
|
||||
* when the read doesn't name the sponsor, who is then "someone else".
|
||||
*/
|
||||
export function reasonKey(
|
||||
reason: ResourceStateReason | null,
|
||||
ownerReads: boolean,
|
||||
sponsorNamed = true,
|
||||
) {
|
||||
const other = sponsorNamed ? '' : 'Other';
|
||||
switch (reason) {
|
||||
case 'deleted':
|
||||
return 'agents.form.resourceStates.reason.deleted';
|
||||
@@ -52,9 +56,9 @@ export function reasonKey(
|
||||
? 'agents.form.resourceStates.reason.ownerLostAccessYou'
|
||||
: 'agents.form.resourceStates.reason.ownerLostAccess';
|
||||
case 'sponsor_cannot_edit_agent':
|
||||
return 'agents.form.resourceStates.reason.sponsorCannotEditAgent';
|
||||
return `agents.form.resourceStates.reason.sponsorCannotEditAgent${other}`;
|
||||
case 'sponsor_cannot_edit_resource':
|
||||
return 'agents.form.resourceStates.reason.sponsorCannotEditItem';
|
||||
return `agents.form.resourceStates.reason.sponsorCannotEditItem${other}`;
|
||||
case 'connection_needs_reconnect':
|
||||
return 'agents.form.resourceStates.reason.connectionNeedsReconnect';
|
||||
case 'connection_removed':
|
||||
@@ -66,13 +70,6 @@ export function reasonKey(
|
||||
}
|
||||
}
|
||||
|
||||
/** The words for a running item's `note`, or null when it has none. */
|
||||
export function noteKey(note: ResourceStateNote | null | undefined) {
|
||||
return note === 'per_user_account'
|
||||
? 'agents.form.resourceStates.note.perUserAccount'
|
||||
: null;
|
||||
}
|
||||
|
||||
/** A name for an item the reader may not see: its kind and a short id. */
|
||||
export function unnamedResourceLabel(
|
||||
t: TFunction,
|
||||
@@ -106,11 +103,14 @@ function askKey(item: ResourceState): string | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Items grouped by the person who added them, in first-seen order. */
|
||||
/**
|
||||
* Items grouped by the person who added them, in first-seen order; people
|
||||
* the reader doesn't know form one group.
|
||||
*/
|
||||
function groupByPerson(sponsors: ResourceSponsor[]) {
|
||||
const groups = new Map<string, ResourceSponsor[]>();
|
||||
for (const sponsor of sponsors) {
|
||||
const key = sponsor.label || sponsor.user_id;
|
||||
const key = sponsor.label || sponsor.user_id || '';
|
||||
groups.set(key, [...(groups.get(key) ?? []), sponsor]);
|
||||
}
|
||||
return Array.from(groups.values());
|
||||
@@ -170,11 +170,16 @@ export default function ResourceStatusNotice({
|
||||
<AlertDescription>
|
||||
{running.map((items) => (
|
||||
<p key={items[0].key || `${items[0].type}:${items[0].id}`}>
|
||||
{t('agents.form.sponsors.addedBy', {
|
||||
...plain,
|
||||
person: items[0].label || items[0].user_id,
|
||||
names: listFormat.format(items.map(resolveName)),
|
||||
})}
|
||||
{t(
|
||||
items[0].user_id
|
||||
? 'agents.form.sponsors.addedBy'
|
||||
: 'agents.form.sponsors.addedByOther',
|
||||
{
|
||||
...plain,
|
||||
person: items[0].label || items[0].user_id,
|
||||
names: listFormat.format(items.map(resolveName)),
|
||||
},
|
||||
)}
|
||||
</p>
|
||||
))}
|
||||
</AlertDescription>
|
||||
@@ -196,12 +201,19 @@ export default function ResourceStatusNotice({
|
||||
return (
|
||||
<li key={item.key} className="flex flex-col gap-1.5">
|
||||
<p>
|
||||
{t(reasonKey(item.reason, ownerReads), {
|
||||
...plain,
|
||||
name,
|
||||
service,
|
||||
person: item.sponsor?.label || item.sponsor?.user_id,
|
||||
})}
|
||||
{t(
|
||||
reasonKey(
|
||||
item.reason,
|
||||
ownerReads,
|
||||
Boolean(item.sponsor?.user_id),
|
||||
),
|
||||
{
|
||||
...plain,
|
||||
name,
|
||||
service,
|
||||
person: item.sponsor?.label || item.sponsor?.user_id,
|
||||
},
|
||||
)}
|
||||
{ask
|
||||
? ` ${t(ask, { ...plain, person: item.contact?.label })}`
|
||||
: ''}
|
||||
|
||||
@@ -19,9 +19,10 @@ export type ResourceSponsor = {
|
||||
id: string;
|
||||
/** The item's name, looked up whoever owns it. */
|
||||
name?: string | null;
|
||||
user_id: string;
|
||||
/** Null, with `label`, for someone the reader doesn't know. */
|
||||
user_id: string | null;
|
||||
/** The person's email when on file, else their user id. */
|
||||
label: string;
|
||||
label: string | null;
|
||||
state?: 'active' | 'inactive';
|
||||
/** Null while it runs; else whether the person lost the agent or the item. */
|
||||
reason?: ResourceSponsorReason | null;
|
||||
@@ -43,8 +44,11 @@ export type ResourceStateReason =
|
||||
/** Something to know about an item that runs (`ResourceState.note`). */
|
||||
export type ResourceStateNote = 'per_user_account';
|
||||
|
||||
/** A person the page names: their email when on file, else their user id. */
|
||||
export type ResourcePerson = { user_id: string; label: string };
|
||||
/**
|
||||
* A person the page names: their email when on file, else their user id.
|
||||
* Both are null for someone the reader doesn't know.
|
||||
*/
|
||||
export type ResourcePerson = { user_id: string | null; label: string | null };
|
||||
|
||||
/**
|
||||
* Whether an attached tool, source or prompt runs (`resource_states` on the
|
||||
@@ -64,7 +68,7 @@ export type ResourceState = {
|
||||
note?: ResourceStateNote | null;
|
||||
/** Who it ran with the access of, when someone else added it. */
|
||||
sponsor?: ResourcePerson | null;
|
||||
/** Someone other than the reader who can fix it, when the reader may know them. */
|
||||
/** Someone other than the reader who can fix it, when the reader knows them. */
|
||||
contact?: ResourcePerson | null;
|
||||
/** Who can fix it (`resource_owner`), named or not. */
|
||||
contact_role?: 'resource_owner' | null;
|
||||
@@ -86,7 +90,7 @@ export type ResourceState = {
|
||||
* Whose saved credentials or owner-mode connection a running tool uses
|
||||
* (the tool's owner); both null when the reader may not see who.
|
||||
*/
|
||||
account?: { user_id: string | null; label: string | null } | null;
|
||||
account?: ResourcePerson | null;
|
||||
/** Its write actions on credentials its owner stored (the API write allowlist's). */
|
||||
owner_credential_writes?: string[];
|
||||
/** False when an admin turned off changes through its connector. */
|
||||
|
||||
@@ -773,6 +773,7 @@
|
||||
"access": {
|
||||
"you": "Dein Zugriff",
|
||||
"person": "Zugriff von {{person}}",
|
||||
"other": "Zugriff einer anderen Person",
|
||||
"owner": "Zugriff des Eigentümers",
|
||||
"member": "Das eigene {{service}}-Konto jeder Person (API und Widget: deins)",
|
||||
"memberNoService": "Das eigene Konto jeder Person (API und Widget: deins)",
|
||||
@@ -2400,6 +2401,7 @@
|
||||
"attachNote": "Tools, Quellen und Prompts, die du hinzufügst und die der Eigentümer nicht nutzen kann, laufen für alle, die diesen Agenten nutzen, mit deinem Zugriff. Du musst sie besitzen oder bearbeiten können und wirst um Bestätigung gebeten.",
|
||||
"publicLinkNote": "Dieser Agent hat einen öffentlichen Link, daher kann jeder mit dem Link Antworten daraus erhalten.",
|
||||
"addedBy": "Hinzugefügt von {{person}}: {{names}}",
|
||||
"addedByOther": "Hinzugefügt von einer anderen Person: {{names}}",
|
||||
"unknownItem": "Unbenanntes Element",
|
||||
"notAllowed": "Du kannst {{names}} diesem Agenten nicht hinzufügen. Der Eigentümer kann sie nicht nutzen, und du kannst nur teilen, was du besitzt oder bearbeiten kannst.",
|
||||
"takeOver": "{{name}} mit meinem Zugriff ausführen",
|
||||
@@ -2414,7 +2416,9 @@
|
||||
"ownerLostAccessYou": "Du kannst {{name}} nicht mehr verwenden.",
|
||||
"ownerLostAccess": "Der Eigentümer des Agenten kann {{name}} nicht mehr verwenden.",
|
||||
"sponsorCannotEditAgent": "{{name}} lief mit dem Zugriff von {{person}}, und diese Person kann den Agenten nicht mehr bearbeiten.",
|
||||
"sponsorCannotEditAgentOther": "{{name}} lief mit dem Zugriff einer anderen Person, und diese Person kann den Agenten nicht mehr bearbeiten.",
|
||||
"sponsorCannotEditItem": "{{name}} lief mit dem Zugriff von {{person}}, und diese Person kann es nicht mehr bearbeiten.",
|
||||
"sponsorCannotEditItemOther": "{{name}} lief mit dem Zugriff einer anderen Person, und diese Person kann es nicht mehr bearbeiten.",
|
||||
"connectionNeedsReconnect": "Für {{name}} muss das {{service}}-Konto erneut angemeldet werden.",
|
||||
"connectionRemoved": "Das {{service}}-Konto, das {{name}} verwendet hat, wurde entfernt.",
|
||||
"connectorDisabled": "Ein Admin hat {{service}} deaktiviert, daher kann {{name}} nicht laufen.",
|
||||
@@ -2439,9 +2443,6 @@
|
||||
"source": "Quelle {{id}}",
|
||||
"prompt": "Prompt {{id}}"
|
||||
},
|
||||
"note": {
|
||||
"perUserAccount": "Jede Person verwendet ihr eigenes Konto"
|
||||
},
|
||||
"chip": "Läuft nicht: {{count}}"
|
||||
},
|
||||
"sponsorConfirm": {
|
||||
|
||||
@@ -779,6 +779,7 @@
|
||||
"access": {
|
||||
"you": "Your access",
|
||||
"person": "{{person}}'s access",
|
||||
"other": "Someone else's access",
|
||||
"owner": "The owner's access",
|
||||
"member": "Each person's own {{service}} account (API and widget: yours)",
|
||||
"memberNoService": "Each person's own account (API and widget: yours)",
|
||||
@@ -2418,6 +2419,7 @@
|
||||
"attachNote": "Tools, sources and prompts you add that the owner can't use run with your access for everyone who uses this agent. You need to own them or be able to edit them, and you'll be asked to confirm.",
|
||||
"publicLinkNote": "This agent has a public link, so anyone with the link can get answers from them.",
|
||||
"addedBy": "Added by {{person}}: {{names}}",
|
||||
"addedByOther": "Added by someone else: {{names}}",
|
||||
"unknownItem": "Unnamed item",
|
||||
"notAllowed": "You can't add {{names}} to this agent. The owner can't use them, and you can only share what you own or can edit.",
|
||||
"takeOver": "Run {{name}} with my access",
|
||||
@@ -2432,7 +2434,9 @@
|
||||
"ownerLostAccessYou": "You can no longer use {{name}}.",
|
||||
"ownerLostAccess": "The agent's owner can no longer use {{name}}.",
|
||||
"sponsorCannotEditAgent": "{{name}} ran with {{person}}'s access, and they can no longer edit this agent.",
|
||||
"sponsorCannotEditAgentOther": "{{name}} ran with someone else's access, and they can no longer edit this agent.",
|
||||
"sponsorCannotEditItem": "{{name}} ran with {{person}}'s access, and they can no longer edit it.",
|
||||
"sponsorCannotEditItemOther": "{{name}} ran with someone else's access, and they can no longer edit it.",
|
||||
"connectionNeedsReconnect": "{{name}} needs its {{service}} account signed in again.",
|
||||
"connectionRemoved": "The {{service}} account {{name}} used was removed.",
|
||||
"connectorDisabled": "An admin turned off {{service}}, so {{name}} can't run.",
|
||||
@@ -2457,9 +2461,6 @@
|
||||
"source": "Source {{id}}",
|
||||
"prompt": "Prompt {{id}}"
|
||||
},
|
||||
"note": {
|
||||
"perUserAccount": "Each person uses their own account"
|
||||
},
|
||||
"chip": "Not running: {{count}}"
|
||||
},
|
||||
"sponsorConfirm": {
|
||||
|
||||
@@ -773,6 +773,7 @@
|
||||
"access": {
|
||||
"you": "Tu acceso",
|
||||
"person": "Acceso de {{person}}",
|
||||
"other": "Acceso de otra persona",
|
||||
"owner": "Acceso del propietario",
|
||||
"member": "La propia cuenta de {{service}} de cada persona (API y widget: la tuya)",
|
||||
"memberNoService": "La propia cuenta de cada persona (API y widget: la tuya)",
|
||||
@@ -2400,6 +2401,7 @@
|
||||
"attachNote": "Las herramientas, fuentes y prompts que añadas y que el propietario no pueda usar se ejecutan con tu acceso para todos los que usen este agente. Debes ser su propietario o poder editarlos, y se te pedirá que lo confirmes.",
|
||||
"publicLinkNote": "Este agente tiene un enlace público, así que cualquiera con el enlace puede obtener respuestas de ellos.",
|
||||
"addedBy": "Añadido por {{person}}: {{names}}",
|
||||
"addedByOther": "Añadido por otra persona: {{names}}",
|
||||
"unknownItem": "Elemento sin nombre",
|
||||
"notAllowed": "No puedes añadir {{names}} a este agente. El propietario no puede usarlos y solo puedes compartir lo que es tuyo o puedes editar.",
|
||||
"takeOver": "Ejecutar {{name}} con mi acceso",
|
||||
@@ -2414,7 +2416,9 @@
|
||||
"ownerLostAccessYou": "Ya no puedes usar {{name}}.",
|
||||
"ownerLostAccess": "El propietario del agente ya no puede usar {{name}}.",
|
||||
"sponsorCannotEditAgent": "{{name}} se ejecutaba con el acceso de {{person}}, que ya no puede editar este agente.",
|
||||
"sponsorCannotEditAgentOther": "{{name}} se ejecutaba con el acceso de otra persona, que ya no puede editar este agente.",
|
||||
"sponsorCannotEditItem": "{{name}} se ejecutaba con el acceso de {{person}}, que ya no puede editarlo.",
|
||||
"sponsorCannotEditItemOther": "{{name}} se ejecutaba con el acceso de otra persona, que ya no puede editarlo.",
|
||||
"connectionNeedsReconnect": "{{name}} necesita que su cuenta de {{service}} vuelva a iniciar sesión.",
|
||||
"connectionRemoved": "Se eliminó la cuenta de {{service}} que usaba {{name}}.",
|
||||
"connectorDisabled": "Un administrador desactivó {{service}}, así que {{name}} no puede ejecutarse.",
|
||||
@@ -2439,9 +2443,6 @@
|
||||
"source": "Fuente {{id}}",
|
||||
"prompt": "Prompt {{id}}"
|
||||
},
|
||||
"note": {
|
||||
"perUserAccount": "Cada persona usa su propia cuenta"
|
||||
},
|
||||
"chip": "Sin ejecutar: {{count}}"
|
||||
},
|
||||
"sponsorConfirm": {
|
||||
|
||||
@@ -772,6 +772,7 @@
|
||||
"access": {
|
||||
"you": "あなたのアクセス",
|
||||
"person": "{{person}} のアクセス",
|
||||
"other": "他の人のアクセス",
|
||||
"owner": "オーナーのアクセス",
|
||||
"member": "各自の {{service}} アカウント(API とウィジェット:あなたのもの)",
|
||||
"memberNoService": "各自のアカウント(API とウィジェット:あなたのもの)",
|
||||
@@ -2385,6 +2386,7 @@
|
||||
"attachNote": "オーナーが使用できないツール、ソース、プロンプトを追加すると、このエージェントを使うすべての人に対してあなたのアクセス権で実行されます。自分が所有しているか編集できるものに限られ、追加時に確認を求められます。",
|
||||
"publicLinkNote": "このエージェントには公開リンクがあるため、リンクを知っている人は誰でもそれらから回答を得られます。",
|
||||
"addedBy": "{{person}} が追加: {{names}}",
|
||||
"addedByOther": "他の人が追加: {{names}}",
|
||||
"unknownItem": "名前のない項目",
|
||||
"notAllowed": "{{names}} をこのエージェントに追加できません。オーナーはそれらを使用できず、共有できるのは自分が所有しているか編集できるものだけです。",
|
||||
"takeOver": "{{name}} を自分のアクセス権で実行",
|
||||
@@ -2399,7 +2401,9 @@
|
||||
"ownerLostAccessYou": "{{name}} を使用できなくなりました。",
|
||||
"ownerLostAccess": "エージェントの所有者は {{name}} を使用できなくなりました。",
|
||||
"sponsorCannotEditAgent": "{{name}} は {{person}} のアクセス権で実行されていましたが、この人はこのエージェントを編集できなくなりました。",
|
||||
"sponsorCannotEditAgentOther": "{{name}} は他の人のアクセス権で実行されていましたが、この人はこのエージェントを編集できなくなりました。",
|
||||
"sponsorCannotEditItem": "{{name}} は {{person}} のアクセス権で実行されていましたが、この人はそれを編集できなくなりました。",
|
||||
"sponsorCannotEditItemOther": "{{name}} は他の人のアクセス権で実行されていましたが、この人はそれを編集できなくなりました。",
|
||||
"connectionNeedsReconnect": "{{name}} の {{service}} アカウントに再度サインインする必要があります。",
|
||||
"connectionRemoved": "{{name}} が使っていた {{service}} アカウントは削除されました。",
|
||||
"connectorDisabled": "管理者が {{service}} をオフにしたため、{{name}} は実行できません。",
|
||||
@@ -2424,9 +2428,6 @@
|
||||
"source": "ソース {{id}}",
|
||||
"prompt": "プロンプト {{id}}"
|
||||
},
|
||||
"note": {
|
||||
"perUserAccount": "各自が自分のアカウントを使用します"
|
||||
},
|
||||
"chip": "実行されていません: {{count}}"
|
||||
},
|
||||
"sponsorConfirm": {
|
||||
|
||||
@@ -817,6 +817,7 @@
|
||||
"access": {
|
||||
"you": "Ваш доступ",
|
||||
"person": "Доступ {{person}}",
|
||||
"other": "Доступ другого пользователя",
|
||||
"owner": "Доступ владельца",
|
||||
"member": "Собственный аккаунт {{service}} у каждого (API и виджет: ваш)",
|
||||
"memberNoService": "Собственный аккаунт у каждого (API и виджет: ваш)",
|
||||
@@ -2492,6 +2493,7 @@
|
||||
"attachNote": "Инструменты, источники и промпты, которые вы добавляете и которые владелец не может использовать, работают с вашим доступом для всех, кто пользуется этим агентом. Вы должны быть их владельцем или иметь право их редактировать, и вас попросят это подтвердить.",
|
||||
"publicLinkNote": "У этого агента есть публичная ссылка, поэтому любой, у кого она есть, может получать ответы на их основе.",
|
||||
"addedBy": "Добавил(а) {{person}}: {{names}}",
|
||||
"addedByOther": "Добавил(а) другой пользователь: {{names}}",
|
||||
"unknownItem": "Элемент без названия",
|
||||
"notAllowed": "Вы не можете добавить {{names}} к этому агенту. Владелец не может их использовать, а делиться можно только тем, чем вы владеете или что можете редактировать.",
|
||||
"takeOver": "Запускать {{name}} с моим доступом",
|
||||
@@ -2506,7 +2508,9 @@
|
||||
"ownerLostAccessYou": "Вы больше не можете использовать {{name}}.",
|
||||
"ownerLostAccess": "Владелец агента больше не может использовать {{name}}.",
|
||||
"sponsorCannotEditAgent": "{{name}} работал с доступом {{person}}, а этот человек больше не может редактировать агента.",
|
||||
"sponsorCannotEditAgentOther": "{{name}} работал с доступом другого пользователя, а этот человек больше не может редактировать агента.",
|
||||
"sponsorCannotEditItem": "{{name}} работал с доступом {{person}}, а этот человек больше не может его редактировать.",
|
||||
"sponsorCannotEditItemOther": "{{name}} работал с доступом другого пользователя, а этот человек больше не может его редактировать.",
|
||||
"connectionNeedsReconnect": "Для {{name}} нужно снова войти в аккаунт {{service}}.",
|
||||
"connectionRemoved": "Аккаунт {{service}}, который использовал {{name}}, удалён.",
|
||||
"connectorDisabled": "Администратор отключил {{service}}, поэтому {{name}} не может работать.",
|
||||
@@ -2531,9 +2535,6 @@
|
||||
"source": "Источник {{id}}",
|
||||
"prompt": "Промпт {{id}}"
|
||||
},
|
||||
"note": {
|
||||
"perUserAccount": "Каждый использует свой аккаунт"
|
||||
},
|
||||
"chip": "Не работает: {{count}}"
|
||||
},
|
||||
"sponsorConfirm": {
|
||||
|
||||
@@ -772,6 +772,7 @@
|
||||
"access": {
|
||||
"you": "你的存取權限",
|
||||
"person": "{{person}} 的存取權限",
|
||||
"other": "其他人的存取權限",
|
||||
"owner": "擁有者的存取權限",
|
||||
"member": "每個人自己的 {{service}} 帳號(API 和小工具:你的)",
|
||||
"memberNoService": "每個人自己的帳號(API 和小工具:你的)",
|
||||
@@ -2385,6 +2386,7 @@
|
||||
"attachNote": "你新增的、擁有者無法使用的工具、來源和提示詞,會以你的存取權限為所有使用此智慧代理的人執行。你必須擁有它們或能夠編輯它們,並且需要確認。",
|
||||
"publicLinkNote": "此智慧代理有公開連結,任何擁有該連結的人都可以從中取得回答。",
|
||||
"addedBy": "由 {{person}} 新增:{{names}}",
|
||||
"addedByOther": "由其他人新增:{{names}}",
|
||||
"unknownItem": "未命名項目",
|
||||
"notAllowed": "無法將 {{names}} 新增到此智慧代理。擁有者無法使用它們,而你只能分享自己擁有或可以編輯的項目。",
|
||||
"takeOver": "以我的存取權限執行 {{name}}",
|
||||
@@ -2399,7 +2401,9 @@
|
||||
"ownerLostAccessYou": "你已無法使用 {{name}}。",
|
||||
"ownerLostAccess": "代理的擁有者已無法使用 {{name}}。",
|
||||
"sponsorCannotEditAgent": "{{name}} 先前以 {{person}} 的存取權限執行,而對方已無法編輯此代理。",
|
||||
"sponsorCannotEditAgentOther": "{{name}} 先前以其他人的存取權限執行,而對方已無法編輯此代理。",
|
||||
"sponsorCannotEditItem": "{{name}} 先前以 {{person}} 的存取權限執行,而對方已無法編輯它。",
|
||||
"sponsorCannotEditItemOther": "{{name}} 先前以其他人的存取權限執行,而對方已無法編輯它。",
|
||||
"connectionNeedsReconnect": "{{name}} 的 {{service}} 帳戶需要重新登入。",
|
||||
"connectionRemoved": "{{name}} 使用的 {{service}} 帳戶已被移除。",
|
||||
"connectorDisabled": "管理員已關閉 {{service}},因此 {{name}} 無法執行。",
|
||||
@@ -2424,9 +2428,6 @@
|
||||
"source": "來源 {{id}}",
|
||||
"prompt": "提示詞 {{id}}"
|
||||
},
|
||||
"note": {
|
||||
"perUserAccount": "每個人使用自己的帳戶"
|
||||
},
|
||||
"chip": "未在執行:{{count}}"
|
||||
},
|
||||
"sponsorConfirm": {
|
||||
|
||||
@@ -772,6 +772,7 @@
|
||||
"access": {
|
||||
"you": "你的访问权限",
|
||||
"person": "{{person}} 的访问权限",
|
||||
"other": "其他人的访问权限",
|
||||
"owner": "所有者的访问权限",
|
||||
"member": "每个人自己的 {{service}} 账号(API 和小组件:你的)",
|
||||
"memberNoService": "每个人自己的账号(API 和小组件:你的)",
|
||||
@@ -2385,6 +2386,7 @@
|
||||
"attachNote": "你添加的、所有者无法使用的工具、来源和提示词,会以你的访问权限为所有使用此智能体的人运行。你必须拥有它们或能够编辑它们,并且需要确认。",
|
||||
"publicLinkNote": "此智能体有公开链接,任何拥有该链接的人都可以从中获得回答。",
|
||||
"addedBy": "由 {{person}} 添加:{{names}}",
|
||||
"addedByOther": "由其他人添加:{{names}}",
|
||||
"unknownItem": "未命名项目",
|
||||
"notAllowed": "无法将 {{names}} 添加到此智能体。所有者无法使用它们,而你只能共享自己拥有或可以编辑的项目。",
|
||||
"takeOver": "以我的访问权限运行 {{name}}",
|
||||
@@ -2399,7 +2401,9 @@
|
||||
"ownerLostAccessYou": "你已无法使用 {{name}}。",
|
||||
"ownerLostAccess": "智能体的所有者已无法使用 {{name}}。",
|
||||
"sponsorCannotEditAgent": "{{name}} 此前以 {{person}} 的访问权限运行,而其已无法编辑此智能体。",
|
||||
"sponsorCannotEditAgentOther": "{{name}} 此前以其他人的访问权限运行,而其已无法编辑此智能体。",
|
||||
"sponsorCannotEditItem": "{{name}} 此前以 {{person}} 的访问权限运行,而其已无法编辑它。",
|
||||
"sponsorCannotEditItemOther": "{{name}} 此前以其他人的访问权限运行,而其已无法编辑它。",
|
||||
"connectionNeedsReconnect": "{{name}} 的 {{service}} 账户需要重新登录。",
|
||||
"connectionRemoved": "{{name}} 使用的 {{service}} 账户已被移除。",
|
||||
"connectorDisabled": "管理员已关闭 {{service}},因此 {{name}} 无法运行。",
|
||||
@@ -2424,9 +2428,6 @@
|
||||
"source": "来源 {{id}}",
|
||||
"prompt": "提示词 {{id}}"
|
||||
},
|
||||
"note": {
|
||||
"perUserAccount": "每个人使用自己的账户"
|
||||
},
|
||||
"chip": "未在运行:{{count}}"
|
||||
},
|
||||
"sponsorConfirm": {
|
||||
|
||||
Reference in new issue
Block a user