@truefoundry/trueforge-ui 0.3.0-rc.5 → 0.3.0-rc.7
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.
- package/CHANGELOG.md +28 -0
- package/dist/{AgentCodeSnippets-V5A56M7R.js → AgentCodeSnippets-T7PR6PDP.js} +7 -7
- package/dist/AgentMetricChart-J3RCSCAG.js +15 -0
- package/dist/{AgentOverview-NPC4P2EY.js → AgentOverview-WC7WMNMS.js} +11 -9
- package/dist/AgentOverview-WC7WMNMS.js.map +1 -0
- package/dist/{AgentSessionEventTimeline-UUXOJXTC.js → AgentSessionEventTimeline-SETKGGCI.js} +7 -7
- package/dist/{AgentSessionEventTimelineChart-FIAQCYJC.js → AgentSessionEventTimelineChart-4Y7PY5SJ.js} +7 -7
- package/dist/{AgentSessions-WHODEG2M.js → AgentSessions-YCAPM5GK.js} +8 -8
- package/dist/{ConnectorSettings-QTAI4TQX.js → ConnectorSettings-PXWRCFAL.js} +7 -7
- package/dist/{DockLayout-TATYU5SV.js → DockLayout-JRKCKAG2.js} +10 -10
- package/dist/{DrawerLayout-DXHNV33K.js → DrawerLayout-U7YPUZBR.js} +11 -11
- package/dist/{ModelSettings-UWTBHQRG.js → ModelSettings-VXYMJEMO.js} +7 -7
- package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
- package/dist/{SandboxSettings-BITQONS3.js → SandboxSettings-6DRUH72J.js} +7 -7
- package/dist/SchedulesPage-2G6F4XO6.js +15 -0
- package/dist/{SettingsBuilder-3OA4UCIM.js → SettingsBuilder-6FJVZLJT.js} +9 -9
- package/dist/{SettingsBuilder-3OA4UCIM.js.map → SettingsBuilder-6FJVZLJT.js.map} +1 -1
- package/dist/{ShellRouteSync-J74MV23Q.js → ShellRouteSync-SJXFKUAJ.js} +4 -4
- package/dist/{SidebarLayout-EQXQPYIU.js → SidebarLayout-EQ7EYCWR.js} +12 -12
- package/dist/{SkillSettings-KQ6GQ7JW.js → SkillSettings-IHVI7FDM.js} +7 -7
- package/dist/{TrueForgeUIWithRouter-R3UXQZRY.js → TrueForgeUIWithRouter-5OJFI3PF.js} +9 -9
- package/dist/{WidgetLayout-YWZTYFZL.js → WidgetLayout-PN5ZDOLM.js} +10 -10
- package/dist/{chunk-TAABBM7F.js → chunk-2GIZY3JJ.js} +3 -1
- package/dist/chunk-2GIZY3JJ.js.map +1 -0
- package/dist/{chunk-4MCIDE2C.js → chunk-2QTH6JHX.js} +3 -3
- package/dist/{chunk-ZZB3JIBQ.js → chunk-2UBSLCKB.js} +9 -9
- package/dist/{chunk-IIHJ32YH.js → chunk-3ZW74FHC.js} +3 -3
- package/dist/{chunk-CFGLAGWH.js → chunk-CG75X77Q.js} +2 -2
- package/dist/{chunk-TFFTZB26.js → chunk-E33DFTVN.js} +8 -8
- package/dist/chunk-E33DFTVN.js.map +1 -0
- package/dist/{chunk-ERIIJKJY.js → chunk-F7YRYFAF.js} +4 -4
- package/dist/chunk-JCL3Q7RW.js +587 -0
- package/dist/{chunk-OWDH67NY.js.map → chunk-JCL3Q7RW.js.map} +1 -1
- package/dist/{chunk-IVDIBAVH.js → chunk-L7HNKKS2.js} +2 -2
- package/dist/{chunk-INY3J2BV.js → chunk-OWXPMQ7N.js} +10 -10
- package/dist/{chunk-7NYDADYN.js → chunk-PX6MNNN3.js} +5 -5
- package/dist/{chunk-3QWUHGNL.js → chunk-T6QQV5LK.js} +55 -12
- package/dist/chunk-T6QQV5LK.js.map +1 -0
- package/dist/{chunk-DCVKW445.js → chunk-TMIILLHB.js} +478 -268
- package/dist/chunk-TMIILLHB.js.map +1 -0
- package/dist/{chunk-MMU55KCW.js → chunk-XANC4F2H.js} +318 -166
- package/dist/chunk-XANC4F2H.js.map +1 -0
- package/dist/index.d.ts +15 -11
- package/dist/index.js +12 -12
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +2 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.js +65 -14
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/dist/AgentMetricChart-GEADURES.js +0 -15
- package/dist/AgentOverview-NPC4P2EY.js.map +0 -1
- package/dist/OpenUiFenceBlock-FHEYXZEQ.js +0 -9
- package/dist/SchedulesPage-JIUWNYUH.js +0 -15
- package/dist/chunk-3QWUHGNL.js.map +0 -1
- package/dist/chunk-DCVKW445.js.map +0 -1
- package/dist/chunk-MMU55KCW.js.map +0 -1
- package/dist/chunk-OWDH67NY.js +0 -587
- package/dist/chunk-TAABBM7F.js.map +0 -1
- package/dist/chunk-TFFTZB26.js.map +0 -1
- /package/dist/{AgentCodeSnippets-V5A56M7R.js.map → AgentCodeSnippets-T7PR6PDP.js.map} +0 -0
- /package/dist/{AgentMetricChart-GEADURES.js.map → AgentMetricChart-J3RCSCAG.js.map} +0 -0
- /package/dist/{AgentSessionEventTimeline-UUXOJXTC.js.map → AgentSessionEventTimeline-SETKGGCI.js.map} +0 -0
- /package/dist/{AgentSessionEventTimelineChart-FIAQCYJC.js.map → AgentSessionEventTimelineChart-4Y7PY5SJ.js.map} +0 -0
- /package/dist/{AgentSessions-WHODEG2M.js.map → AgentSessions-YCAPM5GK.js.map} +0 -0
- /package/dist/{ConnectorSettings-QTAI4TQX.js.map → ConnectorSettings-PXWRCFAL.js.map} +0 -0
- /package/dist/{DockLayout-TATYU5SV.js.map → DockLayout-JRKCKAG2.js.map} +0 -0
- /package/dist/{DrawerLayout-DXHNV33K.js.map → DrawerLayout-U7YPUZBR.js.map} +0 -0
- /package/dist/{ModelSettings-UWTBHQRG.js.map → ModelSettings-VXYMJEMO.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-FHEYXZEQ.js.map → OpenUiFenceBlock-KPZFLUSC.js.map} +0 -0
- /package/dist/{SandboxSettings-BITQONS3.js.map → SandboxSettings-6DRUH72J.js.map} +0 -0
- /package/dist/{SchedulesPage-JIUWNYUH.js.map → SchedulesPage-2G6F4XO6.js.map} +0 -0
- /package/dist/{ShellRouteSync-J74MV23Q.js.map → ShellRouteSync-SJXFKUAJ.js.map} +0 -0
- /package/dist/{SidebarLayout-EQXQPYIU.js.map → SidebarLayout-EQ7EYCWR.js.map} +0 -0
- /package/dist/{SkillSettings-KQ6GQ7JW.js.map → SkillSettings-IHVI7FDM.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-R3UXQZRY.js.map → TrueForgeUIWithRouter-5OJFI3PF.js.map} +0 -0
- /package/dist/{WidgetLayout-YWZTYFZL.js.map → WidgetLayout-PN5ZDOLM.js.map} +0 -0
- /package/dist/{chunk-4MCIDE2C.js.map → chunk-2QTH6JHX.js.map} +0 -0
- /package/dist/{chunk-ZZB3JIBQ.js.map → chunk-2UBSLCKB.js.map} +0 -0
- /package/dist/{chunk-IIHJ32YH.js.map → chunk-3ZW74FHC.js.map} +0 -0
- /package/dist/{chunk-CFGLAGWH.js.map → chunk-CG75X77Q.js.map} +0 -0
- /package/dist/{chunk-ERIIJKJY.js.map → chunk-F7YRYFAF.js.map} +0 -0
- /package/dist/{chunk-IVDIBAVH.js.map → chunk-L7HNKKS2.js.map} +0 -0
- /package/dist/{chunk-INY3J2BV.js.map → chunk-OWXPMQ7N.js.map} +0 -0
- /package/dist/{chunk-7NYDADYN.js.map → chunk-PX6MNNN3.js.map} +0 -0
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
formatCostUsd,
|
|
3
3
|
formatDurationMs,
|
|
4
4
|
useThemeMode
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-XANC4F2H.js";
|
|
6
6
|
|
|
7
7
|
// src/atoms/agent-details/AgentMetricChart.tsx
|
|
8
8
|
import {
|
|
@@ -118,4 +118,4 @@ function AgentMetricChart({ graph, definition, error, colorIndex = 0 }) {
|
|
|
118
118
|
export {
|
|
119
119
|
AgentMetricChart
|
|
120
120
|
};
|
|
121
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
//# sourceMappingURL=chunk-L7HNKKS2.js.map
|
|
@@ -23,11 +23,11 @@ import {
|
|
|
23
23
|
mountName,
|
|
24
24
|
useThemeMode,
|
|
25
25
|
useToaster
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-XANC4F2H.js";
|
|
27
27
|
import {
|
|
28
28
|
DraftCatalogProvider,
|
|
29
29
|
useDraftCatalog
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-3ZW74FHC.js";
|
|
31
31
|
import {
|
|
32
32
|
DEFAULT_AGENT_CONFIG,
|
|
33
33
|
ServerProvider,
|
|
@@ -40,14 +40,14 @@ import {
|
|
|
40
40
|
useServerCapabilities,
|
|
41
41
|
useShellMode,
|
|
42
42
|
withCapabilitiesSandbox
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-2GIZY3JJ.js";
|
|
44
44
|
import {
|
|
45
45
|
useAui,
|
|
46
46
|
useAuiState
|
|
47
47
|
} from "./chunk-M6MHLVSO.js";
|
|
48
48
|
import {
|
|
49
49
|
cn
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-JCL3Q7RW.js";
|
|
51
51
|
|
|
52
52
|
// src/containers/TrueFoundryChatProvider.tsx
|
|
53
53
|
import { AssistantRuntimeProvider, useAuiState as useAuiState2 } from "@assistant-ui/react";
|
|
@@ -489,11 +489,11 @@ function useResolvedServer(config, onError) {
|
|
|
489
489
|
|
|
490
490
|
// src/containers/TrueForgeUIShell.tsx
|
|
491
491
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
492
|
-
var SidebarLayout = lazy(() => import("./SidebarLayout-
|
|
493
|
-
var DrawerLayout = lazy(() => import("./DrawerLayout-
|
|
494
|
-
var DockLayout = lazy(() => import("./DockLayout-
|
|
495
|
-
var WidgetLayout = lazy(() => import("./WidgetLayout-
|
|
496
|
-
var ShellRouteSync = lazy(() => import("./ShellRouteSync-
|
|
492
|
+
var SidebarLayout = lazy(() => import("./SidebarLayout-EQ7EYCWR.js").then((m) => ({ default: m.SidebarLayout })));
|
|
493
|
+
var DrawerLayout = lazy(() => import("./DrawerLayout-U7YPUZBR.js").then((m) => ({ default: m.DrawerLayout })));
|
|
494
|
+
var DockLayout = lazy(() => import("./DockLayout-JRKCKAG2.js").then((m) => ({ default: m.DockLayout })));
|
|
495
|
+
var WidgetLayout = lazy(() => import("./WidgetLayout-PN5ZDOLM.js").then((m) => ({ default: m.WidgetLayout })));
|
|
496
|
+
var ShellRouteSync = lazy(() => import("./ShellRouteSync-SJXFKUAJ.js").then((m) => ({ default: m.ShellRouteSync })));
|
|
497
497
|
function LayoutFallback({ className }) {
|
|
498
498
|
return /* @__PURE__ */ jsx2(
|
|
499
499
|
"div",
|
|
@@ -712,4 +712,4 @@ export {
|
|
|
712
712
|
ServerInitLoader,
|
|
713
713
|
TrueForgeUIShell
|
|
714
714
|
};
|
|
715
|
-
//# sourceMappingURL=chunk-
|
|
715
|
+
//# sourceMappingURL=chunk-OWXPMQ7N.js.map
|
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
useResourcePermissions,
|
|
6
6
|
useSlot,
|
|
7
7
|
withInitialUserMessages
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-XANC4F2H.js";
|
|
9
9
|
import {
|
|
10
10
|
Icon,
|
|
11
11
|
auiButtonClass,
|
|
12
12
|
pageHeaderTitleClassName,
|
|
13
13
|
sidebarRailButtonClassName,
|
|
14
14
|
useDraftCatalog
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-3ZW74FHC.js";
|
|
16
16
|
import {
|
|
17
17
|
isSettingsChromeEnabled,
|
|
18
18
|
shellIsCreateAgent,
|
|
@@ -21,14 +21,14 @@ import {
|
|
|
21
21
|
useOptionalShellMode,
|
|
22
22
|
useServerCapabilities,
|
|
23
23
|
useShellMode
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-2GIZY3JJ.js";
|
|
25
25
|
import {
|
|
26
26
|
useAuiState
|
|
27
27
|
} from "./chunk-M6MHLVSO.js";
|
|
28
28
|
import {
|
|
29
29
|
cn,
|
|
30
30
|
useTheme
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-JCL3Q7RW.js";
|
|
32
32
|
|
|
33
33
|
// src/atoms/NamedAgentHeaderLabel.tsx
|
|
34
34
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -293,4 +293,4 @@ export {
|
|
|
293
293
|
ShellActions,
|
|
294
294
|
AgentConfigDrawerContainer
|
|
295
295
|
};
|
|
296
|
-
//# sourceMappingURL=chunk-
|
|
296
|
+
//# sourceMappingURL=chunk-PX6MNNN3.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getErrorMessage,
|
|
3
3
|
useOptionalServer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-2GIZY3JJ.js";
|
|
5
5
|
|
|
6
6
|
// src/atoms/lib/useSearchAgentsList.ts
|
|
7
7
|
import { useCallback, useEffect as useEffect2, useRef, useState as useState2 } from "react";
|
|
@@ -19,8 +19,12 @@ function useDebouncedValue(value, delayMs) {
|
|
|
19
19
|
|
|
20
20
|
// src/atoms/lib/useSearchAgentsList.ts
|
|
21
21
|
var SEARCH_AGENTS_PAGE_SIZE = 50;
|
|
22
|
+
var SEARCH_AGENTS_PAGE_MAX = 100;
|
|
22
23
|
var DEFAULT_DEBOUNCE_MS = 300;
|
|
23
24
|
var LOAD_MORE_ROOT_MARGIN = "48px";
|
|
25
|
+
function clampPageSize(size) {
|
|
26
|
+
return Math.min(Math.max(size, 1), SEARCH_AGENTS_PAGE_MAX);
|
|
27
|
+
}
|
|
24
28
|
async function searchAllAgents(server, offset = 0) {
|
|
25
29
|
const rows = await server.searchAgents({ limit: SEARCH_AGENTS_PAGE_SIZE, offset });
|
|
26
30
|
if (rows.length < SEARCH_AGENTS_PAGE_SIZE) return rows;
|
|
@@ -36,12 +40,23 @@ async function findAgentByName({
|
|
|
36
40
|
if (match != null || rows.length < SEARCH_AGENTS_PAGE_SIZE) return match;
|
|
37
41
|
return findAgentByName({ server, agentName, offset: offset + rows.length });
|
|
38
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
|
+
}
|
|
39
53
|
function useSearchAgentsList({
|
|
40
54
|
enabled,
|
|
41
55
|
query,
|
|
42
56
|
refreshKey = 0,
|
|
43
|
-
limit = SEARCH_AGENTS_PAGE_SIZE,
|
|
44
|
-
debounceMs = DEFAULT_DEBOUNCE_MS
|
|
57
|
+
limit: limitOption = SEARCH_AGENTS_PAGE_SIZE,
|
|
58
|
+
debounceMs = DEFAULT_DEBOUNCE_MS,
|
|
59
|
+
mode = "infinite"
|
|
45
60
|
}) {
|
|
46
61
|
const server = useOptionalServer();
|
|
47
62
|
const debouncedQuery = useDebouncedValue(query, enabled ? debounceMs : 0);
|
|
@@ -50,6 +65,8 @@ function useSearchAgentsList({
|
|
|
50
65
|
const [loadingMore, setLoadingMore] = useState2(false);
|
|
51
66
|
const [error, setError] = useState2(null);
|
|
52
67
|
const [hasMore, setHasMore] = useState2(false);
|
|
68
|
+
const [pageSize, setPageSizeState] = useState2(() => clampPageSize(limitOption));
|
|
69
|
+
const [offset, setOffset] = useState2(0);
|
|
53
70
|
const genRef = useRef(0);
|
|
54
71
|
const loadMoreInflightRef = useRef(false);
|
|
55
72
|
const hasMoreRef = useRef(false);
|
|
@@ -58,6 +75,7 @@ function useSearchAgentsList({
|
|
|
58
75
|
const sentinelElRef = useRef(null);
|
|
59
76
|
const [listEl, setListEl] = useState2(null);
|
|
60
77
|
const [sentinelEl, setSentinelEl] = useState2(null);
|
|
78
|
+
const limit = mode === "paged" ? pageSize : clampPageSize(limitOption);
|
|
61
79
|
hasMoreRef.current = hasMore;
|
|
62
80
|
agentsLenRef.current = agents.length;
|
|
63
81
|
const listRef = useCallback((node) => {
|
|
@@ -69,13 +87,18 @@ function useSearchAgentsList({
|
|
|
69
87
|
setSentinelEl(node);
|
|
70
88
|
}, []);
|
|
71
89
|
const searchQuery = debouncedQuery.trim() || void 0;
|
|
90
|
+
useEffect2(() => {
|
|
91
|
+
if (mode !== "paged") return;
|
|
92
|
+
setOffset(0);
|
|
93
|
+
}, [mode, searchQuery, refreshKey]);
|
|
72
94
|
useEffect2(() => {
|
|
73
95
|
if (!enabled || server == null) return;
|
|
74
96
|
const gen = ++genRef.current;
|
|
75
97
|
loadMoreInflightRef.current = false;
|
|
76
98
|
setLoading(true);
|
|
77
99
|
setError(null);
|
|
78
|
-
|
|
100
|
+
const fetchOffset = mode === "paged" ? offset : 0;
|
|
101
|
+
void server.searchAgents({ query: searchQuery, limit, offset: fetchOffset }).then((rows) => {
|
|
79
102
|
if (gen !== genRef.current) return;
|
|
80
103
|
setAgents(rows);
|
|
81
104
|
setHasMore(rows.length >= limit);
|
|
@@ -90,16 +113,17 @@ function useSearchAgentsList({
|
|
|
90
113
|
return () => {
|
|
91
114
|
genRef.current += 1;
|
|
92
115
|
};
|
|
93
|
-
}, [enabled, server, searchQuery, limit, refreshKey]);
|
|
116
|
+
}, [enabled, server, searchQuery, limit, refreshKey, mode, offset]);
|
|
94
117
|
const loadMore = useCallback(() => {
|
|
118
|
+
if (mode !== "infinite") return;
|
|
95
119
|
if (!enabled || server == null || !hasMoreRef.current || loadMoreInflightRef.current || loading) {
|
|
96
120
|
return;
|
|
97
121
|
}
|
|
98
122
|
const gen = genRef.current;
|
|
99
|
-
const
|
|
123
|
+
const nextOffset = agentsLenRef.current;
|
|
100
124
|
loadMoreInflightRef.current = true;
|
|
101
125
|
setLoadingMore(true);
|
|
102
|
-
void server.searchAgents({ query: searchQuery, limit, offset }).then((rows) => {
|
|
126
|
+
void server.searchAgents({ query: searchQuery, limit, offset: nextOffset }).then((rows) => {
|
|
103
127
|
if (gen !== genRef.current) return;
|
|
104
128
|
setAgents((prev) => [...prev, ...rows]);
|
|
105
129
|
setHasMore(rows.length >= limit);
|
|
@@ -110,9 +134,9 @@ function useSearchAgentsList({
|
|
|
110
134
|
loadMoreInflightRef.current = false;
|
|
111
135
|
if (gen === genRef.current) setLoadingMore(false);
|
|
112
136
|
});
|
|
113
|
-
}, [enabled, server, searchQuery, limit, loading]);
|
|
137
|
+
}, [enabled, server, searchQuery, limit, loading, mode]);
|
|
114
138
|
useEffect2(() => {
|
|
115
|
-
if (!enabled || !hasMore || listEl == null || sentinelEl == null) return;
|
|
139
|
+
if (mode !== "infinite" || !enabled || !hasMore || listEl == null || sentinelEl == null) return;
|
|
116
140
|
const observer = new IntersectionObserver(
|
|
117
141
|
(entries) => {
|
|
118
142
|
if (entries.some((entry) => entry.isIntersecting)) {
|
|
@@ -123,7 +147,19 @@ function useSearchAgentsList({
|
|
|
123
147
|
);
|
|
124
148
|
observer.observe(sentinelEl);
|
|
125
149
|
return () => observer.disconnect();
|
|
126
|
-
}, [enabled, hasMore, listEl, sentinelEl, loadMore, agents.length]);
|
|
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]);
|
|
127
163
|
return {
|
|
128
164
|
agents,
|
|
129
165
|
isInitialLoading: loading && agents.length === 0,
|
|
@@ -132,7 +168,13 @@ function useSearchAgentsList({
|
|
|
132
168
|
error,
|
|
133
169
|
hasMore,
|
|
134
170
|
listRef,
|
|
135
|
-
sentinelRef
|
|
171
|
+
sentinelRef,
|
|
172
|
+
pageSize,
|
|
173
|
+
setPageSize,
|
|
174
|
+
canPrev: mode === "paged" && offset > 0,
|
|
175
|
+
canNext: mode === "paged" && hasMore,
|
|
176
|
+
goPrev,
|
|
177
|
+
goNext
|
|
136
178
|
};
|
|
137
179
|
}
|
|
138
180
|
|
|
@@ -186,10 +228,11 @@ export {
|
|
|
186
228
|
SEARCH_AGENTS_PAGE_SIZE,
|
|
187
229
|
searchAllAgents,
|
|
188
230
|
findAgentByName,
|
|
231
|
+
findLibraryAgent,
|
|
189
232
|
useSearchAgentsList,
|
|
190
233
|
readScheduleShareSearch,
|
|
191
234
|
writeScheduleShareSearch,
|
|
192
235
|
clearScheduleShareSearch,
|
|
193
236
|
replaceScheduleShareSearch
|
|
194
237
|
};
|
|
195
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|