@truefoundry/trueforge-ui 0.3.0-rc.1 → 0.3.0-rc.11

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 (112) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +23 -8
  3. package/dist/{AgentCodeSnippets-NZOFJE57.js → AgentCodeSnippets-CHDVZHHK.js} +38 -23
  4. package/dist/AgentCodeSnippets-CHDVZHHK.js.map +1 -0
  5. package/dist/AgentMetricChart-6RGWFMJE.js +15 -0
  6. package/dist/AgentOverview-3LJZ6MO7.js +311 -0
  7. package/dist/AgentOverview-3LJZ6MO7.js.map +1 -0
  8. package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-5GOJKT7D.js} +19 -10
  9. package/dist/AgentSessionEventTimeline-5GOJKT7D.js.map +1 -0
  10. package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-UYG3JQMP.js} +144 -57
  11. package/dist/AgentSessionEventTimelineChart-UYG3JQMP.js.map +1 -0
  12. package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-KUABCQ4W.js} +140 -27
  13. package/dist/AgentSessions-KUABCQ4W.js.map +1 -0
  14. package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-PED5C2P7.js} +162 -126
  15. package/dist/ConnectorSettings-PED5C2P7.js.map +1 -0
  16. package/dist/{DockLayout-LM4AFMFY.js → DockLayout-ACM7BVIH.js} +10 -10
  17. package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-SGBYRKHI.js} +14 -12
  18. package/dist/DrawerLayout-SGBYRKHI.js.map +1 -0
  19. package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-GJTVFXFY.js} +22 -28
  20. package/dist/ModelSettings-GJTVFXFY.js.map +1 -0
  21. package/dist/OpenUiFenceBlock-MJTC2VJ5.js +9 -0
  22. package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-VETQ7UPE.js} +17 -21
  23. package/dist/SandboxSettings-VETQ7UPE.js.map +1 -0
  24. package/dist/SchedulesPage-LHJ3U2VM.js +15 -0
  25. package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-5ZCU66FF.js} +9 -9
  26. package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-5ZCU66FF.js.map} +1 -1
  27. package/dist/{ShellRouteSync-CEBETGEJ.js → ShellRouteSync-SJXFKUAJ.js} +171 -26
  28. package/dist/ShellRouteSync-SJXFKUAJ.js.map +1 -0
  29. package/dist/{SidebarLayout-A2HJPPHS.js → SidebarLayout-TR5CAB6Q.js} +80 -58
  30. package/dist/SidebarLayout-TR5CAB6Q.js.map +1 -0
  31. package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-TRTY2YH3.js} +24 -22
  32. package/dist/SkillSettings-TRTY2YH3.js.map +1 -0
  33. package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-GZUSRZIR.js} +9 -9
  34. package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-2TM6I4LJ.js} +10 -10
  35. package/dist/{chunk-U7KURWW3.js → chunk-2GIZY3JJ.js} +276 -54
  36. package/dist/chunk-2GIZY3JJ.js.map +1 -0
  37. package/dist/{chunk-ZKNUMH2M.js → chunk-2MUK3SMR.js} +13 -11
  38. package/dist/chunk-2MUK3SMR.js.map +1 -0
  39. package/dist/{chunk-WVE3F724.js → chunk-2QTH6JHX.js} +21 -4
  40. package/dist/chunk-2QTH6JHX.js.map +1 -0
  41. package/dist/{chunk-XAU7QFG3.js → chunk-5N5V7YLO.js} +72 -256
  42. package/dist/chunk-5N5V7YLO.js.map +1 -0
  43. package/dist/{chunk-CYHJDKFB.js → chunk-75YEQUUD.js} +189 -52
  44. package/dist/chunk-75YEQUUD.js.map +1 -0
  45. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  46. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  47. package/dist/{chunk-M62XY4NC.js → chunk-BXG6XN2S.js} +235 -108
  48. package/dist/chunk-BXG6XN2S.js.map +1 -0
  49. package/dist/chunk-GKXDRULM.js +587 -0
  50. package/dist/chunk-GKXDRULM.js.map +1 -0
  51. package/dist/{chunk-ZTMKFZQ3.js → chunk-OH357IHR.js} +5572 -3367
  52. package/dist/chunk-OH357IHR.js.map +1 -0
  53. package/dist/{chunk-DMMZSZTN.js → chunk-P6MZDITS.js} +60 -16
  54. package/dist/chunk-P6MZDITS.js.map +1 -0
  55. package/dist/{chunk-MPNSO7E6.js → chunk-SLMFEG7X.js} +2 -2
  56. package/dist/chunk-T6QQV5LK.js +238 -0
  57. package/dist/chunk-T6QQV5LK.js.map +1 -0
  58. package/dist/{chunk-6O6FWUDW.js → chunk-UWLL327M.js} +641 -388
  59. package/dist/chunk-UWLL327M.js.map +1 -0
  60. package/dist/{chunk-FJW36PD7.js → chunk-VAOCM3QQ.js} +28 -24
  61. package/dist/chunk-VAOCM3QQ.js.map +1 -0
  62. package/dist/chunk-Y7O6CMC7.js +517 -0
  63. package/dist/chunk-Y7O6CMC7.js.map +1 -0
  64. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  65. package/dist/index.d.ts +377 -108
  66. package/dist/index.js +69 -488
  67. package/dist/index.js.map +1 -1
  68. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +49 -14
  69. package/dist/plugins/trueforge-agent-server-adapter/index.js +161 -60
  70. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  71. package/dist/styles.css +1 -1
  72. package/package.json +5 -4
  73. package/dist/AgentCodeSnippets-NZOFJE57.js.map +0 -1
  74. package/dist/AgentMetricChart-JPU3MFQ2.js +0 -15
  75. package/dist/AgentOverview-EEBHJC32.js +0 -167
  76. package/dist/AgentOverview-EEBHJC32.js.map +0 -1
  77. package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
  78. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
  79. package/dist/AgentSessions-3MPDZASK.js.map +0 -1
  80. package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
  81. package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
  82. package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
  83. package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
  84. package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
  85. package/dist/SchedulesPage-KKLUDO6B.js +0 -15
  86. package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
  87. package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
  88. package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
  89. package/dist/chunk-2XPPBEYF.js +0 -74
  90. package/dist/chunk-2XPPBEYF.js.map +0 -1
  91. package/dist/chunk-6O6FWUDW.js.map +0 -1
  92. package/dist/chunk-7Z2C2K7F.js +0 -578
  93. package/dist/chunk-7Z2C2K7F.js.map +0 -1
  94. package/dist/chunk-CYHJDKFB.js.map +0 -1
  95. package/dist/chunk-DMMZSZTN.js.map +0 -1
  96. package/dist/chunk-FJW36PD7.js.map +0 -1
  97. package/dist/chunk-M62XY4NC.js.map +0 -1
  98. package/dist/chunk-QC42MLAK.js.map +0 -1
  99. package/dist/chunk-SFZNIO6U.js +0 -18
  100. package/dist/chunk-SFZNIO6U.js.map +0 -1
  101. package/dist/chunk-U7KURWW3.js.map +0 -1
  102. package/dist/chunk-WVE3F724.js.map +0 -1
  103. package/dist/chunk-XAU7QFG3.js.map +0 -1
  104. package/dist/chunk-ZKNUMH2M.js.map +0 -1
  105. package/dist/chunk-ZTMKFZQ3.js.map +0 -1
  106. /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-6RGWFMJE.js.map} +0 -0
  107. /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-ACM7BVIH.js.map} +0 -0
  108. /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-MJTC2VJ5.js.map} +0 -0
  109. /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-LHJ3U2VM.js.map} +0 -0
  110. /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-GZUSRZIR.js.map} +0 -0
  111. /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-2TM6I4LJ.js.map} +0 -0
  112. /package/dist/{chunk-MPNSO7E6.js.map → chunk-SLMFEG7X.js.map} +0 -0
