From 9c79c307527daa969167a53b7cd57810bf62bbb2 Mon Sep 17 00:00:00 2001 From: Ravi Gulhane <> Date: Fri, 30 Oct 2026 17:19:01 +0530 Subject: [PATCH] first commit --- DesignSystem/Design System for BookTalk.zip | Bin 0 -> 37751 bytes .../.figma/make/analyze-routes | 4 + .../.figma/make/deploy | 4 + .../.figma/make/deploy-preview | 5 + .../.figma/make/dev | 4 + .../.figma/make/dev.json | 22 + .../.figma/make/format | 4 + .../.figma/make/import-assets.mjs | 82 + .../.figma/make/install | 4 + .../.figma/make/langserver | 3 + .../.figma/make/site.json | 10 + .../Design System for BookTalk/.gitattributes | 146 + .../Design System for BookTalk/.gitignore | 21 + .../Design System for BookTalk/.mise.toml | 3 + .../Design System for BookTalk/AGENTS.md | 41 + .../Design System for BookTalk/CLAUDE.md | 1 + .../Design System for BookTalk/index.html | 16 + .../Design System for BookTalk/package.json | 27 + .../Design System for BookTalk/pnpm-lock.yaml | 907 +++ .../Design System for BookTalk/src/App.tsx | 329 ++ .../Design System for BookTalk/src/index.css | 329 ++ .../Design System for BookTalk/src/main.tsx | 10 + .../src/vite-env.d.ts | 1 + .../Design System for BookTalk/tsconfig.json | 23 + .../Design System for BookTalk/vite.config.ts | 361 ++ DesignSystem/Design System for BookTalk_1.zip | Bin 0 -> 37474 bytes .../.figma/make/analyze-routes | 4 + .../.figma/make/deploy | 4 + .../.figma/make/deploy-preview | 5 + .../.figma/make/dev | 4 + .../.figma/make/dev.json | 22 + .../.figma/make/format | 4 + .../.figma/make/import-assets.mjs | 82 + .../.figma/make/install | 4 + .../.figma/make/langserver | 3 + .../.figma/make/site.json | 10 + .../.gitattributes | 146 + .../Design System for BookTalk_1/.gitignore | 21 + .../Design System for BookTalk_1/.mise.toml | 3 + .../Design System for BookTalk_1/AGENTS.md | 41 + .../Design System for BookTalk_1/CLAUDE.md | 1 + .../Design System for BookTalk_1/index.html | 16 + .../Design System for BookTalk_1/package.json | 27 + .../pnpm-lock.yaml | 907 +++ .../Design System for BookTalk_1/src/App.tsx | 349 ++ .../src/index.css | 359 ++ .../Design System for BookTalk_1/src/main.tsx | 10 + .../src/vite-env.d.ts | 1 + .../tsconfig.json | 23 + .../vite.config.ts | 361 ++ ai_agent/.env | 24 + ai_agent/.env.example | 21 + ai_agent/__pycache__/agent.cpython-313.pyc | Bin 0 -> 18621 bytes .../chat_engine_client.cpython-313.pyc | Bin 0 -> 5906 bytes .../__pycache__/engine_llm.cpython-313.pyc | Bin 0 -> 11226 bytes ai_agent/agent.py | 305 ++ ai_agent/chat_engine_client.py | 93 + ai_agent/engine_llm.py | 221 + ai_agent/requirements.txt | 8 + ...st_engine_llm.cpython-313-pytest-8.4.2.pyc | Bin 0 -> 18849 bytes ai_agent/tests/test_engine_llm.py | 74 + backend/.env | 31 + backend/.env.example | 25 + backend/README.md | 13 + backend/package-lock.json | 2988 ++++++++++ backend/package.json | 33 + backend/src/config/db.js | 162 + backend/src/controllers/adminController.js | 408 ++ backend/src/controllers/bookletController.js | 204 + backend/src/controllers/chatController.js | 67 + backend/src/controllers/publicController.js | 249 + backend/src/controllers/userController.js | 75 + backend/src/controllers/voiceController.js | 59 + backend/src/middleware/auth.js | 45 + backend/src/routes/adminRoutes.js | 17 + backend/src/routes/bookletRoutes.js | 40 + backend/src/routes/chatRoutes.js | 16 + backend/src/routes/publicRoutes.js | 9 + backend/src/routes/userRoutes.js | 16 + backend/src/routes/voiceRoutes.js | 11 + backend/src/server.js | 65 + backend/src/services/bedrockService.js | 46 + backend/src/services/engineClient.js | 63 + backend/src/services/ingestionRunner.js | 50 + backend/src/services/links.js | 58 + backend/src/services/livekitVoice.js | 49 + backend/src/services/openSearchService.js | 150 + backend/src/services/rateLimit.js | 21 + backend/src/services/textractService.js | 81 + backend/tests/public.test.js | 121 + backend/vitest.config.js | 8 + chat-engine/.env.example | 28 + chat-engine/.gitignore | 4 + chat-engine/README.md | 29 + chat-engine/eslint.config.js | 23 + chat-engine/package-lock.json | 4056 ++++++++++++++ chat-engine/package.json | 30 + chat-engine/prompts/citation_markers.txt | 5 + chat-engine/prompts/history_summary.txt | 6 + chat-engine/prompts/hybrid_agent_rules.txt | 5 + chat-engine/prompts/judge.txt | 12 + chat-engine/prompts/persona_book.txt | 8 + chat-engine/prompts/persona_companion.txt | 8 + chat-engine/prompts/style_chat.txt | 9 + chat-engine/prompts/style_voice.txt | 10 + chat-engine/src/auth.js | 28 + chat-engine/src/bookCache.js | 82 + chat-engine/src/citations.js | 44 + chat-engine/src/citations/answerText.js | 32 + chat-engine/src/citations/build.js | 95 + chat-engine/src/citations/markerStripper.js | 112 + chat-engine/src/citations/markers.js | 23 + chat-engine/src/cli.js | 146 + chat-engine/src/config.js | 84 + chat-engine/src/cost.js | 68 + chat-engine/src/engine.js | 204 + chat-engine/src/eval/questions.json | 37 + chat-engine/src/eval/run.js | 281 + chat-engine/src/guard.js | 42 + chat-engine/src/history.js | 58 + chat-engine/src/index.js | 29 + chat-engine/src/opening.js | 28 + chat-engine/src/prompt/build.js | 216 + chat-engine/src/prompt/normalizeRefs.js | 134 + chat-engine/src/prompts.js | 13 + chat-engine/src/resolveMode.js | 39 + chat-engine/src/sentenceStream.js | 69 + chat-engine/src/server.js | 190 + chat-engine/src/sessions.js | 212 + chat-engine/src/strategies/fullContext.js | 133 + chat-engine/src/strategies/hybridAgent.js | 203 + chat-engine/src/stream.js | 72 + chat-engine/src/tools/execute.js | 33 + chat-engine/src/tools/findTerms.js | 55 + chat-engine/src/tools/getChapter.js | 44 + chat-engine/src/tools/getPages.js | 29 + chat-engine/src/tools/registry.js | 100 + chat-engine/src/tools/searchBook.js | 155 + chat-engine/tests/api.test.js | 207 + chat-engine/tests/citations.test.js | 31 + chat-engine/tests/engine.test.js | 106 + chat-engine/tests/eval.test.js | 60 + chat-engine/tests/fixture.js | 114 + chat-engine/tests/fullContext.test.js | 86 + chat-engine/tests/hybrid.test.js | 202 + chat-engine/tests/markerStripper.test.js | 87 + chat-engine/tests/prompts.test.js | 105 + chat-engine/tests/stage1.test.js | 91 + chat-engine/vitest.config.js | 9 + deploy.sh | 143 + deploy/README.md | 26 + deploy/iam/agent.json | 10 + deploy/iam/chat-engine.json | 15 + deploy/iam/ingestion.json | 15 + deploy/merge_env.py | 30 + deploy/systemd/talkingbooklet-agent.service | 13 + deploy/systemd/talkingbooklet-backend.service | 13 + .../talkingbooklet-chat-engine.service | 13 + ecosystem.config.cjs | 24 + frontend/.env | 2 + frontend/.env.example | 3 + frontend/.env.production | 1 + frontend/.gitignore | 24 + frontend/.oxlintrc.json | 8 + frontend/README.md | 16 + frontend/index.html | 13 + frontend/package-lock.json | 3199 +++++++++++ frontend/package.json | 31 + frontend/public/favicon.svg | 1 + frontend/public/icons.svg | 24 + frontend/src/App.css | 184 + frontend/src/App.jsx | 35 + frontend/src/adminApi.js | 29 + frontend/src/adminFormat.js | 53 + frontend/src/api.js | 1 + frontend/src/assets/hero.png | Bin 0 -> 13057 bytes frontend/src/assets/react.svg | 1 + frontend/src/assets/vite.svg | 1 + frontend/src/chatStream.js | 18 + frontend/src/chatStream.test.js | 14 + frontend/src/components/ChatPane.jsx | 135 + frontend/src/components/LinkPanel.jsx | 186 + frontend/src/components/Studio.jsx | 139 + frontend/src/components/UsagePanel.jsx | 140 + frontend/src/components/VoiceChatRoom.jsx | 154 + frontend/src/components/VoicePane.jsx | 56 + frontend/src/index.css | 236 + frontend/src/main.jsx | 10 + frontend/src/pages/Auth.jsx | 78 + frontend/src/pages/BookDetail.jsx | 262 + frontend/src/pages/BookletView.jsx | 49 + frontend/src/pages/Dashboard.jsx | 214 + frontend/src/pages/Links.jsx | 12 + frontend/src/pages/PublicSession.jsx | 49 + frontend/src/pages/Reader.jsx | 421 ++ frontend/src/pages/Settings.jsx | 24 + frontend/src/pages/TestChat.jsx | 133 + frontend/src/pages/Usage.jsx | 12 + frontend/src/styles/booktalk.css | 328 ++ frontend/src/styles/studio.css | 175 + frontend/vite.config.js | 7 + ingestion/.env.example | 34 + ingestion/.gitignore | 4 + ingestion/.prettierrc | 4 + ingestion/README.md | 105 + ingestion/eslint.config.js | 23 + ingestion/package-lock.json | 4270 +++++++++++++++ ingestion/package.json | 39 + ingestion/prompts/book-card.txt | 10 + ingestion/prompts/chapter-summary-merge.txt | 10 + ingestion/prompts/chapter-summary.txt | 12 + ingestion/prompts/chunk-context.txt | 7 + ingestion/prompts/repair.txt | 9 + ingestion/prompts/structure-fallback.txt | 8 + ingestion/src/artifacts.js | 1 + ingestion/src/books.js | 1 + ingestion/src/chunk.js | 156 + ingestion/src/clean.js | 264 + ingestion/src/cli.js | 183 + ingestion/src/clients.js | 22 + ingestion/src/config.js | 12 + ingestion/src/corrections.js | 50 + ingestion/src/embed.js | 1 + ingestion/src/index.js | 3 + ingestion/src/indexMapping.js | 60 + ingestion/src/indexer.js | 317 ++ ingestion/src/llm.js | 117 + ingestion/src/logger.js | 1 + ingestion/src/migrate.js | 119 + ingestion/src/ocr.js | 203 + ingestion/src/pdf.js | 125 + ingestion/src/pipeline.js | 604 ++ ingestion/src/prompts.js | 13 + ingestion/src/retry.js | 1 + ingestion/src/schemas.js | 1 + ingestion/src/storage.js | 1 + ingestion/src/structure.js | 247 + ingestion/src/summarize.js | 216 + ingestion/src/tokens.js | 1 + ingestion/src/vocab.js | 94 + ingestion/tests/clean.test.js | 48 + ingestion/tests/fixtures/sample-5page.pdf | Bin 0 -> 3705 bytes ingestion/tests/fixtures/textract-layout.json | 45 + ingestion/tests/helpers/samplePdf.js | 40 + ingestion/tests/index-stage.test.js | 290 + ingestion/tests/llm.test.js | 76 + ingestion/tests/ocr.test.js | 102 + ingestion/tests/stage1.test.js | 146 + ingestion/tests/structure.test.js | 99 + ingestion/tests/tokens.test.js | 42 + ingestion/tests/vocab.test.js | 84 + ingestion/vitest.config.js | 9 + package-lock.json | 4868 +++++++++++++++++ package.json | 9 + packages/core/package-lock.json | 897 +++ packages/core/package.json | 19 + packages/core/src/artifacts.js | 48 + packages/core/src/books.js | 196 + packages/core/src/clients.js | 83 + packages/core/src/config.js | 120 + packages/core/src/embed.js | 80 + packages/core/src/index.js | 25 + packages/core/src/logger.js | 10 + packages/core/src/prompts.js | 12 + packages/core/src/retry.js | 30 + packages/core/src/schemas.js | 208 + packages/core/src/storage.js | 212 + packages/core/src/tokens.js | 103 + scripts/e2e-chat.mjs | 79 + scripts/voice-checklist.md | 9 + voice_rag_system_architecture.md | 59 + 271 files changed, 41287 insertions(+) create mode 100644 DesignSystem/Design System for BookTalk.zip create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/analyze-routes create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/deploy create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/deploy-preview create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/dev create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/dev.json create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/format create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/import-assets.mjs create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/install create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/langserver create mode 100644 DesignSystem/Design System for BookTalk/.figma/make/site.json create mode 100644 DesignSystem/Design System for BookTalk/.gitattributes create mode 100644 DesignSystem/Design System for BookTalk/.gitignore create mode 100644 DesignSystem/Design System for BookTalk/.mise.toml create mode 100644 DesignSystem/Design System for BookTalk/AGENTS.md create mode 100644 DesignSystem/Design System for BookTalk/CLAUDE.md create mode 100644 DesignSystem/Design System for BookTalk/index.html create mode 100644 DesignSystem/Design System for BookTalk/package.json create mode 100644 DesignSystem/Design System for BookTalk/pnpm-lock.yaml create mode 100644 DesignSystem/Design System for BookTalk/src/App.tsx create mode 100644 DesignSystem/Design System for BookTalk/src/index.css create mode 100644 DesignSystem/Design System for BookTalk/src/main.tsx create mode 100644 DesignSystem/Design System for BookTalk/src/vite-env.d.ts create mode 100644 DesignSystem/Design System for BookTalk/tsconfig.json create mode 100644 DesignSystem/Design System for BookTalk/vite.config.ts create mode 100644 DesignSystem/Design System for BookTalk_1.zip create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/analyze-routes create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/deploy create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/deploy-preview create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/dev create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/dev.json create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/format create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/import-assets.mjs create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/install create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/langserver create mode 100644 DesignSystem/Design System for BookTalk_1/.figma/make/site.json create mode 100644 DesignSystem/Design System for BookTalk_1/.gitattributes create mode 100644 DesignSystem/Design System for BookTalk_1/.gitignore create mode 100644 DesignSystem/Design System for BookTalk_1/.mise.toml create mode 100644 DesignSystem/Design System for BookTalk_1/AGENTS.md create mode 100644 DesignSystem/Design System for BookTalk_1/CLAUDE.md create mode 100644 DesignSystem/Design System for BookTalk_1/index.html create mode 100644 DesignSystem/Design System for BookTalk_1/package.json create mode 100644 DesignSystem/Design System for BookTalk_1/pnpm-lock.yaml create mode 100644 DesignSystem/Design System for BookTalk_1/src/App.tsx create mode 100644 DesignSystem/Design System for BookTalk_1/src/index.css create mode 100644 DesignSystem/Design System for BookTalk_1/src/main.tsx create mode 100644 DesignSystem/Design System for BookTalk_1/src/vite-env.d.ts create mode 100644 DesignSystem/Design System for BookTalk_1/tsconfig.json create mode 100644 DesignSystem/Design System for BookTalk_1/vite.config.ts create mode 100644 ai_agent/.env create mode 100644 ai_agent/.env.example create mode 100644 ai_agent/__pycache__/agent.cpython-313.pyc create mode 100644 ai_agent/__pycache__/chat_engine_client.cpython-313.pyc create mode 100644 ai_agent/__pycache__/engine_llm.cpython-313.pyc create mode 100644 ai_agent/agent.py create mode 100644 ai_agent/chat_engine_client.py create mode 100644 ai_agent/engine_llm.py create mode 100644 ai_agent/requirements.txt create mode 100644 ai_agent/tests/__pycache__/test_engine_llm.cpython-313-pytest-8.4.2.pyc create mode 100644 ai_agent/tests/test_engine_llm.py create mode 100644 backend/.env create mode 100644 backend/.env.example create mode 100644 backend/README.md create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/src/config/db.js create mode 100644 backend/src/controllers/adminController.js create mode 100644 backend/src/controllers/bookletController.js create mode 100644 backend/src/controllers/chatController.js create mode 100644 backend/src/controllers/publicController.js create mode 100644 backend/src/controllers/userController.js create mode 100644 backend/src/controllers/voiceController.js create mode 100644 backend/src/middleware/auth.js create mode 100644 backend/src/routes/adminRoutes.js create mode 100644 backend/src/routes/bookletRoutes.js create mode 100644 backend/src/routes/chatRoutes.js create mode 100644 backend/src/routes/publicRoutes.js create mode 100644 backend/src/routes/userRoutes.js create mode 100644 backend/src/routes/voiceRoutes.js create mode 100644 backend/src/server.js create mode 100644 backend/src/services/bedrockService.js create mode 100644 backend/src/services/engineClient.js create mode 100644 backend/src/services/ingestionRunner.js create mode 100644 backend/src/services/links.js create mode 100644 backend/src/services/livekitVoice.js create mode 100644 backend/src/services/openSearchService.js create mode 100644 backend/src/services/rateLimit.js create mode 100644 backend/src/services/textractService.js create mode 100644 backend/tests/public.test.js create mode 100644 backend/vitest.config.js create mode 100644 chat-engine/.env.example create mode 100644 chat-engine/.gitignore create mode 100644 chat-engine/README.md create mode 100644 chat-engine/eslint.config.js create mode 100644 chat-engine/package-lock.json create mode 100644 chat-engine/package.json create mode 100644 chat-engine/prompts/citation_markers.txt create mode 100644 chat-engine/prompts/history_summary.txt create mode 100644 chat-engine/prompts/hybrid_agent_rules.txt create mode 100644 chat-engine/prompts/judge.txt create mode 100644 chat-engine/prompts/persona_book.txt create mode 100644 chat-engine/prompts/persona_companion.txt create mode 100644 chat-engine/prompts/style_chat.txt create mode 100644 chat-engine/prompts/style_voice.txt create mode 100644 chat-engine/src/auth.js create mode 100644 chat-engine/src/bookCache.js create mode 100644 chat-engine/src/citations.js create mode 100644 chat-engine/src/citations/answerText.js create mode 100644 chat-engine/src/citations/build.js create mode 100644 chat-engine/src/citations/markerStripper.js create mode 100644 chat-engine/src/citations/markers.js create mode 100644 chat-engine/src/cli.js create mode 100644 chat-engine/src/config.js create mode 100644 chat-engine/src/cost.js create mode 100644 chat-engine/src/engine.js create mode 100644 chat-engine/src/eval/questions.json create mode 100644 chat-engine/src/eval/run.js create mode 100644 chat-engine/src/guard.js create mode 100644 chat-engine/src/history.js create mode 100644 chat-engine/src/index.js create mode 100644 chat-engine/src/opening.js create mode 100644 chat-engine/src/prompt/build.js create mode 100644 chat-engine/src/prompt/normalizeRefs.js create mode 100644 chat-engine/src/prompts.js create mode 100644 chat-engine/src/resolveMode.js create mode 100644 chat-engine/src/sentenceStream.js create mode 100644 chat-engine/src/server.js create mode 100644 chat-engine/src/sessions.js create mode 100644 chat-engine/src/strategies/fullContext.js create mode 100644 chat-engine/src/strategies/hybridAgent.js create mode 100644 chat-engine/src/stream.js create mode 100644 chat-engine/src/tools/execute.js create mode 100644 chat-engine/src/tools/findTerms.js create mode 100644 chat-engine/src/tools/getChapter.js create mode 100644 chat-engine/src/tools/getPages.js create mode 100644 chat-engine/src/tools/registry.js create mode 100644 chat-engine/src/tools/searchBook.js create mode 100644 chat-engine/tests/api.test.js create mode 100644 chat-engine/tests/citations.test.js create mode 100644 chat-engine/tests/engine.test.js create mode 100644 chat-engine/tests/eval.test.js create mode 100644 chat-engine/tests/fixture.js create mode 100644 chat-engine/tests/fullContext.test.js create mode 100644 chat-engine/tests/hybrid.test.js create mode 100644 chat-engine/tests/markerStripper.test.js create mode 100644 chat-engine/tests/prompts.test.js create mode 100644 chat-engine/tests/stage1.test.js create mode 100644 chat-engine/vitest.config.js create mode 100755 deploy.sh create mode 100644 deploy/README.md create mode 100644 deploy/iam/agent.json create mode 100644 deploy/iam/chat-engine.json create mode 100644 deploy/iam/ingestion.json create mode 100644 deploy/merge_env.py create mode 100644 deploy/systemd/talkingbooklet-agent.service create mode 100644 deploy/systemd/talkingbooklet-backend.service create mode 100644 deploy/systemd/talkingbooklet-chat-engine.service create mode 100644 ecosystem.config.cjs create mode 100644 frontend/.env create mode 100644 frontend/.env.example create mode 100644 frontend/.env.production create mode 100644 frontend/.gitignore create mode 100644 frontend/.oxlintrc.json create mode 100644 frontend/README.md create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/public/icons.svg create mode 100644 frontend/src/App.css create mode 100644 frontend/src/App.jsx create mode 100644 frontend/src/adminApi.js create mode 100644 frontend/src/adminFormat.js create mode 100644 frontend/src/api.js create mode 100644 frontend/src/assets/hero.png create mode 100644 frontend/src/assets/react.svg create mode 100644 frontend/src/assets/vite.svg create mode 100644 frontend/src/chatStream.js create mode 100644 frontend/src/chatStream.test.js create mode 100644 frontend/src/components/ChatPane.jsx create mode 100644 frontend/src/components/LinkPanel.jsx create mode 100644 frontend/src/components/Studio.jsx create mode 100644 frontend/src/components/UsagePanel.jsx create mode 100644 frontend/src/components/VoiceChatRoom.jsx create mode 100644 frontend/src/components/VoicePane.jsx create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.jsx create mode 100644 frontend/src/pages/Auth.jsx create mode 100644 frontend/src/pages/BookDetail.jsx create mode 100644 frontend/src/pages/BookletView.jsx create mode 100644 frontend/src/pages/Dashboard.jsx create mode 100644 frontend/src/pages/Links.jsx create mode 100644 frontend/src/pages/PublicSession.jsx create mode 100644 frontend/src/pages/Reader.jsx create mode 100644 frontend/src/pages/Settings.jsx create mode 100644 frontend/src/pages/TestChat.jsx create mode 100644 frontend/src/pages/Usage.jsx create mode 100644 frontend/src/styles/booktalk.css create mode 100644 frontend/src/styles/studio.css create mode 100644 frontend/vite.config.js create mode 100644 ingestion/.env.example create mode 100644 ingestion/.gitignore create mode 100644 ingestion/.prettierrc create mode 100644 ingestion/README.md create mode 100644 ingestion/eslint.config.js create mode 100644 ingestion/package-lock.json create mode 100644 ingestion/package.json create mode 100644 ingestion/prompts/book-card.txt create mode 100644 ingestion/prompts/chapter-summary-merge.txt create mode 100644 ingestion/prompts/chapter-summary.txt create mode 100644 ingestion/prompts/chunk-context.txt create mode 100644 ingestion/prompts/repair.txt create mode 100644 ingestion/prompts/structure-fallback.txt create mode 100644 ingestion/src/artifacts.js create mode 100644 ingestion/src/books.js create mode 100644 ingestion/src/chunk.js create mode 100644 ingestion/src/clean.js create mode 100644 ingestion/src/cli.js create mode 100644 ingestion/src/clients.js create mode 100644 ingestion/src/config.js create mode 100644 ingestion/src/corrections.js create mode 100644 ingestion/src/embed.js create mode 100644 ingestion/src/index.js create mode 100644 ingestion/src/indexMapping.js create mode 100644 ingestion/src/indexer.js create mode 100644 ingestion/src/llm.js create mode 100644 ingestion/src/logger.js create mode 100644 ingestion/src/migrate.js create mode 100644 ingestion/src/ocr.js create mode 100644 ingestion/src/pdf.js create mode 100644 ingestion/src/pipeline.js create mode 100644 ingestion/src/prompts.js create mode 100644 ingestion/src/retry.js create mode 100644 ingestion/src/schemas.js create mode 100644 ingestion/src/storage.js create mode 100644 ingestion/src/structure.js create mode 100644 ingestion/src/summarize.js create mode 100644 ingestion/src/tokens.js create mode 100644 ingestion/src/vocab.js create mode 100644 ingestion/tests/clean.test.js create mode 100644 ingestion/tests/fixtures/sample-5page.pdf create mode 100644 ingestion/tests/fixtures/textract-layout.json create mode 100644 ingestion/tests/helpers/samplePdf.js create mode 100644 ingestion/tests/index-stage.test.js create mode 100644 ingestion/tests/llm.test.js create mode 100644 ingestion/tests/ocr.test.js create mode 100644 ingestion/tests/stage1.test.js create mode 100644 ingestion/tests/structure.test.js create mode 100644 ingestion/tests/tokens.test.js create mode 100644 ingestion/tests/vocab.test.js create mode 100644 ingestion/vitest.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/core/package-lock.json create mode 100644 packages/core/package.json create mode 100644 packages/core/src/artifacts.js create mode 100644 packages/core/src/books.js create mode 100644 packages/core/src/clients.js create mode 100644 packages/core/src/config.js create mode 100644 packages/core/src/embed.js create mode 100644 packages/core/src/index.js create mode 100644 packages/core/src/logger.js create mode 100644 packages/core/src/prompts.js create mode 100644 packages/core/src/retry.js create mode 100644 packages/core/src/schemas.js create mode 100644 packages/core/src/storage.js create mode 100644 packages/core/src/tokens.js create mode 100644 scripts/e2e-chat.mjs create mode 100644 scripts/voice-checklist.md create mode 100644 voice_rag_system_architecture.md diff --git a/DesignSystem/Design System for BookTalk.zip b/DesignSystem/Design System for BookTalk.zip new file mode 100644 index 0000000000000000000000000000000000000000..f45faa042e7a5024a9117d4033e6209bcc9ef366 GIT binary patch literal 37751 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 JGSQtN9sr~`mLvcG literal 0 HcmV?d00001 diff --git a/DesignSystem/Design System for BookTalk/.figma/make/analyze-routes b/DesignSystem/Design System for BookTalk/.figma/make/analyze-routes new file mode 100644 index 0000000..70c7579 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/analyze-routes @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +exec figma-analyze routes "$@" diff --git a/DesignSystem/Design System for BookTalk/.figma/make/deploy b/DesignSystem/Design System for BookTalk/.figma/make/deploy new file mode 100644 index 0000000..2ab04c0 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/deploy @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +pnpm run build +figma make deploy --build-dir dist diff --git a/DesignSystem/Design System for BookTalk/.figma/make/deploy-preview b/DesignSystem/Design System for BookTalk/.figma/make/deploy-preview new file mode 100644 index 0000000..3b3bce3 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/deploy-preview @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail +# Build in development mode to emit sourcemaps. +pnpm run build --mode development +figma make deploy-preview --build-dir dist diff --git a/DesignSystem/Design System for BookTalk/.figma/make/dev b/DesignSystem/Design System for BookTalk/.figma/make/dev new file mode 100644 index 0000000..95497ad --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/dev @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +pnpm run dev diff --git a/DesignSystem/Design System for BookTalk/.figma/make/dev.json b/DesignSystem/Design System for BookTalk/.figma/make/dev.json new file mode 100644 index 0000000..85b08d0 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/dev.json @@ -0,0 +1,22 @@ +{ + // Files whose changes trigger the install script + dev server restart. + // Glob syntax: doublestar (supports **, *, ?, [abc], {a,b}). Paths are + // repo-relative and case-sensitive. `.mise.toml` and the scripts under + // `.figma/make/` are always watched regardless of these lists. + // + // Each key accepts a shorthand array of globs: + // "installOn": ["package.json"] + // or an object with includes/excludes: + // "installOn": { "includes": ["**/*.json"], "excludes": ["test/**"] } + // + // Only list files that affect the *toolchain or dependency tree* here — + // NOT application source files. Vite's dev server already watches + // application code (src/**/*) and config (vite.config.ts) via its own HMR + // pipeline, so including them here would cause a redundant full restart. + "installOn": [ + "package.json", + "pnpm-lock.yaml" + ], + // Files whose changes trigger only a dev server restart (no install). + "restartOn": [] +} diff --git a/DesignSystem/Design System for BookTalk/.figma/make/format b/DesignSystem/Design System for BookTalk/.figma/make/format new file mode 100644 index 0000000..6a6e91a --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/format @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +pnpm run format -- "$@" diff --git a/DesignSystem/Design System for BookTalk/.figma/make/import-assets.mjs b/DesignSystem/Design System for BookTalk/.figma/make/import-assets.mjs new file mode 100644 index 0000000..fa52fe0 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/import-assets.mjs @@ -0,0 +1,82 @@ +import { constants, existsSync, readdirSync } from 'node:fs' +import { copyFile, mkdir } from 'node:fs/promises' +import path from 'node:path' + +const projectMetadata = new Set([ + 'npm-shrinkwrap.json', + 'pnpm-lock.yaml', + 'pnpm-workspace.yaml', + 'yarn.lock', + 'bun.lock', + 'bun.lockb', + 'agents.md', + 'claude.md', +]) +const projectConfiguration = + /^(?:package(?:-lock)?\.json|(?:tsconfig|jsconfig)(?:\.[^.]+)*\.json|.*\.config\.[^.]+)$/i + +function currentAssets(root, excludedDirectories) { + const files = [] + function visit(directory) { + for (const entry of readdirSync(directory, { withFileTypes: true })) { + const filename = path.join(directory, entry.name) + if (entry.name.startsWith('.') && entry.name !== '.well-known') continue + if (entry.isDirectory()) { + if ( + excludedDirectories.has(filename) || + ['node_modules', 'dist', 'build', 'coverage'].includes(entry.name) + ) + continue + if (existsSync(path.join(filename, 'package.json'))) continue + visit(filename) + } else if ( + entry.isFile() && + !projectMetadata.has(entry.name.toLowerCase()) && + !projectConfiguration.test(entry.name) + ) { + files.push(path.relative(root, filename)) + } + } + } + visit(root) + return files +} + +export function frontendAssets() { + let root + let excludedDirectories + let outDir + return { + name: 'figma-frontend-import-assets', + config(config) { + root = path.resolve(config.root || '.') + outDir = path.resolve(root, config.build?.outDir || 'dist') + excludedDirectories = new Set([outDir, path.resolve(root, config.publicDir || 'public')]) + return { + build: { + rollupOptions: { + input: currentAssets(root, excludedDirectories) + .filter((file) => file.endsWith('.html')) + .map((file) => path.resolve(root, file)), + }, + }, + } + }, + configResolved(config) { + root = config.root + outDir = path.resolve(root, config.build.outDir) + excludedDirectories = new Set([outDir, config.publicDir]) + }, + async writeBundle() { + for (const file of currentAssets(root, excludedDirectories)) { + const target = path.resolve(outDir, file) + await mkdir(path.dirname(target), { recursive: true }) + try { + await copyFile(path.resolve(root, file), target, constants.COPYFILE_EXCL) + } catch (error) { + if (error.code !== 'EEXIST') throw error + } + } + }, + } +} diff --git a/DesignSystem/Design System for BookTalk/.figma/make/install b/DesignSystem/Design System for BookTalk/.figma/make/install new file mode 100644 index 0000000..700bc98 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/install @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +pnpm install --prefer-offline --no-frozen-lockfile diff --git a/DesignSystem/Design System for BookTalk/.figma/make/langserver b/DesignSystem/Design System for BookTalk/.figma/make/langserver new file mode 100644 index 0000000..7e10e46 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/langserver @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -euo pipefail +exec pnpm dlx --package=@vtsls/language-server@^0.3.0 vtsls --stdio diff --git a/DesignSystem/Design System for BookTalk/.figma/make/site.json b/DesignSystem/Design System for BookTalk/.figma/make/site.json new file mode 100644 index 0000000..b18c8a8 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.figma/make/site.json @@ -0,0 +1,10 @@ +{ + "description": "Enables users to interact with PDF books via chat or voice, offering a calm, literary experience with a public reader and publisher dashboard.", + "robots": { + "index": false + }, + "accessibility": { + "addBypassLinks": false, + "ignoreReducedMotion": false + } +} \ No newline at end of file diff --git a/DesignSystem/Design System for BookTalk/.gitattributes b/DesignSystem/Design System for BookTalk/.gitattributes new file mode 100644 index 0000000..6ed7361 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.gitattributes @@ -0,0 +1,146 @@ +# Git LFS Tracking Rules +# Generated for binary, large, and non-diffable file types + +# --------------------------------------------------------------------------- +# Images & Graphics +# --------------------------------------------------------------------------- +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.bmp filter=lfs diff=lfs merge=lfs -text +*.tiff filter=lfs diff=lfs merge=lfs -text +*.tif filter=lfs diff=lfs merge=lfs -text +*.ico filter=lfs diff=lfs merge=lfs -text +*.webp filter=lfs diff=lfs merge=lfs -text +*.psd filter=lfs diff=lfs merge=lfs -text +*.ai filter=lfs diff=lfs merge=lfs -text +*.sketch filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Video +# --------------------------------------------------------------------------- +*.mp4 filter=lfs diff=lfs merge=lfs -text +*.mov filter=lfs diff=lfs merge=lfs -text +*.avi filter=lfs diff=lfs merge=lfs -text +*.mkv filter=lfs diff=lfs merge=lfs -text +*.wmv filter=lfs diff=lfs merge=lfs -text +*.flv filter=lfs diff=lfs merge=lfs -text +*.webm filter=lfs diff=lfs merge=lfs -text +*.m4v filter=lfs diff=lfs merge=lfs -text +*.mpg filter=lfs diff=lfs merge=lfs -text +*.mpeg filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Audio +# --------------------------------------------------------------------------- +*.mp3 filter=lfs diff=lfs merge=lfs -text +*.wav filter=lfs diff=lfs merge=lfs -text +*.flac filter=lfs diff=lfs merge=lfs -text +*.aac filter=lfs diff=lfs merge=lfs -text +*.ogg filter=lfs diff=lfs merge=lfs -text +*.m4a filter=lfs diff=lfs merge=lfs -text +*.wma filter=lfs diff=lfs merge=lfs -text +*.aiff filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# 3D & Game Assets +# --------------------------------------------------------------------------- +*.fbx filter=lfs diff=lfs merge=lfs -text +*.obj filter=lfs diff=lfs merge=lfs -text +*.blend filter=lfs diff=lfs merge=lfs -text +*.dae filter=lfs diff=lfs merge=lfs -text +*.3ds filter=lfs diff=lfs merge=lfs -text +*.max filter=lfs diff=lfs merge=lfs -text +*.unity filter=lfs diff=lfs merge=lfs -text +*.unitypackage filter=lfs diff=lfs merge=lfs -text +*.uasset filter=lfs diff=lfs merge=lfs -text +*.umap filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Archives & Compressed Files +# --------------------------------------------------------------------------- +*.zip filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.7z filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Documents & Fonts +# --------------------------------------------------------------------------- +*.pdf filter=lfs diff=lfs merge=lfs -text +*.docx filter=lfs diff=lfs merge=lfs -text +*.xlsx filter=lfs diff=lfs merge=lfs -text +*.pptx filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.otf filter=lfs diff=lfs merge=lfs -text +*.woff filter=lfs diff=lfs merge=lfs -text +*.woff2 filter=lfs diff=lfs merge=lfs -text +*.eot filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Data & Machine Learning +# --------------------------------------------------------------------------- +*.parquet filter=lfs diff=lfs merge=lfs -text +*.hdf5 filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +*.gguf filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Databases +# --------------------------------------------------------------------------- +*.db filter=lfs diff=lfs merge=lfs -text +*.sqlite filter=lfs diff=lfs merge=lfs -text +*.sqlite3 filter=lfs diff=lfs merge=lfs -text +*.mdb filter=lfs diff=lfs merge=lfs -text +*.accdb filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Executables & Libraries +# --------------------------------------------------------------------------- +*.exe filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text +*.so filter=lfs diff=lfs merge=lfs -text +*.dylib filter=lfs diff=lfs merge=lfs -text +*.a filter=lfs diff=lfs merge=lfs -text +*.lib filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# Build Artifacts & Packages +# --------------------------------------------------------------------------- +*.jar filter=lfs diff=lfs merge=lfs -text +*.war filter=lfs diff=lfs merge=lfs -text +*.ear filter=lfs diff=lfs merge=lfs -text +*.apk filter=lfs diff=lfs merge=lfs -text +*.ipa filter=lfs diff=lfs merge=lfs -text +*.deb filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.dmg filter=lfs diff=lfs merge=lfs -text +*.iso filter=lfs diff=lfs merge=lfs -text +*.img filter=lfs diff=lfs merge=lfs -text + +# --------------------------------------------------------------------------- +# CAD & Scientific +# --------------------------------------------------------------------------- +*.dwg filter=lfs diff=lfs merge=lfs -text +*.dxf filter=lfs diff=lfs merge=lfs -text +*.step filter=lfs diff=lfs merge=lfs -text +*.stp filter=lfs diff=lfs merge=lfs -text +*.iges filter=lfs diff=lfs merge=lfs -text +*.stl filter=lfs diff=lfs merge=lfs -text +*.nc filter=lfs diff=lfs merge=lfs -text +*.mat filter=lfs diff=lfs merge=lfs -text diff --git a/DesignSystem/Design System for BookTalk/.gitignore b/DesignSystem/Design System for BookTalk/.gitignore new file mode 100644 index 0000000..d0cb07a --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.gitignore @@ -0,0 +1,21 @@ +node_modules/ +dist/ +build/ +.cache/ +.env* +.vite/ +vite.config.*.timestamp-* +*.tsbuildinfo +*-debug.log* +logs/ +*.log +.claude-replay.* +.tmp-* +/.figma/design-context/ + +# Platform-managed agentplat state, not project source. In the +# client-initiated single-repo workspace layout (make's `Path: "."` spec) the +# repo root IS the workspace root, so these land inside this repo rather than +# beside it. +/.plugins/ +/.opencode-skills/ diff --git a/DesignSystem/Design System for BookTalk/.mise.toml b/DesignSystem/Design System for BookTalk/.mise.toml new file mode 100644 index 0000000..4ea25bd --- /dev/null +++ b/DesignSystem/Design System for BookTalk/.mise.toml @@ -0,0 +1,3 @@ +[tools] +node = "22" +"npm:pnpm" = "10.34.3" diff --git a/DesignSystem/Design System for BookTalk/AGENTS.md b/DesignSystem/Design System for BookTalk/AGENTS.md new file mode 100644 index 0000000..753cd5f --- /dev/null +++ b/DesignSystem/Design System for BookTalk/AGENTS.md @@ -0,0 +1,41 @@ +# figma-make-app + +React + Vite + Tailwind CSS project running inside Figma Make. + +## Development Server + +A Vite development server is **already running** on `$PORT` (default 8443). You don't need to start it manually. + +- Preview URL: The user can access the running app through the preview panel +- Hot reload: Changes to source files are reflected immediately + +## Project Structure + +This is the canonical project structure. Start with task-relevant files below. Only follow imports or inspect other files when required, when a documented path is missing, or when the repository contradicts this guide. + +- `src/main.tsx` - React entrypoint; imports `src/index.css` and mounts `src/App.tsx` into the `#root` element +- `src/App.tsx` - Primary application component and the usual starting point for UI work +- `src/index.css` - Global CSS entrypoint and Tailwind CSS v4 import +- `index.html` - Vite HTML shell containing the `#root` element and loading `src/main.tsx` +- `package.json` - Project dependencies and the Vite build, development, preview, and formatting scripts +- `vite.config.ts` - Vite configuration with React, Tailwind CSS v4, and Figma Make plugins plus the `@` alias for `src` +- `.mise.toml` - Toolchain versions for Node.js and pnpm + +## Dependencies + +- Runtime: React 19 and React DOM 19 +- Styling: Tailwind CSS v4 with the `@tailwindcss/vite` plugin +- Build tooling: Vite 8, TypeScript 5.7, and `@vitejs/plugin-react` +- Formatting: oxfmt + +## Styling + +This project uses **Tailwind CSS v4** through the `@tailwindcss/vite` plugin configured in `vite.config.ts`. `src/index.css` imports Tailwind with `@import 'tailwindcss';`. Use Tailwind utility classes directly in JSX and put global CSS or Tailwind v4 theme customization in `src/index.css`. This scaffold does not need a Tailwind config file or PostCSS config. + +`src/main.tsx` imports `src/index.css`, so global font wiring belongs in `src/index.css`. Keep CSS `@import` statements first, then add any `@font-face` rules and font-family defaults there. + +## Code quality + +- Use double quotes for strings containing apostrophes (`"We're here to help"`), or escape them in single-quoted strings. An unescaped apostrophe in a single-quoted string breaks the build. +- Ensure JSX tags are closed and braces are balanced. +- Export components as default exports. diff --git a/DesignSystem/Design System for BookTalk/CLAUDE.md b/DesignSystem/Design System for BookTalk/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/DesignSystem/Design System for BookTalk/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/DesignSystem/Design System for BookTalk/index.html b/DesignSystem/Design System for BookTalk/index.html new file mode 100644 index 0000000..842acf7 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/index.html @@ -0,0 +1,16 @@ + + + + + + + <!-- figma:title --> + + + + +
+ + + + diff --git a/DesignSystem/Design System for BookTalk/package.json b/DesignSystem/Design System for BookTalk/package.json new file mode 100644 index 0000000..a326897 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/package.json @@ -0,0 +1,27 @@ +{ + "name": "figma-make-app", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "format": "oxfmt" + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^6.0.0", + "tailwindcss": "^4.0.0", + "@tailwindcss/vite": "^4.0.0", + "oxfmt": "^0.2.0", + "typescript": "^5.7.0", + "vite": "^8.0.5" + } +} diff --git a/DesignSystem/Design System for BookTalk/pnpm-lock.yaml b/DesignSystem/Design System for BookTalk/pnpm-lock.yaml new file mode 100644 index 0000000..e523420 --- /dev/null +++ b/DesignSystem/Design System for BookTalk/pnpm-lock.yaml @@ -0,0 +1,907 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + react: + specifier: ^19.0.0 + version: 19.2.4 + react-dom: + specifier: ^19.0.0 + version: 19.2.4(react@19.2.4) + devDependencies: + '@tailwindcss/vite': + specifier: ^4.0.0 + version: 4.2.2(vite@8.0.5(jiti@2.6.1)) + '@types/node': + specifier: ^22.0.0 + version: 22.19.17 + '@types/react': + specifier: ^19.0.0 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.0.0 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^6.0.0 + version: 6.0.1(vite@8.0.5(jiti@2.6.1)) + oxfmt: + specifier: ^0.2.0 + version: 0.2.0 + tailwindcss: + specifier: ^4.0.0 + version: 4.2.2 + typescript: + specifier: ^5.7.0 + version: 5.9.3 + vite: + specifier: ^8.0.5 + version: 8.0.5(jiti@2.6.1) + +packages: + + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + + '@oxc-project/types@0.122.0': + resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + + '@oxfmt/darwin-arm64@0.2.0': + resolution: {integrity: sha512-NK7iEPqRovUvKac+4dn2ui8v5Y5q6UJ9v4z5Zjr5lmEzTlBwXToP3TwY75IAaCYeu0g8Es7ToJpS7qCQuxUhuA==} + cpu: [arm64] + os: [darwin] + + '@oxfmt/darwin-x64@0.2.0': + resolution: {integrity: sha512-eXDgT+DbIMnA3sWE+w38rOvXaxkP4RvHi41rPpWb9XoRGbM+tOo0c8RYqCIX39n7PizOlbF/xUBh9nMhiW01wQ==} + cpu: [x64] + os: [darwin] + + '@oxfmt/linux-arm64-gnu@0.2.0': + resolution: {integrity: sha512-h4mw9/Lck5X/SU1RPE26VraoBJgn9SOoLl8GnaYvtmRBFHK0v+2KpnBSwMWeiaIxCdJSsrVc9mpKSOcPsen7Cg==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-arm64-musl@0.2.0': + resolution: {integrity: sha512-kDZ/kVCgh9kSczMH2gPXZs+rsY/VcCQ1BoQnND8D3v1Le91LceJ5s/a4XBBA3ADI3NiPdqNmK2ssaxY4BfgXDg==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-x64-gnu@0.2.0': + resolution: {integrity: sha512-qvf6cNuf4z3yjzjSvg4Jwr88jDyeFaYPU+4dBWVr6fdWhAA+BIuIvurJWYQGvWNNSkobVWH3A7m+wp+h5fNsSg==} + cpu: [x64] + os: [linux] + + '@oxfmt/linux-x64-musl@0.2.0': + resolution: {integrity: sha512-D0rw4BVLHEbtMB6p9e+Ph7Y/56oD1DRP4Qcbbv1B1w0kJanWBB3vMH+v2rqgeYsErqJOtLpYRkPFmJSU9In2HA==} + cpu: [x64] + os: [linux] + + '@oxfmt/win32-arm64@0.2.0': + resolution: {integrity: sha512-QM0fP8YUvBNyuNa6d+jNonV34A6zGvvQ2mX93wnERpX25jIbFKljKiKDiWo2M1nUsW8zL2z4ESEeaLO9bx8djg==} + cpu: [arm64] + os: [win32] + + '@oxfmt/win32-x64@0.2.0': + resolution: {integrity: sha512-WkFXliDbwFiziBSfvWXeM0Y3x07Kxxrl39kgsp+N3n5QgzsM8q6qe094+OW+hItDQ+9SSd2y9u231sMCsKxlog==} + cpu: [x64] + os: [win32] + + '@rolldown/binding-android-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.12': + resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': + resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.12': + resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.2.2': + resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/node@22.19.17': + resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + oxfmt@0.2.0: + resolution: {integrity: sha512-99bPAiYDiYikUej8U0Slv8pcFVbMe38Ulm+T6bJ4KQgm+UsbgTKCBpWxbD/LRz1CuYw3PRpqfPv6AkQsIAo3Ag==} + engines: {node: '>=8.*'} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + rolldown@1.0.0-rc.12: + resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + engines: {node: '>=6'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + vite@8.0.5: + resolution: {integrity: sha512-nmu43Qvq9UopTRfMx2jOYW5l16pb3iDC1JH6yMuPkpVbzK0k+L7dfsEDH4jRgYFmsg0sTAqkojoZgzLMlwHsCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + +snapshots: + + '@emnapi/core@1.9.1': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.122.0': {} + + '@oxfmt/darwin-arm64@0.2.0': + optional: true + + '@oxfmt/darwin-x64@0.2.0': + optional: true + + '@oxfmt/linux-arm64-gnu@0.2.0': + optional: true + + '@oxfmt/linux-arm64-musl@0.2.0': + optional: true + + '@oxfmt/linux-x64-gnu@0.2.0': + optional: true + + '@oxfmt/linux-x64-musl@0.2.0': + optional: true + + '@oxfmt/win32-arm64@0.2.0': + optional: true + + '@oxfmt/win32-x64@0.2.0': + optional: true + + '@rolldown/binding-android-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.12': {} + + '@rolldown/pluginutils@1.0.0-rc.7': {} + + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/vite@4.2.2(vite@8.0.5(jiti@2.6.1))': + dependencies: + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + tailwindcss: 4.2.2 + vite: 8.0.5(jiti@2.6.1) + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/node@22.19.17': + dependencies: + undici-types: 6.21.0 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@vitejs/plugin-react@6.0.1(vite@8.0.5(jiti@2.6.1))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.5(jiti@2.6.1) + + csstype@3.2.3: {} + + detect-libc@2.1.2: {} + + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.2 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fsevents@2.3.3: + optional: true + + graceful-fs@4.2.11: {} + + jiti@2.6.1: {} + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + nanoid@3.3.11: {} + + oxfmt@0.2.0: + optionalDependencies: + '@oxfmt/darwin-arm64': 0.2.0 + '@oxfmt/darwin-x64': 0.2.0 + '@oxfmt/linux-arm64-gnu': 0.2.0 + '@oxfmt/linux-arm64-musl': 0.2.0 + '@oxfmt/linux-x64-gnu': 0.2.0 + '@oxfmt/linux-x64-musl': 0.2.0 + '@oxfmt/win32-arm64': 0.2.0 + '@oxfmt/win32-x64': 0.2.0 + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react@19.2.4: {} + + rolldown@1.0.0-rc.12: + dependencies: + '@oxc-project/types': 0.122.0 + '@rolldown/pluginutils': 1.0.0-rc.12 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-x64': 1.0.0-rc.12 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 + + scheduler@0.27.0: {} + + source-map-js@1.2.1: {} + + tailwindcss@4.2.2: {} + + tapable@2.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tslib@2.8.1: + optional: true + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + vite@8.0.5(jiti@2.6.1): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.8 + rolldown: 1.0.0-rc.12 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.6.1 diff --git a/DesignSystem/Design System for BookTalk/src/App.tsx b/DesignSystem/Design System for BookTalk/src/App.tsx new file mode 100644 index 0000000..82f2e6b --- /dev/null +++ b/DesignSystem/Design System for BookTalk/src/App.tsx @@ -0,0 +1,329 @@ +import { useEffect, useRef, useState, type ReactNode } from "react"; + +type Screen = "landing" | "chat" | "voice" | "ended" | "link"; +type VoiceState = "connecting" | "listening" | "thinking" | "speaking" | "muted"; +type ChatState = "normal" | "streaming" | "error" | "limited" | "offline"; +type LinkState = "expired" | "not-ready" | "capacity"; +type IconName = "arrow" | "book" | "check" | "chevron" | "close" | "copy" | "dots" | "headphones" | "menu" | "mic" | "mic-off" | "moon" | "pause" | "refresh" | "search" | "send" | "stop" | "sun" | "thumb-down" | "thumb-up" | "volume" | "wifi" | "wifi-low"; + +const book = { + title: "The Practice of Better Days", + author: "Dr. Mara Ellison", + description: "A practical guide to building habits that make meaningful work feel easier.", +}; + +function Icon({ name, size = 20 }: { name: IconName; size?: number }) { + const paths: Record = { + arrow: <>, + book: <>, + check: , + chevron: , + close: <>, + copy: <>, + dots: <>, + headphones: <>, + menu: <>, + mic: <>, + "mic-off": <>, + moon: , + pause: <>, + refresh: <>, + search: <>, + send: <>, + stop: , + sun: <>, + "thumb-down": <>, + "thumb-up": <>, + volume: <>, + wifi: <>, + "wifi-low": <>, + }; + return ; +} + +function Button({ children, icon, variant = "primary", onClick, label, disabled }: { children?: ReactNode; icon?: IconName; variant?: "primary" | "secondary" | "ghost" | "icon" | "danger"; onClick?: () => void; label?: string; disabled?: boolean }) { + return ; +} + +function Cover({ small = false }: { small?: boolean }) { + return
+ THE PRACTICE OF + BETTER
DAYS
+ {!small && } + MARA ELLISON +
; +} + +function Citation({ label, passage }: { label: string; passage: string }) { + const [open, setOpen] = useState(false); + return + + {open && + PASSAGE PREVIEW + “{passage}” + + } + ; +} + +function ModeSwitch({ screen, go }: { screen: "chat" | "voice"; go: (screen: Screen) => void }) { + return
+ + +
; +} + +function BookHeader({ screen, go, dark, setDark, onEnd, setChatState }: { screen: "chat" | "voice"; go: (screen: Screen) => void; dark: boolean; setDark: (value: boolean) => void; onEnd: () => void; setChatState: (state: ChatState) => void }) { + const [menu, setMenu] = useState(false); + const [largeText, setLargeText] = useState(false); + return
+
{book.title}{book.author}
+
+ + + + {screen === "chat" &&
Preview states + + + +
} + +
} + + +
; +} + +function Landing({ go, setLinkState }: { go: (screen: Screen) => void; setLinkState: (state: LinkState) => void }) { + const [ready, setReady] = useState(false); + useEffect(() => { + const timeout = window.setTimeout(() => setReady(true), 1100); + return () => window.clearTimeout(timeout); + }, []); + return
+
+
+
+ A conversation with +

{book.title}

+

by {book.author}

+

{book.description}

+ {!ready ?
+ Creating a quiet space for your conversation… +
:
+
Your session is ready
+

Ask this book anything

+

No account needed. This conversation is private to this session.

+
+ + +
+
} +
+
+
+ Powered by BookTalk + +
+
; +} + +function AssistantAnswer() { + return
+

The book’s central idea is that sustainable productivity comes from making useful actions easier to begin, rather than demanding more willpower.

+

Ellison organizes this around three practical shifts:

+
  • Lower the friction of starting.
  • Shape your environment before relying on motivation.
  • Review systems weekly, without judging yourself.
+
“A habit becomes dependable when the path into it is shorter than the story you tell yourself about avoiding it.”
+

In short: design the conditions for a better day, then let repetition do the quiet work.

+
+ + +
+
+
; +} + +function Chat({ go, dark, setDark }: { go: (screen: Screen) => void; dark: boolean; setDark: (value: boolean) => void }) { + const [state, setState] = useState("normal"); + const [draft, setDraft] = useState(""); + const [asked, setAsked] = useState(false); + const [rail, setRail] = useState(true); + const endRef = useRef(null); + const starters = ["What is this book about?", "What are the chapters?", "Summarize chapter 2", "How do I make habits stick?", "What is a weekly reset?"]; + + const ask = (question = draft) => { + if (!question.trim()) return; + setDraft(""); + setAsked(true); + setState("streaming"); + window.setTimeout(() => setState("normal"), 1800); + window.setTimeout(() => endRef.current?.scrollIntoView({ behavior: "smooth" }), 100); + }; + + return
+ go("ended")} setChatState={setState} /> + {state === "offline" &&
You’re offline. Your messages will send when you reconnect.
} +
+
+
+
+
+

Hello. I’m {book.title}. Ask me about the ideas, examples, or exercises in these pages—and I’ll point you back to the relevant passages.

+
+ {!asked &&
+ A few places to begin +
{starters.map((starter) => )}
+
} +

{asked ? "What does the book say about making habits last?" : "I want to become more consistent without burning out. Where should I start?"}

+ + {asked && <>

What does the book say about making habits last?

+ {state === "streaming" ?
+
Searching the book…
+

Lasting habits begin with a reliable cue and a very small first step

+ +
: state === "error" ? { setState("streaming"); window.setTimeout(() => setState("normal"), 1600); }} /> + : state === "limited" ? go("ended")} /> + : }} +
+
+
+
+