diff --git a/.eslintcache b/.eslintcache new file mode 100644 index 000000000..73acc5a8b --- /dev/null +++ b/.eslintcache @@ -0,0 +1 @@ +[{"/Users/forestmars/sandbox/polyglot/coverage/block-navigation.js":"1","/Users/forestmars/sandbox/polyglot/coverage/prettify.js":"2","/Users/forestmars/sandbox/polyglot/coverage/sorter.js":"3","/Users/forestmars/sandbox/polyglot/eslint.config.js":"4","/Users/forestmars/sandbox/polyglot/notion/get-mcp-users.js":"5","/Users/forestmars/sandbox/polyglot/notion/get-users.js":"6","/Users/forestmars/sandbox/polyglot/notion/simple-tools.js":"7","/Users/forestmars/sandbox/polyglot/notion/test-notion-mcp-stdio.js":"8","/Users/forestmars/sandbox/polyglot/notion/test-notion-mcp.js":"9","/Users/forestmars/sandbox/polyglot/postcss.config.cjs":"10","/Users/forestmars/sandbox/polyglot/postcss.config.js":"11","/Users/forestmars/sandbox/polyglot/src/App.tsx":"12","/Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx":"13","/Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx":"14","/Users/forestmars/sandbox/polyglot/src/__tests__/components/SettingsPanel.test.tsx":"15","/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-mobile.test.tsx":"16","/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx":"17","/Users/forestmars/sandbox/polyglot/src/__tests__/services/mcpService.test.ts":"18","/Users/forestmars/sandbox/polyglot/src/__tests__/services/storage_test.ts":"19","/Users/forestmars/sandbox/polyglot/src/__tests__/utils/utils.test.ts":"20","/Users/forestmars/sandbox/polyglot/src/components/ChatInterface.tsx":"21","/Users/forestmars/sandbox/polyglot/src/components/ConversationSidebar.tsx":"22","/Users/forestmars/sandbox/polyglot/src/components/OllamaStatus.tsx":"23","/Users/forestmars/sandbox/polyglot/src/components/SettingsPanel.tsx":"24","/Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx":"25","/Users/forestmars/sandbox/polyglot/src/components/ui/accordion.tsx":"26","/Users/forestmars/sandbox/polyglot/src/components/ui/alert-dialog.tsx":"27","/Users/forestmars/sandbox/polyglot/src/components/ui/alert.tsx":"28","/Users/forestmars/sandbox/polyglot/src/components/ui/aspect-ratio.tsx":"29","/Users/forestmars/sandbox/polyglot/src/components/ui/avatar.tsx":"30","/Users/forestmars/sandbox/polyglot/src/components/ui/badge.tsx":"31","/Users/forestmars/sandbox/polyglot/src/components/ui/breadcrumb.tsx":"32","/Users/forestmars/sandbox/polyglot/src/components/ui/button.tsx":"33","/Users/forestmars/sandbox/polyglot/src/components/ui/calendar.tsx":"34","/Users/forestmars/sandbox/polyglot/src/components/ui/card.tsx":"35","/Users/forestmars/sandbox/polyglot/src/components/ui/carousel.tsx":"36","/Users/forestmars/sandbox/polyglot/src/components/ui/chart.tsx":"37","/Users/forestmars/sandbox/polyglot/src/components/ui/checkbox.tsx":"38","/Users/forestmars/sandbox/polyglot/src/components/ui/collapsible.tsx":"39","/Users/forestmars/sandbox/polyglot/src/components/ui/command.tsx":"40","/Users/forestmars/sandbox/polyglot/src/components/ui/context-menu.tsx":"41","/Users/forestmars/sandbox/polyglot/src/components/ui/dialog.tsx":"42","/Users/forestmars/sandbox/polyglot/src/components/ui/drawer.tsx":"43","/Users/forestmars/sandbox/polyglot/src/components/ui/dropdown-menu.tsx":"44","/Users/forestmars/sandbox/polyglot/src/components/ui/form.tsx":"45","/Users/forestmars/sandbox/polyglot/src/components/ui/hover-card.tsx":"46","/Users/forestmars/sandbox/polyglot/src/components/ui/input-otp.tsx":"47","/Users/forestmars/sandbox/polyglot/src/components/ui/input.tsx":"48","/Users/forestmars/sandbox/polyglot/src/components/ui/label.tsx":"49","/Users/forestmars/sandbox/polyglot/src/components/ui/menubar.tsx":"50","/Users/forestmars/sandbox/polyglot/src/components/ui/navigation-menu.tsx":"51","/Users/forestmars/sandbox/polyglot/src/components/ui/pagination.tsx":"52","/Users/forestmars/sandbox/polyglot/src/components/ui/popover.tsx":"53","/Users/forestmars/sandbox/polyglot/src/components/ui/progress.tsx":"54","/Users/forestmars/sandbox/polyglot/src/components/ui/radio-group.tsx":"55","/Users/forestmars/sandbox/polyglot/src/components/ui/resizable.tsx":"56","/Users/forestmars/sandbox/polyglot/src/components/ui/scroll-area.tsx":"57","/Users/forestmars/sandbox/polyglot/src/components/ui/select.tsx":"58","/Users/forestmars/sandbox/polyglot/src/components/ui/separator.tsx":"59","/Users/forestmars/sandbox/polyglot/src/components/ui/sheet.tsx":"60","/Users/forestmars/sandbox/polyglot/src/components/ui/sidebar.tsx":"61","/Users/forestmars/sandbox/polyglot/src/components/ui/skeleton.tsx":"62","/Users/forestmars/sandbox/polyglot/src/components/ui/slider.tsx":"63","/Users/forestmars/sandbox/polyglot/src/components/ui/sonner.tsx":"64","/Users/forestmars/sandbox/polyglot/src/components/ui/switch.tsx":"65","/Users/forestmars/sandbox/polyglot/src/components/ui/table.tsx":"66","/Users/forestmars/sandbox/polyglot/src/components/ui/tabs.tsx":"67","/Users/forestmars/sandbox/polyglot/src/components/ui/textarea.tsx":"68","/Users/forestmars/sandbox/polyglot/src/components/ui/toast.tsx":"69","/Users/forestmars/sandbox/polyglot/src/components/ui/toaster.tsx":"70","/Users/forestmars/sandbox/polyglot/src/components/ui/toggle-group.tsx":"71","/Users/forestmars/sandbox/polyglot/src/components/ui/toggle.tsx":"72","/Users/forestmars/sandbox/polyglot/src/components/ui/tooltip.tsx":"73","/Users/forestmars/sandbox/polyglot/src/components/ui/use-toast.ts":"74","/Users/forestmars/sandbox/polyglot/src/hooks/use-mobile.tsx":"75","/Users/forestmars/sandbox/polyglot/src/hooks/use-toast.ts":"76","/Users/forestmars/sandbox/polyglot/src/hooks/useConversationState.ts":"77","/Users/forestmars/sandbox/polyglot/src/hooks/useMcpTools.ts":"78","/Users/forestmars/sandbox/polyglot/src/hooks/useSettings.ts":"79","/Users/forestmars/sandbox/polyglot/src/lib/utils.ts":"80","/Users/forestmars/sandbox/polyglot/src/main.tsx":"81","/Users/forestmars/sandbox/polyglot/src/pages/Index.tsx":"82","/Users/forestmars/sandbox/polyglot/src/pages/NotFound.tsx":"83","/Users/forestmars/sandbox/polyglot/src/scripts/backupRagTable.ts":"84","/Users/forestmars/sandbox/polyglot/src/scripts/handelesndmessage-function.ts":"85","/Users/forestmars/sandbox/polyglot/src/scripts/ingestRagFolder.ts":"86","/Users/forestmars/sandbox/polyglot/src/scripts/migrations/0001-add-lastModified.ts":"87","/Users/forestmars/sandbox/polyglot/src/scripts/run-indexeddb-migrations.ts":"88","/Users/forestmars/sandbox/polyglot/src/scripts/test-embedding-dims.js":"89","/Users/forestmars/sandbox/polyglot/src/scripts/test-single-ingest.js":"90","/Users/forestmars/sandbox/polyglot/src/scripts/update-missing-embeddings.ts":"91","/Users/forestmars/sandbox/polyglot/src/server/chatStore.js":"92","/Users/forestmars/sandbox/polyglot/src/server/chatSyncApi.js":"93","/Users/forestmars/sandbox/polyglot/src/server/mcpDevApi.js":"94","/Users/forestmars/sandbox/polyglot/src/server/queryRag.ts":"95","/Users/forestmars/sandbox/polyglot/src/server/ragAPI.ts":"96","/Users/forestmars/sandbox/polyglot/src/services/SimpleStorageService.ts":"97","/Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts":"98","/Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts":"99","/Users/forestmars/sandbox/polyglot/src/services/api.ts":"100","/Users/forestmars/sandbox/polyglot/src/services/backgroundSync.ts":"101","/Users/forestmars/sandbox/polyglot/src/services/browserMigrations.ts":"102","/Users/forestmars/sandbox/polyglot/src/services/conversationStateManager.ts":"103","/Users/forestmars/sandbox/polyglot/src/services/conversationUtils.ts":"104","/Users/forestmars/sandbox/polyglot/src/services/indexedDbStorage.ts":"105","/Users/forestmars/sandbox/polyglot/src/services/mcpService.ts":"106","/Users/forestmars/sandbox/polyglot/src/services/messageRouter.ts":"107","/Users/forestmars/sandbox/polyglot/src/services/ollama.ts":"108","/Users/forestmars/sandbox/polyglot/src/services/providers/groq.ts":"109","/Users/forestmars/sandbox/polyglot/src/services/providers/mistral.ts":"110","/Users/forestmars/sandbox/polyglot/src/services/providers/openrouter.ts":"111","/Users/forestmars/sandbox/polyglot/src/services/providers/together.ts":"112","/Users/forestmars/sandbox/polyglot/src/services/rag/embeddings.ts":"113","/Users/forestmars/sandbox/polyglot/src/services/rag/loadFolder.ts":"114","/Users/forestmars/sandbox/polyglot/src/services/rag/qa.ts":"115","/Users/forestmars/sandbox/polyglot/src/services/rag/ragPipeline.ts":"116","/Users/forestmars/sandbox/polyglot/src/services/rag/retrieval.ts":"117","/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts":"118","/Users/forestmars/sandbox/polyglot/src/services/storage.ts":"119","/Users/forestmars/sandbox/polyglot/src/services/storage_test.ts":"120","/Users/forestmars/sandbox/polyglot/src/tests/mocks/api.ts":"121","/Users/forestmars/sandbox/polyglot/src/tests/mocks/providers.ts":"122","/Users/forestmars/sandbox/polyglot/src/tests/server/chatSync.unit.test.ts":"123","/Users/forestmars/sandbox/polyglot/src/tests/setup.ts":"124","/Users/forestmars/sandbox/polyglot/src/tests/utils.tsx":"125","/Users/forestmars/sandbox/polyglot/src/types/conversation.ts":"126","/Users/forestmars/sandbox/polyglot/src/utils/debugUtils.ts":"127","/Users/forestmars/sandbox/polyglot/src/utils/logger.ts":"128","/Users/forestmars/sandbox/polyglot/src/utils/recoverConversations.ts":"129","/Users/forestmars/sandbox/polyglot/src/vite-env.d.ts":"130","/Users/forestmars/sandbox/polyglot/tailwind.config.ts":"131","/Users/forestmars/sandbox/polyglot/test-embedding.js":"132","/Users/forestmars/sandbox/polyglot/test-embedding.mjs":"133","/Users/forestmars/sandbox/polyglot/tests/integration/mcpDayTool.integration.test.ts":"134","/Users/forestmars/sandbox/polyglot/tools/day-tool/day-server.js":"135","/Users/forestmars/sandbox/polyglot/tools/email-tool/server.ts":"136","/Users/forestmars/sandbox/polyglot/tools/email-tool/src/contacts.ts":"137","/Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts":"138","/Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.ts":"139","/Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts":"140","/Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.ts":"141","/Users/forestmars/sandbox/polyglot/tools/email-tool/src/schema.ts":"142","/Users/forestmars/sandbox/polyglot/vite.config.ts":"143","/Users/forestmars/sandbox/polyglot/vitest.config.ts":"144","/Users/forestmars/sandbox/polyglot/xyz/import useState, useRef, useEffect, us.ts":"145"},{"size":2636,"mtime":1763673963828,"results":"146","hashOfConfig":"147"},{"size":17571,"mtime":1763673963828,"results":"148","hashOfConfig":"147"},{"size":6712,"mtime":1763673963828,"results":"149","hashOfConfig":"147"},{"size":789,"mtime":1753943698000,"results":"150","hashOfConfig":"147"},{"size":3812,"mtime":1756851592415,"results":"151","hashOfConfig":"147"},{"size":1500,"mtime":1756851592415,"results":"152","hashOfConfig":"147"},{"size":1482,"mtime":1756851592416,"results":"153","hashOfConfig":"147"},{"size":2553,"mtime":1756851592417,"results":"154","hashOfConfig":"147"},{"size":2928,"mtime":1756851592417,"results":"155","hashOfConfig":"147"},{"size":82,"mtime":1763188781625,"results":"156","hashOfConfig":"157"},{"size":80,"mtime":1759465196404,"results":"158","hashOfConfig":"147"},{"size":2864,"mtime":1758159947581,"results":"159","hashOfConfig":"160"},{"size":3955,"mtime":1755905975934,"results":"161","hashOfConfig":"160"},{"size":4039,"mtime":1755905975935,"results":"162","hashOfConfig":"160"},{"size":2393,"mtime":1755905975936,"results":"163","hashOfConfig":"160"},{"size":5036,"mtime":1754446106417,"results":"164","hashOfConfig":"160"},{"size":7767,"mtime":1754547743886,"results":"165","hashOfConfig":"160"},{"size":3132,"mtime":1763670830352,"results":"166","hashOfConfig":"160"},{"size":1153,"mtime":1755905975936,"results":"167","hashOfConfig":"160"},{"size":2736,"mtime":1754446106413,"results":"168","hashOfConfig":"160"},{"size":29958,"mtime":1763458209935,"results":"169","hashOfConfig":"160"},{"size":20422,"mtime":1763188781627,"results":"170","hashOfConfig":"160"},{"size":3921,"mtime":1755711513434,"results":"171","hashOfConfig":"160"},{"size":19081,"mtime":1763188781627,"results":"172","hashOfConfig":"160"},{"size":4529,"mtime":1755905975940,"results":"173","hashOfConfig":"160"},{"size":1977,"mtime":1753943698000,"results":"174","hashOfConfig":"160"},{"size":4420,"mtime":1753943698000,"results":"175","hashOfConfig":"160"},{"size":1584,"mtime":1753943698000,"results":"176","hashOfConfig":"160"},{"size":140,"mtime":1753943698000,"results":"177","hashOfConfig":"160"},{"size":1405,"mtime":1753943698000,"results":"178","hashOfConfig":"160"},{"size":1128,"mtime":1753943698000,"results":"179","hashOfConfig":"160"},{"size":2701,"mtime":1753943698000,"results":"180","hashOfConfig":"160"},{"size":1901,"mtime":1753943698000,"results":"181","hashOfConfig":"160"},{"size":2620,"mtime":1753943698000,"results":"182","hashOfConfig":"160"},{"size":1877,"mtime":1753943698000,"results":"183","hashOfConfig":"160"},{"size":6210,"mtime":1753943698000,"results":"184","hashOfConfig":"160"},{"size":10466,"mtime":1753943698000,"results":"185","hashOfConfig":"160"},{"size":1056,"mtime":1753943698000,"results":"186","hashOfConfig":"160"},{"size":315,"mtime":1753943698000,"results":"187","hashOfConfig":"160"},{"size":4879,"mtime":1753943698000,"results":"188","hashOfConfig":"160"},{"size":7246,"mtime":1753943698000,"results":"189","hashOfConfig":"160"},{"size":3835,"mtime":1753943698000,"results":"190","hashOfConfig":"160"},{"size":3007,"mtime":1753943698000,"results":"191","hashOfConfig":"160"},{"size":7295,"mtime":1753943698000,"results":"192","hashOfConfig":"160"},{"size":4085,"mtime":1753943698000,"results":"193","hashOfConfig":"160"},{"size":1184,"mtime":1753943698000,"results":"194","hashOfConfig":"160"},{"size":2154,"mtime":1753943698000,"results":"195","hashOfConfig":"160"},{"size":791,"mtime":1753943698000,"results":"196","hashOfConfig":"160"},{"size":710,"mtime":1753943698000,"results":"197","hashOfConfig":"160"},{"size":7974,"mtime":1753943698000,"results":"198","hashOfConfig":"160"},{"size":5046,"mtime":1753943698000,"results":"199","hashOfConfig":"160"},{"size":2751,"mtime":1753943698000,"results":"200","hashOfConfig":"160"},{"size":1230,"mtime":1753943698000,"results":"201","hashOfConfig":"160"},{"size":777,"mtime":1753943698000,"results":"202","hashOfConfig":"160"},{"size":1467,"mtime":1753943698000,"results":"203","hashOfConfig":"160"},{"size":1709,"mtime":1753943698000,"results":"204","hashOfConfig":"160"},{"size":1642,"mtime":1753943698000,"results":"205","hashOfConfig":"160"},{"size":5615,"mtime":1753943698000,"results":"206","hashOfConfig":"160"},{"size":756,"mtime":1753943698000,"results":"207","hashOfConfig":"160"},{"size":4250,"mtime":1753943698000,"results":"208","hashOfConfig":"160"},{"size":23367,"mtime":1753943698000,"results":"209","hashOfConfig":"160"},{"size":261,"mtime":1753943698000,"results":"210","hashOfConfig":"160"},{"size":1077,"mtime":1753943698000,"results":"211","hashOfConfig":"160"},{"size":894,"mtime":1753943698000,"results":"212","hashOfConfig":"160"},{"size":1139,"mtime":1753943698000,"results":"213","hashOfConfig":"160"},{"size":2765,"mtime":1753943698000,"results":"214","hashOfConfig":"160"},{"size":1883,"mtime":1753943698000,"results":"215","hashOfConfig":"160"},{"size":772,"mtime":1753943698000,"results":"216","hashOfConfig":"160"},{"size":4845,"mtime":1753943698000,"results":"217","hashOfConfig":"160"},{"size":772,"mtime":1753943698000,"results":"218","hashOfConfig":"160"},{"size":1739,"mtime":1753943698000,"results":"219","hashOfConfig":"160"},{"size":1435,"mtime":1753943698000,"results":"220","hashOfConfig":"160"},{"size":1145,"mtime":1753943698000,"results":"221","hashOfConfig":"160"},{"size":82,"mtime":1753943698000,"results":"222","hashOfConfig":"160"},{"size":565,"mtime":1753943698000,"results":"223","hashOfConfig":"160"},{"size":3895,"mtime":1753943698000,"results":"224","hashOfConfig":"160"},{"size":4071,"mtime":1758159947582,"results":"225","hashOfConfig":"160"},{"size":232,"mtime":1756853925902,"results":"226","hashOfConfig":"160"},{"size":6590,"mtime":1755905975941,"results":"227","hashOfConfig":"160"},{"size":166,"mtime":1753943698000,"results":"228","hashOfConfig":"160"},{"size":460,"mtime":1763188781628,"results":"229","hashOfConfig":"160"},{"size":137,"mtime":1753943698000,"results":"230","hashOfConfig":"160"},{"size":739,"mtime":1753943698000,"results":"231","hashOfConfig":"160"},{"size":3340,"mtime":1756518814910,"results":"232","hashOfConfig":"160"},{"size":2934,"mtime":1755905994861,"results":"233","hashOfConfig":"160"},{"size":11942,"mtime":1756518814910,"results":"234","hashOfConfig":"160"},{"size":1902,"mtime":1758159947583,"results":"235","hashOfConfig":"160"},{"size":4318,"mtime":1758159947583,"results":"236","hashOfConfig":"160"},{"size":861,"mtime":1755905994862,"results":"237","hashOfConfig":"147"},{"size":1902,"mtime":1755905994862,"results":"238","hashOfConfig":"147"},{"size":2487,"mtime":1755905994862,"results":"239","hashOfConfig":"160"},{"size":1901,"mtime":1763414320295,"results":"240","hashOfConfig":"147"},{"size":3829,"mtime":1763518622455,"results":"241","hashOfConfig":"147"},{"size":2544,"mtime":1763188831015,"results":"242","hashOfConfig":"147"},{"size":4667,"mtime":1755905994863,"results":"243","hashOfConfig":"160"},{"size":3037,"mtime":1755905994863,"results":"244","hashOfConfig":"160"},{"size":6531,"mtime":1755905975947,"results":"245","hashOfConfig":"160"},{"size":12855,"mtime":1755905975948,"results":"246","hashOfConfig":"160"},{"size":5888,"mtime":1755905975948,"results":"247","hashOfConfig":"160"},{"size":11522,"mtime":1763439933109,"results":"248","hashOfConfig":"160"},{"size":6540,"mtime":1763188781630,"results":"249","hashOfConfig":"160"},{"size":1062,"mtime":1758159947586,"results":"250","hashOfConfig":"160"},{"size":21820,"mtime":1763188831016,"results":"251","hashOfConfig":"160"},{"size":5229,"mtime":1755905975950,"results":"252","hashOfConfig":"160"},{"size":11720,"mtime":1763673963828,"results":"253","hashOfConfig":"160"},{"size":13142,"mtime":1763439933110,"results":"254","hashOfConfig":"160"},{"size":1126,"mtime":1756860936778,"results":"255","hashOfConfig":"160"},{"size":3500,"mtime":1756239976375,"results":"256","hashOfConfig":"160"},{"size":1510,"mtime":1755905975950,"results":"257","hashOfConfig":"160"},{"size":1609,"mtime":1763188781632,"results":"258","hashOfConfig":"160"},{"size":1411,"mtime":1755905975951,"results":"259","hashOfConfig":"160"},{"size":1524,"mtime":1755905975951,"results":"260","hashOfConfig":"160"},{"size":1134,"mtime":1756239976376,"results":"261","hashOfConfig":"160"},{"size":2197,"mtime":1755905994865,"results":"262","hashOfConfig":"160"},{"size":316,"mtime":1755905994865,"results":"263","hashOfConfig":"160"},{"size":707,"mtime":1755905994865,"results":"264","hashOfConfig":"160"},{"size":593,"mtime":1763188781632,"results":"265","hashOfConfig":"160"},{"size":8523,"mtime":1763673963828,"results":"266","hashOfConfig":"160"},{"size":5909,"mtime":1755905994866,"results":"267","hashOfConfig":"160"},{"size":1180,"mtime":1755905975955,"results":"268","hashOfConfig":"160"},{"size":672,"mtime":1763518622455,"results":"269","hashOfConfig":"160"},{"size":1948,"mtime":1763518622455,"results":"270","hashOfConfig":"160"},{"size":4384,"mtime":1763518622455,"results":"271","hashOfConfig":"160"},{"size":988,"mtime":1763518622455,"results":"272","hashOfConfig":"160"},{"size":900,"mtime":1763518622456,"results":"273","hashOfConfig":"160"},{"size":1292,"mtime":1763176576952,"results":"274","hashOfConfig":"160"},{"size":4501,"mtime":1758159947586,"results":"275","hashOfConfig":"160"},{"size":2765,"mtime":1755905975956,"results":"276","hashOfConfig":"160"},{"size":2053,"mtime":1755905975956,"results":"277","hashOfConfig":"160"},{"size":38,"mtime":1753943698000,"results":"278","hashOfConfig":"160"},{"size":2348,"mtime":1753943698000,"results":"279","hashOfConfig":"160"},{"size":393,"mtime":1756239976376,"results":"280","hashOfConfig":"147"},{"size":393,"mtime":1756239976376,"results":"281","hashOfConfig":"147"},{"size":3378,"mtime":1763534166569,"results":"282","hashOfConfig":"160"},{"size":944,"mtime":1763188831019,"results":"283","hashOfConfig":"147"},{"size":2445,"mtime":1763448069624,"results":"284","hashOfConfig":"160"},{"size":4297,"mtime":1763454373139,"results":"285","hashOfConfig":"160"},{"size":497,"mtime":1763188831021,"results":"286","hashOfConfig":"160"},{"size":2203,"mtime":1763670830356,"results":"287","hashOfConfig":"160"},{"size":364,"mtime":1763188831022,"results":"288","hashOfConfig":"160"},{"size":2157,"mtime":1763188831022,"results":"289","hashOfConfig":"160"},{"size":354,"mtime":1763454373140,"results":"290","hashOfConfig":"160"},{"size":636,"mtime":1763532113566,"results":"291","hashOfConfig":"160"},{"size":663,"mtime":1763518622456,"results":"292","hashOfConfig":"160"},{"size":21916,"mtime":1756239976377,"results":"293","hashOfConfig":"160"},{"filePath":"294","messages":"295","suppressedMessages":"296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"46zxqt",{"filePath":"297","messages":"298","suppressedMessages":"299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"300","messages":"301","suppressedMessages":"302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"303","messages":"304","suppressedMessages":"305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"306","messages":"307","suppressedMessages":"308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"309","messages":"310","suppressedMessages":"311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"312","messages":"313","suppressedMessages":"314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"315","messages":"316","suppressedMessages":"317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"318","messages":"319","suppressedMessages":"320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"321","messages":"322","suppressedMessages":"323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"bcifey",{"filePath":"324","messages":"325","suppressedMessages":"326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"327","messages":"328","suppressedMessages":"329","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"1hjy8oo",{"filePath":"330","messages":"331","suppressedMessages":"332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"333","messages":"334","suppressedMessages":"335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"336","messages":"337","suppressedMessages":"338","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"339","messages":"340","suppressedMessages":"341","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"342","messages":"343","suppressedMessages":"344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"345","messages":"346","suppressedMessages":"347","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"348","messages":"349","suppressedMessages":"350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"351","messages":"352","suppressedMessages":"353","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"354","messages":"355","suppressedMessages":"356","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"357","messages":"358","suppressedMessages":"359","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"360","messages":"361","suppressedMessages":"362","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"363","messages":"364","suppressedMessages":"365","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"366","messages":"367","suppressedMessages":"368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"369","messages":"370","suppressedMessages":"371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"372","messages":"373","suppressedMessages":"374","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"375","messages":"376","suppressedMessages":"377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"378","messages":"379","suppressedMessages":"380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"381","messages":"382","suppressedMessages":"383","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"384","messages":"385","suppressedMessages":"386","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"387","messages":"388","suppressedMessages":"389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"390","messages":"391","suppressedMessages":"392","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"393","messages":"394","suppressedMessages":"395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"396","messages":"397","suppressedMessages":"398","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"399","messages":"400","suppressedMessages":"401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"402","messages":"403","suppressedMessages":"404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"405","messages":"406","suppressedMessages":"407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"408","messages":"409","suppressedMessages":"410","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"411","messages":"412","suppressedMessages":"413","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"414","messages":"415","suppressedMessages":"416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"417","messages":"418","suppressedMessages":"419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"420","messages":"421","suppressedMessages":"422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"423","messages":"424","suppressedMessages":"425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"426","messages":"427","suppressedMessages":"428","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"429","messages":"430","suppressedMessages":"431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"432","messages":"433","suppressedMessages":"434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"435","messages":"436","suppressedMessages":"437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"438","messages":"439","suppressedMessages":"440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"441","messages":"442","suppressedMessages":"443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"444","messages":"445","suppressedMessages":"446","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"447","messages":"448","suppressedMessages":"449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"450","messages":"451","suppressedMessages":"452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"453","messages":"454","suppressedMessages":"455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"456","messages":"457","suppressedMessages":"458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"459","messages":"460","suppressedMessages":"461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"462","messages":"463","suppressedMessages":"464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"465","messages":"466","suppressedMessages":"467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"468","messages":"469","suppressedMessages":"470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"471","messages":"472","suppressedMessages":"473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"474","messages":"475","suppressedMessages":"476","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"477","messages":"478","suppressedMessages":"479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"480","messages":"481","suppressedMessages":"482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"483","messages":"484","suppressedMessages":"485","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"486","messages":"487","suppressedMessages":"488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"489","messages":"490","suppressedMessages":"491","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"492","messages":"493","suppressedMessages":"494","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"495","messages":"496","suppressedMessages":"497","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"498","messages":"499","suppressedMessages":"500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"501","messages":"502","suppressedMessages":"503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"504","messages":"505","suppressedMessages":"506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"507","messages":"508","suppressedMessages":"509","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"510","messages":"511","suppressedMessages":"512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"513","messages":"514","suppressedMessages":"515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"516","messages":"517","suppressedMessages":"518","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"519","messages":"520","suppressedMessages":"521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"522","messages":"523","suppressedMessages":"524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"525","messages":"526","suppressedMessages":"527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"528","messages":"529","suppressedMessages":"530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"531","messages":"532","suppressedMessages":"533","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"534","messages":"535","suppressedMessages":"536","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"537","messages":"538","suppressedMessages":"539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"540","messages":"541","suppressedMessages":"542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"543","messages":"544","suppressedMessages":"545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"546","messages":"547","suppressedMessages":"548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"549","messages":"550","suppressedMessages":"551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"552","messages":"553","suppressedMessages":"554","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"555","messages":"556","suppressedMessages":"557","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"558","messages":"559","suppressedMessages":"560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"561","messages":"562","suppressedMessages":"563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"564","messages":"565","suppressedMessages":"566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"567","messages":"568","suppressedMessages":"569","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"570","messages":"571","suppressedMessages":"572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"573","messages":"574","suppressedMessages":"575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"576","messages":"577","suppressedMessages":"578","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"579","messages":"580","suppressedMessages":"581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"582","messages":"583","suppressedMessages":"584","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"585","messages":"586","suppressedMessages":"587","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"588","messages":"589","suppressedMessages":"590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"591","messages":"592","suppressedMessages":"593","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"594","messages":"595","suppressedMessages":"596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"597","messages":"598","suppressedMessages":"599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"600","messages":"601","suppressedMessages":"602","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"603","messages":"604","suppressedMessages":"605","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"606","messages":"607","suppressedMessages":"608","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"609","messages":"610","suppressedMessages":"611","errorCount":15,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"612","messages":"613","suppressedMessages":"614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"615","messages":"616","suppressedMessages":"617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"618","messages":"619","suppressedMessages":"620","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"621","messages":"622","suppressedMessages":"623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"624","messages":"625","suppressedMessages":"626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"627","messages":"628","suppressedMessages":"629","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"630","messages":"631","suppressedMessages":"632","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"633","messages":"634","suppressedMessages":"635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"636","messages":"637","suppressedMessages":"638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"639","messages":"640","suppressedMessages":"641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"642","messages":"643","suppressedMessages":"644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"645","messages":"646","suppressedMessages":"647","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"648","messages":"649","suppressedMessages":"650","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"651","messages":"652","suppressedMessages":"653","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"654","messages":"655","suppressedMessages":"656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"657","messages":"658","suppressedMessages":"659","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"660","messages":"661","suppressedMessages":"662","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"663","messages":"664","suppressedMessages":"665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"666","messages":"667","suppressedMessages":"668","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"669","messages":"670","suppressedMessages":"671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"672","messages":"673","suppressedMessages":"674","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"675","messages":"676","suppressedMessages":"677","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"678","messages":"679","suppressedMessages":"680","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"681","messages":"682","suppressedMessages":"683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"684","messages":"685","suppressedMessages":"686","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"687","messages":"688","suppressedMessages":"689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"690","messages":"691","suppressedMessages":"692","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"693","messages":"694","suppressedMessages":"695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"696","messages":"697","suppressedMessages":"698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"699","messages":"700","suppressedMessages":"701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"702","messages":"703","suppressedMessages":"704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"705","messages":"706","suppressedMessages":"707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"708","messages":"709","suppressedMessages":"710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"711","messages":"712","suppressedMessages":"713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"714","messages":"715","suppressedMessages":"716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"717","messages":"718","suppressedMessages":"719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"720","messages":"721","suppressedMessages":"722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"723","messages":"724","suppressedMessages":"725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"726","messages":"727","suppressedMessages":"728","errorCount":1,"fatalErrorCount":1,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"/Users/forestmars/sandbox/polyglot/coverage/block-navigation.js",[],[],"/Users/forestmars/sandbox/polyglot/coverage/prettify.js",[],[],"/Users/forestmars/sandbox/polyglot/coverage/sorter.js",[],[],"/Users/forestmars/sandbox/polyglot/eslint.config.js",[],[],"/Users/forestmars/sandbox/polyglot/notion/get-mcp-users.js",[],[],"/Users/forestmars/sandbox/polyglot/notion/get-users.js",[],[],"/Users/forestmars/sandbox/polyglot/notion/simple-tools.js",[],[],"/Users/forestmars/sandbox/polyglot/notion/test-notion-mcp-stdio.js",[],[],"/Users/forestmars/sandbox/polyglot/notion/test-notion-mcp.js",[],[],"/Users/forestmars/sandbox/polyglot/postcss.config.cjs",[],[],"/Users/forestmars/sandbox/polyglot/postcss.config.js",[],[],"/Users/forestmars/sandbox/polyglot/src/App.tsx",["729","730","731"],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/components/SettingsPanel.test.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-mobile.test.tsx",["732"],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/services/mcpService.test.ts",["733","734","735","736","737","738","739","740","741","742"],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/services/storage_test.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/__tests__/utils/utils.test.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ChatInterface.tsx",["743"],[],"/Users/forestmars/sandbox/polyglot/src/components/ConversationSidebar.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/OllamaStatus.tsx",["744"],[],"/Users/forestmars/sandbox/polyglot/src/components/SettingsPanel.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/accordion.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/alert-dialog.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/alert.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/aspect-ratio.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/avatar.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/badge.tsx",["745"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/breadcrumb.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/button.tsx",["746"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/calendar.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/card.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/carousel.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/chart.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/checkbox.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/collapsible.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/command.tsx",["747"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/context-menu.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/dialog.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/drawer.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/dropdown-menu.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/form.tsx",["748"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/hover-card.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/input-otp.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/input.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/label.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/menubar.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/navigation-menu.tsx",["749"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/pagination.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/popover.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/progress.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/radio-group.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/resizable.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/scroll-area.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/select.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/separator.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/sheet.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/sidebar.tsx",["750"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/skeleton.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/slider.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/sonner.tsx",["751"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/switch.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/table.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/tabs.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/textarea.tsx",["752"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/toast.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/toaster.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/toggle-group.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/toggle.tsx",["753"],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/tooltip.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/components/ui/use-toast.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/hooks/use-mobile.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/hooks/use-toast.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/hooks/useConversationState.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/hooks/useMcpTools.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/hooks/useSettings.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/lib/utils.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/main.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/pages/Index.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/pages/NotFound.tsx",[],[],"/Users/forestmars/sandbox/polyglot/src/scripts/backupRagTable.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/scripts/handelesndmessage-function.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/scripts/ingestRagFolder.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/scripts/migrations/0001-add-lastModified.ts",["754","755","756","757","758","759","760"],[],"/Users/forestmars/sandbox/polyglot/src/scripts/run-indexeddb-migrations.ts",["761","762","763","764"],[],"/Users/forestmars/sandbox/polyglot/src/scripts/test-embedding-dims.js",[],[],"/Users/forestmars/sandbox/polyglot/src/scripts/test-single-ingest.js",[],[],"/Users/forestmars/sandbox/polyglot/src/scripts/update-missing-embeddings.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/server/chatStore.js",[],[],"/Users/forestmars/sandbox/polyglot/src/server/chatSyncApi.js",[],[],"/Users/forestmars/sandbox/polyglot/src/server/mcpDevApi.js",[],[],"/Users/forestmars/sandbox/polyglot/src/server/queryRag.ts",["765"],[],"/Users/forestmars/sandbox/polyglot/src/server/ragAPI.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/SimpleStorageService.ts",["766"],[],"/Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts",["767","768","769"],[],"/Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/api.ts",["770","771","772","773","774","775"],[],"/Users/forestmars/sandbox/polyglot/src/services/backgroundSync.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/browserMigrations.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/conversationStateManager.ts",["776"],[],"/Users/forestmars/sandbox/polyglot/src/services/conversationUtils.ts",["777"],[],"/Users/forestmars/sandbox/polyglot/src/services/indexedDbStorage.ts",["778","779","780"],[],"/Users/forestmars/sandbox/polyglot/src/services/mcpService.ts",["781","782","783","784","785","786","787","788","789","790","791","792","793","794","795"],[],"/Users/forestmars/sandbox/polyglot/src/services/messageRouter.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/ollama.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/providers/groq.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/providers/mistral.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/providers/openrouter.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/providers/together.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/rag/embeddings.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/rag/loadFolder.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/rag/qa.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/rag/ragPipeline.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/rag/retrieval.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts",["796","797","798","799","800"],[],"/Users/forestmars/sandbox/polyglot/src/services/storage.ts",["801"],[],"/Users/forestmars/sandbox/polyglot/src/services/storage_test.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/tests/mocks/api.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/tests/mocks/providers.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/tests/server/chatSync.unit.test.ts",["802","803","804","805","806"],[],"/Users/forestmars/sandbox/polyglot/src/tests/setup.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/tests/utils.tsx",["807","808"],[],"/Users/forestmars/sandbox/polyglot/src/types/conversation.ts",[],[],"/Users/forestmars/sandbox/polyglot/src/utils/debugUtils.ts",["809","810"],[],"/Users/forestmars/sandbox/polyglot/src/utils/logger.ts",["811"],[],"/Users/forestmars/sandbox/polyglot/src/utils/recoverConversations.ts",["812"],[],"/Users/forestmars/sandbox/polyglot/src/vite-env.d.ts",[],[],"/Users/forestmars/sandbox/polyglot/tailwind.config.ts",["813"],[],"/Users/forestmars/sandbox/polyglot/test-embedding.js",[],[],"/Users/forestmars/sandbox/polyglot/test-embedding.mjs",[],[],"/Users/forestmars/sandbox/polyglot/tests/integration/mcpDayTool.integration.test.ts",[],[],"/Users/forestmars/sandbox/polyglot/tools/day-tool/day-server.js",[],[],"/Users/forestmars/sandbox/polyglot/tools/email-tool/server.ts",[],[],"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/contacts.ts",[],[],"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts",[],[],"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.ts",[],[],"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts",[],[],"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.ts",[],[],"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/schema.ts",[],[],"/Users/forestmars/sandbox/polyglot/vite.config.ts",[],[],"/Users/forestmars/sandbox/polyglot/vitest.config.ts",[],[],"/Users/forestmars/sandbox/polyglot/xyz/import useState, useRef, useEffect, us.ts",["814"],[],{"ruleId":"815","severity":2,"message":"816","line":21,"column":20,"nodeType":"817","messageId":"818","endLine":21,"endColumn":28},{"ruleId":"819","severity":2,"message":"820","line":21,"column":44,"nodeType":"821","messageId":"822","endLine":21,"endColumn":47,"suggestions":"823"},{"ruleId":"819","severity":2,"message":"820","line":21,"column":82,"nodeType":"821","messageId":"822","endLine":21,"endColumn":85,"suggestions":"824"},{"ruleId":"819","severity":2,"message":"820","line":7,"column":22,"nodeType":"821","messageId":"822","endLine":7,"endColumn":25,"suggestions":"825"},{"ruleId":"819","severity":2,"message":"820","line":20,"column":11,"nodeType":"821","messageId":"822","endLine":20,"endColumn":14,"suggestions":"826"},{"ruleId":"819","severity":2,"message":"820","line":25,"column":22,"nodeType":"821","messageId":"822","endLine":25,"endColumn":25,"suggestions":"827"},{"ruleId":"819","severity":2,"message":"820","line":27,"column":23,"nodeType":"821","messageId":"822","endLine":27,"endColumn":26,"suggestions":"828"},{"ruleId":"819","severity":2,"message":"820","line":28,"column":13,"nodeType":"821","messageId":"822","endLine":28,"endColumn":16,"suggestions":"829"},{"ruleId":"830","severity":2,"message":"831","line":68,"column":5,"nodeType":"832","messageId":"833","endLine":68,"endColumn":45,"suggestions":"834"},{"ruleId":"819","severity":2,"message":"820","line":69,"column":41,"nodeType":"821","messageId":"822","endLine":69,"endColumn":44,"suggestions":"835"},{"ruleId":"830","severity":2,"message":"831","line":74,"column":5,"nodeType":"832","messageId":"833","endLine":74,"endColumn":18,"suggestions":"836"},{"ruleId":"819","severity":2,"message":"820","line":75,"column":23,"nodeType":"821","messageId":"822","endLine":75,"endColumn":26,"suggestions":"837"},{"ruleId":"830","severity":2,"message":"831","line":76,"column":5,"nodeType":"832","messageId":"833","endLine":76,"endColumn":18,"suggestions":"838"},{"ruleId":"819","severity":2,"message":"820","line":77,"column":23,"nodeType":"821","messageId":"822","endLine":77,"endColumn":26,"suggestions":"839"},{"ruleId":"819","severity":2,"message":"820","line":174,"column":51,"nodeType":"821","messageId":"822","endLine":174,"endColumn":54,"suggestions":"840"},{"ruleId":"819","severity":2,"message":"820","line":30,"column":44,"nodeType":"821","messageId":"822","endLine":30,"endColumn":47,"suggestions":"841"},{"ruleId":"842","severity":1,"message":"843","line":36,"column":17,"nodeType":"817","messageId":"844","endLine":36,"endColumn":30},{"ruleId":"842","severity":1,"message":"843","line":56,"column":18,"nodeType":"817","messageId":"844","endLine":56,"endColumn":32},{"ruleId":"845","severity":2,"message":"846","line":24,"column":11,"nodeType":"817","messageId":"847","endLine":24,"endColumn":29,"suggestions":"848"},{"ruleId":"842","severity":1,"message":"843","line":168,"column":3,"nodeType":"817","messageId":"844","endLine":168,"endColumn":15},{"ruleId":"842","severity":1,"message":"843","line":119,"column":3,"nodeType":"817","messageId":"844","endLine":119,"endColumn":29},{"ruleId":"842","severity":1,"message":"843","line":760,"column":3,"nodeType":"817","messageId":"844","endLine":760,"endColumn":13},{"ruleId":"842","severity":1,"message":"843","line":29,"column":19,"nodeType":"817","messageId":"844","endLine":29,"endColumn":24},{"ruleId":"845","severity":2,"message":"846","line":5,"column":18,"nodeType":"817","messageId":"847","endLine":5,"endColumn":31,"suggestions":"849"},{"ruleId":"842","severity":1,"message":"843","line":43,"column":18,"nodeType":"817","messageId":"844","endLine":43,"endColumn":32},{"ruleId":"819","severity":2,"message":"820","line":10,"column":37,"nodeType":"821","messageId":"822","endLine":10,"endColumn":40,"suggestions":"850"},{"ruleId":"819","severity":2,"message":"820","line":11,"column":48,"nodeType":"821","messageId":"822","endLine":11,"endColumn":51,"suggestions":"851"},{"ruleId":"819","severity":2,"message":"820","line":24,"column":38,"nodeType":"821","messageId":"822","endLine":24,"endColumn":41,"suggestions":"852"},{"ruleId":"819","severity":2,"message":"820","line":31,"column":37,"nodeType":"821","messageId":"822","endLine":31,"endColumn":40,"suggestions":"853"},{"ruleId":"819","severity":2,"message":"820","line":32,"column":18,"nodeType":"821","messageId":"822","endLine":32,"endColumn":21,"suggestions":"854"},{"ruleId":"819","severity":2,"message":"820","line":32,"column":39,"nodeType":"821","messageId":"822","endLine":32,"endColumn":42,"suggestions":"855"},{"ruleId":"819","severity":2,"message":"820","line":41,"column":39,"nodeType":"821","messageId":"822","endLine":41,"endColumn":42,"suggestions":"856"},{"ruleId":"819","severity":2,"message":"820","line":61,"column":36,"nodeType":"821","messageId":"822","endLine":61,"endColumn":39,"suggestions":"857"},{"ruleId":"819","severity":2,"message":"820","line":73,"column":22,"nodeType":"821","messageId":"822","endLine":73,"endColumn":25,"suggestions":"858"},{"ruleId":"819","severity":2,"message":"820","line":90,"column":31,"nodeType":"821","messageId":"822","endLine":90,"endColumn":34,"suggestions":"859"},{"ruleId":"819","severity":2,"message":"820","line":101,"column":18,"nodeType":"821","messageId":"822","endLine":101,"endColumn":21,"suggestions":"860"},{"ruleId":"815","severity":2,"message":"816","line":57,"column":75,"nodeType":"817","messageId":"818","endLine":57,"endColumn":83},{"ruleId":"819","severity":2,"message":"820","line":120,"column":52,"nodeType":"821","messageId":"822","endLine":120,"endColumn":55,"suggestions":"861"},{"ruleId":"819","severity":2,"message":"820","line":142,"column":67,"nodeType":"821","messageId":"822","endLine":142,"endColumn":70,"suggestions":"862"},{"ruleId":"819","severity":2,"message":"820","line":161,"column":27,"nodeType":"821","messageId":"822","endLine":161,"endColumn":30,"suggestions":"863"},{"ruleId":"819","severity":2,"message":"820","line":231,"column":19,"nodeType":"821","messageId":"822","endLine":231,"endColumn":22,"suggestions":"864"},{"ruleId":"865","severity":2,"message":"866","line":64,"column":11,"nodeType":"817","messageId":"867","endLine":64,"endColumn":19},{"ruleId":"865","severity":2,"message":"868","line":64,"column":21,"nodeType":"817","messageId":"867","endLine":64,"endColumn":26},{"ruleId":"865","severity":2,"message":"869","line":64,"column":38,"nodeType":"817","messageId":"867","endLine":64,"endColumn":45},{"ruleId":"819","severity":2,"message":"820","line":73,"column":28,"nodeType":"821","messageId":"822","endLine":73,"endColumn":31,"suggestions":"870"},{"ruleId":"871","severity":2,"message":"872","line":76,"column":17,"nodeType":"873","messageId":"874","endLine":76,"endColumn":19,"suggestions":"875"},{"ruleId":"876","severity":2,"message":"877","line":347,"column":9,"nodeType":"878","messageId":"874","endLine":347,"endColumn":89,"suggestions":"879"},{"ruleId":"819","severity":2,"message":"820","line":27,"column":27,"nodeType":"821","messageId":"822","endLine":27,"endColumn":30,"suggestions":"880"},{"ruleId":"819","severity":2,"message":"820","line":161,"column":45,"nodeType":"821","messageId":"822","endLine":161,"endColumn":48,"suggestions":"881"},{"ruleId":"819","severity":2,"message":"820","line":32,"column":18,"nodeType":"821","messageId":"822","endLine":32,"endColumn":21,"suggestions":"882"},{"ruleId":"819","severity":2,"message":"820","line":75,"column":39,"nodeType":"821","messageId":"822","endLine":75,"endColumn":42,"suggestions":"883"},{"ruleId":"819","severity":2,"message":"820","line":83,"column":49,"nodeType":"821","messageId":"822","endLine":83,"endColumn":52,"suggestions":"884"},{"ruleId":"819","severity":2,"message":"820","line":19,"column":84,"nodeType":"821","messageId":"822","endLine":19,"endColumn":87,"suggestions":"885"},{"ruleId":"819","severity":2,"message":"820","line":38,"column":79,"nodeType":"821","messageId":"822","endLine":38,"endColumn":82,"suggestions":"886"},{"ruleId":"819","severity":2,"message":"820","line":44,"column":88,"nodeType":"821","messageId":"822","endLine":44,"endColumn":91,"suggestions":"887"},{"ruleId":"819","severity":2,"message":"820","line":56,"column":89,"nodeType":"821","messageId":"822","endLine":56,"endColumn":92,"suggestions":"888"},{"ruleId":"819","severity":2,"message":"820","line":61,"column":79,"nodeType":"821","messageId":"822","endLine":61,"endColumn":82,"suggestions":"889"},{"ruleId":"819","severity":2,"message":"820","line":67,"column":86,"nodeType":"821","messageId":"822","endLine":67,"endColumn":89,"suggestions":"890"},{"ruleId":"819","severity":2,"message":"820","line":107,"column":82,"nodeType":"821","messageId":"822","endLine":107,"endColumn":85,"suggestions":"891"},{"ruleId":"819","severity":2,"message":"820","line":108,"column":57,"nodeType":"821","messageId":"822","endLine":108,"endColumn":60,"suggestions":"892"},{"ruleId":"819","severity":2,"message":"820","line":112,"column":85,"nodeType":"821","messageId":"822","endLine":112,"endColumn":88,"suggestions":"893"},{"ruleId":"819","severity":2,"message":"820","line":112,"column":165,"nodeType":"821","messageId":"822","endLine":112,"endColumn":168,"suggestions":"894"},{"ruleId":"871","severity":2,"message":"872","line":131,"column":43,"nodeType":"873","messageId":"874","endLine":131,"endColumn":45,"suggestions":"895"},{"ruleId":"819","severity":2,"message":"820","line":274,"column":54,"nodeType":"821","messageId":"822","endLine":274,"endColumn":57,"suggestions":"896"},{"ruleId":"819","severity":2,"message":"820","line":276,"column":59,"nodeType":"821","messageId":"822","endLine":276,"endColumn":62,"suggestions":"897"},{"ruleId":"819","severity":2,"message":"820","line":343,"column":56,"nodeType":"821","messageId":"822","endLine":343,"endColumn":59,"suggestions":"898"},{"ruleId":"819","severity":2,"message":"820","line":344,"column":16,"nodeType":"821","messageId":"822","endLine":344,"endColumn":19,"suggestions":"899"},{"ruleId":"819","severity":2,"message":"820","line":212,"column":38,"nodeType":"821","messageId":"822","endLine":212,"endColumn":41,"suggestions":"900"},{"ruleId":"819","severity":2,"message":"820","line":213,"column":20,"nodeType":"821","messageId":"822","endLine":213,"endColumn":23,"suggestions":"901"},{"ruleId":"819","severity":2,"message":"820","line":224,"column":60,"nodeType":"821","messageId":"822","endLine":224,"endColumn":63,"suggestions":"902"},{"ruleId":"819","severity":2,"message":"820","line":236,"column":44,"nodeType":"821","messageId":"822","endLine":236,"endColumn":47,"suggestions":"903"},{"ruleId":"819","severity":2,"message":"820","line":256,"column":37,"nodeType":"821","messageId":"822","endLine":256,"endColumn":40,"suggestions":"904"},{"ruleId":"819","severity":2,"message":"820","line":74,"column":43,"nodeType":"821","messageId":"822","endLine":74,"endColumn":46,"suggestions":"905"},{"ruleId":"819","severity":2,"message":"820","line":23,"column":22,"nodeType":"821","messageId":"822","endLine":23,"endColumn":25,"suggestions":"906"},{"ruleId":"819","severity":2,"message":"820","line":24,"column":19,"nodeType":"821","messageId":"822","endLine":24,"endColumn":22,"suggestions":"907"},{"ruleId":"819","severity":2,"message":"820","line":54,"column":58,"nodeType":"821","messageId":"822","endLine":54,"endColumn":61,"suggestions":"908"},{"ruleId":"819","severity":2,"message":"820","line":70,"column":14,"nodeType":"821","messageId":"822","endLine":70,"endColumn":17,"suggestions":"909"},{"ruleId":"819","severity":2,"message":"820","line":125,"column":56,"nodeType":"821","messageId":"822","endLine":125,"endColumn":59,"suggestions":"910"},{"ruleId":"842","severity":1,"message":"911","line":7,"column":7,"nodeType":"817","messageId":"912","endLine":7,"endColumn":22},{"ruleId":"842","severity":1,"message":"913","line":31,"column":1,"nodeType":"914","messageId":"915","endLine":31,"endColumn":39},{"ruleId":"819","severity":2,"message":"820","line":81,"column":59,"nodeType":"821","messageId":"822","endLine":81,"endColumn":62,"suggestions":"916"},{"ruleId":"819","severity":2,"message":"820","line":115,"column":16,"nodeType":"821","messageId":"822","endLine":115,"endColumn":19,"suggestions":"917"},{"ruleId":"819","severity":2,"message":"820","line":10,"column":18,"nodeType":"821","messageId":"822","endLine":10,"endColumn":21,"suggestions":"918"},{"ruleId":"830","severity":2,"message":"831","line":51,"column":3,"nodeType":"832","messageId":"833","endLine":51,"endColumn":48,"suggestions":"919"},{"ruleId":"920","severity":2,"message":"921","line":95,"column":12,"nodeType":"922","messageId":"923","endLine":95,"endColumn":42},{"ruleId":null,"nodeType":null,"fatal":true,"severity":2,"message":"924","line":429,"column":9},"@typescript-eslint/no-unsafe-function-type","The `Function` type accepts any function-like value.\nPrefer explicitly defining any function parameters and return type.","Identifier","bannedFunctionType","@typescript-eslint/no-explicit-any","Unexpected any. Specify a different type.","TSAnyKeyword","unexpectedAny",["925","926"],["927","928"],["929","930"],["931","932"],["933","934"],["935","936"],["937","938"],"@typescript-eslint/ban-ts-comment","Use \"@ts-expect-error\" instead of \"@ts-ignore\", as \"@ts-ignore\" will do nothing if the following line is error-free.","Line","tsIgnoreInsteadOfExpectError",["939"],["940","941"],["942"],["943","944"],["945"],["946","947"],["948","949"],["950","951"],"react-refresh/only-export-components","Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components.","namedExport","@typescript-eslint/no-empty-object-type","An interface declaring no members is equivalent to its supertype.","noEmptyInterfaceWithSuper",["952"],["953"],["954","955"],["956","957"],["958","959"],["960","961"],["962","963"],["964","965"],["966","967"],["968","969"],["970","971"],["972","973"],["974","975"],["976","977"],["978","979"],["980","981"],["982","983"],"prefer-const","'provider' is never reassigned. Use 'const' instead.","useConst","'model' is never reassigned. Use 'const' instead.","'baseUrl' is never reassigned. Use 'const' instead.",["984","985"],"no-empty","Empty block statement.","BlockStatement","unexpected",["986"],"no-case-declarations","Unexpected lexical declaration in case block.","VariableDeclaration",["987"],["988","989"],["990","991"],["992","993"],["994","995"],["996","997"],["998","999"],["1000","1001"],["1002","1003"],["1004","1005"],["1006","1007"],["1008","1009"],["1010","1011"],["1012","1013"],["1014","1015"],["1016","1017"],["1018"],["1019","1020"],["1021","1022"],["1023","1024"],["1025","1026"],["1027","1028"],["1029","1030"],["1031","1032"],["1033","1034"],["1035","1036"],["1037","1038"],["1039","1040"],["1041","1042"],["1043","1044"],["1045","1046"],["1047","1048"],"Fast refresh only works when a file only exports components. Move your component(s) to a separate file.","localComponents","This rule can't verify that `export *` only exports components.","ExportAllDeclaration","exportAll",["1049","1050"],["1051","1052"],["1053","1054"],["1055"],"@typescript-eslint/no-require-imports","A `require()` style import is forbidden.","CallExpression","noRequireImports","Parsing error: '>' expected.",{"messageId":"1056","fix":"1057","desc":"1058"},{"messageId":"1059","fix":"1060","desc":"1061"},{"messageId":"1056","fix":"1062","desc":"1058"},{"messageId":"1059","fix":"1063","desc":"1061"},{"messageId":"1056","fix":"1064","desc":"1058"},{"messageId":"1059","fix":"1065","desc":"1061"},{"messageId":"1056","fix":"1066","desc":"1058"},{"messageId":"1059","fix":"1067","desc":"1061"},{"messageId":"1056","fix":"1068","desc":"1058"},{"messageId":"1059","fix":"1069","desc":"1061"},{"messageId":"1056","fix":"1070","desc":"1058"},{"messageId":"1059","fix":"1071","desc":"1061"},{"messageId":"1056","fix":"1072","desc":"1058"},{"messageId":"1059","fix":"1073","desc":"1061"},{"messageId":"1074","fix":"1075","desc":"1076"},{"messageId":"1056","fix":"1077","desc":"1058"},{"messageId":"1059","fix":"1078","desc":"1061"},{"messageId":"1074","fix":"1079","desc":"1076"},{"messageId":"1056","fix":"1080","desc":"1058"},{"messageId":"1059","fix":"1081","desc":"1061"},{"messageId":"1074","fix":"1082","desc":"1076"},{"messageId":"1056","fix":"1083","desc":"1058"},{"messageId":"1059","fix":"1084","desc":"1061"},{"messageId":"1056","fix":"1085","desc":"1058"},{"messageId":"1059","fix":"1086","desc":"1061"},{"messageId":"1056","fix":"1087","desc":"1058"},{"messageId":"1059","fix":"1088","desc":"1061"},{"messageId":"1089","fix":"1090","desc":"1091"},{"messageId":"1089","fix":"1092","desc":"1091"},{"messageId":"1056","fix":"1093","desc":"1058"},{"messageId":"1059","fix":"1094","desc":"1061"},{"messageId":"1056","fix":"1095","desc":"1058"},{"messageId":"1059","fix":"1096","desc":"1061"},{"messageId":"1056","fix":"1097","desc":"1058"},{"messageId":"1059","fix":"1098","desc":"1061"},{"messageId":"1056","fix":"1099","desc":"1058"},{"messageId":"1059","fix":"1100","desc":"1061"},{"messageId":"1056","fix":"1101","desc":"1058"},{"messageId":"1059","fix":"1102","desc":"1061"},{"messageId":"1056","fix":"1103","desc":"1058"},{"messageId":"1059","fix":"1104","desc":"1061"},{"messageId":"1056","fix":"1105","desc":"1058"},{"messageId":"1059","fix":"1106","desc":"1061"},{"messageId":"1056","fix":"1107","desc":"1058"},{"messageId":"1059","fix":"1108","desc":"1061"},{"messageId":"1056","fix":"1109","desc":"1058"},{"messageId":"1059","fix":"1110","desc":"1061"},{"messageId":"1056","fix":"1111","desc":"1058"},{"messageId":"1059","fix":"1112","desc":"1061"},{"messageId":"1056","fix":"1113","desc":"1058"},{"messageId":"1059","fix":"1114","desc":"1061"},{"messageId":"1056","fix":"1115","desc":"1058"},{"messageId":"1059","fix":"1116","desc":"1061"},{"messageId":"1056","fix":"1117","desc":"1058"},{"messageId":"1059","fix":"1118","desc":"1061"},{"messageId":"1056","fix":"1119","desc":"1058"},{"messageId":"1059","fix":"1120","desc":"1061"},{"messageId":"1056","fix":"1121","desc":"1058"},{"messageId":"1059","fix":"1122","desc":"1061"},{"messageId":"1056","fix":"1123","desc":"1058"},{"messageId":"1059","fix":"1124","desc":"1061"},{"messageId":"1125","data":"1126","fix":"1127","desc":"1128"},{"messageId":"1129","fix":"1130","desc":"1131"},{"messageId":"1056","fix":"1132","desc":"1058"},{"messageId":"1059","fix":"1133","desc":"1061"},{"messageId":"1056","fix":"1134","desc":"1058"},{"messageId":"1059","fix":"1135","desc":"1061"},{"messageId":"1056","fix":"1136","desc":"1058"},{"messageId":"1059","fix":"1137","desc":"1061"},{"messageId":"1056","fix":"1138","desc":"1058"},{"messageId":"1059","fix":"1139","desc":"1061"},{"messageId":"1056","fix":"1140","desc":"1058"},{"messageId":"1059","fix":"1141","desc":"1061"},{"messageId":"1056","fix":"1142","desc":"1058"},{"messageId":"1059","fix":"1143","desc":"1061"},{"messageId":"1056","fix":"1144","desc":"1058"},{"messageId":"1059","fix":"1145","desc":"1061"},{"messageId":"1056","fix":"1146","desc":"1058"},{"messageId":"1059","fix":"1147","desc":"1061"},{"messageId":"1056","fix":"1148","desc":"1058"},{"messageId":"1059","fix":"1149","desc":"1061"},{"messageId":"1056","fix":"1150","desc":"1058"},{"messageId":"1059","fix":"1151","desc":"1061"},{"messageId":"1056","fix":"1152","desc":"1058"},{"messageId":"1059","fix":"1153","desc":"1061"},{"messageId":"1056","fix":"1154","desc":"1058"},{"messageId":"1059","fix":"1155","desc":"1061"},{"messageId":"1056","fix":"1156","desc":"1058"},{"messageId":"1059","fix":"1157","desc":"1061"},{"messageId":"1056","fix":"1158","desc":"1058"},{"messageId":"1059","fix":"1159","desc":"1061"},{"messageId":"1056","fix":"1160","desc":"1058"},{"messageId":"1059","fix":"1161","desc":"1061"},{"messageId":"1125","data":"1162","fix":"1163","desc":"1128"},{"messageId":"1056","fix":"1164","desc":"1058"},{"messageId":"1059","fix":"1165","desc":"1061"},{"messageId":"1056","fix":"1166","desc":"1058"},{"messageId":"1059","fix":"1167","desc":"1061"},{"messageId":"1056","fix":"1168","desc":"1058"},{"messageId":"1059","fix":"1169","desc":"1061"},{"messageId":"1056","fix":"1170","desc":"1058"},{"messageId":"1059","fix":"1171","desc":"1061"},{"messageId":"1056","fix":"1172","desc":"1058"},{"messageId":"1059","fix":"1173","desc":"1061"},{"messageId":"1056","fix":"1174","desc":"1058"},{"messageId":"1059","fix":"1175","desc":"1061"},{"messageId":"1056","fix":"1176","desc":"1058"},{"messageId":"1059","fix":"1177","desc":"1061"},{"messageId":"1056","fix":"1178","desc":"1058"},{"messageId":"1059","fix":"1179","desc":"1061"},{"messageId":"1056","fix":"1180","desc":"1058"},{"messageId":"1059","fix":"1181","desc":"1061"},{"messageId":"1056","fix":"1182","desc":"1058"},{"messageId":"1059","fix":"1183","desc":"1061"},{"messageId":"1056","fix":"1184","desc":"1058"},{"messageId":"1059","fix":"1185","desc":"1061"},{"messageId":"1056","fix":"1186","desc":"1058"},{"messageId":"1059","fix":"1187","desc":"1061"},{"messageId":"1056","fix":"1188","desc":"1058"},{"messageId":"1059","fix":"1189","desc":"1061"},{"messageId":"1056","fix":"1190","desc":"1058"},{"messageId":"1059","fix":"1191","desc":"1061"},{"messageId":"1056","fix":"1192","desc":"1058"},{"messageId":"1059","fix":"1193","desc":"1061"},{"messageId":"1056","fix":"1194","desc":"1058"},{"messageId":"1059","fix":"1195","desc":"1061"},{"messageId":"1056","fix":"1196","desc":"1058"},{"messageId":"1059","fix":"1197","desc":"1061"},{"messageId":"1056","fix":"1198","desc":"1058"},{"messageId":"1059","fix":"1199","desc":"1061"},{"messageId":"1074","fix":"1200","desc":"1076"},"suggestUnknown",{"range":"1201","text":"1202"},"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct.","suggestNever",{"range":"1203","text":"1204"},"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of.",{"range":"1205","text":"1202"},{"range":"1206","text":"1204"},{"range":"1207","text":"1202"},{"range":"1208","text":"1204"},{"range":"1209","text":"1202"},{"range":"1210","text":"1204"},{"range":"1211","text":"1202"},{"range":"1212","text":"1204"},{"range":"1213","text":"1202"},{"range":"1214","text":"1204"},{"range":"1215","text":"1202"},{"range":"1216","text":"1204"},"replaceTsIgnoreWithTsExpectError",{"range":"1217","text":"1218"},"Replace \"@ts-ignore\" with \"@ts-expect-error\".",{"range":"1219","text":"1202"},{"range":"1220","text":"1204"},{"range":"1221","text":"1222"},{"range":"1223","text":"1202"},{"range":"1224","text":"1204"},{"range":"1225","text":"1222"},{"range":"1226","text":"1202"},{"range":"1227","text":"1204"},{"range":"1228","text":"1202"},{"range":"1229","text":"1204"},{"range":"1230","text":"1202"},{"range":"1231","text":"1204"},"replaceEmptyInterfaceWithSuper",{"range":"1232","text":"1233"},"Replace empty interface with a type alias.",{"range":"1234","text":"1235"},{"range":"1236","text":"1202"},{"range":"1237","text":"1204"},{"range":"1238","text":"1202"},{"range":"1239","text":"1204"},{"range":"1240","text":"1202"},{"range":"1241","text":"1204"},{"range":"1242","text":"1202"},{"range":"1243","text":"1204"},{"range":"1244","text":"1202"},{"range":"1245","text":"1204"},{"range":"1246","text":"1202"},{"range":"1247","text":"1204"},{"range":"1248","text":"1202"},{"range":"1249","text":"1204"},{"range":"1250","text":"1202"},{"range":"1251","text":"1204"},{"range":"1252","text":"1202"},{"range":"1253","text":"1204"},{"range":"1254","text":"1202"},{"range":"1255","text":"1204"},{"range":"1256","text":"1202"},{"range":"1257","text":"1204"},{"range":"1258","text":"1202"},{"range":"1259","text":"1204"},{"range":"1260","text":"1202"},{"range":"1261","text":"1204"},{"range":"1262","text":"1202"},{"range":"1263","text":"1204"},{"range":"1264","text":"1202"},{"range":"1265","text":"1204"},{"range":"1266","text":"1202"},{"range":"1267","text":"1204"},"suggestComment",{"type":"1268"},{"range":"1269","text":"1270"},"Add comment inside empty block statement.","addBrackets",{"range":"1271","text":"1272"},"Add {} brackets around the case block.",{"range":"1273","text":"1202"},{"range":"1274","text":"1204"},{"range":"1275","text":"1202"},{"range":"1276","text":"1204"},{"range":"1277","text":"1202"},{"range":"1278","text":"1204"},{"range":"1279","text":"1202"},{"range":"1280","text":"1204"},{"range":"1281","text":"1202"},{"range":"1282","text":"1204"},{"range":"1283","text":"1202"},{"range":"1284","text":"1204"},{"range":"1285","text":"1202"},{"range":"1286","text":"1204"},{"range":"1287","text":"1202"},{"range":"1288","text":"1204"},{"range":"1289","text":"1202"},{"range":"1290","text":"1204"},{"range":"1291","text":"1202"},{"range":"1292","text":"1204"},{"range":"1293","text":"1202"},{"range":"1294","text":"1204"},{"range":"1295","text":"1202"},{"range":"1296","text":"1204"},{"range":"1297","text":"1202"},{"range":"1298","text":"1204"},{"range":"1299","text":"1202"},{"range":"1300","text":"1204"},{"range":"1301","text":"1202"},{"range":"1302","text":"1204"},{"type":"1268"},{"range":"1303","text":"1270"},{"range":"1304","text":"1202"},{"range":"1305","text":"1204"},{"range":"1306","text":"1202"},{"range":"1307","text":"1204"},{"range":"1308","text":"1202"},{"range":"1309","text":"1204"},{"range":"1310","text":"1202"},{"range":"1311","text":"1204"},{"range":"1312","text":"1202"},{"range":"1313","text":"1204"},{"range":"1314","text":"1202"},{"range":"1315","text":"1204"},{"range":"1316","text":"1202"},{"range":"1317","text":"1204"},{"range":"1318","text":"1202"},{"range":"1319","text":"1204"},{"range":"1320","text":"1202"},{"range":"1321","text":"1204"},{"range":"1322","text":"1202"},{"range":"1323","text":"1204"},{"range":"1324","text":"1202"},{"range":"1325","text":"1204"},{"range":"1326","text":"1202"},{"range":"1327","text":"1204"},{"range":"1328","text":"1202"},{"range":"1329","text":"1204"},{"range":"1330","text":"1202"},{"range":"1331","text":"1204"},{"range":"1332","text":"1202"},{"range":"1333","text":"1204"},{"range":"1334","text":"1202"},{"range":"1335","text":"1204"},{"range":"1336","text":"1202"},{"range":"1337","text":"1204"},{"range":"1338","text":"1202"},{"range":"1339","text":"1204"},{"range":"1340","text":"1341"},[810,813],"unknown",[810,813],"never",[848,851],[848,851],[266,269],[266,269],[745,748],[745,748],[861,864],[861,864],[975,978],[975,978],[1015,1018],[1015,1018],[2101,2141],"// @ts-expect-error - replace global WebSocket",[2182,2185],[2182,2185],[2241,2254],"// @ts-expect-error",[2277,2280],[2277,2280],[2296,2309],[2332,2335],[2332,2335],[5034,5037],[5034,5037],[1108,1111],[1108,1111],[701,752],"type CommandDialogProps = DialogProps",[73,159],"type TextareaProps = React.TextareaHTMLAttributes",[449,452],[449,452],[530,533],[530,533],[1027,1030],[1027,1030],[1324,1327],[1324,1327],[1375,1378],[1375,1378],[1396,1399],[1396,1399],[1856,1859],[1856,1859],[2244,2247],[2244,2247],[2831,2834],[2831,2834],[3295,3298],[3295,3298],[3820,3823],[3820,3823],[4175,4178],[4175,4178],[4505,4508],[4505,4508],[5178,5181],[5178,5181],[7458,7461],[7458,7461],[2528,2531],[2528,2531],"block",[2633,2633]," /* empty */ ",[11077,11207],"{ const ollamaService = baseUrl ? new OllamaService(baseUrl) : this.ollamaService;\n return await ollamaService.healthCheck(); }",[767,770],[767,770],[4212,4215],[4212,4215],[702,705],[702,705],[1897,1900],[1897,1900],[2250,2253],[2250,2253],[502,505],[502,505],[1382,1385],[1382,1385],[1782,1785],[1782,1785],[2333,2336],[2333,2336],[2618,2621],[2618,2621],[3006,3009],[3006,3009],[4819,4822],[4819,4822],[4919,4922],[4919,4922],[5181,5184],[5181,5184],[5261,5264],[5261,5264],[6157,6157],[10746,10749],[10746,10749],[10844,10847],[10844,10847],[12900,12903],[12900,12903],[12951,12954],[12951,12954],[5671,5674],[5671,5674],[5710,5713],[5710,5713],[6232,6235],[6232,6235],[6429,6432],[6429,6432],[7083,7086],[7083,7086],[2704,2707],[2704,2707],[758,761],[758,761],[814,817],[814,817],[1715,1718],[1715,1718],[2297,2300],[2297,2300],[3821,3824],[3821,3824],[2620,2623],[2620,2623],[3673,3676],[3673,3676],[163,166],[163,166],[1872,1917],"// @ts-expect-error - This is for browser execution"] \ No newline at end of file diff --git a/bun.lock b/bun.lock index 3fed7255d..68fc5f407 100644 --- a/bun.lock +++ b/bun.lock @@ -74,7 +74,7 @@ "@types/supertest": "^6.0.3", "@types/ws": "^8.18.1", "@vitejs/plugin-react-swc": "^4.1.0", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "^4.0.12", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.21", "eslint": "^9.36.0", @@ -92,7 +92,7 @@ "typescript": "^5.9.3", "typescript-eslint": "^8.45.0", "vite": "^7.1.9", - "vitest": "^3.2.4", + "vitest": "^4.0.12", }, }, }, @@ -103,8 +103,6 @@ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - "@asamuzakjp/css-color": ["@asamuzakjp/css-color@4.0.5", "", { "dependencies": { "@csstools/css-calc": "^2.1.4", "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "lru-cache": "^11.2.1" } }, "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ=="], "@asamuzakjp/dom-selector": ["@asamuzakjp/dom-selector@6.7.4", "", { "dependencies": { "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.1.0", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.2.2" } }, "sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA=="], @@ -253,8 +251,6 @@ "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], @@ -561,23 +557,23 @@ "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@4.2.2", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-beta.47", "@swc/core": "^1.13.5" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7" } }, "sha512-x+rE6tsxq/gxrEJN3Nv3dIV60lFflPj94c90b+NNo6n1QV1QQUTLoL0MpaOVasUZ0zqVBn7ead1B5ecx1JAGfA=="], - "@vitest/coverage-v8": ["@vitest/coverage-v8@3.2.4", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", "ast-v8-to-istanbul": "^0.3.3", "debug": "^4.4.1", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", "magic-string": "^0.30.17", "magicast": "^0.3.5", "std-env": "^3.9.0", "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" }, "peerDependencies": { "@vitest/browser": "3.2.4", "vitest": "3.2.4" }, "optionalPeers": ["@vitest/browser"] }, "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ=="], + "@vitest/coverage-v8": ["@vitest/coverage-v8@4.0.12", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.0.12", "ast-v8-to-istanbul": "^0.3.8", "debug": "^4.4.3", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.2.0", "magicast": "^0.5.1", "std-env": "^3.10.0", "tinyrainbow": "^3.0.3" }, "peerDependencies": { "@vitest/browser": "4.0.12", "vitest": "4.0.12" }, "optionalPeers": ["@vitest/browser"] }, "sha512-d+w9xAFJJz6jyJRU4BUU7MH409Ush7FWKNkxJU+jASKg6WX33YT0zc+YawMR1JesMWt9QRFQY/uAD3BTn23FaA=="], - "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + "@vitest/expect": ["@vitest/expect@4.0.12", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.12", "@vitest/utils": "4.0.12", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-is+g0w8V3/ZhRNrRizrJNr8PFQKwYmctWlU4qg8zy5r9aIV5w8IxXLlfbbxJCwSpsVl2PXPTm2/zruqTqz3QSg=="], - "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + "@vitest/mocker": ["@vitest/mocker@4.0.12", "", { "dependencies": { "@vitest/spy": "4.0.12", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-GsmA/tD5Ht3RUFoz41mZsMU1AXch3lhmgbTnoSPTdH231g7S3ytNN1aU0bZDSyxWs8WA7KDyMPD5L4q6V6vj9w=="], - "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + "@vitest/pretty-format": ["@vitest/pretty-format@4.0.12", "", { "dependencies": { "tinyrainbow": "^3.0.3" } }, "sha512-R7nMAcnienG17MvRN8TPMJiCG8rrZJblV9mhT7oMFdBXvS0x+QD6S1G4DxFusR2E0QIS73f7DqSR1n87rrmE+g=="], - "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + "@vitest/runner": ["@vitest/runner@4.0.12", "", { "dependencies": { "@vitest/utils": "4.0.12", "pathe": "^2.0.3" } }, "sha512-hDlCIJWuwlcLumfukPsNfPDOJokTv79hnOlf11V+n7E14rHNPz0Sp/BO6h8sh9qw4/UjZiKyYpVxK2ZNi+3ceQ=="], - "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + "@vitest/snapshot": ["@vitest/snapshot@4.0.12", "", { "dependencies": { "@vitest/pretty-format": "4.0.12", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-2jz9zAuBDUSbnfyixnyOd1S2YDBrZO23rt1bicAb6MA/ya5rHdKFRikPIDpBj/Dwvh6cbImDmudegnDAkHvmRQ=="], - "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + "@vitest/spy": ["@vitest/spy@4.0.12", "", {}, "sha512-GZjI9PPhiOYNX8Nsyqdw7JQB+u0BptL5fSnXiottAUBHlcMzgADV58A7SLTXXQwcN1yZ6gfd1DH+2bqjuUlCzw=="], "@vitest/ui": ["@vitest/ui@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", "sirv": "^3.0.1", "tinyglobby": "^0.2.14", "tinyrainbow": "^2.0.0" }, "peerDependencies": { "vitest": "3.2.4" } }, "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA=="], - "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + "@vitest/utils": ["@vitest/utils@4.0.12", "", { "dependencies": { "@vitest/pretty-format": "4.0.12", "tinyrainbow": "^3.0.3" } }, "sha512-DVS/TLkLdvGvj1avRy0LSmKfrcI9MNFvNGN6ECjTUHWJdlcgPDOXhjMis5Dh7rBH62nAmSXnkPbE+DZ5YD75Rw=="], "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], @@ -643,8 +639,6 @@ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], @@ -655,12 +649,10 @@ "caniuse-lite": ["caniuse-lite@1.0.30001755", "", {}, "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA=="], - "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], + "chai": ["chai@6.2.1", "", {}, "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], - "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], @@ -747,8 +739,6 @@ "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], - "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], @@ -1037,7 +1027,7 @@ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], + "magicast": ["magicast@0.5.1", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "source-map-js": "^1.2.1" } }, "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw=="], "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], @@ -1141,8 +1131,6 @@ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "pathval": ["pathval@2.0.1", "", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="], - "pg": ["pg@8.16.3", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.3", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw=="], "pg-cloudflare": ["pg-cloudflare@1.2.7", "", {}, "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg=="], @@ -1325,8 +1313,6 @@ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], - "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], "superagent": ["superagent@10.2.3", "", { "dependencies": { "component-emitter": "^1.3.1", "cookiejar": "^2.1.4", "debug": "^4.3.7", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.4", "formidable": "^3.5.4", "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.2" } }, "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig=="], @@ -1345,8 +1331,6 @@ "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], - "test-exclude": ["test-exclude@7.0.1", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^9.0.4" } }, "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg=="], - "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], @@ -1359,11 +1343,7 @@ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], - - "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], - - "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="], + "tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], "tldts": ["tldts@7.0.18", "", { "dependencies": { "tldts-core": "^7.0.18" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-lCcgTAgMxQ1JKOWrVGo6E69Ukbnx4Gc1wiYLRf6J5NN4HRYJtCby1rPF8rkQ4a6qqoFBK5dvjJ1zJ0F7VfDSvw=="], @@ -1425,9 +1405,7 @@ "vite": ["vite@7.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ=="], - "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], - - "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + "vitest": ["vitest@4.0.12", "", { "dependencies": { "@vitest/expect": "4.0.12", "@vitest/mocker": "4.0.12", "@vitest/pretty-format": "4.0.12", "@vitest/runner": "4.0.12", "@vitest/snapshot": "4.0.12", "@vitest/spy": "4.0.12", "@vitest/utils": "4.0.12", "debug": "^4.4.3", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/debug": "^4.1.12", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.0.12", "@vitest/browser-preview": "4.0.12", "@vitest/browser-webdriverio": "4.0.12", "@vitest/ui": "4.0.12", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/debug", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-pmW4GCKQ8t5Ko1jYjC3SqOr7TUKN7uHOHB/XGsAIb69eYu6d1ionGSsb5H9chmPf+WeXt0VE7jTXsB1IvWoNbw=="], "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], @@ -1543,6 +1521,10 @@ "@typescript-eslint/typescript-estree/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "@vitest/ui/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "@vitest/ui/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -1605,8 +1587,6 @@ "tailwindcss/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - "test-exclude/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "ts-node/arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -1641,6 +1621,8 @@ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@vitest/ui/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -1657,8 +1639,6 @@ "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "test-exclude/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "@modelcontextprotocol/sdk/express/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "@modelcontextprotocol/sdk/express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], diff --git a/failed-tests.txt b/failed-tests.txt new file mode 100644 index 000000000..ca45a1151 --- /dev/null +++ b/failed-tests.txt @@ -0,0 +1,35 @@ +ChatInterface renders chat messages +ChatInterface allows sending a new message +ChatInterface shows loading state when sending a message +ChatInterface displays error message when there is an error +ChatInterface allows switching models +ConversationSidebar displays list of conversations +ConversationSidebar calls onConversationSelect when a conversation is clicked +SettingsPanel renders provider selection +SettingsPanel allows switching providers +useIsMobile hook should handle window resize events +useToast hook useToast hook should dismiss toast when dismiss is called +useToast hook useToast hook should dismiss all toasts when no id is provided +useToast hook useToast hook should handle multiple toasts +useToast hook useToast hook should generate unique ids for each toast +useToast hook useToast hook should maintain toast order +mcpService discovery and prompt generation discovers both configured servers and builds a structured cached prompt +cn utility function should handle Tailwind class conflicts +ConversationSidebar shows loading state initially +ConversationSidebar shows empty state when no conversations exist +ConversationSidebar renders with correct width and styling +MCP Day Tool Integration should correctly answer what day tomorrow is +SettingsService loadSettings should load default settings when none exist +SettingsService loadSettings should handle invalid JSON gracefully +ConversationStateManager initialization should initialize successfully +ConversationStateManager initialization should handle initialization errors gracefully +ConversationStateManager state management should notify listeners of state changes +ConversationStateManager state management should provide readonly state access +ConversationStateManager conversation operations should create new conversations +ConversationStateManager conversation operations should load conversations by ID +ConversationStateManager conversation operations should archive and unarchive conversations +ConversationStateManager conversation operations should delete conversations +ConversationStateManager search and filtering should search conversations +ConversationUtils title generation should truncate long messages +StorageService conversation operations should truncate long titles appropriately +StorageService sanitization should remove API keys from messages diff --git a/failure-report.clean.json b/failure-report.clean.json new file mode 100644 index 000000000..e145d88ad --- /dev/null +++ b/failure-report.clean.json @@ -0,0 +1 @@ +{"numTotalTestSuites":50,"numPassedTestSuites":15,"numFailedTestSuites":35,"numPendingTestSuites":0,"numTotalTests":116,"numPassedTests":81,"numFailedTests":35,"numPendingTests":0,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1763679767430,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface renders chat messages","status":"failed","title":"renders chat messages","duration":46.92583300000001,"failureMessages":["TypeError: scrollElement.scrollTo is not a function\n at scrollToBottom (/Users/forestmars/sandbox/polyglot/src/components/ChatInterface.tsx:576:23)\n at /Users/forestmars/sandbox/polyglot/src/components/ChatInterface.tsx:587:5\n at Object.react_stack_bottom_frame (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)\n at runWithFiberInDEV (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:874:13)\n at commitHookEffectListMount (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)\n at commitHookPassiveMountEffects (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)\n at commitPassiveMountOnFiber (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)\n at recursivelyTraversePassiveMountEffects (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)\n at commitPassiveMountOnFiber (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)\n at flushPassiveEffects (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface allows sending a new message","status":"failed","title":"allows sending a new message","duration":1.8630410000000666,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:70:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface shows loading state when sending a message","status":"failed","title":"shows loading state when sending a message","duration":2.2955839999999625,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:95:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface displays error message when there is an error","status":"failed","title":"displays error message when there is an error","duration":0.289792000000034,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:109:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface allows switching models","status":"failed","title":"allows switching models","duration":0.17283399999996618,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:124:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}}],"startTime":1763679768737,"endTime":1763679768788.2898,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx"},{"assertionResults":[{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar displays list of conversations","status":"failed","title":"displays list of conversations","duration":55.581957999999986,"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: First Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/config.js:37:19)\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at getByText (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:95:19)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx:58:19\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar calls onConversationSelect when a conversation is clicked","status":"failed","title":"calls onConversationSelect when a conversation is clicked","duration":7.97729100000015,"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: Second Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/config.js:37:19)\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at getByText (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:95:19)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx:77:31\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows new chat button","status":"passed","title":"shows new chat button","duration":11.83075000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar calls onNewConversation when new chat button is clicked","status":"passed","title":"calls onNewConversation when new chat button is clicked","duration":12.693708000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows search bar","status":"passed","title":"shows search bar","duration":19.745374999999967,"failureMessages":[],"meta":{}}],"startTime":1763679768699,"endTime":1763679768806.7454,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx"},{"assertionResults":[{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel renders provider selection","status":"failed","title":"renders provider selection","duration":85.2929160000001,"failureMessages":["TestingLibraryElementError: Found multiple elements with the text: Ollama\n\nHere are the matching elements:\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[0mOllama\u001b[0m\n\u001b[36m\u001b[39m\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[0mOllama\u001b[0m\n\u001b[36m\u001b[39m\n\n(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSettings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mGeneral Settings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow Archived Chats\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mEnable Conversation Cache\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOllama Base URL\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mProvider\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m)"],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel allows switching providers","status":"failed","title":"allows switching providers","duration":49.723000000000184,"failureMessages":["TestingLibraryElementError: Unable to find an accessible element with the role \"combobox\" and name `/provider/i`\n\nHere are the accessible roles:\n\n heading:\n\n Name \"Settings\":\n \u001b[36m\u001b[39m\n\n Name \"General Settings\":\n \u001b[36m\u001b[39m\n\n Name \"Ollama Status\":\n \u001b[36m\u001b[39m\n\n Name \"Current Configuration\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"Checking...\":\n \u001b[36m\u001b[39m\n\n Name \"Data Transfer ▼\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n checkbox:\n\n Name \"Show Archived Chats\":\n \u001b[36m\u001b[39m\n\n Name \"Enable Conversation Cache\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n textbox:\n\n Name \"Ollama Base URL\":\n \u001b[36m\u001b[39m\n\n Name \"Base URL\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n combobox:\n\n Name \"\":\n \u001b[36mspan]:line-clamp-1 glass-panel\"\u001b[39m\n \u001b[33mdata-state\u001b[39m=\u001b[32m\"closed\"\u001b[39m\n \u001b[33mdir\u001b[39m=\u001b[32m\"ltr\"\u001b[39m\n \u001b[33mrole\u001b[39m=\u001b[32m\"combobox\"\u001b[39m\n \u001b[33mtype\u001b[39m=\u001b[32m\"button\"\u001b[39m\n \u001b[36m/>\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSettings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mGeneral Settings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow Archived Chats\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mEnable Conversation Cache\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOllama Base URL\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mProvider\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m)\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel shows API key management for non-local providers","status":"passed","title":"shows API key management for non-local providers","duration":23.382875000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel hides data transfer section by default","status":"passed","title":"hides data transfer section by default","duration":12.061249999999973,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel shows data transfer section when clicked","status":"passed","title":"shows data transfer section when clicked","duration":47.098834000000124,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel displays current model information","status":"passed","title":"displays current model information","duration":20.189166999999998,"failureMessages":[],"meta":{}}],"startTime":1763679768717,"endTime":1763679768955.1892,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/components/SettingsPanel.test.tsx"},{"assertionResults":[{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return false for desktop screen width","status":"passed","title":"should return false for desktop screen width","duration":10.127958999999919,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return true for mobile screen width","status":"passed","title":"should return true for mobile screen width","duration":1.3886250000000473,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return true for tablet screen width (edge case)","status":"passed","title":"should return true for tablet screen width (edge case)","duration":1.9769580000000815,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return false for tablet screen width (above breakpoint)","status":"passed","title":"should return false for tablet screen width (above breakpoint)","duration":0.8492089999999735,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should call matchMedia with correct query","status":"passed","title":"should call matchMedia with correct query","duration":3.40558400000009,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle window resize events","status":"failed","title":"should handle window resize events","duration":8.885166000000027,"failureMessages":["AssertionError: expected false to be true // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-mobile.test.tsx:119:28\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle media query change events","status":"passed","title":"should handle media query change events","duration":1.2754170000000613,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should cleanup event listeners on unmount","status":"passed","title":"should cleanup event listeners on unmount","duration":0.9160829999999578,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle edge case of very small screen","status":"passed","title":"should handle edge case of very small screen","duration":1.2045409999999492,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle edge case of very large screen","status":"passed","title":"should handle edge case of very large screen","duration":0.5716660000000502,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return boolean value","status":"passed","title":"should return boolean value","duration":0.4462500000000773,"failureMessages":[],"meta":{}}],"startTime":1763679769160,"endTime":1763679769191.4463,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-mobile.test.tsx"},{"assertionResults":[{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with basic properties","status":"passed","title":"should create a toast with basic properties","duration":0.9047920000000431,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with different variants","status":"passed","title":"should create a toast with different variants","duration":0.24491699999998673,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with action","status":"passed","title":"should create a toast with action","duration":0.12229100000001836,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with custom duration","status":"passed","title":"should create a toast with custom duration","duration":0.1904580000000351,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should return toast state and functions","status":"passed","title":"should return toast state and functions","duration":8.26516700000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should add toast to state when created","status":"passed","title":"should add toast to state when created","duration":2.636624999999981,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should dismiss toast when dismiss is called","status":"failed","title":"should dismiss toast when dismiss is called","duration":5.842167000000018,"failureMessages":["AssertionError: expected [ { title: 'Test Toast', …(3) } ] to have a length of +0 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:111:37\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should dismiss all toasts when no id is provided","status":"failed","title":"should dismiss all toasts when no id is provided","duration":1.1100410000000238,"failureMessages":["AssertionError: expected [ Array(1) ] to have a length of 3 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:123:37\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle multiple toasts","status":"failed","title":"should handle multiple toasts","duration":1.6467910000000074,"failureMessages":["AssertionError: expected [ { title: 'Third Toast', …(3) } ] to have a length of 3 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:141:37\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should generate unique ids for each toast","status":"failed","title":"should generate unique ids for each toast","duration":0.8020409999999174,"failureMessages":["AssertionError: expected [ '16' ] to have a length of 2 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:156:19\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle toast with only title","status":"passed","title":"should handle toast with only title","duration":0.8037500000000364,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle toast with only description","status":"passed","title":"should handle toast with only description","duration":0.5828330000000506,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle empty toast","status":"passed","title":"should handle empty toast","duration":1.2494590000000017,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should maintain toast order","status":"failed","title":"should maintain toast order","duration":3.4129159999999956,"failureMessages":["AssertionError: expected [ 'Third' ] to deeply equal [ 'First', 'Second', 'Third' ]\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:205:22\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle dismiss of non-existent toast","status":"passed","title":"should handle dismiss of non-existent toast","duration":0.5922500000000355,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast variants"],"fullName":"useToast hook toast variants should handle default variant","status":"passed","title":"should handle default variant","duration":0.397083000000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast variants"],"fullName":"useToast hook toast variants should handle destructive variant","status":"passed","title":"should handle destructive variant","duration":0.4112920000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast duration"],"fullName":"useToast hook toast duration should use default duration when not specified","status":"passed","title":"should use default duration when not specified","duration":0.36262499999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast duration"],"fullName":"useToast hook toast duration should use custom duration when specified","status":"passed","title":"should use custom duration when specified","duration":0.3573750000000473,"failureMessages":[],"meta":{}}],"startTime":1763679769044,"endTime":1763679769074.3574,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx"},{"assertionResults":[{"ancestorTitles":["mcpService discovery and prompt generation"],"fullName":"mcpService discovery and prompt generation discovers both configured servers and builds a structured cached prompt","status":"failed","title":"discovers both configured servers and builds a structured cached prompt","duration":90.09904200000005,"failureMessages":["AssertionError: expected 'Available tools:\\n- get_day (server: …' to contain 'tool_call'\n at /Users/forestmars/sandbox/polyglot/src/__tests__/services/mcpService.test.ts:99:20\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}}],"startTime":1763679768334,"endTime":1763679768424.099,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/services/mcpService.test.ts"},{"assertionResults":[{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should merge class names correctly","status":"passed","title":"should merge class names correctly","duration":3.0713330000000383,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle conditional classes","status":"passed","title":"should handle conditional classes","duration":0.17891600000001517,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle undefined and null values","status":"passed","title":"should handle undefined and null values","duration":0.07191699999998491,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle empty strings","status":"passed","title":"should handle empty strings","duration":0.2641659999999888,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle arrays of classes","status":"passed","title":"should handle arrays of classes","duration":0.0785420000000272,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle objects with conditional classes","status":"passed","title":"should handle objects with conditional classes","duration":0.05833300000000463,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle mixed input types","status":"passed","title":"should handle mixed input types","duration":0.13650000000001228,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle Tailwind class conflicts","status":"failed","title":"should handle Tailwind class conflicts","duration":3.088124999999991,"failureMessages":["AssertionError: expected 'text-blue-500' to be 'text-red-500 text-blue-500' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/__tests__/utils/utils.test.ts:66:20\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle complex conditional logic","status":"passed","title":"should handle complex conditional logic","duration":0.2936660000000302,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle no arguments","status":"passed","title":"should handle no arguments","duration":0.1219159999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle single argument","status":"passed","title":"should handle single argument","duration":0.10158300000000509,"failureMessages":[],"meta":{}}],"startTime":1763679769220,"endTime":1763679769227.2937,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/utils/utils.test.ts"},{"assertionResults":[{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar renders the sidebar with correct title","status":"passed","title":"renders the sidebar with correct title","duration":50.96479099999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows search input","status":"passed","title":"shows search input","duration":8.13474999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows archive toggle button","status":"passed","title":"shows archive toggle button","duration":5.67491700000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar calls onNewConversation when New Chat button is clicked","status":"passed","title":"calls onNewConversation when New Chat button is clicked","duration":7.4650000000001455,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows loading state initially","status":"failed","title":"shows loading state initially","duration":22.660957999999937,"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: Loading conversations.... This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/config.js:37:19)\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at getByText (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:95:19)\n at /Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx:94:19\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows empty state when no conversations exist","status":"failed","title":"shows empty state when no conversations exist","duration":1009.7192499999999,"failureMessages":["Error: Unable to find an element with the text: No conversations yet. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Proxy.waitFor (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/wait-for.js:163:27)\n at /Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx:100:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar handles search input changes","status":"passed","title":"handles search input changes","duration":8.114415999999892,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar toggles archive visibility","status":"passed","title":"toggles archive visibility","duration":7.9680419999999685,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows conversation count","status":"passed","title":"shows conversation count","duration":7.518958999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar renders with correct width and styling","status":"failed","title":"renders with correct width and styling","duration":6.553957999999966,"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31melement\u001b[39m\u001b[2m).toHaveClass(\u001b[22m\u001b[32m\u001b[32m\"flex flex-col h-full bg-background border-r border-border\"\u001b[32m\u001b[39m\u001b[2m)\u001b[22m\n\nExpected the element to have class:\n\u001b[32m flex flex-col h-full bg-background border-r border-border\u001b[39m\nReceived:\n\u001b[31m flex items-center justify-between mb-3\u001b[39m\n at Proxy.expectWrapper (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1819:12)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveClass (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx:136:21\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar has proper accessibility attributes","status":"passed","title":"has proper accessibility attributes","duration":5.286917000000358,"failureMessages":[],"meta":{}}],"startTime":1763679768703,"endTime":1763679769843.2869,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx"},{"assertionResults":[{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should know what day of the week it is via MCP tool","status":"passed","title":"should know what day of the week it is via MCP tool","duration":24.41537500000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should handle \"what day of the week\" phrasing","status":"passed","title":"should handle \"what day of the week\" phrasing","duration":1.9421249999998054,"failureMessages":[],"meta":{}},{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should handle \"today\" keyword","status":"passed","title":"should handle \"today\" keyword","duration":0.9959169999999631,"failureMessages":[],"meta":{}},{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should correctly answer what day tomorrow is","status":"failed","title":"should correctly answer what day tomorrow is","duration":3.1224170000000413,"failureMessages":["AssertionError: expected 'Today is Thursday' to be null\n at /Users/forestmars/sandbox/polyglot/tests/integration/mcpDayTool.integration.test.ts:92:22\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}}],"startTime":1763679769410,"endTime":1763679769440.1223,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/tests/integration/mcpDayTool.integration.test.ts"},{"assertionResults":[],"startTime":1763679767430,"endTime":1763679767430,"status":"failed","message":"No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts","name":"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts"},{"assertionResults":[],"startTime":1763679767430,"endTime":1763679767430,"status":"failed","message":"No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts","name":"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts"},{"assertionResults":[{"ancestorTitles":["SettingsService","loadSettings"],"fullName":"SettingsService loadSettings should load default settings when none exist","status":"failed","title":"should load default settings when none exist","duration":9.553457999999978,"failureMessages":["AssertionError: expected '' to be 'ollama' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:60:41\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["SettingsService","loadSettings"],"fullName":"SettingsService loadSettings should load existing settings from localStorage","status":"passed","title":"should load existing settings from localStorage","duration":0.5697499999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","loadSettings"],"fullName":"SettingsService loadSettings should handle invalid JSON gracefully","status":"failed","title":"should handle invalid JSON gracefully","duration":1.8653750000000855,"failureMessages":["AssertionError: expected '' to be 'ollama' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:86:41\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["SettingsService","saveSettings"],"fullName":"SettingsService saveSettings should save settings to localStorage","status":"passed","title":"should save settings to localStorage","duration":1.1622079999999642,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","saveSettings"],"fullName":"SettingsService saveSettings should merge with existing settings","status":"passed","title":"should merge with existing settings","duration":0.196166000000062,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","updateSetting"],"fullName":"SettingsService updateSetting should update a single setting","status":"passed","title":"should update a single setting","duration":0.27845800000000054,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","validation"],"fullName":"SettingsService validation should validate theme values","status":"passed","title":"should validate theme values","duration":0.12133300000004965,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","validation"],"fullName":"SettingsService validation should validate numeric values","status":"passed","title":"should validate numeric values","duration":0.07104099999992286,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationStateManager","initialization"],"fullName":"ConversationStateManager initialization should initialize successfully","status":"failed","title":"should initialize successfully","duration":1.498707999999965,"failureMessages":["AssertionError: expected \"vi.fn()\" to be called at least once\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1400:10)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveBeenCalled (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:199:45\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","initialization"],"fullName":"ConversationStateManager initialization should handle initialization errors gracefully","status":"failed","title":"should handle initialization errors gracefully","duration":1.8716670000000022,"failureMessages":["AssertionError: expected 'IndexedDB API missing. Please visit h…' to be 'Storage failed' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:209:27\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","state management"],"fullName":"ConversationStateManager state management should notify listeners of state changes","status":"failed","title":"should notify listeners of state changes","duration":0.9194589999999607,"failureMessages":["AssertionError: expected true to be false // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:221:51\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","state management"],"fullName":"ConversationStateManager state management should provide readonly state access","status":"failed","title":"should provide readonly state access","duration":0.5128750000000082,"failureMessages":["AssertionError: expected [Function] to throw an error\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1485:16)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toThrow (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:232:10\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should create new conversations","status":"failed","title":"should create new conversations","duration":58.57341700000006,"failureMessages":["AssertionError: expected \"vi.fn()\" to be called at least once\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1400:10)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveBeenCalled (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:246:51\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should load conversations by ID","status":"failed","title":"should load conversations by ID","duration":0.6691250000001219,"failureMessages":["MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should handle model switching","status":"passed","title":"should handle model switching","duration":11.448167000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should archive and unarchive conversations","status":"failed","title":"should archive and unarchive conversations","duration":8.529665999999906,"failureMessages":["Error: Conversation not found\n at ConversationStateManager.toggleArchive (/Users/forestmars/sandbox/polyglot/src/services/conversationStateManager.ts:358:32)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:271:26\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should delete conversations","status":"failed","title":"should delete conversations","duration":9.832167000000027,"failureMessages":["MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb"],"meta":{}},{"ancestorTitles":["ConversationStateManager","search and filtering"],"fullName":"ConversationStateManager search and filtering should search conversations","status":"failed","title":"should search conversations","duration":1.510332999999946,"failureMessages":["AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'test' ]\u001b[90m\n\nNumber of calls: \u001b[1m0\u001b[22m\n\u001b[39m\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1420:10)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveBeenCalledWith (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:305:54\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","search and filtering"],"fullName":"ConversationStateManager search and filtering should provide conversation statistics","status":"passed","title":"should provide conversation statistics","duration":0.4067499999998745,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationStateManager","cleanup"],"fullName":"ConversationStateManager cleanup should cleanup resources on destroy","status":"passed","title":"should cleanup resources on destroy","duration":0.15308399999980793,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","ID generation"],"fullName":"ConversationUtils ID generation should generate unique IDs","status":"passed","title":"should generate unique IDs","duration":0.12158399999998437,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","title generation"],"fullName":"ConversationUtils title generation should generate titles from short messages","status":"passed","title":"should generate titles from short messages","duration":0.048791000000164786,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","title generation"],"fullName":"ConversationUtils title generation should truncate long messages","status":"failed","title":"should truncate long messages","duration":0.9375,"failureMessages":["Error: Invalid Chai property: toEndWith\n at Object.title [as get] (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1653:17)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:365:14\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)"],"meta":{}},{"ancestorTitles":["ConversationUtils","conversation creation"],"fullName":"ConversationUtils conversation creation should create conversations with correct structure","status":"passed","title":"should create conversations with correct structure","duration":0.15245800000002419,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","model change tracking"],"fullName":"ConversationUtils model change tracking should record model changes correctly","status":"passed","title":"should record model changes correctly","duration":0.14029100000016115,"failureMessages":[],"meta":{}}],"startTime":1763679768512,"endTime":1763679768624.1404,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts"},{"assertionResults":[{"ancestorTitles":["StorageService","initialization"],"fullName":"StorageService initialization should initialize with correct directory paths","status":"passed","title":"should initialize with correct directory paths","duration":0.6309590000000185,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should create a conversation with correct structure","status":"passed","title":"should create a conversation with correct structure","duration":12.199334000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should generate title from first user message","status":"passed","title":"should generate title from first user message","duration":0.10491700000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should truncate long titles appropriately","status":"failed","title":"should truncate long titles appropriately","duration":2.9784160000000384,"failureMessages":["Error: Invalid Chai property: toEndWith\n at Object.title [as get] (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1653:17)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts:85:14\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)"],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should add messages to conversation","status":"passed","title":"should add messages to conversation","duration":0.535459000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should record model changes","status":"passed","title":"should record model changes","duration":0.15091700000004948,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation metadata"],"fullName":"StorageService conversation metadata should extract metadata correctly","status":"passed","title":"should extract metadata correctly","duration":0.17020899999999983,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation metadata"],"fullName":"StorageService conversation metadata should get conversation summary","status":"passed","title":"should get conversation summary","duration":0.06041699999997263,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation metadata"],"fullName":"StorageService conversation metadata should handle empty conversations","status":"passed","title":"should handle empty conversations","duration":0.14895799999999326,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","validation"],"fullName":"StorageService validation should validate correct conversation data","status":"passed","title":"should validate correct conversation data","duration":0.0720410000000129,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","validation"],"fullName":"StorageService validation should reject invalid conversation data","status":"passed","title":"should reject invalid conversation data","duration":0.04804099999995515,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","sanitization"],"fullName":"StorageService sanitization should remove API keys from messages","status":"failed","title":"should remove API keys from messages","duration":1.4437500000000227,"failureMessages":["AssertionError: expected 'My API key is: sk-1234567890abcdef' to be 'My API key is: [REDACTED]' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts:170:45\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}}],"startTime":1763679769224,"endTime":1763679769242.4438,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should create, delete, and verify removal of a chat","status":"passed","title":"should create, delete, and verify removal of a chat","duration":23.261541000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should handle deleting non-existent chat","status":"passed","title":"should handle deleting non-existent chat","duration":5.843332999999973,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should handle missing chat ID in delete request","status":"passed","title":"should handle missing chat ID in delete request","duration":4.939792000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should delete multiple chats","status":"passed","title":"should delete multiple chats","duration":13.832832999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should fetch all chats","status":"passed","title":"should fetch all chats","duration":6.240749999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should handle CORS preflight","status":"passed","title":"should handle CORS preflight","duration":3.62337500000001,"failureMessages":[],"meta":{}}],"startTime":1763679769584,"endTime":1763679769641.6233,"status":"passed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/tests/server/chatSync.unit.test.ts"}]} \ No newline at end of file diff --git a/failure-report.json b/failure-report.json new file mode 100644 index 000000000..e145d88ad --- /dev/null +++ b/failure-report.json @@ -0,0 +1 @@ +{"numTotalTestSuites":50,"numPassedTestSuites":15,"numFailedTestSuites":35,"numPendingTestSuites":0,"numTotalTests":116,"numPassedTests":81,"numFailedTests":35,"numPendingTests":0,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1763679767430,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface renders chat messages","status":"failed","title":"renders chat messages","duration":46.92583300000001,"failureMessages":["TypeError: scrollElement.scrollTo is not a function\n at scrollToBottom (/Users/forestmars/sandbox/polyglot/src/components/ChatInterface.tsx:576:23)\n at /Users/forestmars/sandbox/polyglot/src/components/ChatInterface.tsx:587:5\n at Object.react_stack_bottom_frame (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:25989:20)\n at runWithFiberInDEV (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:874:13)\n at commitHookEffectListMount (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:13249:29)\n at commitHookPassiveMountEffects (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:13336:11)\n at commitPassiveMountOnFiber (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:15484:13)\n at recursivelyTraversePassiveMountEffects (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:15439:11)\n at commitPassiveMountOnFiber (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:15519:11)\n at flushPassiveEffects (/Users/forestmars/sandbox/polyglot/node_modules/react-dom/cjs/react-dom-client.development.js:18432:9)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface allows sending a new message","status":"failed","title":"allows sending a new message","duration":1.8630410000000666,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:70:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface shows loading state when sending a message","status":"failed","title":"shows loading state when sending a message","duration":2.2955839999999625,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:95:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface displays error message when there is an error","status":"failed","title":"displays error message when there is an error","duration":0.289792000000034,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:109:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["ChatInterface"],"fullName":"ChatInterface allows switching models","status":"failed","title":"allows switching models","duration":0.17283399999996618,"failureMessages":["ReferenceError: useConversationState is not defined\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx:124:15\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}}],"startTime":1763679768737,"endTime":1763679768788.2898,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/components/ChatInterface.test.tsx"},{"assertionResults":[{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar displays list of conversations","status":"failed","title":"displays list of conversations","duration":55.581957999999986,"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: First Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/config.js:37:19)\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at getByText (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:95:19)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx:58:19\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar calls onConversationSelect when a conversation is clicked","status":"failed","title":"calls onConversationSelect when a conversation is clicked","duration":7.97729100000015,"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: Second Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/config.js:37:19)\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at getByText (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:95:19)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx:77:31\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows new chat button","status":"passed","title":"shows new chat button","duration":11.83075000000008,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar calls onNewConversation when new chat button is clicked","status":"passed","title":"calls onNewConversation when new chat button is clicked","duration":12.693708000000015,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows search bar","status":"passed","title":"shows search bar","duration":19.745374999999967,"failureMessages":[],"meta":{}}],"startTime":1763679768699,"endTime":1763679768806.7454,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/components/ConversationSidebar.test.tsx"},{"assertionResults":[{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel renders provider selection","status":"failed","title":"renders provider selection","duration":85.2929160000001,"failureMessages":["TestingLibraryElementError: Found multiple elements with the text: Ollama\n\nHere are the matching elements:\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[0mOllama\u001b[0m\n\u001b[36m\u001b[39m\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[0mOllama\u001b[0m\n\u001b[36m\u001b[39m\n\n(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSettings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mGeneral Settings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow Archived Chats\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mEnable Conversation Cache\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOllama Base URL\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mProvider\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m)"],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel allows switching providers","status":"failed","title":"allows switching providers","duration":49.723000000000184,"failureMessages":["TestingLibraryElementError: Unable to find an accessible element with the role \"combobox\" and name `/provider/i`\n\nHere are the accessible roles:\n\n heading:\n\n Name \"Settings\":\n \u001b[36m\u001b[39m\n\n Name \"General Settings\":\n \u001b[36m\u001b[39m\n\n Name \"Ollama Status\":\n \u001b[36m\u001b[39m\n\n Name \"Current Configuration\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n button:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n Name \"Checking...\":\n \u001b[36m\u001b[39m\n\n Name \"Data Transfer ▼\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n checkbox:\n\n Name \"Show Archived Chats\":\n \u001b[36m\u001b[39m\n\n Name \"Enable Conversation Cache\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n textbox:\n\n Name \"Ollama Base URL\":\n \u001b[36m\u001b[39m\n\n Name \"Base URL\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n combobox:\n\n Name \"\":\n \u001b[36mspan]:line-clamp-1 glass-panel\"\u001b[39m\n \u001b[33mdata-state\u001b[39m=\u001b[32m\"closed\"\u001b[39m\n \u001b[33mdir\u001b[39m=\u001b[32m\"ltr\"\u001b[39m\n \u001b[33mrole\u001b[39m=\u001b[32m\"combobox\"\u001b[39m\n \u001b[33mtype\u001b[39m=\u001b[32m\"button\"\u001b[39m\n \u001b[36m/>\u001b[39m\n\n --------------------------------------------------\n paragraph:\n\n Name \"\":\n \u001b[36m\u001b[39m\n\n --------------------------------------------------\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mSettings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mGeneral Settings\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow Archived Chats\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mEnable Conversation Cache\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mOllama Base URL\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mProvider\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m)\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel shows API key management for non-local providers","status":"passed","title":"shows API key management for non-local providers","duration":23.382875000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel hides data transfer section by default","status":"passed","title":"hides data transfer section by default","duration":12.061249999999973,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel shows data transfer section when clicked","status":"passed","title":"shows data transfer section when clicked","duration":47.098834000000124,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsPanel"],"fullName":"SettingsPanel displays current model information","status":"passed","title":"displays current model information","duration":20.189166999999998,"failureMessages":[],"meta":{}}],"startTime":1763679768717,"endTime":1763679768955.1892,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/components/SettingsPanel.test.tsx"},{"assertionResults":[{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return false for desktop screen width","status":"passed","title":"should return false for desktop screen width","duration":10.127958999999919,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return true for mobile screen width","status":"passed","title":"should return true for mobile screen width","duration":1.3886250000000473,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return true for tablet screen width (edge case)","status":"passed","title":"should return true for tablet screen width (edge case)","duration":1.9769580000000815,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return false for tablet screen width (above breakpoint)","status":"passed","title":"should return false for tablet screen width (above breakpoint)","duration":0.8492089999999735,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should call matchMedia with correct query","status":"passed","title":"should call matchMedia with correct query","duration":3.40558400000009,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle window resize events","status":"failed","title":"should handle window resize events","duration":8.885166000000027,"failureMessages":["AssertionError: expected false to be true // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-mobile.test.tsx:119:28\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle media query change events","status":"passed","title":"should handle media query change events","duration":1.2754170000000613,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should cleanup event listeners on unmount","status":"passed","title":"should cleanup event listeners on unmount","duration":0.9160829999999578,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle edge case of very small screen","status":"passed","title":"should handle edge case of very small screen","duration":1.2045409999999492,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should handle edge case of very large screen","status":"passed","title":"should handle edge case of very large screen","duration":0.5716660000000502,"failureMessages":[],"meta":{}},{"ancestorTitles":["useIsMobile hook"],"fullName":"useIsMobile hook should return boolean value","status":"passed","title":"should return boolean value","duration":0.4462500000000773,"failureMessages":[],"meta":{}}],"startTime":1763679769160,"endTime":1763679769191.4463,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-mobile.test.tsx"},{"assertionResults":[{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with basic properties","status":"passed","title":"should create a toast with basic properties","duration":0.9047920000000431,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with different variants","status":"passed","title":"should create a toast with different variants","duration":0.24491699999998673,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with action","status":"passed","title":"should create a toast with action","duration":0.12229100000001836,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast function"],"fullName":"useToast hook toast function should create a toast with custom duration","status":"passed","title":"should create a toast with custom duration","duration":0.1904580000000351,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should return toast state and functions","status":"passed","title":"should return toast state and functions","duration":8.26516700000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should add toast to state when created","status":"passed","title":"should add toast to state when created","duration":2.636624999999981,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should dismiss toast when dismiss is called","status":"failed","title":"should dismiss toast when dismiss is called","duration":5.842167000000018,"failureMessages":["AssertionError: expected [ { title: 'Test Toast', …(3) } ] to have a length of +0 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:111:37\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should dismiss all toasts when no id is provided","status":"failed","title":"should dismiss all toasts when no id is provided","duration":1.1100410000000238,"failureMessages":["AssertionError: expected [ Array(1) ] to have a length of 3 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:123:37\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle multiple toasts","status":"failed","title":"should handle multiple toasts","duration":1.6467910000000074,"failureMessages":["AssertionError: expected [ { title: 'Third Toast', …(3) } ] to have a length of 3 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:141:37\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should generate unique ids for each toast","status":"failed","title":"should generate unique ids for each toast","duration":0.8020409999999174,"failureMessages":["AssertionError: expected [ '16' ] to have a length of 2 but got 1\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1322:20)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveLength (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:156:19\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle toast with only title","status":"passed","title":"should handle toast with only title","duration":0.8037500000000364,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle toast with only description","status":"passed","title":"should handle toast with only description","duration":0.5828330000000506,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle empty toast","status":"passed","title":"should handle empty toast","duration":1.2494590000000017,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should maintain toast order","status":"failed","title":"should maintain toast order","duration":3.4129159999999956,"failureMessages":["AssertionError: expected [ 'Third' ] to deeply equal [ 'First', 'Second', 'Third' ]\n at /Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx:205:22\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["useToast hook","useToast hook"],"fullName":"useToast hook useToast hook should handle dismiss of non-existent toast","status":"passed","title":"should handle dismiss of non-existent toast","duration":0.5922500000000355,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast variants"],"fullName":"useToast hook toast variants should handle default variant","status":"passed","title":"should handle default variant","duration":0.397083000000066,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast variants"],"fullName":"useToast hook toast variants should handle destructive variant","status":"passed","title":"should handle destructive variant","duration":0.4112920000000031,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast duration"],"fullName":"useToast hook toast duration should use default duration when not specified","status":"passed","title":"should use default duration when not specified","duration":0.36262499999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["useToast hook","toast duration"],"fullName":"useToast hook toast duration should use custom duration when specified","status":"passed","title":"should use custom duration when specified","duration":0.3573750000000473,"failureMessages":[],"meta":{}}],"startTime":1763679769044,"endTime":1763679769074.3574,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/hooks/use-toast.test.tsx"},{"assertionResults":[{"ancestorTitles":["mcpService discovery and prompt generation"],"fullName":"mcpService discovery and prompt generation discovers both configured servers and builds a structured cached prompt","status":"failed","title":"discovers both configured servers and builds a structured cached prompt","duration":90.09904200000005,"failureMessages":["AssertionError: expected 'Available tools:\\n- get_day (server: …' to contain 'tool_call'\n at /Users/forestmars/sandbox/polyglot/src/__tests__/services/mcpService.test.ts:99:20\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}}],"startTime":1763679768334,"endTime":1763679768424.099,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/services/mcpService.test.ts"},{"assertionResults":[{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should merge class names correctly","status":"passed","title":"should merge class names correctly","duration":3.0713330000000383,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle conditional classes","status":"passed","title":"should handle conditional classes","duration":0.17891600000001517,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle undefined and null values","status":"passed","title":"should handle undefined and null values","duration":0.07191699999998491,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle empty strings","status":"passed","title":"should handle empty strings","duration":0.2641659999999888,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle arrays of classes","status":"passed","title":"should handle arrays of classes","duration":0.0785420000000272,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle objects with conditional classes","status":"passed","title":"should handle objects with conditional classes","duration":0.05833300000000463,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle mixed input types","status":"passed","title":"should handle mixed input types","duration":0.13650000000001228,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle Tailwind class conflicts","status":"failed","title":"should handle Tailwind class conflicts","duration":3.088124999999991,"failureMessages":["AssertionError: expected 'text-blue-500' to be 'text-red-500 text-blue-500' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/__tests__/utils/utils.test.ts:66:20\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle complex conditional logic","status":"passed","title":"should handle complex conditional logic","duration":0.2936660000000302,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle no arguments","status":"passed","title":"should handle no arguments","duration":0.1219159999999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["cn utility function"],"fullName":"cn utility function should handle single argument","status":"passed","title":"should handle single argument","duration":0.10158300000000509,"failureMessages":[],"meta":{}}],"startTime":1763679769220,"endTime":1763679769227.2937,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/__tests__/utils/utils.test.ts"},{"assertionResults":[{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar renders the sidebar with correct title","status":"passed","title":"renders the sidebar with correct title","duration":50.96479099999988,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows search input","status":"passed","title":"shows search input","duration":8.13474999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows archive toggle button","status":"passed","title":"shows archive toggle button","duration":5.67491700000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar calls onNewConversation when New Chat button is clicked","status":"passed","title":"calls onNewConversation when New Chat button is clicked","duration":7.4650000000001455,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows loading state initially","status":"failed","title":"shows loading state initially","duration":22.660957999999937,"failureMessages":["TestingLibraryElementError: Unable to find an element with the text: Loading conversations.... This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Object.getElementError (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/config.js:37:19)\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:76:38\n at /Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:52:17\n at getByText (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/query-helpers.js:95:19)\n at /Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx:94:19\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows empty state when no conversations exist","status":"failed","title":"shows empty state when no conversations exist","duration":1009.7192499999999,"failureMessages":["Error: Unable to find an element with the text: No conversations yet. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.\n\nIgnored nodes: comments, script, style\n\u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mConversations\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mNew Chat\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m
\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mFilters:\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0mShow\u001b[0m\n \u001b[0m Archived\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[0m0\u001b[0m\n \u001b[0m conversation\u001b[0m\n \u001b[0ms\u001b[0m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m

\u001b[39m\n \u001b[0mNo conversations yet. Start chatting to create one!\u001b[0m\n \u001b[36m

\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n \u001b[36m\u001b[39m\n\u001b[36m\u001b[39m\n at Proxy.waitFor (/Users/forestmars/sandbox/polyglot/node_modules/@testing-library/dom/dist/wait-for.js:163:27)\n at /Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx:100:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar handles search input changes","status":"passed","title":"handles search input changes","duration":8.114415999999892,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar toggles archive visibility","status":"passed","title":"toggles archive visibility","duration":7.9680419999999685,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar shows conversation count","status":"passed","title":"shows conversation count","duration":7.518958999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar renders with correct width and styling","status":"failed","title":"renders with correct width and styling","duration":6.553957999999966,"failureMessages":["Error: \u001b[2mexpect(\u001b[22m\u001b[31melement\u001b[39m\u001b[2m).toHaveClass(\u001b[22m\u001b[32m\u001b[32m\"flex flex-col h-full bg-background border-r border-border\"\u001b[32m\u001b[39m\u001b[2m)\u001b[22m\n\nExpected the element to have class:\n\u001b[32m flex flex-col h-full bg-background border-r border-border\u001b[39m\nReceived:\n\u001b[31m flex items-center justify-between mb-3\u001b[39m\n at Proxy.expectWrapper (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1819:12)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveClass (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx:136:21\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["ConversationSidebar"],"fullName":"ConversationSidebar has proper accessibility attributes","status":"passed","title":"has proper accessibility attributes","duration":5.286917000000358,"failureMessages":[],"meta":{}}],"startTime":1763679768703,"endTime":1763679769843.2869,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/components/__tests__/ConversationSidebar.test.tsx"},{"assertionResults":[{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should know what day of the week it is via MCP tool","status":"passed","title":"should know what day of the week it is via MCP tool","duration":24.41537500000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should handle \"what day of the week\" phrasing","status":"passed","title":"should handle \"what day of the week\" phrasing","duration":1.9421249999998054,"failureMessages":[],"meta":{}},{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should handle \"today\" keyword","status":"passed","title":"should handle \"today\" keyword","duration":0.9959169999999631,"failureMessages":[],"meta":{}},{"ancestorTitles":["MCP Day Tool Integration"],"fullName":"MCP Day Tool Integration should correctly answer what day tomorrow is","status":"failed","title":"should correctly answer what day tomorrow is","duration":3.1224170000000413,"failureMessages":["AssertionError: expected 'Today is Thursday' to be null\n at /Users/forestmars/sandbox/polyglot/tests/integration/mcpDayTool.integration.test.ts:92:22\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}}],"startTime":1763679769410,"endTime":1763679769440.1223,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/tests/integration/mcpDayTool.integration.test.ts"},{"assertionResults":[],"startTime":1763679767430,"endTime":1763679767430,"status":"failed","message":"No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts","name":"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts"},{"assertionResults":[],"startTime":1763679767430,"endTime":1763679767430,"status":"failed","message":"No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts","name":"/Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts"},{"assertionResults":[{"ancestorTitles":["SettingsService","loadSettings"],"fullName":"SettingsService loadSettings should load default settings when none exist","status":"failed","title":"should load default settings when none exist","duration":9.553457999999978,"failureMessages":["AssertionError: expected '' to be 'ollama' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:60:41\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["SettingsService","loadSettings"],"fullName":"SettingsService loadSettings should load existing settings from localStorage","status":"passed","title":"should load existing settings from localStorage","duration":0.5697499999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","loadSettings"],"fullName":"SettingsService loadSettings should handle invalid JSON gracefully","status":"failed","title":"should handle invalid JSON gracefully","duration":1.8653750000000855,"failureMessages":["AssertionError: expected '' to be 'ollama' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:86:41\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["SettingsService","saveSettings"],"fullName":"SettingsService saveSettings should save settings to localStorage","status":"passed","title":"should save settings to localStorage","duration":1.1622079999999642,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","saveSettings"],"fullName":"SettingsService saveSettings should merge with existing settings","status":"passed","title":"should merge with existing settings","duration":0.196166000000062,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","updateSetting"],"fullName":"SettingsService updateSetting should update a single setting","status":"passed","title":"should update a single setting","duration":0.27845800000000054,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","validation"],"fullName":"SettingsService validation should validate theme values","status":"passed","title":"should validate theme values","duration":0.12133300000004965,"failureMessages":[],"meta":{}},{"ancestorTitles":["SettingsService","validation"],"fullName":"SettingsService validation should validate numeric values","status":"passed","title":"should validate numeric values","duration":0.07104099999992286,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationStateManager","initialization"],"fullName":"ConversationStateManager initialization should initialize successfully","status":"failed","title":"should initialize successfully","duration":1.498707999999965,"failureMessages":["AssertionError: expected \"vi.fn()\" to be called at least once\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1400:10)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveBeenCalled (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:199:45\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","initialization"],"fullName":"ConversationStateManager initialization should handle initialization errors gracefully","status":"failed","title":"should handle initialization errors gracefully","duration":1.8716670000000022,"failureMessages":["AssertionError: expected 'IndexedDB API missing. Please visit h…' to be 'Storage failed' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:209:27\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","state management"],"fullName":"ConversationStateManager state management should notify listeners of state changes","status":"failed","title":"should notify listeners of state changes","duration":0.9194589999999607,"failureMessages":["AssertionError: expected true to be false // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:221:51\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","state management"],"fullName":"ConversationStateManager state management should provide readonly state access","status":"failed","title":"should provide readonly state access","duration":0.5128750000000082,"failureMessages":["AssertionError: expected [Function] to throw an error\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1485:16)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toThrow (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:232:10\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should create new conversations","status":"failed","title":"should create new conversations","duration":58.57341700000006,"failureMessages":["AssertionError: expected \"vi.fn()\" to be called at least once\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1400:10)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveBeenCalled (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:246:51\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should load conversations by ID","status":"failed","title":"should load conversations by ID","duration":0.6691250000001219,"failureMessages":["MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should handle model switching","status":"passed","title":"should handle model switching","duration":11.448167000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should archive and unarchive conversations","status":"failed","title":"should archive and unarchive conversations","duration":8.529665999999906,"failureMessages":["Error: Conversation not found\n at ConversationStateManager.toggleArchive (/Users/forestmars/sandbox/polyglot/src/services/conversationStateManager.ts:358:32)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:271:26\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","conversation operations"],"fullName":"ConversationStateManager conversation operations should delete conversations","status":"failed","title":"should delete conversations","duration":9.832167000000027,"failureMessages":["MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb"],"meta":{}},{"ancestorTitles":["ConversationStateManager","search and filtering"],"fullName":"ConversationStateManager search and filtering should search conversations","status":"failed","title":"should search conversations","duration":1.510332999999946,"failureMessages":["AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'test' ]\u001b[90m\n\nNumber of calls: \u001b[1m0\u001b[22m\n\u001b[39m\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1420:10)\n at Proxy. (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/expect/dist/index.js:1090:14)\n at Proxy.toHaveBeenCalledWith (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1700:25)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:305:54\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20"],"meta":{}},{"ancestorTitles":["ConversationStateManager","search and filtering"],"fullName":"ConversationStateManager search and filtering should provide conversation statistics","status":"passed","title":"should provide conversation statistics","duration":0.4067499999998745,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationStateManager","cleanup"],"fullName":"ConversationStateManager cleanup should cleanup resources on destroy","status":"passed","title":"should cleanup resources on destroy","duration":0.15308399999980793,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","ID generation"],"fullName":"ConversationUtils ID generation should generate unique IDs","status":"passed","title":"should generate unique IDs","duration":0.12158399999998437,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","title generation"],"fullName":"ConversationUtils title generation should generate titles from short messages","status":"passed","title":"should generate titles from short messages","duration":0.048791000000164786,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","title generation"],"fullName":"ConversationUtils title generation should truncate long messages","status":"failed","title":"should truncate long messages","duration":0.9375,"failureMessages":["Error: Invalid Chai property: toEndWith\n at Object.title [as get] (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1653:17)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:365:14\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)"],"meta":{}},{"ancestorTitles":["ConversationUtils","conversation creation"],"fullName":"ConversationUtils conversation creation should create conversations with correct structure","status":"passed","title":"should create conversations with correct structure","duration":0.15245800000002419,"failureMessages":[],"meta":{}},{"ancestorTitles":["ConversationUtils","model change tracking"],"fullName":"ConversationUtils model change tracking should record model changes correctly","status":"passed","title":"should record model changes correctly","duration":0.14029100000016115,"failureMessages":[],"meta":{}}],"startTime":1763679768512,"endTime":1763679768624.1404,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts"},{"assertionResults":[{"ancestorTitles":["StorageService","initialization"],"fullName":"StorageService initialization should initialize with correct directory paths","status":"passed","title":"should initialize with correct directory paths","duration":0.6309590000000185,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should create a conversation with correct structure","status":"passed","title":"should create a conversation with correct structure","duration":12.199334000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should generate title from first user message","status":"passed","title":"should generate title from first user message","duration":0.10491700000000037,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should truncate long titles appropriately","status":"failed","title":"should truncate long titles appropriately","duration":2.9784160000000384,"failureMessages":["Error: Invalid Chai property: toEndWith\n at Object.title [as get] (file:///Users/forestmars/sandbox/polyglot/node_modules/chai/index.js:1653:17)\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts:85:14\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)"],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should add messages to conversation","status":"passed","title":"should add messages to conversation","duration":0.535459000000003,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation operations"],"fullName":"StorageService conversation operations should record model changes","status":"passed","title":"should record model changes","duration":0.15091700000004948,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation metadata"],"fullName":"StorageService conversation metadata should extract metadata correctly","status":"passed","title":"should extract metadata correctly","duration":0.17020899999999983,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation metadata"],"fullName":"StorageService conversation metadata should get conversation summary","status":"passed","title":"should get conversation summary","duration":0.06041699999997263,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","conversation metadata"],"fullName":"StorageService conversation metadata should handle empty conversations","status":"passed","title":"should handle empty conversations","duration":0.14895799999999326,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","validation"],"fullName":"StorageService validation should validate correct conversation data","status":"passed","title":"should validate correct conversation data","duration":0.0720410000000129,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","validation"],"fullName":"StorageService validation should reject invalid conversation data","status":"passed","title":"should reject invalid conversation data","duration":0.04804099999995515,"failureMessages":[],"meta":{}},{"ancestorTitles":["StorageService","sanitization"],"fullName":"StorageService sanitization should remove API keys from messages","status":"failed","title":"should remove API keys from messages","duration":1.4437500000000227,"failureMessages":["AssertionError: expected 'My API key is: sk-1234567890abcdef' to be 'My API key is: [REDACTED]' // Object.is equality\n at /Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts:170:45\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20\n at new Promise ()\n at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10)\n at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37\n at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27)\n at trace (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/test.DqQZzsWf.js:234:21)\n at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:12)"],"meta":{}}],"startTime":1763679769224,"endTime":1763679769242.4438,"status":"failed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/services/__tests__/storage.test.ts"},{"assertionResults":[{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should create, delete, and verify removal of a chat","status":"passed","title":"should create, delete, and verify removal of a chat","duration":23.261541000000022,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should handle deleting non-existent chat","status":"passed","title":"should handle deleting non-existent chat","duration":5.843332999999973,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should handle missing chat ID in delete request","status":"passed","title":"should handle missing chat ID in delete request","duration":4.939792000000011,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should delete multiple chats","status":"passed","title":"should delete multiple chats","duration":13.832832999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should fetch all chats","status":"passed","title":"should fetch all chats","duration":6.240749999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["Chat Sync API - Unit Tests"],"fullName":"Chat Sync API - Unit Tests should handle CORS preflight","status":"passed","title":"should handle CORS preflight","duration":3.62337500000001,"failureMessages":[],"meta":{}}],"startTime":1763679769584,"endTime":1763679769641.6233,"status":"passed","message":"","name":"/Users/forestmars/sandbox/polyglot/src/tests/server/chatSync.unit.test.ts"}]} \ No newline at end of file diff --git a/package.json b/package.json index 20f2145b1..e98d9bfa7 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "@types/supertest": "^6.0.3", "@types/ws": "^8.18.1", "@vitejs/plugin-react-swc": "^4.1.0", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "^4.0.12", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.21", "eslint": "^9.36.0", @@ -109,7 +109,7 @@ "typescript": "^5.9.3", "typescript-eslint": "^8.45.0", "vite": "^7.1.9", - "vitest": "^3.2.4" + "vitest": "^4.0.12" }, "test": { "module": { diff --git a/src/__tests__/components/ChatInterface.test.tsx b/src/__tests__/components/ChatInterface.test.tsx index 0aafc09a3..623eef737 100644 --- a/src/__tests__/components/ChatInterface.test.tsx +++ b/src/__tests__/components/ChatInterface.test.tsx @@ -54,7 +54,7 @@ vi.mock('@/hooks/use-settings', () => ({ }) })); -describe('ChatInterface', () => { +describe('ChatInterface', { tags: ['db'] }, () => { beforeEach(() => { vi.clearAllMocks(); }); diff --git a/src/__tests__/components/ConversationSidebar.test.tsx b/src/__tests__/components/ConversationSidebar.test.tsx index 9b84003d5..c4afa105e 100644 --- a/src/__tests__/components/ConversationSidebar.test.tsx +++ b/src/__tests__/components/ConversationSidebar.test.tsx @@ -29,7 +29,7 @@ const mockConversations = [ } ]; -describe('ConversationSidebar', () => { +describe('ConversationSidebar', { tags: ['db'] }, () => { const onSelect = vi.fn(); const onNewConversation = vi.fn(); const onToggleArchive = vi.fn(); diff --git a/src/__tests__/components/SettingsPanel.test.tsx b/src/__tests__/components/SettingsPanel.test.tsx index 77b5c724f..8ede0006d 100644 --- a/src/__tests__/components/SettingsPanel.test.tsx +++ b/src/__tests__/components/SettingsPanel.test.tsx @@ -20,7 +20,7 @@ const mockProviders = [ } ]; -describe('SettingsPanel', () => { +describe('SettingsPanel', { tags: ['db'] }, () => { const defaultProps = { providers: mockProviders, setProviders: vi.fn(), diff --git a/src/__tests__/hooks/use-mobile.test.tsx b/src/__tests__/hooks/use-mobile.test.tsx index 97106f968..3cf639713 100644 --- a/src/__tests__/hooks/use-mobile.test.tsx +++ b/src/__tests__/hooks/use-mobile.test.tsx @@ -2,7 +2,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { renderHook } from '@testing-library/react' import { useIsMobile } from '@/hooks/use-mobile' -describe('useIsMobile hook', () => { +describe('useIsMobile hook', { tags: ['db'] }, () => { let originalInnerWidth: number let matchMediaSpy: any diff --git a/src/__tests__/hooks/use-toast.test.tsx b/src/__tests__/hooks/use-toast.test.tsx index 4eef90956..98dfc7273 100644 --- a/src/__tests__/hooks/use-toast.test.tsx +++ b/src/__tests__/hooks/use-toast.test.tsx @@ -2,7 +2,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { renderHook, act } from '@testing-library/react' import { useToast, toast } from '@/hooks/use-toast' -describe('useToast hook', () => { +describe('useToast hook', { tags: ['db'] }, () => { beforeEach(() => { // Clear any existing toasts vi.clearAllMocks() diff --git a/src/__tests__/services/mcpService.test.ts b/src/__tests__/services/mcpService.test.ts index 033f5b1f1..8598ed986 100644 --- a/src/__tests__/services/mcpService.test.ts +++ b/src/__tests__/services/mcpService.test.ts @@ -3,7 +3,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' // Small helper to delay const tick = (ms = 10) => new Promise(resolve => setTimeout(resolve, ms)) -describe('mcpService discovery and prompt generation', () => { +describe('mcpService discovery and prompt generation', { tags: ['db'] }, () => { beforeEach(() => { // Reset module cache so each test gets a fresh mcpService instance vi.resetModules() diff --git a/src/__tests__/utils/utils.test.ts b/src/__tests__/utils/utils.test.ts index 3af81d794..e34ece0a9 100644 --- a/src/__tests__/utils/utils.test.ts +++ b/src/__tests__/utils/utils.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest' import { cn } from '@/lib/utils' -describe('cn utility function', () => { +describe('cn utility function', { tags: ['db'] }, () => { it('should merge class names correctly', () => { const result = cn('class1', 'class2', 'class3') expect(result).toBe('class1 class2 class3') diff --git a/src/components/__tests__/ConversationSidebar.test.tsx b/src/components/__tests__/ConversationSidebar.test.tsx index 9675aef52..41b64525e 100644 --- a/src/components/__tests__/ConversationSidebar.test.tsx +++ b/src/components/__tests__/ConversationSidebar.test.tsx @@ -27,7 +27,7 @@ vi.mock('@/hooks/use-toast', () => ({ }), })); -describe('ConversationSidebar', () => { +describe('ConversationSidebar', { tags: ['db'] }, () => { const mockConversation: Conversation = { id: 'conv-1', title: 'Test Conversation', diff --git a/src/services/__tests__/stateManagement.test.ts b/src/services/__tests__/stateManagement.test.ts index 51162e2e3..c6e617d33 100644 --- a/src/services/__tests__/stateManagement.test.ts +++ b/src/services/__tests__/stateManagement.test.ts @@ -43,7 +43,7 @@ vi.mock('../storage', () => ({ })) })); -describe('SettingsService', () => { +describe('SettingsService', { tags: ['db'] }, () => { let settingsService: SettingsService; beforeEach(() => { @@ -156,7 +156,7 @@ describe('SettingsService', () => { }); }); -describe('ConversationStateManager', () => { +describe('ConversationStateManager', { tags: ['db'] }, () => { let stateManager: ConversationStateManager; let mockStorageService: any; @@ -326,7 +326,7 @@ describe('ConversationStateManager', () => { }); }); -describe('ConversationUtils', () => { +describe('ConversationUtils', { tags: ['db'] }, () => { describe('ID generation', () => { it('should generate unique IDs', () => { const id1 = ConversationUtils.generateId(); diff --git a/src/services/__tests__/storage.test.ts b/src/services/__tests__/storage.test.ts index a0ee3c4cb..f6db503db 100644 --- a/src/services/__tests__/storage.test.ts +++ b/src/services/__tests__/storage.test.ts @@ -13,7 +13,7 @@ vi.mock('fs', () => ({ } })); -describe('StorageService', () => { +describe('StorageService', { tags: ['db'] }, () => { let storageService: StorageService; let mockConversation: Conversation; diff --git a/src/services/indexedDbStorage.ts b/src/services/indexedDbStorage.ts index 8e0fcf409..4768ced64 100644 --- a/src/services/indexedDbStorage.ts +++ b/src/services/indexedDbStorage.ts @@ -239,7 +239,7 @@ export class IndexedDbStorage { // Methods that your conversation state manager expects async listConversations(showArchived: boolean = false): Promise { try { - let query = this.db.chats.orderBy("lastModified").reverse(); + const query = this.db.chats.orderBy("lastModified").reverse(); const chats = await query.toArray(); const convertedChats = chats.map((chat) => diff --git a/src/services/settingsService.ts b/src/services/settingsService.ts index 0c45386f6..97664f0e9 100644 --- a/src/services/settingsService.ts +++ b/src/services/settingsService.ts @@ -210,7 +210,7 @@ export class SettingsService { * Validate settings object */ private validateSettings(settings: any): AppSettings { - let validated: any = { ...this.DEFAULT_SETTINGS }; + const validated: any = { ...this.DEFAULT_SETTINGS }; // Validate each setting with type checking for (const [key, defaultValue] of Object.entries(this.DEFAULT_SETTINGS)) { diff --git a/src/tests/setup.ts b/src/tests/setup.ts index 7c942b032..37dec4916 100644 --- a/src/tests/setup.ts +++ b/src/tests/setup.ts @@ -1,5 +1,6 @@ import '@testing-library/jest-dom' import { vi } from 'vitest' +import 'fake-indexeddb/auto' // Mock window.matchMedia for use-mobile hook Object.defineProperty(window, 'matchMedia', { @@ -33,6 +34,11 @@ global.IntersectionObserver = vi.fn().mockImplementation(() => ({ // Mock scrollIntoView Element.prototype.scrollIntoView = vi.fn() +// Mock scrollTo (jsdom doesn't implement it) +if (typeof window !== 'undefined' && !(window as any).scrollTo) { + ;(window as any).scrollTo = () => {} +} + // Mock getComputedStyle Object.defineProperty(window, 'getComputedStyle', { value: () => ({ diff --git a/test-report.txt b/test-report.txt new file mode 100644 index 000000000..0648280ab --- /dev/null +++ b/test-report.txt @@ -0,0 +1,5109 @@ +$ vitest + + DEV v3.2.4 /Users/forestmars/sandbox/polyglot + +stderr | src/__tests__/components/ConversationSidebar.test.tsx +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/ConversationSidebar.test.tsx +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/SettingsPanel.test.tsx +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/SettingsPanel.test.tsx +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/components/__tests__/ConversationSidebar.test.tsx +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/components/__tests__/ConversationSidebar.test.tsx +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + ❯ src/__tests__/components/ConversationSidebar.test.tsx (5 tests | 2 failed) 78ms + × ConversationSidebar > displays list of conversations 45ms + → Unable to find an element with the text: First Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + × ConversationSidebar > calls onConversationSelect when a conversation is clicked 8ms + → Unable to find an element with the text: Second Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ✓ ConversationSidebar > shows new chat button 11ms + ✓ ConversationSidebar > calls onNewConversation when new chat button is clicked 9ms + ✓ ConversationSidebar > shows search bar 5ms +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[Sidebar] Rendered. Conversations: [] + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + ❯ src/__tests__/components/SettingsPanel.test.tsx (6 tests | 2 failed) 170ms + × SettingsPanel > renders provider selection 66ms + → Found multiple elements with the text: Ollama + +Here are the matching elements: + +Ignored nodes: comments, script, style + + Ollama + + +Ignored nodes: comments, script, style + + Ollama + + +(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  +  allows switching providers 38ms + → Unable to find an accessible element with the role "combobox" and name `/provider/i` + +Here are the accessible roles: + + heading: + + Name "Settings": +  + + Name "General Settings": +  + + Name "Ollama Status": +  + + Name "Current Configuration": +  + + -------------------------------------------------- + button: + + Name "": +  + + Name "Checking...": +  + + Name "Data Transfer ▼": +  + + -------------------------------------------------- + checkbox: + + Name "Show Archived Chats": +  + + Name "Enable Conversation Cache": +  + + -------------------------------------------------- + textbox: + + Name "Ollama Base URL": +  + + Name "Base URL": +  + + -------------------------------------------------- + combobox: + + Name "": + span]:line-clamp-1 glass-panel" + data-state="closed" + dir="ltr" + role="combobox" + type="button" + /> + + -------------------------------------------------- + paragraph: + + Name "": +  + + -------------------------------------------------- + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  +  shows API key management for non-local providers 11ms + ✓ SettingsPanel > hides data transfer section by default 11ms + ✓ SettingsPanel > shows data transfer section when clicked 27ms + ✓ SettingsPanel > displays current model information 14ms +stderr | src/services/__tests__/stateManagement.test.ts +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should handle invalid JSON gracefully +Failed to load settings: SyntaxError: Unexpected token 'i', "invalid json" is not valid JSON + at JSON.parse () + at SettingsService.loadSettings (/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts:63:29) + at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:84:46 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:155:11 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:752:26 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:1897:20 + at new Promise () + at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:1863:10) + at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:1574:12) + at processTicksAndRejections (node:internal/process/task_queues:105:5) + +stderr | src/services/__tests__/stateManagement.test.ts > SettingsService > saveSettings > should save settings to localStorage +Failed to load settings: SyntaxError: Unexpected token 'i', "invalid json" is not valid JSON + at JSON.parse () + at SettingsService.loadSettings (/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts:63:29) + at SettingsService.saveSettings (/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts:79:34) + at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:98:29 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:155:11 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:752:26 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:1897:20 + at new Promise () + at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:1863:10) + at runTest (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:1574:12) + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763674796627_f3lqh7mur + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Failed to load conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Failed to load conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763674796658_yh28v4x0g + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763674796658_yh28v4x0g +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763674796658_yh28v4x0g + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Cached model switch for conversation conv_1763674796658_yh28v4x0g + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763674796666_2invmy14z + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to toggle archive status: Error: Conversation not found + at ConversationStateManager.toggleArchive (/Users/forestmars/sandbox/polyglot/src/services/conversationStateManager.ts:358:32) + at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:271:26 + at processTicksAndRejections (node:internal/process/task_queues:105:5) + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/chunk-hooks.js:752:20 + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763674796671_o200x4i4d + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Pre-emptively clearing conversation conv_1763674796671_o200x4i4d from cache + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to delete conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to delete conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] Searching conversations with filters: { + searchQuery: 'test', + provider: 'ollama', + model: 'llama3.2', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] Found 0 conversations matching filters + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + ❯ src/services/__tests__/stateManagement.test.ts (25 tests | 12 failed) 63ms + × SettingsService > loadSettings > should load default settings when none exist 4ms + → expected '' to be 'ollama' // Object.is equality + ✓ SettingsService > loadSettings > should load existing settings from localStorage 0ms + × SettingsService > loadSettings > should handle invalid JSON gracefully 1ms + → expected '' to be 'ollama' // Object.is equality + ✓ SettingsService > saveSettings > should save settings to localStorage 1ms + ✓ SettingsService > saveSettings > should merge with existing settings 0ms + ✓ SettingsService > updateSetting > should update a single setting 0ms + ✓ SettingsService > validation > should validate theme values 0ms + ✓ SettingsService > validation > should validate numeric values 0ms + × ConversationStateManager > initialization > should initialize successfully 2ms + → expected "spy" to be called at least once + × ConversationStateManager > initialization > should handle initialization errors gracefully 2ms + → expected 'IndexedDB API missing. Please visit h…' to be 'Storage failed' // Object.is equality + × ConversationStateManager > state management > should notify listeners of state changes 1ms + → expected true to be false // Object.is equality + × ConversationStateManager > state management > should provide readonly state access 1ms + → expected [Function] to throw an error + × ConversationStateManager > conversation operations > should create new conversations 30ms + → expected "spy" to be called at least once + × ConversationStateManager > conversation operations > should load conversations by ID 1ms + → MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb + ✓ ConversationStateManager > conversation operations > should handle model switching 8ms + × ConversationStateManager > conversation operations > should archive and unarchive conversations 4ms + → Conversation not found + × ConversationStateManager > conversation operations > should delete conversations 5ms + → MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb + × ConversationStateManager > search and filtering > should search conversations 1ms + → expected "spy" to be called with arguments: [ 'test' ] + +Number of calls: 0 + + ✓ ConversationStateManager > search and filtering > should provide conversation statistics 0ms + ✓ ConversationStateManager > cleanup > should cleanup resources on destroy 0ms + ✓ ConversationUtils > ID generation > should generate unique IDs 0ms + ✓ ConversationUtils > title generation > should generate titles from short messages 0ms + × ConversationUtils > title generation > should truncate long messages 1ms + → Invalid Chai property: toEndWith + ✓ ConversationUtils > conversation creation > should create conversations with correct structure 0ms + ✓ ConversationUtils > model change tracking > should record model changes correctly 0ms +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🔌 Initializing MCP service... +🌐 Attempting to fetch /config/mcp.json... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +📥 Loaded MCP config from /config/mcp.json: [ 'day-server', 'email-tool' ] +📋 Found 2 MCP servers in config: [ 'day-server', 'email-tool' ] +🔗 Attempting to connect to day-server at ws://localhost:9001... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🟢 WebSocket connection established to day-server +🔍 Discovering tools from day-server... +📡 Sending tools/list request to day-server... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🛠️ Received 1 tools from day-server: [ 'get_day' ] + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +✅ Successfully connected to day-server +🔗 Attempting to connect to email-tool at ws://localhost:3000... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🟢 WebSocket connection established to email-tool +🔍 Discovering tools from email-tool... +📡 Sending tools/list request to email-tool... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🛠️ Received 1 tools from email-tool: [ 'send_email' ] + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +✅ Successfully connected to email-tool +🛠️ MCP initialization complete. Total tools available: 2 + + ❯ src/__tests__/services/mcpService.test.ts (1 test | 1 failed) 63ms + × mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt 62ms + → expected 'Available tools:\n- get_day (server: …' to contain 'tool_call' +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🧪 Initializing mcpService... +🔌 Initializing MCP service... +🌐 Attempting to fetch /config/mcp.json... + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +📥 Loaded MCP config from /config/mcp.json: [ 'day-server' ] +📋 Found 1 MCP servers in config: [ 'day-server' ] +🔗 Attempting to connect to day-server at ws://localhost:9001... + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🟢 WebSocket connection established to day-server +🔍 Discovering tools from day-server... +📡 Sending tools/list request to day-server... + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🛠️ Received 1 tools from day-server: [ 'get_day' ] + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +✅ Successfully connected to day-server +🛠️ MCP initialization complete. Total tools available: 1 + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🧪 mcpService ready +🧪 Available tools: [ 'get_day (day-server)' ] + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should know what day of the week it is via MCP tool +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should know what day of the week it is via MCP tool +✨ Tool get_day result: Today is Thursday + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "what day of the week" phrasing +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "what day of the week" phrasing +✨ Tool get_day result: Today is Thursday + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "today" keyword +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "today" keyword +✨ Tool get_day result: Today is Thursday + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should correctly answer what day tomorrow is +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should correctly answer what day tomorrow is +✨ Tool get_day result: Today is Thursday + + ❯ tests/integration/mcpDayTool.integration.test.ts (4 tests | 1 failed) 1048ms + ✓ MCP Day Tool Integration > should know what day of the week it is via MCP tool 23ms + ✓ MCP Day Tool Integration > should handle "what day of the week" phrasing 1ms + ✓ MCP Day Tool Integration > should handle "today" keyword 1ms + × MCP Day Tool Integration > should correctly answer what day tomorrow is 3ms + → expected 'Today is Thursday' to be null + ❯ src/__tests__/hooks/use-toast.test.tsx (19 tests | 5 failed) 28ms + ✓ useToast hook > toast function > should create a toast with basic properties 1ms + ✓ useToast hook > toast function > should create a toast with different variants 0ms + ✓ useToast hook > toast function > should create a toast with action 0ms + ✓ useToast hook > toast function > should create a toast with custom duration 0ms + ✓ useToast hook > useToast hook > should return toast state and functions 7ms + ✓ useToast hook > useToast hook > should add toast to state when created 2ms + × useToast hook > useToast hook > should dismiss toast when dismiss is called 6ms + → expected [ { title: 'Test Toast', …(3) } ] to have a length of +0 but got 1 + × useToast hook > useToast hook > should dismiss all toasts when no id is provided 1ms + → expected [ Array(1) ] to have a length of 3 but got 1 + × useToast hook > useToast hook > should handle multiple toasts 2ms + → expected [ { title: 'Third Toast', …(3) } ] to have a length of 3 but got 1 + × useToast hook > useToast hook > should generate unique ids for each toast 1ms + → expected [ '16' ] to have a length of 2 but got 1 + ✓ useToast hook > useToast hook > should handle toast with only title 1ms + ✓ useToast hook > useToast hook > should handle toast with only description 1ms + ✓ useToast hook > useToast hook > should handle empty toast 1ms + × useToast hook > useToast hook > should maintain toast order 1ms + → expected [ 'Third' ] to deeply equal [ 'First', 'Second', 'Third' ] + ✓ useToast hook > useToast hook > should handle dismiss of non-existent toast 0ms + ✓ useToast hook > toast variants > should handle default variant 0ms + ✓ useToast hook > toast variants > should handle destructive variant 2ms + ✓ useToast hook > toast duration > should use default duration when not specified 0ms + ✓ useToast hook > toast duration > should use custom duration when specified 0ms +stdout | src/__tests__/components/ChatInterface.test.tsx > ChatInterface > renders chat messages +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} + +stderr | src/__tests__/components/ChatInterface.test.tsx > ChatInterface > renders chat messages +Failed to load conversations: TypeError: Cannot read properties of undefined (reading 'length') + at loadFilteredConversations (/Users/forestmars/sandbox/polyglot/src/components/ConversationSidebar.tsx:98:61) + at processTicksAndRejections (node:internal/process/task_queues:105:5) + + ❯ src/__tests__/components/ChatInterface.test.tsx (5 tests | 5 failed) 47ms + × ChatInterface > renders chat messages 45ms + → scrollElement.scrollTo is not a function + × ChatInterface > allows sending a new message 1ms + → useConversationState is not defined + × ChatInterface > shows loading state when sending a message 0ms + → useConversationState is not defined + × ChatInterface > displays error message when there is an error 0ms + → useConversationState is not defined + × ChatInterface > allows switching models 0ms + → useConversationState is not defined +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: 'test query' +} +[StateManager] Searching conversations with filters: { + searchQuery: 'test query', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +[ConversationSidebar] Loaded 0 conversations (showArchived: false) +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: true, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: true, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=true +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +[ConversationSidebar] Loaded 0 conversations (showArchived: false) +[ConversationSidebar] Loaded 0 conversations (showArchived: true) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[Sidebar] Rendered. Conversations: [] + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + ❯ src/components/__tests__/ConversationSidebar.test.tsx (11 tests | 3 failed) 1116ms + ✓ ConversationSidebar > renders the sidebar with correct title 42ms + ✓ ConversationSidebar > shows search input 7ms + ✓ ConversationSidebar > shows archive toggle button 6ms + ✓ ConversationSidebar > calls onNewConversation when New Chat button is clicked 8ms + × ConversationSidebar > shows loading state initially 10ms + → Unable to find an element with the text: Loading conversations.... This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + × ConversationSidebar > shows empty state when no conversations exist 1007ms + → Unable to find an element with the text: No conversations yet. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + +Ignored nodes: comments, script, style + +  +  + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  +  + + ✓ ConversationSidebar > handles search input changes 8ms + ✓ ConversationSidebar > toggles archive visibility 7ms + ✓ ConversationSidebar > shows conversation count 7ms + × ConversationSidebar > renders with correct width and styling 6ms + → expect(element).toHaveClass("flex flex-col h-full bg-background border-r border-border") + +Expected the element to have class: + flex flex-col h-full bg-background border-r border-border +Received: + flex items-center justify-between mb-3 + ✓ ConversationSidebar > has proper accessibility attributes 8ms + ❯ src/__tests__/hooks/use-mobile.test.tsx (11 tests | 1 failed) 25ms + ✓ useIsMobile hook > should return false for desktop screen width 8ms + ✓ useIsMobile hook > should return true for mobile screen width 1ms + ✓ useIsMobile hook > should return true for tablet screen width (edge case) 2ms + ✓ useIsMobile hook > should return false for tablet screen width (above breakpoint) 1ms + ✓ useIsMobile hook > should call matchMedia with correct query 2ms + × useIsMobile hook > should handle window resize events 4ms + → expected false to be true // Object.is equality + ✓ useIsMobile hook > should handle media query change events 1ms + ✓ useIsMobile hook > should cleanup event listeners on unmount 1ms + ✓ useIsMobile hook > should handle edge case of very small screen 1ms + ✓ useIsMobile hook > should handle edge case of very large screen 1ms + ✓ useIsMobile hook > should return boolean value 0ms + ❯ src/services/__tests__/storage.test.ts (12 tests | 2 failed) 21ms + ✓ StorageService > initialization > should initialize with correct directory paths 1ms + ✓ StorageService > conversation operations > should create a conversation with correct structure 13ms + ✓ StorageService > conversation operations > should generate title from first user message 0ms + × StorageService > conversation operations > should truncate long titles appropriately 3ms + → Invalid Chai property: toEndWith + ✓ StorageService > conversation operations > should add messages to conversation 1ms + ✓ StorageService > conversation operations > should record model changes 0ms + ✓ StorageService > conversation metadata > should extract metadata correctly 0ms + ✓ StorageService > conversation metadata > should get conversation summary 0ms + ✓ StorageService > conversation metadata > should handle empty conversations 0ms + ✓ StorageService > validation > should validate correct conversation data 0ms + ✓ StorageService > validation > should reject invalid conversation data 0ms + × StorageService > sanitization > should remove API keys from messages 1ms + → expected 'My API key is: sk-1234567890abcdef' to be 'My API key is: [REDACTED]' // Object.is equality + ❯ src/__tests__/utils/utils.test.ts (11 tests | 1 failed) 8ms + ✓ cn utility function > should merge class names correctly 3ms + ✓ cn utility function > should handle conditional classes 0ms + ✓ cn utility function > should handle undefined and null values 0ms + ✓ cn utility function > should handle empty strings 0ms + ✓ cn utility function > should handle arrays of classes 0ms + ✓ cn utility function > should handle objects with conditional classes 0ms + ✓ cn utility function > should handle mixed input types 0ms + × cn utility function > should handle Tailwind class conflicts 3ms + → expected 'text-blue-500' to be 'text-red-500 text-blue-500' // Object.is equality + ✓ cn utility function > should handle complex conditional logic 0ms + ✓ cn utility function > should handle no arguments 0ms + ✓ cn utility function > should handle single argument 0ms + ✓ src/tests/server/chatSync.unit.test.ts (6 tests) 59ms + +⎯⎯⎯⎯⎯⎯ Failed Suites 2 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL tools/email-tool/src/gmail.test.ts [ tools/email-tool/src/gmail.test.ts ] +Error: No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/37]⎯ + + FAIL tools/email-tool/src/mcp.test.ts [ tools/email-tool/src/mcp.test.ts ] +Error: No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/37]⎯ + + +⎯⎯⎯⎯⎯⎯ Failed Tests 35 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should correctly answer what day tomorrow is +AssertionError: expected 'Today is Thursday' to be null + +- Expected: +null + ++ Received: +"Today is Thursday" + + ❯ tests/integration/mcpDayTool.integration.test.ts:92:22 + 90| // "Tomorrow" should NOT be routed to MCP - it should return null + 91| // and let the LLM handle the reasoning + 92| expect(response).toBeNull(); + | ^ + 93| }); + 94| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/37]⎯ + + FAIL src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +TestingLibraryElementError: Unable to find an element with the text: Loading conversations.... This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 + ❯ getByText node_modules/@testing-library/dom/dist/query-helpers.js:95:19 + ❯ src/components/__tests__/ConversationSidebar.test.tsx:94:19 + 92| render(); + 93| + 94| expect(screen.getByText('Loading conversations...')).toBeInTheDocu… + | ^ + 95| }); + 96| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/37]⎯ + + FAIL src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +TestingLibraryElementError: Unable to find an element with the text: No conversations yet. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + +Ignored nodes: comments, script, style + +  +  + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  +  + + ❯ Proxy.waitFor node_modules/@testing-library/dom/dist/wait-for.js:163:27 + ❯ src/components/__tests__/ConversationSidebar.test.tsx:100:11 + 98| render(); + 99| + 100| await waitFor(() => { + | ^ + 101| expect(screen.getByText('No conversations yet')).toBeInTheDocume… + 102| expect(screen.getByText('Start a new chat to get started')).toBe… + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/37]⎯ + + FAIL src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Error: expect(element).toHaveClass("flex flex-col h-full bg-background border-r border-border") + +Expected the element to have class: + flex flex-col h-full bg-background border-r border-border +Received: + flex items-center justify-between mb-3 + ❯ src/components/__tests__/ConversationSidebar.test.tsx:136:21 + 134| + 135| const sidebar = screen.getByText('Conversations').closest('div'); + 136| expect(sidebar).toHaveClass('flex', 'flex-col', 'h-full', 'bg-back… + | ^ + 137| }); + 138| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > renders chat messages +TypeError: scrollElement.scrollTo is not a function + ❯ scrollToBottom src/components/ChatInterface.tsx:576:23 + 574| ); + 575| if (scrollElement) { + 576| scrollElement.scrollTo({ + | ^ + 577| top: scrollElement.scrollHeight, + 578| behavior: "smooth", + ❯ src/components/ChatInterface.tsx:587:5 + ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 + ❯ runWithFiberInDEV node_modules/react-dom/cjs/react-dom-client.development.js:874:13 + ❯ commitHookEffectListMount node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 + ❯ commitHookPassiveMountEffects node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 + ❯ commitPassiveMountOnFiber node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 + ❯ recursivelyTraversePassiveMountEffects node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 + ❯ commitPassiveMountOnFiber node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 + ❯ flushPassiveEffects node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > allows sending a new message +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:70:15 + 68| it('allows sending a new message', async () => { + 69| const mockAddMessage = vi.fn(); + 70| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 71| ...useConversationState(), + 72| addMessage: mockAddMessage + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > shows loading state when sending a message +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:95:15 + 93| + 94| it('shows loading state when sending a message', async () => { + 95| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 96| ...useConversationState(), + 97| state: { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > displays error message when there is an error +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:109:15 + 107| + 108| it('displays error message when there is an error', () => { + 109| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 110| ...useConversationState(), + 111| state: { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > allows switching models +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:124:15 + 122| it('allows switching models', () => { + 123| const mockSwitchModel = vi.fn(); + 124| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 125| ...useConversationState(), + 126| switchModel: mockSwitchModel + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/37]⎯ + + FAIL src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +TestingLibraryElementError: Unable to find an element with the text: First Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 + ❯ getByText node_modules/@testing-library/dom/dist/query-helpers.js:95:19 + ❯ src/__tests__/components/ConversationSidebar.test.tsx:58:19 + 56| ); + 57| + 58| expect(screen.getByText('First Chat')).toBeInTheDocument(); + | ^ + 59| expect(screen.getByText('Second Chat')).toBeInTheDocument(); + 60| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/37]⎯ + + FAIL src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +TestingLibraryElementError: Unable to find an element with the text: Second Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 + ❯ getByText node_modules/@testing-library/dom/dist/query-helpers.js:95:19 + ❯ src/__tests__/components/ConversationSidebar.test.tsx:77:31 + 75| ); + 76| + 77| const secondChat = screen.getByText('Second Chat'); + | ^ + 78| fireEvent.click(secondChat); + 79| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/37]⎯ + + FAIL src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +TestingLibraryElementError: Found multiple elements with the text: Ollama + +Here are the matching elements: + +Ignored nodes: comments, script, style + + Ollama + + +Ignored nodes: comments, script, style + + Ollama + + +(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  + ); + 42| expect(screen.getByText('Provider')).toBeInTheDocument(); + 43| expect(screen.getByText('Ollama')).toBeInTheDocument(); + | ^ + 44| }); + 45| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/37]⎯ + + FAIL src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +TestingLibraryElementError: Unable to find an accessible element with the role "combobox" and name `/provider/i` + +Here are the accessible roles: + + heading: + + Name "Settings": +  + + Name "General Settings": +  + + Name "Ollama Status": +  + + Name "Current Configuration": +  + + -------------------------------------------------- + button: + + Name "": +  + + Name "Checking...": +  + + Name "Data Transfer ▼": +  + + -------------------------------------------------- + checkbox: + + Name "Show Archived Chats": +  + + Name "Enable Conversation Cache": +  + + -------------------------------------------------- + textbox: + + Name "Ollama Base URL": +  + + Name "Base URL": +  + + -------------------------------------------------- + combobox: + + Name "": + span]:line-clamp-1 glass-panel" + data-state="closed" + dir="ltr" + role="combobox" + type="button" + /> + + -------------------------------------------------- + paragraph: + + Name "": +  + + -------------------------------------------------- + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  +  { + 47| render(); + 48| const select = screen.getByRole('combobox', { name: /provider/i }); + | ^ + 49| fireEvent.mouseDown(select); + 50| const openaiOption = screen.getByText('OpenAI'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/37]⎯ + + FAIL src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should handle window resize events +AssertionError: expected false to be true // Object.is equality + +- Expected ++ Received + +- true ++ false + + ❯ src/__tests__/hooks/use-mobile.test.tsx:119:28 + 117| rerender() + 118| + 119| expect(result.current).toBe(true) + | ^ + 120| }) + 121| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should dismiss toast when dismiss is called +AssertionError: expected [ { title: 'Test Toast', …(3) } ] to have a length of +0 but got 1 + +- Expected ++ Received + +- 0 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:111:37 + 109| }) + 110| + 111| expect(result.current.toasts).toHaveLength(0) + | ^ + 112| }) + 113| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should dismiss all toasts when no id is provided +AssertionError: expected [ Array(1) ] to have a length of 3 but got 1 + +- Expected ++ Received + +- 3 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:123:37 + 121| }) + 122| + 123| expect(result.current.toasts).toHaveLength(3) + | ^ + 124| + 125| act(() => { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should handle multiple toasts +AssertionError: expected [ { title: 'Third Toast', …(3) } ] to have a length of 3 but got 1 + +- Expected ++ Received + +- 3 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:141:37 + 139| }) + 140| + 141| expect(result.current.toasts).toHaveLength(3) + | ^ + 142| expect(result.current.toasts[0].title).toBe('First Toast') + 143| expect(result.current.toasts[1].title).toBe('Second Toast') + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should generate unique ids for each toast +AssertionError: expected [ '16' ] to have a length of 2 but got 1 + +- Expected ++ Received + +- 2 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:156:19 + 154| + 155| const ids = result.current.toasts.map(t => t.id) + 156| expect(ids).toHaveLength(2) + | ^ + 157| expect(ids[0]).not.toBe(ids[1]) + 158| }) + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should maintain toast order +AssertionError: expected [ 'Third' ] to deeply equal [ 'First', 'Second', 'Third' ] + +- Expected ++ Received + + [ +- "First", +- "Second", + "Third", + ] + + ❯ src/__tests__/hooks/use-toast.test.tsx:205:22 + 203| + 204| const titles = result.current.toasts.map(t => t.title) + 205| expect(titles).toEqual(['First', 'Second', 'Third']) + | ^ + 206| }) + 207| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/37]⎯ + + FAIL src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +AssertionError: expected 'Available tools:\n- get_day (server: …' to contain 'tool_call' + +- Expected ++ Received + +- tool_call ++ Available tools: ++ - get_day (server: day-server): Returns current day of the week ++ - send_email (server: email-tool): Send an email via SMTP ++ ++ To call a tool, use this EXACT format: ++ ```tool_code ++ send_email(to="recipient@example.com", subject="Subject", body="Body text") ++ ``` ++ ++ EXAMPLE: ++ User: Send an email to john@example.com with subject "Hello" ++ Assistant: [drafts and gets confirmation] ++ User: yes ++ Assistant:  ++ ```tool_code ++ send_email(to="john@example.com", subject="Hello", body="The body text") ++ ``` ++ ++ Use these tools when they can help answer the user's question. + + ❯ src/__tests__/services/mcpService.test.ts:99:20 + 97| expect(prompt).toBeTruthy() + 98| expect(prompt).toContain('send_email') + 99| expect(prompt).toContain('tool_call') + | ^ + 100| expect(prompt).toContain('Example (send an email)') + 101| }) + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/37]⎯ + + FAIL src/__tests__/utils/utils.test.ts > cn utility function > should handle Tailwind class conflicts +AssertionError: expected 'text-blue-500' to be 'text-red-500 text-blue-500' // Object.is equality + +Expected: "text-red-500 text-blue-500" +Received: "text-blue-500" + + ❯ src/__tests__/utils/utils.test.ts:66:20 + 64| const result = cn('text-red-500', 'text-blue-500') + 65| // The last class should win in Tailwind's utility-first approach + 66| expect(result).toBe('text-red-500 text-blue-500') + | ^ + 67| }) + 68| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should load default settings when none exist +AssertionError: expected '' to be 'ollama' // Object.is equality + +- Expected ++ Received + +- ollama + + ❯ src/services/__tests__/stateManagement.test.ts:60:41 + 58| const settings = await settingsService.loadSettings(); + 59| + 60| expect(settings.selectedProvider).toBe('ollama'); + | ^ + 61| expect(settings.selectedModel).toBe('llama3.2'); + 62| expect(settings.theme).toBe('system'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should handle invalid JSON gracefully +AssertionError: expected '' to be 'ollama' // Object.is equality + +- Expected ++ Received + +- ollama + + ❯ src/services/__tests__/stateManagement.test.ts:86:41 + 84| const settings = await settingsService.loadSettings(); + 85| + 86| expect(settings.selectedProvider).toBe('ollama'); // Default + | ^ + 87| expect(settings.selectedModel).toBe('llama3.2'); // Default + 88| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +AssertionError: expected "spy" to be called at least once + ❯ src/services/__tests__/stateManagement.test.ts:199:45 + 197| await stateManager.initialize(); + 198| + 199| expect(mockStorageService.initialize).toHaveBeenCalled(); + | ^ + 200| expect(mockStorageService.listConversations).toHaveBeenCalled(); + 201| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +AssertionError: expected 'IndexedDB API missing. Please visit h…' to be 'Storage failed' // Object.is equality + +Expected: "Storage failed" +Received: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" + + ❯ src/services/__tests__/stateManagement.test.ts:209:27 + 207| + 208| const state = stateManager.getState(); + 209| expect(state.error).toBe('Storage failed'); + | ^ + 210| }); + 211| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +AssertionError: expected true to be false // Object.is equality + +- Expected ++ Received + +- false ++ true + + ❯ src/services/__tests__/stateManagement.test.ts:221:51 + 219| + 220| expect(listener).toHaveBeenCalled(); + 221| expect(listener.mock.calls[0][0].isLoading).toBe(false); + | ^ + 222| + 223| unsubscribe(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should provide readonly state access +AssertionError: expected [Function] to throw an error + ❯ src/services/__tests__/stateManagement.test.ts:232:10 + 230| expect(() => { + 231| (state as any).conversations = []; + 232| }).toThrow(); + | ^ + 233| }); + 234| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +AssertionError: expected "spy" to be called at least once + ❯ src/services/__tests__/stateManagement.test.ts:246:51 + 244| expect(conversation.provider).toBe('ollama'); + 245| expect(conversation.currentModel).toBe('llama3.2'); + 246| expect(mockStorageService.saveConversation).toHaveBeenCalled(); + | ^ + 247| }); + 248| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +DatabaseClosedError: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Error: Conversation not found + ❯ ConversationStateManager.toggleArchive src/services/conversationStateManager.ts:358:32 + 356| try { + 357| const conversation = this.state.conversations.find(c => c.id ===… + 358| if (!conversation) throw new Error('Conversation not found'); + | ^ + 359| + 360| const updatedConversation = { + ❯ src/services/__tests__/stateManagement.test.ts:271:26 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +DatabaseClosedError: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +AssertionError: expected "spy" to be called with arguments: [ 'test' ] + +Number of calls: 0 + + ❯ src/services/__tests__/stateManagement.test.ts:305:54 + 303| await stateManager.searchConversations(filters); + 304| + 305| expect(mockStorageService.searchConversations).toHaveBeenCalledW… + | ^ + 306| }); + 307| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationUtils > title generation > should truncate long messages +Error: Invalid Chai property: toEndWith + ❯ src/services/__tests__/stateManagement.test.ts:365:14 + 363| const title = ConversationUtils.generateTitle([longMessage]); + 364| expect(title.length).toBeLessThanOrEqual(53); + 365| expect(title).toEndWith('...'); + | ^ + 366| }); + 367| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/37]⎯ + + FAIL src/services/__tests__/storage.test.ts > StorageService > conversation operations > should truncate long titles appropriately +Error: Invalid Chai property: toEndWith + ❯ src/services/__tests__/storage.test.ts:85:14 + 83| const title = ConversationUtils.generateTitle([longMessage]); + 84| expect(title.length).toBeLessThanOrEqual(53); // 50 chars + '...' + 85| expect(title).toEndWith('...'); + | ^ + 86| }); + 87| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/37]⎯ + + FAIL src/services/__tests__/storage.test.ts > StorageService > sanitization > should remove API keys from messages +AssertionError: expected 'My API key is: sk-1234567890abcdef' to be 'My API key is: [REDACTED]' // Object.is equality + +Expected: "My API key is: [REDACTED]" +Received: "My API key is: sk-1234567890abcdef" + + ❯ src/services/__tests__/storage.test.ts:170:45 + 168| const sanitized = ConversationUtils.sanitizeConversation(updated… + 169| + 170| expect(sanitized.messages[0].content).toBe('My API key is: [REDA… + | ^ + 171| }); + 172| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/37]⎯ + + + Test Files 13 failed | 1 passed (14) + Tests 35 failed | 81 passed (116) + Start at 16:39:55 + Duration 2.92s (transform 367ms, setup 706ms, collect 1.51s, tests 2.73s, environment 3.86s, prepare 608ms) + + FAIL Tests failed. Watching for file changes... + press h to show help, press q to quit +Cancelling test run. Press CTRL+c again to exit forcefully. + +error: script "test" exited with code 130 diff --git a/test-report2.txt b/test-report2.txt new file mode 100644 index 000000000..775688079 --- /dev/null +++ b/test-report2.txt @@ -0,0 +1,5107 @@ +$ vitest "--reporter=verbose" --no-color + + DEV v4.0.12 /Users/forestmars/sandbox/polyglot + +stderr | src/__tests__/components/ConversationSidebar.test.tsx +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/ConversationSidebar.test.tsx +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/components/__tests__/ConversationSidebar.test.tsx +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/components/__tests__/ConversationSidebar.test.tsx +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/SettingsPanel.test.tsx +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/SettingsPanel.test.tsx +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + × src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations 45ms + → Unable to find an element with the text: First Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + × src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked 8ms + → Unable to find an element with the text: Second Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ✓ src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows new chat button 11ms + ✓ src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when new chat button is clicked 7ms + ✓ src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > shows search bar 9ms +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +[Sidebar] Rendered. Conversations: [] + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders the sidebar with correct title 42ms + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows search input 7ms + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows archive toggle button 5ms + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > calls onNewConversation when New Chat button is clicked 7ms + × src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially 12ms + → Unable to find an element with the text: Loading conversations.... This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows API key management for non-local providers +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + × src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection 66ms + → Found multiple elements with the text: Ollama + +Here are the matching elements: + +Ignored nodes: comments, script, style + + Ollama + + +Ignored nodes: comments, script, style + + Ollama + + +(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  +  SettingsPanel > displays current model information +[OllamaService] Checking health at: http://localhost:11434/api/tags + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +An update to SettingsPanel inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + × src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers 35ms + → Unable to find an accessible element with the role "combobox" and name `/provider/i` + +Here are the accessible roles: + + heading: + + Name "Settings": +  + + Name "General Settings": +  + + Name "Ollama Status": +  + + Name "Current Configuration": +  + + -------------------------------------------------- + button: + + Name "": +  + + Name "Checking...": +  + + Name "Data Transfer ▼": +  + + -------------------------------------------------- + checkbox: + + Name "Show Archived Chats": +  + + Name "Enable Conversation Cache": +  + + -------------------------------------------------- + textbox: + + Name "Ollama Base URL": +  + + Name "Base URL": +  + + -------------------------------------------------- + combobox: + + Name "": + span]:line-clamp-1 glass-panel" + data-state="closed" + dir="ltr" + role="combobox" + type="button" + /> + + -------------------------------------------------- + paragraph: + + Name "": +  + + -------------------------------------------------- + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  +  SettingsPanel > shows API key management for non-local providers 13ms + ✓ src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > hides data transfer section by default 11ms + ✓ src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > shows data transfer section when clicked 29ms + ✓ src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > displays current model information 13ms +stderr | src/services/__tests__/stateManagement.test.ts +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts +[DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should handle invalid JSON gracefully +Failed to load settings: SyntaxError: Unexpected token 'i', "invalid json" is not valid JSON + at JSON.parse () + at SettingsService.loadSettings (/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts:63:29) + at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:84:46 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20 + at new Promise () + at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10) + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37 + at Traces.$ (file:///Users/forestmars/sandbox/polyglot/node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js:115:27) + +stderr | src/services/__tests__/stateManagement.test.ts > SettingsService > saveSettings > should save settings to localStorage +Failed to load settings: SyntaxError: Unexpected token 'i', "invalid json" is not valid JSON + at JSON.parse () + at SettingsService.loadSettings (/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts:63:29) + at SettingsService.saveSettings (/Users/forestmars/sandbox/polyglot/src/services/settingsService.ts:79:34) + at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:98:29 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:145:11 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:26 + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1237:20 + at new Promise () + at runWithTimeout (file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1203:10) + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:1647:37 + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763677327598_pdwiy6upf + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Failed to load conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +Failed to load conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763677327631_oj8mrocul + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763677327631_oj8mrocul +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763677327631_oj8mrocul + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching +[StateManager] Cached model switch for conversation conv_1763677327631_oj8mrocul + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763677327642_i5fw2q1wr + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Failed to toggle archive status: Error: Conversation not found + at ConversationStateManager.toggleArchive (/Users/forestmars/sandbox/polyglot/src/services/conversationStateManager.ts:358:32) + at /Users/forestmars/sandbox/polyglot/src/services/__tests__/stateManagement.test.ts:271:26 + at processTicksAndRejections (node:internal/process/task_queues:105:5) + at file:///Users/forestmars/sandbox/polyglot/node_modules/@vitest/runner/dist/index.js:912:20 + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to delete empty/private-only conversation locally: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Loading conversations (showArchived: false) +[StateManager] Cleared conversation cache (was 0 items) + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Loaded 0 conversations from storage +[StateManager] Cached 0 conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: conv_1763677327646_qraa6b90v + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +[StateManager] Pre-emptively clearing conversation conv_1763677327646_qraa6b90v from cache + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to delete conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +Failed to delete conversation: [DexieError [DatabaseClosedError]: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null + } +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] Searching conversations with filters: { + searchQuery: 'test', + provider: 'ollama', + model: 'llama3.2', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +[StateManager] Found 0 conversations matching filters + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + × src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should load default settings when none exist 4ms + → expected '' to be 'ollama' // Object.is equality + ✓ src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should load existing settings from localStorage 0ms + × src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should handle invalid JSON gracefully 1ms + → expected '' to be 'ollama' // Object.is equality + ✓ src/services/__tests__/stateManagement.test.ts > SettingsService > saveSettings > should save settings to localStorage 1ms + ✓ src/services/__tests__/stateManagement.test.ts > SettingsService > saveSettings > should merge with existing settings 0ms + ✓ src/services/__tests__/stateManagement.test.ts > SettingsService > updateSetting > should update a single setting 0ms + ✓ src/services/__tests__/stateManagement.test.ts > SettingsService > validation > should validate theme values 0ms + ✓ src/services/__tests__/stateManagement.test.ts > SettingsService > validation > should validate numeric values 0ms + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully 2ms + → expected "vi.fn()" to be called at least once + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully 2ms + → expected 'IndexedDB API missing. Please visit h…' to be 'Storage failed' // Object.is equality + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes 1ms + → expected true to be false // Object.is equality + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should provide readonly state access 1ms + → expected [Function] to throw an error + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations 33ms + → expected "vi.fn()" to be called at least once + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID 1ms + → MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb + ✓ src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should handle model switching 10ms + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations 4ms + → Conversation not found + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations 4ms + → MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb + × src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations 1ms + → expected "vi.fn()" to be called with arguments: [ 'test' ] + +Number of calls: 0 + + ✓ src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should provide conversation statistics 0ms + ✓ src/services/__tests__/stateManagement.test.ts > ConversationStateManager > cleanup > should cleanup resources on destroy 0ms + ✓ src/services/__tests__/stateManagement.test.ts > ConversationUtils > ID generation > should generate unique IDs 0ms + ✓ src/services/__tests__/stateManagement.test.ts > ConversationUtils > title generation > should generate titles from short messages 0ms + × src/services/__tests__/stateManagement.test.ts > ConversationUtils > title generation > should truncate long messages 1ms + → Invalid Chai property: toEndWith + ✓ src/services/__tests__/stateManagement.test.ts > ConversationUtils > conversation creation > should create conversations with correct structure 0ms + ✓ src/services/__tests__/stateManagement.test.ts > ConversationUtils > model change tracking > should record model changes correctly 0ms +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🔌 Initializing MCP service... +🌐 Attempting to fetch /config/mcp.json... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +📥 Loaded MCP config from /config/mcp.json: [ 'day-server', 'email-tool' ] +📋 Found 2 MCP servers in config: [ 'day-server', 'email-tool' ] +🔗 Attempting to connect to day-server at ws://localhost:9001... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🟢 WebSocket connection established to day-server +🔍 Discovering tools from day-server... +📡 Sending tools/list request to day-server... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🛠️ Received 1 tools from day-server: [ 'get_day' ] + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +✅ Successfully connected to day-server +🔗 Attempting to connect to email-tool at ws://localhost:3000... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🟢 WebSocket connection established to email-tool +🔍 Discovering tools from email-tool... +📡 Sending tools/list request to email-tool... + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +🛠️ Received 1 tools from email-tool: [ 'send_email' ] + +stdout | src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +✅ Successfully connected to email-tool +🛠️ MCP initialization complete. Total tools available: 2 + + × src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt 63ms + → expected 'Available tools:\n- get_day (server: …' to contain 'tool_call' +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🧪 Initializing mcpService... +🔌 Initializing MCP service... +🌐 Attempting to fetch /config/mcp.json... + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +📥 Loaded MCP config from /config/mcp.json: [ 'day-server' ] +📋 Found 1 MCP servers in config: [ 'day-server' ] +🔗 Attempting to connect to day-server at ws://localhost:9001... + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🟢 WebSocket connection established to day-server +🔍 Discovering tools from day-server... +📡 Sending tools/list request to day-server... + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🛠️ Received 1 tools from day-server: [ 'get_day' ] + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +✅ Successfully connected to day-server +🛠️ MCP initialization complete. Total tools available: 1 + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration +🧪 mcpService ready +🧪 Available tools: [ 'get_day (day-server)' ] + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should know what day of the week it is via MCP tool +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should know what day of the week it is via MCP tool +✨ Tool get_day result: Today is Thursday + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "what day of the week" phrasing +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "what day of the week" phrasing +✨ Tool get_day result: Today is Thursday + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "today" keyword +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "today" keyword +✨ Tool get_day result: Today is Thursday + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should correctly answer what day tomorrow is +🔧 Calling tool get_day on day-server with args: {} + +stdout | tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should correctly answer what day tomorrow is +✨ Tool get_day result: Today is Thursday + + ✓ tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should know what day of the week it is via MCP tool 23ms + ✓ tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "what day of the week" phrasing 2ms + ✓ tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should handle "today" keyword 1ms + × tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should correctly answer what day tomorrow is 3ms + → expected 'Today is Thursday' to be null + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast function > should create a toast with basic properties 1ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast function > should create a toast with different variants 0ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast function > should create a toast with action 0ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast function > should create a toast with custom duration 0ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should return toast state and functions 7ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should add toast to state when created 2ms + × src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should dismiss toast when dismiss is called 7ms + → expected [ { title: 'Test Toast', …(3) } ] to have a length of +0 but got 1 + × src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should dismiss all toasts when no id is provided 1ms + → expected [ Array(1) ] to have a length of 3 but got 1 + × src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should handle multiple toasts 2ms + → expected [ { title: 'Third Toast', …(3) } ] to have a length of 3 but got 1 + × src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should generate unique ids for each toast 1ms + → expected [ '16' ] to have a length of 2 but got 1 + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should handle toast with only title 1ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should handle toast with only description 1ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should handle empty toast 2ms + × src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should maintain toast order 2ms + → expected [ 'Third' ] to deeply equal [ 'First', 'Second', 'Third' ] + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should handle dismiss of non-existent toast 2ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast variants > should handle default variant 1ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast variants > should handle destructive variant 1ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast duration > should use default duration when not specified 1ms + ✓ src/__tests__/hooks/use-toast.test.tsx > useToast hook > toast duration > should use custom duration when specified 1ms +stdout | src/__tests__/components/ChatInterface.test.tsx > ChatInterface > renders chat messages +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} + +stderr | src/__tests__/components/ChatInterface.test.tsx > ChatInterface > renders chat messages +Failed to load conversations: TypeError: Cannot read properties of undefined (reading 'length') + at loadFilteredConversations (/Users/forestmars/sandbox/polyglot/src/components/ConversationSidebar.tsx:98:61) + at processTicksAndRejections (node:internal/process/task_queues:105:5) + + × src/__tests__/components/ChatInterface.test.tsx > ChatInterface > renders chat messages 45ms + → scrollElement.scrollTo is not a function + × src/__tests__/components/ChatInterface.test.tsx > ChatInterface > allows sending a new message 1ms + → useConversationState is not defined + × src/__tests__/components/ChatInterface.test.tsx > ChatInterface > shows loading state when sending a message 0ms + → useConversationState is not defined + × src/__tests__/components/ChatInterface.test.tsx > ChatInterface > displays error message when there is an error 0ms + → useConversationState is not defined + × src/__tests__/components/ChatInterface.test.tsx > ChatInterface > allows switching models 0ms + → useConversationState is not defined +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: 'test query' +} +[StateManager] Searching conversations with filters: { + searchQuery: 'test query', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +[ConversationSidebar] Loaded 0 conversations (showArchived: false) +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: true, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: true, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=true +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +[ConversationSidebar] Loaded 0 conversations (showArchived: false) +[ConversationSidebar] Loaded 0 conversations (showArchived: true) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count +[Sidebar] Rendered. Conversations: [] + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +[Sidebar] Rendered. Conversations: [] +=== DEBUG: Loading conversations with filters === +Current filters: { + showArchived: false, + filterProvider: '', + filterModel: '', + searchQuery: '' +} +[StateManager] Searching conversations with filters: { + searchQuery: '', + provider: '', + model: '', + showArchived: false, + dateRange: 'not set' +} +[StateManager] Loading conversations with showArchived=false +Direct IndexedDB test: 0 +[StateManager] Cache enabled +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined +[StateManager] Found 0 conversations matching filters + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +Failed to list conversations: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +[ConversationSidebar] Loaded 0 conversations (showArchived: false) + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +An update to ConversationSidebar inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +Database initialization failed: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + +stdout | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +[StateManager] setState called. Previous conv IDs: [] New conv IDs: [] Current: undefined + +stderr | src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes +Failed to initialize conversation state manager: [DexieError [MissingAPIError]: IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb] { + inner: null +} + + × src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist 1006ms + → Unable to find an element with the text: No conversations yet. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + +Ignored nodes: comments, script, style + +  +  + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  +  + + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > handles search input changes 8ms + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > toggles archive visibility 8ms + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows conversation count 7ms + × src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling 6ms + → expect(element).toHaveClass("flex flex-col h-full bg-background border-r border-border") + +Expected the element to have class: + flex flex-col h-full bg-background border-r border-border +Received: + flex items-center justify-between mb-3 + ✓ src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > has proper accessibility attributes 4ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should return false for desktop screen width 10ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should return true for mobile screen width 2ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should return true for tablet screen width (edge case) 2ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should return false for tablet screen width (above breakpoint) 1ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should call matchMedia with correct query 2ms + × src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should handle window resize events 5ms + → expected false to be true // Object.is equality + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should handle media query change events 1ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should cleanup event listeners on unmount 1ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should handle edge case of very small screen 2ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should handle edge case of very large screen 1ms + ✓ src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should return boolean value 1ms + ✓ src/services/__tests__/storage.test.ts > StorageService > initialization > should initialize with correct directory paths 1ms + ✓ src/services/__tests__/storage.test.ts > StorageService > conversation operations > should create a conversation with correct structure 12ms + ✓ src/services/__tests__/storage.test.ts > StorageService > conversation operations > should generate title from first user message 0ms + × src/services/__tests__/storage.test.ts > StorageService > conversation operations > should truncate long titles appropriately 3ms + → Invalid Chai property: toEndWith + ✓ src/services/__tests__/storage.test.ts > StorageService > conversation operations > should add messages to conversation 1ms + ✓ src/services/__tests__/storage.test.ts > StorageService > conversation operations > should record model changes 0ms + ✓ src/services/__tests__/storage.test.ts > StorageService > conversation metadata > should extract metadata correctly 0ms + ✓ src/services/__tests__/storage.test.ts > StorageService > conversation metadata > should get conversation summary 0ms + ✓ src/services/__tests__/storage.test.ts > StorageService > conversation metadata > should handle empty conversations 0ms + ✓ src/services/__tests__/storage.test.ts > StorageService > validation > should validate correct conversation data 0ms + ✓ src/services/__tests__/storage.test.ts > StorageService > validation > should reject invalid conversation data 0ms + × src/services/__tests__/storage.test.ts > StorageService > sanitization > should remove API keys from messages 1ms + → expected 'My API key is: sk-1234567890abcdef' to be 'My API key is: [REDACTED]' // Object.is equality + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should merge class names correctly 3ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle conditional classes 0ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle undefined and null values 0ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle empty strings 0ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle arrays of classes 0ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle objects with conditional classes 0ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle mixed input types 0ms + × src/__tests__/utils/utils.test.ts > cn utility function > should handle Tailwind class conflicts 3ms + → expected 'text-blue-500' to be 'text-red-500 text-blue-500' // Object.is equality + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle complex conditional logic 0ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle no arguments 0ms + ✓ src/__tests__/utils/utils.test.ts > cn utility function > should handle single argument 0ms + ✓ src/tests/server/chatSync.unit.test.ts > Chat Sync API - Unit Tests > should create, delete, and verify removal of a chat 23ms + ✓ src/tests/server/chatSync.unit.test.ts > Chat Sync API - Unit Tests > should handle deleting non-existent chat 6ms + ✓ src/tests/server/chatSync.unit.test.ts > Chat Sync API - Unit Tests > should handle missing chat ID in delete request 5ms + ✓ src/tests/server/chatSync.unit.test.ts > Chat Sync API - Unit Tests > should delete multiple chats 12ms + ✓ src/tests/server/chatSync.unit.test.ts > Chat Sync API - Unit Tests > should fetch all chats 6ms + ✓ src/tests/server/chatSync.unit.test.ts > Chat Sync API - Unit Tests > should handle CORS preflight 4ms + +⎯⎯⎯⎯⎯⎯ Failed Suites 2 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL tools/email-tool/src/gmail.test.ts [ tools/email-tool/src/gmail.test.ts ] +Error: No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/gmail.test.ts +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/37]⎯ + + FAIL tools/email-tool/src/mcp.test.ts [ tools/email-tool/src/mcp.test.ts ] +Error: No test suite found in file /Users/forestmars/sandbox/polyglot/tools/email-tool/src/mcp.test.ts +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/37]⎯ + + +⎯⎯⎯⎯⎯⎯ Failed Tests 35 ⎯⎯⎯⎯⎯⎯⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > renders chat messages +TypeError: scrollElement.scrollTo is not a function + ❯ scrollToBottom src/components/ChatInterface.tsx:576:23 + 574| ); + 575| if (scrollElement) { + 576| scrollElement.scrollTo({ + | ^ + 577| top: scrollElement.scrollHeight, + 578| behavior: "smooth", + ❯ src/components/ChatInterface.tsx:587:5 + ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25989:20 + ❯ runWithFiberInDEV node_modules/react-dom/cjs/react-dom-client.development.js:874:13 + ❯ commitHookEffectListMount node_modules/react-dom/cjs/react-dom-client.development.js:13249:29 + ❯ commitHookPassiveMountEffects node_modules/react-dom/cjs/react-dom-client.development.js:13336:11 + ❯ commitPassiveMountOnFiber node_modules/react-dom/cjs/react-dom-client.development.js:15484:13 + ❯ recursivelyTraversePassiveMountEffects node_modules/react-dom/cjs/react-dom-client.development.js:15439:11 + ❯ commitPassiveMountOnFiber node_modules/react-dom/cjs/react-dom-client.development.js:15519:11 + ❯ flushPassiveEffects node_modules/react-dom/cjs/react-dom-client.development.js:18432:9 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > allows sending a new message +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:70:15 + 68| it('allows sending a new message', async () => { + 69| const mockAddMessage = vi.fn(); + 70| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 71| ...useConversationState(), + 72| addMessage: mockAddMessage + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > shows loading state when sending a message +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:95:15 + 93| + 94| it('shows loading state when sending a message', async () => { + 95| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 96| ...useConversationState(), + 97| state: { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > displays error message when there is an error +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:109:15 + 107| + 108| it('displays error message when there is an error', () => { + 109| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 110| ...useConversationState(), + 111| state: { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/37]⎯ + + FAIL src/__tests__/components/ChatInterface.test.tsx > ChatInterface > allows switching models +ReferenceError: useConversationState is not defined + ❯ src/__tests__/components/ChatInterface.test.tsx:124:15 + 122| it('allows switching models', () => { + 123| const mockSwitchModel = vi.fn(); + 124| vi.mocked(useConversationState).mockImplementation(() => ({ + | ^ + 125| ...useConversationState(), + 126| switchModel: mockSwitchModel + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/37]⎯ + + FAIL src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > displays list of conversations +TestingLibraryElementError: Unable to find an element with the text: First Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 + ❯ getByText node_modules/@testing-library/dom/dist/query-helpers.js:95:19 + ❯ src/__tests__/components/ConversationSidebar.test.tsx:58:19 + 56| ); + 57| + 58| expect(screen.getByText('First Chat')).toBeInTheDocument(); + | ^ + 59| expect(screen.getByText('Second Chat')).toBeInTheDocument(); + 60| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/37]⎯ + + FAIL src/__tests__/components/ConversationSidebar.test.tsx > ConversationSidebar > calls onConversationSelect when a conversation is clicked +TestingLibraryElementError: Unable to find an element with the text: Second Chat. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 + ❯ getByText node_modules/@testing-library/dom/dist/query-helpers.js:95:19 + ❯ src/__tests__/components/ConversationSidebar.test.tsx:77:31 + 75| ); + 76| + 77| const secondChat = screen.getByText('Second Chat'); + | ^ + 78| fireEvent.click(secondChat); + 79| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/37]⎯ + + FAIL src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > renders provider selection +TestingLibraryElementError: Found multiple elements with the text: Ollama + +Here are the matching elements: + +Ignored nodes: comments, script, style + + Ollama + + +Ignored nodes: comments, script, style + + Ollama + + +(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  + ); + 42| expect(screen.getByText('Provider')).toBeInTheDocument(); + 43| expect(screen.getByText('Ollama')).toBeInTheDocument(); + | ^ + 44| }); + 45| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/37]⎯ + + FAIL src/__tests__/components/SettingsPanel.test.tsx > SettingsPanel > allows switching providers +TestingLibraryElementError: Unable to find an accessible element with the role "combobox" and name `/provider/i` + +Here are the accessible roles: + + heading: + + Name "Settings": +  + + Name "General Settings": +  + + Name "Ollama Status": +  + + Name "Current Configuration": +  + + -------------------------------------------------- + button: + + Name "": +  + + Name "Checking...": +  + + Name "Data Transfer ▼": +  + + -------------------------------------------------- + checkbox: + + Name "Show Archived Chats": +  + + Name "Enable Conversation Cache": +  + + -------------------------------------------------- + textbox: + + Name "Ollama Base URL": +  + + Name "Base URL": +  + + -------------------------------------------------- + combobox: + + Name "": + span]:line-clamp-1 glass-panel" + data-state="closed" + dir="ltr" + role="combobox" + type="button" + /> + + -------------------------------------------------- + paragraph: + + Name "": +  + + -------------------------------------------------- + +Ignored nodes: comments, script, style + + 
 +  +  +  + Settings +  +  +  +  +  +  +  + 
 +  +  +  +  +  +  +  +  + General Settings +  +  +  +  +  + Show Archived Chats +  +  +  +  +  + Enable Conversation Cache +  +  +  +  +  + Ollama Base URL +  +  +  +  +  +  +  + Provider +  +  { + 47| render(); + 48| const select = screen.getByRole('combobox', { name: /provider/i }); + | ^ + 49| fireEvent.mouseDown(select); + 50| const openaiOption = screen.getByText('OpenAI'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/37]⎯ + + FAIL src/__tests__/hooks/use-mobile.test.tsx > useIsMobile hook > should handle window resize events +AssertionError: expected false to be true // Object.is equality + +- Expected ++ Received + +- true ++ false + + ❯ src/__tests__/hooks/use-mobile.test.tsx:119:28 + 117| rerender() + 118| + 119| expect(result.current).toBe(true) + | ^ + 120| }) + 121| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should dismiss toast when dismiss is called +AssertionError: expected [ { title: 'Test Toast', …(3) } ] to have a length of +0 but got 1 + +- Expected ++ Received + +- 0 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:111:37 + 109| }) + 110| + 111| expect(result.current.toasts).toHaveLength(0) + | ^ + 112| }) + 113| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should dismiss all toasts when no id is provided +AssertionError: expected [ Array(1) ] to have a length of 3 but got 1 + +- Expected ++ Received + +- 3 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:123:37 + 121| }) + 122| + 123| expect(result.current.toasts).toHaveLength(3) + | ^ + 124| + 125| act(() => { + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should handle multiple toasts +AssertionError: expected [ { title: 'Third Toast', …(3) } ] to have a length of 3 but got 1 + +- Expected ++ Received + +- 3 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:141:37 + 139| }) + 140| + 141| expect(result.current.toasts).toHaveLength(3) + | ^ + 142| expect(result.current.toasts[0].title).toBe('First Toast') + 143| expect(result.current.toasts[1].title).toBe('Second Toast') + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should generate unique ids for each toast +AssertionError: expected [ '16' ] to have a length of 2 but got 1 + +- Expected ++ Received + +- 2 ++ 1 + + ❯ src/__tests__/hooks/use-toast.test.tsx:156:19 + 154| + 155| const ids = result.current.toasts.map(t => t.id) + 156| expect(ids).toHaveLength(2) + | ^ + 157| expect(ids[0]).not.toBe(ids[1]) + 158| }) + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/37]⎯ + + FAIL src/__tests__/hooks/use-toast.test.tsx > useToast hook > useToast hook > should maintain toast order +AssertionError: expected [ 'Third' ] to deeply equal [ 'First', 'Second', 'Third' ] + +- Expected ++ Received + + [ +- "First", +- "Second", + "Third", + ] + + ❯ src/__tests__/hooks/use-toast.test.tsx:205:22 + 203| + 204| const titles = result.current.toasts.map(t => t.title) + 205| expect(titles).toEqual(['First', 'Second', 'Third']) + | ^ + 206| }) + 207| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/37]⎯ + + FAIL src/__tests__/services/mcpService.test.ts > mcpService discovery and prompt generation > discovers both configured servers and builds a structured cached prompt +AssertionError: expected 'Available tools:\n- get_day (server: …' to contain 'tool_call' + +- Expected ++ Received + +- tool_call ++ Available tools: ++ - get_day (server: day-server): Returns current day of the week ++ - send_email (server: email-tool): Send an email via SMTP ++ ++ To call a tool, use this EXACT format: ++ ```tool_code ++ send_email(to="recipient@example.com", subject="Subject", body="Body text") ++ ``` ++ ++ EXAMPLE: ++ User: Send an email to john@example.com with subject "Hello" ++ Assistant: [drafts and gets confirmation] ++ User: yes ++ Assistant:  ++ ```tool_code ++ send_email(to="john@example.com", subject="Hello", body="The body text") ++ ``` ++ ++ Use these tools when they can help answer the user's question. + + ❯ src/__tests__/services/mcpService.test.ts:99:20 + 97| expect(prompt).toBeTruthy() + 98| expect(prompt).toContain('send_email') + 99| expect(prompt).toContain('tool_call') + | ^ + 100| expect(prompt).toContain('Example (send an email)') + 101| }) + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/37]⎯ + + FAIL src/__tests__/utils/utils.test.ts > cn utility function > should handle Tailwind class conflicts +AssertionError: expected 'text-blue-500' to be 'text-red-500 text-blue-500' // Object.is equality + +Expected: "text-red-500 text-blue-500" +Received: "text-blue-500" + + ❯ src/__tests__/utils/utils.test.ts:66:20 + 64| const result = cn('text-red-500', 'text-blue-500') + 65| // The last class should win in Tailwind's utility-first approach + 66| expect(result).toBe('text-red-500 text-blue-500') + | ^ + 67| }) + 68| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/37]⎯ + + FAIL tests/integration/mcpDayTool.integration.test.ts > MCP Day Tool Integration > should correctly answer what day tomorrow is +AssertionError: expected 'Today is Thursday' to be null + +- Expected: +null + ++ Received: +"Today is Thursday" + + ❯ tests/integration/mcpDayTool.integration.test.ts:92:22 + 90| // "Tomorrow" should NOT be routed to MCP - it should return null + 91| // and let the LLM handle the reasoning + 92| expect(response).toBeNull(); + | ^ + 93| }); + 94| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/37]⎯ + + FAIL src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows loading state initially +TestingLibraryElementError: Unable to find an element with the text: Loading conversations.... This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 + ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 + ❯ getByText node_modules/@testing-library/dom/dist/query-helpers.js:95:19 + ❯ src/components/__tests__/ConversationSidebar.test.tsx:94:19 + 92| render(); + 93| + 94| expect(screen.getByText('Loading conversations...')).toBeInTheDocu… + | ^ + 95| }); + 96| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[21/37]⎯ + + FAIL src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > shows empty state when no conversations exist +TestingLibraryElementError: Unable to find an element with the text: No conversations yet. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. + +Ignored nodes: comments, script, style + + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  + + +Ignored nodes: comments, script, style + +  +  + 
 +  +  +  +  + Conversations +  +  +  +  +  +  + New Chat +  + 
 +  +  +  +  +  +  +  +  +  +  +  +  + Filters: +  +  +  +  +  +  +  +  +  + Show +  Archived +  +  + 0 +  conversation + s +  +  +  +  +  +  +  + 

 + No conversations yet. Start chatting to create one! + 

 +  +  +  +  +  +  +  + + ❯ Proxy.waitFor node_modules/@testing-library/dom/dist/wait-for.js:163:27 + ❯ src/components/__tests__/ConversationSidebar.test.tsx:100:11 + 98| render(); + 99| + 100| await waitFor(() => { + | ^ + 101| expect(screen.getByText('No conversations yet')).toBeInTheDocume… + 102| expect(screen.getByText('Start a new chat to get started')).toBe… + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[22/37]⎯ + + FAIL src/components/__tests__/ConversationSidebar.test.tsx > ConversationSidebar > renders with correct width and styling +Error: expect(element).toHaveClass("flex flex-col h-full bg-background border-r border-border") + +Expected the element to have class: + flex flex-col h-full bg-background border-r border-border +Received: + flex items-center justify-between mb-3 + ❯ src/components/__tests__/ConversationSidebar.test.tsx:136:21 + 134| + 135| const sidebar = screen.getByText('Conversations').closest('div'); + 136| expect(sidebar).toHaveClass('flex', 'flex-col', 'h-full', 'bg-back… + | ^ + 137| }); + 138| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[23/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should load default settings when none exist +AssertionError: expected '' to be 'ollama' // Object.is equality + +- Expected ++ Received + +- ollama + + ❯ src/services/__tests__/stateManagement.test.ts:60:41 + 58| const settings = await settingsService.loadSettings(); + 59| + 60| expect(settings.selectedProvider).toBe('ollama'); + | ^ + 61| expect(settings.selectedModel).toBe('llama3.2'); + 62| expect(settings.theme).toBe('system'); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[24/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > SettingsService > loadSettings > should handle invalid JSON gracefully +AssertionError: expected '' to be 'ollama' // Object.is equality + +- Expected ++ Received + +- ollama + + ❯ src/services/__tests__/stateManagement.test.ts:86:41 + 84| const settings = await settingsService.loadSettings(); + 85| + 86| expect(settings.selectedProvider).toBe('ollama'); // Default + | ^ + 87| expect(settings.selectedModel).toBe('llama3.2'); // Default + 88| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[25/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should initialize successfully +AssertionError: expected "vi.fn()" to be called at least once + ❯ src/services/__tests__/stateManagement.test.ts:199:45 + 197| await stateManager.initialize(); + 198| + 199| expect(mockStorageService.initialize).toHaveBeenCalled(); + | ^ + 200| expect(mockStorageService.listConversations).toHaveBeenCalled(); + 201| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[26/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > initialization > should handle initialization errors gracefully +AssertionError: expected 'IndexedDB API missing. Please visit h…' to be 'Storage failed' // Object.is equality + +Expected: "Storage failed" +Received: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" + + ❯ src/services/__tests__/stateManagement.test.ts:209:27 + 207| + 208| const state = stateManager.getState(); + 209| expect(state.error).toBe('Storage failed'); + | ^ + 210| }); + 211| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[27/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should notify listeners of state changes +AssertionError: expected true to be false // Object.is equality + +- Expected ++ Received + +- false ++ true + + ❯ src/services/__tests__/stateManagement.test.ts:221:51 + 219| + 220| expect(listener).toHaveBeenCalled(); + 221| expect(listener.mock.calls[0][0].isLoading).toBe(false); + | ^ + 222| + 223| unsubscribe(); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[28/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > state management > should provide readonly state access +AssertionError: expected [Function] to throw an error + ❯ src/services/__tests__/stateManagement.test.ts:232:10 + 230| expect(() => { + 231| (state as any).conversations = []; + 232| }).toThrow(); + | ^ + 233| }); + 234| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[29/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should create new conversations +AssertionError: expected "vi.fn()" to be called at least once + ❯ src/services/__tests__/stateManagement.test.ts:246:51 + 244| expect(conversation.provider).toBe('ollama'); + 245| expect(conversation.currentModel).toBe('llama3.2'); + 246| expect(mockStorageService.saveConversation).toHaveBeenCalled(); + | ^ + 247| }); + 248| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[30/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should load conversations by ID +DatabaseClosedError: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ +Serialized Error: { inner: { name: 'MissingAPIError', message: 'IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb', inner: null, constructor: 'Function', toString: 'Function' } } +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[31/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should archive and unarchive conversations +Error: Conversation not found + ❯ ConversationStateManager.toggleArchive src/services/conversationStateManager.ts:358:32 + 356| try { + 357| const conversation = this.state.conversations.find(c => c.id ===… + 358| if (!conversation) throw new Error('Conversation not found'); + | ^ + 359| + 360| const updatedConversation = { + ❯ src/services/__tests__/stateManagement.test.ts:271:26 + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[32/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > conversation operations > should delete conversations +DatabaseClosedError: MissingAPIError IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ +Serialized Error: { inner: { name: 'MissingAPIError', message: 'IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb', inner: null, constructor: 'Function', toString: 'Function' } } +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[33/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationStateManager > search and filtering > should search conversations +AssertionError: expected "vi.fn()" to be called with arguments: [ 'test' ] + +Number of calls: 0 + + ❯ src/services/__tests__/stateManagement.test.ts:305:54 + 303| await stateManager.searchConversations(filters); + 304| + 305| expect(mockStorageService.searchConversations).toHaveBeenCalledW… + | ^ + 306| }); + 307| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[34/37]⎯ + + FAIL src/services/__tests__/stateManagement.test.ts > ConversationUtils > title generation > should truncate long messages +Error: Invalid Chai property: toEndWith + ❯ src/services/__tests__/stateManagement.test.ts:365:14 + 363| const title = ConversationUtils.generateTitle([longMessage]); + 364| expect(title.length).toBeLessThanOrEqual(53); + 365| expect(title).toEndWith('...'); + | ^ + 366| }); + 367| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[35/37]⎯ + + FAIL src/services/__tests__/storage.test.ts > StorageService > conversation operations > should truncate long titles appropriately +Error: Invalid Chai property: toEndWith + ❯ src/services/__tests__/storage.test.ts:85:14 + 83| const title = ConversationUtils.generateTitle([longMessage]); + 84| expect(title.length).toBeLessThanOrEqual(53); // 50 chars + '...' + 85| expect(title).toEndWith('...'); + | ^ + 86| }); + 87| + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[36/37]⎯ + + FAIL src/services/__tests__/storage.test.ts > StorageService > sanitization > should remove API keys from messages +AssertionError: expected 'My API key is: sk-1234567890abcdef' to be 'My API key is: [REDACTED]' // Object.is equality + +Expected: "My API key is: [REDACTED]" +Received: "My API key is: sk-1234567890abcdef" + + ❯ src/services/__tests__/storage.test.ts:170:45 + 168| const sanitized = ConversationUtils.sanitizeConversation(updated… + 169| + 170| expect(sanitized.messages[0].content).toBe('My API key is: [REDA… + | ^ + 171| }); + 172| }); + +⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[37/37]⎯ + + + Test Files 13 failed | 1 passed (14) + Tests 35 failed | 81 passed (116) + Start at 17:22:06 + Duration 2.82s (transform 736ms, setup 731ms, collect 1.60s, tests 2.74s, environment 4.12s, prepare 69ms) + + FAIL Tests failed. Watching for file changes... + press h to show help, press q to quit +Cancelling test run. Press CTRL+c again to exit forcefully. + +error: script "test" exited with code 130 diff --git a/tests/integration/mcpDayTool.integration.test.ts b/tests/integration/mcpDayTool.integration.test.ts index be77cf4ea..b6134097e 100644 --- a/tests/integration/mcpDayTool.integration.test.ts +++ b/tests/integration/mcpDayTool.integration.test.ts @@ -8,7 +8,7 @@ import { mcpService } from '../../src/services/mcpService'; import { spawn, ChildProcess } from 'child_process'; import path from 'path'; -describe('MCP Day Tool Integration', () => { +describe('MCP Day Tool Integration', { tags: ['db'] }, () => { let mcpServer: ChildProcess; beforeAll(async () => { diff --git a/vitest.config.ts b/vitest.config.ts index 1bca0a2f3..96e03d9f9 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -7,6 +7,13 @@ export default defineConfig({ plugins: [react()], test: { environment: 'jsdom', + //pool: 'forks', + //poolOptions: { + // forks: { + // Force tests to run in single, persistent process so we don't grow old. + // singleFork: true, + // }, + //}, setupFiles: ['./src/tests/setup.ts'], globals: true, css: true,