@truefoundry/trueforge-ui 0.1.0-rc.0 → 0.1.0-rc.2
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 +48 -0
- package/dist/{ConnectorSettings-CLBEWGQJ.js → ConnectorSettings-H37ZFC6Z.js} +36 -13
- package/dist/ConnectorSettings-H37ZFC6Z.js.map +1 -0
- package/dist/{DockLayout-WRF7EQLD.js → DockLayout-KEMFRWIR.js} +8 -8
- package/dist/{DrawerLayout-X2UXYTOS.js → DrawerLayout-ZVWCKEIS.js} +8 -8
- package/dist/{ModelSettings-IJ55QJQO.js → ModelSettings-QJMYHCMD.js} +8 -8
- package/dist/{ModelSettings-IJ55QJQO.js.map → ModelSettings-QJMYHCMD.js.map} +1 -1
- package/dist/OpenUiFenceBlock-XFBUGPKQ.js +9 -0
- package/dist/{SandboxSettings-S5XGZWOL.js → SandboxSettings-BUBMLW7Q.js} +160 -66
- package/dist/SandboxSettings-BUBMLW7Q.js.map +1 -0
- package/dist/{SettingsBuilder-64Y33NP3.js → SettingsBuilder-26XSGIHK.js} +25 -17
- package/dist/SettingsBuilder-26XSGIHK.js.map +1 -0
- package/dist/{SidebarLayout-M7HEOZVK.js → SidebarLayout-F3XFXW7B.js} +8 -8
- package/dist/{SkillSettings-MXK4ZEI7.js → SkillSettings-IRMGDFRG.js} +6 -6
- package/dist/{WidgetLayout-7MDOKLHU.js → WidgetLayout-SZMABKIR.js} +8 -8
- package/dist/{chunk-NBMP2XNL.js → chunk-7EEOWDLE.js} +7 -7
- package/dist/chunk-DTF7ZMUJ.js +567 -0
- package/dist/chunk-DTF7ZMUJ.js.map +1 -0
- package/dist/{chunk-UXZOL5GO.js → chunk-H7DR64W3.js} +47 -32
- package/dist/chunk-H7DR64W3.js.map +1 -0
- package/dist/{chunk-42GF723P.js → chunk-HT5HKQXE.js} +2 -2
- package/dist/{chunk-WFC3W4C3.js → chunk-LRQHHZDX.js} +4 -4
- package/dist/{chunk-XSHXH6EI.js → chunk-QGNLP2EE.js} +530 -519
- package/dist/chunk-QGNLP2EE.js.map +1 -0
- package/dist/{chunk-UHGSHDBM.js → chunk-XAZ5HJXV.js} +237 -8
- package/dist/chunk-XAZ5HJXV.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.js +115 -20
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +47 -37
- package/dist/plugins/trueforge-agent-server-adapter/index.js +74 -42
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/dist/ConnectorSettings-CLBEWGQJ.js.map +0 -1
- package/dist/OpenUiFenceBlock-SLLZSTMJ.js +0 -9
- package/dist/SandboxSettings-S5XGZWOL.js.map +0 -1
- package/dist/SettingsBuilder-64Y33NP3.js.map +0 -1
- package/dist/chunk-UBOFEI77.js +0 -567
- package/dist/chunk-UBOFEI77.js.map +0 -1
- package/dist/chunk-UHGSHDBM.js.map +0 -1
- package/dist/chunk-UXZOL5GO.js.map +0 -1
- package/dist/chunk-XSHXH6EI.js.map +0 -1
- /package/dist/{DockLayout-WRF7EQLD.js.map → DockLayout-KEMFRWIR.js.map} +0 -0
- /package/dist/{DrawerLayout-X2UXYTOS.js.map → DrawerLayout-ZVWCKEIS.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-SLLZSTMJ.js.map → OpenUiFenceBlock-XFBUGPKQ.js.map} +0 -0
- /package/dist/{SidebarLayout-M7HEOZVK.js.map → SidebarLayout-F3XFXW7B.js.map} +0 -0
- /package/dist/{SkillSettings-MXK4ZEI7.js.map → SkillSettings-IRMGDFRG.js.map} +0 -0
- /package/dist/{WidgetLayout-7MDOKLHU.js.map → WidgetLayout-SZMABKIR.js.map} +0 -0
- /package/dist/{chunk-NBMP2XNL.js.map → chunk-7EEOWDLE.js.map} +0 -0
- /package/dist/{chunk-42GF723P.js.map → chunk-HT5HKQXE.js.map} +0 -0
- /package/dist/{chunk-WFC3W4C3.js.map → chunk-LRQHHZDX.js.map} +0 -0
|
@@ -37,6 +37,7 @@ function toUiCatalogEntry(server) {
|
|
|
37
37
|
id: server.name,
|
|
38
38
|
name: server.name,
|
|
39
39
|
url: server.url,
|
|
40
|
+
description: server.description,
|
|
40
41
|
...server.logo === void 0 ? {} : { logo: server.logo },
|
|
41
42
|
auth: toUiAuthPublic(server.auth)
|
|
42
43
|
};
|
|
@@ -47,12 +48,12 @@ function toUiTool(tool) {
|
|
|
47
48
|
return { id: name, name, description };
|
|
48
49
|
}
|
|
49
50
|
function toUiConnector(server) {
|
|
50
|
-
const auth = toUiAuthPublic(server.auth);
|
|
51
|
+
const auth = toUiAuthPublic(server.manifest.auth);
|
|
51
52
|
return {
|
|
52
53
|
id: server.name,
|
|
53
54
|
name: server.name,
|
|
54
|
-
description: server.
|
|
55
|
-
url: server.url,
|
|
55
|
+
description: server.manifest.description,
|
|
56
|
+
url: server.manifest.url,
|
|
56
57
|
auth,
|
|
57
58
|
requiresAuth: server.authStatus.status === "auth_required",
|
|
58
59
|
authenticated: server.authStatus.status !== "auth_required"
|
|
@@ -72,9 +73,12 @@ function toUiConnectorFromReadEntry(server) {
|
|
|
72
73
|
}
|
|
73
74
|
function toHarnessManifest(req) {
|
|
74
75
|
const auth = toHarnessAuth(req.auth);
|
|
76
|
+
const trimmed = req.description?.trim();
|
|
75
77
|
return {
|
|
78
|
+
type: "remote",
|
|
76
79
|
name: req.name,
|
|
77
80
|
url: req.url,
|
|
81
|
+
description: trimmed !== void 0 && trimmed !== "" ? trimmed : `${req.name} MCP server`,
|
|
78
82
|
...auth === void 0 ? {} : { auth }
|
|
79
83
|
};
|
|
80
84
|
}
|
|
@@ -99,13 +103,13 @@ function createConnectorCatalog(client) {
|
|
|
99
103
|
throw new Error("API key is required for header-authenticated MCP servers");
|
|
100
104
|
}
|
|
101
105
|
const existing = await getConfigured(req.id);
|
|
102
|
-
if (existing.auth?.type !== "header") {
|
|
106
|
+
if (existing.manifest.auth?.type !== "header") {
|
|
103
107
|
throw new Error(`MCP server "${req.id}" has no stored header credentials to reuse`);
|
|
104
108
|
}
|
|
105
109
|
const preferredHeader = req.auth.headerName?.trim();
|
|
106
|
-
const storedHeaderName = Object.keys(existing.auth.headers)[0];
|
|
110
|
+
const storedHeaderName = Object.keys(existing.manifest.auth.headers)[0];
|
|
107
111
|
const headerName = preferredHeader !== void 0 && preferredHeader !== "" ? preferredHeader : storedHeaderName ?? DEFAULT_API_KEY_HEADER;
|
|
108
|
-
const stored = existing.auth.headers[headerName] ?? Object.values(existing.auth.headers)[0];
|
|
112
|
+
const stored = existing.manifest.auth.headers[headerName] ?? Object.values(existing.manifest.auth.headers)[0];
|
|
109
113
|
if (stored === void 0) {
|
|
110
114
|
throw new Error(`MCP server "${req.id}" has no stored header credentials to reuse`);
|
|
111
115
|
}
|
|
@@ -137,12 +141,26 @@ function createConnectorCatalog(client) {
|
|
|
137
141
|
},
|
|
138
142
|
createConnector: async (req) => {
|
|
139
143
|
const auth = await resolveWriteAuth({ auth: req.auth });
|
|
140
|
-
const body = await client.settings.mcpServers.create(
|
|
144
|
+
const body = await client.settings.mcpServers.create({
|
|
145
|
+
manifest: toHarnessManifest({
|
|
146
|
+
name: req.name,
|
|
147
|
+
url: req.url,
|
|
148
|
+
auth,
|
|
149
|
+
description: req.description
|
|
150
|
+
})
|
|
151
|
+
});
|
|
141
152
|
return toUiConnector(body.data);
|
|
142
153
|
},
|
|
143
154
|
updateConnector: async (req) => {
|
|
144
155
|
const auth = await resolveWriteAuth({ id: req.id, auth: req.auth });
|
|
145
|
-
const body = await client.settings.mcpServers.upsert(
|
|
156
|
+
const body = await client.settings.mcpServers.upsert({
|
|
157
|
+
manifest: toHarnessManifest({
|
|
158
|
+
name: req.id,
|
|
159
|
+
url: req.url,
|
|
160
|
+
auth,
|
|
161
|
+
description: req.description
|
|
162
|
+
})
|
|
163
|
+
});
|
|
146
164
|
return toUiConnector(body.data);
|
|
147
165
|
},
|
|
148
166
|
authenticateConnector: async (req) => {
|
|
@@ -154,7 +172,7 @@ function createConnectorCatalog(client) {
|
|
|
154
172
|
},
|
|
155
173
|
disconnectConnector: async (req) => {
|
|
156
174
|
const existing = await getConfigured(req.id);
|
|
157
|
-
if (existing.auth?.type !== "dcr") {
|
|
175
|
+
if (existing.manifest.auth?.type !== "dcr") {
|
|
158
176
|
throw new Error(`Disconnect is only supported for OAuth MCP servers`);
|
|
159
177
|
}
|
|
160
178
|
const body = await client.mcpServers.deleteAuthorize(req.id);
|
|
@@ -485,13 +503,13 @@ function toHarnessModelEntry(model) {
|
|
|
485
503
|
};
|
|
486
504
|
}
|
|
487
505
|
function toUiModelProvider(provider) {
|
|
488
|
-
const name
|
|
506
|
+
const { name, manifest } = provider;
|
|
489
507
|
return {
|
|
490
508
|
id: name,
|
|
491
|
-
type:
|
|
509
|
+
type: manifest.type,
|
|
492
510
|
name,
|
|
493
|
-
...
|
|
494
|
-
models:
|
|
511
|
+
...manifest.baseUrl === void 0 ? {} : { baseUrl: manifest.baseUrl },
|
|
512
|
+
models: manifest.models.map(toUiModelEntry)
|
|
495
513
|
};
|
|
496
514
|
}
|
|
497
515
|
function toUiCatalogModelProviderEntry(provider) {
|
|
@@ -551,11 +569,11 @@ function createModelProviderCatalog(client) {
|
|
|
551
569
|
throw new Error("API key is required");
|
|
552
570
|
}
|
|
553
571
|
const listed = await client.settings.modelProviders.list();
|
|
554
|
-
const existing = listed.data.find((provider) =>
|
|
572
|
+
const existing = listed.data.find((provider) => provider.name === req.id);
|
|
555
573
|
if (existing === void 0) {
|
|
556
574
|
throw new Error(`Model provider "${req.id}" not found`);
|
|
557
575
|
}
|
|
558
|
-
return existing.auth?.apiKey ?? "";
|
|
576
|
+
return existing.manifest.auth?.apiKey ?? "";
|
|
559
577
|
}
|
|
560
578
|
return {
|
|
561
579
|
getModelProviderCatalog: async () => {
|
|
@@ -568,28 +586,28 @@ function createModelProviderCatalog(client) {
|
|
|
568
586
|
},
|
|
569
587
|
createModelProvider: async (req) => {
|
|
570
588
|
const apiKey = await resolveApiKey({ type: req.type, apiKey: req.apiKey });
|
|
571
|
-
const body = await client.settings.modelProviders.create(
|
|
572
|
-
toHarnessModelProvider({
|
|
589
|
+
const body = await client.settings.modelProviders.create({
|
|
590
|
+
manifest: toHarnessModelProvider({
|
|
573
591
|
type: req.type,
|
|
574
592
|
name: req.name,
|
|
575
593
|
apiKey,
|
|
576
594
|
...req.baseUrl === void 0 ? {} : { baseUrl: req.baseUrl },
|
|
577
595
|
models: req.models
|
|
578
596
|
})
|
|
579
|
-
);
|
|
597
|
+
});
|
|
580
598
|
return toUiModelProvider(body.data);
|
|
581
599
|
},
|
|
582
600
|
updateModelProvider: async (req) => {
|
|
583
601
|
const apiKey = await resolveApiKey({ id: req.id, type: req.type, apiKey: req.apiKey });
|
|
584
|
-
const body = await client.settings.modelProviders.upsert(
|
|
585
|
-
toHarnessModelProvider({
|
|
602
|
+
const body = await client.settings.modelProviders.upsert({
|
|
603
|
+
manifest: toHarnessModelProvider({
|
|
586
604
|
type: req.type,
|
|
587
605
|
name: req.id,
|
|
588
606
|
apiKey,
|
|
589
607
|
...req.baseUrl === void 0 ? {} : { baseUrl: req.baseUrl },
|
|
590
608
|
models: req.models
|
|
591
609
|
})
|
|
592
|
-
);
|
|
610
|
+
});
|
|
593
611
|
return toUiModelProvider(body.data);
|
|
594
612
|
}
|
|
595
613
|
};
|
|
@@ -607,9 +625,6 @@ function displayNameForType(type) {
|
|
|
607
625
|
}
|
|
608
626
|
function configFromHarness(provider) {
|
|
609
627
|
return {
|
|
610
|
-
// Snapshot/image is now release-owned; the field is gone from the backend. The external
|
|
611
|
-
// SandboxProviderConfig still requires it, so send an empty placeholder until that type drops it.
|
|
612
|
-
snapshotName: "",
|
|
613
628
|
execTimeoutMs: provider.execTimeoutMs,
|
|
614
629
|
autoStopIntervalInMinutes: provider.autoStopIntervalInMinutes,
|
|
615
630
|
autoArchiveIntervalInMinutes: provider.autoArchiveIntervalInMinutes,
|
|
@@ -633,6 +648,27 @@ function toUiSandboxProvider(provider) {
|
|
|
633
648
|
...configFromHarness(provider)
|
|
634
649
|
};
|
|
635
650
|
}
|
|
651
|
+
function toUiSandboxProviderListEntry(response) {
|
|
652
|
+
return {
|
|
653
|
+
data: toUiSandboxProvider(response.manifest),
|
|
654
|
+
snapshotSyncStatus: {
|
|
655
|
+
status: response.status,
|
|
656
|
+
...response.statusReason ? { statusReason: response.statusReason } : {}
|
|
657
|
+
}
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
function filterUiSandboxProviders({
|
|
661
|
+
providers,
|
|
662
|
+
query
|
|
663
|
+
}) {
|
|
664
|
+
const normalizedQuery = query?.trim().toLowerCase();
|
|
665
|
+
if (normalizedQuery === void 0 || normalizedQuery === "") {
|
|
666
|
+
return providers;
|
|
667
|
+
}
|
|
668
|
+
return providers.filter(
|
|
669
|
+
(provider) => provider.data.name.toLowerCase().includes(normalizedQuery) || provider.data.id.toLowerCase().includes(normalizedQuery)
|
|
670
|
+
);
|
|
671
|
+
}
|
|
636
672
|
function toHarnessManifest2(req) {
|
|
637
673
|
if (req.type !== DAYTONA_TYPE) {
|
|
638
674
|
throw new Error(`Unsupported sandbox provider type: ${req.type}`);
|
|
@@ -664,7 +700,7 @@ function createSandboxProviderCatalog(client) {
|
|
|
664
700
|
let providers;
|
|
665
701
|
try {
|
|
666
702
|
const body = await client.settings.sandboxProviders.get();
|
|
667
|
-
providers = [
|
|
703
|
+
providers = [toUiSandboxProviderListEntry(body.data)];
|
|
668
704
|
} catch (err) {
|
|
669
705
|
if (err instanceof TrueForgeApi2.NotFoundError) {
|
|
670
706
|
providers = [];
|
|
@@ -672,17 +708,11 @@ function createSandboxProviderCatalog(client) {
|
|
|
672
708
|
throw err;
|
|
673
709
|
}
|
|
674
710
|
}
|
|
675
|
-
|
|
676
|
-
if (query === void 0 || query === "") {
|
|
677
|
-
return providers;
|
|
678
|
-
}
|
|
679
|
-
return providers.filter(
|
|
680
|
-
(provider) => provider.name.toLowerCase().includes(query) || provider.id.toLowerCase().includes(query)
|
|
681
|
-
);
|
|
711
|
+
return filterUiSandboxProviders({ providers, query: req?.query });
|
|
682
712
|
},
|
|
683
713
|
createSandboxProvider: async (req) => {
|
|
684
|
-
const body = await client.settings.sandboxProviders.upsert(
|
|
685
|
-
toHarnessManifest2({
|
|
714
|
+
const body = await client.settings.sandboxProviders.upsert({
|
|
715
|
+
manifest: toHarnessManifest2({
|
|
686
716
|
type: req.type,
|
|
687
717
|
apiKey: req.apiKey,
|
|
688
718
|
execTimeoutMs: req.execTimeoutMs,
|
|
@@ -690,13 +720,13 @@ function createSandboxProviderCatalog(client) {
|
|
|
690
720
|
autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,
|
|
691
721
|
autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes
|
|
692
722
|
})
|
|
693
|
-
);
|
|
723
|
+
});
|
|
694
724
|
return toUiSandboxProvider(body.data.manifest);
|
|
695
725
|
},
|
|
696
726
|
updateSandboxProvider: async (req) => {
|
|
697
727
|
const apiKey = await resolveApiKey(req.apiKey);
|
|
698
|
-
const body = await client.settings.sandboxProviders.upsert(
|
|
699
|
-
toHarnessManifest2({
|
|
728
|
+
const body = await client.settings.sandboxProviders.upsert({
|
|
729
|
+
manifest: toHarnessManifest2({
|
|
700
730
|
type: DAYTONA_TYPE,
|
|
701
731
|
apiKey,
|
|
702
732
|
execTimeoutMs: req.execTimeoutMs,
|
|
@@ -704,7 +734,7 @@ function createSandboxProviderCatalog(client) {
|
|
|
704
734
|
autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,
|
|
705
735
|
autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes
|
|
706
736
|
})
|
|
707
|
-
);
|
|
737
|
+
});
|
|
708
738
|
return toUiSandboxProvider(body.data.manifest);
|
|
709
739
|
}
|
|
710
740
|
};
|
|
@@ -736,7 +766,7 @@ function toUiSkill2(skill, catalogNames) {
|
|
|
736
766
|
const base = {
|
|
737
767
|
id: skill.name,
|
|
738
768
|
name: skill.name,
|
|
739
|
-
description: skill.description
|
|
769
|
+
description: skill.manifest.description
|
|
740
770
|
};
|
|
741
771
|
if (catalogNames.has(skill.name)) {
|
|
742
772
|
return { ...base, catalogId: skill.name };
|
|
@@ -762,20 +792,20 @@ function createSkillCatalog(client) {
|
|
|
762
792
|
);
|
|
763
793
|
},
|
|
764
794
|
createSkill: async (req) => {
|
|
765
|
-
const body = await client.settings.skills.create(toHarnessManifest3(req));
|
|
795
|
+
const body = await client.settings.skills.create({ manifest: toHarnessManifest3(req) });
|
|
766
796
|
const catalogId = "catalogId" in req ? req.catalogId : void 0;
|
|
767
797
|
if (catalogId !== void 0) {
|
|
768
798
|
return {
|
|
769
799
|
id: body.data.name,
|
|
770
800
|
name: body.data.name,
|
|
771
|
-
description: body.data.description,
|
|
801
|
+
description: body.data.manifest.description,
|
|
772
802
|
catalogId
|
|
773
803
|
};
|
|
774
804
|
}
|
|
775
805
|
return {
|
|
776
806
|
id: body.data.name,
|
|
777
807
|
name: body.data.name,
|
|
778
|
-
description: body.data.description
|
|
808
|
+
description: body.data.manifest.description
|
|
779
809
|
};
|
|
780
810
|
}
|
|
781
811
|
};
|
|
@@ -807,6 +837,7 @@ export {
|
|
|
807
837
|
createSkillCatalog,
|
|
808
838
|
createTrueForgeAgentUIServer,
|
|
809
839
|
createTrueForgeClient,
|
|
840
|
+
filterUiSandboxProviders,
|
|
810
841
|
getCapabilities,
|
|
811
842
|
listConfiguredMcpServers,
|
|
812
843
|
listModels,
|
|
@@ -825,6 +856,7 @@ export {
|
|
|
825
856
|
toUiConnectorFromReadEntry,
|
|
826
857
|
toUiModelProvider,
|
|
827
858
|
toUiSandboxProvider,
|
|
859
|
+
toUiSandboxProviderListEntry,
|
|
828
860
|
toUiSkill2 as toUiSkill
|
|
829
861
|
};
|
|
830
862
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/client.ts","../../../src/plugins/trueforge-agent-server-adapter/chatServer.ts","../../../src/plugins/trueforge-agent-server-adapter/lists.ts","../../../src/plugins/trueforge-agent-server-adapter/builderServer.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/modelProviderCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/sandboxProviderCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/skillCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/index.ts"],"sourcesContent":["/**\n * Maps trueforge-ui connector-settings calls onto Harness\n *\n * UI: `dcr` / `header` / `none`, connector `id`.\n * Harness: `dcr` / `header` / omitted auth, resource `name`.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n ConnectorAuth,\n ConnectorAuthPublic,\n ConnectorBase,\n ConnectorCatalogEntry,\n ConnectorCatalogServer,\n CreateConnectorRequest,\n ToolBase,\n UpdateConnectorRequest,\n} from '../../../server/types.js';\n\nexport type UiConnectorAuth = ConnectorAuth;\nexport type UiConnectorAuthPublic = ConnectorAuthPublic;\nexport type UiConnector = ConnectorBase;\nexport type UiConnectorCatalogEntry = ConnectorCatalogEntry;\n\nconst DEFAULT_API_KEY_HEADER = 'Authorization';\n\nexport function toUiAuthPublic(auth: TrueForgeApi.ConfiguredMcpServerAuth | undefined): UiConnectorAuthPublic {\n if (auth === undefined) {\n return { type: 'none' };\n }\n if (auth.type === 'dcr') {\n return { type: 'dcr' };\n }\n const headerName = Object.keys(auth.headers)[0];\n return {\n type: 'header',\n ...(headerName === undefined ? {} : { headerName }),\n };\n}\n\nexport function toHarnessAuth(auth: ConnectorAuth): TrueForgeApi.ConfiguredMcpServerAuth | undefined {\n if (auth.type === 'none') {\n return undefined;\n }\n if (auth.type === 'dcr') {\n return { type: 'dcr' };\n }\n const apiKey = auth.apiKey?.trim();\n if (apiKey === undefined || apiKey === '') {\n throw new Error('API key is required for header-authenticated MCP servers');\n }\n const trimmedHeader = auth.headerName?.trim();\n const headerName = trimmedHeader !== undefined && trimmedHeader !== '' ? trimmedHeader : DEFAULT_API_KEY_HEADER;\n return { type: 'header', headers: { [headerName]: apiKey } };\n}\n\nexport function toUiCatalogEntry(server: TrueForgeApi.CatalogMcpServer): UiConnectorCatalogEntry {\n return {\n id: server.name,\n name: server.name,\n url: server.url,\n ...(server.logo === undefined ? {} : { logo: server.logo }),\n auth: toUiAuthPublic(server.auth),\n };\n}\n\nexport function toUiTool(tool: Record<string, unknown>): ToolBase {\n const name = typeof tool.name === 'string' && tool.name !== '' ? tool.name : 'tool';\n const description = typeof tool.description === 'string' ? tool.description : '';\n return { id: name, name, description };\n}\n\nexport function toUiConnector(server: TrueForgeApi.ConfiguredMcpServer): UiConnector {\n const auth = toUiAuthPublic(server.auth);\n return {\n id: server.name,\n name: server.name,\n description: server.url,\n url: server.url,\n auth,\n requiresAuth: server.authStatus.status === 'auth_required',\n authenticated: server.authStatus.status !== 'auth_required',\n };\n}\n\nexport function toUiConnectorFromReadEntry(server: TrueForgeApi.McpServerReadEntry): UiConnector {\n const auth: UiConnectorAuthPublic = server.auth?.type ? { type: server.auth.type } : { type: 'none' };\n return {\n id: server.name,\n name: server.name,\n description: server.url,\n url: server.url,\n auth,\n requiresAuth: server.authStatus.status === 'auth_required',\n authenticated: server.authStatus.status !== 'auth_required',\n };\n}\n\nexport interface HarnessMcpUpsert {\n name: string;\n url: string;\n auth?: TrueForgeApi.ConfiguredMcpServerAuth;\n}\n\nexport function toHarnessManifest(req: { name: string; url: string; auth: ConnectorAuth }): HarnessMcpUpsert {\n const auth = toHarnessAuth(req.auth);\n return {\n name: req.name,\n url: req.url,\n ...(auth === undefined ? {} : { auth }),\n };\n}\n\n/** Settings connector port for `createTrueFoundryServer`. Delete omitted; disconnect unsupported. */\nexport function createConnectorCatalog(\n client: TrueForge,\n): ConnectorCatalogServer<\n ToolBase,\n UiConnectorAuth,\n UiConnectorAuthPublic,\n UiConnector,\n UiConnectorCatalogEntry,\n CreateConnectorRequest,\n UpdateConnectorRequest\n> {\n async function getConfigured(name: string): Promise<TrueForgeApi.ConfiguredMcpServer> {\n const listed = await client.settings.mcpServers.list();\n const existing = listed.data.find(server => server.name === name);\n if (existing === undefined) {\n throw new Error(`MCP server \"${name}\" not found`);\n }\n return existing;\n }\n\n async function resolveWriteAuth(req: { id?: string; auth: ConnectorAuth }): Promise<ConnectorAuth> {\n if (req.auth.type !== 'header') {\n return req.auth;\n }\n const apiKey = req.auth.apiKey?.trim();\n if (apiKey !== undefined && apiKey !== '') {\n return req.auth;\n }\n if (req.id === undefined) {\n throw new Error('API key is required for header-authenticated MCP servers');\n }\n const existing = await getConfigured(req.id);\n if (existing.auth?.type !== 'header') {\n throw new Error(`MCP server \"${req.id}\" has no stored header credentials to reuse`);\n }\n const preferredHeader = req.auth.headerName?.trim();\n const storedHeaderName = Object.keys(existing.auth.headers)[0];\n const headerName =\n preferredHeader !== undefined && preferredHeader !== ''\n ? preferredHeader\n : (storedHeaderName ?? DEFAULT_API_KEY_HEADER);\n const stored = existing.auth.headers[headerName] ?? Object.values(existing.auth.headers)[0];\n if (stored === undefined) {\n throw new Error(`MCP server \"${req.id}\" has no stored header credentials to reuse`);\n }\n return { type: 'header', apiKey: stored, headerName };\n }\n\n return {\n getConnectorCatalog: async () => {\n const body = await client.catalog.mcpServers.list();\n return body.data.map(toUiCatalogEntry);\n },\n getConnector: async req => {\n const body = await client.settings.mcpServers.get(req.id);\n return toUiConnector(body.data);\n },\n listConnectors: async req => {\n const body = await client.settings.mcpServers.list();\n const connectors = body.data.map(toUiConnector);\n const query = req?.query?.trim().toLowerCase();\n if (query === undefined || query === '') {\n return connectors;\n }\n return connectors.filter(\n connector =>\n connector.name.toLowerCase().includes(query) ||\n connector.description.toLowerCase().includes(query) ||\n connector.url.toLowerCase().includes(query),\n );\n },\n getToolsByConnectorId: async ({ id }) => {\n const body = await client.settings.mcpServers.listTools(id);\n return body.data.map(toUiTool);\n },\n createConnector: async req => {\n const auth = await resolveWriteAuth({ auth: req.auth });\n const body = await client.settings.mcpServers.create(toHarnessManifest({ name: req.name, url: req.url, auth }));\n return toUiConnector(body.data);\n },\n updateConnector: async req => {\n const auth = await resolveWriteAuth({ id: req.id, auth: req.auth });\n const body = await client.settings.mcpServers.upsert(toHarnessManifest({ name: req.id, url: req.url, auth }));\n return toUiConnector(body.data);\n },\n authenticateConnector: async req => {\n const result = await client.mcpServers.authorize(\n req.id,\n req.redirectURL === undefined ? {} : { redirectUrl: req.redirectURL },\n );\n return { status: result.status, authorization_endpoint: result.authorizationUrl };\n },\n disconnectConnector: async req => {\n const existing = await getConfigured(req.id);\n if (existing.auth?.type !== 'dcr') {\n throw new Error(`Disconnect is only supported for OAuth MCP servers`);\n }\n const body = await client.mcpServers.deleteAuthorize(req.id);\n return toUiConnector(body.data);\n },\n };\n}\n","/**\n * TrueForge HTTP client for the Harness adapter.\n * Auth is host-owned: pass `token` (Bearer) and/or a custom `fetch` (e.g. cookie + OIDC).\n */\nimport { TrueForge } from '@truefoundry/trueforge-sdk';\n\nexport interface CreateTrueForgeClientOptions {\n baseUrl?: string;\n /** SDK Bearer token (`Authorization: Bearer …`). */\n token?: string;\n fetch?: typeof fetch;\n}\n\nconst DEFAULT_BASE_URL = '/';\n\nexport function createTrueForgeClient(options: CreateTrueForgeClientOptions = {}): TrueForge {\n return new TrueForge({\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n ...(options.token === undefined ? {} : { token: options.token }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n}\n","/**\n * Harness `AgentChatServer` adapter for @truefoundry/trueforge-ui.\n *\n * Runtime contract: opaque mounts (`object`), flat `ListResult` (`data` +\n * `nextPageToken`), and `null` normalized to absent. Harness keys MCP mounts by\n * name and returns `null` for optional fields — the maps below bridge both.\n *\n * Skills are name refs on the wire (`SkillNameRef`).\n *\n * Session create takes `{ name }` or `{ spec }`; reads carry the\n * `reference`/`inline` discriminator, with reference rows already naming their\n * agent. The UI filters with registry `agentId`.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n AgentChatServer,\n ListResult,\n Session,\n SessionEventItem,\n Turn,\n TurnInputItem,\n UserMessageContent,\n} from '../../server/types.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport type { HarnessAgentSpec, HarnessMcpServerMount, HarnessSkillMount } from './types.js';\n\nexport type { HarnessAgentSpec, HarnessMcpServerMount, HarnessSkillMount } from './types.js';\nexport type CreateHarnessChatServerOptions = CreateTrueForgeClientOptions & {\n /** Injected client — skips creating one from options. */\n client?: TrueForge;\n};\n\nfunction toUiMcpServer(server: TrueForgeApi.McpServer): HarnessMcpServerMount {\n return server;\n}\n\nfunction toUiSkill(skill: TrueForgeApi.SkillNameRef): HarnessSkillMount {\n return { name: skill.name };\n}\n\n/** Drop UI draft `id` before admission; Harness MCP mounts are name-keyed. */\nexport function toHarnessAgentSpec(spec: HarnessAgentSpec): TrueForgeApi.AgentSpec {\n const { skills, mcpServers, ...rest } = spec;\n return {\n ...rest,\n ...(mcpServers === undefined\n ? {}\n : {\n mcpServers: mcpServers.map(server => {\n // Draft picker may round-trip mounts as `{ id, name, ... }`; strip UI-only `id`.\n if ('id' in server) {\n const { id, ...mount } = server;\n void id;\n return mount;\n }\n return server;\n }),\n }),\n ...(skills === undefined ? {} : { skills: skills.map(({ name }) => ({ name })) }),\n };\n}\n\nexport function toUiAgentSpec(spec: TrueForgeApi.AgentSpec): HarnessAgentSpec {\n const { mcpServers, skills, ...rest } = spec;\n return {\n ...rest,\n ...(mcpServers ? { mcpServers: mcpServers.map(toUiMcpServer) } : {}),\n ...(skills ? { skills: skills.map(toUiSkill) } : {}),\n };\n}\n\nfunction toUiSession(session: TrueForgeApi.Session): Session<HarnessAgentSpec> {\n return {\n id: session.id,\n isMutable: session.agent.type === 'inline',\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n ...(session.title === null ? {} : { title: session.title }),\n // `name` is a create-time snapshot, so references whose agent predates it stay\n // unlabelled; `isMutable` alone keeps them out of the composer.\n ...(session.agent.type === 'reference' && session.agent.name !== null ? { agentName: session.agent.name } : {}),\n ...(session.agent.type === 'inline' ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}),\n };\n}\n\n/** Spread drops the interface identity, which is what makes the SDK's index-signature part type accept it. */\nfunction toUiContent(content: TrueForgeApi.UserMessageContent): UserMessageContent {\n return typeof content === 'string' ? content : content.map(part => ({ ...part }));\n}\n\nfunction toUiInput(input: TrueForgeApi.TurnInputItem[]): TurnInputItem[] {\n return input.map(item => (item.type === 'user.message' ? { ...item, content: toUiContent(item.content) } : item));\n}\n\nfunction toUiTurn(turn: TrueForgeApi.Turn): Turn {\n const { previousTurnId, input, ...rest } = turn;\n return {\n ...rest,\n ...(previousTurnId === null ? {} : { previousTurnId }),\n ...(input === undefined ? {} : { input: toUiInput(input) }),\n };\n}\n\nfunction toUiEventItem(item: TrueForgeApi.SessionEventItem): SessionEventItem {\n return { turnId: item.turnId, event: { ...item.event } };\n}\n\ninterface HarnessPageSource<T> {\n data: T[];\n response: { pagination: TrueForgeApi.TokenPagination };\n}\n\nfunction toListResult<TSource, TResult>(\n page: HarnessPageSource<TSource>,\n map: (item: TSource) => TResult,\n): ListResult<TResult> {\n const data = page.data.map(map);\n const token = page.response.pagination.nextPageToken;\n return {\n data,\n ...(token === undefined ? {} : { nextPageToken: token }),\n };\n}\n\nfunction sequenceNumber(id: string | undefined, fallback: number): number {\n if (id === undefined) return fallback;\n const parsed = Number(id);\n return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : fallback;\n}\n\nfunction toHarnessContent(content: UserMessageContent): TrueForgeApi.UserMessageContent {\n if (typeof content === 'string') return content;\n return content.map(part => {\n if (part.type === 'text') return part;\n const { name, data } = part;\n if (typeof name !== 'string' || typeof data !== 'string') {\n throw new Error('File attachment must carry a string `name` and a data-URI `data`');\n }\n return { type: 'file', name, data };\n });\n}\n\nfunction toHarnessInput(input: TurnInputItem[]): TrueForgeApi.TurnInputItem[] {\n return input.map(item =>\n item.type === 'user.message' ? { ...item, content: toHarnessContent(item.content) } : item,\n );\n}\n\nexport function createHarnessChatServer(\n options: CreateHarnessChatServerOptions = {},\n): AgentChatServer<HarnessAgentSpec> {\n const client = options.client ?? createTrueForgeClient(options);\n return {\n // The sandbox is resolved server-side from the turn, so `sandboxId` is accepted for parity\n // with hosts that address sandboxes directly and deliberately not forwarded.\n async downloadSandboxFile({ sessionId, turnId, path }) {\n const response = await client.sessions.downloadSandboxFile(sessionId, turnId, { path });\n return response.blob();\n },\n\n async createSession(request) {\n if (request.agentName !== undefined && request.agentName.length > 0) {\n const created = await client.sessions.create({\n agent: { name: request.agentName },\n });\n return toUiSession(created.data);\n }\n if (request.agentSpec !== undefined) {\n const created = await client.sessions.create({\n agent: { spec: toHarnessAgentSpec(request.agentSpec) },\n });\n return toUiSession(created.data);\n }\n throw new Error('createSession requires agentName or agentSpec');\n },\n\n async listSessions(request = {}) {\n const page = await client.sessions.list({\n ...(request.limit === undefined ? {} : { limit: request.limit }),\n ...(request.order === undefined ? {} : { order: request.order }),\n ...(request.pageToken === undefined ? {} : { pageToken: request.pageToken }),\n ...(request.agentId === undefined || request.agentId.length === 0 ? {} : { agentId: request.agentId }),\n });\n return toListResult(page, toUiSession);\n },\n\n async getSession({ sessionId }) {\n const response = await client.sessions.get(sessionId);\n return toUiSession(response.data);\n },\n\n async updateSession({ sessionId, agentSpec }) {\n // Named (reference) sessions reject agent updates server-side.\n const response = await client.sessions.update(sessionId, {\n ...(agentSpec === undefined ? {} : { agent: { spec: toHarnessAgentSpec(agentSpec) } }),\n });\n return toUiSession(response.data);\n },\n\n async *createTurn({\n sessionId,\n input,\n previousTurnId,\n }: {\n sessionId: string;\n input?: TurnInputItem[];\n previousTurnId?: string;\n }) {\n const stream = await client.sessions.createTurnStream(sessionId, {\n ...(input === undefined ? {} : { input: toHarnessInput(input) }),\n ...(previousTurnId === undefined ? {} : { previousTurnId }),\n });\n let fallbackSequence = 0;\n for await (const item of stream.withMetadata()) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event: { ...item.data },\n };\n fallbackSequence += 1;\n }\n },\n\n /** Resume a live turn; omitted/0 `afterSequenceNumber` replays from the start. */\n async *subscribeToTurn({\n sessionId,\n turnId,\n afterSequenceNumber,\n }: {\n sessionId: string;\n turnId: string;\n afterSequenceNumber?: number;\n }) {\n const stream = await client.sessions.subscribeToTurn(sessionId, turnId, {\n ...(afterSequenceNumber === undefined ? {} : { afterSequenceNumber }),\n });\n let fallbackSequence = 0;\n for await (const item of stream.withMetadata()) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event: { ...item.data },\n };\n fallbackSequence += 1;\n }\n },\n\n async cancelSession({ sessionId }) {\n await client.sessions.cancel(sessionId);\n },\n\n async listTurns({ sessionId, limit, pageToken }) {\n const page = await client.sessions.listTurns(sessionId, {\n ...(limit === undefined ? {} : { limit }),\n ...(pageToken === undefined ? {} : { pageToken }),\n });\n return toListResult(page, toUiTurn);\n },\n\n async getTurn({ sessionId, turnId }) {\n const response = await client.sessions.getTurn(sessionId, turnId);\n return toUiTurn(response.data);\n },\n\n async listEvents({ sessionId, pageToken, lastTurnId, limit }) {\n const page = await client.sessions.listEvents(sessionId, {\n ...(pageToken === undefined ? {} : { pageToken }),\n ...(lastTurnId === undefined ? {} : { lastTurnId }),\n ...(limit === undefined ? {} : { limit }),\n });\n return toListResult(page, toUiEventItem);\n },\n };\n}\n","/**\n * Configured-resource list helpers for composer pickers and host boot.\n * Not the settings catalog ports (`catalogs/*`).\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\n\nexport async function listModels(client: TrueForge): Promise<TrueForgeApi.Model[]> {\n const body = await client.models.list();\n return body.data;\n}\n\nexport async function listConfiguredMcpServers(client: TrueForge): Promise<TrueForgeApi.McpServerReadEntry[]> {\n const body = await client.mcpServers.list();\n return body.data;\n}\n\nexport async function listSkills(client: TrueForge): Promise<TrueForgeApi.SkillReadEntry[]> {\n const body = await client.skills.list();\n return body.data;\n}\n\nexport async function getCapabilities(client: TrueForge): Promise<TrueForgeApi.GetCapabilitiesResponseData> {\n const body = await client.server.getCapabilities();\n return body.data;\n}\n","/**\n * AgentBuilderServer callbacks for createTrueFoundryServer.\n * Composer pickers + agent library backed by the Harness agents registry.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type { AgentBuilderServer, AgentLibraryEntry, ModelSelection, SearchAgentsParams } from '../../server/types.js';\nimport { toUiConnectorFromReadEntry } from './catalogs/connectorCatalog.js';\nimport { toHarnessAgentSpec, toUiAgentSpec } from './chatServer.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport { listConfiguredMcpServers, listSkills } from './lists.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport type CreateHarnessBuilderServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\n/** Well-known catalog entries key logos by `type` (same as configured provider resource name). */\nexport function modelProviderLogosByName(\n catalog: readonly TrueForgeApi.CatalogModelProvider[],\n): ReadonlyMap<string, string> {\n const logos = new Map<string, string>();\n for (const entry of catalog) {\n if (entry.type === 'custom' || entry.logo === undefined) {\n continue;\n }\n logos.set(entry.type, entry.logo);\n }\n return logos;\n}\n\n/** Map harness model rows onto the UI picker shape (nested provider + properties + optional logo). */\nexport function toModelSelection({ model, logo }: { model: TrueForgeApi.Model; logo?: string }): ModelSelection {\n const efforts = model.properties.reasoningEfforts;\n return {\n id: model.modelId,\n name: model.name,\n provider: {\n name: model.provider.name,\n ...(logo === undefined ? {} : { logo }),\n },\n properties: {\n ...(efforts !== undefined && efforts.length > 0 ? { reasoningEfforts: [...efforts] } : {}),\n },\n };\n}\n\nfunction toLibraryEntry(agent: TrueForgeApi.Agent): AgentLibraryEntry {\n return {\n name: agent.name,\n agentId: agent.id,\n agentSpec: toUiAgentSpec(agent.manifest),\n };\n}\n\nexport function createHarnessBuilderServer(\n options: CreateHarnessBuilderServerOptions = {},\n): AgentBuilderServer<HarnessAgentSpec> {\n const client = options.client ?? createTrueForgeClient(options);\n\n return {\n getCapabilities: () => client.server.getCapabilities(),\n getModels: async () => {\n // Catalog logos are optional UI enrichment — a catalog failure must not blank the picker.\n const [modelsBody, catalogEntries] = await Promise.all([\n client.models.list(),\n client.catalog.modelProviders.list().then(\n body => body.data,\n () => [],\n ),\n ]);\n const logosByName = modelProviderLogosByName(catalogEntries);\n return modelsBody.data.map(model => {\n const logo = logosByName.get(model.provider.name);\n return toModelSelection(logo === undefined ? { model } : { model, logo });\n });\n },\n // Skills require a configured sandbox provider; keep the picker empty when skill capability is off.\n getSkills: async () => {\n const skills = await listSkills(client);\n return skills.map(skill => ({ id: skill.name, name: skill.name, description: skill.description }));\n },\n getMcp: async () => (await listConfiguredMcpServers(client)).map(toUiConnectorFromReadEntry),\n\n async searchAgents(req?: SearchAgentsParams) {\n const { data } = await client.agents.list();\n const query = req?.query?.trim().toLowerCase();\n const filtered =\n query === undefined || query === '' ? data : data.filter(agent => agent.name.toLowerCase().includes(query));\n const offset = req?.offset ?? 0;\n const limit = req?.limit ?? 50;\n return filtered.slice(offset, offset + limit).map(toLibraryEntry);\n },\n\n async saveAgent({ agentName, agentSpec, intent }) {\n const manifest = toHarnessAgentSpec(agentSpec);\n if (intent === 'update') {\n const { data } = await client.agents.list();\n const existing = data.find(agent => agent.name === agentName);\n if (!existing) {\n return {};\n }\n await client.agents.update(existing.id, { manifest });\n return { agentId: existing.id };\n }\n const created = await client.agents.create({ name: agentName, manifest });\n return { agentId: created.data.id };\n },\n };\n}\n","/**\n * Maps trueforge-ui model-settings calls onto Harness\n *\n * UI: flat `apiKey` / model `id`. Harness: `auth.apiKey` / `modelId`.\n * Provider `id` in the UI is the Harness resource `name`.\n */\nimport type { TrueForge } from '@truefoundry/trueforge-sdk';\nimport { TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n CreateModelProviderRequest,\n ModelCatalogServer,\n ModelEntry,\n ModelProviderBase,\n ModelProviderCatalogEntry,\n UpdateModelProviderRequest,\n} from '../../../server/types.js';\n\n/** Custom-form rows omit properties; catalog rows round-trip them. */\nexport type UiModelEntry = ModelEntry & {\n properties?: TrueForgeApi.ModelProperties;\n};\n\nexport type UiModelProvider = ModelProviderBase<UiModelEntry>;\nexport type UiModelProviderCatalogEntry = ModelProviderCatalogEntry<UiModelEntry>;\n\nexport function toUiModelEntry(model: TrueForgeApi.ModelEntry): UiModelEntry {\n return {\n id: model.modelId,\n name: model.name,\n properties: model.properties,\n };\n}\n\nexport function toHarnessModelEntry(model: UiModelEntry): TrueForgeApi.ModelEntry {\n return {\n modelId: model.id,\n name: model.name,\n properties: model.properties ?? {},\n };\n}\n\nexport function toUiModelProvider(provider: TrueForgeApi.ModelProvider): UiModelProvider {\n // Only `custom` carries a name; the API names every other type after its type.\n const name = provider.type === 'custom' ? provider.name : provider.type;\n return {\n id: name,\n type: provider.type,\n name,\n ...(provider.baseUrl === undefined ? {} : { baseUrl: provider.baseUrl }),\n models: provider.models.map(toUiModelEntry),\n };\n}\n\nexport function toUiCatalogModelProviderEntry(\n provider: TrueForgeApi.CatalogModelProvider,\n): UiModelProviderCatalogEntry {\n if (provider.type === 'custom') {\n return {\n type: provider.type,\n name: provider.type,\n supportedReasoningEfforts: provider.supportedReasoningEfforts,\n models: [],\n };\n }\n return {\n type: provider.type,\n name: provider.type,\n ...(provider.logo === undefined ? {} : { logo: provider.logo }),\n models: provider.models.map(toUiModelEntry),\n };\n}\n\nconst PROVIDER_TYPES: readonly string[] = [...Object.values(TrueForgeApi.CatalogWellKnownModelProviderType), 'custom'];\n\nfunction isProviderType(type: string): type is TrueForgeApi.ModelProvider['type'] {\n return PROVIDER_TYPES.includes(type);\n}\n\nexport function toHarnessModelProvider(req: {\n type: string;\n name: string;\n apiKey: string;\n baseUrl?: string;\n models: UiModelEntry[];\n}): TrueForgeApi.ModelProvider {\n const models = req.models.map(toHarnessModelEntry);\n if (!isProviderType(req.type)) {\n throw new Error(`Unsupported model provider type: ${req.type}`);\n }\n const baseUrl = req.baseUrl?.trim() === '' ? undefined : req.baseUrl;\n // Only `custom` is named by its caller; the API names the rest after their type.\n if (req.type === 'custom') {\n if (baseUrl === undefined) {\n throw new Error(`Model providers of type \"${req.type}\" require a base URL`);\n }\n // Blank form field is \"\"; custom must omit auth on the wire (empty string is rejected).\n return {\n type: req.type,\n name: req.name,\n models,\n baseUrl,\n ...(req.apiKey === '' ? {} : { auth: { apiKey: req.apiKey } }),\n };\n }\n const auth = { apiKey: req.apiKey };\n if (baseUrl !== undefined) {\n return { type: req.type, auth, models, baseUrl };\n }\n return { type: req.type, auth, models };\n}\n\n/** Settings model-catalog port for `createTrueFoundryServer`. Delete is omitted (no BE route). */\nexport function createModelProviderCatalog(\n client: TrueForge,\n): ModelCatalogServer<\n UiModelEntry,\n UiModelProvider,\n UiModelProviderCatalogEntry,\n CreateModelProviderRequest<UiModelEntry>,\n UpdateModelProviderRequest<UiModelEntry>\n> {\n async function resolveApiKey(req: { id?: string; type?: string; apiKey: string }): Promise<string> {\n const trimmed = req.apiKey.trim();\n if (trimmed !== '') {\n return trimmed;\n }\n if (req.id === undefined) {\n // Create with a blank key: allow only for custom; \"\" is mapped to omitted auth below.\n if (req.type === 'custom') {\n return '';\n }\n throw new Error('API key is required');\n }\n // Update with empty means keep the stored key.\n const listed = await client.settings.modelProviders.list();\n const existing = listed.data.find(provider => toUiModelProvider(provider).id === req.id);\n if (existing === undefined) {\n throw new Error(`Model provider \"${req.id}\" not found`);\n }\n return existing.auth?.apiKey ?? '';\n }\n\n return {\n getModelProviderCatalog: async () => {\n const body = await client.catalog.modelProviders.list();\n return body.data.map(toUiCatalogModelProviderEntry);\n },\n listModelProviders: async () => {\n const body = await client.settings.modelProviders.list();\n return body.data.map(toUiModelProvider);\n },\n createModelProvider: async req => {\n const apiKey = await resolveApiKey({ type: req.type, apiKey: req.apiKey });\n const body = await client.settings.modelProviders.create(\n toHarnessModelProvider({\n type: req.type,\n name: req.name,\n apiKey,\n ...(req.baseUrl === undefined ? {} : { baseUrl: req.baseUrl }),\n models: req.models,\n }),\n );\n return toUiModelProvider(body.data);\n },\n updateModelProvider: async req => {\n // UI sends apiKey: \"\" when only models change; reuse the stored key.\n const apiKey = await resolveApiKey({ id: req.id, type: req.type, apiKey: req.apiKey });\n const body = await client.settings.modelProviders.upsert(\n toHarnessModelProvider({\n type: req.type,\n name: req.id,\n apiKey,\n ...(req.baseUrl === undefined ? {} : { baseUrl: req.baseUrl }),\n models: req.models,\n }),\n );\n return toUiModelProvider(body.data);\n },\n };\n}\n","/**\n * Maps trueforge-ui sandbox-settings calls onto Harness\n * `/api/v1/settings/sandbox-providers` (singleton upsert, no delete).\n *\n * UI: multi-row providers with `id` / `catalogId` / `name` / flat `apiKey`.\n * Harness: one Daytona provider per tenant; catalog YAML has no name — synthetic\n * identity uses `type` (`daytona`) as id/catalogId and display name `Daytona`.\n */\nimport type { TrueForge } from '@truefoundry/trueforge-sdk';\nimport { TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n SandboxCatalogServer,\n SandboxProviderBase,\n SandboxProviderCatalogEntry,\n SandboxProviderConfig,\n} from '../../../server/types.js';\n\nexport type UiSandboxProvider = SandboxProviderBase;\nexport type UiSandboxProviderCatalogEntry = SandboxProviderCatalogEntry;\n\nconst DAYTONA_TYPE = 'daytona';\nconst DAYTONA_DISPLAY_NAME = 'Daytona';\n\nfunction displayNameForType(type: string): string {\n if (type === DAYTONA_TYPE) {\n return DAYTONA_DISPLAY_NAME;\n }\n return type;\n}\n\nexport function configFromHarness(\n provider: TrueForgeApi.CatalogDaytonaSandboxProvider | TrueForgeApi.SandboxProviderManifest,\n): SandboxProviderConfig {\n return {\n // Snapshot/image is now release-owned; the field is gone from the backend. The external\n // SandboxProviderConfig still requires it, so send an empty placeholder until that type drops it.\n snapshotName: '',\n execTimeoutMs: provider.execTimeoutMs,\n autoStopIntervalInMinutes: provider.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: provider.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: provider.autoDeleteIntervalInMinutes,\n };\n}\n\nexport function toUiCatalogEntry(provider: TrueForgeApi.CatalogDaytonaSandboxProvider): UiSandboxProviderCatalogEntry {\n return {\n id: provider.type,\n name: displayNameForType(provider.type),\n type: provider.type,\n ...configFromHarness(provider),\n };\n}\n\nexport function toUiSandboxProvider(provider: TrueForgeApi.SandboxProviderManifest): UiSandboxProvider {\n return {\n id: provider.type,\n name: displayNameForType(provider.type),\n catalogId: provider.type,\n isConnected: true,\n ...configFromHarness(provider),\n };\n}\n\nexport function toHarnessManifest(\n req: {\n type: string;\n apiKey: string;\n } & Omit<SandboxProviderConfig, 'snapshotName'>,\n): TrueForgeApi.SandboxProviderManifest {\n if (req.type !== DAYTONA_TYPE) {\n throw new Error(`Unsupported sandbox provider type: ${req.type}`);\n }\n return {\n type: DAYTONA_TYPE,\n execTimeoutMs: req.execTimeoutMs,\n autoStopIntervalInMinutes: req.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes,\n auth: { apiKey: req.apiKey },\n };\n}\n\n/** Settings sandbox-catalog port for `createTrueFoundryServer`. Delete omitted (no BE route). */\nexport function createSandboxProviderCatalog(client: TrueForge): SandboxCatalogServer {\n async function resolveApiKey(apiKey: string | undefined): Promise<string> {\n const trimmed = apiKey?.trim();\n if (trimmed !== undefined && trimmed !== '') {\n return trimmed;\n }\n const existing = await client.settings.sandboxProviders.get();\n return existing.data.manifest.auth.apiKey;\n }\n\n return {\n getSandboxProviderCatalog: async () => {\n const body = await client.catalog.sandboxProviders.list();\n return body.data.map(toUiCatalogEntry);\n },\n listSandboxProviders: async req => {\n let providers: UiSandboxProvider[];\n try {\n const body = await client.settings.sandboxProviders.get();\n providers = [toUiSandboxProvider(body.data.manifest)];\n } catch (err) {\n if (err instanceof TrueForgeApi.NotFoundError) {\n providers = [];\n } else {\n throw err;\n }\n }\n const query = req?.query?.trim().toLowerCase();\n if (query === undefined || query === '') {\n return providers;\n }\n return providers.filter(\n provider => provider.name.toLowerCase().includes(query) || provider.id.toLowerCase().includes(query),\n );\n },\n createSandboxProvider: async req => {\n const body = await client.settings.sandboxProviders.upsert(\n toHarnessManifest({\n type: req.type,\n apiKey: req.apiKey,\n execTimeoutMs: req.execTimeoutMs,\n autoStopIntervalInMinutes: req.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes,\n }),\n );\n return toUiSandboxProvider(body.data.manifest);\n },\n updateSandboxProvider: async req => {\n const apiKey = await resolveApiKey(req.apiKey);\n const body = await client.settings.sandboxProviders.upsert(\n toHarnessManifest({\n type: DAYTONA_TYPE,\n apiKey,\n execTimeoutMs: req.execTimeoutMs,\n autoStopIntervalInMinutes: req.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes,\n }),\n );\n return toUiSandboxProvider(body.data.manifest);\n },\n };\n}\n","/**\n * Maps trueforge-ui skill-settings calls onto Harness\n *\n * UI: `repoURL` / skill `id` / optional `catalogId`.\n * Harness: `url` / resource `name` (no separate id or catalogId on wire).\n * For now UI `id = name`; registry link uses `catalogId = name` when the\n * configured skill name matches a catalog preset.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type { DefinedSkill, SkillCatalogEntry, SkillCatalogServer, SkillConfigBase } from '../../../server/types.js';\n\nexport type UiSkill = DefinedSkill;\nexport type UiSkillCatalogEntry = SkillCatalogEntry;\n\nexport function toUiCatalogEntry(skill: TrueForgeApi.CatalogSkill): UiSkillCatalogEntry {\n return {\n id: skill.name,\n name: skill.name,\n description: skill.description,\n repoURL: skill.url,\n path: skill.path ?? '',\n ref: skill.ref,\n };\n}\n\nexport function toHarnessManifest(req: SkillConfigBase): TrueForgeApi.SkillManifest {\n const path = req.path.trim();\n return {\n type: 'git',\n name: req.name,\n url: req.repoURL,\n ...(path === '' ? {} : { path }),\n ref: req.ref,\n description: req.description,\n };\n}\n\nexport function toUiSkill(skill: TrueForgeApi.SkillManifest, catalogNames: ReadonlySet<string>): UiSkill {\n const base = {\n id: skill.name,\n name: skill.name,\n description: skill.description,\n };\n if (catalogNames.has(skill.name)) {\n return { ...base, catalogId: skill.name };\n }\n return base;\n}\n\n/** Settings skill-catalog port for `createTrueFoundryServer`. Delete omitted (no BE route). */\nexport function createSkillCatalog(client: TrueForge): SkillCatalogServer<UiSkill> {\n return {\n getSkillCatalog: async () => {\n const body = await client.catalog.skills.list();\n return body.data.map(toUiCatalogEntry);\n },\n listSkills: async req => {\n const [listed, catalog] = await Promise.all([client.settings.skills.list(), client.catalog.skills.list()]);\n const catalogNames = new Set(catalog.data.map(entry => entry.name));\n const skills = listed.data.map(skill => toUiSkill(skill, catalogNames));\n const query = req?.query?.trim().toLowerCase();\n if (query === undefined || query === '') {\n return skills;\n }\n return skills.filter(\n skill => skill.name.toLowerCase().includes(query) || skill.description.toLowerCase().includes(query),\n );\n },\n createSkill: async req => {\n const body = await client.settings.skills.create(toHarnessManifest(req));\n const catalogId = 'catalogId' in req ? req.catalogId : undefined;\n if (catalogId !== undefined) {\n return {\n id: body.data.name,\n name: body.data.name,\n description: body.data.description,\n catalogId,\n };\n }\n return {\n id: body.data.name,\n name: body.data.name,\n description: body.data.description,\n };\n },\n };\n}\n","/**\n * Built-in Harness → AgentUIServer factory for `<TrueforgeUI server={{ type: \"trueforge\", … }} />`.\n */\nimport { createTrueFoundryServer } from '../../server/createTrueFoundryServer.js';\nimport type { CatalogServer } from '../../server/types.js';\nimport { createHarnessBuilderServer } from './builderServer.js';\nimport { createConnectorCatalog } from './catalogs/connectorCatalog.js';\nimport { createModelProviderCatalog } from './catalogs/modelProviderCatalog.js';\nimport { createSandboxProviderCatalog } from './catalogs/sandboxProviderCatalog.js';\nimport { createSkillCatalog } from './catalogs/skillCatalog.js';\nimport { createHarnessChatServer } from './chatServer.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport {\n createHarnessBuilderServer,\n modelProviderLogosByName,\n toModelSelection,\n type CreateHarnessBuilderServerOptions,\n} from './builderServer.js';\nexport {\n createConnectorCatalog,\n toHarnessAuth,\n toHarnessManifest as toHarnessConnectorManifest,\n toUiConnector,\n toUiConnectorFromReadEntry,\n} from './catalogs/connectorCatalog.js';\nexport {\n createModelProviderCatalog,\n toHarnessModelProvider,\n toUiCatalogModelProviderEntry,\n toUiModelProvider,\n} from './catalogs/modelProviderCatalog.js';\nexport {\n configFromHarness,\n createSandboxProviderCatalog,\n toHarnessManifest as toHarnessSandboxManifest,\n toUiSandboxProvider,\n} from './catalogs/sandboxProviderCatalog.js';\nexport { createSkillCatalog, toHarnessManifest as toHarnessSkillManifest, toUiSkill } from './catalogs/skillCatalog.js';\nexport {\n createHarnessChatServer,\n toHarnessAgentSpec,\n toUiAgentSpec,\n type CreateHarnessChatServerOptions,\n} from './chatServer.js';\nexport { createTrueForgeClient } from './client.js';\nexport type { CreateTrueForgeClientOptions } from './client.js';\nexport { getCapabilities, listConfiguredMcpServers, listModels, listSkills } from './lists.js';\nexport type { HarnessAgentSpec, HarnessMcpServerMount, HarnessSkillMount } from './types.js';\n\nexport type CreateTrueForgeAgentUIServerOptions = CreateTrueForgeClientOptions & {\n /** Override the default Harness settings catalogs. */\n catalog?: CatalogServer;\n};\n\n/**\n * Compose chat + builder + default settings catalogs into an `AgentUIServer`.\n */\nexport function createTrueForgeAgentUIServer(options: CreateTrueForgeAgentUIServerOptions = {}) {\n const { catalog: catalogOverride, ...clientOptions } = options;\n const client = createTrueForgeClient(clientOptions);\n const catalog =\n catalogOverride ??\n ({\n modelCatalog: createModelProviderCatalog(client),\n connectorCatalog: createConnectorCatalog(client),\n skillCatalog: createSkillCatalog(client),\n sandboxCatalog: createSandboxProviderCatalog(client),\n } satisfies CatalogServer);\n\n return createTrueFoundryServer<HarnessAgentSpec>({\n chatServer: createHarnessChatServer({ client }),\n ...createHarnessBuilderServer({ client }),\n catalog,\n });\n}\n"],"mappings":"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","names":["TrueForgeApi","toUiCatalogEntry","toHarnessManifest","toUiCatalogEntry","toHarnessManifest","toUiSkill"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/client.ts","../../../src/plugins/trueforge-agent-server-adapter/chatServer.ts","../../../src/plugins/trueforge-agent-server-adapter/lists.ts","../../../src/plugins/trueforge-agent-server-adapter/builderServer.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/modelProviderCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/sandboxProviderCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/skillCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/index.ts"],"sourcesContent":["/**\n * Maps trueforge-ui connector-settings calls onto Harness\n *\n * UI: `dcr` / `header` / `none`, connector `id`.\n * Harness: `dcr` / `header` / omitted auth, resource `name`.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n ConnectorAuth,\n ConnectorAuthPublic,\n ConnectorBase,\n ConnectorCatalogEntry,\n ConnectorCatalogServer,\n CreateConnectorRequest,\n ToolBase,\n UpdateConnectorRequest,\n} from '../../../server/types.js';\n\nexport type UiConnectorAuth = ConnectorAuth;\nexport type UiConnectorAuthPublic = ConnectorAuthPublic;\nexport type UiConnector = ConnectorBase;\nexport type UiConnectorCatalogEntry = ConnectorCatalogEntry;\n\nconst DEFAULT_API_KEY_HEADER = 'Authorization';\n\nexport function toUiAuthPublic(auth: TrueForgeApi.McpServerManifestAuth | undefined): UiConnectorAuthPublic {\n if (auth === undefined) {\n return { type: 'none' };\n }\n if (auth.type === 'dcr') {\n return { type: 'dcr' };\n }\n const headerName = Object.keys(auth.headers)[0];\n return {\n type: 'header',\n ...(headerName === undefined ? {} : { headerName }),\n };\n}\n\nexport function toHarnessAuth(auth: ConnectorAuth): TrueForgeApi.McpServerManifestAuth | undefined {\n if (auth.type === 'none') {\n return undefined;\n }\n if (auth.type === 'dcr') {\n return { type: 'dcr' };\n }\n const apiKey = auth.apiKey?.trim();\n if (apiKey === undefined || apiKey === '') {\n throw new Error('API key is required for header-authenticated MCP servers');\n }\n const trimmedHeader = auth.headerName?.trim();\n const headerName = trimmedHeader !== undefined && trimmedHeader !== '' ? trimmedHeader : DEFAULT_API_KEY_HEADER;\n return { type: 'header', headers: { [headerName]: apiKey } };\n}\n\nexport function toUiCatalogEntry(server: TrueForgeApi.CatalogMcpServer): UiConnectorCatalogEntry {\n return {\n id: server.name,\n name: server.name,\n url: server.url,\n description: server.description,\n ...(server.logo === undefined ? {} : { logo: server.logo }),\n auth: toUiAuthPublic(server.auth),\n };\n}\n\nexport function toUiTool(tool: Record<string, unknown>): ToolBase {\n const name = typeof tool.name === 'string' && tool.name !== '' ? tool.name : 'tool';\n const description = typeof tool.description === 'string' ? tool.description : '';\n return { id: name, name, description };\n}\n\nexport function toUiConnector(server: TrueForgeApi.ConfiguredMcpServer): UiConnector {\n const auth = toUiAuthPublic(server.manifest.auth);\n return {\n id: server.name,\n name: server.name,\n description: server.manifest.description,\n url: server.manifest.url,\n auth,\n requiresAuth: server.authStatus.status === 'auth_required',\n authenticated: server.authStatus.status !== 'auth_required',\n };\n}\n\nexport function toUiConnectorFromReadEntry(server: TrueForgeApi.McpServerReadEntry): UiConnector {\n const auth: UiConnectorAuthPublic = server.auth?.type ? { type: server.auth.type } : { type: 'none' };\n return {\n id: server.name,\n name: server.name,\n description: server.url,\n url: server.url,\n auth,\n requiresAuth: server.authStatus.status === 'auth_required',\n authenticated: server.authStatus.status !== 'auth_required',\n };\n}\n\nexport function toHarnessManifest(req: {\n name: string;\n url: string;\n auth: ConnectorAuth;\n description?: string;\n}): TrueForgeApi.McpServerManifest {\n const auth = toHarnessAuth(req.auth);\n const trimmed = req.description?.trim();\n return {\n type: 'remote',\n name: req.name,\n url: req.url,\n description: trimmed !== undefined && trimmed !== '' ? trimmed : `${req.name} MCP server`,\n ...(auth === undefined ? {} : { auth }),\n };\n}\n\n/** Settings connector port for `createTrueFoundryServer`. Delete omitted; disconnect unsupported. */\nexport function createConnectorCatalog(\n client: TrueForge,\n): ConnectorCatalogServer<\n ToolBase,\n UiConnectorAuth,\n UiConnectorAuthPublic,\n UiConnector,\n UiConnectorCatalogEntry,\n CreateConnectorRequest,\n UpdateConnectorRequest\n> {\n async function getConfigured(name: string): Promise<TrueForgeApi.ConfiguredMcpServer> {\n const listed = await client.settings.mcpServers.list();\n const existing = listed.data.find(server => server.name === name);\n if (existing === undefined) {\n throw new Error(`MCP server \"${name}\" not found`);\n }\n return existing;\n }\n\n async function resolveWriteAuth(req: { id?: string; auth: ConnectorAuth }): Promise<ConnectorAuth> {\n if (req.auth.type !== 'header') {\n return req.auth;\n }\n const apiKey = req.auth.apiKey?.trim();\n if (apiKey !== undefined && apiKey !== '') {\n return req.auth;\n }\n if (req.id === undefined) {\n throw new Error('API key is required for header-authenticated MCP servers');\n }\n const existing = await getConfigured(req.id);\n if (existing.manifest.auth?.type !== 'header') {\n throw new Error(`MCP server \"${req.id}\" has no stored header credentials to reuse`);\n }\n const preferredHeader = req.auth.headerName?.trim();\n const storedHeaderName = Object.keys(existing.manifest.auth.headers)[0];\n const headerName =\n preferredHeader !== undefined && preferredHeader !== ''\n ? preferredHeader\n : (storedHeaderName ?? DEFAULT_API_KEY_HEADER);\n const stored = existing.manifest.auth.headers[headerName] ?? Object.values(existing.manifest.auth.headers)[0];\n if (stored === undefined) {\n throw new Error(`MCP server \"${req.id}\" has no stored header credentials to reuse`);\n }\n return { type: 'header', apiKey: stored, headerName };\n }\n\n return {\n getConnectorCatalog: async () => {\n const body = await client.catalog.mcpServers.list();\n return body.data.map(toUiCatalogEntry);\n },\n getConnector: async req => {\n const body = await client.settings.mcpServers.get(req.id);\n return toUiConnector(body.data);\n },\n listConnectors: async req => {\n const body = await client.settings.mcpServers.list();\n const connectors = body.data.map(toUiConnector);\n const query = req?.query?.trim().toLowerCase();\n if (query === undefined || query === '') {\n return connectors;\n }\n return connectors.filter(\n connector =>\n connector.name.toLowerCase().includes(query) ||\n connector.description.toLowerCase().includes(query) ||\n connector.url.toLowerCase().includes(query),\n );\n },\n getToolsByConnectorId: async ({ id }) => {\n const body = await client.settings.mcpServers.listTools(id);\n return body.data.map(toUiTool);\n },\n createConnector: async req => {\n const auth = await resolveWriteAuth({ auth: req.auth });\n const body = await client.settings.mcpServers.create({\n manifest: toHarnessManifest({\n name: req.name,\n url: req.url,\n auth,\n description: req.description,\n }),\n });\n return toUiConnector(body.data);\n },\n updateConnector: async req => {\n const auth = await resolveWriteAuth({ id: req.id, auth: req.auth });\n const body = await client.settings.mcpServers.upsert({\n manifest: toHarnessManifest({\n name: req.id,\n url: req.url,\n auth,\n description: req.description,\n }),\n });\n return toUiConnector(body.data);\n },\n authenticateConnector: async req => {\n const result = await client.mcpServers.authorize(\n req.id,\n req.redirectURL === undefined ? {} : { redirectUrl: req.redirectURL },\n );\n return { status: result.status, authorization_endpoint: result.authorizationUrl };\n },\n disconnectConnector: async req => {\n const existing = await getConfigured(req.id);\n if (existing.manifest.auth?.type !== 'dcr') {\n throw new Error(`Disconnect is only supported for OAuth MCP servers`);\n }\n const body = await client.mcpServers.deleteAuthorize(req.id);\n return toUiConnector(body.data);\n },\n };\n}\n","/**\n * TrueForge HTTP client for the Harness adapter.\n * Auth is host-owned: pass `token` (Bearer) and/or a custom `fetch` (e.g. cookie + OIDC).\n */\nimport { TrueForge } from '@truefoundry/trueforge-sdk';\n\nexport interface CreateTrueForgeClientOptions {\n baseUrl?: string;\n /** SDK Bearer token (`Authorization: Bearer …`). */\n token?: string;\n fetch?: typeof fetch;\n}\n\nconst DEFAULT_BASE_URL = '/';\n\nexport function createTrueForgeClient(options: CreateTrueForgeClientOptions = {}): TrueForge {\n return new TrueForge({\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n ...(options.token === undefined ? {} : { token: options.token }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n}\n","/**\n * Harness `AgentChatServer` adapter for @truefoundry/trueforge-ui.\n *\n * Runtime contract: opaque mounts (`object`), flat `ListResult` (`data` +\n * `nextPageToken`), and `null` normalized to absent. Harness keys MCP mounts by\n * name and returns `null` for optional fields — the maps below bridge both.\n *\n * Skills are name refs on the wire (`SkillNameRef`).\n *\n * Session create takes `{ name }` or `{ spec }`; reads carry the\n * `reference`/`inline` discriminator, with reference rows already naming their\n * agent. The UI filters with registry `agentId`.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n AgentChatServer,\n ListResult,\n Session,\n SessionEventItem,\n Turn,\n TurnInputItem,\n UserMessageContent,\n} from '../../server/types.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport type { HarnessAgentSpec, HarnessMcpServerMount, HarnessSkillMount } from './types.js';\n\nexport type { HarnessAgentSpec, HarnessMcpServerMount, HarnessSkillMount } from './types.js';\nexport type CreateHarnessChatServerOptions = CreateTrueForgeClientOptions & {\n /** Injected client — skips creating one from options. */\n client?: TrueForge;\n};\n\nfunction toUiMcpServer(server: TrueForgeApi.McpServer): HarnessMcpServerMount {\n return server;\n}\n\nfunction toUiSkill(skill: TrueForgeApi.SkillNameRef): HarnessSkillMount {\n return { name: skill.name };\n}\n\n/** Drop UI draft `id` before admission; Harness MCP mounts are name-keyed. */\nexport function toHarnessAgentSpec(spec: HarnessAgentSpec): TrueForgeApi.AgentSpec {\n const { skills, mcpServers, ...rest } = spec;\n return {\n ...rest,\n ...(mcpServers === undefined\n ? {}\n : {\n mcpServers: mcpServers.map(server => {\n // Draft picker may round-trip mounts as `{ id, name, ... }`; strip UI-only `id`.\n if ('id' in server) {\n const { id, ...mount } = server;\n void id;\n return mount;\n }\n return server;\n }),\n }),\n ...(skills === undefined ? {} : { skills: skills.map(({ name }) => ({ name })) }),\n };\n}\n\nexport function toUiAgentSpec(spec: TrueForgeApi.AgentSpec): HarnessAgentSpec {\n const { mcpServers, skills, ...rest } = spec;\n return {\n ...rest,\n ...(mcpServers ? { mcpServers: mcpServers.map(toUiMcpServer) } : {}),\n ...(skills ? { skills: skills.map(toUiSkill) } : {}),\n };\n}\n\nfunction toUiSession(session: TrueForgeApi.Session): Session<HarnessAgentSpec> {\n return {\n id: session.id,\n isMutable: session.agent.type === 'inline',\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n ...(session.title === null ? {} : { title: session.title }),\n // `name` is a create-time snapshot, so references whose agent predates it stay\n // unlabelled; `isMutable` alone keeps them out of the composer.\n ...(session.agent.type === 'reference' && session.agent.name !== null ? { agentName: session.agent.name } : {}),\n ...(session.agent.type === 'inline' ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}),\n };\n}\n\n/** Spread drops the interface identity, which is what makes the SDK's index-signature part type accept it. */\nfunction toUiContent(content: TrueForgeApi.UserMessageContent): UserMessageContent {\n return typeof content === 'string' ? content : content.map(part => ({ ...part }));\n}\n\nfunction toUiInput(input: TrueForgeApi.TurnInputItem[]): TurnInputItem[] {\n return input.map(item => (item.type === 'user.message' ? { ...item, content: toUiContent(item.content) } : item));\n}\n\nfunction toUiTurn(turn: TrueForgeApi.Turn): Turn {\n const { previousTurnId, input, ...rest } = turn;\n return {\n ...rest,\n ...(previousTurnId === null ? {} : { previousTurnId }),\n ...(input === undefined ? {} : { input: toUiInput(input) }),\n };\n}\n\nfunction toUiEventItem(item: TrueForgeApi.SessionEventItem): SessionEventItem {\n return { turnId: item.turnId, event: { ...item.event } };\n}\n\ninterface HarnessPageSource<T> {\n data: T[];\n response: { pagination: TrueForgeApi.TokenPagination };\n}\n\nfunction toListResult<TSource, TResult>(\n page: HarnessPageSource<TSource>,\n map: (item: TSource) => TResult,\n): ListResult<TResult> {\n const data = page.data.map(map);\n const token = page.response.pagination.nextPageToken;\n return {\n data,\n ...(token === undefined ? {} : { nextPageToken: token }),\n };\n}\n\nfunction sequenceNumber(id: string | undefined, fallback: number): number {\n if (id === undefined) return fallback;\n const parsed = Number(id);\n return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : fallback;\n}\n\nfunction toHarnessContent(content: UserMessageContent): TrueForgeApi.UserMessageContent {\n if (typeof content === 'string') return content;\n return content.map(part => {\n if (part.type === 'text') return part;\n const { name, data } = part;\n if (typeof name !== 'string' || typeof data !== 'string') {\n throw new Error('File attachment must carry a string `name` and a data-URI `data`');\n }\n return { type: 'file', name, data };\n });\n}\n\nfunction toHarnessInput(input: TurnInputItem[]): TrueForgeApi.TurnInputItem[] {\n return input.map(item =>\n item.type === 'user.message' ? { ...item, content: toHarnessContent(item.content) } : item,\n );\n}\n\nexport function createHarnessChatServer(\n options: CreateHarnessChatServerOptions = {},\n): AgentChatServer<HarnessAgentSpec> {\n const client = options.client ?? createTrueForgeClient(options);\n return {\n // The sandbox is resolved server-side from the turn, so `sandboxId` is accepted for parity\n // with hosts that address sandboxes directly and deliberately not forwarded.\n async downloadSandboxFile({ sessionId, turnId, path }) {\n const response = await client.sessions.downloadSandboxFile(sessionId, turnId, { path });\n return response.blob();\n },\n\n async createSession(request) {\n if (request.agentName !== undefined && request.agentName.length > 0) {\n const created = await client.sessions.create({\n agent: { name: request.agentName },\n });\n return toUiSession(created.data);\n }\n if (request.agentSpec !== undefined) {\n const created = await client.sessions.create({\n agent: { spec: toHarnessAgentSpec(request.agentSpec) },\n });\n return toUiSession(created.data);\n }\n throw new Error('createSession requires agentName or agentSpec');\n },\n\n async listSessions(request = {}) {\n const page = await client.sessions.list({\n ...(request.limit === undefined ? {} : { limit: request.limit }),\n ...(request.order === undefined ? {} : { order: request.order }),\n ...(request.pageToken === undefined ? {} : { pageToken: request.pageToken }),\n ...(request.agentId === undefined || request.agentId.length === 0 ? {} : { agentId: request.agentId }),\n });\n return toListResult(page, toUiSession);\n },\n\n async getSession({ sessionId }) {\n const response = await client.sessions.get(sessionId);\n return toUiSession(response.data);\n },\n\n async updateSession({ sessionId, agentSpec }) {\n // Named (reference) sessions reject agent updates server-side.\n const response = await client.sessions.update(sessionId, {\n ...(agentSpec === undefined ? {} : { agent: { spec: toHarnessAgentSpec(agentSpec) } }),\n });\n return toUiSession(response.data);\n },\n\n async *createTurn({\n sessionId,\n input,\n previousTurnId,\n }: {\n sessionId: string;\n input?: TurnInputItem[];\n previousTurnId?: string;\n }) {\n const stream = await client.sessions.createTurnStream(sessionId, {\n ...(input === undefined ? {} : { input: toHarnessInput(input) }),\n ...(previousTurnId === undefined ? {} : { previousTurnId }),\n });\n let fallbackSequence = 0;\n for await (const item of stream.withMetadata()) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event: { ...item.data },\n };\n fallbackSequence += 1;\n }\n },\n\n /** Resume a live turn; omitted/0 `afterSequenceNumber` replays from the start. */\n async *subscribeToTurn({\n sessionId,\n turnId,\n afterSequenceNumber,\n }: {\n sessionId: string;\n turnId: string;\n afterSequenceNumber?: number;\n }) {\n const stream = await client.sessions.subscribeToTurn(sessionId, turnId, {\n ...(afterSequenceNumber === undefined ? {} : { afterSequenceNumber }),\n });\n let fallbackSequence = 0;\n for await (const item of stream.withMetadata()) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event: { ...item.data },\n };\n fallbackSequence += 1;\n }\n },\n\n async cancelSession({ sessionId }) {\n await client.sessions.cancel(sessionId);\n },\n\n async listTurns({ sessionId, limit, pageToken }) {\n const page = await client.sessions.listTurns(sessionId, {\n ...(limit === undefined ? {} : { limit }),\n ...(pageToken === undefined ? {} : { pageToken }),\n });\n return toListResult(page, toUiTurn);\n },\n\n async getTurn({ sessionId, turnId }) {\n const response = await client.sessions.getTurn(sessionId, turnId);\n return toUiTurn(response.data);\n },\n\n async listEvents({ sessionId, pageToken, lastTurnId, limit }) {\n const page = await client.sessions.listEvents(sessionId, {\n ...(pageToken === undefined ? {} : { pageToken }),\n ...(lastTurnId === undefined ? {} : { lastTurnId }),\n ...(limit === undefined ? {} : { limit }),\n });\n return toListResult(page, toUiEventItem);\n },\n };\n}\n","/**\n * Configured-resource list helpers for composer pickers and host boot.\n * Not the settings catalog ports (`catalogs/*`).\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\n\nexport async function listModels(client: TrueForge): Promise<TrueForgeApi.Model[]> {\n const body = await client.models.list();\n return body.data;\n}\n\nexport async function listConfiguredMcpServers(client: TrueForge): Promise<TrueForgeApi.McpServerReadEntry[]> {\n const body = await client.mcpServers.list();\n return body.data;\n}\n\nexport async function listSkills(client: TrueForge): Promise<TrueForgeApi.SkillReadEntry[]> {\n const body = await client.skills.list();\n return body.data;\n}\n\nexport async function getCapabilities(client: TrueForge): Promise<TrueForgeApi.GetCapabilitiesResponseData> {\n const body = await client.server.getCapabilities();\n return body.data;\n}\n","/**\n * AgentBuilderServer callbacks for createTrueFoundryServer.\n * Composer pickers + agent library backed by the Harness agents registry.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type { AgentBuilderServer, AgentLibraryEntry, ModelSelection, SearchAgentsParams } from '../../server/types.js';\nimport { toUiConnectorFromReadEntry } from './catalogs/connectorCatalog.js';\nimport { toHarnessAgentSpec, toUiAgentSpec } from './chatServer.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport { listConfiguredMcpServers, listSkills } from './lists.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport type CreateHarnessBuilderServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\n/** Well-known catalog entries key logos by `type` (same as configured provider resource name). */\nexport function modelProviderLogosByName(\n catalog: readonly TrueForgeApi.CatalogModelProvider[],\n): ReadonlyMap<string, string> {\n const logos = new Map<string, string>();\n for (const entry of catalog) {\n if (entry.type === 'custom' || entry.logo === undefined) {\n continue;\n }\n logos.set(entry.type, entry.logo);\n }\n return logos;\n}\n\n/** Map harness model rows onto the UI picker shape (nested provider + properties + optional logo). */\nexport function toModelSelection({ model, logo }: { model: TrueForgeApi.Model; logo?: string }): ModelSelection {\n const efforts = model.properties.reasoningEfforts;\n return {\n id: model.modelId,\n name: model.name,\n provider: {\n name: model.provider.name,\n ...(logo === undefined ? {} : { logo }),\n },\n properties: {\n ...(efforts !== undefined && efforts.length > 0 ? { reasoningEfforts: [...efforts] } : {}),\n },\n };\n}\n\nfunction toLibraryEntry(agent: TrueForgeApi.Agent): AgentLibraryEntry {\n return {\n name: agent.name,\n agentId: agent.id,\n agentSpec: toUiAgentSpec(agent.manifest),\n };\n}\n\nexport function createHarnessBuilderServer(\n options: CreateHarnessBuilderServerOptions = {},\n): AgentBuilderServer<HarnessAgentSpec> {\n const client = options.client ?? createTrueForgeClient(options);\n\n return {\n getCapabilities: () => client.server.getCapabilities(),\n getModels: async () => {\n // Catalog logos are optional UI enrichment — a catalog failure must not blank the picker.\n const [modelsBody, catalogEntries] = await Promise.all([\n client.models.list(),\n client.catalog.modelProviders.list().then(\n body => body.data,\n () => [],\n ),\n ]);\n const logosByName = modelProviderLogosByName(catalogEntries);\n return modelsBody.data.map(model => {\n const logo = logosByName.get(model.provider.name);\n return toModelSelection(logo === undefined ? { model } : { model, logo });\n });\n },\n // Skills require a configured sandbox provider; keep the picker empty when skill capability is off.\n getSkills: async () => {\n const skills = await listSkills(client);\n return skills.map(skill => ({ id: skill.name, name: skill.name, description: skill.description }));\n },\n getMcp: async () => (await listConfiguredMcpServers(client)).map(toUiConnectorFromReadEntry),\n\n async searchAgents(req?: SearchAgentsParams) {\n const { data } = await client.agents.list();\n const query = req?.query?.trim().toLowerCase();\n const filtered =\n query === undefined || query === '' ? data : data.filter(agent => agent.name.toLowerCase().includes(query));\n const offset = req?.offset ?? 0;\n const limit = req?.limit ?? 50;\n return filtered.slice(offset, offset + limit).map(toLibraryEntry);\n },\n\n async saveAgent({ agentName, agentSpec, intent }) {\n const manifest = toHarnessAgentSpec(agentSpec);\n if (intent === 'update') {\n const { data } = await client.agents.list();\n const existing = data.find(agent => agent.name === agentName);\n if (!existing) {\n return {};\n }\n await client.agents.update(existing.id, { manifest });\n return { agentId: existing.id };\n }\n const created = await client.agents.create({ name: agentName, manifest });\n return { agentId: created.data.id };\n },\n };\n}\n","/**\n * Maps trueforge-ui model-settings calls onto Harness\n *\n * UI: flat `apiKey` / model `id`. Harness: `auth.apiKey` / `modelId`.\n * Provider `id` in the UI is the Harness resource `name`.\n */\nimport type { TrueForge } from '@truefoundry/trueforge-sdk';\nimport { TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n CreateModelProviderRequest,\n ModelCatalogServer,\n ModelEntry,\n ModelProviderBase,\n ModelProviderCatalogEntry,\n UpdateModelProviderRequest,\n} from '../../../server/types.js';\n\n/** Custom-form rows omit properties; catalog rows round-trip them. */\nexport type UiModelEntry = ModelEntry & {\n properties?: TrueForgeApi.ModelProperties;\n};\n\nexport type UiModelProvider = ModelProviderBase<UiModelEntry>;\nexport type UiModelProviderCatalogEntry = ModelProviderCatalogEntry<UiModelEntry>;\n\nexport function toUiModelEntry(model: TrueForgeApi.ModelEntry): UiModelEntry {\n return {\n id: model.modelId,\n name: model.name,\n properties: model.properties,\n };\n}\n\nexport function toHarnessModelEntry(model: UiModelEntry): TrueForgeApi.ModelEntry {\n return {\n modelId: model.id,\n name: model.name,\n properties: model.properties ?? {},\n };\n}\n\nexport function toUiModelProvider(provider: TrueForgeApi.ModelProvider): UiModelProvider {\n const { name, manifest } = provider;\n return {\n id: name,\n type: manifest.type,\n name,\n ...(manifest.baseUrl === undefined ? {} : { baseUrl: manifest.baseUrl }),\n models: manifest.models.map(toUiModelEntry),\n };\n}\n\nexport function toUiCatalogModelProviderEntry(\n provider: TrueForgeApi.CatalogModelProvider,\n): UiModelProviderCatalogEntry {\n if (provider.type === 'custom') {\n return {\n type: provider.type,\n name: provider.type,\n supportedReasoningEfforts: provider.supportedReasoningEfforts,\n models: [],\n };\n }\n return {\n type: provider.type,\n name: provider.type,\n ...(provider.logo === undefined ? {} : { logo: provider.logo }),\n models: provider.models.map(toUiModelEntry),\n };\n}\n\nconst PROVIDER_TYPES: readonly string[] = [...Object.values(TrueForgeApi.CatalogWellKnownModelProviderType), 'custom'];\n\nfunction isProviderType(type: string): type is TrueForgeApi.ModelProviderManifest['type'] {\n return PROVIDER_TYPES.includes(type);\n}\n\nexport function toHarnessModelProvider(req: {\n type: string;\n name: string;\n apiKey: string;\n baseUrl?: string;\n models: UiModelEntry[];\n}): TrueForgeApi.ModelProviderManifest {\n const models = req.models.map(toHarnessModelEntry);\n if (!isProviderType(req.type)) {\n throw new Error(`Unsupported model provider type: ${req.type}`);\n }\n const baseUrl = req.baseUrl?.trim() === '' ? undefined : req.baseUrl;\n // Only `custom` is named by its caller; the API names the rest after their type.\n if (req.type === 'custom') {\n if (baseUrl === undefined) {\n throw new Error(`Model providers of type \"${req.type}\" require a base URL`);\n }\n // Blank form field is \"\"; custom must omit auth on the wire (empty string is rejected).\n return {\n type: req.type,\n name: req.name,\n models,\n baseUrl,\n ...(req.apiKey === '' ? {} : { auth: { apiKey: req.apiKey } }),\n };\n }\n const auth = { apiKey: req.apiKey };\n if (baseUrl !== undefined) {\n return { type: req.type, auth, models, baseUrl };\n }\n return { type: req.type, auth, models };\n}\n\n/** Settings model-catalog port for `createTrueFoundryServer`. Delete is omitted (no BE route). */\nexport function createModelProviderCatalog(\n client: TrueForge,\n): ModelCatalogServer<\n UiModelEntry,\n UiModelProvider,\n UiModelProviderCatalogEntry,\n CreateModelProviderRequest<UiModelEntry>,\n UpdateModelProviderRequest<UiModelEntry>\n> {\n async function resolveApiKey(req: { id?: string; type?: string; apiKey: string }): Promise<string> {\n const trimmed = req.apiKey.trim();\n if (trimmed !== '') {\n return trimmed;\n }\n if (req.id === undefined) {\n // Create with a blank key: allow only for custom; \"\" is mapped to omitted auth below.\n if (req.type === 'custom') {\n return '';\n }\n throw new Error('API key is required');\n }\n // Update with empty means keep the stored key.\n const listed = await client.settings.modelProviders.list();\n const existing = listed.data.find(provider => provider.name === req.id);\n if (existing === undefined) {\n throw new Error(`Model provider \"${req.id}\" not found`);\n }\n return existing.manifest.auth?.apiKey ?? '';\n }\n\n return {\n getModelProviderCatalog: async () => {\n const body = await client.catalog.modelProviders.list();\n return body.data.map(toUiCatalogModelProviderEntry);\n },\n listModelProviders: async () => {\n const body = await client.settings.modelProviders.list();\n return body.data.map(toUiModelProvider);\n },\n createModelProvider: async req => {\n const apiKey = await resolveApiKey({ type: req.type, apiKey: req.apiKey });\n const body = await client.settings.modelProviders.create({\n manifest: toHarnessModelProvider({\n type: req.type,\n name: req.name,\n apiKey,\n ...(req.baseUrl === undefined ? {} : { baseUrl: req.baseUrl }),\n models: req.models,\n }),\n });\n return toUiModelProvider(body.data);\n },\n updateModelProvider: async req => {\n // UI sends apiKey: \"\" when only models change; reuse the stored key.\n const apiKey = await resolveApiKey({ id: req.id, type: req.type, apiKey: req.apiKey });\n const body = await client.settings.modelProviders.upsert({\n manifest: toHarnessModelProvider({\n type: req.type,\n name: req.id,\n apiKey,\n ...(req.baseUrl === undefined ? {} : { baseUrl: req.baseUrl }),\n models: req.models,\n }),\n });\n return toUiModelProvider(body.data);\n },\n };\n}\n","/**\n * Maps trueforge-ui sandbox-settings calls onto Harness\n * `/api/v1/settings/sandbox-providers` (singleton upsert, no delete).\n *\n * UI: multi-row providers with `id` / `catalogId` / `name` / flat `apiKey`.\n * Harness: one Daytona provider per tenant; catalog YAML has no name — synthetic\n * identity uses `type` (`daytona`) as id/catalogId and display name `Daytona`.\n */\nimport type { TrueForge } from '@truefoundry/trueforge-sdk';\nimport { TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n SandboxCatalogServer,\n SandboxProviderBase,\n SandboxProviderCatalogEntry,\n SandboxProviderConfig,\n SandboxProviderListEntry,\n} from '../../../server/types.js';\n\nexport type UiSandboxProvider = SandboxProviderBase;\nexport type UiSandboxProviderCatalogEntry = SandboxProviderCatalogEntry;\nexport type UiSandboxProviderListEntry = SandboxProviderListEntry;\n\nconst DAYTONA_TYPE = 'daytona';\nconst DAYTONA_DISPLAY_NAME = 'Daytona';\n\nfunction displayNameForType(type: string): string {\n if (type === DAYTONA_TYPE) {\n return DAYTONA_DISPLAY_NAME;\n }\n return type;\n}\n\nexport function configFromHarness(\n provider: TrueForgeApi.CatalogDaytonaSandboxProvider | TrueForgeApi.SandboxProviderManifest,\n): SandboxProviderConfig {\n return {\n execTimeoutMs: provider.execTimeoutMs,\n autoStopIntervalInMinutes: provider.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: provider.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: provider.autoDeleteIntervalInMinutes,\n };\n}\n\nexport function toUiCatalogEntry(provider: TrueForgeApi.CatalogDaytonaSandboxProvider): UiSandboxProviderCatalogEntry {\n return {\n id: provider.type,\n name: displayNameForType(provider.type),\n type: provider.type,\n ...configFromHarness(provider),\n };\n}\n\nexport function toUiSandboxProvider(provider: TrueForgeApi.SandboxProviderManifest): UiSandboxProvider {\n return {\n id: provider.type,\n name: displayNameForType(provider.type),\n catalogId: provider.type,\n isConnected: true,\n ...configFromHarness(provider),\n };\n}\n\nexport function toUiSandboxProviderListEntry(\n response: TrueForgeApi.GetSandboxProviderResponse['data'],\n): UiSandboxProviderListEntry {\n return {\n data: toUiSandboxProvider(response.manifest),\n snapshotSyncStatus: {\n status: response.status,\n ...(response.statusReason ? { statusReason: response.statusReason } : {}),\n },\n };\n}\n\nexport function filterUiSandboxProviders({\n providers,\n query,\n}: {\n providers: UiSandboxProviderListEntry[];\n query?: string;\n}): UiSandboxProviderListEntry[] {\n const normalizedQuery = query?.trim().toLowerCase();\n if (normalizedQuery === undefined || normalizedQuery === '') {\n return providers;\n }\n return providers.filter(\n provider =>\n provider.data.name.toLowerCase().includes(normalizedQuery) ||\n provider.data.id.toLowerCase().includes(normalizedQuery),\n );\n}\n\nexport function toHarnessManifest(\n req: {\n type: string;\n apiKey: string;\n } & SandboxProviderConfig,\n): TrueForgeApi.SandboxProviderManifest {\n if (req.type !== DAYTONA_TYPE) {\n throw new Error(`Unsupported sandbox provider type: ${req.type}`);\n }\n return {\n type: DAYTONA_TYPE,\n execTimeoutMs: req.execTimeoutMs,\n autoStopIntervalInMinutes: req.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes,\n auth: { apiKey: req.apiKey },\n };\n}\n\n/** Settings sandbox-catalog port for `createTrueFoundryServer`. Delete omitted (no BE route). */\nexport function createSandboxProviderCatalog(client: TrueForge): SandboxCatalogServer {\n async function resolveApiKey(apiKey: string | undefined): Promise<string> {\n const trimmed = apiKey?.trim();\n if (trimmed !== undefined && trimmed !== '') {\n return trimmed;\n }\n const existing = await client.settings.sandboxProviders.get();\n return existing.data.manifest.auth.apiKey;\n }\n\n return {\n getSandboxProviderCatalog: async () => {\n const body = await client.catalog.sandboxProviders.list();\n return body.data.map(toUiCatalogEntry);\n },\n listSandboxProviders: async req => {\n let providers: UiSandboxProviderListEntry[];\n try {\n const body = await client.settings.sandboxProviders.get();\n providers = [toUiSandboxProviderListEntry(body.data)];\n } catch (err) {\n if (err instanceof TrueForgeApi.NotFoundError) {\n providers = [];\n } else {\n throw err;\n }\n }\n return filterUiSandboxProviders({ providers, query: req?.query });\n },\n createSandboxProvider: async req => {\n const body = await client.settings.sandboxProviders.upsert({\n manifest: toHarnessManifest({\n type: req.type,\n apiKey: req.apiKey,\n execTimeoutMs: req.execTimeoutMs,\n autoStopIntervalInMinutes: req.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes,\n }),\n });\n return toUiSandboxProvider(body.data.manifest);\n },\n updateSandboxProvider: async req => {\n const apiKey = await resolveApiKey(req.apiKey);\n const body = await client.settings.sandboxProviders.upsert({\n manifest: toHarnessManifest({\n type: DAYTONA_TYPE,\n apiKey,\n execTimeoutMs: req.execTimeoutMs,\n autoStopIntervalInMinutes: req.autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes: req.autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes: req.autoDeleteIntervalInMinutes,\n }),\n });\n return toUiSandboxProvider(body.data.manifest);\n },\n };\n}\n","/**\n * Maps trueforge-ui skill-settings calls onto Harness\n *\n * UI: `repoURL` / skill `id` / optional `catalogId`.\n * Harness: `url` / resource `name` (no separate id or catalogId on wire).\n * For now UI `id = name`; registry link uses `catalogId = name` when the\n * configured skill name matches a catalog preset.\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type { DefinedSkill, SkillCatalogEntry, SkillCatalogServer, SkillConfigBase } from '../../../server/types.js';\n\nexport type UiSkill = DefinedSkill;\nexport type UiSkillCatalogEntry = SkillCatalogEntry;\n\nexport function toUiCatalogEntry(skill: TrueForgeApi.CatalogSkill): UiSkillCatalogEntry {\n return {\n id: skill.name,\n name: skill.name,\n description: skill.description,\n repoURL: skill.url,\n path: skill.path ?? '',\n ref: skill.ref,\n };\n}\n\nexport function toHarnessManifest(req: SkillConfigBase): TrueForgeApi.SkillManifest {\n const path = req.path.trim();\n return {\n type: 'git',\n name: req.name,\n url: req.repoURL,\n ...(path === '' ? {} : { path }),\n ref: req.ref,\n description: req.description,\n };\n}\n\nexport function toUiSkill(skill: TrueForgeApi.ConfiguredSkill, catalogNames: ReadonlySet<string>): UiSkill {\n const base = {\n id: skill.name,\n name: skill.name,\n description: skill.manifest.description,\n };\n if (catalogNames.has(skill.name)) {\n return { ...base, catalogId: skill.name };\n }\n return base;\n}\n\n/** Settings skill-catalog port for `createTrueFoundryServer`. Delete omitted (no BE route). */\nexport function createSkillCatalog(client: TrueForge): SkillCatalogServer<UiSkill> {\n return {\n getSkillCatalog: async () => {\n const body = await client.catalog.skills.list();\n return body.data.map(toUiCatalogEntry);\n },\n listSkills: async req => {\n const [listed, catalog] = await Promise.all([client.settings.skills.list(), client.catalog.skills.list()]);\n const catalogNames = new Set(catalog.data.map(entry => entry.name));\n const skills = listed.data.map(skill => toUiSkill(skill, catalogNames));\n const query = req?.query?.trim().toLowerCase();\n if (query === undefined || query === '') {\n return skills;\n }\n return skills.filter(\n skill => skill.name.toLowerCase().includes(query) || skill.description.toLowerCase().includes(query),\n );\n },\n createSkill: async req => {\n const body = await client.settings.skills.create({ manifest: toHarnessManifest(req) });\n const catalogId = 'catalogId' in req ? req.catalogId : undefined;\n if (catalogId !== undefined) {\n return {\n id: body.data.name,\n name: body.data.name,\n description: body.data.manifest.description,\n catalogId,\n };\n }\n return {\n id: body.data.name,\n name: body.data.name,\n description: body.data.manifest.description,\n };\n },\n };\n}\n","/**\n * Built-in Harness → AgentUIServer factory for `<TrueforgeUI server={{ type: \"trueforge\", … }} />`.\n */\nimport { createTrueFoundryServer } from '../../server/createTrueFoundryServer.js';\nimport type { CatalogServer } from '../../server/types.js';\nimport { createHarnessBuilderServer } from './builderServer.js';\nimport { createConnectorCatalog } from './catalogs/connectorCatalog.js';\nimport { createModelProviderCatalog } from './catalogs/modelProviderCatalog.js';\nimport { createSandboxProviderCatalog } from './catalogs/sandboxProviderCatalog.js';\nimport { createSkillCatalog } from './catalogs/skillCatalog.js';\nimport { createHarnessChatServer } from './chatServer.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport {\n createHarnessBuilderServer,\n modelProviderLogosByName,\n toModelSelection,\n type CreateHarnessBuilderServerOptions,\n} from './builderServer.js';\nexport {\n createConnectorCatalog,\n toHarnessAuth,\n toHarnessManifest as toHarnessConnectorManifest,\n toUiConnector,\n toUiConnectorFromReadEntry,\n} from './catalogs/connectorCatalog.js';\nexport {\n createModelProviderCatalog,\n toHarnessModelProvider,\n toUiCatalogModelProviderEntry,\n toUiModelProvider,\n} from './catalogs/modelProviderCatalog.js';\nexport {\n configFromHarness,\n createSandboxProviderCatalog,\n filterUiSandboxProviders,\n toHarnessManifest as toHarnessSandboxManifest,\n toUiSandboxProvider,\n toUiSandboxProviderListEntry,\n} from './catalogs/sandboxProviderCatalog.js';\nexport { createSkillCatalog, toHarnessManifest as toHarnessSkillManifest, toUiSkill } from './catalogs/skillCatalog.js';\nexport {\n createHarnessChatServer,\n toHarnessAgentSpec,\n toUiAgentSpec,\n type CreateHarnessChatServerOptions,\n} from './chatServer.js';\nexport { createTrueForgeClient } from './client.js';\nexport type { CreateTrueForgeClientOptions } from './client.js';\nexport { getCapabilities, listConfiguredMcpServers, listModels, listSkills } from './lists.js';\nexport type { HarnessAgentSpec, HarnessMcpServerMount, HarnessSkillMount } from './types.js';\n\nexport type CreateTrueForgeAgentUIServerOptions = CreateTrueForgeClientOptions & {\n /** Override the default Harness settings catalogs. */\n catalog?: CatalogServer;\n};\n\n/**\n * Compose chat + builder + default settings catalogs into an `AgentUIServer`.\n */\nexport function createTrueForgeAgentUIServer(options: CreateTrueForgeAgentUIServerOptions = {}) {\n const { catalog: catalogOverride, ...clientOptions } = options;\n const client = createTrueForgeClient(clientOptions);\n const catalog =\n catalogOverride ??\n ({\n modelCatalog: createModelProviderCatalog(client),\n connectorCatalog: createConnectorCatalog(client),\n skillCatalog: createSkillCatalog(client),\n sandboxCatalog: createSandboxProviderCatalog(client),\n } satisfies CatalogServer);\n\n return createTrueFoundryServer<HarnessAgentSpec>({\n chatServer: createHarnessChatServer({ client }),\n ...createHarnessBuilderServer({ client }),\n catalog,\n });\n}\n"],"mappings":"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","names":["TrueForgeApi","toUiCatalogEntry","toHarnessManifest","toUiCatalogEntry","toHarnessManifest","toUiSkill"]}
|