@@ -1,9 +1,6 @@
1
1
  import {
2
2
  createTrueFoundryServer
3
- } from "../../chunk-QC42MLAK.js";
4
- import {
5
- drainListPages
6
- } from "../../chunk-SFZNIO6U.js";
3
+ } from "../../chunk-7AAO4UDQ.js";
7
4
  import {
8
5
  readSessionIsCreateAgent
9
6
  } from "../../chunk-RDXBMTP5.js";
@@ -100,15 +97,18 @@ function toUiTerminalTurnState(state) {
100
97
  }
101
98
  }
102
99
  function toUiSessionEvent(event) {
100
+ if (event.type === "turn.update") return void 0;
103
101
  if (event.type !== "turn.done") return { ...event };
104
102
  return { ...event, state: toUiTerminalTurnState(event.state) };
105
103
  }
106
104
  function toUiStreamingEvent(event) {
105
+ if (event.type === "turn.update") return void 0;
107
106
  if (event.type !== "turn.done") return { ...event };
108
107
  return { ...event, state: toUiTerminalTurnState(event.state) };
109
108
  }
110
109
  function toUiEventItem(item) {
111
- return { turnId: item.turnId, event: toUiSessionEvent(item.event) };
110
+ const event = toUiSessionEvent(item.event);
111
+ return event === void 0 ? void 0 : { turnId: item.turnId, event };
112
112
  }
