@truefoundry/trueforge-ui 0.3.1 → 0.4.0-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 (85) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/NOTICE +1 -1
  3. package/README.md +26 -89
  4. package/dist/{AgentCodeSnippets-DAZWEBJS.js → AgentCodeSnippets-BPC6TD7K.js} +5 -5
  5. package/dist/AgentMetricChart-T6DZZ37Y.js +15 -0
  6. package/dist/{AgentOverview-5JIVYXPX.js → AgentOverview-BFU7EO4Y.js} +5 -5
  7. package/dist/{AgentSessionEventTimeline-WELJSS6O.js → AgentSessionEventTimeline-ATVBTYDF.js} +5 -5
  8. package/dist/{AgentSessionEventTimelineChart-ADB3KICM.js → AgentSessionEventTimelineChart-H577STKW.js} +5 -5
  9. package/dist/{AgentSessions-NSN4LIGJ.js → AgentSessions-GDLBXFIK.js} +6 -6
  10. package/dist/{ConnectorSettings-C6MFCKYX.js → ConnectorSettings-FYNF6J3F.js} +5 -5
  11. package/dist/{DockLayout-VY7OZ55R.js → DockLayout-SGUOMZ5E.js} +8 -8
  12. package/dist/{DrawerLayout-B2UA3CZO.js → DrawerLayout-MJJYQDCW.js} +9 -9
  13. package/dist/{ModelSettings-3YAHICJ3.js → ModelSettings-6EW7U2MP.js} +5 -5
  14. package/dist/{SandboxSettings-ALR6F5KU.js → SandboxSettings-HQVBGHXZ.js} +5 -5
  15. package/dist/SchedulesPage-ZO3PJY4J.js +15 -0
  16. package/dist/{SettingsBuilder-G5CP5X6Q.js → SettingsBuilder-FODMI7HG.js} +19 -10
  17. package/dist/SettingsBuilder-FODMI7HG.js.map +1 -0
  18. package/dist/{ShellRouteSync-G7IJ5VIW.js → ShellRouteSync-4I5BP2VY.js} +4 -4
  19. package/dist/{SidebarLayout-FKRLGEDB.js → SidebarLayout-ZLWG2YGO.js} +10 -10
  20. package/dist/{SkillSettings-E5SJ4U3T.js → SkillSettings-AFSAOU6O.js} +5 -5
  21. package/dist/{TrueForgeUIWithRouter-WD7O3TWR.js → TrueForgeUIWithRouter-RQX5XWGI.js} +7 -7
  22. package/dist/WebSearchSettings-BW4CWGRR.js +322 -0
  23. package/dist/WebSearchSettings-BW4CWGRR.js.map +1 -0
  24. package/dist/{WidgetLayout-KQZTQNE7.js → WidgetLayout-WIPKUIL4.js} +8 -8
  25. package/dist/{chunk-2XT2VUT4.js → chunk-7S7A3PNP.js} +3 -3
  26. package/dist/chunk-7S7A3PNP.js.map +1 -0
  27. package/dist/{chunk-AU4BJQMK.js → chunk-GHXA46A2.js} +22 -22
  28. package/dist/chunk-GHXA46A2.js.map +1 -0
  29. package/dist/{chunk-7AAO4UDQ.js → chunk-HCGDDQ4G.js} +5 -5
  30. package/dist/chunk-HCGDDQ4G.js.map +1 -0
  31. package/dist/{chunk-XHPIJ77Q.js → chunk-HDMBSLDC.js} +2 -2
  32. package/dist/{chunk-XR4S7B2K.js → chunk-MLMR26WQ.js} +53 -50
  33. package/dist/chunk-MLMR26WQ.js.map +1 -0
  34. package/dist/{chunk-7UE7LZS2.js → chunk-Q22RHDYS.js} +34 -59
  35. package/dist/chunk-Q22RHDYS.js.map +1 -0
  36. package/dist/{chunk-G7BT4OKG.js → chunk-TFQWCBFQ.js} +11 -11
  37. package/dist/chunk-TFQWCBFQ.js.map +1 -0
  38. package/dist/{chunk-B76JC5B2.js → chunk-TJGGIEF6.js} +3 -3
  39. package/dist/{chunk-4OZFQVSR.js → chunk-TX6PB3DY.js} +2 -2
  40. package/dist/{chunk-2XFOONKH.js → chunk-VBZXCX7Y.js} +7 -7
  41. package/dist/{chunk-SAYUMANU.js → chunk-Y47LJKXD.js} +10 -10
  42. package/dist/{chunk-IGYCJIU7.js → chunk-YN5ZBBQM.js} +8 -8
  43. package/dist/{chunk-AO23SZBG.js → chunk-ZYJ2SBF7.js} +2 -2
  44. package/dist/createTrueForgeServer-DiSooQdh.d.ts +42 -0
  45. package/dist/index.d.ts +29 -36
  46. package/dist/index.js +41 -41
  47. package/dist/index.js.map +1 -1
  48. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +57 -894
  49. package/dist/plugins/trueforge-agent-server-adapter/index.js +104 -5
  50. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  51. package/package.json +8 -7
  52. package/dist/AgentMetricChart-VDIE3S2P.js +0 -15
  53. package/dist/SchedulesPage-TIS3BH67.js +0 -15
  54. package/dist/SettingsBuilder-G5CP5X6Q.js.map +0 -1
  55. package/dist/chunk-2XT2VUT4.js.map +0 -1
  56. package/dist/chunk-7AAO4UDQ.js.map +0 -1
  57. package/dist/chunk-7UE7LZS2.js.map +0 -1
  58. package/dist/chunk-AU4BJQMK.js.map +0 -1
  59. package/dist/chunk-G7BT4OKG.js.map +0 -1
  60. package/dist/chunk-XR4S7B2K.js.map +0 -1
  61. package/dist/createTrueFoundryServer-B_FYhSdn.d.ts +0 -42
  62. /package/dist/{AgentCodeSnippets-DAZWEBJS.js.map → AgentCodeSnippets-BPC6TD7K.js.map} +0 -0
  63. /package/dist/{AgentMetricChart-VDIE3S2P.js.map → AgentMetricChart-T6DZZ37Y.js.map} +0 -0
  64. /package/dist/{AgentOverview-5JIVYXPX.js.map → AgentOverview-BFU7EO4Y.js.map} +0 -0
  65. /package/dist/{AgentSessionEventTimeline-WELJSS6O.js.map → AgentSessionEventTimeline-ATVBTYDF.js.map} +0 -0
  66. /package/dist/{AgentSessionEventTimelineChart-ADB3KICM.js.map → AgentSessionEventTimelineChart-H577STKW.js.map} +0 -0
  67. /package/dist/{AgentSessions-NSN4LIGJ.js.map → AgentSessions-GDLBXFIK.js.map} +0 -0
  68. /package/dist/{ConnectorSettings-C6MFCKYX.js.map → ConnectorSettings-FYNF6J3F.js.map} +0 -0
  69. /package/dist/{DockLayout-VY7OZ55R.js.map → DockLayout-SGUOMZ5E.js.map} +0 -0
  70. /package/dist/{DrawerLayout-B2UA3CZO.js.map → DrawerLayout-MJJYQDCW.js.map} +0 -0
  71. /package/dist/{ModelSettings-3YAHICJ3.js.map → ModelSettings-6EW7U2MP.js.map} +0 -0
  72. /package/dist/{SandboxSettings-ALR6F5KU.js.map → SandboxSettings-HQVBGHXZ.js.map} +0 -0
  73. /package/dist/{SchedulesPage-TIS3BH67.js.map → SchedulesPage-ZO3PJY4J.js.map} +0 -0
  74. /package/dist/{ShellRouteSync-G7IJ5VIW.js.map → ShellRouteSync-4I5BP2VY.js.map} +0 -0
  75. /package/dist/{SidebarLayout-FKRLGEDB.js.map → SidebarLayout-ZLWG2YGO.js.map} +0 -0
  76. /package/dist/{SkillSettings-E5SJ4U3T.js.map → SkillSettings-AFSAOU6O.js.map} +0 -0
  77. /package/dist/{TrueForgeUIWithRouter-WD7O3TWR.js.map → TrueForgeUIWithRouter-RQX5XWGI.js.map} +0 -0
  78. /package/dist/{WidgetLayout-KQZTQNE7.js.map → WidgetLayout-WIPKUIL4.js.map} +0 -0
  79. /package/dist/{chunk-XHPIJ77Q.js.map → chunk-HDMBSLDC.js.map} +0 -0
  80. /package/dist/{chunk-B76JC5B2.js.map → chunk-TJGGIEF6.js.map} +0 -0
  81. /package/dist/{chunk-4OZFQVSR.js.map → chunk-TX6PB3DY.js.map} +0 -0
  82. /package/dist/{chunk-2XFOONKH.js.map → chunk-VBZXCX7Y.js.map} +0 -0
  83. /package/dist/{chunk-SAYUMANU.js.map → chunk-Y47LJKXD.js.map} +0 -0
  84. /package/dist/{chunk-IGYCJIU7.js.map → chunk-YN5ZBBQM.js.map} +0 -0
  85. /package/dist/{chunk-AO23SZBG.js.map → chunk-ZYJ2SBF7.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/plugins/trueforge-agent-server-adapter/client.ts","../../../src/plugins/trueforge-agent-server-adapter/agentMetricsServer.ts","../../../src/plugins/trueforge-agent-server-adapter/toUiTurnState.ts","../../../src/plugins/trueforge-agent-server-adapter/chatServer.ts","../../../src/plugins/trueforge-agent-server-adapter/agentSessionsServer.ts","../../../src/plugins/trueforge-agent-server-adapter/agentsList.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.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/permissionsServer.ts","../../../src/plugins/trueforge-agent-server-adapter/schedules/scheduleServer.ts","../../../src/plugins/trueforge-agent-server-adapter/index.ts"],"sourcesContent":["/**\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\n/**\n * SDK passthrough `fetch` only attaches Bearer when `baseUrl` and the request URL\n * are absolute same-origin URLs. Relative defaults like `/` fail that check, so\n * absolutize against the page origin in the browser.\n */\nexport function resolveTrueForgeBaseUrl(baseUrl: string): string {\n if (/^https?:\\/\\//i.test(baseUrl)) return baseUrl;\n const origin = globalThis.location?.origin;\n if (typeof origin === 'string' && origin.length > 0 && origin !== 'null') {\n return new URL(baseUrl, origin).href;\n }\n return baseUrl;\n}\n\nexport function createTrueForgeClient(options: CreateTrueForgeClientOptions = {}): TrueForge {\n return new TrueForge({\n baseUrl: resolveTrueForgeBaseUrl(options.baseUrl ?? DEFAULT_BASE_URL),\n ...(options.token === undefined ? {} : { token: options.token }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n}\n\nexport function parseIsoDate(value: string): Date {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid ISO timestamp: ${value}`);\n }\n return date;\n}\n","import type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\n\nimport type { AgentMetricsServer } from '../../server/types.js';\nimport { createTrueForgeClient, parseIsoDate, type CreateTrueForgeClientOptions } from './client.js';\n\nexport type CreateHarnessAgentMetricsServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\nfunction toHarnessChartName(name: string): TrueForgeApi.SessionMetricsChartName {\n if (name === 'sessions_over_time' || name === 'sessions_cost_over_time' || name === 'turns_over_time') {\n return name;\n }\n throw new Error(`Unsupported Harness metrics chart: ${name}`);\n}\n\nexport function createHarnessAgentMetricsServer(\n options: CreateHarnessAgentMetricsServerOptions = {},\n): AgentMetricsServer {\n const client = options.client ?? createTrueForgeClient(options);\n\n return {\n async getCharts() {\n const { data } = await client.internal.metrics.listCharts();\n return data.charts;\n },\n async getMeters({ agentId, startTimestamp, endTimestamp }) {\n const { data } = await client.internal.metrics.getMeters({\n agentId,\n startTimestamp: parseIsoDate(startTimestamp),\n endTimestamp: parseIsoDate(endTimestamp),\n });\n return data.meters;\n },\n async getChartData({ agentId, startTimestamp, endTimestamp, chartName }) {\n const { data } = await client.internal.metrics.getChartData({\n agentId,\n startTimestamp: parseIsoDate(startTimestamp),\n endTimestamp: parseIsoDate(endTimestamp),\n chartName: toHarnessChartName(chartName),\n });\n return data;\n },\n };\n}\n","import type { TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type { SessionEventItem, TurnDoneMetrics, TurnState, TurnStreamingEvent } from '../../server/types.js';\n\n/** SDK token fields are optional; the UI contract requires numbers. Keep cost for session tiles. */\nexport function toUiTurnDoneMetrics(metrics: TrueForgeApi.TurnMetrics): TurnDoneMetrics & { totalCostInUsd?: number } {\n return {\n totalInputTokens: metrics.totalInputTokens ?? 0,\n totalOutputTokens: metrics.totalOutputTokens ?? 0,\n totalTokens: metrics.totalTokens ?? 0,\n totalCacheReadTokens: metrics.totalCacheReadTokens ?? 0,\n totalCacheWriteTokens: metrics.totalCacheWriteTokens ?? 0,\n totalReasoningTokens: metrics.totalReasoningTokens ?? 0,\n ...(metrics.totalCostInUsd == null ? {} : { totalCostInUsd: metrics.totalCostInUsd }),\n };\n}\n\nexport function toUiTurnState(state: TrueForgeApi.TurnState | TrueForgeApi.TurnDoneEventState): TurnState {\n return state.status === 'running' ? { status: 'running' } : toUiTerminalTurnState(state);\n}\n\nfunction toUiTerminalTurnState(state: TrueForgeApi.TurnDoneEventState): Exclude<TurnState, { status: 'running' }> {\n switch (state.status) {\n case 'cancelled':\n return { status: 'cancelled', reason: state.reason, completedAt: state.completedAt };\n case 'error':\n return { status: 'error', message: state.message, completedAt: state.completedAt };\n case 'done':\n return {\n status: 'done',\n completedAt: state.completedAt,\n requiredActions: state.requiredActions,\n ...(state.output == null ? {} : { output: state.output }),\n ...(state.metrics == null ? {} : { metrics: toUiTurnDoneMetrics(state.metrics) }),\n };\n }\n}\n\nexport function toUiSessionEvent(event: TrueForgeApi.SessionEvent): SessionEventItem['event'] | undefined {\n // TODO: map turn.update when the runtime event union includes it\n if (event.type === 'turn.update') return undefined;\n if (event.type !== 'turn.done') return { ...event };\n return { ...event, state: toUiTerminalTurnState(event.state) };\n}\n\nexport function toUiStreamingEvent(event: TrueForgeApi.TurnStreamingEvent): TurnStreamingEvent | undefined {\n // TODO: map turn.update when the runtime event union includes it\n if (event.type === 'turn.update') return undefined;\n if (event.type !== 'turn.done') return { ...event };\n return { ...event, state: toUiTerminalTurnState(event.state) };\n}\n\nexport function toUiEventItem(item: TrueForgeApi.SessionEventItem): SessionEventItem | undefined {\n const event = toUiSessionEvent(item.event);\n return event === undefined ? undefined : { turnId: item.turnId, event };\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 (+ optional preload) 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 { readSessionIsCreateAgent } from '../../atoms/lib/sessionCreateAgent.js';\nimport type {\n AgentChatServer,\n CreateSessionRequest,\n ListResult,\n Session,\n Turn,\n TurnInputItem,\n UserMessageContent,\n} from '../../server/types.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport { toUiEventItem, toUiStreamingEvent, toUiTurnState } from './toUiTurnState.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\n/** UI session with create-agent intent for resume chrome. */\nexport type HarnessUiSession = Session<HarnessAgentSpec> & { isCreateAgent: boolean };\n\nexport type HarnessCreateSessionRequest = CreateSessionRequest<HarnessAgentSpec> & {\n metadata?: Record<string, string>;\n};\n\nfunction toUiMcpServer(server: TrueForgeApi.McpServer): HarnessMcpServerMount {\n return server;\n}\n\nfunction toUiSkill(skill: TrueForgeApi.Skill): HarnessSkillMount {\n return { name: skill.name, preload: skill.preload === true };\n}\n\nfunction toHarnessSkill(skill: HarnessSkillMount): TrueForgeApi.Skill {\n // Picker `id` is AvailableSkill.name (attach key); `name` is display — see builder getSkills.\n return { name: skill.id ?? skill.name, preload: skill.preload === true };\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(toHarnessSkill) }),\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): HarnessUiSession {\n return {\n id: session.id,\n isMutable: session.agent.type === 'inline',\n isCreateAgent: readSessionIsCreateAgent(session.metadata),\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\nfunction createSessionMetadata(request: HarnessCreateSessionRequest): Record<string, string> | undefined {\n if (request.metadata === undefined) return undefined;\n return request.metadata;\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, state, ...rest } = turn;\n return {\n ...rest,\n state: toUiTurnState(state),\n ...(previousTurnId === null ? {} : { previousTurnId }),\n ...(input === undefined ? {} : { input: toUiInput(input) }),\n };\n}\n\nexport interface HarnessPageSource<T> {\n data: T[];\n response: { pagination: TrueForgeApi.TokenPagination };\n}\n\nexport function toListResult<TSource, TResult>(\n page: HarnessPageSource<TSource>,\n map: (item: TSource) => TResult | undefined,\n): ListResult<TResult> {\n const data: TResult[] = [];\n for (const item of page.data) {\n const mapped = map(item);\n if (mapped !== undefined) data.push(mapped);\n }\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, HarnessUiSession, HarnessCreateSessionRequest> {\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 const metadata = createSessionMetadata(request);\n if (request.agentName !== undefined && request.agentName.length > 0) {\n const created = await client.sessions.create({\n agent: { name: request.agentName },\n ...(metadata === undefined ? {} : { metadata }),\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 ...(metadata === undefined ? {} : { metadata }),\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 ...(request.createdByMe === undefined ? {} : { createdByMe: request.createdByMe }),\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 deleteSession({ sessionId }) {\n await client.sessions.delete(sessionId);\n },\n\n async renameSession({ sessionId, title }) {\n await client.sessions.update(sessionId, { title });\n },\n\n async updateSession({ sessionId, agentSpec, title }) {\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 ...(title === undefined ? {} : { title }),\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 const event = toUiStreamingEvent(item.data);\n if (event !== undefined) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event,\n };\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 const event = toUiStreamingEvent(item.data);\n if (event !== undefined) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event,\n };\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","import type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport { readSessionIsCreateAgent } from '../../atoms/lib/sessionCreateAgent.js';\nimport type { AgentSessionsServer, SessionListEntry } from '../../server/types.js';\nimport { toListResult, toUiAgentSpec } from './chatServer.js';\nimport {\n createTrueForgeClient,\n parseIsoDate,\n resolveTrueForgeBaseUrl,\n type CreateTrueForgeClientOptions,\n} from './client.js';\nimport { toUiEventItem } from './toUiTurnState.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport type CreateHarnessAgentSessionsServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\nexport type HarnessSessionListEntry = SessionListEntry<HarnessAgentSpec> & {\n isCreateAgent: boolean;\n isMutable: boolean;\n sourceType?: 'schedule';\n};\n\nfunction toSessionListEntry(session: TrueForgeApi.Session): HarnessSessionListEntry {\n return {\n id: session.id,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n lastActivityAt: session.updatedAt,\n isCreateAgent: readSessionIsCreateAgent(session.metadata),\n isMutable: session.agent.type === 'inline',\n metrics: {\n totalTurns: session.metrics.totalTurns,\n ...(session.metrics.totalCostInUsd == null ? {} : { totalCostInUsd: session.metrics.totalCostInUsd }),\n totalDurationMs: session.metrics.totalDurationMs,\n },\n ...(session.title === null ? {} : { title: session.title }),\n ...(session.agent.type === 'reference' && session.agent.name !== null ? { agentName: session.agent.name } : {}),\n ...(session.agent.type === 'inline' ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}),\n ...(session.source?.type === 'schedule' ? { sourceType: session.source.type } : {}),\n };\n}\n\nexport function createHarnessAgentSessionsServer(\n options: CreateHarnessAgentSessionsServerOptions = {},\n): AgentSessionsServer<HarnessAgentSpec> {\n const client = options.client ?? createTrueForgeClient(options);\n\n return {\n async getAgent({ agentId }) {\n const { data } = await client.agents.get(agentId);\n return {\n agentId: data.id,\n name: data.name,\n description: data.description,\n agentSpec: toUiAgentSpec(data.manifest),\n };\n },\n async getCodeSnippets({ agentId }) {\n // Snippet SDK `baseUrl` should not end with `/` (hosts often pass a trailing path slash).\n const absoluteBaseUrl = resolveTrueForgeBaseUrl(options.baseUrl ?? '/').replace(/\\/$/, '');\n const { data } = await client.internal.agents.getCodeSnippets(\n agentId,\n /^https?:\\/\\//i.test(absoluteBaseUrl) ? { baseUrl: absoluteBaseUrl } : undefined,\n );\n return data.snippets;\n },\n async listSessions(requestParams = {}) {\n const page = await client.sessions.list({\n ...(requestParams.limit === undefined ? {} : { limit: requestParams.limit }),\n ...(requestParams.order === undefined ? {} : { order: requestParams.order }),\n ...(requestParams.pageToken === undefined ? {} : { pageToken: requestParams.pageToken }),\n ...(requestParams.startTimestamp === undefined\n ? {}\n : { startTimestamp: parseIsoDate(requestParams.startTimestamp) }),\n ...(requestParams.endTimestamp === undefined ? {} : { endTimestamp: parseIsoDate(requestParams.endTimestamp) }),\n ...(requestParams.agentId === undefined || requestParams.agentId.length === 0\n ? {}\n : { agentId: requestParams.agentId }),\n ...(requestParams.createdByMe === undefined ? {} : { createdByMe: requestParams.createdByMe }),\n });\n return toListResult(page, toSessionListEntry);\n },\n async listSessionEvents({ sessionId, pageToken, limit }) {\n const page = await client.sessions.listEvents(sessionId, {\n ...(pageToken === undefined ? {} : { pageToken }),\n ...(limit === undefined ? {} : { limit }),\n });\n return toListResult(page, toUiEventItem);\n },\n };\n}\n","/**\n * Paginated helpers for `client.agents.list` (API default 50, max 100).\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\n\n/** Matches API AGENTS_PAGE_DEFAULT / AGENTS_PAGE_LIMIT. */\nexport const AGENTS_PAGE_DEFAULT = 50;\nexport const AGENTS_PAGE_LIMIT = 100;\n\nexport function clampAgentsPageSize(size: number): number {\n return Math.min(Math.max(size, 1), AGENTS_PAGE_LIMIT);\n}\n\n/**\n * One page of agents. `offset` must be a multiple of `limit` (page-aligned);\n * advances via SDK `getNextPage` so we never invent page tokens.\n */\nexport async function listAgentsPage({\n client,\n limit,\n offset = 0,\n agentName,\n}: {\n client: TrueForge;\n limit: number;\n offset?: number;\n agentName?: string;\n}): Promise<TrueForgeApi.Agent[]> {\n const pageSize = clampAgentsPageSize(limit);\n const start = Math.max(0, offset);\n const page = await client.agents.list({\n limit: pageSize,\n ...(agentName === undefined ? {} : { agentName }),\n });\n let at = 0;\n while (at < start) {\n if (!page.hasNextPage()) return [];\n await page.getNextPage();\n at += pageSize;\n }\n return [...page.data];\n}\n\n/** Drain every agents page into one array (name lookups, indexes). */\nexport async function drainAgentsList(client: TrueForge): Promise<TrueForgeApi.Agent[]> {\n const items: TrueForgeApi.Agent[] = [];\n const page = await client.agents.list({ limit: AGENTS_PAGE_DEFAULT });\n for (;;) {\n items.push(...page.data);\n if (!page.hasNextPage()) break;\n await page.getNextPage();\n }\n return items;\n}\n","/**\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\n/** Prefixed Authorization values for MCP catalog servers that expect `Bearer …`. */\nfunction ensureBearerAuthorizationValue({ headerName, value }: { headerName: string; value: string }): string {\n if (headerName.toLowerCase() !== DEFAULT_API_KEY_HEADER.toLowerCase()) {\n return value;\n }\n if (/^bearer\\s+/i.test(value)) {\n return value;\n }\n return `Bearer ${value}`;\n}\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 {\n type: 'header',\n headers: { [headerName]: ensureBearerAuthorizationValue({ headerName, value: apiKey }) },\n };\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 type UiToolAnnotations = {\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n};\n\nfunction toUiToolAnnotations(value: unknown): UiToolAnnotations | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const readOnlyHint = Reflect.get(value, 'readOnlyHint');\n const destructiveHint = Reflect.get(value, 'destructiveHint');\n const annotations: UiToolAnnotations = {\n ...(typeof readOnlyHint === 'boolean' ? { readOnlyHint } : {}),\n ...(typeof destructiveHint === 'boolean' ? { destructiveHint } : {}),\n };\n return Object.keys(annotations).length > 0 ? annotations : undefined;\n}\n\nexport function toUiTool(tool: Record<string, unknown>): ToolBase & { annotations?: UiToolAnnotations } {\n const name = typeof tool.name === 'string' && tool.name !== '' ? tool.name : 'tool';\n const description = typeof tool.description === 'string' ? tool.description : '';\n const annotations = toUiToolAnnotations(Reflect.get(tool, 'annotations'));\n return annotations === undefined ? { id: name, name, description } : { id: name, name, description, annotations };\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 * 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 { AGENTS_PAGE_DEFAULT, clampAgentsPageSize, drainAgentsList, listAgentsPage } from './agentsList.js';\nimport { toUiConnectorFromReadEntry, toUiTool } 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 { contextLength, maxOutputTokens, reasoningEfforts } = model.properties;\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 ...(contextLength === undefined ? {} : { contextLength }),\n ...(maxOutputTokens === undefined ? {} : { maxOutputTokens }),\n ...(reasoningEfforts === undefined ? {} : { reasoningEfforts: [...reasoningEfforts] }),\n },\n };\n}\n\nfunction toLibraryEntry(agent: TrueForgeApi.Agent): AgentLibraryEntry {\n return {\n name: agent.name,\n agentId: agent.id,\n description: agent.description,\n agentSpec: toUiAgentSpec(agent.manifest),\n createdBySubject: agent.createdBySubject,\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 // Catalog AvailableSkill.name is store identity (FQN in TFY). Picker `id` copies that\n // attach key; `name` is displayName so the draft can show a label without losing the wire key.\n // Draft mounts `{ id, name }`; toHarnessSkill admits AgentSpec.skills[].name = id ?? name.\n getSkills: async () => {\n const skills = await listSkills(client);\n return skills.map(skill => {\n const { display_name, repository_name, version: versionRaw } = skill.metadata ?? {};\n const version = Number(versionRaw);\n const hasVersion = Number.isInteger(version) && version > 0;\n return {\n id: skill.name,\n name: display_name ?? skill.name,\n description: skill.description,\n ...(repository_name === undefined ? {} : { skillRepoName: repository_name }),\n ...(hasVersion\n ? {\n version,\n loadVersions: async () => (await client.skills.listVersions({ name: skill.name })).data,\n }\n : {}),\n };\n });\n },\n getMcp: async () => (await listConfiguredMcpServers(client)).map(toUiConnectorFromReadEntry),\n getMcpConnector: async ({ connectorId }: { connectorId: string }) => {\n const body = await client.mcpServers.get(connectorId);\n return toUiConnectorFromReadEntry(body.data);\n },\n getMcpTools: async ({ connectorId }: { connectorId: string }) => {\n const body = await client.mcpServers.listTools(connectorId);\n return body.data.flatMap(tool =>\n typeof tool.name === 'string' && tool.name.trim() !== '' ? [toUiTool(tool)] : [],\n );\n },\n\n async searchAgents(req?: SearchAgentsParams) {\n const limit = clampAgentsPageSize(req?.limit ?? AGENTS_PAGE_DEFAULT);\n const offset = req?.offset ?? 0;\n const query = req?.query?.trim();\n const rows = await listAgentsPage({\n client,\n limit,\n offset,\n ...(query === undefined || query === '' ? {} : { agentName: query }),\n });\n return rows.map(toLibraryEntry);\n },\n\n async saveAgent({ agentName, description: descriptionRaw, agentSpec, intent }) {\n const manifest = toHarnessAgentSpec(agentSpec);\n const description = descriptionRaw?.trim();\n if (intent === 'update') {\n const agents = await drainAgentsList(client);\n const existing = agents.find(agent => agent.name === agentName);\n if (!existing) {\n return {};\n }\n // Omit empty description on update so a reloaded draft (no description in session\n // manifest) preserves the stored value instead of failing min(1).\n await client.agents.update(existing.id, {\n ...(description ? { description } : {}),\n manifest,\n });\n return { agentId: existing.id };\n }\n // Create requires description; fall back to name for clone of pre-description agents.\n const created = await client.agents.create({\n name: agentName,\n description: description || agentName,\n manifest,\n });\n return { agentId: created.data.id };\n },\n\n async deleteAgent({ agentName }) {\n const agents = await drainAgentsList(client);\n const existing = agents.find(agent => agent.name === agentName);\n if (!existing) return;\n await client.agents.delete(existing.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 Exclude<TrueForgeApi.ModelProviderManifest['type'], 'truefoundry'> {\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.settings.CreateSkillRequest['manifest'] {\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 manifest = skill.manifest;\n const displayName =\n 'displayName' in manifest && typeof manifest.displayName === 'string' ? manifest.displayName : manifest.name;\n const base = {\n id: skill.name,\n name: displayName,\n description: 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","import type { TrueForge } from '@truefoundry/trueforge-sdk';\n\nimport type { PermissionsServer } from '../../server/types.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\n\nexport type CreateHarnessPermissionsServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\nexport function createHarnessPermissionsServer(options: CreateHarnessPermissionsServerOptions = {}): PermissionsServer {\n const client = options.client ?? createTrueForgeClient(options);\n return {\n listPermissions: async request => client.internal.listPermissions(request),\n };\n}\n","/**\n * Harness ScheduleServer adapter — maps flat runtime DTOs to SDK wire (manifest + agentName).\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n CreateScheduleRequest,\n CreateScheduleRunRequest,\n ListResult,\n ListSchedulesParams,\n Schedule,\n ScheduleRun,\n ScheduleServer,\n ScheduleStatus,\n UpdateScheduleRequest,\n} from '../../../server/types.js';\nimport { drainAgentsList } from '../agentsList.js';\nimport { toListResult } from '../chatServer.js';\n\n/** Matches API PAGE_LIMIT for schedules list. */\nconst SCHEDULES_PAGE_LIMIT = 25;\n\ntype AgentIndex = {\n idToName: ReadonlyMap<string, string>;\n nameToId: ReadonlyMap<string, string>;\n};\n\nasync function loadAgentIndex(client: TrueForge): Promise<AgentIndex> {\n const agents = await drainAgentsList(client);\n const idToName = new Map<string, string>();\n const nameToId = new Map<string, string>();\n for (const agent of agents) {\n idToName.set(agent.id, agent.name);\n nameToId.set(agent.name, agent.id);\n }\n return { idToName, nameToId };\n}\n\nfunction resolveAgentName(agentId: string, index: AgentIndex): string {\n const byId = index.idToName.get(agentId);\n if (byId != null) return byId;\n if (index.nameToId.has(agentId)) return agentId;\n throw new Error(`Unknown agent: ${agentId}`);\n}\n\nfunction collectAgentIds(req?: ListSchedulesParams): string[] {\n const ids: string[] = [];\n if (req?.agentIds != null) {\n for (const id of req.agentIds) {\n if (id !== '') ids.push(id);\n }\n }\n if (req?.agentId != null && req.agentId !== '') ids.push(req.agentId);\n return [...new Set(ids)];\n}\n\nfunction wireStatus(manifest: TrueForgeApi.ScheduleManifest): ScheduleStatus {\n return manifest.status ?? 'active';\n}\n\nfunction toUiSchedule(wire: TrueForgeApi.Schedule, index: AgentIndex): Schedule {\n const agentId = index.nameToId.get(wire.agentName) ?? wire.agentName;\n return {\n id: wire.id,\n name: wire.name,\n agentId,\n agentName: wire.agentName,\n task: wire.manifest.task,\n cron: wire.manifest.cron,\n timezone: wire.manifest.timezone ?? 'UTC',\n status: wireStatus(wire.manifest),\n lastRunAt: null,\n createdBySubject: wire.createdBySubject,\n };\n}\n\nfunction toWireManifest(input: {\n task: string;\n cron: string;\n timezone?: string;\n status?: ScheduleStatus;\n}): TrueForgeApi.ScheduleManifest {\n return {\n task: input.task,\n cron: input.cron,\n timezone: input.timezone ?? 'UTC',\n status: input.status ?? 'active',\n };\n}\n\nfunction toIsoInstant(value: Date | string): string {\n if (value instanceof Date) return value.toISOString();\n return value;\n}\n\nfunction toUiScheduleRun(wire: TrueForgeApi.ScheduleRun): ScheduleRun {\n return {\n id: wire.id,\n scheduleId: wire.scheduleId,\n name: wire.name,\n scheduledFor: toIsoInstant(wire.scheduledFor),\n status: wire.status,\n triggeredAt: wire.triggeredAt == null ? null : toIsoInstant(wire.triggeredAt),\n triggeredBy: wire.createdBySubject.subjectDisplayName || wire.createdBySubject.subjectId,\n };\n}\n\nexport function createScheduleServer(options: { client: TrueForge }): ScheduleServer {\n const { client } = options;\n\n return {\n async listSchedules(req?: ListSchedulesParams): Promise<ListResult<Schedule>> {\n const index = await loadAgentIndex(client);\n const agentIds = collectAgentIds(req);\n const agentNames = agentIds.length === 0 ? undefined : agentIds.map(id => resolveAgentName(id, index)).join(',');\n const limit = Math.min(Math.max(req?.limit ?? SCHEDULES_PAGE_LIMIT, 1), SCHEDULES_PAGE_LIMIT);\n const page = await client.schedules.list({\n limit,\n ...(req?.pageToken === undefined || req.pageToken === '' ? {} : { pageToken: req.pageToken }),\n ...(agentNames === undefined ? {} : { agentNames }),\n });\n return toListResult(page, row => toUiSchedule(row, index));\n },\n\n async getSchedule({ id }): Promise<Schedule> {\n const index = await loadAgentIndex(client);\n const { data } = await client.schedules.get(id);\n return toUiSchedule(data, index);\n },\n\n async createSchedule(req: CreateScheduleRequest): Promise<Schedule> {\n const index = await loadAgentIndex(client);\n const agentName = resolveAgentName(req.agentId, index);\n const { data } = await client.schedules.create({\n agentName,\n name: req.name,\n manifest: toWireManifest(req),\n });\n return toUiSchedule(data, index);\n },\n\n async updateSchedule(req: UpdateScheduleRequest): Promise<Schedule> {\n const index = await loadAgentIndex(client);\n const { data } = await client.schedules.update(req.id, {\n name: req.name,\n manifest: toWireManifest(req),\n });\n return toUiSchedule(data, index);\n },\n\n async deleteSchedule({ id }): Promise<void> {\n await client.schedules.delete(id);\n },\n\n async listScheduleRuns({ scheduleId }): Promise<ScheduleRun[]> {\n const { data } = await client.schedules.listRuns(scheduleId);\n return data.map(toUiScheduleRun);\n },\n\n async createScheduleRun(req: CreateScheduleRunRequest): Promise<ScheduleRun> {\n const { data } = await client.schedules.createRun({ scheduleId: req.scheduleId });\n return toUiScheduleRun(data);\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, PermissionsServer } from '../../server/types.js';\nimport { createHarnessAgentMetricsServer } from './agentMetricsServer.js';\nimport { createHarnessAgentSessionsServer } from './agentSessionsServer.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 { createHarnessPermissionsServer } from './permissionsServer.js';\nimport { createScheduleServer } from './schedules/scheduleServer.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport { createHarnessAgentMetricsServer, type CreateHarnessAgentMetricsServerOptions } from './agentMetricsServer.js';\nexport {\n createHarnessAgentSessionsServer,\n type CreateHarnessAgentSessionsServerOptions,\n} from './agentSessionsServer.js';\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 { createHarnessPermissionsServer, type CreateHarnessPermissionsServerOptions } from './permissionsServer.js';\nexport { createScheduleServer } from './schedules/scheduleServer.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 /** Optional host-provided resource permissions port. */\n permissions?: PermissionsServer;\n};\n\n/**\n * Compose chat + builder + agent sessions + default settings catalogs into an `AgentUIServer`.\n */\nexport function createTrueForgeAgentUIServer(options: CreateTrueForgeAgentUIServerOptions = {}) {\n const { catalog: catalogOverride, permissions, ...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 sessions: createHarnessAgentSessionsServer({ ...clientOptions, client }),\n metrics: createHarnessAgentMetricsServer({ ...clientOptions, client }),\n schedules: createScheduleServer({ client }),\n permissions: permissions ?? createHarnessPermissionsServer({ client }),\n });\n}\n"],"mappings":";;;;;;;;AAIA,SAAS,iBAAiB;AAS1B,IAAM,mBAAmB;AAOlB,SAAS,wBAAwB,SAAyB;AAC/D,MAAI,gBAAgB,KAAK,OAAO,EAAG,QAAO;AAC1C,QAAM,SAAS,WAAW,UAAU;AACpC,MAAI,OAAO,WAAW,YAAY,OAAO,SAAS,KAAK,WAAW,QAAQ;AACxE,WAAO,IAAI,IAAI,SAAS,MAAM,EAAE;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,UAAwC,CAAC,GAAc;AAC3F,SAAO,IAAI,UAAU;AAAA,IACnB,SAAS,wBAAwB,QAAQ,WAAW,gBAAgB;AAAA,IACpE,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC9D,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,EAChE,CAAC;AACH;AAEO,SAAS,aAAa,OAAqB;AAChD,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAChC,UAAM,IAAI,MAAM,0BAA0B,KAAK,EAAE;AAAA,EACnD;AACA,SAAO;AACT;;;AClCA,SAAS,mBAAmB,MAAoD;AAC9E,MAAI,SAAS,wBAAwB,SAAS,6BAA6B,SAAS,mBAAmB;AACrG,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,sCAAsC,IAAI,EAAE;AAC9D;AAEO,SAAS,gCACd,UAAkD,CAAC,GAC/B;AACpB,QAAM,SAAS,QAAQ,UAAU,sBAAsB,OAAO;AAE9D,SAAO;AAAA,IACL,MAAM,YAAY;AAChB,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,SAAS,QAAQ,WAAW;AAC1D,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,UAAU,EAAE,SAAS,gBAAgB,aAAa,GAAG;AACzD,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,SAAS,QAAQ,UAAU;AAAA,QACvD;AAAA,QACA,gBAAgB,aAAa,cAAc;AAAA,QAC3C,cAAc,aAAa,YAAY;AAAA,MACzC,CAAC;AACD,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,aAAa,EAAE,SAAS,gBAAgB,cAAc,UAAU,GAAG;AACvE,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,SAAS,QAAQ,aAAa;AAAA,QAC1D;AAAA,QACA,gBAAgB,aAAa,cAAc;AAAA,QAC3C,cAAc,aAAa,YAAY;AAAA,QACvC,WAAW,mBAAmB,SAAS;AAAA,MACzC,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACxCO,SAAS,oBAAoB,SAAkF;AACpH,SAAO;AAAA,IACL,kBAAkB,QAAQ,oBAAoB;AAAA,IAC9C,mBAAmB,QAAQ,qBAAqB;AAAA,IAChD,aAAa,QAAQ,eAAe;AAAA,IACpC,sBAAsB,QAAQ,wBAAwB;AAAA,IACtD,uBAAuB,QAAQ,yBAAyB;AAAA,IACxD,sBAAsB,QAAQ,wBAAwB;AAAA,IACtD,GAAI,QAAQ,kBAAkB,OAAO,CAAC,IAAI,EAAE,gBAAgB,QAAQ,eAAe;AAAA,EACrF;AACF;AAEO,SAAS,cAAc,OAA4E;AACxG,SAAO,MAAM,WAAW,YAAY,EAAE,QAAQ,UAAU,IAAI,sBAAsB,KAAK;AACzF;AAEA,SAAS,sBAAsB,OAAmF;AAChH,UAAQ,MAAM,QAAQ;AAAA,IACpB,KAAK;AACH,aAAO,EAAE,QAAQ,aAAa,QAAQ,MAAM,QAAQ,aAAa,MAAM,YAAY;AAAA,IACrF,KAAK;AACH,aAAO,EAAE,QAAQ,SAAS,SAAS,MAAM,SAAS,aAAa,MAAM,YAAY;AAAA,IACnF,KAAK;AACH,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,aAAa,MAAM;AAAA,QACnB,iBAAiB,MAAM;AAAA,QACvB,GAAI,MAAM,UAAU,OAAO,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,QACvD,GAAI,MAAM,WAAW,OAAO,CAAC,IAAI,EAAE,SAAS,oBAAoB,MAAM,OAAO,EAAE;AAAA,MACjF;AAAA,EACJ;AACF;AAEO,SAAS,iBAAiB,OAAyE;AAExG,MAAI,MAAM,SAAS,cAAe,QAAO;AACzC,MAAI,MAAM,SAAS,YAAa,QAAO,EAAE,GAAG,MAAM;AAClD,SAAO,EAAE,GAAG,OAAO,OAAO,sBAAsB,MAAM,KAAK,EAAE;AAC/D;AAEO,SAAS,mBAAmB,OAAwE;AAEzG,MAAI,MAAM,SAAS,cAAe,QAAO;AACzC,MAAI,MAAM,SAAS,YAAa,QAAO,EAAE,GAAG,MAAM;AAClD,SAAO,EAAE,GAAG,OAAO,OAAO,sBAAsB,MAAM,KAAK,EAAE;AAC/D;AAEO,SAAS,cAAc,MAAmE;AAC/F,QAAM,QAAQ,iBAAiB,KAAK,KAAK;AACzC,SAAO,UAAU,SAAY,SAAY,EAAE,QAAQ,KAAK,QAAQ,MAAM;AACxE;;;ACbA,SAAS,cAAc,QAAuD;AAC5E,SAAO;AACT;AAEA,SAAS,UAAU,OAA8C;AAC/D,SAAO,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,YAAY,KAAK;AAC7D;AAEA,SAAS,eAAe,OAA8C;AAEpE,SAAO,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,YAAY,KAAK;AACzE;AAGO,SAAS,mBAAmB,MAAgD;AACjF,QAAM,EAAE,QAAQ,YAAY,GAAG,KAAK,IAAI;AACxC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,eAAe,SACf,CAAC,IACD;AAAA,MACE,YAAY,WAAW,IAAI,YAAU;AAEnC,YAAI,QAAQ,QAAQ;AAClB,gBAAM,EAAE,IAAI,GAAG,MAAM,IAAI;AACzB,eAAK;AACL,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACJ,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,IAAI,cAAc,EAAE;AAAA,EACvE;AACF;AAEO,SAAS,cAAc,MAAgD;AAC5E,QAAM,EAAE,YAAY,QAAQ,GAAG,KAAK,IAAI;AACxC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,aAAa,EAAE,YAAY,WAAW,IAAI,aAAa,EAAE,IAAI,CAAC;AAAA,IAClE,GAAI,SAAS,EAAE,QAAQ,OAAO,IAAI,SAAS,EAAE,IAAI,CAAC;AAAA,EACpD;AACF;AAEA,SAAS,YAAY,SAAiD;AACpE,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,WAAW,QAAQ,MAAM,SAAS;AAAA,IAClC,eAAe,yBAAyB,QAAQ,QAAQ;AAAA,IACxD,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,GAAI,QAAQ,UAAU,OAAO,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA;AAAA;AAAA,IAGzD,GAAI,QAAQ,MAAM,SAAS,eAAe,QAAQ,MAAM,SAAS,OAAO,EAAE,WAAW,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,IAC7G,GAAI,QAAQ,MAAM,SAAS,WAAW,EAAE,WAAW,cAAc,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,EAC5F;AACF;AAEA,SAAS,sBAAsB,SAA0E;AACvG,MAAI,QAAQ,aAAa,OAAW,QAAO;AAC3C,SAAO,QAAQ;AACjB;AAGA,SAAS,YAAY,SAA8D;AACjF,SAAO,OAAO,YAAY,WAAW,UAAU,QAAQ,IAAI,WAAS,EAAE,GAAG,KAAK,EAAE;AAClF;AAEA,SAAS,UAAU,OAAsD;AACvE,SAAO,MAAM,IAAI,UAAS,KAAK,SAAS,iBAAiB,EAAE,GAAG,MAAM,SAAS,YAAY,KAAK,OAAO,EAAE,IAAI,IAAK;AAClH;AAEA,SAAS,SAAS,MAA+B;AAC/C,QAAM,EAAE,gBAAgB,OAAO,OAAO,GAAG,KAAK,IAAI;AAClD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,cAAc,KAAK;AAAA,IAC1B,GAAI,mBAAmB,OAAO,CAAC,IAAI,EAAE,eAAe;AAAA,IACpD,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,UAAU,KAAK,EAAE;AAAA,EAC3D;AACF;AAOO,SAAS,aACd,MACA,KACqB;AACrB,QAAM,OAAkB,CAAC;AACzB,aAAW,QAAQ,KAAK,MAAM;AAC5B,UAAM,SAAS,IAAI,IAAI;AACvB,QAAI,WAAW,OAAW,MAAK,KAAK,MAAM;AAAA,EAC5C;AACA,QAAM,QAAQ,KAAK,SAAS,WAAW;AACvC,SAAO;AAAA,IACL;AAAA,IACA,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,eAAe,MAAM;AAAA,EACxD;AACF;AAEA,SAAS,eAAe,IAAwB,UAA0B;AACxE,MAAI,OAAO,OAAW,QAAO;AAC7B,QAAM,SAAS,OAAO,EAAE;AACxB,SAAO,OAAO,cAAc,MAAM,KAAK,UAAU,IAAI,SAAS;AAChE;AAEA,SAAS,iBAAiB,SAA8D;AACtF,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,SAAO,QAAQ,IAAI,UAAQ;AACzB,QAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,UAAM,EAAE,MAAM,KAAK,IAAI;AACvB,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACxD,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AACA,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK;AAAA,EACpC,CAAC;AACH;AAEA,SAAS,eAAe,OAAsD;AAC5E,SAAO,MAAM;AAAA,IAAI,UACf,KAAK,SAAS,iBAAiB,EAAE,GAAG,MAAM,SAAS,iBAAiB,KAAK,OAAO,EAAE,IAAI;AAAA,EACxF;AACF;AAEO,SAAS,wBACd,UAA0C,CAAC,GACuC;AAClF,QAAM,SAAS,QAAQ,UAAU,sBAAsB,OAAO;AAC9D,SAAO;AAAA;AAAA;AAAA,IAGL,MAAM,oBAAoB,EAAE,WAAW,QAAQ,KAAK,GAAG;AACrD,YAAM,WAAW,MAAM,OAAO,SAAS,oBAAoB,WAAW,QAAQ,EAAE,KAAK,CAAC;AACtF,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IAEA,MAAM,cAAc,SAAS;AAC3B,YAAM,WAAW,sBAAsB,OAAO;AAC9C,UAAI,QAAQ,cAAc,UAAa,QAAQ,UAAU,SAAS,GAAG;AACnE,cAAM,UAAU,MAAM,OAAO,SAAS,OAAO;AAAA,UAC3C,OAAO,EAAE,MAAM,QAAQ,UAAU;AAAA,UACjC,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,QAC/C,CAAC;AACD,eAAO,YAAY,QAAQ,IAAI;AAAA,MACjC;AACA,UAAI,QAAQ,cAAc,QAAW;AACnC,cAAM,UAAU,MAAM,OAAO,SAAS,OAAO;AAAA,UAC3C,OAAO,EAAE,MAAM,mBAAmB,QAAQ,SAAS,EAAE;AAAA,UACrD,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,QAC/C,CAAC;AACD,eAAO,YAAY,QAAQ,IAAI;AAAA,MACjC;AACA,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,IAEA,MAAM,aAAa,UAAU,CAAC,GAAG;AAC/B,YAAM,OAAO,MAAM,OAAO,SAAS,KAAK;AAAA,QACtC,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,QAC9D,GAAI,QAAQ,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,QAC1E,GAAI,QAAQ,YAAY,UAAa,QAAQ,QAAQ,WAAW,IAAI,CAAC,IAAI,EAAE,SAAS,QAAQ,QAAQ;AAAA,QACpG,GAAI,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;AAAA,MAClF,CAAC;AACD,aAAO,aAAa,MAAM,WAAW;AAAA,IACvC;AAAA,IAEA,MAAM,WAAW,EAAE,UAAU,GAAG;AAC9B,YAAM,WAAW,MAAM,OAAO,SAAS,IAAI,SAAS;AACpD,aAAO,YAAY,SAAS,IAAI;AAAA,IAClC;AAAA,IAEA,MAAM,cAAc,EAAE,UAAU,GAAG;AACjC,YAAM,OAAO,SAAS,OAAO,SAAS;AAAA,IACxC;AAAA,IAEA,MAAM,cAAc,EAAE,WAAW,MAAM,GAAG;AACxC,YAAM,OAAO,SAAS,OAAO,WAAW,EAAE,MAAM,CAAC;AAAA,IACnD;AAAA,IAEA,MAAM,cAAc,EAAE,WAAW,WAAW,MAAM,GAAG;AAEnD,YAAM,WAAW,MAAM,OAAO,SAAS,OAAO,WAAW;AAAA,QACvD,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,mBAAmB,SAAS,EAAE,EAAE;AAAA,QACpF,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,MACzC,CAAC;AACD,aAAO,YAAY,SAAS,IAAI;AAAA,IAClC;AAAA,IAEA,OAAO,WAAW;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAIG;AACD,YAAM,SAAS,MAAM,OAAO,SAAS,iBAAiB,WAAW;AAAA,QAC/D,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,eAAe,KAAK,EAAE;AAAA,QAC9D,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,MAC3D,CAAC;AACD,UAAI,mBAAmB;AACvB,uBAAiB,QAAQ,OAAO,aAAa,GAAG;AAC9C,cAAM,QAAQ,mBAAmB,KAAK,IAAI;AAC1C,YAAI,UAAU,QAAW;AACvB,gBAAM;AAAA,YACJ,gBAAgB,eAAe,KAAK,IAAI,gBAAgB;AAAA,YACxD;AAAA,UACF;AAAA,QACF;AACA,4BAAoB;AAAA,MACtB;AAAA,IACF;AAAA;AAAA,IAGA,OAAO,gBAAgB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAIG;AACD,YAAM,SAAS,MAAM,OAAO,SAAS,gBAAgB,WAAW,QAAQ;AAAA,QACtE,GAAI,wBAAwB,SAAY,CAAC,IAAI,EAAE,oBAAoB;AAAA,MACrE,CAAC;AACD,UAAI,mBAAmB;AACvB,uBAAiB,QAAQ,OAAO,aAAa,GAAG;AAC9C,cAAM,QAAQ,mBAAmB,KAAK,IAAI;AAC1C,YAAI,UAAU,QAAW;AACvB,gBAAM;AAAA,YACJ,gBAAgB,eAAe,KAAK,IAAI,gBAAgB;AAAA,YACxD;AAAA,UACF;AAAA,QACF;AACA,4BAAoB;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,EAAE,UAAU,GAAG;AACjC,YAAM,OAAO,SAAS,OAAO,SAAS;AAAA,IACxC;AAAA,IAEA,MAAM,UAAU,EAAE,WAAW,OAAO,UAAU,GAAG;AAC/C,YAAM,OAAO,MAAM,OAAO,SAAS,UAAU,WAAW;AAAA,QACtD,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,QACvC,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,MACjD,CAAC;AACD,aAAO,aAAa,MAAM,QAAQ;AAAA,IACpC;AAAA,IAEA,MAAM,QAAQ,EAAE,WAAW,OAAO,GAAG;AACnC,YAAM,WAAW,MAAM,OAAO,SAAS,QAAQ,WAAW,MAAM;AAChE,aAAO,SAAS,SAAS,IAAI;AAAA,IAC/B;AAAA,IAEA,MAAM,WAAW,EAAE,WAAW,WAAW,YAAY,MAAM,GAAG;AAC5D,YAAM,OAAO,MAAM,OAAO,SAAS,WAAW,WAAW;AAAA,QACvD,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,QAC/C,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,QACjD,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,MACzC,CAAC;AACD,aAAO,aAAa,MAAM,aAAa;AAAA,IACzC;AAAA,EACF;AACF;;;AChSA,SAAS,mBAAmB,SAAwD;AAClF,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,gBAAgB,QAAQ;AAAA,IACxB,eAAe,yBAAyB,QAAQ,QAAQ;AAAA,IACxD,WAAW,QAAQ,MAAM,SAAS;AAAA,IAClC,SAAS;AAAA,MACP,YAAY,QAAQ,QAAQ;AAAA,MAC5B,GAAI,QAAQ,QAAQ,kBAAkB,OAAO,CAAC,IAAI,EAAE,gBAAgB,QAAQ,QAAQ,eAAe;AAAA,MACnG,iBAAiB,QAAQ,QAAQ;AAAA,IACnC;AAAA,IACA,GAAI,QAAQ,UAAU,OAAO,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAAA,IACzD,GAAI,QAAQ,MAAM,SAAS,eAAe,QAAQ,MAAM,SAAS,OAAO,EAAE,WAAW,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,IAC7G,GAAI,QAAQ,MAAM,SAAS,WAAW,EAAE,WAAW,cAAc,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,IAC1F,GAAI,QAAQ,QAAQ,SAAS,aAAa,EAAE,YAAY,QAAQ,OAAO,KAAK,IAAI,CAAC;AAAA,EACnF;AACF;AAEO,SAAS,iCACd,UAAmD,CAAC,GACb;AACvC,QAAM,SAAS,QAAQ,UAAU,sBAAsB,OAAO;AAE9D,SAAO;AAAA,IACL,MAAM,SAAS,EAAE,QAAQ,GAAG;AAC1B,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,OAAO,IAAI,OAAO;AAChD,aAAO;AAAA,QACL,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,WAAW,cAAc,KAAK,QAAQ;AAAA,MACxC;AAAA,IACF;AAAA,IACA,MAAM,gBAAgB,EAAE,QAAQ,GAAG;AAEjC,YAAM,kBAAkB,wBAAwB,QAAQ,WAAW,GAAG,EAAE,QAAQ,OAAO,EAAE;AACzF,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,SAAS,OAAO;AAAA,QAC5C;AAAA,QACA,gBAAgB,KAAK,eAAe,IAAI,EAAE,SAAS,gBAAgB,IAAI;AAAA,MACzE;AACA,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,aAAa,gBAAgB,CAAC,GAAG;AACrC,YAAM,OAAO,MAAM,OAAO,SAAS,KAAK;AAAA,QACtC,GAAI,cAAc,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,cAAc,MAAM;AAAA,QAC1E,GAAI,cAAc,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,cAAc,MAAM;AAAA,QAC1E,GAAI,cAAc,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,cAAc,UAAU;AAAA,QACtF,GAAI,cAAc,mBAAmB,SACjC,CAAC,IACD,EAAE,gBAAgB,aAAa,cAAc,cAAc,EAAE;AAAA,QACjE,GAAI,cAAc,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,aAAa,cAAc,YAAY,EAAE;AAAA,QAC7G,GAAI,cAAc,YAAY,UAAa,cAAc,QAAQ,WAAW,IACxE,CAAC,IACD,EAAE,SAAS,cAAc,QAAQ;AAAA,QACrC,GAAI,cAAc,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,cAAc,YAAY;AAAA,MAC9F,CAAC;AACD,aAAO,aAAa,MAAM,kBAAkB;AAAA,IAC9C;AAAA,IACA,MAAM,kBAAkB,EAAE,WAAW,WAAW,MAAM,GAAG;AACvD,YAAM,OAAO,MAAM,OAAO,SAAS,WAAW,WAAW;AAAA,QACvD,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,QAC/C,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,MACzC,CAAC;AACD,aAAO,aAAa,MAAM,aAAa;AAAA,IACzC;AAAA,EACF;AACF;;;ACrFO,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAE1B,SAAS,oBAAoB,MAAsB;AACxD,SAAO,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,GAAG,iBAAiB;AACtD;AAMA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACF,GAKkC;AAChC,QAAM,WAAW,oBAAoB,KAAK;AAC1C,QAAM,QAAQ,KAAK,IAAI,GAAG,MAAM;AAChC,QAAM,OAAO,MAAM,OAAO,OAAO,KAAK;AAAA,IACpC,OAAO;AAAA,IACP,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,EACjD,CAAC;AACD,MAAI,KAAK;AACT,SAAO,KAAK,OAAO;AACjB,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO,CAAC;AACjC,UAAM,KAAK,YAAY;AACvB,UAAM;AAAA,EACR;AACA,SAAO,CAAC,GAAG,KAAK,IAAI;AACtB;AAGA,eAAsB,gBAAgB,QAAkD;AACtF,QAAM,QAA8B,CAAC;AACrC,QAAM,OAAO,MAAM,OAAO,OAAO,KAAK,EAAE,OAAO,oBAAoB,CAAC;AACpE,aAAS;AACP,UAAM,KAAK,GAAG,KAAK,IAAI;AACvB,QAAI,CAAC,KAAK,YAAY,EAAG;AACzB,UAAM,KAAK,YAAY;AAAA,EACzB;AACA,SAAO;AACT;;;AC9BA,IAAM,yBAAyB;AAG/B,SAAS,+BAA+B,EAAE,YAAY,MAAM,GAAkD;AAC5G,MAAI,WAAW,YAAY,MAAM,uBAAuB,YAAY,GAAG;AACrE,WAAO;AAAA,EACT;AACA,MAAI,cAAc,KAAK,KAAK,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,UAAU,KAAK;AACxB;AAEO,SAAS,eAAe,MAA6E;AAC1G,MAAI,SAAS,QAAW;AACtB,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AACA,QAAM,aAAa,OAAO,KAAK,KAAK,OAAO,EAAE,CAAC;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,EACnD;AACF;AAEO,SAAS,cAAc,MAAqE;AACjG,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AACA,QAAM,SAAS,KAAK,QAAQ,KAAK;AACjC,MAAI,WAAW,UAAa,WAAW,IAAI;AACzC,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,QAAM,gBAAgB,KAAK,YAAY,KAAK;AAC5C,QAAM,aAAa,kBAAkB,UAAa,kBAAkB,KAAK,gBAAgB;AACzF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,EAAE,CAAC,UAAU,GAAG,+BAA+B,EAAE,YAAY,OAAO,OAAO,CAAC,EAAE;AAAA,EACzF;AACF;AAEO,SAAS,iBAAiB,QAAgE;AAC/F,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,aAAa,OAAO;AAAA,IACpB,GAAI,OAAO,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK;AAAA,IACzD,MAAM,eAAe,OAAO,IAAI;AAAA,EAClC;AACF;AAOA,SAAS,oBAAoB,OAA+C;AAC1E,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,eAAe,QAAQ,IAAI,OAAO,cAAc;AACtD,QAAM,kBAAkB,QAAQ,IAAI,OAAO,iBAAiB;AAC5D,QAAM,cAAiC;AAAA,IACrC,GAAI,OAAO,iBAAiB,YAAY,EAAE,aAAa,IAAI,CAAC;AAAA,IAC5D,GAAI,OAAO,oBAAoB,YAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,EACpE;AACA,SAAO,OAAO,KAAK,WAAW,EAAE,SAAS,IAAI,cAAc;AAC7D;AAEO,SAAS,SAAS,MAA+E;AACtG,QAAM,OAAO,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,KAAK,KAAK,OAAO;AAC7E,QAAM,cAAc,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAC9E,QAAM,cAAc,oBAAoB,QAAQ,IAAI,MAAM,aAAa,CAAC;AACxE,SAAO,gBAAgB,SAAY,EAAE,IAAI,MAAM,MAAM,YAAY,IAAI,EAAE,IAAI,MAAM,MAAM,aAAa,YAAY;AAClH;AAEO,SAAS,cAAc,QAAuD;AACnF,QAAM,OAAO,eAAe,OAAO,SAAS,IAAI;AAChD,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,aAAa,OAAO,SAAS;AAAA,IAC7B,KAAK,OAAO,SAAS;AAAA,IACrB;AAAA,IACA,cAAc,OAAO,WAAW,WAAW;AAAA,IAC3C,eAAe,OAAO,WAAW,WAAW;AAAA,EAC9C;AACF;AAEO,SAAS,2BAA2B,QAAsD;AAC/F,QAAM,OAA8B,OAAO,MAAM,OAAO,EAAE,MAAM,OAAO,KAAK,KAAK,IAAI,EAAE,MAAM,OAAO;AACpG,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,KAAK,OAAO;AAAA,IACZ;AAAA,IACA,cAAc,OAAO,WAAW,WAAW;AAAA,IAC3C,eAAe,OAAO,WAAW,WAAW;AAAA,EAC9C;AACF;AAEO,SAAS,kBAAkB,KAKC;AACjC,QAAM,OAAO,cAAc,IAAI,IAAI;AACnC,QAAM,UAAU,IAAI,aAAa,KAAK;AACtC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,IAAI;AAAA,IACV,KAAK,IAAI;AAAA,IACT,aAAa,YAAY,UAAa,YAAY,KAAK,UAAU,GAAG,IAAI,IAAI;AAAA,IAC5E,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,EACvC;AACF;AAGO,SAAS,uBACd,QASA;AACA,iBAAe,cAAc,MAAyD;AACpF,UAAM,SAAS,MAAM,OAAO,SAAS,WAAW,KAAK;AACrD,UAAM,WAAW,OAAO,KAAK,KAAK,YAAU,OAAO,SAAS,IAAI;AAChE,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,MAAM,eAAe,IAAI,aAAa;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,iBAAe,iBAAiB,KAAmE;AACjG,QAAI,IAAI,KAAK,SAAS,UAAU;AAC9B,aAAO,IAAI;AAAA,IACb;AACA,UAAM,SAAS,IAAI,KAAK,QAAQ,KAAK;AACrC,QAAI,WAAW,UAAa,WAAW,IAAI;AACzC,aAAO,IAAI;AAAA,IACb;AACA,QAAI,IAAI,OAAO,QAAW;AACxB,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AACA,UAAM,WAAW,MAAM,cAAc,IAAI,EAAE;AAC3C,QAAI,SAAS,SAAS,MAAM,SAAS,UAAU;AAC7C,YAAM,IAAI,MAAM,eAAe,IAAI,EAAE,6CAA6C;AAAA,IACpF;AACA,UAAM,kBAAkB,IAAI,KAAK,YAAY,KAAK;AAClD,UAAM,mBAAmB,OAAO,KAAK,SAAS,SAAS,KAAK,OAAO,EAAE,CAAC;AACtE,UAAM,aACJ,oBAAoB,UAAa,oBAAoB,KACjD,kBACC,oBAAoB;AAC3B,UAAM,SAAS,SAAS,SAAS,KAAK,QAAQ,UAAU,KAAK,OAAO,OAAO,SAAS,SAAS,KAAK,OAAO,EAAE,CAAC;AAC5G,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI,MAAM,eAAe,IAAI,EAAE,6CAA6C;AAAA,IACpF;AACA,WAAO,EAAE,MAAM,UAAU,QAAQ,QAAQ,WAAW;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,qBAAqB,YAAY;AAC/B,YAAM,OAAO,MAAM,OAAO,SAAS,WAAW,KAAK;AACnD,aAAO,KAAK,KAAK,IAAI,gBAAgB;AAAA,IACvC;AAAA,IACA,cAAc,OAAM,QAAO;AACzB,YAAM,OAAO,MAAM,OAAO,SAAS,WAAW,IAAI,IAAI,EAAE;AACxD,aAAO,cAAc,KAAK,IAAI;AAAA,IAChC;AAAA,IACA,gBAAgB,OAAM,QAAO;AAC3B,YAAM,OAAO,MAAM,OAAO,SAAS,WAAW,KAAK;AACnD,YAAM,aAAa,KAAK,KAAK,IAAI,aAAa;AAC9C,YAAM,QAAQ,KAAK,OAAO,KAAK,EAAE,YAAY;AAC7C,UAAI,UAAU,UAAa,UAAU,IAAI;AACvC,eAAO;AAAA,MACT;AACA,aAAO,WAAW;AAAA,QAChB,eACE,UAAU,KAAK,YAAY,EAAE,SAAS,KAAK,KAC3C,UAAU,YAAY,YAAY,EAAE,SAAS,KAAK,KAClD,UAAU,IAAI,YAAY,EAAE,SAAS,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,uBAAuB,OAAO,EAAE,GAAG,MAAM;AACvC,YAAM,OAAO,MAAM,OAAO,WAAW,UAAU,EAAE;AACjD,aAAO,KAAK,KAAK,IAAI,QAAQ;AAAA,IAC/B;AAAA,IACA,iBAAiB,OAAM,QAAO;AAC5B,YAAM,OAAO,MAAM,iBAAiB,EAAE,MAAM,IAAI,KAAK,CAAC;AACtD,YAAM,OAAO,MAAM,OAAO,SAAS,WAAW,OAAO;AAAA,QACnD,UAAU,kBAAkB;AAAA,UAC1B,MAAM,IAAI;AAAA,UACV,KAAK,IAAI;AAAA,UACT;AAAA,UACA,aAAa,IAAI;AAAA,QACnB,CAAC;AAAA,MACH,CAAC;AACD,aAAO,cAAc,KAAK,IAAI;AAAA,IAChC;AAAA,IACA,iBAAiB,OAAM,QAAO;AAC5B,YAAM,OAAO,MAAM,iBAAiB,EAAE,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AAClE,YAAM,OAAO,MAAM,OAAO,SAAS,WAAW,eAAe;AAAA,QAC3D,UAAU,kBAAkB;AAAA,UAC1B,MAAM,IAAI;AAAA,UACV,KAAK,IAAI;AAAA,UACT;AAAA,UACA,aAAa,IAAI;AAAA,QACnB,CAAC;AAAA,MACH,CAAC;AACD,aAAO,cAAc,KAAK,IAAI;AAAA,IAChC;AAAA,IACA,uBAAuB,OAAM,QAAO;AAClC,YAAM,SAAS,MAAM,OAAO,WAAW;AAAA,QACrC,IAAI;AAAA,QACJ,IAAI,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,IAAI,SAAS;AAAA,MAC7D;AACA,aAAO,EAAE,QAAQ,OAAO,QAAQ,wBAAwB,OAAO,iBAAiB;AAAA,IAClF;AAAA,IACA,qBAAqB,OAAM,QAAO;AAChC,YAAM,WAAW,MAAM,cAAc,IAAI,EAAE;AAC3C,UAAI,SAAS,SAAS,MAAM,SAAS,OAAO;AAC1C,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AACA,YAAM,OAAO,MAAM,OAAO,WAAW,oBAAoB,IAAI,EAAE;AAC/D,aAAO,cAAc,KAAK,IAAI;AAAA,IAChC;AAAA,EACF;AACF;;;AChQA,eAAsB,WAAW,QAA2D;AAC1F,QAAM,OAAO,MAAM,OAAO,OAAO,KAAK;AACtC,SAAO,KAAK;AACd;AAEA,eAAsB,yBAAyB,QAA+D;AAC5G,QAAM,OAAO,MAAM,OAAO,WAAW,KAAK;AAC1C,SAAO,KAAK;AACd;AAEA,eAAsB,WAAW,QAA2D;AAC1F,QAAM,OAAO,MAAM,OAAO,OAAO,KAAK;AACtC,SAAO,KAAK;AACd;AAEA,eAAsB,gBAAgB,QAA2D;AAC/F,QAAM,OAAO,MAAM,OAAO,OAAO,gBAAgB;AACjD,SAAO,KAAK;AACd;;;ACNO,SAAS,yBACd,SAC6B;AAC7B,QAAM,QAAQ,oBAAI,IAAoB;AACtC,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,YAAY,MAAM,SAAS,QAAW;AACvD;AAAA,IACF;AACA,UAAM,IAAI,MAAM,MAAM,MAAM,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AACF,GAGmB;AACjB,QAAM,EAAE,eAAe,iBAAiB,iBAAiB,IAAI,MAAM;AACnE,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,UAAU;AAAA,MACR,MAAM,MAAM,SAAS;AAAA,MACrB,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACvC;AAAA,IACA,YAAY;AAAA,MACV,GAAI,kBAAkB,SAAY,CAAC,IAAI,EAAE,cAAc;AAAA,MACvD,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,MAC3D,GAAI,qBAAqB,SAAY,CAAC,IAAI,EAAE,kBAAkB,CAAC,GAAG,gBAAgB,EAAE;AAAA,IACtF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAA8C;AACpE,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,WAAW,cAAc,MAAM,QAAQ;AAAA,IACvC,kBAAkB,MAAM;AAAA,EAC1B;AACF;AAEO,SAAS,2BACd,UAA6C,CAAC,GACR;AACtC,QAAM,SAAS,QAAQ,UAAU,sBAAsB,OAAO;AAE9D,SAAO;AAAA,IACL,iBAAiB,MAAM,OAAO,OAAO,gBAAgB;AAAA,IACrD,WAAW,YAAY;AAErB,YAAM,CAAC,YAAY,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,QACrD,OAAO,OAAO,KAAK;AAAA,QACnB,OAAO,SAAS,eAAe,KAAK,EAAE;AAAA,UACpC,UAAQ,KAAK;AAAA,UACb,MAAM,CAAC;AAAA,QACT;AAAA,MACF,CAAC;AACD,YAAM,cAAc,yBAAyB,cAAc;AAC3D,aAAO,WAAW,KAAK,IAAI,WAAS;AAClC,cAAM,OAAO,YAAY,IAAI,MAAM,SAAS,IAAI;AAChD,eAAO,iBAAiB,SAAS,SAAY,EAAE,MAAM,IAAI,EAAE,OAAO,KAAK,CAAC;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,WAAW,YAAY;AACrB,YAAM,SAAS,MAAM,WAAW,MAAM;AACtC,aAAO,OAAO,IAAI,WAAS;AACzB,cAAM,EAAE,cAAc,iBAAiB,SAAS,WAAW,IAAI,MAAM,YAAY,CAAC;AAClF,cAAM,UAAU,OAAO,UAAU;AACjC,cAAM,aAAa,OAAO,UAAU,OAAO,KAAK,UAAU;AAC1D,eAAO;AAAA,UACL,IAAI,MAAM;AAAA,UACV,MAAM,gBAAgB,MAAM;AAAA,UAC5B,aAAa,MAAM;AAAA,UACnB,GAAI,oBAAoB,SAAY,CAAC,IAAI,EAAE,eAAe,gBAAgB;AAAA,UAC1E,GAAI,aACA;AAAA,YACE;AAAA,YACA,cAAc,aAAa,MAAM,OAAO,OAAO,aAAa,EAAE,MAAM,MAAM,KAAK,CAAC,GAAG;AAAA,UACrF,IACA,CAAC;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,aAAa,MAAM,yBAAyB,MAAM,GAAG,IAAI,0BAA0B;AAAA,IAC3F,iBAAiB,OAAO,EAAE,YAAY,MAA+B;AACnE,YAAM,OAAO,MAAM,OAAO,WAAW,IAAI,WAAW;AACpD,aAAO,2BAA2B,KAAK,IAAI;AAAA,IAC7C;AAAA,IACA,aAAa,OAAO,EAAE,YAAY,MAA+B;AAC/D,YAAM,OAAO,MAAM,OAAO,WAAW,UAAU,WAAW;AAC1D,aAAO,KAAK,KAAK;AAAA,QAAQ,UACvB,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,MAAM,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,KAA0B;AAC3C,YAAM,QAAQ,oBAAoB,KAAK,SAAS,mBAAmB;AACnE,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,YAAM,OAAO,MAAM,eAAe;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,UAAU,UAAa,UAAU,KAAK,CAAC,IAAI,EAAE,WAAW,MAAM;AAAA,MACpE,CAAC;AACD,aAAO,KAAK,IAAI,cAAc;AAAA,IAChC;AAAA,IAEA,MAAM,UAAU,EAAE,WAAW,aAAa,gBAAgB,WAAW,OAAO,GAAG;AAC7E,YAAM,WAAW,mBAAmB,SAAS;AAC7C,YAAM,cAAc,gBAAgB,KAAK;AACzC,UAAI,WAAW,UAAU;AACvB,cAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,cAAM,WAAW,OAAO,KAAK,WAAS,MAAM,SAAS,SAAS;AAC9D,YAAI,CAAC,UAAU;AACb,iBAAO,CAAC;AAAA,QACV;AAGA,cAAM,OAAO,OAAO,OAAO,SAAS,IAAI;AAAA,UACtC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,UACrC;AAAA,QACF,CAAC;AACD,eAAO,EAAE,SAAS,SAAS,GAAG;AAAA,MAChC;AAEA,YAAM,UAAU,MAAM,OAAO,OAAO,OAAO;AAAA,QACzC,MAAM;AAAA,QACN,aAAa,eAAe;AAAA,QAC5B;AAAA,MACF,CAAC;AACD,aAAO,EAAE,SAAS,QAAQ,KAAK,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,YAAY,EAAE,UAAU,GAAG;AAC/B,YAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,YAAM,WAAW,OAAO,KAAK,WAAS,MAAM,SAAS,SAAS;AAC9D,UAAI,CAAC,SAAU;AACf,YAAM,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,IACxC;AAAA,EACF;AACF;;;AClKA,SAAS,oBAAoB;AAkBtB,SAAS,eAAe,OAAmD;AAChF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,YAAY,MAAM;AAAA,EACpB;AACF;AAEO,SAAS,oBAAoB,OAAmD;AACrF,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,YAAY,MAAM,cAAc,CAAC;AAAA,EACnC;AACF;AAEO,SAAS,kBAAkB,UAAiE;AACjG,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,SAAS;AAAA,IACf;AAAA,IACA,GAAI,SAAS,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,SAAS,QAAQ;AAAA,IACtE,QAAQ,SAAS,OAAO,IAAI,cAAc;AAAA,EAC5C;AACF;AAEO,SAAS,8BACd,UAC6B;AAC7B,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf,MAAM,SAAS;AAAA,MACf,2BAA2B,SAAS;AAAA,MACpC,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,MAAM,SAAS;AAAA,IACf,GAAI,SAAS,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,SAAS,KAAK;AAAA,IAC7D,QAAQ,SAAS,OAAO,IAAI,cAAc;AAAA,EAC5C;AACF;AAEA,IAAM,iBAAoC,CAAC,GAAG,OAAO,OAAO,aAAa,iCAAiC,GAAG,QAAQ;AAErH,SAAS,eAAe,MAA0F;AAChH,SAAO,eAAe,SAAS,IAAI;AACrC;AAEO,SAAS,uBAAuB,KAMA;AACrC,QAAM,SAAS,IAAI,OAAO,IAAI,mBAAmB;AACjD,MAAI,CAAC,eAAe,IAAI,IAAI,GAAG;AAC7B,UAAM,IAAI,MAAM,oCAAoC,IAAI,IAAI,EAAE;AAAA,EAChE;AACA,QAAM,UAAU,IAAI,SAAS,KAAK,MAAM,KAAK,SAAY,IAAI;AAE7D,MAAI,IAAI,SAAS,UAAU;AACzB,QAAI,YAAY,QAAW;AACzB,YAAM,IAAI,MAAM,4BAA4B,IAAI,IAAI,sBAAsB;AAAA,IAC5E;AAEA,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,MAAM,IAAI;AAAA,MACV;AAAA,MACA;AAAA,MACA,GAAI,IAAI,WAAW,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,IAAI,OAAO,EAAE;AAAA,IAC9D;AAAA,EACF;AACA,QAAM,OAAO,EAAE,QAAQ,IAAI,OAAO;AAClC,MAAI,YAAY,QAAW;AACzB,WAAO,EAAE,MAAM,IAAI,MAAM,MAAM,QAAQ,QAAQ;AAAA,EACjD;AACA,SAAO,EAAE,MAAM,IAAI,MAAM,MAAM,OAAO;AACxC;AAGO,SAAS,2BACd,QAOA;AACA,iBAAe,cAAc,KAAsE;AACjG,UAAM,UAAU,IAAI,OAAO,KAAK;AAChC,QAAI,YAAY,IAAI;AAClB,aAAO;AAAA,IACT;AACA,QAAI,IAAI,OAAO,QAAW;AAExB,UAAI,IAAI,SAAS,UAAU;AACzB,eAAO;AAAA,MACT;AACA,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AAEA,UAAM,SAAS,MAAM,OAAO,SAAS,eAAe,KAAK;AACzD,UAAM,WAAW,OAAO,KAAK,KAAK,cAAY,SAAS,SAAS,IAAI,EAAE;AACtE,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,MAAM,mBAAmB,IAAI,EAAE,aAAa;AAAA,IACxD;AACA,WAAO,SAAS,SAAS,MAAM,UAAU;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL,yBAAyB,YAAY;AACnC,YAAM,OAAO,MAAM,OAAO,SAAS,eAAe,KAAK;AACvD,aAAO,KAAK,KAAK,IAAI,6BAA6B;AAAA,IACpD;AAAA,IACA,oBAAoB,YAAY;AAC9B,YAAM,OAAO,MAAM,OAAO,SAAS,eAAe,KAAK;AACvD,aAAO,KAAK,KAAK,IAAI,iBAAiB;AAAA,IACxC;AAAA,IACA,qBAAqB,OAAM,QAAO;AAChC,YAAM,SAAS,MAAM,cAAc,EAAE,MAAM,IAAI,MAAM,QAAQ,IAAI,OAAO,CAAC;AACzE,YAAM,OAAO,MAAM,OAAO,SAAS,eAAe,OAAO;AAAA,QACvD,UAAU,uBAAuB;AAAA,UAC/B,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV;AAAA,UACA,GAAI,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;AAAA,UAC5D,QAAQ,IAAI;AAAA,QACd,CAAC;AAAA,MACH,CAAC;AACD,aAAO,kBAAkB,KAAK,IAAI;AAAA,IACpC;AAAA,IACA,qBAAqB,OAAM,QAAO;AAEhC,YAAM,SAAS,MAAM,cAAc,EAAE,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,QAAQ,IAAI,OAAO,CAAC;AACrF,YAAM,OAAO,MAAM,OAAO,SAAS,eAAe,eAAe;AAAA,QAC/D,UAAU,uBAAuB;AAAA,UAC/B,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV;AAAA,UACA,GAAI,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;AAAA,UAC5D,QAAQ,IAAI;AAAA,QACd,CAAC;AAAA,MACH,CAAC;AACD,aAAO,kBAAkB,KAAK,IAAI;AAAA,IACpC;AAAA,EACF;AACF;;;ACzKA,SAAS,gBAAAA,qBAAoB;AAa7B,IAAM,eAAe;AACrB,IAAM,uBAAuB;AAE7B,SAAS,mBAAmB,MAAsB;AAChD,MAAI,SAAS,cAAc;AACzB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,kBACd,UACuB;AACvB,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,IACxB,2BAA2B,SAAS;AAAA,IACpC,8BAA8B,SAAS;AAAA,IACvC,6BAA6B,SAAS;AAAA,EACxC;AACF;AAEO,SAASC,kBAAiB,UAA8E;AAC7G,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,MAAM,mBAAmB,SAAS,IAAI;AAAA,IACtC,MAAM,SAAS;AAAA,IACf,GAAG,kBAAkB,QAAQ;AAAA,EAC/B;AACF;AAEO,SAAS,oBAAoB,UAAmE;AACrG,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,MAAM,mBAAmB,SAAS,IAAI;AAAA,IACtC,WAAW,SAAS;AAAA,IACpB,aAAa;AAAA,IACb,GAAG,kBAAkB,QAAQ;AAAA,EAC/B;AACF;AAEO,SAAS,6BACd,UAC4B;AAC5B,SAAO;AAAA,IACL,MAAM,oBAAoB,SAAS,QAAQ;AAAA,IAC3C,oBAAoB;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,GAAI,SAAS,eAAe,EAAE,cAAc,SAAS,aAAa,IAAI,CAAC;AAAA,IACzE;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAGiC;AAC/B,QAAM,kBAAkB,OAAO,KAAK,EAAE,YAAY;AAClD,MAAI,oBAAoB,UAAa,oBAAoB,IAAI;AAC3D,WAAO;AAAA,EACT;AACA,SAAO,UAAU;AAAA,IACf,cACE,SAAS,KAAK,KAAK,YAAY,EAAE,SAAS,eAAe,KACzD,SAAS,KAAK,GAAG,YAAY,EAAE,SAAS,eAAe;AAAA,EAC3D;AACF;AAEO,SAASC,mBACd,KAIsC;AACtC,MAAI,IAAI,SAAS,cAAc;AAC7B,UAAM,IAAI,MAAM,sCAAsC,IAAI,IAAI,EAAE;AAAA,EAClE;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe,IAAI;AAAA,IACnB,2BAA2B,IAAI;AAAA,IAC/B,8BAA8B,IAAI;AAAA,IAClC,6BAA6B,IAAI;AAAA,IACjC,MAAM,EAAE,QAAQ,IAAI,OAAO;AAAA,EAC7B;AACF;AAGO,SAAS,6BAA6B,QAAyC;AACpF,iBAAe,cAAc,QAA6C;AACxE,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,YAAY,UAAa,YAAY,IAAI;AAC3C,aAAO;AAAA,IACT;AACA,UAAM,WAAW,MAAM,OAAO,SAAS,iBAAiB,IAAI;AAC5D,WAAO,SAAS,KAAK,SAAS,KAAK;AAAA,EACrC;AAEA,SAAO;AAAA,IACL,2BAA2B,YAAY;AACrC,YAAM,OAAO,MAAM,OAAO,SAAS,iBAAiB,KAAK;AACzD,aAAO,KAAK,KAAK,IAAID,iBAAgB;AAAA,IACvC;AAAA,IACA,sBAAsB,OAAM,QAAO;AACjC,UAAI;AACJ,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,SAAS,iBAAiB,IAAI;AACxD,oBAAY,CAAC,6BAA6B,KAAK,IAAI,CAAC;AAAA,MACtD,SAAS,KAAK;AACZ,YAAI,eAAeD,cAAa,eAAe;AAC7C,sBAAY,CAAC;AAAA,QACf,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AACA,aAAO,yBAAyB,EAAE,WAAW,OAAO,KAAK,MAAM,CAAC;AAAA,IAClE;AAAA,IACA,uBAAuB,OAAM,QAAO;AAClC,YAAM,OAAO,MAAM,OAAO,SAAS,iBAAiB,eAAe;AAAA,QACjE,UAAUE,mBAAkB;AAAA,UAC1B,MAAM,IAAI;AAAA,UACV,QAAQ,IAAI;AAAA,UACZ,eAAe,IAAI;AAAA,UACnB,2BAA2B,IAAI;AAAA,UAC/B,8BAA8B,IAAI;AAAA,UAClC,6BAA6B,IAAI;AAAA,QACnC,CAAC;AAAA,MACH,CAAC;AACD,aAAO,oBAAoB,KAAK,KAAK,QAAQ;AAAA,IAC/C;AAAA,IACA,uBAAuB,OAAM,QAAO;AAClC,YAAM,SAAS,MAAM,cAAc,IAAI,MAAM;AAC7C,YAAM,OAAO,MAAM,OAAO,SAAS,iBAAiB,eAAe;AAAA,QACjE,UAAUA,mBAAkB;AAAA,UAC1B,MAAM;AAAA,UACN;AAAA,UACA,eAAe,IAAI;AAAA,UACnB,2BAA2B,IAAI;AAAA,UAC/B,8BAA8B,IAAI;AAAA,UAClC,6BAA6B,IAAI;AAAA,QACnC,CAAC;AAAA,MACH,CAAC;AACD,aAAO,oBAAoB,KAAK,KAAK,QAAQ;AAAA,IAC/C;AAAA,EACF;AACF;;;AC3JO,SAASC,kBAAiB,OAAuD;AACtF,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM;AAAA,IACf,MAAM,MAAM,QAAQ;AAAA,IACpB,KAAK,MAAM;AAAA,EACb;AACF;AAEO,SAASC,mBAAkB,KAA4E;AAC5G,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,IAAI;AAAA,IACV,KAAK,IAAI;AAAA,IACT,GAAI,SAAS,KAAK,CAAC,IAAI,EAAE,KAAK;AAAA,IAC9B,KAAK,IAAI;AAAA,IACT,aAAa,IAAI;AAAA,EACnB;AACF;AAEO,SAASC,WAAU,OAAqC,cAA4C;AACzG,QAAM,WAAW,MAAM;AACvB,QAAM,cACJ,iBAAiB,YAAY,OAAO,SAAS,gBAAgB,WAAW,SAAS,cAAc,SAAS;AAC1G,QAAM,OAAO;AAAA,IACX,IAAI,MAAM;AAAA,IACV,MAAM;AAAA,IACN,aAAa,SAAS;AAAA,EACxB;AACA,MAAI,aAAa,IAAI,MAAM,IAAI,GAAG;AAChC,WAAO,EAAE,GAAG,MAAM,WAAW,MAAM,KAAK;AAAA,EAC1C;AACA,SAAO;AACT;AAGO,SAAS,mBAAmB,QAAgD;AACjF,SAAO;AAAA,IACL,iBAAiB,YAAY;AAC3B,YAAM,OAAO,MAAM,OAAO,SAAS,OAAO,KAAK;AAC/C,aAAO,KAAK,KAAK,IAAIF,iBAAgB;AAAA,IACvC;AAAA,IACA,YAAY,OAAM,QAAO;AACvB,YAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,SAAS,OAAO,KAAK,GAAG,OAAO,SAAS,OAAO,KAAK,CAAC,CAAC;AAC1G,YAAM,eAAe,IAAI,IAAI,QAAQ,KAAK,IAAI,WAAS,MAAM,IAAI,CAAC;AAClE,YAAM,SAAS,OAAO,KAAK,IAAI,WAASE,WAAU,OAAO,YAAY,CAAC;AACtE,YAAM,QAAQ,KAAK,OAAO,KAAK,EAAE,YAAY;AAC7C,UAAI,UAAU,UAAa,UAAU,IAAI;AACvC,eAAO;AAAA,MACT;AACA,aAAO,OAAO;AAAA,QACZ,WAAS,MAAM,KAAK,YAAY,EAAE,SAAS,KAAK,KAAK,MAAM,YAAY,YAAY,EAAE,SAAS,KAAK;AAAA,MACrG;AAAA,IACF;AAAA,IACA,aAAa,OAAM,QAAO;AACxB,YAAM,OAAO,MAAM,OAAO,SAAS,OAAO,OAAO,EAAE,UAAUD,mBAAkB,GAAG,EAAE,CAAC;AACrF,YAAM,YAAY,eAAe,MAAM,IAAI,YAAY;AACvD,UAAI,cAAc,QAAW;AAC3B,eAAO;AAAA,UACL,IAAI,KAAK,KAAK;AAAA,UACd,MAAM,KAAK,KAAK;AAAA,UAChB,aAAa,KAAK,KAAK,SAAS;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,IAAI,KAAK,KAAK;AAAA,QACd,MAAM,KAAK,KAAK;AAAA,QAChB,aAAa,KAAK,KAAK,SAAS;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;;;AChFO,SAAS,+BAA+B,UAAiD,CAAC,GAAsB;AACrH,QAAM,SAAS,QAAQ,UAAU,sBAAsB,OAAO;AAC9D,SAAO;AAAA,IACL,iBAAiB,OAAM,YAAW,OAAO,SAAS,gBAAgB,OAAO;AAAA,EAC3E;AACF;;;ACKA,IAAM,uBAAuB;AAO7B,eAAe,eAAe,QAAwC;AACpE,QAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,SAAS,QAAQ;AAC1B,aAAS,IAAI,MAAM,IAAI,MAAM,IAAI;AACjC,aAAS,IAAI,MAAM,MAAM,MAAM,EAAE;AAAA,EACnC;AACA,SAAO,EAAE,UAAU,SAAS;AAC9B;AAEA,SAAS,iBAAiB,SAAiB,OAA2B;AACpE,QAAM,OAAO,MAAM,SAAS,IAAI,OAAO;AACvC,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,MAAM,SAAS,IAAI,OAAO,EAAG,QAAO;AACxC,QAAM,IAAI,MAAM,kBAAkB,OAAO,EAAE;AAC7C;AAEA,SAAS,gBAAgB,KAAqC;AAC5D,QAAM,MAAgB,CAAC;AACvB,MAAI,KAAK,YAAY,MAAM;AACzB,eAAW,MAAM,IAAI,UAAU;AAC7B,UAAI,OAAO,GAAI,KAAI,KAAK,EAAE;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,KAAK,WAAW,QAAQ,IAAI,YAAY,GAAI,KAAI,KAAK,IAAI,OAAO;AACpE,SAAO,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;AACzB;AAEA,SAAS,WAAW,UAAyD;AAC3E,SAAO,SAAS,UAAU;AAC5B;AAEA,SAAS,aAAa,MAA6B,OAA6B;AAC9E,QAAM,UAAU,MAAM,SAAS,IAAI,KAAK,SAAS,KAAK,KAAK;AAC3D,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK,SAAS;AAAA,IACpB,MAAM,KAAK,SAAS;AAAA,IACpB,UAAU,KAAK,SAAS,YAAY;AAAA,IACpC,QAAQ,WAAW,KAAK,QAAQ;AAAA,IAChC,WAAW;AAAA,IACX,kBAAkB,KAAK;AAAA,EACzB;AACF;AAEA,SAAS,eAAe,OAKU;AAChC,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM,YAAY;AAAA,IAC5B,QAAQ,MAAM,UAAU;AAAA,EAC1B;AACF;AAEA,SAAS,aAAa,OAA8B;AAClD,MAAI,iBAAiB,KAAM,QAAO,MAAM,YAAY;AACpD,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA6C;AACpE,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,YAAY,KAAK;AAAA,IACjB,MAAM,KAAK;AAAA,IACX,cAAc,aAAa,KAAK,YAAY;AAAA,IAC5C,QAAQ,KAAK;AAAA,IACb,aAAa,KAAK,eAAe,OAAO,OAAO,aAAa,KAAK,WAAW;AAAA,IAC5E,aAAa,KAAK,iBAAiB,sBAAsB,KAAK,iBAAiB;AAAA,EACjF;AACF;AAEO,SAAS,qBAAqB,SAAgD;AACnF,QAAM,EAAE,OAAO,IAAI;AAEnB,SAAO;AAAA,IACL,MAAM,cAAc,KAA0D;AAC5E,YAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,YAAM,WAAW,gBAAgB,GAAG;AACpC,YAAM,aAAa,SAAS,WAAW,IAAI,SAAY,SAAS,IAAI,QAAM,iBAAiB,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG;AAC/G,YAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,SAAS,sBAAsB,CAAC,GAAG,oBAAoB;AAC5F,YAAM,OAAO,MAAM,OAAO,UAAU,KAAK;AAAA,QACvC;AAAA,QACA,GAAI,KAAK,cAAc,UAAa,IAAI,cAAc,KAAK,CAAC,IAAI,EAAE,WAAW,IAAI,UAAU;AAAA,QAC3F,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,MACnD,CAAC;AACD,aAAO,aAAa,MAAM,SAAO,aAAa,KAAK,KAAK,CAAC;AAAA,IAC3D;AAAA,IAEA,MAAM,YAAY,EAAE,GAAG,GAAsB;AAC3C,YAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,UAAU,IAAI,EAAE;AAC9C,aAAO,aAAa,MAAM,KAAK;AAAA,IACjC;AAAA,IAEA,MAAM,eAAe,KAA+C;AAClE,YAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,YAAM,YAAY,iBAAiB,IAAI,SAAS,KAAK;AACrD,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,UAAU,OAAO;AAAA,QAC7C;AAAA,QACA,MAAM,IAAI;AAAA,QACV,UAAU,eAAe,GAAG;AAAA,MAC9B,CAAC;AACD,aAAO,aAAa,MAAM,KAAK;AAAA,IACjC;AAAA,IAEA,MAAM,eAAe,KAA+C;AAClE,YAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,UAAU,OAAO,IAAI,IAAI;AAAA,QACrD,MAAM,IAAI;AAAA,QACV,UAAU,eAAe,GAAG;AAAA,MAC9B,CAAC;AACD,aAAO,aAAa,MAAM,KAAK;AAAA,IACjC;AAAA,IAEA,MAAM,eAAe,EAAE,GAAG,GAAkB;AAC1C,YAAM,OAAO,UAAU,OAAO,EAAE;AAAA,IAClC;AAAA,IAEA,MAAM,iBAAiB,EAAE,WAAW,GAA2B;AAC7D,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,UAAU,SAAS,UAAU;AAC3D,aAAO,KAAK,IAAI,eAAe;AAAA,IACjC;AAAA,IAEA,MAAM,kBAAkB,KAAqD;AAC3E,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,UAAU,UAAU,EAAE,YAAY,IAAI,WAAW,CAAC;AAChF,aAAO,gBAAgB,IAAI;AAAA,IAC7B;AAAA,EACF;AACF;;;ACzFO,SAAS,6BAA6B,UAA+C,CAAC,GAAG;AAC9F,QAAM,EAAE,SAAS,iBAAiB,aAAa,GAAG,cAAc,IAAI;AACpE,QAAM,SAAS,sBAAsB,aAAa;AAClD,QAAM,UACJ,mBACC;AAAA,IACC,cAAc,2BAA2B,MAAM;AAAA,IAC/C,kBAAkB,uBAAuB,MAAM;AAAA,IAC/C,cAAc,mBAAmB,MAAM;AAAA,IACvC,gBAAgB,6BAA6B,MAAM;AAAA,EACrD;AAEF,SAAO,wBAA0C;AAAA,IAC/C,YAAY,wBAAwB,EAAE,OAAO,CAAC;AAAA,IAC9C,GAAG,2BAA2B,EAAE,OAAO,CAAC;AAAA,IACxC;AAAA,IACA,UAAU,iCAAiC,EAAE,GAAG,eAAe,OAAO,CAAC;AAAA,IACvE,SAAS,gCAAgC,EAAE,GAAG,eAAe,OAAO,CAAC;AAAA,IACrE,WAAW,qBAAqB,EAAE,OAAO,CAAC;AAAA,IAC1C,aAAa,eAAe,+BAA+B,EAAE,OAAO,CAAC;AAAA,EACvE,CAAC;AACH;","names":["TrueForgeApi","toUiCatalogEntry","toHarnessManifest","toUiCatalogEntry","toHarnessManifest","toUiSkill"]}
1
+ {"version":3,"sources":["../../../src/plugins/trueforge-agent-server-adapter/client.ts","../../../src/plugins/trueforge-agent-server-adapter/agentMetricsServer.ts","../../../src/plugins/trueforge-agent-server-adapter/toUiTurnState.ts","../../../src/plugins/trueforge-agent-server-adapter/chatServer.ts","../../../src/plugins/trueforge-agent-server-adapter/agentSessionsServer.ts","../../../src/plugins/trueforge-agent-server-adapter/agentsList.ts","../../../src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.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/catalogs/webSearchProviderCatalog.ts","../../../src/plugins/trueforge-agent-server-adapter/permissionsServer.ts","../../../src/plugins/trueforge-agent-server-adapter/schedules/scheduleServer.ts","../../../src/plugins/trueforge-agent-server-adapter/index.ts"],"sourcesContent":["/**\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\n/**\n * SDK passthrough `fetch` only attaches Bearer when `baseUrl` and the request URL\n * are absolute same-origin URLs. Relative defaults like `/` fail that check, so\n * absolutize against the page origin in the browser.\n */\nexport function resolveTrueForgeBaseUrl(baseUrl: string): string {\n if (/^https?:\\/\\//i.test(baseUrl)) return baseUrl;\n const origin = globalThis.location?.origin;\n if (typeof origin === 'string' && origin.length > 0 && origin !== 'null') {\n return new URL(baseUrl, origin).href;\n }\n return baseUrl;\n}\n\nexport function createTrueForgeClient(options: CreateTrueForgeClientOptions = {}): TrueForge {\n return new TrueForge({\n baseUrl: resolveTrueForgeBaseUrl(options.baseUrl ?? DEFAULT_BASE_URL),\n ...(options.token === undefined ? {} : { token: options.token }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n}\n\nexport function parseIsoDate(value: string): Date {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid ISO timestamp: ${value}`);\n }\n return date;\n}\n","import type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\n\nimport type { AgentMetricsServer } from '../../server/types.js';\nimport { createTrueForgeClient, parseIsoDate, type CreateTrueForgeClientOptions } from './client.js';\n\nexport type CreateHarnessAgentMetricsServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\nfunction toHarnessChartName(name: string): TrueForgeApi.SessionMetricsChartName {\n if (name === 'sessions_over_time' || name === 'sessions_cost_over_time' || name === 'turns_over_time') {\n return name;\n }\n throw new Error(`Unsupported Harness metrics chart: ${name}`);\n}\n\nexport function createHarnessAgentMetricsServer(\n options: CreateHarnessAgentMetricsServerOptions = {},\n): AgentMetricsServer {\n const client = options.client ?? createTrueForgeClient(options);\n\n return {\n async getCharts() {\n const { data } = await client.internal.metrics.listCharts();\n return data.charts;\n },\n async getMeters({ agentId, startTimestamp, endTimestamp }) {\n const { data } = await client.internal.metrics.getMeters({\n agentId,\n startTimestamp: parseIsoDate(startTimestamp),\n endTimestamp: parseIsoDate(endTimestamp),\n });\n return data.meters;\n },\n async getChartData({ agentId, startTimestamp, endTimestamp, chartName }) {\n const { data } = await client.internal.metrics.getChartData({\n agentId,\n startTimestamp: parseIsoDate(startTimestamp),\n endTimestamp: parseIsoDate(endTimestamp),\n chartName: toHarnessChartName(chartName),\n });\n return data;\n },\n };\n}\n","import type { TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type { SessionEventItem, TurnDoneMetrics, TurnState, TurnStreamingEvent } from '../../server/types.js';\n\n/** SDK token fields are optional; the UI contract requires numbers. Keep cost for session tiles. */\nexport function toUiTurnDoneMetrics(metrics: TrueForgeApi.TurnMetrics): TurnDoneMetrics & { totalCostInUsd?: number } {\n return {\n totalInputTokens: metrics.totalInputTokens ?? 0,\n totalOutputTokens: metrics.totalOutputTokens ?? 0,\n totalTokens: metrics.totalTokens ?? 0,\n totalCacheReadTokens: metrics.totalCacheReadTokens ?? 0,\n totalCacheWriteTokens: metrics.totalCacheWriteTokens ?? 0,\n totalReasoningTokens: metrics.totalReasoningTokens ?? 0,\n ...(metrics.totalCostInUsd == null ? {} : { totalCostInUsd: metrics.totalCostInUsd }),\n };\n}\n\nexport function toUiTurnState(state: TrueForgeApi.TurnState | TrueForgeApi.TurnDoneEventState): TurnState {\n return state.status === 'running' ? { status: 'running' } : toUiTerminalTurnState(state);\n}\n\nfunction toUiTerminalTurnState(state: TrueForgeApi.TurnDoneEventState): Exclude<TurnState, { status: 'running' }> {\n switch (state.status) {\n case 'cancelled':\n return { status: 'cancelled', reason: state.reason, completedAt: state.completedAt };\n case 'error':\n return { status: 'error', message: state.message, completedAt: state.completedAt };\n case 'done':\n return {\n status: 'done',\n completedAt: state.completedAt,\n requiredActions: state.requiredActions,\n ...(state.output == null ? {} : { output: state.output }),\n ...(state.metrics == null ? {} : { metrics: toUiTurnDoneMetrics(state.metrics) }),\n };\n }\n}\n\nexport function toUiSessionEvent(event: TrueForgeApi.SessionEvent): SessionEventItem['event'] | undefined {\n // TODO: map turn.update when the runtime event union includes it\n if (event.type === 'turn.update') return undefined;\n if (event.type !== 'turn.done') return { ...event };\n return { ...event, state: toUiTerminalTurnState(event.state) };\n}\n\nexport function toUiStreamingEvent(event: TrueForgeApi.TurnStreamingEvent): TurnStreamingEvent | undefined {\n // TODO: map turn.update when the runtime event union includes it\n if (event.type === 'turn.update') return undefined;\n if (event.type !== 'turn.done') return { ...event };\n return { ...event, state: toUiTerminalTurnState(event.state) };\n}\n\nexport function toUiEventItem(item: TrueForgeApi.SessionEventItem): SessionEventItem | undefined {\n const event = toUiSessionEvent(item.event);\n return event === undefined ? undefined : { turnId: item.turnId, event };\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 (+ optional preload) 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 { readSessionIsCreateAgent } from '../../atoms/lib/sessionCreateAgent.js';\nimport type {\n AgentChatServer,\n CreateSessionRequest,\n ListResult,\n Session,\n Turn,\n TurnInputItem,\n UserMessageContent,\n} from '../../server/types.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport { toUiEventItem, toUiStreamingEvent, toUiTurnState } from './toUiTurnState.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\n/** UI session with create-agent intent for resume chrome. */\nexport type HarnessUiSession = Session<HarnessAgentSpec> & { isCreateAgent: boolean };\n\nexport type HarnessCreateSessionRequest = CreateSessionRequest<HarnessAgentSpec> & {\n metadata?: Record<string, string>;\n};\n\nfunction toUiMcpServer(server: TrueForgeApi.McpServer): HarnessMcpServerMount {\n return server;\n}\n\nfunction toUiSkill(skill: TrueForgeApi.Skill): HarnessSkillMount {\n return { name: skill.name, preload: skill.preload === true };\n}\n\nfunction toHarnessSkill(skill: HarnessSkillMount): TrueForgeApi.Skill {\n // Picker `id` is AvailableSkill.name (attach key); `name` is display — see builder getSkills.\n return { name: skill.id ?? skill.name, preload: skill.preload === true };\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(toHarnessSkill) }),\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): HarnessUiSession {\n return {\n id: session.id,\n isMutable: session.agent.type === 'inline',\n isCreateAgent: readSessionIsCreateAgent(session.metadata),\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\nfunction createSessionMetadata(request: HarnessCreateSessionRequest): Record<string, string> | undefined {\n if (request.metadata === undefined) return undefined;\n return request.metadata;\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, state, ...rest } = turn;\n return {\n ...rest,\n state: toUiTurnState(state),\n ...(previousTurnId === null ? {} : { previousTurnId }),\n ...(input === undefined ? {} : { input: toUiInput(input) }),\n };\n}\n\nexport interface HarnessPageSource<T> {\n data: T[];\n response: { pagination: TrueForgeApi.TokenPagination };\n}\n\nexport function toListResult<TSource, TResult>(\n page: HarnessPageSource<TSource>,\n map: (item: TSource) => TResult | undefined,\n): ListResult<TResult> {\n const data: TResult[] = [];\n for (const item of page.data) {\n const mapped = map(item);\n if (mapped !== undefined) data.push(mapped);\n }\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, HarnessUiSession, HarnessCreateSessionRequest> {\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 const metadata = createSessionMetadata(request);\n if (request.agentName !== undefined && request.agentName.length > 0) {\n const created = await client.sessions.create({\n agent: { name: request.agentName },\n ...(metadata === undefined ? {} : { metadata }),\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 ...(metadata === undefined ? {} : { metadata }),\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 ...(request.createdByMe === undefined ? {} : { createdByMe: request.createdByMe }),\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 deleteSession({ sessionId }) {\n await client.sessions.delete(sessionId);\n },\n\n async renameSession({ sessionId, title }) {\n await client.sessions.update(sessionId, { title });\n },\n\n async updateSession({ sessionId, agentSpec, title }) {\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 ...(title === undefined ? {} : { title }),\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 const event = toUiStreamingEvent(item.data);\n if (event !== undefined) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event,\n };\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 const event = toUiStreamingEvent(item.data);\n if (event !== undefined) {\n yield {\n sequenceNumber: sequenceNumber(item.id, fallbackSequence),\n event,\n };\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","import type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport { readSessionIsCreateAgent } from '../../atoms/lib/sessionCreateAgent.js';\nimport type { AgentSessionsServer, SessionListEntry } from '../../server/types.js';\nimport { toListResult, toUiAgentSpec } from './chatServer.js';\nimport {\n createTrueForgeClient,\n parseIsoDate,\n resolveTrueForgeBaseUrl,\n type CreateTrueForgeClientOptions,\n} from './client.js';\nimport { toUiEventItem } from './toUiTurnState.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport type CreateHarnessAgentSessionsServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\nexport type HarnessSessionListEntry = SessionListEntry<HarnessAgentSpec> & {\n isCreateAgent: boolean;\n isMutable: boolean;\n sourceType?: 'schedule';\n};\n\nfunction toSessionListEntry(session: TrueForgeApi.Session): HarnessSessionListEntry {\n return {\n id: session.id,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n lastActivityAt: session.updatedAt,\n isCreateAgent: readSessionIsCreateAgent(session.metadata),\n isMutable: session.agent.type === 'inline',\n metrics: {\n totalTurns: session.metrics.totalTurns,\n ...(session.metrics.totalCostInUsd == null ? {} : { totalCostInUsd: session.metrics.totalCostInUsd }),\n totalDurationMs: session.metrics.totalDurationMs,\n },\n ...(session.title === null ? {} : { title: session.title }),\n ...(session.agent.type === 'reference' && session.agent.name !== null ? { agentName: session.agent.name } : {}),\n ...(session.agent.type === 'inline' ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}),\n ...(session.source?.type === 'schedule' ? { sourceType: session.source.type } : {}),\n };\n}\n\nexport function createHarnessAgentSessionsServer(\n options: CreateHarnessAgentSessionsServerOptions = {},\n): AgentSessionsServer<HarnessAgentSpec> {\n const client = options.client ?? createTrueForgeClient(options);\n\n return {\n async getAgent({ agentId }) {\n const { data } = await client.agents.get(agentId);\n return {\n agentId: data.id,\n name: data.name,\n description: data.description,\n agentSpec: toUiAgentSpec(data.manifest),\n };\n },\n async getCodeSnippets({ agentId }) {\n // Snippet SDK `baseUrl` should not end with `/` (hosts often pass a trailing path slash).\n const absoluteBaseUrl = resolveTrueForgeBaseUrl(options.baseUrl ?? '/').replace(/\\/$/, '');\n const { data } = await client.internal.agents.getCodeSnippets(\n agentId,\n /^https?:\\/\\//i.test(absoluteBaseUrl) ? { baseUrl: absoluteBaseUrl } : undefined,\n );\n return data.snippets;\n },\n async listSessions(requestParams = {}) {\n const page = await client.sessions.list({\n ...(requestParams.limit === undefined ? {} : { limit: requestParams.limit }),\n ...(requestParams.order === undefined ? {} : { order: requestParams.order }),\n ...(requestParams.pageToken === undefined ? {} : { pageToken: requestParams.pageToken }),\n ...(requestParams.startTimestamp === undefined\n ? {}\n : { startTimestamp: parseIsoDate(requestParams.startTimestamp) }),\n ...(requestParams.endTimestamp === undefined ? {} : { endTimestamp: parseIsoDate(requestParams.endTimestamp) }),\n ...(requestParams.agentId === undefined || requestParams.agentId.length === 0\n ? {}\n : { agentId: requestParams.agentId }),\n ...(requestParams.createdByMe === undefined ? {} : { createdByMe: requestParams.createdByMe }),\n });\n return toListResult(page, toSessionListEntry);\n },\n async listSessionEvents({ sessionId, pageToken, limit }) {\n const page = await client.sessions.listEvents(sessionId, {\n ...(pageToken === undefined ? {} : { pageToken }),\n ...(limit === undefined ? {} : { limit }),\n });\n return toListResult(page, toUiEventItem);\n },\n };\n}\n","/**\n * Paginated helpers for `client.agents.list` (API default 50, max 100).\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\n\n/** Matches API AGENTS_PAGE_DEFAULT / AGENTS_PAGE_LIMIT. */\nexport const AGENTS_PAGE_DEFAULT = 50;\nexport const AGENTS_PAGE_LIMIT = 100;\n\nexport function clampAgentsPageSize(size: number): number {\n return Math.min(Math.max(size, 1), AGENTS_PAGE_LIMIT);\n}\n\n/**\n * One page of agents. `offset` must be a multiple of `limit` (page-aligned);\n * advances via SDK `getNextPage` so we never invent page tokens.\n */\nexport async function listAgentsPage({\n client,\n limit,\n offset = 0,\n agentName,\n}: {\n client: TrueForge;\n limit: number;\n offset?: number;\n agentName?: string;\n}): Promise<TrueForgeApi.Agent[]> {\n const pageSize = clampAgentsPageSize(limit);\n const start = Math.max(0, offset);\n const page = await client.agents.list({\n limit: pageSize,\n ...(agentName === undefined ? {} : { agentName }),\n });\n let at = 0;\n while (at < start) {\n if (!page.hasNextPage()) return [];\n await page.getNextPage();\n at += pageSize;\n }\n return [...page.data];\n}\n\n/** Drain every agents page into one array (name lookups, indexes). */\nexport async function drainAgentsList(client: TrueForge): Promise<TrueForgeApi.Agent[]> {\n const items: TrueForgeApi.Agent[] = [];\n const page = await client.agents.list({ limit: AGENTS_PAGE_DEFAULT });\n for (;;) {\n items.push(...page.data);\n if (!page.hasNextPage()) break;\n await page.getNextPage();\n }\n return items;\n}\n","/**\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\n/** Prefixed Authorization values for MCP catalog servers that expect `Bearer …`. */\nfunction ensureBearerAuthorizationValue({ headerName, value }: { headerName: string; value: string }): string {\n if (headerName.toLowerCase() !== DEFAULT_API_KEY_HEADER.toLowerCase()) {\n return value;\n }\n if (/^bearer\\s+/i.test(value)) {\n return value;\n }\n return `Bearer ${value}`;\n}\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 {\n type: 'header',\n headers: { [headerName]: ensureBearerAuthorizationValue({ headerName, value: apiKey }) },\n };\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 type UiToolAnnotations = {\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n};\n\nfunction toUiToolAnnotations(value: unknown): UiToolAnnotations | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const readOnlyHint = Reflect.get(value, 'readOnlyHint');\n const destructiveHint = Reflect.get(value, 'destructiveHint');\n const annotations: UiToolAnnotations = {\n ...(typeof readOnlyHint === 'boolean' ? { readOnlyHint } : {}),\n ...(typeof destructiveHint === 'boolean' ? { destructiveHint } : {}),\n };\n return Object.keys(annotations).length > 0 ? annotations : undefined;\n}\n\nexport function toUiTool(tool: Record<string, unknown>): ToolBase & { annotations?: UiToolAnnotations } {\n const name = typeof tool.name === 'string' && tool.name !== '' ? tool.name : 'tool';\n const description = typeof tool.description === 'string' ? tool.description : '';\n const annotations = toUiToolAnnotations(Reflect.get(tool, 'annotations'));\n return annotations === undefined ? { id: name, name, description } : { id: name, name, description, annotations };\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 `createTrueForgeServer`. 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 * 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 createTrueForgeServer.\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 { AGENTS_PAGE_DEFAULT, clampAgentsPageSize, drainAgentsList, listAgentsPage } from './agentsList.js';\nimport { toUiConnectorFromReadEntry, toUiTool } 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 { contextLength, maxOutputTokens, reasoningEfforts } = model.properties;\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 ...(contextLength === undefined ? {} : { contextLength }),\n ...(maxOutputTokens === undefined ? {} : { maxOutputTokens }),\n ...(reasoningEfforts === undefined ? {} : { reasoningEfforts: [...reasoningEfforts] }),\n },\n };\n}\n\nfunction toLibraryEntry(agent: TrueForgeApi.Agent): AgentLibraryEntry {\n return {\n name: agent.name,\n agentId: agent.id,\n description: agent.description,\n agentSpec: toUiAgentSpec(agent.manifest),\n createdBySubject: agent.createdBySubject,\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 // Catalog AvailableSkill.name is store identity (FQN in TFY). Picker `id` copies that\n // attach key; `name` is displayName so the draft can show a label without losing the wire key.\n // Draft mounts `{ id, name }`; toHarnessSkill admits AgentSpec.skills[].name = id ?? name.\n getSkills: async () => {\n const skills = await listSkills(client);\n return skills.map(skill => {\n const { display_name, repository_name, version: versionRaw } = skill.metadata ?? {};\n const version = Number(versionRaw);\n const hasVersion = Number.isInteger(version) && version > 0;\n return {\n id: skill.name,\n name: display_name ?? skill.name,\n description: skill.description,\n ...(repository_name === undefined ? {} : { skillRepoName: repository_name }),\n ...(hasVersion\n ? {\n version,\n loadVersions: async () => (await client.skills.listVersions({ name: skill.name })).data,\n }\n : {}),\n };\n });\n },\n getMcp: async () => (await listConfiguredMcpServers(client)).map(toUiConnectorFromReadEntry),\n getMcpConnector: async ({ connectorId }: { connectorId: string }) => {\n const body = await client.mcpServers.get(connectorId);\n return toUiConnectorFromReadEntry(body.data);\n },\n getMcpTools: async ({ connectorId }: { connectorId: string }) => {\n const body = await client.mcpServers.listTools(connectorId);\n return body.data.flatMap(tool =>\n typeof tool.name === 'string' && tool.name.trim() !== '' ? [toUiTool(tool)] : [],\n );\n },\n\n async searchAgents(req?: SearchAgentsParams) {\n const limit = clampAgentsPageSize(req?.limit ?? AGENTS_PAGE_DEFAULT);\n const offset = req?.offset ?? 0;\n const query = req?.query?.trim();\n const rows = await listAgentsPage({\n client,\n limit,\n offset,\n ...(query === undefined || query === '' ? {} : { agentName: query }),\n });\n return rows.map(toLibraryEntry);\n },\n\n async saveAgent({ agentName, description: descriptionRaw, agentSpec, intent }) {\n const manifest = toHarnessAgentSpec(agentSpec);\n const description = descriptionRaw?.trim();\n if (intent === 'update') {\n const agents = await drainAgentsList(client);\n const existing = agents.find(agent => agent.name === agentName);\n if (!existing) {\n return {};\n }\n // Omit empty description on update so a reloaded draft (no description in session\n // manifest) preserves the stored value instead of failing min(1).\n await client.agents.update(existing.id, {\n ...(description ? { description } : {}),\n manifest,\n });\n return { agentId: existing.id };\n }\n // Create requires description; fall back to name for clone of pre-description agents.\n const created = await client.agents.create({\n name: agentName,\n description: description || agentName,\n manifest,\n });\n return { agentId: created.data.id };\n },\n\n async deleteAgent({ agentName }) {\n const agents = await drainAgentsList(client);\n const existing = agents.find(agent => agent.name === agentName);\n if (!existing) return;\n await client.agents.delete(existing.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 Exclude<TrueForgeApi.ModelProviderManifest['type'], 'truefoundry'> {\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 `createTrueForgeServer`. 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 `createTrueForgeServer`. 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.settings.CreateSkillRequest['manifest'] {\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 manifest = skill.manifest;\n const displayName =\n 'displayName' in manifest && typeof manifest.displayName === 'string' ? manifest.displayName : manifest.name;\n const base = {\n id: skill.name,\n name: displayName,\n description: 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 `createTrueForgeServer`. 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 * Maps trueforge-ui web-search-settings calls onto Harness\n * `/api/v1/settings/web-search-providers` (singleton upsert, no delete).\n *\n * UI: multi-row providers with `id` / `catalogId` / `name` / flat `apiKey`.\n * Harness: one Parallel provider per tenant; catalog YAML has no name — synthetic\n * identity uses `type` (`parallel`) as id/catalogId and display name `Parallel`.\n */\nimport type { TrueForge } from '@truefoundry/trueforge-sdk';\nimport { TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n WebSearchCatalogServer,\n WebSearchProviderBase,\n WebSearchProviderCatalogEntry,\n} from '../../../server/types.js';\n\nexport type UiWebSearchProvider = WebSearchProviderBase;\nexport type UiWebSearchProviderCatalogEntry = WebSearchProviderCatalogEntry;\n\nconst PARALLEL_TYPE = 'parallel';\nconst PARALLEL_DISPLAY_NAME = 'Parallel';\n\nfunction displayNameForType(type: string): string {\n if (type === PARALLEL_TYPE) {\n return PARALLEL_DISPLAY_NAME;\n }\n return type;\n}\n\nexport function toUiCatalogEntry(provider: TrueForgeApi.CatalogWebSearchProvider): UiWebSearchProviderCatalogEntry {\n return {\n id: provider.type,\n name: displayNameForType(provider.type),\n type: provider.type,\n };\n}\n\nexport function toUiWebSearchProvider(provider: TrueForgeApi.WebSearchProviderManifest): UiWebSearchProvider {\n return {\n id: provider.type,\n name: displayNameForType(provider.type),\n catalogId: provider.type,\n isConnected: true,\n };\n}\n\nexport function filterUiWebSearchProviders({\n providers,\n query,\n}: {\n providers: UiWebSearchProvider[];\n query?: string;\n}): UiWebSearchProvider[] {\n const normalizedQuery = query?.trim().toLowerCase();\n if (normalizedQuery === undefined || normalizedQuery === '') {\n return providers;\n }\n return providers.filter(\n provider =>\n provider.name.toLowerCase().includes(normalizedQuery) || provider.id.toLowerCase().includes(normalizedQuery),\n );\n}\n\nexport function toHarnessManifest({\n type,\n apiKey,\n}: {\n type: string;\n apiKey: string;\n}): TrueForgeApi.WebSearchProviderManifest {\n if (type !== PARALLEL_TYPE) {\n throw new Error(`Unsupported web-search provider type: ${type}`);\n }\n return {\n type: PARALLEL_TYPE,\n auth: { apiKey },\n };\n}\n\n/** Settings web-search-catalog port for `createTrueForgeServer`. Delete omitted (no BE route). */\nexport function createWebSearchProviderCatalog(client: TrueForge): WebSearchCatalogServer {\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.webSearchProviders.get();\n return existing.data.manifest.auth.apiKey;\n }\n\n return {\n getWebSearchProviderCatalog: async () => {\n const body = await client.catalogs.webSearchProviders.list();\n return body.data.map(toUiCatalogEntry);\n },\n listWebSearchProviders: async req => {\n let providers: UiWebSearchProvider[];\n try {\n const body = await client.settings.webSearchProviders.get();\n providers = [toUiWebSearchProvider(body.data.manifest)];\n } catch (err) {\n if (err instanceof TrueForgeApi.NotFoundError) {\n providers = [];\n } else {\n throw err;\n }\n }\n return filterUiWebSearchProviders({ providers, query: req?.query });\n },\n createWebSearchProvider: async req => {\n const body = await client.settings.webSearchProviders.createOrUpdate({\n manifest: toHarnessManifest({ type: req.type, apiKey: req.apiKey }),\n });\n return toUiWebSearchProvider(body.data.manifest);\n },\n updateWebSearchProvider: async req => {\n const apiKey = await resolveApiKey(req.apiKey);\n const body = await client.settings.webSearchProviders.createOrUpdate({\n manifest: toHarnessManifest({ type: PARALLEL_TYPE, apiKey }),\n });\n return toUiWebSearchProvider(body.data.manifest);\n },\n };\n}\n","import type { TrueForge } from '@truefoundry/trueforge-sdk';\n\nimport type { PermissionsServer } from '../../server/types.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\n\nexport type CreateHarnessPermissionsServerOptions = CreateTrueForgeClientOptions & {\n client?: TrueForge;\n};\n\nexport function createHarnessPermissionsServer(options: CreateHarnessPermissionsServerOptions = {}): PermissionsServer {\n const client = options.client ?? createTrueForgeClient(options);\n return {\n listPermissions: async request => client.internal.listPermissions(request),\n };\n}\n","/**\n * Harness ScheduleServer adapter — maps flat runtime DTOs to SDK wire (manifest + agentName).\n */\nimport type { TrueForge, TrueForgeApi } from '@truefoundry/trueforge-sdk';\nimport type {\n CreateScheduleRequest,\n CreateScheduleRunRequest,\n ListResult,\n ListSchedulesParams,\n Schedule,\n ScheduleRun,\n ScheduleServer,\n ScheduleStatus,\n UpdateScheduleRequest,\n} from '../../../server/types.js';\nimport { drainAgentsList } from '../agentsList.js';\nimport { toListResult } from '../chatServer.js';\n\n/** Matches API PAGE_LIMIT for schedules list. */\nconst SCHEDULES_PAGE_LIMIT = 25;\n\ntype AgentIndex = {\n idToName: ReadonlyMap<string, string>;\n nameToId: ReadonlyMap<string, string>;\n};\n\nasync function loadAgentIndex(client: TrueForge): Promise<AgentIndex> {\n const agents = await drainAgentsList(client);\n const idToName = new Map<string, string>();\n const nameToId = new Map<string, string>();\n for (const agent of agents) {\n idToName.set(agent.id, agent.name);\n nameToId.set(agent.name, agent.id);\n }\n return { idToName, nameToId };\n}\n\nfunction resolveAgentName(agentId: string, index: AgentIndex): string {\n const byId = index.idToName.get(agentId);\n if (byId != null) return byId;\n if (index.nameToId.has(agentId)) return agentId;\n throw new Error(`Unknown agent: ${agentId}`);\n}\n\nfunction collectAgentIds(req?: ListSchedulesParams): string[] {\n const ids: string[] = [];\n if (req?.agentIds != null) {\n for (const id of req.agentIds) {\n if (id !== '') ids.push(id);\n }\n }\n if (req?.agentId != null && req.agentId !== '') ids.push(req.agentId);\n return [...new Set(ids)];\n}\n\nfunction wireStatus(manifest: TrueForgeApi.ScheduleManifest): ScheduleStatus {\n return manifest.status ?? 'active';\n}\n\nfunction toUiSchedule(wire: TrueForgeApi.Schedule, index: AgentIndex): Schedule {\n const agentId = index.nameToId.get(wire.agentName) ?? wire.agentName;\n return {\n id: wire.id,\n name: wire.name,\n agentId,\n agentName: wire.agentName,\n task: wire.manifest.task,\n cron: wire.manifest.cron,\n timezone: wire.manifest.timezone ?? 'UTC',\n status: wireStatus(wire.manifest),\n lastRunAt: null,\n createdBySubject: wire.createdBySubject,\n };\n}\n\nfunction toWireManifest(input: {\n task: string;\n cron: string;\n timezone?: string;\n status?: ScheduleStatus;\n}): TrueForgeApi.ScheduleManifest {\n return {\n task: input.task,\n cron: input.cron,\n timezone: input.timezone ?? 'UTC',\n status: input.status ?? 'active',\n };\n}\n\nfunction toIsoInstant(value: Date | string): string {\n if (value instanceof Date) return value.toISOString();\n return value;\n}\n\nfunction toUiScheduleRun(wire: TrueForgeApi.ScheduleRun): ScheduleRun {\n return {\n id: wire.id,\n scheduleId: wire.scheduleId,\n name: wire.name,\n scheduledFor: toIsoInstant(wire.scheduledFor),\n status: wire.status,\n triggeredAt: wire.triggeredAt == null ? null : toIsoInstant(wire.triggeredAt),\n triggeredBy: wire.createdBySubject.subjectDisplayName || wire.createdBySubject.subjectId,\n };\n}\n\nexport function createScheduleServer(options: { client: TrueForge }): ScheduleServer {\n const { client } = options;\n\n return {\n async listSchedules(req?: ListSchedulesParams): Promise<ListResult<Schedule>> {\n const index = await loadAgentIndex(client);\n const agentIds = collectAgentIds(req);\n const agentNames = agentIds.length === 0 ? undefined : agentIds.map(id => resolveAgentName(id, index)).join(',');\n const limit = Math.min(Math.max(req?.limit ?? SCHEDULES_PAGE_LIMIT, 1), SCHEDULES_PAGE_LIMIT);\n const page = await client.schedules.list({\n limit,\n ...(req?.pageToken === undefined || req.pageToken === '' ? {} : { pageToken: req.pageToken }),\n ...(agentNames === undefined ? {} : { agentNames }),\n });\n return toListResult(page, row => toUiSchedule(row, index));\n },\n\n async getSchedule({ id }): Promise<Schedule> {\n const index = await loadAgentIndex(client);\n const { data } = await client.schedules.get(id);\n return toUiSchedule(data, index);\n },\n\n async createSchedule(req: CreateScheduleRequest): Promise<Schedule> {\n const index = await loadAgentIndex(client);\n const agentName = resolveAgentName(req.agentId, index);\n const { data } = await client.schedules.create({\n agentName,\n name: req.name,\n manifest: toWireManifest(req),\n });\n return toUiSchedule(data, index);\n },\n\n async updateSchedule(req: UpdateScheduleRequest): Promise<Schedule> {\n const index = await loadAgentIndex(client);\n const { data } = await client.schedules.update(req.id, {\n name: req.name,\n manifest: toWireManifest(req),\n });\n return toUiSchedule(data, index);\n },\n\n async deleteSchedule({ id }): Promise<void> {\n await client.schedules.delete(id);\n },\n\n async listScheduleRuns({ scheduleId }): Promise<ScheduleRun[]> {\n const { data } = await client.schedules.listRuns(scheduleId);\n return data.map(toUiScheduleRun);\n },\n\n async createScheduleRun(req: CreateScheduleRunRequest): Promise<ScheduleRun> {\n const { data } = await client.schedules.createRun({ scheduleId: req.scheduleId });\n return toUiScheduleRun(data);\n },\n };\n}\n","/**\n * Built-in Harness → AgentUIServer factory for `<TrueForgeUI server={{ type: \"trueforge\", … }} />`.\n */\nimport { createTrueForgeServer } from '../../server/createTrueForgeServer.js';\nimport type { CatalogServer, PermissionsServer } from '../../server/types.js';\nimport { createHarnessAgentMetricsServer } from './agentMetricsServer.js';\nimport { createHarnessAgentSessionsServer } from './agentSessionsServer.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 { createWebSearchProviderCatalog } from './catalogs/webSearchProviderCatalog.js';\nimport { createHarnessChatServer } from './chatServer.js';\nimport { createTrueForgeClient, type CreateTrueForgeClientOptions } from './client.js';\nimport { createHarnessPermissionsServer } from './permissionsServer.js';\nimport { createScheduleServer } from './schedules/scheduleServer.js';\nimport type { HarnessAgentSpec } from './types.js';\n\nexport { createHarnessAgentMetricsServer, type CreateHarnessAgentMetricsServerOptions } from './agentMetricsServer.js';\nexport {\n createHarnessAgentSessionsServer,\n type CreateHarnessAgentSessionsServerOptions,\n} from './agentSessionsServer.js';\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 createWebSearchProviderCatalog,\n filterUiWebSearchProviders,\n toHarnessManifest as toHarnessWebSearchManifest,\n toUiCatalogEntry as toUiWebSearchCatalogEntry,\n toUiWebSearchProvider,\n} from './catalogs/webSearchProviderCatalog.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 { createHarnessPermissionsServer, type CreateHarnessPermissionsServerOptions } from './permissionsServer.js';\nexport { createScheduleServer } from './schedules/scheduleServer.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 /** Optional host-provided resource permissions port. */\n permissions?: PermissionsServer;\n};\n\n/**\n * Compose chat + builder + agent sessions + default settings catalogs into an `AgentUIServer`.\n */\nexport function createTrueForgeAgentUIServer(options: CreateTrueForgeAgentUIServerOptions = {}) {\n const { catalog: catalogOverride, permissions, ...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 webSearchCatalog: createWebSearchProviderCatalog(client),\n } satisfies CatalogServer);\n\n return createTrueForgeServer<HarnessAgentSpec>({\n chatServer: createHarnessChatServer({ client }),\n ...createHarnessBuilderServer({ client }),\n catalog,\n sessions: createHarnessAgentSessionsServer({ ...clientOptions, client }),\n metrics: createHarnessAgentMetricsServer({ ...clientOptions, client }),\n schedules: createScheduleServer({ client }),\n permissions: permissions ?? createHarnessPermissionsServer({ client }),\n });\n}\n"],"mappings":"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","names":["TrueForgeApi","toUiCatalogEntry","toHarnessManifest","toUiCatalogEntry","toHarnessManifest","toUiSkill","TrueForgeApi","displayNameForType","toUiCatalogEntry","toHarnessManifest"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truefoundry/trueforge-ui",
3
- "version": "0.3.1",
3
+ "version": "0.4.0-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",
@@ -80,7 +80,6 @@
80
80
  "@openuidev/react-headless": "^0.9.4",
81
81
  "@openuidev/react-lang": "^0.2.9",
82
82
  "@openuidev/react-ui": "^0.13.2",
83
- "@truefoundry/assistant-ui-runtime": "0.1.43",
84
83
  "chart.js": "^4.5.1",
85
84
  "clsx": "^2.1.1",
86
85
  "lucide-react": "^0.562.0",
@@ -94,15 +93,15 @@
94
93
  "remark-gfm": "^4.0.1",
95
94
  "tailwind-merge": "^3.6.0",
96
95
  "thinking-orbs": "^0.3.1",
97
- "truefoundry-gateway-sdk": "^0.4.2",
98
96
  "zod": "^4.4.3",
99
- "@truefoundry/trueforge-sdk": "0.2.0"
97
+ "@truefoundry/trueforge-assistant-ui-runtime": "0.2.0-rc.0",
98
+ "@truefoundry/trueforge-sdk": "0.2.1-rc.0"
100
99
  },
101
100
  "devDependencies": {
102
101
  "@eslint/js": "^9.39.0",
103
102
  "@tailwindcss/cli": "^4.3.2",
104
103
  "@testing-library/dom": "^10.0.0",
105
- "@testing-library/jest-dom": "^6.6.3",
104
+ "@testing-library/jest-dom": "6.6.3",
106
105
  "@testing-library/react": "^16.3.2",
107
106
  "@types/node": "^20",
108
107
  "@types/react": "^19.2.17",
@@ -125,16 +124,18 @@
125
124
  "vitest": "^4.1.9"
126
125
  },
127
126
  "scripts": {
128
- "prebuild": "pnpm -w run sdk:types",
127
+ "runtime:build": "pnpm --filter @truefoundry/trueforge-assistant-ui-runtime build",
128
+ "prebuild": "pnpm run runtime:build && pnpm -w run sdk:types",
129
129
  "build": "node ../../scripts/rm-path.mjs dist && tailwindcss --input src/build-styles.css --output dist/styles.css --minify && tsup",
130
130
  "dev:watch": "pnpm run \"/^(dev:watch:js|dev:watch:css)$/\"",
131
131
  "dev:watch:js": "tsup --watch",
132
132
  "dev:watch:css": "tailwindcss --input src/build-styles.css --output dist/styles.css --watch",
133
133
  "pack:tgz": "pnpm build && pnpm pack",
134
+ "pretest": "pnpm run runtime:build",
134
135
  "test": "vitest run && pnpm test:package",
135
136
  "test:package": "pnpm build && node test/packageExports.smoke.mjs",
136
137
  "test:coverage": "vitest run --coverage",
137
- "pretypecheck": "pnpm -w run sdk:types",
138
+ "pretypecheck": "pnpm run runtime:build && pnpm -w run sdk:types",
138
139
  "typecheck": "tsc --noEmit && tsc --noEmit -p test/tsconfig.json",
139
140
  "lint": "eslint src test --ext .ts,.tsx",
140
141
  "format": "prettier --write \"src/**/*.{ts,tsx,css,md}\" \"test/**/*.{ts,tsx}\" \"*.md\" \"docs/**/*.md\" --config ../../.prettierrc"
@@ -1,15 +0,0 @@
1
- "use client";
2
- import {
3
- AgentMetricChart
4
- } from "./chunk-XHPIJ77Q.js";
5
- import "./chunk-XR4S7B2K.js";
6
- import "./chunk-AO23SZBG.js";
7
- import "./chunk-4OZFQVSR.js";
8
- import "./chunk-2XT2VUT4.js";
9
- import "./chunk-M6MHLVSO.js";
10
- import "./chunk-QKFMAQ7O.js";
11
- import "./chunk-6UACSIIY.js";
12
- export {
13
- AgentMetricChart
14
- };
15
- //# sourceMappingURL=AgentMetricChart-VDIE3S2P.js.map
@@ -1,15 +0,0 @@
1
- "use client";
2
- import {
3
- SchedulesPage
4
- } from "./chunk-SAYUMANU.js";
5
- import "./chunk-XR4S7B2K.js";
6
- import "./chunk-AO23SZBG.js";
7
- import "./chunk-4OZFQVSR.js";
8
- import "./chunk-2XT2VUT4.js";
9
- import "./chunk-M6MHLVSO.js";
10
- import "./chunk-QKFMAQ7O.js";
11
- import "./chunk-6UACSIIY.js";
12
- export {
13
- SchedulesPage
14
- };
15
- //# sourceMappingURL=SchedulesPage-TIS3BH67.js.map