var test = require("node:test"); var assert = require("node:assert/strict"); var fs = require("node:fs"); var path = require("node:path"); var pathToFileURL = require("node:url").pathToFileURL; var root = path.join(__dirname, ".."); test("root and explicit project boots default to the project workspace", async function () { var boot = await import(pathToFileURL(path.join(root, "lib/public/modules/home-surface-boot.js")).href); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: false, currentSlug: null, projectsLoaded: false }), "wait"); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: true, dockLoaded: true, surface: "home", currentSlug: "alpha", pathname: "/p/alpha/" }), "project"); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: true, dockLoaded: true, surface: "home", currentSlug: "alpha", pathname: "/", paneMode: true }), "project"); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: false, dockLoaded: false, surface: "home", currentSlug: "alpha", pathname: "/" }), "project"); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: true, dockLoaded: true, surface: "project", currentSlug: "alpha", pathname: "/" }), "project"); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: true, dockLoaded: true, surface: "home", currentSlug: "alpha", pathname: "/" }), "project"); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: true, dockLoaded: false, surface: "home", currentSlug: null, pathname: "/" }), "wait"); assert.equal(boot.resolveHomeBootDestination({ surfaceLoaded: true, projectsLoaded: true, dockLoaded: true, surface: "home", currentSlug: null, pathname: "/" }), "projects"); }); test("hard-refresh after explicit Home returns to the server-selected project", async function () { var originals = { document: global.document, location: global.location, history: global.history }; var bodyClasses = new Set(); var overlayClasses = new Set(["hidden"]); var overlayMessage = { textContent: "Connecting…" }; global.document = { body: { classList: { add: function (name) { bodyClasses.add(name); }, remove: function (name) { bodyClasses.delete(name); } } }, getElementById: function (id) { if (id === "connect-overlay") return { classList: { add: function (name) { overlayClasses.add(name); } } }; if (id === "connect-overlay-msg") return overlayMessage; return null; }, }; global.location = { pathname: "/" }; var routes = []; global.history = { replaceState: function (state, title, route) { routes.push(route); } }; try { var storeModule = await import(pathToFileURL(path.join(root, "lib/public/modules/store.js")).href); var surface = await import(pathToFileURL(path.join(root, "lib/public/modules/home-surface.js")).href); var wsRef = await import(pathToFileURL(path.join(root, "lib/public/modules/ws-ref.js")).href); var boot = await import(pathToFileURL(path.join(root, "lib/public/modules/home-surface-boot.js")).href); storeModule.createStore({ connected: true, paneMode: false, currentSlug: "alpha", homeSurfaceLoaded: false, homeDockPreferenceLoaded: false, homePrimarySurface: null, homeSurfaceProjectSlug: null, homeSurfaceIntent: null, homeChatMateId: null, homePreferredMateId: null, homeActiveSessionByMate: {}, homeSidebarCollapsed: false, homeMatesCollapsed: false, homeChatScope: "all", dockOpen: true, dockFocus: true, dockActiveToolId: "translator", dockLibraryOpen: false, }); boot.initHomeSurfaceBoot(); assert.equal(bodyClasses.has("home-surface-boot-pending"), false); assert.equal(overlayMessage.textContent, "Restoring your workspace…"); assert.equal(storeModule.store.get('homeSurfaceBootResolved'), true); assert.equal(storeModule.store.get('homeSurfaceRestoreRequested'), undefined); assert.deepEqual(routes, ["/p/alpha/"]); surface.handleHomeSurfaceState({ preference: { surface: "home", projectSlug: "alpha", activeMateId: "mate-a", activeSessionByMate: { "mate-a": "session-a" }, sidebarCollapsed: true, matesCollapsed: true, chatScope: "current", } }); assert.equal(storeModule.store.get('homeSurfaceRestoreRequested'), undefined); storeModule.store.set({ homeDockPreferenceLoaded: true }); assert.equal(storeModule.store.get('homeSurfaceBootResolved'), true); assert.equal(storeModule.store.get('homeSurfaceRestoreRequested'), undefined); assert.equal(storeModule.store.get('homePreferredMateId'), "mate-a"); assert.deepEqual(storeModule.store.get('homeActiveSessionByMate'), { "mate-a": "session-a" }); assert.equal(storeModule.store.get('homeSidebarCollapsed'), true); assert.equal(storeModule.store.get('homeMatesCollapsed'), true); assert.equal(storeModule.store.get('homeChatScope'), "current"); assert.equal(storeModule.store.get('dockOpen'), true); assert.equal(storeModule.store.get('dockFocus'), true); assert.equal(storeModule.store.get('dockActiveToolId'), "translator"); var sent = []; wsRef.setWs({ readyState: 1, send: function (value) { sent.push(JSON.parse(value)); } }); surface.updateHomeSurfacePreference({ matesCollapsed: false }); assert.equal(storeModule.store.get('homeMatesCollapsed'), false); assert.deepEqual(sent, [{ type: "home_surface_set", preference: { matesCollapsed: false } }]); assert.equal(bodyClasses.has("home-surface-boot-pending"), false); assert.deepEqual(routes, ["/p/alpha/"]); surface.handleHomeSurfaceState({ preference: { surface: "home", projectSlug: "alpha", activeMateId: "mate-a", activeSessionByMate: { "mate-a": "session-a" }, sidebarCollapsed: true, matesCollapsed: true, chatScope: "current", } }); assert.equal(storeModule.store.get('homeSurfaceBootResolved'), true); assert.equal(storeModule.store.get('homeSurfaceRestoreRequested'), undefined); assert.deepEqual(routes, ["/p/alpha/"]); } finally { global.document = originals.document; global.location = originals.location; global.history = originals.history; } }); test("legacy Home entry points are absent while Capsule runtime and preference migration remain", function () { var app = fs.readFileSync(path.join(root, "lib/public/app.js"), "utf8"); var hub = fs.readFileSync(path.join(root, "lib/public/modules/app-home-hub.js"), "utf8"); var surface = fs.readFileSync(path.join(root, "lib/public/modules/home-surface.js"), "utf8"); var dock = fs.readFileSync(path.join(root, "lib/public/modules/home-dock.js"), "utf8"); var server = fs.readFileSync(path.join(root, "lib/server.js"), "utf8"); var markup = fs.readFileSync(path.join(root, "lib/public/index.html"), "utf8"); assert.doesNotMatch(markup, /id="home-hub"|id="home-sidebar"|id="home-debates-archive"|id="mobile-home-btn"/); assert.match(markup, /retained-capsule-host-template[\s\S]*home-tool-workbench/); assert.doesNotMatch(app, /initHomeHub\(\)|initHomeSidebar\(\)/); assert.match(app, /initHomeSurfaceBoot\(\);[\s\S]*connect\(\);/); assert.match(surface, /homeActiveSessionByMate: normalizeSessions\(preference\.activeSessionByMate\)/); assert.match(surface, /homeChatScope: normalizeChatScope\(preference\.chatScope\)/); assert.match(dock, /homeDockPreferenceLoaded: true[\s\S]*dockActiveToolId: saved\.activeToolId \|\| null[\s\S]*dockFocus: saved\.dockOpen === true && saved\.dockFocus === true/); assert.match(server, /getHomeSurfacePreference[\s\S]*preferredContextSlug[\s\S]*isOrdinaryProject\(preferredContextSlug\)[\s\S]*if \(!targetSlug && isOrdinaryProject\(lastProject\)\)/); assert.match(server, /if \(targetSlug\) \{\s*sendAppShell\(req, res, targetSlug\)/); assert.match(hub, /export function showHomeHub/); });