113
113
 
114
114
  // src/plugins/trueforge-agent-server-adapter/chatServer.ts
@@ -116,7 +116,10 @@ function toUiMcpServer(server) {
116
116
  return server;
117
117
  }
118
118
  function toUiSkill(skill) {
119
- return { name: skill.name };
119
+ return { name: skill.name, preload: skill.preload === true };
120
+ }
121
+ function toHarnessSkill(skill) {
122
+ return { name: skill.id ?? skill.name, preload: skill.preload === true };
120
123
  }
121
124
  function toHarnessAgentSpec(spec) {
122
125
  const { skills, mcpServers, ...rest } = spec;
@@ -132,7 +135,7 @@ function toHarnessAgentSpec(spec) {
132
135
  return server;
133
136
  })
134
137
  },
135
- ...skills === void 0 ? {} : { skills: skills.map(({ name }) => ({ name })) }
138
+ ...skills === void 0 ? {} : { skills: skills.map(toHarnessSkill) }
136
139
  };
137
140
  }
138
141
  function toUiAgentSpec(spec) {
@@ -177,7 +180,11 @@ function toUiTurn(turn) {
177
180
  };
178
181
  }
179
182
  function toListResult(page, map) {
180
- const data = page.data.map(map);
183
+ const data = [];
184
+ for (const item of page.data) {
185
+ const mapped = map(item);
186
+ if (mapped !== void 0) data.push(mapped);
187
+ }
181
188
  const token = page.response.pagination.nextPageToken;
182
189
  return {
183
190
  data,
@@ -237,7 +244,8 @@ function createHarnessChatServer(options = {}) {
237
244
  ...request.limit === void 0 ? {} : { limit: request.limit },
238
245
  ...request.order === void 0 ? {} : { order: request.order },
239
246
  ...request.pageToken === void 0 ? {} : { pageToken: request.pageToken },
240
- ...request.agentId === void 0 || request.agentId.length === 0 ? {} : { agentId: request.agentId }
247
+ ...request.agentId === void 0 || request.agentId.length === 0 ? {} : { agentId: request.agentId },
248
+ ...request.createdByMe === void 0 ? {} : { createdByMe: request.createdByMe }
241
249
  });
242
250
  return toListResult(page, toUiSession);
243
251
  },
@@ -265,10 +273,13 @@ function createHarnessChatServer(options = {}) {
265
273
  });
266
274
  let fallbackSequence = 0;
267
275
  for await (const item of stream.withMetadata()) {
268
- yield {
269
- sequenceNumber: sequenceNumber(item.id, fallbackSequence),
270
- event: toUiStreamingEvent(item.data)
271
- };
276
+ const event = toUiStreamingEvent(item.data);
277
+ if (event !== void 0) {
278
+ yield {
279
+ sequenceNumber: sequenceNumber(item.id, fallbackSequence),
280
+ event
281
+ };
282
+ }
272
283
  fallbackSequence += 1;
273
284
  }
274
285
  },
@@ -283,10 +294,13 @@ function createHarnessChatServer(options = {}) {
283
294
  });
284
295
  let fallbackSequence = 0;
