@truefoundry/trueforge-ui 0.2.2 → 0.2.3-rc.0

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 (38) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/{ConnectorSettings-EYOQ72OS.js → ConnectorSettings-ODC3LVHN.js} +2 -2
  3. package/dist/{DockLayout-XIOJZ2YM.js → DockLayout-2RWDSUKE.js} +5 -5
  4. package/dist/{DrawerLayout-CNKNNVI7.js → DrawerLayout-CZLJYMIN.js} +5 -5
  5. package/dist/{ModelSettings-WBDPLI6O.js → ModelSettings-CKQ5CVAC.js} +2 -2
  6. package/dist/{SandboxSettings-4GHBXULN.js → SandboxSettings-HSCPYUOC.js} +2 -2
  7. package/dist/{SettingsBuilder-TD42LCIU.js → SettingsBuilder-MYWRFXRI.js} +13 -8
  8. package/dist/SettingsBuilder-MYWRFXRI.js.map +1 -0
  9. package/dist/{SidebarLayout-JGLTENB3.js → SidebarLayout-WVY54TGZ.js} +5 -5
  10. package/dist/{SkillSettings-UG6USX4N.js → SkillSettings-ECH6SHZ7.js} +2 -2
  11. package/dist/{TrueForgeUIWithRouter-CTC5XRSY.js → TrueForgeUIWithRouter-RKZ2E7PV.js} +3 -3
  12. package/dist/{WidgetLayout-6P6OUUTG.js → WidgetLayout-NWWB2SXI.js} +5 -5
  13. package/dist/{chunk-QNFP35TA.js → chunk-HVSUPYX2.js} +2 -2
  14. package/dist/{chunk-UVG6JSDE.js → chunk-KFUBFJR5.js} +6 -6
  15. package/dist/{chunk-27MKI3HF.js → chunk-OZTNBS6V.js} +2 -2
  16. package/dist/{chunk-H75C5ETA.js → chunk-TCAVLWYL.js} +5 -5
  17. package/dist/{chunk-YTC2SI4K.js → chunk-XRTTKGKN.js} +267 -263
  18. package/dist/chunk-XRTTKGKN.js.map +1 -0
  19. package/dist/index.js +4 -4
  20. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +13 -13
  21. package/dist/plugins/trueforge-agent-server-adapter/index.js +15 -12
  22. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  23. package/package.json +2 -2
  24. package/dist/SettingsBuilder-TD42LCIU.js.map +0 -1
  25. package/dist/chunk-YTC2SI4K.js.map +0 -1
  26. /package/dist/{ConnectorSettings-EYOQ72OS.js.map → ConnectorSettings-ODC3LVHN.js.map} +0 -0
  27. /package/dist/{DockLayout-XIOJZ2YM.js.map → DockLayout-2RWDSUKE.js.map} +0 -0
  28. /package/dist/{DrawerLayout-CNKNNVI7.js.map → DrawerLayout-CZLJYMIN.js.map} +0 -0
  29. /package/dist/{ModelSettings-WBDPLI6O.js.map → ModelSettings-CKQ5CVAC.js.map} +0 -0
  30. /package/dist/{SandboxSettings-4GHBXULN.js.map → SandboxSettings-HSCPYUOC.js.map} +0 -0
  31. /package/dist/{SidebarLayout-JGLTENB3.js.map → SidebarLayout-WVY54TGZ.js.map} +0 -0
  32. /package/dist/{SkillSettings-UG6USX4N.js.map → SkillSettings-ECH6SHZ7.js.map} +0 -0
  33. /package/dist/{TrueForgeUIWithRouter-CTC5XRSY.js.map → TrueForgeUIWithRouter-RKZ2E7PV.js.map} +0 -0
  34. /package/dist/{WidgetLayout-6P6OUUTG.js.map → WidgetLayout-NWWB2SXI.js.map} +0 -0
  35. /package/dist/{chunk-QNFP35TA.js.map → chunk-HVSUPYX2.js.map} +0 -0
  36. /package/dist/{chunk-UVG6JSDE.js.map → chunk-KFUBFJR5.js.map} +0 -0
  37. /package/dist/{chunk-27MKI3HF.js.map → chunk-OZTNBS6V.js.map} +0 -0
  38. /package/dist/{chunk-H75C5ETA.js.map → chunk-TCAVLWYL.js.map} +0 -0
