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

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 (111) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/README.md +23 -8
  3. package/dist/{AgentCodeSnippets-NZOFJE57.js → AgentCodeSnippets-RJBB4DDE.js} +38 -23
  4. package/dist/AgentCodeSnippets-RJBB4DDE.js.map +1 -0
  5. package/dist/AgentMetricChart-UPGSJ2WP.js +15 -0
  6. package/dist/{AgentOverview-EEBHJC32.js → AgentOverview-U5WIQXZN.js} +11 -9
  7. package/dist/AgentOverview-U5WIQXZN.js.map +1 -0
  8. package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-GRGIQTRE.js} +19 -10
  9. package/dist/AgentSessionEventTimeline-GRGIQTRE.js.map +1 -0
  10. package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-GNF4VOUT.js} +144 -57
  11. package/dist/AgentSessionEventTimelineChart-GNF4VOUT.js.map +1 -0
  12. package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-5OTF2BUW.js} +72 -24
  13. package/dist/AgentSessions-5OTF2BUW.js.map +1 -0
  14. package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-HDKGLDCY.js} +162 -126
  15. package/dist/ConnectorSettings-HDKGLDCY.js.map +1 -0
  16. package/dist/{DockLayout-LM4AFMFY.js → DockLayout-D2FPQCAL.js} +10 -10
  17. package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-HUV7RAWL.js} +14 -12
  18. package/dist/DrawerLayout-HUV7RAWL.js.map +1 -0
  19. package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-VNQ7HPKH.js} +22 -28
  20. package/dist/ModelSettings-VNQ7HPKH.js.map +1 -0
  21. package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
  22. package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-ZLXGMFBF.js} +17 -21
  23. package/dist/SandboxSettings-ZLXGMFBF.js.map +1 -0
  24. package/dist/SchedulesPage-QKYI2Z3A.js +15 -0
  25. package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-RVVYXOJW.js} +9 -9
  26. package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-RVVYXOJW.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-KYA76FQ7.js} +80 -58
  30. package/dist/SidebarLayout-KYA76FQ7.js.map +1 -0
  31. package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-7OHT7FPI.js} +24 -22
  32. package/dist/SkillSettings-7OHT7FPI.js.map +1 -0
  33. package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-LKG4XLW6.js} +9 -9
  34. package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-W2RGGOQ3.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-WVE3F724.js → chunk-2QTH6JHX.js} +21 -4
  38. package/dist/chunk-2QTH6JHX.js.map +1 -0
  39. package/dist/{chunk-XAU7QFG3.js → chunk-3ZW74FHC.js} +68 -256
  40. package/dist/chunk-3ZW74FHC.js.map +1 -0
  41. package/dist/{chunk-FJW36PD7.js → chunk-67ZO7Z2W.js} +28 -24
  42. package/dist/chunk-67ZO7Z2W.js.map +1 -0
  43. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  44. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  45. package/dist/{chunk-MPNSO7E6.js → chunk-CG75X77Q.js} +2 -2
  46. package/dist/chunk-DPPOEFBD.js +517 -0
  47. package/dist/chunk-DPPOEFBD.js.map +1 -0
  48. package/dist/{chunk-6O6FWUDW.js → chunk-EPAL2HD5.js} +641 -388
  49. package/dist/chunk-EPAL2HD5.js.map +1 -0
  50. package/dist/{chunk-ZTMKFZQ3.js → chunk-GG23N2GW.js} +5099 -3295
  51. package/dist/chunk-GG23N2GW.js.map +1 -0
  52. package/dist/chunk-JCL3Q7RW.js +587 -0
  53. package/dist/chunk-JCL3Q7RW.js.map +1 -0
  54. package/dist/{chunk-M62XY4NC.js → chunk-JKEBMGLH.js} +235 -108
  55. package/dist/chunk-JKEBMGLH.js.map +1 -0
  56. package/dist/{chunk-DMMZSZTN.js → chunk-KSGNKS2D.js} +60 -16
  57. package/dist/chunk-KSGNKS2D.js.map +1 -0
  58. package/dist/{chunk-CYHJDKFB.js → chunk-PCI6VMB5.js} +189 -52
  59. package/dist/chunk-PCI6VMB5.js.map +1 -0
  60. package/dist/{chunk-ZKNUMH2M.js → chunk-PQ7VWBQQ.js} +13 -11
  61. package/dist/chunk-PQ7VWBQQ.js.map +1 -0
  62. package/dist/chunk-T6QQV5LK.js +238 -0
  63. package/dist/chunk-T6QQV5LK.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 +369 -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 +138 -50
  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.map +0 -1
  76. package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
  77. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
  78. package/dist/AgentSessions-3MPDZASK.js.map +0 -1
  79. package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
  80. package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
  81. package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
  82. package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
  83. package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
  84. package/dist/SchedulesPage-KKLUDO6B.js +0 -15
  85. package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
  86. package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
  87. package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
  88. package/dist/chunk-2XPPBEYF.js +0 -74
  89. package/dist/chunk-2XPPBEYF.js.map +0 -1
  90. package/dist/chunk-6O6FWUDW.js.map +0 -1
  91. package/dist/chunk-7Z2C2K7F.js +0 -578
  92. package/dist/chunk-7Z2C2K7F.js.map +0 -1
  93. package/dist/chunk-CYHJDKFB.js.map +0 -1
  94. package/dist/chunk-DMMZSZTN.js.map +0 -1
  95. package/dist/chunk-FJW36PD7.js.map +0 -1
  96. package/dist/chunk-M62XY4NC.js.map +0 -1
  97. package/dist/chunk-QC42MLAK.js.map +0 -1
  98. package/dist/chunk-SFZNIO6U.js +0 -18
  99. package/dist/chunk-SFZNIO6U.js.map +0 -1
  100. package/dist/chunk-U7KURWW3.js.map +0 -1
  101. package/dist/chunk-WVE3F724.js.map +0 -1
  102. package/dist/chunk-XAU7QFG3.js.map +0 -1
  103. package/dist/chunk-ZKNUMH2M.js.map +0 -1
  104. package/dist/chunk-ZTMKFZQ3.js.map +0 -1
  105. /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-UPGSJ2WP.js.map} +0 -0
  106. /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-D2FPQCAL.js.map} +0 -0
  107. /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-KPZFLUSC.js.map} +0 -0
  108. /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-QKYI2Z3A.js.map} +0 -0
  109. /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-LKG4XLW6.js.map} +0 -0
  110. /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-W2RGGOQ3.js.map} +0 -0
  111. /package/dist/{chunk-MPNSO7E6.js.map → chunk-CG75X77Q.js.map} +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  formatCostUsd,