285
296
  for await (const item of stream.withMetadata()) {
286
- yield {
287
- sequenceNumber: sequenceNumber(item.id, fallbackSequence),
288
- event: toUiStreamingEvent(item.data)
289
- };
297
+ const event = toUiStreamingEvent(item.data);
298
+ if (event !== void 0) {
299
+ yield {
300
+ sequenceNumber: sequenceNumber(item.id, fallbackSequence),
301
+ event
302
+ };
303
+ }
290
304
  fallbackSequence += 1;
291
305
  }
292
306
  },
@@ -326,12 +340,13 @@ function toSessionListEntry(session) {
326
340
  isMutable: session.agent.type === "inline",
327
341
  metrics: {
328
342
  totalTurns: session.metrics.totalTurns,
329
- totalCostInUsd: session.metrics.totalCostInUsd,
343
+ ...session.metrics.totalCostInUsd == null ? {} : { totalCostInUsd: session.metrics.totalCostInUsd },
330
344
  totalDurationMs: session.metrics.totalDurationMs
331
345
  },
332
346
  ...session.title === null ? {} : { title: session.title },
333
347
  ...session.agent.type === "reference" && session.agent.name !== null ? { agentName: session.agent.name } : {},
334
- ...session.agent.type === "inline" ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {}
348
+ ...session.agent.type === "inline" ? { agentSpec: toUiAgentSpec(session.agent.spec) } : {},
349
+ ...session.source?.type === "schedule" ? { sourceType: session.source.type } : {}
335
350
  };
336
351
  }
337
352
  function createHarnessAgentSessionsServer(options = {}) {
@@ -342,11 +357,16 @@ function createHarnessAgentSessionsServer(options = {}) {
342
357
  return {
343
358
  agentId: data.id,
344
359
  name: data.name,
360
+ description: data.description,
345
361
  agentSpec: toUiAgentSpec(data.manifest)
346
362
  };
347
363
  },
348
364
  async getCodeSnippets({ agentId }) {
349
- const { data } = await client.internal.agents.getCodeSnippets(agentId);
365
+ const absoluteBaseUrl = resolveTrueForgeBaseUrl(options.baseUrl ?? "/").replace(/\/$/, "");
366
+ const { data } = await client.internal.agents.getCodeSnippets(
367
+ agentId,
368
+ /^https?:\/\//i.test(absoluteBaseUrl) ? { baseUrl: absoluteBaseUrl } : void 0
369
+ );
350
370
  return data.snippets;
351
371
  },
352
372
  async listSessions(requestParams = {}) {
@@ -356,7 +376,8 @@ function createHarnessAgentSessionsServer(options = {}) {
356
376
  ...requestParams.pageToken === void 0 ? {} : { pageToken: requestParams.pageToken },
357
377
  ...requestParams.startTimestamp === void 0 ? {} : { startTimestamp: parseIsoDate(requestParams.startTimestamp) },
358
378
  ...requestParams.endTimestamp === void 0 ? {} : { endTimestamp: parseIsoDate(requestParams.endTimestamp) },
359
- ...requestParams.agentId === void 0 || requestParams.agentId.length === 0 ? {} : { agentId: requestParams.agentId }
379
+ ...requestParams.agentId === void 0 || requestParams.agentId.length === 0 ? {} : { agentId: requestParams.agentId },
380
+ ...requestParams.createdByMe === void 0 ? {} : { createdByMe: requestParams.createdByMe }
360
381
  });
361
382
  return toListResult(page, toSessionListEntry);
362
383
  },
@@ -370,6 +391,43 @@ function createHarnessAgentSessionsServer(options = {}) {
370
391
  };
371
392
  }
372
393
 
