@truefoundry/trueforge-ui 0.3.0-rc.1 → 0.3.0-rc.3
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/CHANGELOG.md +70 -0
- package/README.md +22 -7
- package/dist/{AgentCodeSnippets-NZOFJE57.js → AgentCodeSnippets-N546FNNS.js} +38 -23
- package/dist/AgentCodeSnippets-N546FNNS.js.map +1 -0
- package/dist/AgentMetricChart-YWJYVYYA.js +15 -0
- package/dist/{AgentOverview-EEBHJC32.js → AgentOverview-VF74XC7I.js} +7 -7
- package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-RFR6LQMY.js} +19 -10
- package/dist/AgentSessionEventTimeline-RFR6LQMY.js.map +1 -0
- package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-27CQF6FX.js} +144 -57
- package/dist/AgentSessionEventTimelineChart-27CQF6FX.js.map +1 -0
- package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-4IVX2SGD.js} +36 -12
- package/dist/AgentSessions-4IVX2SGD.js.map +1 -0
- package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-R5VEP7BO.js} +162 -126
- package/dist/ConnectorSettings-R5VEP7BO.js.map +1 -0
- package/dist/{DockLayout-LM4AFMFY.js → DockLayout-F44RWGEY.js} +10 -10
- package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-SQ323AVM.js} +14 -12
- package/dist/DrawerLayout-SQ323AVM.js.map +1 -0
- package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-6QLS63HM.js} +22 -28
- package/dist/ModelSettings-6QLS63HM.js.map +1 -0
- package/dist/OpenUiFenceBlock-4ROX3G4X.js +9 -0
- package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-OLKDXIQS.js} +17 -21
- package/dist/SandboxSettings-OLKDXIQS.js.map +1 -0
- package/dist/SchedulesPage-TMOTK6DR.js +15 -0
- package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-GISAH2WU.js} +8 -8
- package/dist/{ShellRouteSync-CEBETGEJ.js → ShellRouteSync-EN33DUQ7.js} +171 -26
- package/dist/ShellRouteSync-EN33DUQ7.js.map +1 -0
- package/dist/{SidebarLayout-A2HJPPHS.js → SidebarLayout-35K4AKTC.js} +80 -58
- package/dist/SidebarLayout-35K4AKTC.js.map +1 -0
- package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-JSX2BTII.js} +24 -22
- package/dist/SkillSettings-JSX2BTII.js.map +1 -0
- package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-6VCR7ES3.js} +9 -9
- package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-RKBSN2FZ.js} +10 -10
- package/dist/{chunk-ZTMKFZQ3.js → chunk-2O5EJ6QS.js} +4440 -3042
- package/dist/chunk-2O5EJ6QS.js.map +1 -0
- package/dist/chunk-6WCIL3H2.js +517 -0
- package/dist/chunk-6WCIL3H2.js.map +1 -0
- package/dist/{chunk-WVE3F724.js → chunk-73FQVITT.js} +21 -4
- package/dist/chunk-73FQVITT.js.map +1 -0
- package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
- package/dist/chunk-7AAO4UDQ.js.map +1 -0
- package/dist/{chunk-CYHJDKFB.js → chunk-F5QVQIBH.js} +172 -46
- package/dist/chunk-F5QVQIBH.js.map +1 -0
- package/dist/{chunk-FJW36PD7.js → chunk-GIPFF6FZ.js} +28 -24
- package/dist/chunk-GIPFF6FZ.js.map +1 -0
- package/dist/{chunk-6O6FWUDW.js → chunk-GSJAYYLR.js} +233 -195
- package/dist/chunk-GSJAYYLR.js.map +1 -0
- package/dist/{chunk-MPNSO7E6.js → chunk-J5BPHEDT.js} +2 -2
- package/dist/chunk-KR7WYHVF.js +195 -0
- package/dist/chunk-KR7WYHVF.js.map +1 -0
- package/dist/{chunk-DMMZSZTN.js → chunk-LUG7E6BL.js} +60 -16
- package/dist/chunk-LUG7E6BL.js.map +1 -0
- package/dist/chunk-LXJMINS6.js +587 -0
- package/dist/chunk-LXJMINS6.js.map +1 -0
- package/dist/{chunk-U7KURWW3.js → chunk-PT4EENB3.js} +244 -52
- package/dist/chunk-PT4EENB3.js.map +1 -0
- package/dist/{chunk-XAU7QFG3.js → chunk-Q6TCT7ZJ.js} +68 -256
- package/dist/chunk-Q6TCT7ZJ.js.map +1 -0
- package/dist/{chunk-ZKNUMH2M.js → chunk-XLFOXQKZ.js} +13 -11
- package/dist/chunk-XLFOXQKZ.js.map +1 -0
- package/dist/{chunk-M62XY4NC.js → chunk-XY6LZQES.js} +235 -108
- package/dist/chunk-XY6LZQES.js.map +1 -0
- package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
- package/dist/index.d.ts +316 -94
- package/dist/index.js +65 -488
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +36 -13
- package/dist/plugins/trueforge-agent-server-adapter/index.js +69 -34
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -4
- package/dist/AgentCodeSnippets-NZOFJE57.js.map +0 -1
- package/dist/AgentMetricChart-JPU3MFQ2.js +0 -15
- package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
- package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
- package/dist/AgentSessions-3MPDZASK.js.map +0 -1
- package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
- package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
- package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
- package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
- package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
- package/dist/SchedulesPage-KKLUDO6B.js +0 -15
- package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
- package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
- package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
- package/dist/chunk-2XPPBEYF.js +0 -74
- package/dist/chunk-2XPPBEYF.js.map +0 -1
- package/dist/chunk-6O6FWUDW.js.map +0 -1
- package/dist/chunk-7Z2C2K7F.js +0 -578
- package/dist/chunk-7Z2C2K7F.js.map +0 -1
- package/dist/chunk-CYHJDKFB.js.map +0 -1
- package/dist/chunk-DMMZSZTN.js.map +0 -1
- package/dist/chunk-FJW36PD7.js.map +0 -1
- package/dist/chunk-M62XY4NC.js.map +0 -1
- package/dist/chunk-QC42MLAK.js.map +0 -1
- package/dist/chunk-SFZNIO6U.js +0 -18
- package/dist/chunk-SFZNIO6U.js.map +0 -1
- package/dist/chunk-U7KURWW3.js.map +0 -1
- package/dist/chunk-WVE3F724.js.map +0 -1
- package/dist/chunk-XAU7QFG3.js.map +0 -1
- package/dist/chunk-ZKNUMH2M.js.map +0 -1
- package/dist/chunk-ZTMKFZQ3.js.map +0 -1
- /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-YWJYVYYA.js.map} +0 -0
- /package/dist/{AgentOverview-EEBHJC32.js.map → AgentOverview-VF74XC7I.js.map} +0 -0
- /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-F44RWGEY.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-4ROX3G4X.js.map} +0 -0
- /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-TMOTK6DR.js.map} +0 -0
- /package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-GISAH2WU.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-6VCR7ES3.js.map} +0 -0
- /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-RKBSN2FZ.js.map} +0 -0
- /package/dist/{chunk-MPNSO7E6.js.map → chunk-J5BPHEDT.js.map} +0 -0
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createTrueFoundryServer
|
|
3
|
-
} from "../../chunk-
|
|
4
|
-
import {
|
|
5
|
-
drainListPages
|
|
6
|
-
} from "../../chunk-SFZNIO6U.js";
|
|
3
|
+
} from "../../chunk-7AAO4UDQ.js";
|
|
7
4
|
import {
|
|
8
5
|
readSessionIsCreateAgent
|
|
9
6
|
} from "../../chunk-RDXBMTP5.js";
|
|
@@ -116,7 +113,10 @@ function toUiMcpServer(server) {
|
|
|
116
113
|
return server;
|
|
117
114
|
}
|
|
118
115
|
function toUiSkill(skill) {
|
|
119
|
-
return { name: skill.name };
|
|
116
|
+
return { name: skill.name, preload: skill.preload === true };
|
|
117
|
+
}
|
|
118
|
+
function toHarnessSkill(skill) {
|
|
119
|
+
return { name: skill.id ?? skill.name, preload: skill.preload === true };
|
|
120
120
|
}
|
|
121
121
|
function toHarnessAgentSpec(spec) {
|
|
122
122
|
const { skills, mcpServers, ...rest } = spec;
|
|
@@ -132,7 +132,7 @@ function toHarnessAgentSpec(spec) {
|
|
|
132
132
|
return server;
|
|
133
133
|
})
|
|
134
134
|
},
|
|
135
|
-
...skills === void 0 ? {} : { skills: skills.map(
|
|
135
|
+
...skills === void 0 ? {} : { skills: skills.map(toHarnessSkill) }
|
|
136
136
|
};
|
|
137
137
|
}
|
|
138
138
|
function toUiAgentSpec(spec) {
|
|
@@ -237,7 +237,8 @@ function createHarnessChatServer(options = {}) {
|
|
|
237
237
|
...request.limit === void 0 ? {} : { limit: request.limit },
|
|
238
238
|
...request.order === void 0 ? {} : { order: request.order },
|
|
239
239
|
...request.pageToken === void 0 ? {} : { pageToken: request.pageToken },
|
|
240
|
-
...request.agentId === void 0 || request.agentId.length === 0 ? {} : { agentId: request.agentId }
|
|
240
|
+
...request.agentId === void 0 || request.agentId.length === 0 ? {} : { agentId: request.agentId },
|
|
241
|
+
...request.createdByMe === void 0 ? {} : { createdByMe: request.createdByMe }
|
|
241
242
|
});
|
|
242
243
|
return toListResult(page, toUiSession);
|
|
243
244
|
},
|
|
@@ -326,12 +327,13 @@ function toSessionListEntry(session) {
|
|
|
326
327
|
isMutable: session.agent.type === "inline",
|
|
327
328
|
metrics: {
|
|
328
329
|
totalTurns: session.metrics.totalTurns,
|
|
329
|
-
totalCostInUsd: session.metrics.totalCostInUsd,
|
|
330
|
+
...session.metrics.totalCostInUsd == null ? {} : { totalCostInUsd: session.metrics.totalCostInUsd },
|
|
330
331
|
totalDurationMs: session.metrics.totalDurationMs
|
|
331
332
|
},
|
|
332
333
|
...session.title === null ? {} : { title: session.title },
|
|
333
334
|
...session.agent.type === "reference" && session.agent.name !== null ? { agentName: session.agent.name } : {},
|
|
334
|
-
...session.agent.type === "inline" ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}
|
|
335
|
+
...session.agent.type === "inline" ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {},
|
|
336
|
+
...session.source?.type === "schedule" ? { sourceType: session.source.type } : {}
|
|
335
337
|
};
|
|
336
338
|
}
|
|
337
339
|
function createHarnessAgentSessionsServer(options = {}) {
|
|
@@ -346,7 +348,11 @@ function createHarnessAgentSessionsServer(options = {}) {
|
|
|
346
348
|
};
|
|
347
349
|
},
|
|
348
350
|
async getCodeSnippets({ agentId }) {
|
|
349
|
-
const
|
|
351
|
+
const absoluteBaseUrl = resolveTrueForgeBaseUrl(options.baseUrl ?? "/").replace(/\/$/, "");
|
|
352
|
+
const { data } = await client.internal.agents.getCodeSnippets(
|
|
353
|
+
agentId,
|
|
354
|
+
/^https?:\/\//i.test(absoluteBaseUrl) ? { baseUrl: absoluteBaseUrl } : void 0
|
|
355
|
+
);
|
|
350
356
|
return data.snippets;
|
|
351
357
|
},
|
|
352
358
|
async listSessions(requestParams = {}) {
|
|
@@ -356,7 +362,8 @@ function createHarnessAgentSessionsServer(options = {}) {
|
|
|
356
362
|
...requestParams.pageToken === void 0 ? {} : { pageToken: requestParams.pageToken },
|
|
357
363
|
...requestParams.startTimestamp === void 0 ? {} : { startTimestamp: parseIsoDate(requestParams.startTimestamp) },
|
|
358
364
|
...requestParams.endTimestamp === void 0 ? {} : { endTimestamp: parseIsoDate(requestParams.endTimestamp) },
|
|
359
|
-
...requestParams.agentId === void 0 || requestParams.agentId.length === 0 ? {} : { agentId: requestParams.agentId }
|
|
365
|
+
...requestParams.agentId === void 0 || requestParams.agentId.length === 0 ? {} : { agentId: requestParams.agentId },
|
|
366
|
+
...requestParams.createdByMe === void 0 ? {} : { createdByMe: requestParams.createdByMe }
|
|
360
367
|
});
|
|
361
368
|
return toListResult(page, toSessionListEntry);
|
|
362
369
|
},
|
|
@@ -410,10 +417,21 @@ function toUiCatalogEntry(server) {
|
|
|
410
417
|
auth: toUiAuthPublic(server.auth)
|
|
411
418
|
};
|
|
412
419
|
}
|
|
420
|
+
function toUiToolAnnotations(value) {
|
|
421
|
+
if (typeof value !== "object" || value === null) return void 0;
|
|
422
|
+
const readOnlyHint = Reflect.get(value, "readOnlyHint");
|
|
423
|
+
const destructiveHint = Reflect.get(value, "destructiveHint");
|
|
424
|
+
const annotations = {
|
|
425
|
+
...typeof readOnlyHint === "boolean" ? { readOnlyHint } : {},
|
|
426
|
+
...typeof destructiveHint === "boolean" ? { destructiveHint } : {}
|
|
427
|
+
};
|
|
428
|
+
return Object.keys(annotations).length > 0 ? annotations : void 0;
|
|
429
|
+
}
|
|
413
430
|
function toUiTool(tool) {
|
|
414
431
|
const name = typeof tool.name === "string" && tool.name !== "" ? tool.name : "tool";
|
|
415
432
|
const description = typeof tool.description === "string" ? tool.description : "";
|
|
416
|
-
|
|
433
|
+
const annotations = toUiToolAnnotations(Reflect.get(tool, "annotations"));
|
|
434
|
+
return annotations === void 0 ? { id: name, name, description } : { id: name, name, description, annotations };
|
|
417
435
|
}
|
|
418
436
|
function toUiConnector(server) {
|
|
419
437
|
const auth = toUiAuthPublic(server.manifest.auth);
|
|
@@ -554,17 +572,9 @@ async function listModels(client) {
|
|
|
554
572
|
const body = await client.models.list();
|
|
555
573
|
return body.data;
|
|
556
574
|
}
|
|
557
|
-
async function listConfiguredMcpServersPage(client, req = {}) {
|
|
558
|
-
const page = await client.mcpServers.list({
|
|
559
|
-
...req.limit === void 0 ? {} : { limit: req.limit },
|
|
560
|
-
...req.pageToken === void 0 ? {} : { pageToken: req.pageToken }
|
|
561
|
-
});
|
|
562
|
-
return toListResult(page, (server) => server);
|
|
563
|
-
}
|
|
564
575
|
async function listConfiguredMcpServers(client) {
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
});
|
|
576
|
+
const body = await client.mcpServers.list();
|
|
577
|
+
return body.data;
|
|
568
578
|
}
|
|
569
579
|
async function listSkills(client) {
|
|
570
580
|
const body = await client.skills.list();
|
|
@@ -631,17 +641,31 @@ function createHarnessBuilderServer(options = {}) {
|
|
|
631
641
|
});
|
|
632
642
|
},
|
|
633
643
|
// Skills require a configured sandbox provider; keep the picker empty when skill capability is off.
|
|
644
|
+
// Catalog AvailableSkill.name is store identity (FQN in TFY). Picker `id` copies that
|
|
645
|
+
// attach key; `name` is displayName so the draft can show a label without losing the wire key.
|
|
646
|
+
// Draft mounts `{ id, name }`; toHarnessSkill admits AgentSpec.skills[].name = id ?? name.
|
|
634
647
|
getSkills: async () => {
|
|
635
648
|
const skills = await listSkills(client);
|
|
636
|
-
return skills.map((skill) =>
|
|
649
|
+
return skills.map((skill) => {
|
|
650
|
+
const { display_name, repository_name, version: versionRaw } = skill.metadata ?? {};
|
|
651
|
+
const version = Number(versionRaw);
|
|
652
|
+
const hasVersion = Number.isInteger(version) && version > 0;
|
|
653
|
+
return {
|
|
654
|
+
id: skill.name,
|
|
655
|
+
name: display_name ?? skill.name,
|
|
656
|
+
description: skill.description,
|
|
657
|
+
...repository_name === void 0 ? {} : { skillRepoName: repository_name },
|
|
658
|
+
...hasVersion ? {
|
|
659
|
+
version,
|
|
660
|
+
loadVersions: async () => (await client.skills.listVersions({ name: skill.name })).data
|
|
661
|
+
} : {}
|
|
662
|
+
};
|
|
663
|
+
});
|
|
637
664
|
},
|
|
638
665
|
getMcp: async () => (await listConfiguredMcpServers(client)).map(toUiConnectorFromReadEntry),
|
|
639
|
-
|
|
640
|
-
const
|
|
641
|
-
return
|
|
642
|
-
data: page.data.map(toUiConnectorFromReadEntry),
|
|
643
|
-
...page.nextPageToken === void 0 ? {} : { nextPageToken: page.nextPageToken }
|
|
644
|
-
};
|
|
666
|
+
getMcpConnector: async ({ connectorId }) => {
|
|
667
|
+
const body = await client.mcpServers.get(connectorId);
|
|
668
|
+
return toUiConnectorFromReadEntry(body.data);
|
|
645
669
|
},
|
|
646
670
|
getMcpTools: async ({ connectorId }) => {
|
|
647
671
|
const body = await client.mcpServers.listTools(connectorId);
|
|
@@ -957,10 +981,12 @@ function toHarnessManifest3(req) {
|
|
|
957
981
|
};
|
|
958
982
|
}
|
|
959
983
|
function toUiSkill2(skill, catalogNames) {
|
|
984
|
+
const manifest = skill.manifest;
|
|
985
|
+
const displayName = "displayName" in manifest && typeof manifest.displayName === "string" ? manifest.displayName : manifest.name;
|
|
960
986
|
const base = {
|
|
961
987
|
id: skill.name,
|
|
962
|
-
name:
|
|
963
|
-
description:
|
|
988
|
+
name: displayName,
|
|
989
|
+
description: manifest.description
|
|
964
990
|
};
|
|
965
991
|
if (catalogNames.has(skill.name)) {
|
|
966
992
|
return { ...base, catalogId: skill.name };
|
|
@@ -1005,6 +1031,14 @@ function createSkillCatalog(client) {
|
|
|
1005
1031
|
};
|
|
1006
1032
|
}
|
|
1007
1033
|
|
|
1034
|
+
// src/plugins/trueforge-agent-server-adapter/permissionsServer.ts
|
|
1035
|
+
function createHarnessPermissionsServer(options = {}) {
|
|
1036
|
+
const client = options.client ?? createTrueForgeClient(options);
|
|
1037
|
+
return {
|
|
1038
|
+
listPermissions: (request) => client.internal.listPermissions(request)
|
|
1039
|
+
};
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1008
1042
|
// src/plugins/trueforge-agent-server-adapter/schedules/scheduleServer.ts
|
|
1009
1043
|
var SCHEDULES_PAGE_LIMIT = 25;
|
|
1010
1044
|
async function loadAgentIndex(client) {
|
|
@@ -1127,7 +1161,7 @@ function createScheduleServer(options) {
|
|
|
1127
1161
|
|
|
1128
1162
|
// src/plugins/trueforge-agent-server-adapter/index.ts
|
|
1129
1163
|
function createTrueForgeAgentUIServer(options = {}) {
|
|
1130
|
-
const { catalog: catalogOverride, ...clientOptions } = options;
|
|
1164
|
+
const { catalog: catalogOverride, permissions, ...clientOptions } = options;
|
|
1131
1165
|
const client = createTrueForgeClient(clientOptions);
|
|
1132
1166
|
const catalog = catalogOverride ?? {
|
|
1133
1167
|
modelCatalog: createModelProviderCatalog(client),
|
|
@@ -1141,7 +1175,8 @@ function createTrueForgeAgentUIServer(options = {}) {
|
|
|
1141
1175
|
catalog,
|
|
1142
1176
|
sessions: createHarnessAgentSessionsServer({ ...clientOptions, client }),
|
|
1143
1177
|
metrics: createHarnessAgentMetricsServer({ ...clientOptions, client }),
|
|
1144
|
-
schedules: createScheduleServer({ client })
|
|
1178
|
+
schedules: createScheduleServer({ client }),
|
|
1179
|
+
permissions: permissions ?? createHarnessPermissionsServer({ client })
|
|
1145
1180
|
});
|
|
1146
1181
|
}
|
|
1147
1182
|
export {
|
|
@@ -1151,6 +1186,7 @@ export {
|
|
|
1151
1186
|
createHarnessAgentSessionsServer,
|
|
1152
1187
|
createHarnessBuilderServer,
|
|
1153
1188
|
createHarnessChatServer,
|
|
1189
|
+
createHarnessPermissionsServer,
|
|
1154
1190
|
createModelProviderCatalog,
|
|
1155
1191
|
createSandboxProviderCatalog,
|
|
1156
1192
|
createScheduleServer,
|
|
@@ -1160,7 +1196,6 @@ export {
|
|
|
1160
1196
|
filterUiSandboxProviders,
|
|
1161
1197
|
getCapabilities,
|
|
1162
1198
|
listConfiguredMcpServers,
|
|
1163
|
-
listConfiguredMcpServersPage,
|
|
1164
1199
|
listModels,
|
|
1165
1200
|
listSkills,
|
|
1166
1201
|
modelProviderLogosByName,
|