Skip to content
Draft
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
3c01b22
feat: Implement always-on sync with ClerkTokenStrategy in use-vibes
jchris Dec 2, 2025
7c58934
fix: Remove dashboardURI to disable popup fallback
jchris Dec 2, 2025
2342bb7
revert: Restore dashboardURI for popup fallback auth
jchris Dec 2, 2025
9243941
fix: Upgrade @adviser/cement and fix ClerkTokenStrategy interface
jchris Dec 2, 2025
a2a6ad7
feat: enable sync only for vibe-viewer context + simplify ClerkTokenS…
jchris Dec 2, 2025
c03322c
feat: implement cloud token exchange in ClerkTokenStrategy
jchris Dec 2, 2025
86adc98
chore: update pnpm-lock.yaml after adding dashboard dependency
jchris Dec 2, 2025
5277e3a
Update import map to use-vibes@0.18.10-dev.0
jchris Dec 2, 2025
4357186
Map tokenStrategy to strategy in toCloud function
jchris Dec 2, 2025
bff9146
Pin React versions in import map to fix context mismatch
jchris Dec 2, 2025
37b009c
feat: cache Clerk cloud tokens with expiry
CharlieHelps Dec 2, 2025
7b21e61
feat: add redirects for canary versions of React to stable version
jchris Dec 2, 2025
1dc327c
refactor: remove redundant in-memory token caching
jchris Dec 2, 2025
e59ef8e
fix: gate sync and body class by vibe-viewer context
CharlieHelps Dec 2, 2025
d3655c3
feat: add expiry-aware token caching and tighten toCloud
CharlieHelps Dec 2, 2025
30c7367
refactor: clarify toCloud option handling
CharlieHelps Dec 2, 2025
588dbf1
refactor: provide getToken via VibeContext for authentication
jchris Dec 2, 2025
2d5fe67
test: ensure sync stays disabled without vibe context
CharlieHelps Dec 2, 2025
328d4cb
Pass getToken through mounting chain to enable sync in vibe-viewer
jchris Dec 2, 2025
3d3b6c4
Update use-vibes version to 0.18.10-dev.1
jchris Dec 2, 2025
9d58dbb
Remove use-vibes self-mapping from import map to fix CPU loop
jchris Dec 2, 2025
7bfa7c4
Add comprehensive logging to diagnose /groups CPU lockup
jchris Dec 2, 2025
9c0807c
Fix infinite re-render loop in useAllGroups hook
jchris Dec 2, 2025
42435e6
Fix useFireproof creating new options object on every render
jchris Dec 2, 2025
9e8b90e
Memoize useFireproof return value to prevent infinite re-renders
jchris Dec 2, 2025
d70010c
Destructure useFireproof result to get stable property references
jchris Dec 2, 2025
bd45266
Add logging to trace attach state changes
jchris Dec 2, 2025
9a5c536
Memoize attachConfig to prevent infinite re-renders
jchris Dec 2, 2025
ec3edcb
Add logging to trace useMemo execution in useFireproof
jchris Dec 2, 2025
447738b
Memoize groups array to prevent new empty array on every render
jchris Dec 2, 2025
7225b29
Add logging and refactor useAllGroups memoization dependencies
jchris Dec 2, 2025
e96c029
Fix infinite loop by memoizing on array contents not reference
jchris Dec 2, 2025
0fcebb5
Add useCallback and logging to diagnose infinite render
jchris Dec 2, 2025
3405557
Wrap GroupsContent in React.memo to prevent unnecessary re-renders
jchris Dec 2, 2025
7cfde02
Add debugging to track groupsResult changes in useAllGroups
jchris Dec 2, 2025
7abcb3a
Fix infinite loop by stabilizing useLiveQuery result object
jchris Dec 2, 2025
253d391
Fix infinite re-render loop in useAllGroups by avoiding useLiveQuery
jchris Dec 2, 2025
5034c08
Fix infinite re-render loops in useVibeInstances and useSession
jchris Dec 2, 2025
8134a38
Remove debug console.log statements
jchris Dec 2, 2025
3c2f710
Update fireproof packages to 0.24.1-dev-memo
jchris Dec 2, 2025
a26c137
Rename import-map.ts to importmap.ts
jchris Dec 2, 2025
ec74d39
Fix: Import useFireproof from use-fireproof instead of use-vibes
jchris Dec 2, 2025
a5f54e7
Refactor: Standardize console.log formatting in useFireproof function
jchris Dec 2, 2025
488a2c6
Fix use-fireproof import handling for vibes
jchris Dec 2, 2025
608b4ed
Refactor: Update import transformation for use-fireproof to use-vibes…
jchris Dec 2, 2025
5fdfc50
Add importmap entries for use-fireproof and redirect version 0.24.0 t…
jchris Dec 3, 2025
7d4c411
Update use-vibes to 0.18.12-dev with importmap fix
jchris Dec 3, 2025
660ea02
Fix: Transform use-fireproof to use-vibes in vibe-viewer
jchris Dec 3, 2025
159c828
Fix: Adjust formatting for use-fireproof entry in importmap
jchris Dec 3, 2025
26c8ebe
Configure dashboard API URL from environment for Clerk token exchange
jchris Dec 3, 2025
ebb8a20
Revert use-fireproof and @fireproof packages from 0.24.1-dev-memo to …
jchris Dec 3, 2025
db45ee9
Refactor ClerkTokenStrategy to use Lazy wrapper for token caching
jchris Dec 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions call-ai/pkg/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
],
"license": "Apache-2.0",
"devDependencies": {
"@fireproof/core-cli": "0.24.0",
"@fireproof/core-cli": "0.24.1-dev-memo",
"@types/node": "^24.9.1",
"@vitest/browser-playwright": "^4.0.14",
"typescript": "^5.9.3"
Expand All @@ -41,6 +41,6 @@
},
"dependencies": {
"@adviser/cement": "^0.4.66",
"@fireproof/core-runtime": "0.24.0"
"@fireproof/core-runtime": "0.24.1-dev-memo"
}
}
2 changes: 1 addition & 1 deletion call-ai/tests/integration/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
],
"license": "Apache-2.0",
"devDependencies": {
"@fireproof/core-cli": "0.24.0",
"@fireproof/core-cli": "0.24.1-dev-memo",
"@playwright/test": "^1.57.0",
"@types/node": "^24.9.1",
"@vitest/browser-playwright": "^4.0.14",
Expand Down
178 changes: 178 additions & 0 deletions claude-browse-vibes/groups-infinite-render-debug.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
// Debug test for infinite re-render issue on /groups page
import { test, expect, chromium } from "@playwright/test";

test("Debug infinite re-renders on groups page", async () => {
console.log("🔍 Starting groups page infinite re-render debug test...");

// Connect to existing Chrome instance with debugging port
const browser = await chromium.connectOverCDP("http://localhost:9222");
const contexts = browser.contexts();
const context = contexts[0]; // Use the first context
const pages = context.pages();

// Find the groups page or create a new one
let page = pages.find((p) => p.url().includes("localhost:8890/groups"));
if (!page) {
page = await context.newPage();
console.log("📄 Created new page");
} else {
console.log("📄 Found existing groups page");
}

// Array to collect console messages
const consoleMessages = [];
let useAllGroupsCount = 0;
let useFireproofCount = 0;
let groupsContentCount = 0;
let useMemoCount = 0;

// Listen for console messages
page.on("console", (message) => {
const text = message.text();
const timestamp = Date.now();

// Count specific hook calls
if (text.includes("[useAllGroups] Hook called")) {
useAllGroupsCount++;
}
if (text.includes("[useFireproof] Hook called")) {
useFireproofCount++;
}
if (text.includes("[GroupsContent] Component rendering")) {
groupsContentCount++;
}
if (text.includes("useMemo] Creating")) {
useMemoCount++;
}

// Store all messages for analysis
consoleMessages.push({
type: message.type(),
text: text,
timestamp: timestamp,
});

// Print important messages in real-time
if (
text.includes("[useAllGroups]") ||
text.includes("[useFireproof]") ||
text.includes("[GroupsContent]") ||
text.includes("useMemo")
) {
console.log(`[${message.type()}] ${text}`);
}

// Stop test if we hit too many renders (infinite loop detected)
if (useAllGroupsCount > 50) {
console.log("🚨 INFINITE LOOP DETECTED - Stopping test");
console.log(`📊 Total useAllGroups calls: ${useAllGroupsCount}`);
console.log(`📊 Total useFireproof calls: ${useFireproofCount}`);
console.log(`📊 Total GroupsContent renders: ${groupsContentCount}`);
console.log(`📊 Total useMemo recreations: ${useMemoCount}`);
}
});

// Listen for page errors
page.on("pageerror", (error) => {
console.log("❌ Page error:", error.message);
});

console.log("🌐 Navigating to /groups page...");

// Navigate to the groups page
// Using existing authenticated session
await page.goto("http://localhost:8890/groups");

// Wait a moment for the page to load
await page.waitForTimeout(1000);

console.log("⏱️ Waiting 5 seconds to observe render behavior...");

// Wait for 5 seconds to observe the render behavior
await page.waitForTimeout(5000);

console.log("\n📊 FINAL ANALYSIS:");
console.log(`Total console messages captured: ${consoleMessages.length}`);
console.log(`useAllGroups calls: ${useAllGroupsCount}`);
console.log(`useFireproof calls: ${useFireproofCount}`);
console.log(`GroupsContent renders: ${groupsContentCount}`);
console.log(`useMemo recreations: ${useMemoCount}`);

// Analyze message patterns
const messageTypes = {};
const renderPatterns = [];

consoleMessages.forEach((msg) => {
// Count message types
messageTypes[msg.type] = (messageTypes[msg.type] || 0) + 1;

// Collect render-related patterns
if (
msg.text.includes("[useAllGroups]") ||
msg.text.includes("[useFireproof]") ||
msg.text.includes("useMemo")
) {
renderPatterns.push({
message: msg.text.substring(0, 150),
timestamp: msg.timestamp,
});
}
});

console.log("\n📈 Message type breakdown:");
Object.entries(messageTypes).forEach(([type, count]) => {
console.log(` ${type}: ${count} messages`);
});

console.log("\n🔄 Render pattern analysis (showing first 30):");
renderPatterns.slice(0, 30).forEach((pattern, index) => {
console.log(` ${index + 1}. ${pattern.message}`);
});

// Check for infinite loop indicators
if (useAllGroupsCount > 30) {
console.log("\n🚨 INFINITE RE-RENDER DETECTED!");
console.log("useAllGroups is being called repeatedly.");

// Look for useMemo logs to see if memoization is working
const useMemoLogs = consoleMessages.filter((m) =>
m.text.includes("useMemo] Creating"),
);
console.log(`\n🔍 useMemo recreation count: ${useMemoLogs.length}`);
if (useMemoLogs.length > 5) {
console.log(
"⚠️ useMemo is recreating objects - memoization is failing!",
);
console.log("First 10 useMemo logs:");
useMemoLogs.slice(0, 10).forEach((log, i) => {
console.log(` ${i + 1}. ${log.text}`);
});
} else {
console.log("✅ useMemo seems to be working (low recreation count)");
console.log(
"🔍 The issue is likely that the component is re-rendering for other reasons",
);
}
} else {
console.log("\n✅ No infinite re-render detected in this test run.");
}

// Export detailed log for further analysis
const detailedLog = {
totalMessages: consoleMessages.length,
useAllGroupsCalls: useAllGroupsCount,
useFireproofCalls: useFireproofCount,
groupsContentRenders: groupsContentCount,
useMemoRecreations: useMemoCount,
messageTypes,
renderPatterns,
};

console.log("\n💾 Detailed log analysis complete");

// Keep browser open for manual inspection
console.log(
"\n🔍 Keeping browser open for 5 seconds for manual inspection...",
);
await page.waitForTimeout(5000);
});
4 changes: 2 additions & 2 deletions hosting/base/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"license": "Apache-2.0",
"dependencies": {
"@adviser/cement": "^0.4.66",
"@fireproof/core-runtime": "0.24.0",
"@fireproof/core-runtime": "0.24.1-dev-memo",
"@vibes.diy/prompts": "workspace:*",
"@vibes.diy/use-vibes-base": "workspace:*",
"call-ai": "workspace:*",
Expand All @@ -31,7 +31,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"@fireproof/core-cli": "0.24.0",
"@fireproof/core-cli": "0.24.1-dev-memo",
"@vitest/browser-playwright": "^4.0.14",
"typescript": "^5.9.3"
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
"license": "Apache-2.0",
"devDependencies": {
"@eslint/js": "^9.39.1",
"@fireproof/core-cli": "0.24.0",
"@fireproof/core-cli": "0.24.1-dev-memo",
"@playwright/test": "^1.57.0",
"@types/deno": "^2.5.0",
"@types/node": "^24.9.1",
Expand Down
Loading