@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/{ConnectorSettings-CLBEWGQJ.js → ConnectorSettings-H37ZFC6Z.js} +36 -13
  3. package/dist/ConnectorSettings-H37ZFC6Z.js.map +1 -0
  4. package/dist/{DockLayout-WRF7EQLD.js → DockLayout-KEMFRWIR.js} +8 -8
  5. package/dist/{DrawerLayout-X2UXYTOS.js → DrawerLayout-ZVWCKEIS.js} +8 -8
  6. package/dist/{ModelSettings-IJ55QJQO.js → ModelSettings-QJMYHCMD.js} +8 -8
  7. package/dist/{ModelSettings-IJ55QJQO.js.map → ModelSettings-QJMYHCMD.js.map} +1 -1
  8. package/dist/OpenUiFenceBlock-XFBUGPKQ.js +9 -0
  9. package/dist/{SandboxSettings-S5XGZWOL.js → SandboxSettings-BUBMLW7Q.js} +160 -66
  10. package/dist/SandboxSettings-BUBMLW7Q.js.map +1 -0
  11. package/dist/{SettingsBuilder-64Y33NP3.js → SettingsBuilder-26XSGIHK.js} +25 -17
  12. package/dist/SettingsBuilder-26XSGIHK.js.map +1 -0
  13. package/dist/{SidebarLayout-M7HEOZVK.js → SidebarLayout-F3XFXW7B.js} +8 -8
  14. package/dist/{SkillSettings-MXK4ZEI7.js → SkillSettings-IRMGDFRG.js} +6 -6
  15. package/dist/{WidgetLayout-7MDOKLHU.js → WidgetLayout-SZMABKIR.js} +8 -8
  16. package/dist/{chunk-NBMP2XNL.js → chunk-7EEOWDLE.js} +7 -7
  17. package/dist/chunk-DTF7ZMUJ.js +567 -0
  18. package/dist/chunk-DTF7ZMUJ.js.map +1 -0
  19. package/dist/{chunk-UXZOL5GO.js → chunk-H7DR64W3.js} +47 -32
  20. package/dist/chunk-H7DR64W3.js.map +1 -0
  21. package/dist/{chunk-42GF723P.js → chunk-HT5HKQXE.js} +2 -2
  22. package/dist/{chunk-WFC3W4C3.js → chunk-LRQHHZDX.js} +4 -4
  23. package/dist/{chunk-XSHXH6EI.js → chunk-QGNLP2EE.js} +530 -519
  24. package/dist/chunk-QGNLP2EE.js.map +1 -0
  25. package/dist/{chunk-UHGSHDBM.js → chunk-XAZ5HJXV.js} +237 -8
  26. package/dist/chunk-XAZ5HJXV.js.map +1 -0
  27. package/dist/index.d.ts +11 -3
  28. package/dist/index.js +115 -20
  29. package/dist/index.js.map +1 -1
  30. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +47 -37
  31. package/dist/plugins/trueforge-agent-server-adapter/index.js +74 -42
  32. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  33. package/dist/styles.css +1 -1
  34. package/package.json +3 -3
  35. package/dist/ConnectorSettings-CLBEWGQJ.js.map +0 -1
  36. package/dist/OpenUiFenceBlock-SLLZSTMJ.js +0 -9
  37. package/dist/SandboxSettings-S5XGZWOL.js.map +0 -1
  38. package/dist/SettingsBuilder-64Y33NP3.js.map +0 -1
  39. package/dist/chunk-UBOFEI77.js +0 -567
  40. package/dist/chunk-UBOFEI77.js.map +0 -1
  41. package/dist/chunk-UHGSHDBM.js.map +0 -1
  42. package/dist/chunk-UXZOL5GO.js.map +0 -1
  43. package/dist/chunk-XSHXH6EI.js.map +0 -1
  44. /package/dist/{DockLayout-WRF7EQLD.js.map → DockLayout-KEMFRWIR.js.map} +0 -0
  45. /package/dist/{DrawerLayout-X2UXYTOS.js.map → DrawerLayout-ZVWCKEIS.js.map} +0 -0
  46. /package/dist/{OpenUiFenceBlock-SLLZSTMJ.js.map → OpenUiFenceBlock-XFBUGPKQ.js.map} +0 -0
  47. /package/dist/{SidebarLayout-M7HEOZVK.js.map → SidebarLayout-F3XFXW7B.js.map} +0 -0
  48. /package/dist/{SkillSettings-MXK4ZEI7.js.map → SkillSettings-IRMGDFRG.js.map} +0 -0
  49. /package/dist/{WidgetLayout-7MDOKLHU.js.map → WidgetLayout-SZMABKIR.js.map} +0 -0
  50. /package/dist/{chunk-NBMP2XNL.js.map → chunk-7EEOWDLE.js.map} +0 -0
  51. /package/dist/{chunk-42GF723P.js.map → chunk-HT5HKQXE.js.map} +0 -0
  52. /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.url,
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(toHarnessManifest({ name: req.name, url: req.url, auth }));
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(toHarnessManifest({ name: req.id, url: req.url, auth }));
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 = provider.type === "custom" ? provider.name : provider.type;
506
+ const { name, manifest } = provider;
489
507
  return {
490
508
  id: name,
491
- type: provider.type,
509
+ type: manifest.type,
492
510
  name,
493
- ...provider.baseUrl === void 0 ? {} : { baseUrl: provider.baseUrl },
494
- models: provider.models.map(toUiModelEntry)
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) => toUiModelProvider(provider).id === req.id);
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 = [toUiSandboxProvider(body.data.manifest)];
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
- const query = req?.query?.trim().toLowerCase();
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"]}