/** * app.ts — MuseHub frontend entry point. * * Bundled by esbuild into static/app.js (IIFE format). * Each module attaches its public API to `window` for use in * Jinja2 templates that call e.g. togglePlay(), saveToken(), etc. * * Page modules register on window.MusePages and are dispatched by * musehub.ts → dispatchPageModule() after every page load / HTMX swap. */ import './musehub.ts'; import './alpine-components.ts'; import { initRepoPage } from './pages/repo-page.ts'; import { initIssueList } from './pages/issue-list.ts'; import { initNewRepo } from './pages/new-repo.ts'; import { initCommitDetail } from './pages/commit-detail.ts'; import { initUserProfile } from './pages/user-profile.ts'; import { initProposalDetail } from './pages/proposal-detail.ts'; import { initCommits } from './pages/commits.ts'; import { initIssueDetail } from './pages/issue-detail.ts'; import { initReleaseDetail } from './pages/release-detail.ts'; import { initDomainDetail } from './pages/domain-detail.ts'; import { initDiff } from './pages/diff.ts'; import { initSettings } from './pages/settings.ts'; import { initExplore } from './pages/explore.ts'; import { initBranches } from './pages/branches.ts'; import { initTags } from './pages/tags.ts'; import { initSessions } from './pages/sessions.ts'; import { initReleaseList } from './pages/release-list.ts'; import { initBlob } from './pages/blob.ts'; import { initTree } from './pages/tree.ts'; import { initMcpDocs } from './pages/mcp-docs.ts'; import { initDomains } from './pages/domains.ts'; import { initTopics } from './pages/topics.ts'; import { initProposalList } from './pages/proposal-list.ts'; import { initSymbols } from './pages/symbols.ts'; import { initFeed } from './pages/feed.ts'; import { initTimeline } from './pages/timeline.ts'; import { initActivity } from './pages/activity.ts'; import { initMistList } from './pages/mist-list.ts'; import { initMistDetail } from './pages/mist-detail.ts'; import { initDocs } from './pages/docs.ts'; import { initAgentsCoord } from './pages/agents-coord.ts'; import { initBlame } from './pages/blame.ts'; // Register page modules — keyed by the "page" field in the #page-data JSON. type PageData = Record; const MusePages: Record void | Promise> = { 'repo': (d) => initRepoPage(d), 'issue-list': (d) => initIssueList(d), 'new-repo': (d) => initNewRepo(d), 'commit-detail': () => initCommitDetail(), 'user-profile': (d) => void initUserProfile(d), 'global-search': () => {}, 'proposal-detail': (d) => initProposalDetail(d), 'commits': (d) => initCommits(d), 'issue-detail': (d) => initIssueDetail(d), 'release-detail': (d) => initReleaseDetail(d), 'domain-detail': (d) => initDomainDetail(d), 'diff': () => initDiff(), 'settings': (d) => initSettings(d), 'explore': () => initExplore(), 'branches': () => initBranches(), 'tags': () => initTags(), 'sessions': () => initSessions(), 'release-list': () => initReleaseList(), 'blob': (d) => initBlob(d), 'tree': (d) => initTree(d), 'mcp-docs': () => initMcpDocs(), 'domains': () => initDomains(), 'topics': (d) => initTopics(d), 'proposal-list': (d) => initProposalList(d), 'symbols': () => initSymbols(), 'feed': () => initFeed(), 'timeline': (d) => initTimeline(d), 'activity': () => initActivity(), 'mist-list': (d) => initMistList(d), 'mist-detail': (d) => initMistDetail(d), 'docs': () => initDocs(), 'docs-getting-started': () => initDocs(), 'docs-wire': () => initDocs(), 'docs-mcp': () => initDocs(), 'docs-shelves': () => initDocs(), 'docs-coordination': () => initDocs(), 'docs-harmony': () => initDocs(), 'docs-foundations': () => initDocs(), 'docs-domains': () => initDocs(), 'docs-api': () => initDocs(), 'docs-intelligence': () => initDocs(), 'docs-identity': () => initDocs(), 'docs-mists': () => initDocs(), 'docs-profiles': () => initDocs(), 'agents-coord': (d) => initAgentsCoord(d), 'blame': (d) => initBlame(d), }; // Attach to window so musehub.ts dispatchPageModule() can reach it. (window as unknown as { MusePages: typeof MusePages }).MusePages = MusePages; // ── Theme toggle ────────────────────────────────────────────────────────────── // Delegated to document — survives hx-boost body swaps without rebinding. import { initThemeBtn, applyStoredTheme } from './theme'; applyStoredTheme(); initThemeBtn();