3
3
  formatDurationMs,
4
4
  useThemeMode
5
- } from "./chunk-ZTMKFZQ3.js";
5
+ } from "./chunk-GG23N2GW.js";
6
6
 
7
7
  // src/atoms/agent-details/AgentMetricChart.tsx
8
8
  import {
@@ -18,8 +18,8 @@ import { useMemo } from "react";
18
18
  import { Line } from "react-chartjs-2";
19
19
  import { jsx, jsxs } from "react/jsx-runtime";
20
20
  ChartJS.register(CategoryScale, LinearScale, LineElement, PointElement, Legend, Tooltip);
21
- var LIGHT_COLORS = ["#2563eb", "#16a34a", "#9333ea", "#ea580c", "#0891b2"];
22
- var DARK_COLORS = ["#60a5fa", "#4ade80", "#c084fc", "#fb923c", "#22d3ee"];
21
+ var LIGHT_COLORS = ["#6366F1", "#2563eb", "#0EA5E9"];
22
+ var DARK_COLORS = ["#6366F1", "#60a5fa", "#38BDF8"];
23
23
  var numberFormatter = new Intl.NumberFormat(void 0, { maximumFractionDigits: 4 });
24
24
  var timestampFormatter = new Intl.DateTimeFormat(void 0, {
25
25
  month: "short",
@@ -36,10 +36,10 @@ function formatTimestamp(timestamp) {
36
36
  const date = new Date(timestamp);
37
37
  return Number.isNaN(date.getTime()) ? timestamp : timestampFormatter.format(date);
38
38
  }
39
- function AgentMetricChart({ graph, definition, error }) {
39
+ function AgentMetricChart({ graph, definition, error, colorIndex = 0 }) {
40
40
  const mode = useThemeMode();
41
41
  const colors = mode === "dark" ? DARK_COLORS : LIGHT_COLORS;
42
- const axisColor = mode === "dark" ? "#a1a1aa" : "#71717a";
42
+ const axisColor = mode === "dark" ? "#71717a" : "#a1a1aa";
43
43
  const gridColor = mode === "dark" ? "#27272a" : "#e4e4e7";
44
44
  const labels = useMemo(
45
45
  () => graph == null ? [] : [...new Set(graph.graphLines.flatMap((line) => line.values.map((point) => point.timestamp)))].sort(),
@@ -50,21 +50,23 @@ function AgentMetricChart({ graph, definition, error }) {
50
50
  labels: labels.map(formatTimestamp),
51
51
  datasets: graph?.graphLines.map((line, index) => {
52
52
  const valuesByTimestamp = new Map(line.values.map((point) => [point.timestamp, point.value]));
53
- const color = colors[index % colors.length];
53
+ const color = colors[(colorIndex + index) % colors.length];
54
54
  return {
55
55
  label: line.name,
56
56
  data: labels.map((timestamp) => valuesByTimestamp.get(timestamp) ?? null),
57
57
  borderColor: color,
58
58
  backgroundColor: color,
59
- pointRadius: 2,
60
- pointHoverRadius: 4,
59
+ pointRadius: 0,
60
+ pointHoverRadius: 0,
61
61
  borderWidth: 2,
62
- tension: 0.25,
62
+ borderCapStyle: "butt",
63
+ borderJoinStyle: "miter",
64
+ tension: 0,
63
65
  spanGaps: true
64
66
  };
65
67
  }) ?? []
66
68
  }),
67
- [colors, graph, labels]
69
+ [colorIndex, colors, graph, labels]
68
70
  );
69
71
  const options = useMemo(
70
72
  () => ({
@@ -116,4 +118,4 @@ function AgentMetricChart({ graph, definition, error }) {
116
118
  export {
117
119
  AgentMetricChart
118
120
  };
119
- //# sourceMappingURL=chunk-ZKNUMH2M.js.map
121
+ //# sourceMappingURL=chunk-PQ7VWBQQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/atoms/agent-details/AgentMetricChart.tsx"],"sourcesContent":["'use client';\n\nimport {\n CategoryScale,\n Chart as ChartJS,\n Legend,\n LinearScale,\n LineElement,\n PointElement,\n Tooltip,\n type ChartData,\n type ChartOptions,\n} from 'chart.js';\nimport { useMemo, type ComponentType } from 'react';\nimport { Line } from 'react-chartjs-2';\n\nimport { useThemeMode } from '../../theme/SlotsProvider.js';\nimport { formatCostUsd, formatDurationMs } from '../../utils/sessionDisplayFormat.js';\nimport type { AgentMetricChartProps } from './types.js';\n\nChartJS.register(CategoryScale, LinearScale, LineElement, PointElement, Legend, Tooltip);\n\nconst LIGHT_COLORS = ['#6366F1', '#2563eb', '#0EA5E9'];\nconst DARK_COLORS = ['#6366F1', '#60a5fa', '#38BDF8'];\nconst numberFormatter = new Intl.NumberFormat(undefined, { maximumFractionDigits: 4 });\nconst timestampFormatter = new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n});\n\nfunction formatValue(value: number, unit: string): string {\n if (unit === '$') return formatCostUsd(value);\n if (unit === 'ms') return formatDurationMs(value);\n return `${numberFormatter.format(value)}${unit === 'count' || unit.length === 0 ? '' : ` ${unit}`}`;\n}\n\nfunction formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp);\n return Number.isNaN(date.getTime()) ? timestamp : timestampFormatter.format(date);\n}\n\nexport function AgentMetricChart({ graph, definition, error, colorIndex = 0 }: AgentMetricChartProps) {\n const mode = useThemeMode();\n const colors = mode === 'dark' ? DARK_COLORS : LIGHT_COLORS;\n const axisColor = mode === 'dark' ? '#71717a' : '#a1a1aa';\n const gridColor = mode === 'dark' ? '#27272a' : '#e4e4e7';\n const labels = useMemo(\n () =>\n graph == null\n ? []\n : [...new Set(graph.graphLines.flatMap(line => line.values.map(point => point.timestamp)))].sort(),\n [graph],\n );\n const data = useMemo<ChartData<'line', Array<number | null>, string>>(\n () => ({\n labels: labels.map(formatTimestamp),\n datasets:\n graph?.graphLines.map((line, index) => {\n const valuesByTimestamp = new Map(line.values.map(point => [point.timestamp, point.value]));\n const color = colors[(colorIndex + index) % colors.length];\n return {\n label: line.name,\n data: labels.map(timestamp => valuesByTimestamp.get(timestamp) ?? null),\n borderColor: color,\n backgroundColor: color,\n pointRadius: 0,\n pointHoverRadius: 0,\n borderWidth: 2,\n borderCapStyle: 'butt',\n borderJoinStyle: 'miter',\n tension: 0,\n spanGaps: true,\n };\n }) ?? [],\n }),\n [colorIndex, colors, graph, labels],\n );\n const options = useMemo<ChartOptions<'line'>>(\n () => ({\n responsive: true,\n maintainAspectRatio: false,\n animation: false,\n interaction: { intersect: false, mode: 'index' },\n plugins: {\n legend: {\n display: (graph?.graphLines.length ?? 0) > 1,\n labels: { color: axisColor, boxWidth: 10, boxHeight: 2 },\n },\n tooltip: {\n callbacks: {\n label: context => {\n const value = context.parsed.y;\n return `${context.dataset.label ?? ''}: ${value == null ? '—' : formatValue(value, graph?.unit ?? '')}`;\n },\n },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n border: { color: gridColor },\n ticks: { color: axisColor, maxRotation: 0, autoSkip: true, maxTicksLimit: 8 },\n },\n y: {\n beginAtZero: true,\n grid: { color: gridColor },\n border: { display: false },\n ticks: {\n color: axisColor,\n callback: value => formatValue(Number(value), graph?.unit ?? ''),\n },\n },\n },\n }),\n [axisColor, graph, gridColor],\n );\n const hasData = graph?.graphLines.some(line => line.values.length > 0) === true;\n\n return (\n <section className=\"min-w-0 rounded-lg border border-border bg-card-bg p-4\" data-slot=\"agent-metric-chart\">\n <h3 className=\"text-sm font-semibold text-text-primary\">{graph?.displayName ?? definition.displayName}</h3>\n <p className=\"mt-1 text-xs text-text-secondary\">{graph?.description ?? definition.description}</p>\n <div className=\"mt-4 h-64\">\n {error != null ? (\n <div className=\"flex h-full items-center justify-center text-sm text-failure-bg\">{error}</div>\n ) : hasData ? (\n <Line data={data} options={options} />\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-text-secondary\">No data</div>\n )}\n </div>\n </section>\n );\n}\n\ndeclare module '../../theme/SlotsProvider.js' {\n interface AtomSlots {\n AgentMetricChart: ComponentType<AgentMetricChartProps>;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,238 @@
1
+ import {
2
+ getErrorMessage,
3
+ useOptionalServer
4
+ } from "./chunk-2GIZY3JJ.js";
5
+
6
+ // src/atoms/lib/useSearchAgentsList.ts
7
+ import { useCallback, useEffect as useEffect2, useRef, useState as useState2 } from "react";
8
+
9
+ // src/atoms/lib/useDebouncedValue.ts
10
+ import { useEffect, useState } from "react";
11
+ function useDebouncedValue(value, delayMs) {
12
+ const [debounced, setDebounced] = useState(value);
13
+ useEffect(() => {
14
+ const id = window.setTimeout(() => setDebounced(value), delayMs);
15
+ return () => window.clearTimeout(id);
16
+ }, [value, delayMs]);
17
+ return debounced;
18
+ }
19
+
20
+ // src/atoms/lib/useSearchAgentsList.ts
21
+ var SEARCH_AGENTS_PAGE_SIZE = 50;
22
+ var SEARCH_AGENTS_PAGE_MAX = 100;
23
+ var DEFAULT_DEBOUNCE_MS = 300;
24
+ var LOAD_MORE_ROOT_MARGIN = "48px";
25
+ function clampPageSize(size) {
26
+ return Math.min(Math.max(size, 1), SEARCH_AGENTS_PAGE_MAX);
27
+ }
28
+ async function searchAllAgents(server, offset = 0) {
29
+ const rows = await server.searchAgents({ limit: SEARCH_AGENTS_PAGE_SIZE, offset });
30
+ if (rows.length < SEARCH_AGENTS_PAGE_SIZE) return rows;
31
+ return [...rows, ...await searchAllAgents(server, offset + rows.length)];
32
+ }
33
+ async function findAgentByName({
34
+ server,
35
+ agentName,
36
+ offset = 0
37
+ }) {
38
+ const rows = await server.searchAgents({ query: agentName, limit: SEARCH_AGENTS_PAGE_SIZE, offset });
39
+ const match = rows.find((agent) => agent.name === agentName);
40
+ if (match != null || rows.length < SEARCH_AGENTS_PAGE_SIZE) return match;
41
+ return findAgentByName({ server, agentName, offset: offset + rows.length });
42
+ }
43
+ async function findLibraryAgent({
44
+ server,
45
+ agentKey,
46
+ offset = 0
47
+ }) {
48
+ const rows = await server.searchAgents({ limit: SEARCH_AGENTS_PAGE_SIZE, offset });
49
+ const match = rows.find((agent) => agent.name === agentKey || agent.agentId === agentKey);
50
+ if (match != null || rows.length < SEARCH_AGENTS_PAGE_SIZE) return match;
51
+ return findLibraryAgent({ server, agentKey, offset: offset + rows.length });
52
+ }
53
+ function useSearchAgentsList({
54
+ enabled,
55
+ query,
56
+ refreshKey = 0,
57
+ limit: limitOption = SEARCH_AGENTS_PAGE_SIZE,
58
+ debounceMs = DEFAULT_DEBOUNCE_MS,
59
+ mode = "infinite"
60
+ }) {
61
+ const server = useOptionalServer();
62
+ const debouncedQuery = useDebouncedValue(query, enabled ? debounceMs : 0);
63
+ const [agents, setAgents] = useState2([]);
64
+ const [loading, setLoading] = useState2(false);
65
+ const [loadingMore, setLoadingMore] = useState2(false);
66
+ const [error, setError] = useState2(null);
67
+ const [hasMore, setHasMore] = useState2(false);
68
+ const [pageSize, setPageSizeState] = useState2(() => clampPageSize(limitOption));
69
+ const [offset, setOffset] = useState2(0);
70
+ const genRef = useRef(0);
71
+ const loadMoreInflightRef = useRef(false);
72
+ const hasMoreRef = useRef(false);
73
+ const agentsLenRef = useRef(0);
74
+ const listElRef = useRef(null);
75
+ const sentinelElRef = useRef(null);
76
+ const [listEl, setListEl] = useState2(null);
77
+ const [sentinelEl, setSentinelEl] = useState2(null);
78
+ const limit = mode === "paged" ? pageSize : clampPageSize(limitOption);
79
+ hasMoreRef.current = hasMore;
80
+ agentsLenRef.current = agents.length;
81
+ const listRef = useCallback((node) => {
82
+ listElRef.current = node;
83
+ setListEl(node);
84
+ }, []);
85
+ const sentinelRef = useCallback((node) => {
86
+ sentinelElRef.current = node;
87
+ setSentinelEl(node);
88
+ }, []);
89
+ const searchQuery = debouncedQuery.trim() || void 0;
90
+ useEffect2(() => {
91
+ if (mode !== "paged") return;
92
+ setOffset(0);
93
+ }, [mode, searchQuery, refreshKey]);
94
+ useEffect2(() => {
95
+ if (!enabled || server == null) return;
96
+ const gen = ++genRef.current;
97
+ loadMoreInflightRef.current = false;
98
+ setLoading(true);
99
+ setError(null);
100
+ const fetchOffset = mode === "paged" ? offset : 0;
101
+ void server.searchAgents({ query: searchQuery, limit, offset: fetchOffset }).then((rows) => {
102
+ if (gen !== genRef.current) return;
103
+ setAgents(rows);
104
+ setHasMore(rows.length >= limit);
105
+ }).catch((err) => {
106
+ if (gen !== genRef.current) return;
107
+ setAgents([]);
108
+ setHasMore(false);
109
+ setError(getErrorMessage(err, "Failed to load agents."));
110
+ }).finally(() => {
111
+ if (gen === genRef.current) setLoading(false);
112
+ });
113
+ return () => {
114
+ genRef.current += 1;
115
+ };
116
+ }, [enabled, server, searchQuery, limit, refreshKey, mode, offset]);
117
+ const loadMore = useCallback(() => {
118
+ if (mode !== "infinite") return;
119
+ if (!enabled || server == null || !hasMoreRef.current || loadMoreInflightRef.current || loading) {
120
+ return;
121
+ }
122
+ const gen = genRef.current;
123
+ const nextOffset = agentsLenRef.current;
124
+ loadMoreInflightRef.current = true;
125
+ setLoadingMore(true);
126
+ void server.searchAgents({ query: searchQuery, limit, offset: nextOffset }).then((rows) => {
127
+ if (gen !== genRef.current) return;
128
+ setAgents((prev) => [...prev, ...rows]);
129
+ setHasMore(rows.length >= limit);
130
+ }).catch(() => {
131
+ if (gen !== genRef.current) return;
132
+ setHasMore(false);
133
+ }).finally(() => {
134
+ loadMoreInflightRef.current = false;
135
+ if (gen === genRef.current) setLoadingMore(false);
136
+ });
137
+ }, [enabled, server, searchQuery, limit, loading, mode]);
138
+ useEffect2(() => {
139
+ if (mode !== "infinite" || !enabled || !hasMore || listEl == null || sentinelEl == null) return;
140
+ const observer = new IntersectionObserver(
141
+ (entries) => {
142
+ if (entries.some((entry) => entry.isIntersecting)) {
143
+ loadMore();
144
+ }
145
+ },
146
+ { root: listEl, rootMargin: LOAD_MORE_ROOT_MARGIN }
147
+ );
148
+ observer.observe(sentinelEl);
149
+ return () => observer.disconnect();
150
+ }, [mode, enabled, hasMore, listEl, sentinelEl, loadMore, agents.length]);
151
+ const setPageSize = useCallback((size) => {
152
+ setPageSizeState(clampPageSize(size));
153
+ setOffset(0);
154
+ }, []);
155
+ const goNext = useCallback(() => {
156
+ if (mode !== "paged" || !hasMoreRef.current || loading) return;
157
+ setOffset((current) => current + pageSize);
158
+ }, [mode, loading, pageSize]);
159
+ const goPrev = useCallback(() => {
160
+ if (mode !== "paged" || loading) return;
161
+ setOffset((current) => Math.max(0, current - pageSize));
162
+ }, [mode, loading, pageSize]);
163
+ return {
164
+ agents,
165
+ isInitialLoading: loading && agents.length === 0,
166
+ isSearching: loading && agents.length > 0,
167
+ loadingMore,
168
+ error,
169
+ hasMore,
170
+ listRef,
171
+ sentinelRef,
172
+ pageSize,
173
+ setPageSize,
174
+ canPrev: mode === "paged" && offset > 0,
175
+ canNext: mode === "paged" && hasMore,
176
+ goPrev,
177
+ goNext
178
+ };
179
+ }
180
+
181
+ // src/utils/scheduleShareUrl.ts
182
+ var SCHEDULE_AGENT_QUERY = "agent";
183
+ var SCHEDULE_STATUS_QUERY = "status";
184
+ var SCHEDULE_NAME_QUERY = "q";
185
+ var SCHEDULE_IS_NEW_QUERY = "isNew";
186
+ var SCHEDULE_SHARE_CHANGE_EVENT = "trueforge-schedule-share";
187
+ function nonEmpty(value) {
188
+ return value != null && value.length > 0 ? value : null;
189
+ }
190
+ function parseStatus(value) {
191
+ if (value === "active" || value === "paused") return value;
192
+ return null;
193
+ }
194
+ function readScheduleShareSearch(search) {
195
+ const params = new URLSearchParams(search.startsWith("?") ? search.slice(1) : search);
196
+ return {
197
+ agent: nonEmpty(params.get(SCHEDULE_AGENT_QUERY)),
198
+ status: parseStatus(params.get(SCHEDULE_STATUS_QUERY)),
199
+ q: nonEmpty(params.get(SCHEDULE_NAME_QUERY)),
200
+ isNew: params.get(SCHEDULE_IS_NEW_QUERY) === "true"
201
+ };
202
+ }
203
+ function writeScheduleShareSearch(params, next) {
204
+ if (next.agent === null) params.delete(SCHEDULE_AGENT_QUERY);
205
+ else if (next.agent != null) params.set(SCHEDULE_AGENT_QUERY, next.agent);
206
+ if (next.status === null) params.delete(SCHEDULE_STATUS_QUERY);
207
+ else if (next.status != null) params.set(SCHEDULE_STATUS_QUERY, next.status);
208
+ if (next.q === null) params.delete(SCHEDULE_NAME_QUERY);
209
+ else if (next.q != null) params.set(SCHEDULE_NAME_QUERY, next.q);
210
+ if (next.isNew === null || next.isNew === false) params.delete(SCHEDULE_IS_NEW_QUERY);
211
+ else if (next.isNew === true) params.set(SCHEDULE_IS_NEW_QUERY, "true");
212
+ }
213
+ function clearScheduleShareSearch(params) {
214
+ params.delete(SCHEDULE_AGENT_QUERY);
215
+ params.delete(SCHEDULE_STATUS_QUERY);
216
+ params.delete(SCHEDULE_NAME_QUERY);
217
+ params.delete(SCHEDULE_IS_NEW_QUERY);
218
+ }
219
+ function replaceScheduleShareSearch(next) {
220
+ const url = new URL(window.location.href);
221
+ writeScheduleShareSearch(url.searchParams, next);
222
+ window.history.replaceState(window.history.state, "", url);
223
+ window.dispatchEvent(new Event(SCHEDULE_SHARE_CHANGE_EVENT));
224
+ return url.search;
225
+ }
226
+
227
+ export {
228
+ SEARCH_AGENTS_PAGE_SIZE,
229
+ searchAllAgents,
230
+ findAgentByName,
231
+ findLibraryAgent,
232
+ useSearchAgentsList,
233
+ readScheduleShareSearch,
234
+ writeScheduleShareSearch,
235
+ clearScheduleShareSearch,
236
+ replaceScheduleShareSearch
237
+ };
238
+ //# sourceMappingURL=chunk-T6QQV5LK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/atoms/lib/useSearchAgentsList.ts","../src/atoms/lib/useDebouncedValue.ts","../src/utils/scheduleShareUrl.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useOptionalServer } from '../../server/ServerContext.js';\nimport type { AgentBuilderServer, AgentLibraryEntry } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\nimport { useDebouncedValue } from './useDebouncedValue.js';\n\n/** Matches API AGENTS_PAGE_DEFAULT / AGENTS_PAGE_LIMIT. */\nexport const SEARCH_AGENTS_PAGE_SIZE = 50;\nexport const SEARCH_AGENTS_PAGE_MAX = 100;\nconst DEFAULT_DEBOUNCE_MS = 300;\nconst LOAD_MORE_ROOT_MARGIN = '48px';\n\nfunction clampPageSize(size: number): number {\n return Math.min(Math.max(size, 1), SEARCH_AGENTS_PAGE_MAX);\n}\n\n/** Drain every `searchAgents` page (offset pagination). */\nexport async function searchAllAgents(\n server: Pick<AgentBuilderServer, 'searchAgents'>,\n offset = 0,\n): Promise<AgentLibraryEntry[]> {\n const rows = await server.searchAgents({ limit: SEARCH_AGENTS_PAGE_SIZE, offset });\n if (rows.length < SEARCH_AGENTS_PAGE_SIZE) return rows;\n return [...rows, ...(await searchAllAgents(server, offset + rows.length))];\n}\n\n/** Exact-name lookup walks server-filtered pages until a precise match is found. */\nexport async function findAgentByName({\n server,\n agentName,\n offset = 0,\n}: {\n server: Pick<AgentBuilderServer, 'searchAgents'>;\n agentName: string;\n offset?: number;\n}): Promise<AgentLibraryEntry | undefined> {\n const rows = await server.searchAgents({ query: agentName, limit: SEARCH_AGENTS_PAGE_SIZE, offset });\n const match = rows.find(agent => agent.name === agentName);\n if (match != null || rows.length < SEARCH_AGENTS_PAGE_SIZE) return match;\n return findAgentByName({ server, agentName, offset: offset + rows.length });\n}\n\n/** Resolve by agent id or exact name by walking unfiltered pages (ids are not name-searchable). */\nexport async function findLibraryAgent({\n server,\n agentKey,\n offset = 0,\n}: {\n server: Pick<AgentBuilderServer, 'searchAgents'>;\n agentKey: string;\n offset?: number;\n}): Promise<AgentLibraryEntry | undefined> {\n const rows = await server.searchAgents({ limit: SEARCH_AGENTS_PAGE_SIZE, offset });\n const match = rows.find(agent => agent.name === agentKey || agent.agentId === agentKey);\n if (match != null || rows.length < SEARCH_AGENTS_PAGE_SIZE) return match;\n return findLibraryAgent({ server, agentKey, offset: offset + rows.length });\n}\n\nexport type UseSearchAgentsListOptions = {\n /** When false, no fetches run. */\n enabled: boolean;\n query: string;\n /** Bump to force a replace fetch (e.g. agentsListEpoch). */\n refreshKey?: number;\n /** Page size for infinite mode, or initial size for paged mode. Capped at 100. */\n limit?: number;\n debounceMs?: number;\n /**\n * `infinite` — append via IntersectionObserver sentinel (default).\n * `paged` — replace rows; navigate with goPrev / goNext.\n */\n mode?: 'infinite' | 'paged';\n};\n\nexport type UseSearchAgentsListResult = {\n agents: AgentLibraryEntry[];\n /** True while the replace fetch is in flight and the list is still empty. */\n isInitialLoading: boolean;\n /** True while replacing results that are already on screen (softer than a skeleton wipe). */\n isSearching: boolean;\n loadingMore: boolean;\n error: string | null;\n hasMore: boolean;\n listRef: (node: HTMLElement | null) => void;\n sentinelRef: (node: HTMLElement | null) => void;\n pageSize: number;\n setPageSize: (pageSize: number) => void;\n canPrev: boolean;\n canNext: boolean;\n goPrev: () => void;\n goNext: () => void;\n};\n\n/**\n * Debounced `searchAgents` with offset pagination.\n * Infinite mode: attach `listRef` / `sentinelRef` for IntersectionObserver load-more.\n * Paged mode: use `goPrev` / `goNext` / `setPageSize` (rows replaced each fetch).\n */\nexport function useSearchAgentsList({\n enabled,\n query,\n refreshKey = 0,\n limit: limitOption = SEARCH_AGENTS_PAGE_SIZE,\n debounceMs = DEFAULT_DEBOUNCE_MS,\n mode = 'infinite',\n}: UseSearchAgentsListOptions): UseSearchAgentsListResult {\n const server = useOptionalServer();\n // While closed, sync immediately so reopen never fetches a stale query.\n const debouncedQuery = useDebouncedValue(query, enabled ? debounceMs : 0);\n\n const [agents, setAgents] = useState<AgentLibraryEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [pageSize, setPageSizeState] = useState(() => clampPageSize(limitOption));\n const [offset, setOffset] = useState(0);\n\n const genRef = useRef(0);\n const loadMoreInflightRef = useRef(false);\n const hasMoreRef = useRef(false);\n const agentsLenRef = useRef(0);\n const listElRef = useRef<HTMLElement | null>(null);\n const sentinelElRef = useRef<HTMLElement | null>(null);\n const [listEl, setListEl] = useState<HTMLElement | null>(null);\n const [sentinelEl, setSentinelEl] = useState<HTMLElement | null>(null);\n\n const limit = mode === 'paged' ? pageSize : clampPageSize(limitOption);\n\n hasMoreRef.current = hasMore;\n agentsLenRef.current = agents.length;\n\n const listRef = useCallback((node: HTMLElement | null) => {\n listElRef.current = node;\n setListEl(node);\n }, []);\n\n const sentinelRef = useCallback((node: HTMLElement | null) => {\n sentinelElRef.current = node;\n setSentinelEl(node);\n }, []);\n\n const searchQuery = debouncedQuery.trim() || undefined;\n\n // Reset to first page when the query or catalog epoch changes.\n useEffect(() => {\n if (mode !== 'paged') return;\n setOffset(0);\n }, [mode, searchQuery, refreshKey]);\n\n useEffect(() => {\n if (!enabled || server == null) return;\n\n const gen = ++genRef.current;\n loadMoreInflightRef.current = false;\n setLoading(true);\n setError(null);\n\n const fetchOffset = mode === 'paged' ? offset : 0;\n\n void server\n .searchAgents({ query: searchQuery, limit, offset: fetchOffset })\n .then(rows => {\n if (gen !== genRef.current) return;\n setAgents(rows);\n setHasMore(rows.length >= limit);\n })\n .catch((err: unknown) => {\n if (gen !== genRef.current) return;\n setAgents([]);\n setHasMore(false);\n setError(getErrorMessage(err, 'Failed to load agents.'));\n })\n .finally(() => {\n if (gen === genRef.current) setLoading(false);\n });\n\n return () => {\n genRef.current += 1;\n };\n }, [enabled, server, searchQuery, limit, refreshKey, mode, offset]);\n\n const loadMore = useCallback(() => {\n if (mode !== 'infinite') return;\n if (!enabled || server == null || !hasMoreRef.current || loadMoreInflightRef.current || loading) {\n return;\n }\n\n const gen = genRef.current;\n const nextOffset = agentsLenRef.current;\n loadMoreInflightRef.current = true;\n setLoadingMore(true);\n\n void server\n .searchAgents({ query: searchQuery, limit, offset: nextOffset })\n .then(rows => {\n if (gen !== genRef.current) return;\n setAgents(prev => [...prev, ...rows]);\n setHasMore(rows.length >= limit);\n })\n .catch(() => {\n if (gen !== genRef.current) return;\n setHasMore(false);\n })\n .finally(() => {\n loadMoreInflightRef.current = false;\n if (gen === genRef.current) setLoadingMore(false);\n });\n }, [enabled, server, searchQuery, limit, loading, mode]);\n\n useEffect(() => {\n if (mode !== 'infinite' || !enabled || !hasMore || listEl == null || sentinelEl == null) return;\n\n const observer = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMore();\n }\n },\n { root: listEl, rootMargin: LOAD_MORE_ROOT_MARGIN },\n );\n observer.observe(sentinelEl);\n return () => observer.disconnect();\n }, [mode, enabled, hasMore, listEl, sentinelEl, loadMore, agents.length]);\n\n const setPageSize = useCallback((size: number) => {\n setPageSizeState(clampPageSize(size));\n setOffset(0);\n }, []);\n\n const goNext = useCallback(() => {\n if (mode !== 'paged' || !hasMoreRef.current || loading) return;\n setOffset(current => current + pageSize);\n }, [mode, loading, pageSize]);\n\n const goPrev = useCallback(() => {\n if (mode !== 'paged' || loading) return;\n setOffset(current => Math.max(0, current - pageSize));\n }, [mode, loading, pageSize]);\n\n return {\n agents,\n isInitialLoading: loading && agents.length === 0,\n isSearching: loading && agents.length > 0,\n loadingMore,\n error,\n hasMore,\n listRef,\n sentinelRef,\n pageSize,\n setPageSize,\n canPrev: mode === 'paged' && offset > 0,\n canNext: mode === 'paged' && hasMore,\n goPrev,\n goNext,\n };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\n/** Returns `value` immediately on first render; subsequent changes apply after `delayMs`. */\nexport function useDebouncedValue<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const id = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(id);\n }, [value, delayMs]);\n\n return debounced;\n}\n","import type { ScheduleStatus } from '../server/types.js';\nimport { writeSessionShareSearch } from './sessionShareUrl.js';\n\nexport const SCHEDULE_AGENT_QUERY = 'agent';\nexport const SCHEDULE_STATUS_QUERY = 'status';\nexport const SCHEDULE_NAME_QUERY = 'q';\nexport const SCHEDULE_IS_NEW_QUERY = 'isNew';\n\nexport const SCHEDULE_SHARE_CHANGE_EVENT = 'trueforge-schedule-share';\n\nexport type ScheduleShareSearch = {\n /** Agent id filter; `null` means all agents. */\n agent: string | null;\n /** Status filter; `null` means all statuses. */\n status: ScheduleStatus | null;\n /** Name search; `null` when empty. */\n q: string | null;\n /** One-shot flag to open the create schedule drawer. */\n isNew: boolean;\n};\n\nexport type ScheduleShareWrite = {\n agent?: string | null;\n status?: ScheduleStatus | null;\n q?: string | null;\n isNew?: boolean | null;\n};\n\nfunction nonEmpty(value: string | null): string | null {\n return value != null && value.length > 0 ? value : null;\n}\n\nfunction parseStatus(value: string | null): ScheduleStatus | null {\n if (value === 'active' || value === 'paused') return value;\n return null;\n}\n\nexport function readScheduleShareSearch(search: string): ScheduleShareSearch {\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n return {\n agent: nonEmpty(params.get(SCHEDULE_AGENT_QUERY)),\n status: parseStatus(params.get(SCHEDULE_STATUS_QUERY)),\n q: nonEmpty(params.get(SCHEDULE_NAME_QUERY)),\n isNew: params.get(SCHEDULE_IS_NEW_QUERY) === 'true',\n };\n}\n\nexport function writeScheduleShareSearch(params: URLSearchParams, next: ScheduleShareWrite): void {\n if (next.agent === null) params.delete(SCHEDULE_AGENT_QUERY);\n else if (next.agent != null) params.set(SCHEDULE_AGENT_QUERY, next.agent);\n if (next.status === null) params.delete(SCHEDULE_STATUS_QUERY);\n else if (next.status != null) params.set(SCHEDULE_STATUS_QUERY, next.status);\n if (next.q === null) params.delete(SCHEDULE_NAME_QUERY);\n else if (next.q != null) params.set(SCHEDULE_NAME_QUERY, next.q);\n if (next.isNew === null || next.isNew === false) params.delete(SCHEDULE_IS_NEW_QUERY);\n else if (next.isNew === true) params.set(SCHEDULE_IS_NEW_QUERY, 'true');\n}\n\n/** Drop all schedules-owned query keys (used when leaving the schedules place). */\nexport function clearScheduleShareSearch(params: URLSearchParams): void {\n params.delete(SCHEDULE_AGENT_QUERY);\n params.delete(SCHEDULE_STATUS_QUERY);\n params.delete(SCHEDULE_NAME_QUERY);\n params.delete(SCHEDULE_IS_NEW_QUERY);\n}\n\nexport function replaceScheduleShareSearch(next: ScheduleShareWrite): string {\n const url = new URL(window.location.href);\n writeScheduleShareSearch(url.searchParams, next);\n window.history.replaceState(window.history.state, '', url);\n window.dispatchEvent(new Event(SCHEDULE_SHARE_CHANGE_EVENT));\n return url.search;\n}\n\n/**\n * Point the address bar at schedules filtered to `agentId` (clears library agent\n * share keys). Caller still opens the schedules place via shell.\n */\nexport function writeOpenSchedulesForAgentSearch({ agentId, isNew }: { agentId: string; isNew?: boolean }): void {\n const url = new URL(window.location.href);\n writeSessionShareSearch(url.searchParams, {\n sessionId: null,\n agentId: null,\n tab: null,\n view: null,\n timeRange: null,\n });\n writeScheduleShareSearch(url.searchParams, {\n agent: agentId,\n status: null,\n q: null,\n isNew: isNew === true ? true : null,\n });\n window.history.replaceState(window.history.state, '', url);\n}\n"],"mappings":"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","names":["useEffect","useState","useState","useEffect"]}
@@ -1,13 +1,13 @@
1
- import { AgentSpec, ModelSelection, AgentSkill, ConnectorState, AgentLibraryEntry, SaveAgentResult, CatalogServer, AgentBuilderCapabilitiesResponse, AgentSessionsServer, AgentMetricsServer, ScheduleServer, AgentChatServer, PageParams, ListResult, AgentBuilderServer, SearchAgentsParams, SaveAgentRequest } from '@truefoundry/assistant-ui-runtime/server';
1
+ import { AgentSpec, ModelSelection, AgentSkill, ConnectorState, AgentLibraryEntry, SaveAgentResult, CatalogServer, AgentBuilderCapabilitiesResponse, AgentSessionsServer, AgentMetricsServer, ScheduleServer, PermissionsServer, AgentChatServer, AgentBuilderServer, SearchAgentsParams, SaveAgentRequest } from '@truefoundry/assistant-ui-runtime/server';
2
2
 
3
- type CreateTrueFoundryServerOptions<TSpec extends AgentSpec = AgentSpec, TModel extends ModelSelection = ModelSelection, TSkill extends AgentSkill = AgentSkill, TMcp extends ConnectorState = ConnectorState, TAgent extends AgentLibraryEntry = AgentLibraryEntry, TSave extends SaveAgentResult = SaveAgentResult, TCatalog extends CatalogServer = CatalogServer, TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse, TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>, TMetrics extends AgentMetricsServer = AgentMetricsServer, TSchedules extends ScheduleServer = ScheduleServer> = {
3
+ type CreateTrueFoundryServerOptions<TSpec extends AgentSpec = AgentSpec, TModel extends ModelSelection = ModelSelection, TSkill extends AgentSkill = AgentSkill, TMcp extends ConnectorState = ConnectorState, TAgent extends AgentLibraryEntry = AgentLibraryEntry, TSave extends SaveAgentResult = SaveAgentResult, TCatalog extends CatalogServer = CatalogServer, TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse, TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>, TMetrics extends AgentMetricsServer = AgentMetricsServer, TSchedules extends ScheduleServer = ScheduleServer, TPermissions extends PermissionsServer = PermissionsServer> = {
4
4
  /** Chat port — e.g. from `@truefoundry/agent-server-adapter`. */
5
5
  chatServer: AgentChatServer<TSpec>;
6
6
  getCapabilities: () => Promise<TCapabilities>;
7
7
  getModels: () => Promise<TModel[]>;
8
8
  getSkills: () => Promise<TSkill[]>;
9
9
  getMcp: () => Promise<TMcp[]>;
10
- listMcp?: (req?: PageParams) => Promise<ListResult<TMcp>>;
10
+ getMcpConnector?: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities>['getMcpConnector'];
11
11
  getMcpTools?: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities>['getMcpTools'];
12
12
  searchAgents: (req?: SearchAgentsParams) => Promise<TAgent[]>;
13
13
  saveAgent: (req: SaveAgentRequest<TSpec>) => Promise<TSave>;
@@ -22,18 +22,21 @@ type CreateTrueFoundryServerOptions<TSpec extends AgentSpec = AgentSpec, TModel
22
22
  metrics?: TMetrics;
23
23
  /** Schedules listing + CRUD. Optional. */
24
24
  schedules?: TSchedules;
25
+ /** Per-resource grants. Omit to leave actions enabled. */
26
+ permissions?: TPermissions;
25
27
  };
26
- type TrueFoundryServer<TSpec extends AgentSpec = AgentSpec, TModel extends ModelSelection = ModelSelection, TSkill extends AgentSkill = AgentSkill, TMcp extends ConnectorState = ConnectorState, TAgent extends AgentLibraryEntry = AgentLibraryEntry, TSave extends SaveAgentResult = SaveAgentResult, TCatalog extends CatalogServer = CatalogServer, TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse, TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>, TMetrics extends AgentMetricsServer = AgentMetricsServer, TSchedules extends ScheduleServer = ScheduleServer> = AgentChatServer<TSpec> & AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> & {
28
+ type TrueFoundryServer<TSpec extends AgentSpec = AgentSpec, TModel extends ModelSelection = ModelSelection, TSkill extends AgentSkill = AgentSkill, TMcp extends ConnectorState = ConnectorState, TAgent extends AgentLibraryEntry = AgentLibraryEntry, TSave extends SaveAgentResult = SaveAgentResult, TCatalog extends CatalogServer = CatalogServer, TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse, TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>, TMetrics extends AgentMetricsServer = AgentMetricsServer, TSchedules extends ScheduleServer = ScheduleServer, TPermissions extends PermissionsServer = PermissionsServer> = AgentChatServer<TSpec> & AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> & {
27
29
  catalog?: TCatalog;
28
30
  sessions?: TSessions;
29
31
  metrics?: TMetrics;
30
32
  schedules?: TSchedules;
33
+ permissions?: TPermissions;
31
34
  };
32
35
  /**
33
36
  * Composes an `AgentChatServer` with host-provided builder catalog callbacks
34
37
  * and an optional settings `catalog`.
35
38
  * Gateway wiring lives in the host (or `@truefoundry/agent-server-adapter`).
36
39
  */
37
- declare function createTrueFoundryServer<TSpec extends AgentSpec = AgentSpec, TModel extends ModelSelection = ModelSelection, TSkill extends AgentSkill = AgentSkill, TMcp extends ConnectorState = ConnectorState, TAgent extends AgentLibraryEntry = AgentLibraryEntry, TSave extends SaveAgentResult = SaveAgentResult, TCatalog extends CatalogServer = CatalogServer, TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse, TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>, TMetrics extends AgentMetricsServer = AgentMetricsServer, TSchedules extends ScheduleServer = ScheduleServer>(opts: CreateTrueFoundryServerOptions<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCatalog, TCapabilities, TSessions, TMetrics, TSchedules>): TrueFoundryServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCatalog, TCapabilities, TSessions, TMetrics, TSchedules>;
40
+ declare function createTrueFoundryServer<TSpec extends AgentSpec = AgentSpec, TModel extends ModelSelection = ModelSelection, TSkill extends AgentSkill = AgentSkill, TMcp extends ConnectorState = ConnectorState, TAgent extends AgentLibraryEntry = AgentLibraryEntry, TSave extends SaveAgentResult = SaveAgentResult, TCatalog extends CatalogServer = CatalogServer, TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse, TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>, TMetrics extends AgentMetricsServer = AgentMetricsServer, TSchedules extends ScheduleServer = ScheduleServer, TPermissions extends PermissionsServer = PermissionsServer>(opts: CreateTrueFoundryServerOptions<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCatalog, TCapabilities, TSessions, TMetrics, TSchedules, TPermissions>): TrueFoundryServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCatalog, TCapabilities, TSessions, TMetrics, TSchedules, TPermissions>;
38
41
 
39
42
  export { type CreateTrueFoundryServerOptions as C, type TrueFoundryServer as T, createTrueFoundryServer as c };