fix: load complete authoring capability catalog

This commit is contained in:
lda
2026-08-09 21:20:00 +07:00 Verified
parent 906b676993
commit fb7ee4704b
3 changed files with 34 additions and 2 deletions
@@ -28,7 +28,7 @@ export const DraftDetailRoute = ({
? { kind: "capability", qualifiedName: capabilityName }
: { kind: "canvas" };
const drafts = useDraftWorkspace(workspaceId);
const capabilities = useCapabilityDiscovery();
const capabilities = useCapabilityDiscovery({ loadAllPages: true });
const draft =
drafts.selected?.workspaceId === workspaceId ? drafts.selected : null;
@@ -217,6 +217,25 @@ describe("useCapabilityDiscovery", () => {
]);
});
it("loads every capability page for authoring palettes", async () => {
client.list
.mockResolvedValueOnce(page([summary("serena.default.search")], "page-2"))
.mockResolvedValueOnce(page([summary("wf.std.constant", "wf.std")]));
const { result } = renderHook(() =>
useCapabilityDiscovery({ loadAllPages: true }),
);
await waitFor(() =>
expect(result.current.items.map((item) => item.name)).toEqual([
"serena.default.search",
"wf.std.constant",
]),
);
expect(client.list).toHaveBeenLastCalledWith({ cursor: "page-2", limit: 50 });
expect(result.current.nextCursor).toBeNull();
});
it("uses the applied filters when loading more after draft edits", async () => {
client.list
.mockResolvedValueOnce(page([summary("local.documents.read")], "page-2"))
@@ -27,6 +27,10 @@ export type CapabilityDiscoveryController = {
readonly inspect: (qualifiedName: string) => void;
};
export type CapabilityDiscoveryOptions = {
readonly loadAllPages?: boolean;
};
type DiscoveryState = Omit<CapabilityDiscoveryController, "setQuery" | "setSourceId" | "search" | "loadMore" | "inspect">;
type CapabilityFilters = {
@@ -92,7 +96,9 @@ const isSameConnection = (
return left.readExecutor === right.readExecutor && left.connectedTarget === right.connectedTarget;
};
export const useCapabilityDiscovery = (): CapabilityDiscoveryController => {
export const useCapabilityDiscovery = (
{ loadAllPages = false }: CapabilityDiscoveryOptions = {},
): CapabilityDiscoveryController => {
const { connectedTarget, readExecutor } = useConsoleWorkspace();
const client = useMemo<CapabilityClient | null>(
() => (readExecutor ? createCapabilityClient(readExecutor) : null),
@@ -218,6 +224,13 @@ export const useCapabilityDiscovery = (): CapabilityDiscoveryController => {
state.phase,
]);
useEffect(() => {
if (!loadAllPages || state.phase !== "ready" || state.nextCursor === null) return;
// Authoring palettes need the complete catalog because they do not expose
// discovery pagination; continue one page at a time through the same guarded loader.
loadMore();
}, [loadAllPages, loadMore, state.nextCursor, state.phase]);
const inspect = useCallback(
(qualifiedName: string) => {
if (!client) return;