package/dist/index.js CHANGED
@@ -23,12 +23,12 @@ import {
23
23
  computeAgentStepsSplit,
24
24
  threadHasPendingMcpAuth,
25
25
  useComposerPauseView
26
- } from "./chunk-QNFP35TA.js";
26
+ } from "./chunk-HVSUPYX2.js";
27
27
  import {
28
28
  ServerInitLoader,
29
29
  TrueForgeUIShell,
30
30
  TrueFoundryChatProvider
31
- } from "./chunk-UVG6JSDE.js";
31
+ } from "./chunk-KFUBFJR5.js";
32
32
  import {
33
33
  ComposerBusyProvider,
34
34
  useComposerBusyState
@@ -114,7 +114,7 @@ import {
114
114
  useThemeMode,
115
115
  useToaster,
116
116
  useToasterOptional
117
- } from "./chunk-YTC2SI4K.js";
117
+ } from "./chunk-XRTTKGKN.js";
118
118
  import {
119
119
  DraftCatalogProvider,
120
120
  Icon,
@@ -313,7 +313,7 @@ function ToolGroupContainer({ children, group }) {
313
313
  import { lazy, Suspense } from "react";
314
314
  import { jsx as jsx11 } from "react/jsx-runtime";
315
315
  var TrueForgeUIWithRouter = lazy(
316
- () => import("./TrueForgeUIWithRouter-CTC5XRSY.js").then((m) => ({ default: m.TrueForgeUIWithRouter }))
316
+ () => import("./TrueForgeUIWithRouter-RKZ2E7PV.js").then((m) => ({ default: m.TrueForgeUIWithRouter }))
317
317
  );
318
318
  function TrueForgeUI(props) {
319
319
  const isMcpAuthScreen = typeof window !== "undefined" && new URLSearchParams(window.location.search).get("screenType") === "mcp-auth";
@@ -330,12 +330,12 @@ interface CreateTrueForgeClientOptions {
330
330
  }
331
331
  declare function createTrueForgeClient(options?: CreateTrueForgeClientOptions): TrueForge;
332
332
 
333
- type HarnessSkillMount = TrueForgeApi.SkillNameRef;
333
+ type HarnessSkillMount = TrueForgeApi.Skill;
334
334
  type HarnessMcpServerMount = TrueForgeApi.McpServer;
335
- interface HarnessAgentSpec extends AgentSpec<TrueForgeApi.AgentSpecModel, HarnessSkillMount, HarnessMcpServerMount> {
335
+ interface HarnessAgentSpec extends AgentSpec<TrueForgeApi.Model, HarnessSkillMount, HarnessMcpServerMount> {
336
336
  config?: TrueForgeApi.RuntimeConfig;
337
337
  instructions?: string;
338
- messages?: TrueForgeApi.AgentSpecUserMessage[];
338
+ messages?: TrueForgeApi.InitialUserMessage[];
339
339
  responseFormat?: TrueForgeApi.ResponseFormat;
340
340
  }
341
341
 
@@ -350,8 +350,8 @@ type CreateHarnessBuilderServerOptions = CreateTrueForgeClientOptions & {
350
350
  /** Well-known catalog entries key logos by `type` (same as configured provider resource name). */
351
351
  declare function modelProviderLogosByName(catalog: readonly TrueForgeApi.CatalogModelProvider[]): ReadonlyMap<string, string>;
352
352
  /** Map harness model rows onto the UI picker shape (nested provider + properties + optional logo). */
353
- declare function toModelSelection({ model, logo }: {
354
- model: TrueForgeApi.Model;
353
+ declare function toModelSelection({ model, logo, }: {
354
+ model: TrueForgeApi.AvailableModel;
355
355
  logo?: string;
356
356
  }): ModelSelection$1;
357
357
  declare function createHarnessBuilderServer(options?: CreateHarnessBuilderServerOptions): AgentBuilderServer<HarnessAgentSpec>;
@@ -369,7 +369,7 @@ type UiConnector = ConnectorBase$1;
369
369
  type UiConnectorCatalogEntry = ConnectorCatalogEntry$1;
370
370
  declare function toHarnessAuth(auth: ConnectorAuth$1): TrueForgeApi.McpServerManifestAuth | undefined;
371
371
  declare function toUiConnector(server: TrueForgeApi.ConfiguredMcpServer): UiConnector;
372
- declare function toUiConnectorFromReadEntry(server: TrueForgeApi.McpServerReadEntry): UiConnector;
372
+ declare function toUiConnectorFromReadEntry(server: TrueForgeApi.AvailableMcpServer): UiConnector;
373
373
  declare function toHarnessManifest$2(req: {
374
374
  name: string;
375
375
  url: string;
@@ -392,7 +392,7 @@ type UiModelEntry = ModelEntry$1 & {
392
392
  };
393
393
  type UiModelProvider = ModelProviderBase$1<UiModelEntry>;
394
394
  type UiModelProviderCatalogEntry = ModelProviderCatalogEntry$1<UiModelEntry>;
395
- declare function toUiModelProvider(provider: TrueForgeApi.ModelProvider): UiModelProvider;
395
+ declare function toUiModelProvider(provider: TrueForgeApi.ConfiguredModelProvider): UiModelProvider;
396
396
  declare function toUiCatalogModelProviderEntry(provider: TrueForgeApi.CatalogModelProvider): UiModelProviderCatalogEntry;
397
397
  declare function toHarnessModelProvider(req: {
398
398
  type: string;
@@ -415,7 +415,7 @@ declare function createModelProviderCatalog(client: TrueForge): ModelCatalogServ
415
415
 
416
416
  type UiSandboxProvider = SandboxProviderBase;
417
417
  type UiSandboxProviderListEntry = SandboxProviderListEntry$1;
418
- declare function configFromHarness(provider: TrueForgeApi.CatalogDaytonaSandboxProvider | TrueForgeApi.SandboxProviderManifest): SandboxProviderConfig;
418
+ declare function configFromHarness(provider: TrueForgeApi.CatalogSandboxProvider | TrueForgeApi.SandboxProviderManifest): SandboxProviderConfig;
419
419
  declare function toUiSandboxProvider(provider: TrueForgeApi.SandboxProviderManifest): UiSandboxProvider;
420
420
  declare function toUiSandboxProviderListEntry(response: TrueForgeApi.GetSandboxProviderResponse['data']): UiSandboxProviderListEntry;
421
421
  declare function filterUiSandboxProviders({ providers, query, }: {
@@ -451,7 +451,7 @@ declare function createSkillCatalog(client: TrueForge): SkillCatalogServer$1<UiS
451
451
  * `nextPageToken`), and `null` normalized to absent. Harness keys MCP mounts by
452
452
  * name and returns `null` for optional fields — the maps below bridge both.
453
453
  *
454
- * Skills are name refs on the wire (`SkillNameRef`).
454
+ * Skills are name refs on the wire (`Skill`).
455
455
  *
456
456
  * Session create takes `{ name }` or `{ spec }`; reads carry the
457
457
  * `reference`/`inline` discriminator, with reference rows already naming their
@@ -472,10 +472,10 @@ declare function createHarnessChatServer(options?: CreateHarnessChatServerOption
472
472
  * Not the settings catalog ports (`catalogs/*`).
473
473
  */
474
474
 
475
- declare function listModels(client: TrueForge): Promise<TrueForgeApi.Model[]>;
476
- declare function listConfiguredMcpServers(client: TrueForge): Promise<TrueForgeApi.McpServerReadEntry[]>;
477
- declare function listSkills(client: TrueForge): Promise<TrueForgeApi.SkillReadEntry[]>;
478
- declare function getCapabilities(client: TrueForge): Promise<TrueForgeApi.GetCapabilitiesResponseData>;
475
+ declare function listModels(client: TrueForge): Promise<TrueForgeApi.AvailableModel[]>;
476
+ declare function listConfiguredMcpServers(client: TrueForge): Promise<TrueForgeApi.AvailableMcpServer[]>;
477
+ declare function listSkills(client: TrueForge): Promise<TrueForgeApi.AvailableSkill[]>;
478
+ declare function getCapabilities(client: TrueForge): Promise<TrueForgeApi.CapabilitiesData>;
479
479
 
480
480
  type CreateTrueForgeAgentUIServerOptions = CreateTrueForgeClientOptions & {
481
481
  /** Override the default Harness settings catalogs. */
@@ -117,7 +117,7 @@ function createConnectorCatalog(client) {
117
117
  }
118
118
  return {
119
119
  getConnectorCatalog: async () => {
120
- const body = await client.catalog.mcpServers.list();
120
+ const body = await client.catalogs.mcpServers.list();
121
121
  return body.data.map(toUiCatalogEntry);
122
122
  },
123
123
  getConnector: async (req) => {
@@ -136,7 +136,7 @@ function createConnectorCatalog(client) {
136
136
  );
137
137
  },
138
138
  getToolsByConnectorId: async ({ id }) => {
139
- const body = await client.settings.mcpServers.listTools(id);
139
+ const body = await client.mcpServers.listTools(id);
140
140
  return body.data.map(toUiTool);
141
141
  },
142
142
  createConnector: async (req) => {
@@ -153,7 +153,7 @@ function createConnectorCatalog(client) {
153
153
  },
154
154
  updateConnector: async (req) => {
155
155
  const auth = await resolveWriteAuth({ id: req.id, auth: req.auth });
156
- const body = await client.settings.mcpServers.upsert({
156
+ const body = await client.settings.mcpServers.createOrUpdate({
157
157
  manifest: toHarnessManifest({
158
158
  name: req.id,
159
159
  url: req.url,
@@ -416,7 +416,10 @@ function modelProviderLogosByName(catalog) {
416
416
  }
417
417
  return logos;
418
418
  }
419
- function toModelSelection({ model, logo }) {
419
+ function toModelSelection({
420
+ model,
421
+ logo
422
+ }) {
420
423
  const efforts = model.properties.reasoningEfforts;
421
424
  return {
422
425
  id: model.modelId,
@@ -444,7 +447,7 @@ function createHarnessBuilderServer(options = {}) {
444
447
  getModels: async () => {
445
448
  const [modelsBody, catalogEntries] = await Promise.all([
446
449
  client.models.list(),
447
- client.catalog.modelProviders.list().then(
450
+ client.catalogs.modelProviders.list().then(
448
451
  (body) => body.data,
449
452
  () => []
450
453
  )
@@ -577,7 +580,7 @@ function createModelProviderCatalog(client) {
577
580
  }
578
581
  return {
579
582
  getModelProviderCatalog: async () => {
580
- const body = await client.catalog.modelProviders.list();
583
+ const body = await client.catalogs.modelProviders.list();
581
584
  return body.data.map(toUiCatalogModelProviderEntry);
582
585
  },
583
586
  listModelProviders: async () => {
@@ -599,7 +602,7 @@ function createModelProviderCatalog(client) {
599
602
  },
600
603
  updateModelProvider: async (req) => {
601
604
  const apiKey = await resolveApiKey({ id: req.id, type: req.type, apiKey: req.apiKey });
602
- const body = await client.settings.modelProviders.upsert({
605
+ const body = await client.settings.modelProviders.createOrUpdate({
603
606
  manifest: toHarnessModelProvider({
604
607
  type: req.type,
605
608
  name: req.id,
@@ -693,7 +696,7 @@ function createSandboxProviderCatalog(client) {
693
696
  }
694
697
  return {
695
698
  getSandboxProviderCatalog: async () => {
696
- const body = await client.catalog.sandboxProviders.list();
699
+ const body = await client.catalogs.sandboxProviders.list();
697
700
  return body.data.map(toUiCatalogEntry2);
698
701
  },
699
702
  listSandboxProviders: async (req) => {
@@ -711,7 +714,7 @@ function createSandboxProviderCatalog(client) {
711
714
  return filterUiSandboxProviders({ providers, query: req?.query });
712
715
  },
713
716
  createSandboxProvider: async (req) => {
714
- const body = await client.settings.sandboxProviders.upsert({
717
+ const body = await client.settings.sandboxProviders.createOrUpdate({
715
718
  manifest: toHarnessManifest2({
716
719
  type: req.type,
717
720
  apiKey: req.apiKey,
@@ -725,7 +728,7 @@ function createSandboxProviderCatalog(client) {
725
728
  },
726
729
  updateSandboxProvider: async (req) => {
727
730
  const apiKey = await resolveApiKey(req.apiKey);
728
- const body = await client.settings.sandboxProviders.upsert({
731
+ const body = await client.settings.sandboxProviders.createOrUpdate({
729
732
  manifest: toHarnessManifest2({
730
733
  type: DAYTONA_TYPE,
731
734
  apiKey,
@@ -776,11 +779,11 @@ function toUiSkill2(skill, catalogNames) {
776
779
  function createSkillCatalog(client) {
777
780
  return {
778
781
  getSkillCatalog: async () => {
779
- const body = await client.catalog.skills.list();
782
+ const body = await client.catalogs.skills.list();
780
783
  return body.data.map(toUiCatalogEntry3);
781
784
  },
782
785
  listSkills: async (req) => {
783
- const [listed, catalog] = await Promise.all([client.settings.skills.list(), client.catalog.skills.list()]);
786
+ const [listed, catalog] = await Promise.all([client.settings.skills.list(), client.catalogs.skills.list()]);
784
787
  const catalogNames = new Set(catalog.data.map((entry) => entry.name));
785
788
  const skills = listed.data.map((skill) => toUiSkill2(skill, catalogNames));
786
789
  const query = req?.query?.trim().toLowerCase();
@@ -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.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.returnTo === undefined ? {} : { returnTo: req.returnTo },\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.deleteAuthorization(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"]}
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.AvailableMcpServer): 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.catalogs.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.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.createOrUpdate({\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.returnTo === undefined ? {} : { returnTo: req.returnTo },\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.deleteAuthorization(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 (`Skill`).\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.Skill): 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.AvailableModel[]> {\n const body = await client.models.list();\n return body.data;\n}\n\nexport async function listConfiguredMcpServers(client: TrueForge): Promise<TrueForgeApi.AvailableMcpServer[]> {\n const body = await client.mcpServers.list();\n return body.data;\n}\n\nexport async function listSkills(client: TrueForge): Promise<TrueForgeApi.AvailableSkill[]> {\n const body = await client.skills.list();\n return body.data;\n}\n\nexport async function getCapabilities(client: TrueForge): Promise<TrueForgeApi.CapabilitiesData> {\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({\n model,\n logo,\n}: {\n model: TrueForgeApi.AvailableModel;\n logo?: string;\n}): 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.catalogs.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.ConfiguredModel): UiModelEntry {\n return {\n id: model.modelId,\n name: model.name,\n properties: model.properties,\n };\n}\n\nexport function toHarnessModelEntry(model: UiModelEntry): TrueForgeApi.ConfiguredModel {\n return {\n modelId: model.id,\n name: model.name,\n properties: model.properties ?? {},\n };\n}\n\nexport function toUiModelProvider(provider: TrueForgeApi.ConfiguredModelProvider): 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.catalogs.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.createOrUpdate({\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.CatalogSandboxProvider | 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.CatalogSandboxProvider): 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.catalogs.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.createOrUpdate({\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.createOrUpdate({\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.catalogs.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.catalogs.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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truefoundry/trueforge-ui",
3
- "version": "0.2.2",
3
+ "version": "0.2.3-rc.0",
4
4
  "description": "TrueForge Agent Chat UI (atoms + containers) built on assistant-ui, with owned theming, presets, and swappable slots.",
5
5
  "author": "TrueFoundry",
6
6
  "license": "MIT",
@@ -92,7 +92,7 @@
92
92
  "tailwind-merge": "^3.6.0",
93
93
  "truefoundry-gateway-sdk": "^0.4.0",
94
94
  "zod": "^4.4.3",
95
- "@truefoundry/trueforge-sdk": "0.1.2"
95
+ "@truefoundry/trueforge-sdk": "0.1.3-rc.0"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@eslint/js": "^9.39.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/containers/SettingsBuilder/index.tsx"],"sourcesContent":["'use client';\n\nimport { lazy, Suspense, useCallback, useEffect, useMemo } from 'react';\n\nimport { useDraftCatalog } from '@/atoms/draft/DraftCatalogProvider.js';\nimport { auiButtonClass } from '@/atoms/lib/buttonClasses.js';\nimport { cn } from '@/atoms/lib/cn.js';\nimport { useCompactLayout } from '@/atoms/lib/CompactLayoutContext.js';\nimport { Spinner } from '@/atoms/primitives/Spinner.js';\nimport { Icon } from '@/icons/Icon.js';\nimport { useOptionalCatalogServer, useOptionalRefreshServerCapabilities } from '@/server/ServerContext.js';\nimport { useShellMode, type SettingsSection } from '@/server/ShellModeContext.js';\n\n// Section modules (and their list/catalog APIs) load only when that tab mounts.\nconst ModelSettings = lazy(() => import('./ModelSettings.js'));\nconst ConnectorSettings = lazy(() => import('./ConnectorSettings.js'));\nconst SkillSettings = lazy(() => import('./SkillSettings.js'));\nconst SandboxSettings = lazy(() => import('./SandboxSettings.js'));\n\nfunction SettingsSectionFallback() {\n return (\n <div className=\"flex flex-1 items-center justify-center py-8\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} className=\"text-text-secondary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n );\n}\n\nconst TruefoundrySettingsBuilder = () => {\n const { settingsOpen, settingsSection: section, setSettingsOpen } = useShellMode();\n const catalog = useOptionalCatalogServer();\n const refreshServerCapabilities = useOptionalRefreshServerCapabilities();\n const { refresh: refreshDraftCatalog } = useDraftCatalog();\n // dock/widget panels are ~mobile width even on a wide viewport — keep Settings stacked.\n const compact = useCompactLayout();\n const hasSkills = catalog?.skillCatalog != null;\n const hasSandbox = catalog?.sandboxCatalog != null;\n\n const closeSettings = useCallback(() => {\n setSettingsOpen(false);\n refreshDraftCatalog();\n refreshServerCapabilities?.();\n }, [refreshDraftCatalog, refreshServerCapabilities, setSettingsOpen]);\n\n useEffect(() => {\n if (!hasSkills && section === 'skills') {\n setSettingsOpen(settingsOpen, 'models');\n }\n if (!hasSandbox && section === 'sandbox') {\n setSettingsOpen(settingsOpen, 'models');\n }\n }, [hasSkills, hasSandbox, section, settingsOpen, setSettingsOpen]);\n\n useEffect(() => {\n if (!settingsOpen) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n event.stopImmediatePropagation();\n closeSettings();\n };\n // Capture so layout Escape handlers (sessions drawer / widget) do not also fire.\n window.addEventListener('keydown', onKeyDown, true);\n return () => window.removeEventListener('keydown', onKeyDown, true);\n }, [closeSettings, settingsOpen]);\n\n const sections = useMemo<\n Array<{\n id: SettingsSection;\n label: string;\n icon: 'cpu' | 'plug' | 'lightbulb' | 'cube';\n }>\n >(() => {\n const baseSections: Array<{\n id: SettingsSection;\n label: string;\n icon: 'cpu' | 'plug' | 'lightbulb' | 'cube';\n }> = [\n { id: 'models', label: 'Models', icon: 'cpu' },\n { id: 'connectors', label: 'Connectors', icon: 'plug' },\n ];\n if (hasSkills) {\n baseSections.push({ id: 'skills', label: 'Skills', icon: 'lightbulb' });\n }\n if (hasSandbox) {\n baseSections.push({ id: 'sandbox', label: 'Sandbox providers', icon: 'cube' });\n }\n return baseSections;\n }, [hasSkills, hasSandbox]);\n\n if (!settingsOpen || !catalog) return null;\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col bg-primary-bg\">\n <header className=\"flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5\">\n <button\n type=\"button\"\n aria-label=\"Back\"\n title=\"Back\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={closeSettings}\n >\n <Icon name=\"arrow-left\" />\n </button>\n <h1 className=\"text-lg font-semibold tracking-tight text-text-primary\">Settings</h1>\n </header>\n\n <div className={cn('flex min-h-0 flex-1 flex-col', !compact && 'md:flex-row')}>\n <nav\n aria-label=\"Settings sections\"\n className={cn(\n 'flex w-full gap-1 border-b border-border bg-secondary-bg/40 p-2',\n compact ? 'min-w-0' : 'justify-center md:w-48 md:flex-col md:justify-start md:border-b-0 md:border-r',\n )}\n >\n {sections.map(item => (\n <button\n key={item.id}\n type=\"button\"\n aria-current={section === item.id ? 'page' : undefined}\n {...(compact ? { title: item.label } : {})}\n className={cn(\n 'flex min-h-9 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring',\n // Narrow panels cannot fit fixed-width tabs, so tabs split the row instead.\n compact ? 'min-w-0 flex-1 justify-center gap-1.5 px-1.5' : 'shrink-0',\n section === item.id\n ? 'bg-primary-button-bg text-primary-button-text'\n : 'text-text-secondary hover:bg-ghost-button-hover/60 hover:text-text-primary',\n )}\n onClick={() => {\n setSettingsOpen(true, item.id);\n }}\n >\n <Icon name={item.icon} className=\"h-4 w-4 shrink-0\" />\n {compact ? <span className=\"truncate\">{item.label}</span> : item.label}\n </button>\n ))}\n </nav>\n\n <section className=\"flex flex-col h-full flex-1 overflow-y-hidden px-6 py-4\">\n <div className=\"w-full max-w-210 h-full min-h-0 flex flex-col mx-auto\">\n <Suspense fallback={<SettingsSectionFallback />}>\n {section === 'models' ? <ModelSettings /> : null}\n {section === 'connectors' ? <ConnectorSettings /> : null}\n {section === 'skills' && hasSkills ? <SkillSettings /> : null}\n {section === 'sandbox' && hasSandbox ? <SandboxSettings /> : null}\n </Suspense>\n </div>\n </section>\n </div>\n </div>\n );\n};\n\nexport default TruefoundrySettingsBuilder;\n"],"mappings":"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","names":[]}