{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:01.704913Z","repo":{"ref":{"host":"github.com","owner":"RyanTheAllmighty","name":"ai-usage-monitor"},"default_branch":"main","clone_url":"https://github.com/RyanTheAllmighty/ai-usage-monitor.git","html_url":"https://github.com/RyanTheAllmighty/ai-usage-monitor","description":"A local-first Electron desktop app for watching AI provider spend, credit, quota, and usage from the system tray.","stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":632,"primary_language":"TypeScript","license_spdx":null,"created_at":"2026-04-27T09:57:58Z","pushed_at":"2026-08-22T04:40:41Z","security_policy_url":null,"distribution":{"owner_created_at":"2012-05-09T17:53:38Z","owner_type":"User","release_assets":[{"name":"ai-usage-monitor-0.2.0-linux-x86_64.AppImage","size":143436530,"download_count":0,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-linux-x86_64.AppImage"},{"name":"ai-usage-monitor-0.2.0-mac-arm64.dmg","size":134707700,"download_count":0,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-mac-arm64.dmg"},{"name":"ai-usage-monitor-0.2.0-mac-arm64.dmg.blockmap","size":141369,"download_count":0,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-mac-arm64.dmg.blockmap"},{"name":"ai-usage-monitor-0.2.0-win-x64.exe","size":112785062,"download_count":1,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-win-x64.exe"},{"name":"ai-usage-monitor-0.2.0-win-x64.exe.blockmap","size":118914,"download_count":1,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-win-x64.exe.blockmap"},{"name":"builder-debug.yml","size":945,"download_count":0,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/builder-debug.yml"},{"name":"latest-linux.yml","size":410,"download_count":0,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/latest-linux.yml"},{"name":"latest-mac.yml","size":369,"download_count":0,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/latest-mac.yml"},{"name":"latest.yml","size":365,"download_count":80,"release_tag":"v0.2.0","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/latest.yml"},{"name":"ai-usage-monitor-0.1.3-linux-x86_64.AppImage","size":143436492,"download_count":0,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/ai-usage-monitor-0.1.3-linux-x86_64.AppImage"},{"name":"ai-usage-monitor-0.1.3-mac-arm64.dmg","size":134704660,"download_count":0,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/ai-usage-monitor-0.1.3-mac-arm64.dmg"},{"name":"ai-usage-monitor-0.1.3-mac-arm64.dmg.blockmap","size":142556,"download_count":0,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/ai-usage-monitor-0.1.3-mac-arm64.dmg.blockmap"},{"name":"ai-usage-monitor-0.1.3-win-x64.exe","size":112783157,"download_count":1,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/ai-usage-monitor-0.1.3-win-x64.exe"},{"name":"ai-usage-monitor-0.1.3-win-x64.exe.blockmap","size":118869,"download_count":1,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/ai-usage-monitor-0.1.3-win-x64.exe.blockmap"},{"name":"builder-debug.yml","size":945,"download_count":0,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/builder-debug.yml"},{"name":"latest-linux.yml","size":410,"download_count":0,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/latest-linux.yml"},{"name":"latest-mac.yml","size":369,"download_count":0,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/latest-mac.yml"},{"name":"latest.yml","size":365,"download_count":53,"release_tag":"v0.1.3","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/latest.yml"},{"name":"ai-usage-monitor-0.1.2-linux-x86_64.AppImage","size":143432406,"download_count":0,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/ai-usage-monitor-0.1.2-linux-x86_64.AppImage"},{"name":"ai-usage-monitor-0.1.2-mac-arm64.dmg","size":134698975,"download_count":0,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/ai-usage-monitor-0.1.2-mac-arm64.dmg"},{"name":"ai-usage-monitor-0.1.2-mac-arm64.dmg.blockmap","size":141961,"download_count":0,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/ai-usage-monitor-0.1.2-mac-arm64.dmg.blockmap"},{"name":"ai-usage-monitor-0.1.2-win-x64.exe","size":112782764,"download_count":1,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/ai-usage-monitor-0.1.2-win-x64.exe"},{"name":"ai-usage-monitor-0.1.2-win-x64.exe.blockmap","size":118874,"download_count":1,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/ai-usage-monitor-0.1.2-win-x64.exe.blockmap"},{"name":"builder-debug.yml","size":945,"download_count":0,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/builder-debug.yml"},{"name":"latest-linux.yml","size":410,"download_count":0,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/latest-linux.yml"},{"name":"latest-mac.yml","size":369,"download_count":0,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/latest-mac.yml"},{"name":"latest.yml","size":365,"download_count":4,"release_tag":"v0.1.2","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.2/latest.yml"}]}},"commit_sha":"54032d3a27e4e1d3d40c74a4ca6d5dc14a219017","profile":{"lines_by_language":{"TypeScript":8354,"JavaScript":622},"files_by_category":{"source":33,"config":8,"binary":7,"other":6,"test":3,"docs":2,"generated":1},"source_lines":8234,"test_lines":742},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.46,"coverage":1.0,"label":"none-detected","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":0.0,"style_index":0.0},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":59.1,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":52.3,"duplication":59.4,"lint":49.7,"testing":69.5,"docs":40.0,"type_safety":100.0,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.09, CI runs tests; 22% of function code in complex or long functions; 9% duplicated lines. Weakest area: docs."},"security":{"score":54.6,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":97.9,"dependencies":3.6,"ci_actions":12.2,"posture":20.0,"scorecard":null},"summary":"Security posture is weak: 142 known vulnerabilities in 29 dependencies; 11 high-severity workflow issues. Weakest area: dependencies."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"ok","tool_version":null,"metrics":{"declared":54.0,"checked":54.0,"missing":0.0,"recent":0.0,"lookup_errors":0.0},"findings":[],"evidence":[],"data":{"phantom":false},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":22.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":9249.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2026-04":{"loc":6243,"attributed_loc":0},"2026-06":{"loc":2636,"attributed_loc":0},"2026-08":{"loc":370,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":8.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":3006.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":397.5080558539205,"median_loc_per_hour":119.59134615384616,"pr_timed_units":0.0,"excluded_import_loc":6243.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["0ced28ae4ef29b2a9f46fd7443b04425162639b8"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":6.0,"flagged_releases":0.0,"max_loc_per_day":1677.6},"findings":[],"evidence":[],"data":{"releases":[{"from":"v0.0.1","to":"v0.0.2","loc":42,"days":47.17,"loc_per_day":0.9,"flagged":false},{"from":"v0.0.2","to":"v0.1.0","loc":1991,"days":9.69,"loc_per_day":205.5,"flagged":false},{"from":"v0.1.0","to":"v0.1.1","loc":323,"days":0.19,"loc_per_day":1677.6,"flagged":false},{"from":"v0.1.1","to":"v0.1.2","loc":0,"days":1.59,"loc_per_day":0.0,"flagged":false},{"from":"v0.1.2","to":"v0.1.3","loc":280,"days":2.23,"loc_per_day":125.5,"flagged":false},{"from":"v0.1.3","to":"v0.2.0","loc":370,"days":54.91,"loc_per_day":6.7,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":8234.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":2.0,"findings_high":0.0,"findings_medium":2.0,"findings_low":0.0,"weighted_findings":0.5,"scanned_lines":8234.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/main/providers.ts","line":475,"fingerprint":"javascript.lang.security.html-in-template-string:src/main/providers.ts:475"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/main/providers.ts","line":735,"fingerprint":"javascript.lang.security.html-in-template-string:src/main/providers.ts:735"}],"evidence":[],"data":{"rulesets":["typescript","javascript"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":29.0,"vulnerabilities":142.0,"vulns_critical":1.0,"vulns_high":78.0,"vulns_medium":49.0,"vulns_low":14.0,"vulns_unknown":0.0,"penalty":200.0},"findings":[{"rule_id":"osv/GHSA-23hp-3jrh-7fpw","severity":"critical","message":"tar@7.5.13 (npm) is affected by GHSA-23hp-3jrh-7fpw","path":"pnpm-lock.yaml","line":null,"fingerprint":"tar@7.5.13 (npm):GHSA-23hp-3jrh-7fpw"},{"rule_id":"osv/GHSA-27p8-2357-5qqv","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-27p8-2357-5qqv","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-27p8-2357-5qqv"},{"rule_id":"osv/GHSA-4w3w-2rp5-g8jm","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-4w3w-2rp5-g8jm","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-4w3w-2rp5-g8jm"},{"rule_id":"osv/GHSA-8344-3jmq-59r6","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-8344-3jmq-59r6","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-8344-3jmq-59r6"},{"rule_id":"osv/GHSA-93r5-fhx6-vmg9","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-93r5-fhx6-vmg9","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-93r5-fhx6-vmg9"},{"rule_id":"osv/GHSA-965w-775f-mr7g","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-965w-775f-mr7g","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-965w-775f-mr7g"},{"rule_id":"osv/GHSA-c7q8-3ch8-vqpv","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-c7q8-3ch8-vqpv","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-c7q8-3ch8-vqpv"},{"rule_id":"osv/GHSA-w2rr-34g9-rvrj","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-w2rr-34g9-rvrj","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-w2rr-34g9-rvrj"},{"rule_id":"osv/GHSA-x4fp-j954-r2f4","severity":"high","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-x4fp-j954-r2f4","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-x4fp-j954-r2f4"},{"rule_id":"osv/GHSA-27p8-2357-5qqv","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-27p8-2357-5qqv","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-27p8-2357-5qqv"},{"rule_id":"osv/GHSA-3px3-54cx-rmw9","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-3px3-54cx-rmw9","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-3px3-54cx-rmw9"},{"rule_id":"osv/GHSA-4w3w-2rp5-g8jm","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-4w3w-2rp5-g8jm","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-4w3w-2rp5-g8jm"},{"rule_id":"osv/GHSA-6mj3-qw4j-hgrw","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-6mj3-qw4j-hgrw","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-6mj3-qw4j-hgrw"},{"rule_id":"osv/GHSA-8344-3jmq-59r6","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-8344-3jmq-59r6","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-8344-3jmq-59r6"},{"rule_id":"osv/GHSA-93r5-fhx6-vmg9","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-93r5-fhx6-vmg9","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-93r5-fhx6-vmg9"},{"rule_id":"osv/GHSA-965w-775f-mr7g","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-965w-775f-mr7g","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-965w-775f-mr7g"},{"rule_id":"osv/GHSA-c7q8-3ch8-vqpv","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-c7q8-3ch8-vqpv","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-c7q8-3ch8-vqpv"},{"rule_id":"osv/GHSA-g53g-w8rj-fmg7","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-g53g-w8rj-fmg7","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-g53g-w8rj-fmg7"},{"rule_id":"osv/GHSA-vr34-hp96-76pp","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-vr34-hp96-76pp","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-vr34-hp96-76pp"},{"rule_id":"osv/GHSA-w2rr-34g9-rvrj","severity":"high","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-w2rr-34g9-rvrj","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-w2rr-34g9-rvrj"},{"rule_id":"osv/GHSA-7g7r-gx96-252g","severity":"high","message":"app-builder-lib@26.8.1 (npm) is affected by GHSA-7g7r-gx96-252g","path":"pnpm-lock.yaml","line":null,"fingerprint":"app-builder-lib@26.8.1 (npm):GHSA-7g7r-gx96-252g"},{"rule_id":"osv/GHSA-3jxr-9vmj-r5cp","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-3jxr-9vmj-r5cp","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-3jxr-9vmj-r5cp"},{"rule_id":"osv/GHSA-6j4f-fj2g-mc7p","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-6j4f-fj2g-mc7p","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-6j4f-fj2g-mc7p"},{"rule_id":"osv/GHSA-mh99-v99m-4gvg","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-mh99-v99m-4gvg","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-mh99-v99m-4gvg"},{"rule_id":"osv/GHSA-qhr7-859c-m2p7","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-qhr7-859c-m2p7","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-qhr7-859c-m2p7"},{"rule_id":"osv/GHSA-rgw5-rvv9-x895","severity":"high","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-rgw5-rvv9-x895","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-rgw5-rvv9-x895"},{"rule_id":"osv/GHSA-3jxr-9vmj-r5cp","severity":"high","message":"brace-expansion@2.1.0 (npm) is affected by GHSA-3jxr-9vmj-r5cp","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@2.1.0 (npm):GHSA-3jxr-9vmj-r5cp"},{"rule_id":"osv/GHSA-6j4f-fj2g-mc7p","severity":"high","message":"brace-expansion@2.1.0 (npm) is affected by GHSA-6j4f-fj2g-mc7p","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@2.1.0 (npm):GHSA-6j4f-fj2g-mc7p"},{"rule_id":"osv/GHSA-mh99-v99m-4gvg","severity":"high","message":"brace-expansion@2.1.0 (npm) is affected by GHSA-mh99-v99m-4gvg","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@2.1.0 (npm):GHSA-mh99-v99m-4gvg"},{"rule_id":"osv/GHSA-qhr7-859c-m2p7","severity":"high","message":"brace-expansion@2.1.0 (npm) is affected by GHSA-qhr7-859c-m2p7","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@2.1.0 (npm):GHSA-qhr7-859c-m2p7"},{"rule_id":"osv/GHSA-rgw5-rvv9-x895","severity":"high","message":"brace-expansion@2.1.0 (npm) is affected by GHSA-rgw5-rvv9-x895","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@2.1.0 (npm):GHSA-rgw5-rvv9-x895"},{"rule_id":"osv/GHSA-3jxr-9vmj-r5cp","severity":"high","message":"brace-expansion@5.0.5 (npm) is affected by GHSA-3jxr-9vmj-r5cp","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.5 (npm):GHSA-3jxr-9vmj-r5cp"},{"rule_id":"osv/GHSA-6j4f-fj2g-mc7p","severity":"high","message":"brace-expansion@5.0.5 (npm) is affected by GHSA-6j4f-fj2g-mc7p","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.5 (npm):GHSA-6j4f-fj2g-mc7p"},{"rule_id":"osv/GHSA-mh99-v99m-4gvg","severity":"high","message":"brace-expansion@5.0.5 (npm) is affected by GHSA-mh99-v99m-4gvg","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.5 (npm):GHSA-mh99-v99m-4gvg"},{"rule_id":"osv/GHSA-qhr7-859c-m2p7","severity":"high","message":"brace-expansion@5.0.5 (npm) is affected by GHSA-qhr7-859c-m2p7","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.5 (npm):GHSA-qhr7-859c-m2p7"},{"rule_id":"osv/GHSA-rgw5-rvv9-x895","severity":"high","message":"brace-expansion@5.0.5 (npm) is affected by GHSA-rgw5-rvv9-x895","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.5 (npm):GHSA-rgw5-rvv9-x895"},{"rule_id":"osv/GHSA-73wf-gq98-2v4g","severity":"high","message":"browserslist@4.28.2 (npm) is affected by GHSA-73wf-gq98-2v4g","path":"pnpm-lock.yaml","line":null,"fingerprint":"browserslist@4.28.2 (npm):GHSA-73wf-gq98-2v4g"},{"rule_id":"osv/GHSA-c83g-rgw3-j3cx","severity":"high","message":"browserslist@4.28.2 (npm) is affected by GHSA-c83g-rgw3-j3cx","path":"pnpm-lock.yaml","line":null,"fingerprint":"browserslist@4.28.2 (npm):GHSA-c83g-rgw3-j3cx"},{"rule_id":"osv/GHSA-p2f4-r6v6-j797","severity":"high","message":"builder-util-runtime@9.5.1 (npm) is affected by GHSA-p2f4-r6v6-j797","path":"pnpm-lock.yaml","line":null,"fingerprint":"builder-util-runtime@9.5.1 (npm):GHSA-p2f4-r6v6-j797"},{"rule_id":"osv/GHSA-9qh4-3jw8-366w","severity":"high","message":"electron@42.5.0 (npm) is affected by GHSA-9qh4-3jw8-366w","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-9qh4-3jw8-366w"},{"rule_id":"osv/GHSA-gr2m-v5gq-v685","severity":"high","message":"electron@42.5.0 (npm) is affected by GHSA-gr2m-v5gq-v685","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-gr2m-v5gq-v685"},{"rule_id":"osv/GHSA-hq2x-r82h-9wj4","severity":"high","message":"electron@42.5.0 (npm) is affected by GHSA-hq2x-r82h-9wj4","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-hq2x-r82h-9wj4"},{"rule_id":"osv/GHSA-j84w-jfhq-vhvj","severity":"high","message":"electron@42.5.0 (npm) is affected by GHSA-j84w-jfhq-vhvj","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-j84w-jfhq-vhvj"},{"rule_id":"osv/GHSA-jr5w-w6x2-84p9","severity":"high","message":"electron@42.5.0 (npm) is affected by GHSA-jr5w-w6x2-84p9","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-jr5w-w6x2-84p9"},{"rule_id":"osv/GHSA-qmv3-fv6v-rmhq","severity":"high","message":"electron@42.5.0 (npm) is affected by GHSA-qmv3-fv6v-rmhq","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-qmv3-fv6v-rmhq"},{"rule_id":"osv/GHSA-4c8g-83qw-93j6","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-4c8g-83qw-93j6","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-4c8g-83qw-93j6"},{"rule_id":"osv/GHSA-7p8r-x3mc-p8w7","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-7p8r-x3mc-p8w7","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-7p8r-x3mc-p8w7"},{"rule_id":"osv/GHSA-f65p-4m7j-42xc","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-f65p-4m7j-42xc","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-f65p-4m7j-42xc"},{"rule_id":"osv/GHSA-jqff-g426-hqxp","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-jqff-g426-hqxp","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-jqff-g426-hqxp"},{"rule_id":"osv/GHSA-q3j6-qgpj-74h6","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-q3j6-qgpj-74h6","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-q3j6-qgpj-74h6"},{"rule_id":"osv/GHSA-qw65-cvwx-89v3","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-qw65-cvwx-89v3","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-qw65-cvwx-89v3"},{"rule_id":"osv/GHSA-v2hh-gcrm-f6hx","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-v2hh-gcrm-f6hx","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-v2hh-gcrm-f6hx"},{"rule_id":"osv/GHSA-v39h-62p7-jpjc","severity":"high","message":"fast-uri@3.1.0 (npm) is affected by GHSA-v39h-62p7-jpjc","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-v39h-62p7-jpjc"},{"rule_id":"osv/GHSA-hmw2-7cc7-3qxx","severity":"high","message":"form-data@4.0.5 (npm) is affected by GHSA-hmw2-7cc7-3qxx","path":"pnpm-lock.yaml","line":null,"fingerprint":"form-data@4.0.5 (npm):GHSA-hmw2-7cc7-3qxx"},{"rule_id":"osv/GHSA-2883-xcg3-v3hh","severity":"high","message":"js-yaml@4.1.1 (npm) is affected by GHSA-2883-xcg3-v3hh","path":"pnpm-lock.yaml","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-2883-xcg3-v3hh"},{"rule_id":"osv/GHSA-52cp-r559-cp3m","severity":"high","message":"js-yaml@4.1.1 (npm) is affected by GHSA-52cp-r559-cp3m","path":"pnpm-lock.yaml","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-52cp-r559-cp3m"},{"rule_id":"osv/GHSA-5p4m-2wfm-xmqj","severity":"high","message":"js-yaml@4.1.1 (npm) is affected by GHSA-5p4m-2wfm-xmqj","path":"pnpm-lock.yaml","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-5p4m-2wfm-xmqj"},{"rule_id":"osv/GHSA-28wg-ghj8-5hjv","severity":"high","message":"nanoid@3.3.15 (npm) is affected by GHSA-28wg-ghj8-5hjv","path":"pnpm-lock.yaml","line":null,"fingerprint":"nanoid@3.3.15 (npm):GHSA-28wg-ghj8-5hjv"},{"rule_id":"osv/GHSA-2v37-7h3g-55p8","severity":"high","message":"nanoid@3.3.15 (npm) is affected by GHSA-2v37-7h3g-55p8","path":"pnpm-lock.yaml","line":null,"fingerprint":"nanoid@3.3.15 (npm):GHSA-2v37-7h3g-55p8"},{"rule_id":"osv/GHSA-r28c-9q8g-f849","severity":"high","message":"postcss@8.5.15 (npm) is affected by GHSA-r28c-9q8g-f849","path":"pnpm-lock.yaml","line":null,"fingerprint":"postcss@8.5.15 (npm):GHSA-r28c-9q8g-f849"},{"rule_id":"osv/GHSA-68fv-2mgg-jv7q","severity":"high","message":"source-map-js@1.2.1 (npm) is affected by GHSA-68fv-2mgg-jv7q","path":"pnpm-lock.yaml","line":null,"fingerprint":"source-map-js@1.2.1 (npm):GHSA-68fv-2mgg-jv7q"},{"rule_id":"osv/GHSA-8x88-c5mf-7j5w","severity":"high","message":"tar@7.5.13 (npm) is affected by GHSA-8x88-c5mf-7j5w","path":"pnpm-lock.yaml","line":null,"fingerprint":"tar@7.5.13 (npm):GHSA-8x88-c5mf-7j5w"},{"rule_id":"osv/GHSA-r292-9mhp-454m","severity":"high","message":"tar@7.5.13 (npm) is affected by GHSA-r292-9mhp-454m","path":"pnpm-lock.yaml","line":null,"fingerprint":"tar@7.5.13 (npm):GHSA-r292-9mhp-454m"},{"rule_id":"osv/GHSA-ph9p-34f9-6g65","severity":"high","message":"tmp@0.2.5 (npm) is affected by GHSA-ph9p-34f9-6g65","path":"pnpm-lock.yaml","line":null,"fingerprint":"tmp@0.2.5 (npm):GHSA-ph9p-34f9-6g65"},{"rule_id":"osv/GHSA-2m5v-pch6-74hx","severity":"high","message":"undici@6.25.0 (npm) is affected by GHSA-2m5v-pch6-74hx","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-2m5v-pch6-74hx"},{"rule_id":"osv/GHSA-qrxm-fqhp-jwvm","severity":"high","message":"undici@6.25.0 (npm) is affected by GHSA-qrxm-fqhp-jwvm","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-qrxm-fqhp-jwvm"},{"rule_id":"osv/GHSA-rfgv-xxqx-mfg5","severity":"high","message":"undici@6.25.0 (npm) is affected by GHSA-rfgv-xxqx-mfg5","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-rfgv-xxqx-mfg5"},{"rule_id":"osv/GHSA-vxpw-j846-p89q","severity":"high","message":"undici@6.25.0 (npm) is affected by GHSA-vxpw-j846-p89q","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-vxpw-j846-p89q"},{"rule_id":"osv/GHSA-xjj6-f33q-929c","severity":"high","message":"undici@6.25.0 (npm) is affected by GHSA-xjj6-f33q-929c","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-xjj6-f33q-929c"},{"rule_id":"osv/GHSA-2m5v-pch6-74hx","severity":"high","message":"undici@7.28.0 (npm) is affected by GHSA-2m5v-pch6-74hx","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-2m5v-pch6-74hx"},{"rule_id":"osv/GHSA-4cwx-7wf7-3272","severity":"high","message":"undici@7.28.0 (npm) is affected by GHSA-4cwx-7wf7-3272","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-4cwx-7wf7-3272"},{"rule_id":"osv/GHSA-4w7w-5xrc-9h26","severity":"high","message":"undici@7.28.0 (npm) is affected by GHSA-4w7w-5xrc-9h26","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-4w7w-5xrc-9h26"},{"rule_id":"osv/GHSA-qrxm-fqhp-jwvm","severity":"high","message":"undici@7.28.0 (npm) is affected by GHSA-qrxm-fqhp-jwvm","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-qrxm-fqhp-jwvm"},{"rule_id":"osv/GHSA-rfgv-xxqx-mfg5","severity":"high","message":"undici@7.28.0 (npm) is affected by GHSA-rfgv-xxqx-mfg5","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-rfgv-xxqx-mfg5"},{"rule_id":"osv/GHSA-w293-vg96-wgc3","severity":"high","message":"undici@7.28.0 (npm) is affected by GHSA-w293-vg96-wgc3","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-w293-vg96-wgc3"},{"rule_id":"osv/GHSA-xjj6-f33q-929c","severity":"high","message":"undici@7.28.0 (npm) is affected by GHSA-xjj6-f33q-929c","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-xjj6-f33q-929c"},{"rule_id":"osv/GHSA-587h-7wmj-h5pm","severity":"high","message":"vite@8.1.0 (npm) is affected by GHSA-587h-7wmj-h5pm","path":"pnpm-lock.yaml","line":null,"fingerprint":"vite@8.1.0 (npm):GHSA-587h-7wmj-h5pm"},{"rule_id":"osv/GHSA-mrhx-c7xc-m3w5","severity":"high","message":"zod@3.25.76 (npm) is affected by GHSA-mrhx-c7xc-m3w5","path":"pnpm-lock.yaml","line":null,"fingerprint":"zod@3.25.76 (npm):GHSA-mrhx-c7xc-m3w5"},{"rule_id":"osv/GHSA-mrhx-c7xc-m3w5","severity":"high","message":"zod@4.4.3 (npm) is affected by GHSA-mrhx-c7xc-m3w5","path":"pnpm-lock.yaml","line":null,"fingerprint":"zod@4.4.3 (npm):GHSA-mrhx-c7xc-m3w5"},{"rule_id":"osv/GHSA-82fw-gwwq-j7x9","severity":"medium","message":"@vitest/mocker@4.1.9 (npm) is affected by GHSA-82fw-gwwq-j7x9","path":"pnpm-lock.yaml","line":null,"fingerprint":"@vitest/mocker@4.1.9 (npm):GHSA-82fw-gwwq-j7x9"},{"rule_id":"osv/GHSA-qxg6-89mg-rqv8","severity":"medium","message":"@vitest/mocker@4.1.9 (npm) is affected by GHSA-qxg6-89mg-rqv8","path":"pnpm-lock.yaml","line":null,"fingerprint":"@vitest/mocker@4.1.9 (npm):GHSA-qxg6-89mg-rqv8"},{"rule_id":"osv/GHSA-6gmq-8vp8-gcm6","severity":"medium","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-6gmq-8vp8-gcm6","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-6gmq-8vp8-gcm6"},{"rule_id":"osv/GHSA-6h8r-xr42-gp59","severity":"medium","message":"@xmldom/xmldom@0.8.13 (npm) is affected by GHSA-6h8r-xr42-gp59","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.8.13 (npm):GHSA-6h8r-xr42-gp59"},{"rule_id":"osv/GHSA-6gmq-8vp8-gcm6","severity":"medium","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-6gmq-8vp8-gcm6","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-6gmq-8vp8-gcm6"},{"rule_id":"osv/GHSA-6h8r-xr42-gp59","severity":"medium","message":"@xmldom/xmldom@0.9.10 (npm) is affected by GHSA-6h8r-xr42-gp59","path":"pnpm-lock.yaml","line":null,"fingerprint":"@xmldom/xmldom@0.9.10 (npm):GHSA-6h8r-xr42-gp59"},{"rule_id":"osv/GHSA-w5vr-8v7q-w6rv","severity":"medium","message":"baseline-browser-mapping@2.10.23 (npm) is affected by GHSA-w5vr-8v7q-w6rv","path":"pnpm-lock.yaml","line":null,"fingerprint":"baseline-browser-mapping@2.10.23 (npm):GHSA-w5vr-8v7q-w6rv"},{"rule_id":"osv/GHSA-q2hr-2g5m-vwhr","severity":"medium","message":"brace-expansion@1.1.14 (npm) is affected by GHSA-q2hr-2g5m-vwhr","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@1.1.14 (npm):GHSA-q2hr-2g5m-vwhr"},{"rule_id":"osv/GHSA-q2hr-2g5m-vwhr","severity":"medium","message":"brace-expansion@2.1.0 (npm) is affected by GHSA-q2hr-2g5m-vwhr","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@2.1.0 (npm):GHSA-q2hr-2g5m-vwhr"},{"rule_id":"osv/GHSA-jxxr-4gwj-5jf2","severity":"medium","message":"brace-expansion@5.0.5 (npm) is affected by GHSA-jxxr-4gwj-5jf2","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.5 (npm):GHSA-jxxr-4gwj-5jf2"},{"rule_id":"osv/GHSA-q2hr-2g5m-vwhr","severity":"medium","message":"brace-expansion@5.0.5 (npm) is affected by GHSA-q2hr-2g5m-vwhr","path":"pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.5 (npm):GHSA-q2hr-2g5m-vwhr"},{"rule_id":"osv/GHSA-2p8c-gr87-2676","severity":"medium","message":"electron@42.5.0 (npm) is affected by GHSA-2p8c-gr87-2676","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-2p8c-gr87-2676"},{"rule_id":"osv/GHSA-997q-gvvc-jwmx","severity":"medium","message":"electron@42.5.0 (npm) is affected by GHSA-997q-gvvc-jwmx","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-997q-gvvc-jwmx"},{"rule_id":"osv/GHSA-fw47-9c62-h3vw","severity":"medium","message":"electron@42.5.0 (npm) is affected by GHSA-fw47-9c62-h3vw","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-fw47-9c62-h3vw"},{"rule_id":"osv/GHSA-r4w5-6pfg-jxp5","severity":"medium","message":"electron@42.5.0 (npm) is affected by GHSA-r4w5-6pfg-jxp5","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-r4w5-6pfg-jxp5"},{"rule_id":"osv/GHSA-x562-297c-g43g","severity":"medium","message":"electron@42.5.0 (npm) is affected by GHSA-x562-297c-g43g","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-x562-297c-g43g"},{"rule_id":"osv/GHSA-hrr3-gc8f-f4qj","severity":"medium","message":"fast-uri@3.1.0 (npm) is affected by GHSA-hrr3-gc8f-f4qj","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-hrr3-gc8f-f4qj"},{"rule_id":"osv/GHSA-w74x-v6f9-j3xg","severity":"medium","message":"fast-uri@3.1.0 (npm) is affected by GHSA-w74x-v6f9-j3xg","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-w74x-v6f9-j3xg"},{"rule_id":"osv/GHSA-h67p-54hq-rp68","severity":"medium","message":"js-yaml@4.1.1 (npm) is affected by GHSA-h67p-54hq-rp68","path":"pnpm-lock.yaml","line":null,"fingerprint":"js-yaml@4.1.1 (npm):GHSA-h67p-54hq-rp68"},{"rule_id":"osv/GHSA-g3hv-75wg-m249","severity":"medium","message":"minimatch@10.2.5 (npm) is affected by GHSA-g3hv-75wg-m249","path":"pnpm-lock.yaml","line":null,"fingerprint":"minimatch@10.2.5 (npm):GHSA-g3hv-75wg-m249"},{"rule_id":"osv/GHSA-g3hv-75wg-m249","severity":"medium","message":"minimatch@9.0.9 (npm) is affected by GHSA-g3hv-75wg-m249","path":"pnpm-lock.yaml","line":null,"fingerprint":"minimatch@9.0.9 (npm):GHSA-g3hv-75wg-m249"},{"rule_id":"osv/GHSA-fxqj-rqcc-2cmp","severity":"medium","message":"postcss@8.5.15 (npm) is affected by GHSA-fxqj-rqcc-2cmp","path":"pnpm-lock.yaml","line":null,"fingerprint":"postcss@8.5.15 (npm):GHSA-fxqj-rqcc-2cmp"},{"rule_id":"osv/GHSA-gvwx-54wh-qm9j","severity":"medium","message":"tar@7.5.13 (npm) is affected by GHSA-gvwx-54wh-qm9j","path":"pnpm-lock.yaml","line":null,"fingerprint":"tar@7.5.13 (npm):GHSA-gvwx-54wh-qm9j"},{"rule_id":"osv/GHSA-vmf3-w455-68vh","severity":"medium","message":"tar@7.5.13 (npm) is affected by GHSA-vmf3-w455-68vh","path":"pnpm-lock.yaml","line":null,"fingerprint":"tar@7.5.13 (npm):GHSA-vmf3-w455-68vh"},{"rule_id":"osv/GHSA-w8wr-v893-vjvp","severity":"medium","message":"tar@7.5.13 (npm) is affected by GHSA-w8wr-v893-vjvp","path":"pnpm-lock.yaml","line":null,"fingerprint":"tar@7.5.13 (npm):GHSA-w8wr-v893-vjvp"},{"rule_id":"osv/GHSA-3wwx-pv8p-q78v","severity":"medium","message":"undici@6.25.0 (npm) is affected by GHSA-3wwx-pv8p-q78v","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-3wwx-pv8p-q78v"},{"rule_id":"osv/GHSA-4qv8-2p9j-2685","severity":"medium","message":"undici@6.25.0 (npm) is affected by GHSA-4qv8-2p9j-2685","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-4qv8-2p9j-2685"},{"rule_id":"osv/GHSA-8xcm-r25x-g524","severity":"medium","message":"undici@6.25.0 (npm) is affected by GHSA-8xcm-r25x-g524","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-8xcm-r25x-g524"},{"rule_id":"osv/GHSA-9fm3-97px-rjf6","severity":"medium","message":"undici@6.25.0 (npm) is affected by GHSA-9fm3-97px-rjf6","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-9fm3-97px-rjf6"},{"rule_id":"osv/GHSA-m8rv-5g2x-5cg5","severity":"medium","message":"undici@6.25.0 (npm) is affected by GHSA-m8rv-5g2x-5cg5","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-m8rv-5g2x-5cg5"},{"rule_id":"osv/GHSA-p88m-4jfj-68fv","severity":"medium","message":"undici@6.25.0 (npm) is affected by GHSA-p88m-4jfj-68fv","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-p88m-4jfj-68fv"},{"rule_id":"osv/GHSA-v3r7-h72x-cjcm","severity":"medium","message":"undici@6.25.0 (npm) is affected by GHSA-v3r7-h72x-cjcm","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-v3r7-h72x-cjcm"},{"rule_id":"osv/GHSA-2jfj-6hjv-fm6j","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-2jfj-6hjv-fm6j","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-2jfj-6hjv-fm6j"},{"rule_id":"osv/GHSA-3wwx-pv8p-q78v","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-3wwx-pv8p-q78v","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-3wwx-pv8p-q78v"},{"rule_id":"osv/GHSA-3xpg-4rpp-hhhm","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-3xpg-4rpp-hhhm","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-3xpg-4rpp-hhhm"},{"rule_id":"osv/GHSA-4qv8-2p9j-2685","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-4qv8-2p9j-2685","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-4qv8-2p9j-2685"},{"rule_id":"osv/GHSA-55wc-3pg8-jfw6","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-55wc-3pg8-jfw6","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-55wc-3pg8-jfw6"},{"rule_id":"osv/GHSA-8xcm-r25x-g524","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-8xcm-r25x-g524","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-8xcm-r25x-g524"},{"rule_id":"osv/GHSA-9fm3-97px-rjf6","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-9fm3-97px-rjf6","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-9fm3-97px-rjf6"},{"rule_id":"osv/GHSA-f72v-6w45-q472","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-f72v-6w45-q472","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-f72v-6w45-q472"},{"rule_id":"osv/GHSA-jr45-8vmc-qm54","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-jr45-8vmc-qm54","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-jr45-8vmc-qm54"},{"rule_id":"osv/GHSA-m8rv-5g2x-5cg5","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-m8rv-5g2x-5cg5","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-m8rv-5g2x-5cg5"},{"rule_id":"osv/GHSA-pmjh-fq2x-6v4x","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-pmjh-fq2x-6v4x","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-pmjh-fq2x-6v4x"},{"rule_id":"osv/GHSA-rx4f-c7p8-82vq","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-rx4f-c7p8-82vq","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-rx4f-c7p8-82vq"},{"rule_id":"osv/GHSA-v3r7-h72x-cjcm","severity":"medium","message":"undici@7.28.0 (npm) is affected by GHSA-v3r7-h72x-cjcm","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-v3r7-h72x-cjcm"},{"rule_id":"osv/GHSA-698v-4r3x-3vcv","severity":"medium","message":"vite@8.1.0 (npm) is affected by GHSA-698v-4r3x-3vcv","path":"pnpm-lock.yaml","line":null,"fingerprint":"vite@8.1.0 (npm):GHSA-698v-4r3x-3vcv"},{"rule_id":"osv/GHSA-r825-w8mm-5pxw","severity":"medium","message":"vite@8.1.0 (npm) is affected by GHSA-r825-w8mm-5pxw","path":"pnpm-lock.yaml","line":null,"fingerprint":"vite@8.1.0 (npm):GHSA-r825-w8mm-5pxw"},{"rule_id":"osv/GHSA-rq7h-c2jc-7f22","severity":"medium","message":"vite@8.1.0 (npm) is affected by GHSA-rq7h-c2jc-7f22","path":"pnpm-lock.yaml","line":null,"fingerprint":"vite@8.1.0 (npm):GHSA-rq7h-c2jc-7f22"},{"rule_id":"osv/GHSA-82fw-gwwq-j7x9","severity":"medium","message":"vitest@4.1.9 (npm) is affected by GHSA-82fw-gwwq-j7x9","path":"pnpm-lock.yaml","line":null,"fingerprint":"vitest@4.1.9 (npm):GHSA-82fw-gwwq-j7x9"},{"rule_id":"osv/GHSA-4x5r-pxfx-6jf8","severity":"low","message":"@babel/core@7.29.0 (npm) is affected by GHSA-4x5r-pxfx-6jf8","path":"pnpm-lock.yaml","line":null,"fingerprint":"@babel/core@7.29.0 (npm):GHSA-4x5r-pxfx-6jf8"},{"rule_id":"osv/GHSA-3qxv-5xgr-q7w9","severity":"low","message":"electron@42.5.0 (npm) is affected by GHSA-3qxv-5xgr-q7w9","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-3qxv-5xgr-q7w9"},{"rule_id":"osv/GHSA-98mx-cjp9-gchm","severity":"low","message":"electron@42.5.0 (npm) is affected by GHSA-98mx-cjp9-gchm","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-98mx-cjp9-gchm"},{"rule_id":"osv/GHSA-h3v5-h239-pg29","severity":"low","message":"electron@42.5.0 (npm) is affected by GHSA-h3v5-h239-pg29","path":"pnpm-lock.yaml","line":null,"fingerprint":"electron@42.5.0 (npm):GHSA-h3v5-h239-pg29"},{"rule_id":"osv/GHSA-g7r4-m6w7-qqqr","severity":"low","message":"esbuild@0.27.7 (npm) is affected by GHSA-g7r4-m6w7-qqqr","path":"pnpm-lock.yaml","line":null,"fingerprint":"esbuild@0.27.7 (npm):GHSA-g7r4-m6w7-qqqr"},{"rule_id":"osv/GHSA-333x-w4r6-6crp","severity":"low","message":"fast-uri@3.1.0 (npm) is affected by GHSA-333x-w4r6-6crp","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-333x-w4r6-6crp"},{"rule_id":"osv/GHSA-xhq7-xmqj-769h","severity":"low","message":"fast-uri@3.1.0 (npm) is affected by GHSA-xhq7-xmqj-769h","path":"pnpm-lock.yaml","line":null,"fingerprint":"fast-uri@3.1.0 (npm):GHSA-xhq7-xmqj-769h"},{"rule_id":"osv/GHSA-35p6-xmwp-9g52","severity":"low","message":"undici@6.25.0 (npm) is affected by GHSA-35p6-xmwp-9g52","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-35p6-xmwp-9g52"},{"rule_id":"osv/GHSA-g8m3-5g58-fq7m","severity":"low","message":"undici@6.25.0 (npm) is affected by GHSA-g8m3-5g58-fq7m","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-g8m3-5g58-fq7m"},{"rule_id":"osv/GHSA-r53p-7pc4-xj5r","severity":"low","message":"undici@6.25.0 (npm) is affected by GHSA-r53p-7pc4-xj5r","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@6.25.0 (npm):GHSA-r53p-7pc4-xj5r"},{"rule_id":"osv/GHSA-2gqq-gqf2-x968","severity":"low","message":"undici@7.28.0 (npm) is affected by GHSA-2gqq-gqf2-x968","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-2gqq-gqf2-x968"},{"rule_id":"osv/GHSA-8436-99hf-9mmv","severity":"low","message":"undici@7.28.0 (npm) is affected by GHSA-8436-99hf-9mmv","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-8436-99hf-9mmv"},{"rule_id":"osv/GHSA-r53p-7pc4-xj5r","severity":"low","message":"undici@7.28.0 (npm) is affected by GHSA-r53p-7pc4-xj5r","path":"pnpm-lock.yaml","line":null,"fingerprint":"undici@7.28.0 (npm):GHSA-r53p-7pc4-xj5r"},{"rule_id":"osv/GHSA-9jrq-w75r-8gcw","severity":"low","message":"vite@8.1.0 (npm) is affected by GHSA-9jrq-w75r-8gcw","path":"pnpm-lock.yaml","line":null,"fingerprint":"vite@8.1.0 (npm):GHSA-9jrq-w75r-8gcw"}],"evidence":[],"data":{"ecosystems":["npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":2.0,"findings":14.0,"findings_high":11.0,"findings_medium":2.0,"findings_low":1.0,"penalty":126.0},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":19,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:19"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":22,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:22"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":27,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:27"},{"rule_id":"zizmor/excessive-permissions","severity":"high","message":"overly broad permissions [confidence high]","path":".github/workflows/release.yml","line":15,"fingerprint":"excessive-permissions:.github/workflows/release.yml:15"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":30,"fingerprint":"unpinned-uses:.github/workflows/release.yml:30"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":43,"fingerprint":"unpinned-uses:.github/workflows/release.yml:43"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":48,"fingerprint":"unpinned-uses:.github/workflows/release.yml:48"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":71,"fingerprint":"unpinned-uses:.github/workflows/release.yml:71"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":90,"fingerprint":"unpinned-uses:.github/workflows/release.yml:90"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":96,"fingerprint":"unpinned-uses:.github/workflows/release.yml:96"},{"rule_id":"zizmor/cache-poisoning","severity":"high","message":"runtime artifacts potentially vulnerable to a cache poisoning attack [confidence low]","path":".github/workflows/release.yml","line":48,"fingerprint":"cache-poisoning:.github/workflows/release.yml:48"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":18,"fingerprint":"artipacked:.github/workflows/ci.yml:18"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yml","line":29,"fingerprint":"artipacked:.github/workflows/release.yml:29"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/release.yml","line":96,"fingerprint":"superfluous-actions:.github/workflows/release.yml:96"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":1.0,"check:lockfiles":1.0,"signed_commit_share":0.5455,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":1.0,"binary_assets":9.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v0.2.0 ships ai-usage-monitor-0.2.0-linux-x86_64.AppImage (0 downloads)","ref":"ai-usage-monitor-0.2.0-linux-x86_64.AppImage","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-linux-x86_64.AppImage","weight":0.0},{"kind":"binary-release-asset","description":"release v0.2.0 ships ai-usage-monitor-0.2.0-mac-arm64.dmg (0 downloads)","ref":"ai-usage-monitor-0.2.0-mac-arm64.dmg","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-mac-arm64.dmg","weight":0.0},{"kind":"binary-release-asset","description":"release v0.2.0 ships ai-usage-monitor-0.2.0-win-x64.exe (1 downloads)","ref":"ai-usage-monitor-0.2.0-win-x64.exe","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.2.0/ai-usage-monitor-0.2.0-win-x64.exe","weight":0.0},{"kind":"binary-release-asset","description":"release v0.1.3 ships ai-usage-monitor-0.1.3-linux-x86_64.AppImage (0 downloads)","ref":"ai-usage-monitor-0.1.3-linux-x86_64.AppImage","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/ai-usage-monitor-0.1.3-linux-x86_64.AppImage","weight":0.0},{"kind":"binary-release-asset","description":"release v0.1.3 ships ai-usage-monitor-0.1.3-mac-arm64.dmg (0 downloads)","ref":"ai-usage-monitor-0.1.3-mac-arm64.dmg","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/releases/download/v0.1.3/ai-usage-monitor-0.1.3-mac-arm64.dmg","weight":0.0}],"data":{"signals":["binary-release-assets"],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":628.0,"function_nloc":6288.0,"mean_ccn":2.88,"p90_ccn":6.0,"complex_functions":13.0,"long_functions":4.0,"many_param_functions":0.0,"risky_nloc_share":0.2163},"findings":[],"evidence":[{"kind":"complex-function","description":"importLedger in src/main/database.ts: complexity 48, 93 lines","ref":"src/main/database.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/database.ts#L449","weight":0.8},{"kind":"complex-function","description":"parseOpenCodeDashboard in src/main/providers.ts: complexity 34, 64 lines","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L1103","weight":0.5666666666666667},{"kind":"complex-function","description":"parseOpenCodeSsrData in src/main/provider-utils.ts: complexity 28, 71 lines","ref":"src/main/provider-utils.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/provider-utils.ts#L278","weight":0.4666666666666667},{"kind":"complex-function","description":"parsePortalText in src/main/providers.ts: complexity 27, 76 lines","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L1017","weight":0.45},{"kind":"complex-function","description":"App in src/renderer/App.tsx: complexity 26, 185 lines","ref":"src/renderer/App.tsx","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/renderer/App.tsx#L84","weight":0.43333333333333335},{"kind":"complex-function","description":"onMessage in src/main/providers.ts: complexity 24, 67 lines","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L1606","weight":0.4},{"kind":"complex-function","description":"ProviderRow in src/renderer/App.tsx: complexity 21, 100 lines","ref":"src/renderer/App.tsx","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/renderer/App.tsx#L1929","weight":0.35},{"kind":"complex-function","description":"isPortalLoginRequired in src/main/providers.ts: complexity 19, 30 lines","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L1460","weight":0.31666666666666665},{"kind":"complex-function","description":"SettingsView in src/renderer/App.tsx: complexity 19, 230 lines","ref":"src/renderer/App.tsx","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/renderer/App.tsx#L1239","weight":0.31666666666666665},{"kind":"complex-function","description":"fetchJson in src/main/providers.ts: complexity 18, 72 lines","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L2143","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":6274.0,"duplicated_lines":545.0,"duplicated_share":0.0869,"files":33.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/generate-icon.mjs:17 and scripts/generate-icon.mjs:111","ref":"scripts/generate-icon.mjs","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/scripts/generate-icon.mjs#L17","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/seed-demo-profile.mjs:19 and src/main/database.ts:64","ref":"scripts/seed-demo-profile.mjs","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/scripts/seed-demo-profile.mjs#L19","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/main/provider-utils.ts:10 and src/renderer/App.tsx:2437","ref":"src/main/provider-utils.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/provider-utils.ts#L10","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/main/provider-utils.ts:267 and src/main/providers.ts:1107","ref":"src/main/provider-utils.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/provider-utils.ts#L267","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/main/providers.ts:680 and src/main/providers.ts:995","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L680","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/main/providers.ts:1388 and src/main/tray.ts:203","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L1388","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/main/providers.ts:1441 and src/main/tray-opencode.ts:80","ref":"src/main/providers.ts","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/main/providers.ts#L1441","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/renderer/App.tsx:60 and src/renderer/components/ui/alert-dialog.tsx:98","ref":"src/renderer/App.tsx","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/renderer/App.tsx#L60","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/renderer/App.tsx:183 and src/renderer/App.tsx:202","ref":"src/renderer/App.tsx","url":"https://github.com/RyanTheAllmighty/ai-usage-monitor/blob/54032d3a27e4e1d3d40c74a4ca6d5dc14a219017/src/renderer/App.tsx#L183","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":24.0,"weighted_findings":23.0,"scanned_lines":8234.0,"category:best-practice":15.0,"category:correctness":9.0},"findings":[{"rule_id":"opengrep/typescript.lang.correctness.useless-ternary","severity":"high","message":"It looks like no matter how provider.source === 'portal' is evaluated, this expression returns 'unknown'. This is probably a copy-paste error.","path":"src/main/database.ts","line":349,"fingerprint":"typescript.lang.correctness.useless-ternary:src/main/database.ts:349"},{"rule_id":"opengrep/javascript.lang.correctness.no-stringify-keys","severity":"medium","message":"JSON stringify does not produce a stable key ordering, and should not be relied on for producing object keys. Consider using json-stable-stringify instead.","path":"src/main/database.ts","line":465,"fingerprint":"javascript.lang.correctness.no-stringify-keys:src/main/database.ts:465"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"src/main/provider-utils.ts","line":69,"fingerprint":"javascript.lang.correctness.no-replaceall:src/main/provider-utils.ts:69"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"src/main/providers.ts","line":1180,"fingerprint":"javascript.lang.correctness.no-replaceall:src/main/providers.ts:1180"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"src/main/providers.ts","line":2115,"fingerprint":"javascript.lang.correctness.no-replaceall:src/main/providers.ts:2115"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":18,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:18"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":32,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:32"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":50,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:50"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":57,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:57"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":62,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:62"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":70,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:70"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":81,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:81"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/alert-dialog.tsx","line":90,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/alert-dialog.tsx:90"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/button.tsx","line":40,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/button.tsx:40"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/input.tsx","line":13,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/input.tsx:13"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/select.tsx","line":21,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/select.tsx:21"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/select.tsx","line":44,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/select.tsx:44"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/select.tsx","line":66,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/select.tsx:66"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/switch.tsx","line":16,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/switch.tsx:16"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/renderer/components/ui/tooltip.tsx","line":22,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/renderer/components/ui/tooltip.tsx:22"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/main/providers.ts","line":735,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/main/providers.ts:735"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/main/providers.ts","line":735,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/main/providers.ts:735"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/main/providers.ts","line":1497,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/main/providers.ts:1497"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/main/providers.ts","line":1497,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/main/providers.ts:1497"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.1802,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":1.0,"test_lines":742.0,"source_lines":8234.0,"test_ratio":0.0901,"ci_files":2.0,"cochange_share":0.5,"cochange_commits":14.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/ci.yml","ref":".github/workflows/ci.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/release.yml","ref":".github/workflows/release.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (npm test, pnpm test)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["npm test","pnpm test"],"lint_commands":[]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":0.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":37.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":1.0,"check:low_escape_density":1.0,"escapes":8.0,"escapes_per_kloc":1.051},"findings":[],"evidence":[{"kind":"typing","description":"TypeScript strict type checking: tsconfig.json","ref":"tsconfig.json","url":null,"weight":0.0}],"data":{},"error":null}],"flags":[]}