feat(mcp): attach resources from TUI

This commit is contained in:
Aiden Cline 2026-07-07 13:58:52 -05:00
commit 7df9a16ffd
12 changed files with 722 additions and 44 deletions

View file

@ -108,6 +108,74 @@ test("refreshes resources into reactive getters", async () => {
}
})
test("refreshes MCP resource catalogs after change events", async () => {
const events = createEventStream()
let resources = [{ server: "docs", name: "Readme", uri: "docs://readme" }]
let requests = 0
let release: (() => void) | undefined
const calls = createFetch((url) => {
if (url.pathname !== "/api/mcp/resource") return
requests++
const data = { resources, templates: [] }
if (requests === 3)
return new Promise<Response>((resolve) => {
release = () =>
resolve(json({ location: { directory, project: { id: "proj_test", directory } }, data }))
})
return json({
location: { directory, project: { id: "proj_test", directory } },
data,
})
}, events)
let data!: ReturnType<typeof useData>
function Probe() {
data = useData()
return <text>{data.location.mcp.resource.catalog()?.resources[0]?.name ?? "missing"}</text>
}
const app = await testRender(() => (
<TestTuiContexts>
<SDKProvider client={createClient(calls.fetch)} api={createApi(calls.fetch)}>
<ProjectProvider>
<DataProvider>
<Probe />
</DataProvider>
</ProjectProvider>
</SDKProvider>
</TestTuiContexts>
))
try {
await wait(() => requests === 1)
expect(data.location.mcp.resource.catalog()?.resources[0]?.uri).toBe("docs://readme")
resources = [{ server: "docs", name: "Guide", uri: "docs://guide" }]
emitEvent(events, {
id: "evt_mcp_resources",
created: 1,
type: "mcp.resources.changed",
data: { server: "docs" },
})
await wait(() => requests === 2 && data.location.mcp.resource.catalog()?.resources[0]?.name === "Guide")
const refresh = data.location.mcp.resource.refresh()
await wait(() => requests === 3)
resources = [{ server: "docs", name: "Reference", uri: "docs://reference" }]
emitEvent(events, {
id: "evt_mcp_resources_during_refresh",
created: 2,
type: "mcp.resources.changed",
data: { server: "docs" },
})
release?.()
await refresh
await wait(() => requests === 4 && data.location.mcp.resource.catalog()?.resources[0]?.name === "Reference")
} finally {
app.renderer.destroy()
}
})
test("restores running manual compaction before applying live deltas", async () => {
const events = createEventStream()
const calls = createFetch((url) => {