- {Array.from({ length: cols }).map((_, c) => (
+ {rowKeys.map((rowKey) => (
+
+ {colKeys.map((colKey, c) => (
a.localeCompare(b));
let totalOutstanding = 0;
const periods: SubscriptionPeriod[] = sorted.map((periodStart) => {
const override = overrideByStart.get(periodStart);
diff --git a/src/hooks/use-mobile.ts b/src/hooks/use-mobile.ts
index 2b0fe1d..eeb2b6e 100644
--- a/src/hooks/use-mobile.ts
+++ b/src/hooks/use-mobile.ts
@@ -6,12 +6,12 @@ export function useIsMobile() {
const [isMobile, setIsMobile] = React.useState(undefined)
React.useEffect(() => {
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
+ const mql = globalThis.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
const onChange = () => {
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
+ setIsMobile(globalThis.innerWidth < MOBILE_BREAKPOINT)
}
mql.addEventListener("change", onChange)
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
+ setIsMobile(globalThis.innerWidth < MOBILE_BREAKPOINT)
return () => mql.removeEventListener("change", onChange)
}, [])
diff --git a/src/lib/mcp/handler.ts b/src/lib/mcp/handler.ts
index d10819a..e8335d2 100644
--- a/src/lib/mcp/handler.ts
+++ b/src/lib/mcp/handler.ts
@@ -81,6 +81,48 @@ function categoryTag(a: ToolAnnotations): string {
return "[write]";
}
+async function handleToolCall(
+ id: JsonRpcId,
+ params: Record | undefined,
+ ctx: ToolContext,
+): Promise