394
+ // src/plugins/trueforge-agent-server-adapter/agentsList.ts
395
+ var AGENTS_PAGE_DEFAULT = 50;
396
+ var AGENTS_PAGE_LIMIT = 100;
397
+ function clampAgentsPageSize(size) {
398
+ return Math.min(Math.max(size, 1), AGENTS_PAGE_LIMIT);
399
+ }
400
+ async function listAgentsPage({
401
+ client,
402
+ limit,
403
+ offset = 0,
404
+ agentName
405
+ }) {
406
+ const pageSize = clampAgentsPageSize(limit);
407
+ const start = Math.max(0, offset);
408
+ const page = await client.agents.list({
409
+ limit: pageSize,
410
+ ...agentName === void 0 ? {} : { agentName }
411
+ });
412
+ let at = 0;
413
+ while (at < start) {
414
+ if (!page.hasNextPage()) return [];
415
+ await page.getNextPage();
416
+ at += pageSize;
417
+ }
418
+ return [...page.data];
419
+ }
420
+ async function drainAgentsList(client) {
421
+ const items = [];
422
+ const page = await client.agents.list({ limit: AGENTS_PAGE_DEFAULT });
423
+ for (; ; ) {
424
+ items.push(...page.data);
425
+ if (!page.hasNextPage()) break;
426
+ await page.getNextPage();
427
+ }
428
+ return items;
429
+ }
430
+
373
431
  // src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts
374
432
  var DEFAULT_API_KEY_HEADER = "Authorization";
375
433
  function toUiAuthPublic(auth) {
@@ -410,10 +468,21 @@ function toUiCatalogEntry(server) {
410
468
  auth: toUiAuthPublic(server.auth)
411
469
  };
412
470
  }
471
+ function toUiToolAnnotations(value) {
472
+ if (typeof value !== "object" || value === null) return void 0;
473
+ const readOnlyHint = Reflect.get(value, "readOnlyHint");
474
+ const destructiveHint = Reflect.get(value, "destructiveHint");
475
+ const annotations = {
476
+ ...typeof readOnlyHint === "boolean" ? { readOnlyHint } : {},
477
+ ...typeof destructiveHint === "boolean" ? { destructiveHint } : {}
478
+ };
479
+ return Object.keys(annotations).length > 0 ? annotations : void 0;
480
+ }
413
481
  function toUiTool(tool) {
414
482
  const name = typeof tool.name === "string" && tool.name !== "" ? tool.name : "tool";
415
483
  const description = typeof tool.description === "string" ? tool.description : "";
416
- return { id: name, name, description };
484
+ const annotations = toUiToolAnnotations(Reflect.get(tool, "annotations"));
485
+ return annotations === void 0 ? { id: name, name, description } : { id: name, name, description, annotations };
417
486
  }
