(uri: string)
| 915 | }; |
| 916 | |
| 917 | const readResource = async (uri: string) => { |
| 918 | if (fetchingResources.has(uri) || resourceContentMap[uri]) { |
| 919 | return; |
| 920 | } |
| 921 | |
| 922 | console.log("[App] Reading resource:", uri); |
| 923 | setFetchingResources((prev) => new Set(prev).add(uri)); |
| 924 | lastToolCallOriginTabRef.current = currentTabRef.current; |
| 925 | |
| 926 | try { |
| 927 | const response = await sendMCPRequest( |
| 928 | { |
| 929 | method: "resources/read" as const, |
| 930 | params: { uri }, |
| 931 | }, |
| 932 | ReadResourceResultSchema, |
| 933 | "resources", |
| 934 | ); |
| 935 | console.log("[App] Resource read response:", { |
| 936 | uri, |
| 937 | responseLength: JSON.stringify(response).length, |
| 938 | hasContents: !!(response as { contents?: unknown[] }).contents, |
| 939 | }); |
| 940 | const content = JSON.stringify(response, null, 2); |
| 941 | setResourceContent(content); |
| 942 | setResourceContentMap((prev) => ({ |
| 943 | ...prev, |
| 944 | [uri]: content, |
| 945 | })); |
| 946 | } catch (error) { |
| 947 | console.error(`[App] Failed to read resource ${uri}:`, error); |
| 948 | const errorString = (error as Error).message ?? String(error); |
| 949 | setResourceContentMap((prev) => ({ |
| 950 | ...prev, |
| 951 | [uri]: JSON.stringify({ error: errorString }), |
| 952 | })); |
| 953 | } finally { |
| 954 | setFetchingResources((prev) => { |
| 955 | const next = new Set(prev); |
| 956 | next.delete(uri); |
| 957 | return next; |
| 958 | }); |
| 959 | } |
| 960 | }; |
| 961 | |
| 962 | const subscribeToResource = async (uri: string) => { |
| 963 | if (!resourceSubscriptions.has(uri)) { |
no test coverage detected