418
487
  function toUiConnector(server) {
419
488
  const auth = toUiAuthPublic(server.manifest.auth);
@@ -554,17 +623,9 @@ async function listModels(client) {
554
623
  const body = await client.models.list();
555
624
  return body.data;
556
625
  }
557
- async function listConfiguredMcpServersPage(client, req = {}) {
558
- const page = await client.mcpServers.list({
559
- ...req.limit === void 0 ? {} : { limit: req.limit },
560
- ...req.pageToken === void 0 ? {} : { pageToken: req.pageToken }
561
- });
562
- return toListResult(page, (server) => server);
563
- }
564
626
  async function listConfiguredMcpServers(client) {
565
- return drainListPages({
566
- fetchPage: (pageToken) => listConfiguredMcpServersPage(client, { pageToken })
567
- });
627
+ const body = await client.mcpServers.list();
628
+ return body.data;
568
629
  }
569
630
  async function listSkills(client) {
570
631
  const body = await client.skills.list();
@@ -609,7 +670,9 @@ function toLibraryEntry(agent) {
609
670
  return {
610
671
  name: agent.name,
611
672
  agentId: agent.id,
612
- agentSpec: toUiAgentSpec(agent.manifest)
673
+ description: agent.description,
674
+ agentSpec: toUiAgentSpec(agent.manifest),
675
+ createdBySubject: agent.createdBySubject
613
676
  };
614
677
  }
615
678
  function createHarnessBuilderServer(options = {}) {
@@ -631,17 +694,31 @@ function createHarnessBuilderServer(options = {}) {
631
694
  });
632
695
  },
633
696
  // Skills require a configured sandbox provider; keep the picker empty when skill capability is off.
697
+ // Catalog AvailableSkill.name is store identity (FQN in TFY). Picker `id` copies that
698
+ // attach key; `name` is displayName so the draft can show a label without losing the wire key.
699
+ // Draft mounts `{ id, name }`; toHarnessSkill admits AgentSpec.skills[].name = id ?? name.
634
700
  getSkills: async () => {
635
701
  const skills = await listSkills(client);
636
- return skills.map((skill) => ({ id: skill.name, name: skill.name, description: skill.description }));
702
+ return skills.map((skill) => {
703
+ const { display_name, repository_name, version: versionRaw } = skill.metadata ?? {};
704
+ const version = Number(versionRaw);
705
+ const hasVersion = Number.isInteger(version) && version > 0;
706
+ return {
707
+ id: skill.name,
708
+ name: display_name ?? skill.name,
709
+ description: skill.description,
710
+ ...repository_name === void 0 ? {} : { skillRepoName: repository_name },
711
+ ...hasVersion ? {
712
+ version,
713
+ loadVersions: async () => (await client.skills.listVersions({ name: skill.name })).data
714
+ } : {}
715
+ };
716
+ });
637
717
  },
638
718
  getMcp: async () => (await listConfiguredMcpServers(client)).map(toUiConnectorFromReadEntry),
639
- listMcp: async (req) => {
640
- const page = await listConfiguredMcpServersPage(client, req ?? {});
641
- return {
642
- data: page.data.map(toUiConnectorFromReadEntry),
643
- ...page.nextPageToken === void 0 ? {} : { nextPageToken: page.nextPageToken }
644
- };
719
+ getMcpConnector: async ({ connectorId }) => {
720
+ const body = await client.mcpServers.get(connectorId);
721
+ return toUiConnectorFromReadEntry(body.data);
645
722
  },
646
723
  getMcpTools: async ({ connectorId }) => {
647
724
  const body = await client.mcpServers.listTools(connectorId);
@@ -650,30 +727,42 @@ function createHarnessBuilderServer(options = {}) {
650
727
  );
651
728
  },
652
729
  async searchAgents(req) {
653
- const { data } = await client.agents.list();
654
- const query = req?.query?.trim().toLowerCase();
655
- const filtered = query === void 0 || query === "" ? data : data.filter((agent) => agent.name.toLowerCase().includes(query));
730
+ const limit = clampAgentsPageSize(req?.limit ?? AGENTS_PAGE_DEFAULT);
656
731
  const offset = req?.offset ?? 0;
657
- const limit = req?.limit ?? 50;
658
- return filtered.slice(offset, offset + limit).map(toLibraryEntry);
732
+ const query = req?.query?.trim();
733
+ const rows = await listAgentsPage({
734
+ client,
735
+ limit,
736
+ offset,
737
+ ...query === void 0 || query === "" ? {} : { agentName: query }
738
+ });
739
+ return rows.map(toLibraryEntry);
659
740
  },
660
- async saveAgent({ agentName, agentSpec, intent }) {
741
+ async saveAgent({ agentName, description: descriptionRaw, agentSpec, intent }) {
661
742
  const manifest = toHarnessAgentSpec(agentSpec);
743
+ const description = descriptionRaw?.trim();
662
744
  if (intent === "update") {
663
- const { data } = await client.agents.list();
664
- const existing = data.find((agent) => agent.name === agentName);
745
+ const agents = await drainAgentsList(client);
746
+ const existing = agents.find((agent) => agent.name === agentName);
665
747
  if (!existing) {
666
748
  return {};
667
749
  }
668
- await client.agents.update(existing.id, { manifest });
750
+ await client.agents.update(existing.id, {
751
+ ...description ? { description } : {},
752
+ manifest
753
+ });
669
754
  return { agentId: existing.id };
670
755
  }
671
- const created = await client.agents.create({ name: agentName, manifest });
756
+ const created = await client.agents.create({
757
+ name: agentName,
758
+ description: description || agentName,
759
+ manifest
760
+ });
672
761
  return { agentId: created.data.id };
673
762
  },
674
763
  async deleteAgent({ agentName }) {
675
- const { data } = await client.agents.list();
676
- const existing = data.find((agent) => agent.name === agentName);
764
+ const agents = await drainAgentsList(client);
765
+ const existing = agents.find((agent) => agent.name === agentName);
677
766
  if (!existing) return;
678
767
  await client.agents.delete(existing.id);
679
768
  }
@@ -957,10 +1046,12 @@ function toHarnessManifest3(req) {
957
1046
  };
958
1047
  }
959
1048
  function toUiSkill2(skill, catalogNames) {
1049
+ const manifest = skill.manifest;
1050
+ const displayName = "displayName" in manifest && typeof manifest.displayName === "string" ? manifest.displayName : manifest.name;
960
1051
  const base = {
961
1052
  id: skill.name,
962
- name: skill.name,
963
- description: skill.manifest.description
1053
+ name: displayName,
1054
+ description: manifest.description
964
1055
  };
965
1056
  if (catalogNames.has(skill.name)) {
966
1057
  return { ...base, catalogId: skill.name };
@@ -1005,13 +1096,21 @@ function createSkillCatalog(client) {
1005
1096
  };
1006
1097
  }
1007
1098
 
1099
+ // src/plugins/trueforge-agent-server-adapter/permissionsServer.ts
1100
+ function createHarnessPermissionsServer(options = {}) {
1101
+ const client = options.client ?? createTrueForgeClient(options);
1102
+ return {
1103
+ listPermissions: async (request) => client.internal.listPermissions(request)
1104
+ };
1105
+ }
1106
+
1008
1107
  // src/plugins/trueforge-agent-server-adapter/schedules/scheduleServer.ts
1009
1108
  var SCHEDULES_PAGE_LIMIT = 25;
1010
1109
  async function loadAgentIndex(client) {
1011
- const { data } = await client.agents.list();
1110
+ const agents = await drainAgentsList(client);
1012
1111
  const idToName = /* @__PURE__ */ new Map();
1013
1112
  const nameToId = /* @__PURE__ */ new Map();
1014
- for (const agent of data) {
1113
+ for (const agent of agents) {
1015
1114
  idToName.set(agent.id, agent.name);
1016
1115
  nameToId.set(agent.name, agent.id);
1017
1116
  }
@@ -1047,7 +1146,8 @@ function toUiSchedule(wire, index) {
1047
1146
  cron: wire.manifest.cron,
1048
1147
  timezone: wire.manifest.timezone ?? "UTC",
1049
1148
  status: wireStatus(wire.manifest),
1050
- lastRunAt: null
1149
+ lastRunAt: null,
1150
+ createdBySubject: wire.createdBySubject
1051
1151
  };
1052
1152
  }
1053
1153
  function toWireManifest(input) {
@@ -1127,7 +1227,7 @@ function createScheduleServer(options) {
1127
1227
 
1128
1228
  // src/plugins/trueforge-agent-server-adapter/index.ts
1129
1229
  function createTrueForgeAgentUIServer(options = {}) {
1130
- const { catalog: catalogOverride, ...clientOptions } = options;
1230
+ const { catalog: catalogOverride, permissions, ...clientOptions } = options;
1131
1231
  const client = createTrueForgeClient(clientOptions);
1132
1232
  const catalog = catalogOverride ?? {
1133
1233
  modelCatalog: createModelProviderCatalog(client),
@@ -1141,7 +1241,8 @@ function createTrueForgeAgentUIServer(options = {}) {
1141
1241
  catalog,
1142
1242
  sessions: createHarnessAgentSessionsServer({ ...clientOptions, client }),
1143
1243
  metrics: createHarnessAgentMetricsServer({ ...clientOptions, client }),
1144
- schedules: createScheduleServer({ client })
1244
+ schedules: createScheduleServer({ client }),
1245
+ permissions: permissions ?? createHarnessPermissionsServer({ client })
1145
1246
  });
1146
1247
  }
1147
1248
  export {
@@ -1151,6 +1252,7 @@ export {
1151
1252
  createHarnessAgentSessionsServer,
1152
1253
  createHarnessBuilderServer,
1153
1254
  createHarnessChatServer,
1255
+ createHarnessPermissionsServer,
1154
1256
  createModelProviderCatalog,
1155
1257
  createSandboxProviderCatalog,
1156
1258
  createScheduleServer,
@@ -1160,7 +1262,6 @@ export {
1160
1262
  filterUiSandboxProviders,
1161
1263
  getCapabilities,
1162
1264
  listConfiguredMcpServers,
1163
- listConfiguredMcpServersPage,
1164
1265
  listModels,
1165
1266
  listSkills,
1166
1267
  modelProviderLogosByName,