YC (S26) | Open Computer History | Record your screen continuously locally and provide context to your agents (Claude, Codex, Openclaw, Hermes, Runner...)
This report presents the forensic synthetic code analysis of screenpipe/screenpipe, a Rust project with 21,277 GitHub stars. SynthScan v2.0 examined 1,124,975 lines of code across 3119 source files, recording 3503 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 4.5 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 3503 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …s/screenpipe-core/assets/extensions/context-pruning.ts | 59 | // ── single-message clamp (issue #3852) ──────────────────────────────── | COMMENT |
| MEDIUM | …s/screenpipe-core/assets/extensions/context-pruning.ts | 59 | // ── single-message clamp (issue #3852) ──────────────────────────────── | COMMENT |
| MEDIUM | …s/screenpipe-core/assets/extensions/context-pruning.ts | 175 | // ── 1. Feedback on oversized tool results ────────────────────────── | COMMENT |
| MEDIUM | …s/screenpipe-core/assets/extensions/context-pruning.ts | 233 | // ── 2 + 3. Prune old tool results AND clamp oversized messages ───── | COMMENT |
| MEDIUM⚡ | crates/screenpipe-core/assets/extensions/sub-agent.ts | 27 | // ── Constants ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/screenpipe-core/assets/extensions/sub-agent.ts | 33 | // ── State ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/screenpipe-core/assets/extensions/sub-agent.ts | 39 | // ── Cleanup ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-core/assets/extensions/sub-agent.ts | 52 | // ── Read pipe permissions for sub-agent inheritance ────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-core/assets/extensions/sub-agent.ts | 66 | // ── Sub-agent spawner ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-core/assets/extensions/sub-agent.ts | 126 | // ── Extension entry point ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-core/src/sync/mod.rs | 25 | //! ┌─────────────┴─────────────┐ | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/run.sh | 173 | # ── Conformance suite, unauthenticated posture ────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/run.sh | 187 | # ── Authenticated posture: the auth matrix ────────────────────────────────── | COMMENT |
| MEDIUM | …/screenpipe-gateway/e2e/conformance/enterprise-v1.yaml | 54 | # ── Accepted. Ruled legitimate 2026-07-24; do not "converge" these. ──────── | COMMENT |
| MEDIUM | …/screenpipe-gateway/e2e/conformance/enterprise-v1.yaml | 782 | # ── The unit of response across /search and /records ──────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 55 | // ── /devices ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 146 | // ── /search ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 289 | // ── /records ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 392 | // ── /files ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 457 | // ── /files/{key} ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 473 | // ── /frames ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 488 | // ── /rollups ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 549 | // ── Hosted-only ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/cases.ts | 579 | // ── Gateway-only ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/conformance/spec.ts | 210 | // ── internals ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/control_plane.rs | 1110 | // ── The hole the runtime golden CANNOT see ─────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/control_plane.rs | 1232 | // ─── SCR-295: the BOOT PATH, not just the client ──────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 223 | // ─── Time window (converged with v1-helpers.ts parseTimeWindow) ───────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 560 | // ─── Record queries (gateway-owned SQL over the FTS tables) ───────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 1133 | // ─── GET /api/enterprise/v1/devices ───────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 1226 | // ─── GET /api/enterprise/v1/search ────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 1339 | // ─── GET /api/enterprise/v1/records ───────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 1447 | // ─── GET /api/enterprise/v1/files ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 1573 | // ─── GET /api/enterprise/v1/files/[...key] ────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 1604 | // ─── GET /api/enterprise/v1/frames/{device_id}/{frame_id} ─────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-gateway/src/api.rs | 1663 | // ─── GET /api/enterprise/v1/rollups ───────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/drm_detector.rs | 772 | // ── pre_capture_drm_check unit tests ────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/drm_detector.rs | 821 | // ── live integration tests ────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/drm_detector.rs | 979 | // ── check_and_update_drm_state tests ───────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 37 | // ── Pure decision logic ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 510 | // ── Background task ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 737 | // ── Tests ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 760 | // ── names_match tests ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 847 | // ── find_other_attendee tests ───────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 914 | // ── decide_speaker_names tests ──────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 1143 | // ── Rule 4: Process-of-elimination tests ────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/calendar_speaker_id.rs | 1243 | // ── deduplicate_speaker_by_name integration tests ───────────────────── | COMMENT |
| MEDIUM⚡ | crates/screenpipe-engine/src/focus_aware_controller.rs | 14 | //! ┌────────┐ lost focus ┌──────┐ cold_cutoff ┌──────┐ | COMMENT |
| MEDIUM⚡ | crates/screenpipe-engine/src/focus_aware_controller.rs | 15 | //! │ Active │────────────────►│ Warm │───────────────►│ Cold │ | COMMENT |
| MEDIUM⚡ | crates/screenpipe-engine/src/focus_aware_controller.rs | 16 | //! └────────┘ < warm_cutoff └──────┘ └──────┘ | COMMENT |
| MEDIUM⚡ | crates/screenpipe-engine/src/focus_aware_controller.rs | 19 | //! └──────────────┴───────────────────────────────────┘ | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/focus_aware_controller.rs | 360 | // ── Test helpers ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/profile.rs | 69 | // ── Vision: event-driven capture ──────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/profile.rs | 81 | // ── Vision: adaptive FPS ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/profile.rs | 85 | // ── Audio ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/profile.rs | 98 | // ── Capture pause ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/profile.rs | 104 | // ── Video encoding ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/monitor.rs | 95 | // ─── macOS ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/monitor.rs | 203 | // ─── Windows ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/power/monitor.rs | 238 | // ─── Linux ────────────────────────────────────────────────────────────────── | COMMENT |
| 583 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 181 | # resize 1080p->360p 5.38ms -> 2.13ms (-60.4%) | COMMENT |
| LOW | lefthook.yml | 1 | # screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/tests/no_console_flash.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/tests/no_console_flash.rs | 241 | let t = line.trim_end().trim_end_matches('{').trim_end(); | COMMENT |
| LOW | crates/screenpipe-core/examples/probe_accessibility.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/assets/extensions/mcp-bridge.ts | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | …s/screenpipe-core/assets/extensions/context-pruning.ts | 41 | // to retry with narrower filters (smaller limit, shorter time range, | COMMENT |
| LOW | …ates/screenpipe-core/assets/extensions/orphan-guard.ts | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/assets/extensions/sub-agent.ts | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/ffmpeg.rs | 21 | const EXECUTABLE_NAME: &str = "ffmpeg"; | COMMENT |
| LOW | crates/screenpipe-core/src/ffmpeg.rs | 521 | } | COMMENT |
| LOW | crates/screenpipe-core/src/lib.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/lib.rs | 21 | //! - Pipes run untrusted-ish user content through a model. Treat pipe output as | COMMENT |
| LOW | crates/screenpipe-core/src/paths.rs | 41 | // symlinks intentionally skipped | COMMENT |
| LOW | crates/screenpipe-core/src/strings.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/video.rs | 41 | /// Map video quality preset to x265 encoding preset. | COMMENT |
| LOW | crates/screenpipe-core/src/no_window.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/no_window.rs | 21 | /// `CREATE_NO_WINDOW` — do not allocate a console for the child process. | COMMENT |
| LOW | crates/screenpipe-core/src/permissions.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/permissions.rs | 121 | )) | COMMENT |
| LOW | crates/screenpipe-core/src/permissions.rs | 161 | image_option: u32, | COMMENT |
| LOW | crates/screenpipe-core/src/permissions.rs | 341 | } | COMMENT |
| LOW | crates/screenpipe-core/src/window_pattern.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/window_pattern.rs | 21 | //! ``` | COMMENT |
| LOW | crates/screenpipe-core/src/window_pattern.rs | 101 | COMMENT | |
| LOW | crates/screenpipe-core/src/display_topology.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/display_topology.rs | 21 | //! - [`capture_ready_display_ids`] — "could screen capture actually produce a | COMMENT |
| LOW | crates/screenpipe-core/src/display_topology.rs | 141 | /// NOT infer "all displays gone / stream dead" from it (a CG error must not read | COMMENT |
| LOW | crates/screenpipe-core/src/thread_priority.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/thread_priority.rs | 21 | //! - Never wrap sections that hold locks other Normal-priority threads block | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 201 | /// Cap so an oversized `reset_in` can't stall a pipe run indefinitely. | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 281 | text.to_lowercase().contains("hosted_ai_capacity_reserved") | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 541 | pub struct PiExecutor { | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 621 | /// screenpipe-api skill is installed WITHOUT the Gemma 4 E4B | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 661 | /// This skill teaches pi how to query org-wide telemetry (devices, | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 701 | info!( | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 841 | } | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 861 | "render-html-report", | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 1201 | provider | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 1501 | /// `allowed_models` are haiku/gemini only). Previously we passed the | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 1621 | /// `true` when `allowed` is exactly the unvalidated gateway fallback catalog | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 2261 | pipe_system_prompt, | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 2501 | pub fn apply_pi_isolation_env(apply: &mut dyn FnMut(&str, &str)) { | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 2521 | // Single-flighted and best-effort — this never blocks the spawn it is | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 2701 | info!("pi config seed complete at {:?}", dest); | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 2921 | const BOUNDED_OUTPUT_TAIL: usize = 192 * 1024; | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 3321 | } | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 3461 | } | COMMENT |
| LOW | crates/screenpipe-core/src/agents/pi.rs | 5381 | COMMENT | |
| LOW | crates/screenpipe-core/src/agents/cloud.rs | 81 | #[serde(default, skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | crates/screenpipe-core/src/agents/bash_env.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/agents/bash_env.rs | 21 | //! model effort, no prompt changes, no new system-prompt lines. | COMMENT |
| LOW | crates/screenpipe-core/src/agents/bash_env.rs | 41 | /// substrings in command arguments. If none match, `curl` runs unchanged. | COMMENT |
| LOW | crates/screenpipe-core/src/agents/bash_env.rs | 121 | COMMENT | |
| LOW | crates/screenpipe-core/src/agents/bash_env.rs | 201 | #[test] | COMMENT |
| LOW | crates/screenpipe-core/src/agents/cli_runtime.rs | 1 | // screenpipe — AI that knows everything you've seen, said, or heard | COMMENT |
| LOW | crates/screenpipe-core/src/agents/cli_runtime.rs | 21 | //! | COMMENT |
| LOW | crates/screenpipe-core/src/agents/cli_runtime.rs | 41 | //! install, or an offline machine. | COMMENT |
| LOW | crates/screenpipe-core/src/agents/acp/runtime.rs | 241 | } | COMMENT |
| LOW | crates/screenpipe-core/src/agents/acp/runtime.rs | 401 | - `live_view` reads or edits the user's saved Live Views (dashboards): action=list to find one, action=get for its defin | COMMENT |
| 1721 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …npipe-core/assets/extensions/screenpipe-permissions.ts | 151 | function hasContentTypeRestrictions(): boolean { | CODE |
| LOW | …s/screenpipe-core/assets/extensions/context-pruning.ts | 85 | export function resolveContextWindowTokens(ctx: any): number { | CODE |
| LOW | scripts/memory-leak/test_leak_hunt.py | 18 | def test_default_search_pressure_never_includes_frames(self) -> None: | CODE |
| LOW | scripts/memory-leak/test_leak_hunt.py | 23 | def test_opt_in_frame_pressure_uses_small_limits(self) -> None: | CODE |
| LOW | scripts/memory-leak/test_leak_hunt.py | 49 | def test_recursive_descendants_are_included(self) -> None: | CODE |
| LOW | scripts/memory-leak/test_leak_hunt.py | 65 | def test_root_selection_uses_whole_tree_memory(self) -> None: | CODE |
| LOW | scripts/memory-leak/test_leak_hunt.py | 81 | def test_explicit_pid_selects_requested_tree(self) -> None: | CODE |
| LOW⚡ | scripts/memory-leak/leak_probe.py | 422 | def phase_search_all_q_no_frames(self, deadline: float) -> tuple[int, int, int]: | CODE |
| LOW⚡ | scripts/memory-leak/leak_probe.py | 432 | def phase_search_ocr_no_frames(self, deadline: float) -> tuple[int, int, int]: | CODE |
| LOW⚡ | scripts/memory-leak/leak_probe.py | 441 | def phase_search_audio_no_frames(self, deadline: float) -> tuple[int, int, int]: | CODE |
| LOW⚡ | scripts/memory-leak/leak_probe.py | 450 | def phase_search_recent_no_frames(self, deadline: float) -> tuple[int, int, int]: | CODE |
| LOW | scripts/memory-leak/leak_probe.py | 499 | def phase_timeline_live_today(self, deadline: float) -> tuple[int, int, int]: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 613 | def build_search_fanout_params(include_frame_images: bool) -> dict[str, Any]: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 782 | def scenario_memory_artifact_lists(client: ApiClient, state: SharedState, duration_sec: float, concurrency: int) -> None | CODE |
| LOW | packages/screenpipe-mcp/scripts/assert-pack-contents.js | 126 | function runtimeDependencyFailures(packageJson) { | CODE |
| LOW | packages/screenpipe-mcp/src/activity-summary-tool.ts | 23 | export async function buildActivitySummaryResult( | CODE |
| LOW | packages/screenpipe-mcp/src/qualified-value.ts | 62 | export function createMcpQualifiedValueReporter( | CODE |
| LOW | packages/ai-gateway/scripts/required-bindings.ts | 40 | export function assertRequiredHostedAiSecretBindings(rawOutput: string): void { | CODE |
| LOW | packages/ai-gateway/modal/screenpipe_qwen35.py | 140 | def filtered_response_headers(headers): | CODE |
| LOW | packages/ai-gateway/src/index.ts | 116 | export function shouldEnableBackgroundFallback( | CODE |
| LOW | packages/ai-gateway/src/index.ts | 123 | export function shouldEnableSafetyRefusalFallback( | CODE |
| LOW | packages/ai-gateway/src/index.ts | 204 | async function handleMeteredTinfoilRequest( | CODE |
| LOW | packages/ai-gateway/src/index.ts | 264 | async function handleMeteredVoiceAiRequest( | CODE |
| LOW | …i-gateway/src/test/maas-nameless-toolcall.unit.test.ts | 16 | function noNamelessAssistantToolCalls(formatted: any[]) { | CODE |
| LOW | …es/ai-gateway/src/test/transcription-cost.unit.test.ts | 21 | function estimateTranscriptionCost(contentLength: number): { | CODE |
| LOW | packages/ai-gateway/src/providers/vertex-maas.ts | 65 | export async function parseVertexMaasJsonResponse(response: Response, model: string): Promise<any> { | CODE |
| LOW | packages/ai-gateway/src/providers/vertex-maas.ts | 124 | export function promoteReasoningToContent(result: any): void { | CODE |
| LOW | packages/ai-gateway/src/providers/anthropic.ts | 44 | function anthropicStopReasonToOpenAI(reason: unknown): string { | CODE |
| LOW | packages/ai-gateway/src/providers/openai.ts | 55 | function clearPromptCacheBreakpoints(messages: ChatCompletionMessageParam[]): void { | CODE |
| LOW | packages/ai-gateway/src/providers/openai.ts | 93 | function stripPromptCacheBreakpoints(message: ChatCompletionMessageParam): ChatCompletionMessageParam { | CODE |
| LOW | packages/ai-gateway/src/utils/model-policy.ts | 8 | export function isGooglePolicyBlockedModel(model: string | null | undefined): boolean { | CODE |
| LOW | packages/ai-gateway/src/utils/auth.ts | 278 | function billingPlanMatchesAccessPlan( | CODE |
| LOW | packages/ai-gateway/src/utils/latency.ts | 29 | export function applyBackgroundReasoningDefault( | CODE |
| LOW | …ages/ai-gateway/src/handlers/realtime-transcription.ts | 53 | export async function handleRealtimeTranscriptionUpgrade( | CODE |
| LOW | …ages/ai-gateway/src/handlers/realtime-transcription.ts | 171 | async function connectDeepgramLiveWithRetry( | CODE |
| LOW | …ages/ai-gateway/src/handlers/realtime-transcription.ts | 208 | function isRetryableDeepgramLiveUpgradeStatus(status: number): boolean { | CODE |
| LOW | …ages/ai-gateway/src/handlers/realtime-transcription.ts | 263 | function translateLegacyClientMessage(data: string | ArrayBuffer | Blob): string | ArrayBuffer | null { | CODE |
| LOW | …ages/ai-gateway/src/handlers/realtime-transcription.ts | 285 | function translateLegacyDeepgramMessage( | CODE |
| LOW | packages/ai-gateway/src/handlers/chat.ts | 554 | function streamEventHasAssistantOutput(value: unknown): boolean { | CODE |
| LOW | packages/ai-gateway/src/handlers/chat.ts | 575 | function streamEventIsSafetyRefusal(value: unknown): boolean { | CODE |
| LOW | packages/ai-gateway/src/handlers/chat.ts | 593 | function inspectSafetyRefusalPayload(payload: string): SafetyRefusalProbeResult | null { | CODE |
| LOW | packages/ai-gateway/src/handlers/chat.ts | 621 | async function probeStreamingSafetyRefusal(response: Response): Promise<SafetyRefusalProbeResult> { | CODE |
| LOW | packages/ai-gateway/src/handlers/transcription.ts | 72 | export function getTranscriptionLanguages(request: Request, fallback: string[] = []): string[] { | CODE |
| LOW | packages/ai-gateway/src/handlers/transcription.ts | 126 | async function handleDeepgramTranscription( | CODE |
| LOW | packages/ai-gateway/src/handlers/transcription.ts | 160 | async function handleGoogleTranscription(request: Request, env: Env): Promise<Response> { | CODE |
| LOW⚡ | …s/ai-gateway/src/services/background-limit-fallback.ts | 50 | export function isBackgroundFallbackConfigured(env: Pick<Env, 'OPENAI_API_KEY'>): boolean { | CODE |
| LOW⚡ | …s/ai-gateway/src/services/background-limit-fallback.ts | 55 | export function hasUnsupportedFallbackInput(body: RequestBody): boolean { | CODE |
| LOW | …s/ai-gateway/src/services/background-limit-fallback.ts | 72 | export function prepareBackgroundFallbackBody(body: RequestBody): RequestBody { | CODE |
| LOW⚡ | …s/ai-gateway/src/services/background-limit-fallback.ts | 125 | export function isProviderQuotaOrBillingLimitError(error: unknown): boolean { | CODE |
| LOW⚡ | …s/ai-gateway/src/services/background-limit-fallback.ts | 134 | export function isAccountLocalAllowanceError(error: unknown): boolean { | CODE |
| LOW⚡ | …s/ai-gateway/src/services/background-limit-fallback.ts | 139 | export function shouldUseBackgroundFallback(input: { | CODE |
| LOW | …s/ai-gateway/src/services/background-limit-fallback.ts | 160 | export function resolveBackgroundFallbackBody(input: { | CODE |
| LOW | …s/ai-gateway/src/services/hosted-ai-cost-settlement.ts | 106 | export async function settleActualOrReservedCost( | CODE |
| LOW | …gateway/src/services/hosted-ai-reservation-controls.ts | 58 | export function loadHostedAiReservationControls( | CODE |
| LOW | …ges/ai-gateway/src/services/hosted-ai-cost-controls.ts | 124 | export function loadHostedAiTextCostControls(env: HostedAiCostControlEnv): HostedAiTextCostControls { | CODE |
| LOW | …ges/ai-gateway/src/services/hosted-ai-cost-controls.ts | 176 | export function loadHostedTranscriptionCostControls( | CODE |
| LOW | …ges/ai-gateway/src/services/hosted-ai-cost-controls.ts | 220 | export function getTranscriptionDailyCostCap( | CODE |
| LOW | …ges/ai-gateway/src/services/hosted-ai-cost-controls.ts | 228 | export function getTranscriptionGlobalCostCaps( | CODE |
| LOW | …ges/ai-gateway/src/services/hosted-ai-cost-controls.ts | 242 | function clampWindowsToIncludedAllowance( | CODE |
| LOW | …ges/ai-gateway/src/services/hosted-ai-cost-controls.ts | 264 | export function resolveHostedAiTextCostLimits( | CODE |
| 711 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …screenpipe-core/assets/pipes/ai-prompt-journal/pipe.md | 28 | ## Step 1: Find AI tool frames | COMMENT |
| LOW | …screenpipe-core/assets/pipes/ai-prompt-journal/pipe.md | 71 | ## Step 2: Extract conversation text | COMMENT |
| LOW | …screenpipe-core/assets/pipes/ai-prompt-journal/pipe.md | 112 | ## Step 3: Identify user prompts vs AI responses | COMMENT |
| LOW | …screenpipe-core/assets/pipes/ai-prompt-journal/pipe.md | 139 | ## Step 4: Classify each prompt | COMMENT |
| LOW | …screenpipe-core/assets/pipes/ai-prompt-journal/pipe.md | 147 | ## Step 5: Save to journal | COMMENT |
| LOW | …screenpipe-core/assets/pipes/ai-prompt-journal/pipe.md | 188 | ## Step 6: Notification | COMMENT |
| LOW | crates/screenpipe-engine/src/snapshot_compaction.rs | 724 | // Step 2: Create video_chunk and update frame pointers in one transaction | COMMENT |
| LOW | crates/screenpipe-engine/src/snapshot_compaction.rs | 744 | // Step 3: Delete source JPEGs — only for frames actually encoded into | COMMENT |
| LOW | crates/screenpipe-engine/src/archive.rs | 872 | // Step 1: Upload media files (MP4s + snapshots) before metadata | COMMENT |
| LOW | crates/screenpipe-engine/src/archive.rs | 902 | // Step 2: Upload metadata in chunks: [watermark, cutoff] | COMMENT |
| LOW⚡ | crates/screenpipe-engine/src/bin/screenpipe-engine.rs | 1180 | // Step 1: prewarm-pending upgrade is universal. | COMMENT |
| LOW⚡ | crates/screenpipe-engine/src/bin/screenpipe-engine.rs | 1183 | // Step 2: auto-start only for Always mode AND only if the | COMMENT |
| LOW | …screenpipe-engine/src/meeting_watcher/ui_scan/macos.rs | 634 | // Step 1: find running meeting apps | COMMENT |
| LOW | …screenpipe-engine/src/meeting_watcher/ui_scan/macos.rs | 696 | // Step 2: scan for call controls | COMMENT |
| LOW | …reenpipe-engine/src/meeting_watcher/ui_scan/windows.rs | 712 | // Step 1: find running meeting apps (includes Zoom) | COMMENT |
| LOW | …reenpipe-engine/src/meeting_watcher/ui_scan/windows.rs | 723 | // Step 2: scan each found app for call controls | COMMENT |
| LOW | …reenpipe-engine/src/meeting_watcher/ui_scan/windows.rs | 742 | // Step 3: check specifically for Zoom processes | COMMENT |
| LOW⚡ | crates/screenpipe-db/tests/ui_events_batch_test.rs | 139 | // Step 1: row starts with frame_id = NULL. | COMMENT |
| LOW⚡ | crates/screenpipe-db/tests/ui_events_batch_test.rs | 148 | // Step 2: linker UPDATE populates it. | COMMENT |
| LOW | crates/screenpipe-db/tests/ui_events_batch_test.rs | 160 | // Step 3: a spurious duplicate UPDATE with a DIFFERENT frame_id | COMMENT |
| LOW⚡ | crates/screenpipe-audio/tests/onnx_model_test.rs | 159 | // Step 1: Initialize SileroVad (first ONNX model loaded) | COMMENT |
| LOW⚡ | crates/screenpipe-audio/tests/onnx_model_test.rs | 165 | // Step 2: Download/load embedding model | COMMENT |
| LOW⚡ | crates/screenpipe-audio/tests/onnx_model_test.rs | 172 | // Step 3: Download/load segmentation model | COMMENT |
| LOW⚡ | crates/screenpipe-screen/tests/url_timing_test.rs | 173 | // Step 1: SCK screenshot (instant) | COMMENT |
| LOW⚡ | crates/screenpipe-screen/tests/url_timing_test.rs | 176 | // Step 2: AppleScript round-trip (simulated ~107ms) | COMMENT |
| LOW⚡ | docs/EVENT_DRIVEN_CAPTURE_SPEC.md | 232 | ### Step 1: DB migration + snapshot write path | COMMENT |
| LOW⚡ | docs/EVENT_DRIVEN_CAPTURE_SPEC.md | 238 | ### Step 2: Paired capture function | COMMENT |
| LOW⚡ | docs/EVENT_DRIVEN_CAPTURE_SPEC.md | 243 | ### Step 3: Event trigger system | COMMENT |
| LOW⚡ | docs/EVENT_DRIVEN_CAPTURE_SPEC.md | 249 | ### Step 4: New capture loop | COMMENT |
| LOW⚡ | docs/EVENT_DRIVEN_CAPTURE_SPEC.md | 255 | ### Step 5: Search + timeline integration | COMMENT |
| LOW⚡ | docs/EVENT_DRIVEN_CAPTURE_SPEC.md | 260 | ### Step 6: Cleanup | COMMENT |
| LOW | scripts/update-openapi.sh | 35 | # Step 1: Fix oasgen quirk — path params need `required: true` per OpenAPI 3.0 | COMMENT |
| LOW | scripts/update-openapi.sh | 52 | # Step 2: Fix empty title/version | COMMENT |
| LOW | scripts/update-openapi.sh | 66 | # Step 3: Enrich with tags, summaries, descriptions (requires PyYAML) | COMMENT |
| LOW | packages/browser-extension/src/options.ts | 149 | // Step 1: liveness. | COMMENT |
| LOW | packages/browser-extension/src/options.ts | 162 | // Step 2: auth probe. | COMMENT |
| LOW | …enpipe-app-tauri/components/settings/usage-section.tsx | 289 | // Step 1: Load cache instantly | COMMENT |
| LOW | …enpipe-app-tauri/components/settings/usage-section.tsx | 302 | // Step 2: Incremental update | COMMENT |
| LOW | …creenpipe-app-tauri/components/settings/ai-presets.tsx | 847 | // Step 2: Auth check | COMMENT |
| LOW | …creenpipe-app-tauri/components/settings/ai-presets.tsx | 893 | // Step 3: Parse models (skip for openai-chatgpt when /v1/models returned 403) | COMMENT |
| LOW | …creenpipe-app-tauri/components/settings/ai-presets.tsx | 937 | // Step 4: Test the actual chat endpoint. BYOK providers share one probe so | COMMENT |
| LOW | …onents/settings/hooks/use-transcription-diagnostics.ts | 96 | // Step 1: Endpoint connectivity — try root URL or /v1/models | COMMENT |
| LOW | …onents/settings/hooks/use-transcription-diagnostics.ts | 176 | // Step 4: the exact request "Test and enable" and production recording | COMMENT |
| LOW | …p-tauri/components/onboarding/first-run-guide.test.tsx | 61 | // Step 0: no tour yet, no prompt card — just the invitation. | COMMENT |
| LOW | …/screenpipe-app-tauri/src-tauri/src/enterprise_sync.rs | 417 | // Step 1: ask /search for the most recent OCR frames. We request a | COMMENT |
| LOW | …/screenpipe-app-tauri/src-tauri/src/enterprise_sync.rs | 458 | // Step 2: fetch the frame's image bytes. A non-success status is | COMMENT |
| LOW | …/screenpipe-app-tauri/src-tauri/src/enterprise_sync.rs | 482 | // Step 3: decode → resize 320×180 → JPEG @ Q60 → base64. | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/notification-toggle.ts | 115 | // Step 1: Remove the deny rule line | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/notification-toggle.ts | 118 | // Step 2: Remove empty "deny:" blocks | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/notification-toggle.ts | 121 | // Step 3: Remove empty "permissions:" blocks | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/chat-test-body.test.ts | 153 | // Step 1: send with max_tokens | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/chat-test-body.test.ts | 157 | // Step 2: endpoint rejects | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/chat-test-body.test.ts | 161 | // Step 3: retry with max_completion_tokens | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 189 | // Step 1: admin creates team and key | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 192 | // Step 2: admin pushes config (encrypted) | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 200 | // Step 3: admin wraps key with passphrase | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 204 | // Step 4: admin uploads wrapped blob to server (POST /api/team/key-claim) | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 208 | // Step 5: invite link contains NO key material | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 216 | // Step 6: member fetches wrapped blob from server (GET /api/team/key-claim/:token) | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 219 | // Step 7: member unwraps with passphrase (shared out-of-band) | COMMENT |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/screenpipe-engine/src/snapshot_compaction.rs | 724 | // Step 2: Create video_chunk and update frame pointers in one transaction | COMMENT |
| LOW | crates/screenpipe-engine/src/snapshot_compaction.rs | 744 | // Step 3: Delete source JPEGs — only for frames actually encoded into | COMMENT |
| LOW | crates/screenpipe-engine/src/archive.rs | 872 | // Step 1: Upload media files (MP4s + snapshots) before metadata | COMMENT |
| LOW | crates/screenpipe-engine/src/archive.rs | 902 | // Step 2: Upload metadata in chunks: [watermark, cutoff] | COMMENT |
| LOW⚡ | crates/screenpipe-engine/src/bin/screenpipe-engine.rs | 1180 | // Step 1: prewarm-pending upgrade is universal. | COMMENT |
| LOW⚡ | crates/screenpipe-engine/src/bin/screenpipe-engine.rs | 1183 | // Step 2: auto-start only for Always mode AND only if the | COMMENT |
| LOW | …screenpipe-engine/src/meeting_watcher/ui_scan/macos.rs | 634 | // Step 1: find running meeting apps | COMMENT |
| LOW | …screenpipe-engine/src/meeting_watcher/ui_scan/macos.rs | 696 | // Step 2: scan for call controls | COMMENT |
| LOW | …reenpipe-engine/src/meeting_watcher/ui_scan/windows.rs | 712 | // Step 1: find running meeting apps (includes Zoom) | COMMENT |
| LOW | …reenpipe-engine/src/meeting_watcher/ui_scan/windows.rs | 723 | // Step 2: scan each found app for call controls | COMMENT |
| LOW | …reenpipe-engine/src/meeting_watcher/ui_scan/windows.rs | 742 | // Step 3: check specifically for Zoom processes | COMMENT |
| LOW⚡ | crates/screenpipe-db/tests/ui_events_batch_test.rs | 139 | // Step 1: row starts with frame_id = NULL. | COMMENT |
| LOW⚡ | crates/screenpipe-db/tests/ui_events_batch_test.rs | 148 | // Step 2: linker UPDATE populates it. | COMMENT |
| LOW | crates/screenpipe-db/tests/ui_events_batch_test.rs | 160 | // Step 3: a spurious duplicate UPDATE with a DIFFERENT frame_id | COMMENT |
| LOW⚡ | crates/screenpipe-audio/tests/onnx_model_test.rs | 159 | // Step 1: Initialize SileroVad (first ONNX model loaded) | COMMENT |
| LOW⚡ | crates/screenpipe-audio/tests/onnx_model_test.rs | 165 | // Step 2: Download/load embedding model | COMMENT |
| LOW⚡ | crates/screenpipe-audio/tests/onnx_model_test.rs | 172 | // Step 3: Download/load segmentation model | COMMENT |
| LOW⚡ | crates/screenpipe-screen/tests/url_timing_test.rs | 173 | // Step 1: SCK screenshot (instant) | COMMENT |
| LOW⚡ | crates/screenpipe-screen/tests/url_timing_test.rs | 176 | // Step 2: AppleScript round-trip (simulated ~107ms) | COMMENT |
| LOW | scripts/update-openapi.sh | 35 | # Step 1: Fix oasgen quirk — path params need `required: true` per OpenAPI 3.0 | COMMENT |
| LOW | scripts/update-openapi.sh | 52 | # Step 2: Fix empty title/version | COMMENT |
| LOW | scripts/update-openapi.sh | 66 | # Step 3: Enrich with tags, summaries, descriptions (requires PyYAML) | COMMENT |
| LOW | packages/browser-extension/src/options.ts | 149 | // Step 1: liveness. | COMMENT |
| LOW | packages/browser-extension/src/options.ts | 162 | // Step 2: auth probe. | COMMENT |
| LOW | …enpipe-app-tauri/components/settings/usage-section.tsx | 289 | // Step 1: Load cache instantly | COMMENT |
| LOW | …enpipe-app-tauri/components/settings/usage-section.tsx | 302 | // Step 2: Incremental update | COMMENT |
| LOW | …creenpipe-app-tauri/components/settings/ai-presets.tsx | 847 | // Step 2: Auth check | COMMENT |
| LOW | …creenpipe-app-tauri/components/settings/ai-presets.tsx | 893 | // Step 3: Parse models (skip for openai-chatgpt when /v1/models returned 403) | COMMENT |
| LOW | …creenpipe-app-tauri/components/settings/ai-presets.tsx | 937 | // Step 4: Test the actual chat endpoint. BYOK providers share one probe so | COMMENT |
| LOW | …onents/settings/hooks/use-transcription-diagnostics.ts | 96 | // Step 1: Endpoint connectivity — try root URL or /v1/models | COMMENT |
| LOW | …onents/settings/hooks/use-transcription-diagnostics.ts | 176 | // Step 4: the exact request "Test and enable" and production recording | COMMENT |
| LOW | …p-tauri/components/onboarding/first-run-guide.test.tsx | 61 | // Step 0: no tour yet, no prompt card — just the invitation. | COMMENT |
| LOW | …/screenpipe-app-tauri/src-tauri/src/enterprise_sync.rs | 417 | // Step 1: ask /search for the most recent OCR frames. We request a | COMMENT |
| LOW | …/screenpipe-app-tauri/src-tauri/src/enterprise_sync.rs | 458 | // Step 2: fetch the frame's image bytes. A non-success status is | COMMENT |
| LOW | …/screenpipe-app-tauri/src-tauri/src/enterprise_sync.rs | 482 | // Step 3: decode → resize 320×180 → JPEG @ Q60 → base64. | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/notification-toggle.ts | 115 | // Step 1: Remove the deny rule line | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/notification-toggle.ts | 118 | // Step 2: Remove empty "deny:" blocks | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/notification-toggle.ts | 121 | // Step 3: Remove empty "permissions:" blocks | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/chat-test-body.test.ts | 153 | // Step 1: send with max_tokens | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/chat-test-body.test.ts | 157 | // Step 2: endpoint rejects | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/utils/chat-test-body.test.ts | 161 | // Step 3: retry with max_completion_tokens | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 189 | // Step 1: admin creates team and key | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 192 | // Step 2: admin pushes config (encrypted) | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 200 | // Step 3: admin wraps key with passphrase | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 204 | // Step 4: admin uploads wrapped blob to server (POST /api/team/key-claim) | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 208 | // Step 5: invite link contains NO key material | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 216 | // Step 6: member fetches wrapped blob from server (GET /api/team/key-claim/:token) | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 219 | // Step 7: member unwraps with passphrase (shared out-of-band) | COMMENT |
| LOW⚡ | …pipe-app-tauri/lib/__tests__/team-api-contract.test.ts | 227 | // Step 8: member decrypts configs | COMMENT |
| LOW | …/screenpipe-app-tauri/lib/hooks/use-frame-text-data.ts | 156 | // Step 1: GET — check if text position data already exists in DB | COMMENT |
| LOW | …/screenpipe-app-tauri/lib/hooks/use-frame-text-data.ts | 191 | // Step 2: No bounding boxes — schedule on-demand OCR after dwell delay. | COMMENT |
| LOW⚡ | …auri/lib/hooks/__tests__/timeline-reconnection.test.ts | 330 | // Step 1: WebSocket disconnects | COMMENT |
| LOW⚡ | …auri/lib/hooks/__tests__/timeline-reconnection.test.ts | 335 | // Step 2: Reconnection initiated - should reset state | COMMENT |
| LOW⚡ | …auri/lib/hooks/__tests__/timeline-reconnection.test.ts | 345 | // Step 3: WebSocket connects | COMMENT |
| LOW⚡ | …auri/lib/hooks/__tests__/timeline-reconnection.test.ts | 350 | // Step 4: Request sent (should work because sentRequests is empty) | COMMENT |
| LOW | …tauri/lib/hooks/__tests__/window-focus-refresh.test.ts | 168 | // Step 1: User opens timeline at 6:30 | COMMENT |
| LOW⚡ | …tauri/lib/hooks/__tests__/window-focus-refresh.test.ts | 180 | // Step 2: User closes timeline (window hidden) | COMMENT |
| LOW⚡ | …tauri/lib/hooks/__tests__/window-focus-refresh.test.ts | 183 | // Step 3: User reopens at 7:00 | COMMENT |
| LOW⚡ | …tauri/lib/hooks/__tests__/window-focus-refresh.test.ts | 187 | // Step 4: Window focus event fires, triggers onWindowFocus | COMMENT |
| LOW⚡ | …tauri/lib/hooks/__tests__/window-focus-refresh.test.ts | 194 | // Step 5: fetchTimeRange is called (from onWindowFocus or useEffect) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/screenpipe-engine/src/auth_key.rs | 449 | && value.starts_with("e2e-fake-token-")) | CODE |
| LOW | crates/screenpipe-engine/src/connections_api.rs | 4473 | creds.insert("email".into(), json!("user@example.com")); | CODE |
| LOW | crates/screenpipe-engine/src/connections_api.rs | 4477 | assert_eq!(user, "user@example.com"); | CODE |
| LOW | crates/screenpipe-engine/src/connections_api.rs | 4590 | creds.insert("email".into(), json!("user@example.com")); | CODE |
| LOW | crates/screenpipe-engine/src/cli/team_pipes.rs | 722 | args.member = vec!["admin@example.com".into()]; | CODE |
| LOW | …ates/screenpipe-engine/src/browser_scripts/snapshot.js | 119 | return el.getAttribute('placeholder') || labelText(el) || el.getAttribute('name') || ty || 'input'; | CODE |
| LOW | …ates/screenpipe-engine/src/browser_scripts/snapshot.js | 121 | if (formTags.has(tag)) return el.getAttribute('placeholder') || labelText(el) || el.getAttribute('name') || tag; | CODE |
| LOW | crates/screenpipe-engine/src/routes/elements.rs | 450 | return property_value(properties, element.id, "placeholder") | CODE |
| LOW | crates/screenpipe-engine/src/routes/elements.rs | 460 | .or_else(|| property_value(properties, element.id, "placeholder")) | CODE |
| LOW | crates/screenpipe-engine/src/routes/elements.rs | 1154 | r#"{"automation_id":"password","is_password":true,"value":"hunter2","placeholder":"Password"}"#, | CODE |
| LOW | crates/screenpipe-engine/src/routes/frames.rs | 1431 | "placeholder", | CODE |
| LOW | crates/screenpipe-db/benches/new_db_benchmark.rs | 26 | ("Long", "This is a long piece of text that simulates a more realistic OCR result. It contains multiple paragrap | CODE |
| LOW | crates/screenpipe-db/benches/new_db_benchmark.rs | 26 | ("Long", "This is a long piece of text that simulates a more realistic OCR result. It contains multiple paragrap | CODE |
| LOW | crates/screenpipe-db/src/db/frames.rs | 540 | props.insert("placeholder".into(), serde_json::Value::String(v.clone())); | CODE |
| LOW | crates/screenpipe-connect/src/oauth.rs | 1552 | let got = load_oauth_json(Some(&store), id, Some("user@example.com")).await; | CODE |
| LOW | crates/screenpipe-connect/src/connections/imap.rs | 654 | login_session(client, "user@example.com", "secret", "127.0.0.1") | CODE |
| LOW | crates/screenpipe-connect/src/connections/imap.rs | 672 | creds.insert("username".into(), json!("user@example.com")); | CODE |
| LOW | crates/screenpipe-redact/tests/worker_integration.rs | 1128 | let tree = r#"[{"role":"AXTextField","text":"hunter2","value":"hunter2","placeholder":"API key","depth":1,"bounds":{ | CODE |
| LOW | crates/screenpipe-redact/src/a11y_context.rs | 346 | "placeholder", | CODE |
| LOW | crates/screenpipe-redact/src/a11y_context.rs | 505 | {"role":"AXTextField","value":"hunter2","placeholder":"API key"}, | CODE |
| LOW | crates/screenpipe-redact/src/a11y_context.rs | 541 | "placeholder": "API key" | CODE |
| LOW | crates/screenpipe-redact/src/a11y_context.rs | 555 | Some(r#"[{"role":"AXTextField","value":"hunter2","placeholder":"API key"}]"#), | CODE |
| LOW | crates/screenpipe-redact/src/tree_json.rs | 71 | "placeholder", | CODE |
| LOW | crates/screenpipe-redact/src/tree_json.rs | 402 | "placeholder":"{s}", | CODE |
| LOW | crates/screenpipe-redact/src/image/worker.rs | 521 | let tree = r#"[{"role":"AXTextField","value":"opaque-value","placeholder":"API key","bounds":{"left":0.5,"top":0 | CODE |
| LOW | crates/screenpipe-redact/src/adapters/regex.rs | 2304 | &"lorem ipsum dolor sit amet ".repeat(40), | CODE |
| LOW | crates/screenpipe-redact/src/adapters/regex.rs | 2304 | &"lorem ipsum dolor sit amet ".repeat(40), | CODE |
| LOW | crates/screenpipe-redact/src/worker/columns.rs | 235 | "placeholder", | CODE |
| LOW | …tes/screenpipe-a11y/examples/semantic_capture_probe.rs | 149 | "placeholder", | CODE |
| LOW | crates/screenpipe-a11y/src/tree/linux.rs | 772 | &["placeholder-text", "placeholder", "html-placeholder"], | CODE |
| LOW | crates/screenpipe-capture/src/paired_capture.rs | 1378 | let json = r#"[{"text":"user@example.com","x":"0","y":"0"},{"text":"safe text","x":"1","y":"1"},{"text":"key: sk | CODE |
| LOW | crates/screenpipe-capture/src/paired_capture.rs | 1381 | !result.contains("user@example.com"), | CODE |
| LOW | …es/screenpipe-semantic/tests/committed_data_privacy.rs | 74 | || email.ends_with("@example.org") | CODE |
| LOW | crates/screenpipe-semantic/src/messaging.rs | 805 | "placeholder", | CODE |
| LOW | crates/screenpipe-semantic/src/messaging.rs | 846 | "placeholder", | CODE |
| LOW | packages/ai-gateway/src/test/openai-models.unit.test.ts | 76 | const ids = await listedModelIds({ OPENAI_API_KEY: 'placeholder' }); | CODE |
| LOW | packages/ai-gateway/src/test/openai-models.unit.test.ts | 234 | createProvider('gpt-5.5', env({ OPENAI_API_KEY: 'placeholder' })); | CODE |
| LOW⚡ | packages/ai-gateway/src/test/flex-tier.unit.test.ts | 87 | provider.vertexProvider.getAccessToken = async () => 'fake-token'; | CODE |
| LOW⚡ | packages/ai-gateway/src/test/flex-tier.unit.test.ts | 91 | expect(headers['Authorization']).toBe('Bearer fake-token'); | CODE |
| LOW⚡ | packages/ai-gateway/src/test/flex-tier.unit.test.ts | 96 | provider.vertexProvider.getAccessToken = async () => 'fake-token'; | CODE |
| LOW | packages/ai-gateway/src/providers/index.ts | 122 | return !['placeholder', 'changeme', 'change-me', 'todo', 'none', 'null', 'undefined'].includes(lower); | CODE |
| LOW | packages/ai-gateway/src/utils/auth.test.ts | 759 | email: 'test@test.com', | CODE |
| LOW | packages/ai-gateway/src/utils/auth.test.ts | 771 | email: 'test@test.com', | CODE |
| LOW | packages/ai-gateway/src/utils/auth.test.ts | 782 | email: 'test@test.com', | CODE |
| LOW | packages/ai-gateway/src/handlers/models.ts | 63 | return !['placeholder', 'changeme', 'change-me', 'todo', 'none', 'null', 'undefined'].includes(lower); | CODE |
| LOW⚡ | …s/ai-gateway/src/services/background-limit-fallback.ts | 47 | return normalized.length > 0 && !['placeholder', 'changeme', 'change-me', 'none', 'null', 'undefined'].includes(normali | CODE |
| LOW | packages/ai-gateway/src/services/usage-tracker.test.ts | 575 | email: 'test@test.com', | CODE |
| LOW | packages/sdk/examples/electron-app/renderer.js | 16 | const placeholder = $('placeholder'); | CODE |
| LOW | packages/sdk/examples/electron-app/index.html | 124 | <span class="placeholder" id="placeholder">preview appears here</span> | CODE |
| LOW | …omponents/meeting-notes/meeting-chat-citations.test.ts | 204 | const long = "lorem ipsum 3:34 ".repeat(4000); | CODE |
| LOW⚡ | …i/components/meeting-notes/meeting-chat-panel.test.tsx | 278 | "placeholder", | CODE |
| LOW⚡ | …i/components/meeting-notes/meeting-chat-panel.test.tsx | 285 | "placeholder", | CODE |
| LOW⚡ | …i/components/meeting-notes/meeting-chat-panel.test.tsx | 295 | "placeholder", | CODE |
| LOW | …i/components/meeting-notes/meeting-chat-panel.test.tsx | 318 | expect(input).toHaveAttribute("placeholder", "refreshing…"); | CODE |
| LOW | apps/screenpipe-app-tauri/src-tauri/src/auth_token.rs | 247 | looks_like_jwt(value) || (crate::config::is_e2e_mode() && value.starts_with("e2e-fake-token-")) | CODE |
| LOW | apps/screenpipe-app-tauri/lib/chat-utils.test.ts | 226 | const result = normalizeComposerMentionsForModel('@"John Doe" what did he say', { now }); | CODE |
| LOW | apps/screenpipe-app-tauri/lib/chat-utils.test.ts | 227 | expect(result.context.speakerName).toBe("John Doe"); | CODE |
| LOW | apps/screenpipe-app-tauri/lib/chat-utils.ts | 629 | * The composer is plain text, so `@audio`, `@slack`, `@"John Doe"`, `#tag`, | COMMENT |
| LOW⚡ | …/screenpipe-app-tauri/lib/__tests__/chat-store.test.ts | 611 | id: "placeholder", | CODE |
| LOW⚡ | …/screenpipe-app-tauri/lib/__tests__/chat-store.test.ts | 617 | actions.setCurrent("placeholder"); | CODE |
| 21 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/screenpipe-gateway/e2e/docker-compose.auth.yml | 5 | # AUTHENTICATED overlay for the compose harness (SCR-288 item 6). | COMMENT |
| MEDIUM | crates/screenpipe-gateway/e2e/docker-compose.yml | 5 | # Compose harness for the M1 demo (SCR-287): MinIO plays the customer's | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/resource_monitor.rs | 92 | /// Growth the *fit* predicts over the window — robust to endpoint noise, | COMMENT |
| MEDIUM | crates/screenpipe-engine/src/focus_tracker/darwin.rs | 19 | //! is robust, permission-free, and correct in the common case — users glance | COMMENT |
| MEDIUM | …eenpipe-engine/src/meeting_watcher/ui_scan/pipeline.rs | 100 | // (30s) provides enough buffer. A more robust approach would be to store the PID | COMMENT |
| MEDIUM | …eenpipe-engine/src/meeting_watcher/ui_scan/pipeline.rs | 103 | // TODO: Store PID in MeetingState for robust browser tab-switch handling. | COMMENT |
| MEDIUM | …ates/screenpipe-db/tests/output_audio_liveness_test.rs | 200 | // the test robust against sub-second skew between Rust's Utc::now() at | COMMENT |
| MEDIUM | crates/screenpipe-screen/src/frame_comparison.rs | 64 | /// Histogram is faster and robust for detecting significant changes. | COMMENT |
| MEDIUM | crates/screenpipe-redact/src/image/frame_redactor.rs | 9 | //! for an OCR-robust outcome — re-running OCR on the redacted output | COMMENT |
| MEDIUM | …s/screenpipe-semantic/evals/pipes/installed_cases.json | 20 | "## Highest-leverage workflows", | CODE |
| MEDIUM | …s/screenpipe-semantic/evals/pipes/installed_cases.json | 56 | "## Highest-leverage workflows", | CODE |
| MEDIUM | …s/screenpipe-semantic/evals/pipes/installed_cases.json | 90 | "## Highest-leverage workflows", | CODE |
| MEDIUM | scripts/capture-wedge-repro.sh | 10 | # every counter freezes together by the time it fires. This harness samples | COMMENT |
| MEDIUM | scripts/build-gateway-container.sh | 33 | # signing seed), so it is for the compose harness and nothing else. | COMMENT |
| MEDIUM | packages/ai-gateway/src/providers/openai.ts | 300 | // blowing up — much more robust than chasing the prefix allowlist as | COMMENT |
| MEDIUM | .github/dependabot.yml | 31 | # - apps/.../src-tauri/livetext-stress — standalone stress harness, not shipped. | COMMENT |
| MEDIUM | .github/workflows/sync-skills.yml | 60 | # PAT pattern adds maintenance pain (PATs expire). A PR is robust | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 225 | # harness starts. Stage both runtimes once for all release-dev tests. | COMMENT |
| MEDIUM | apps/screenpipe-app-tauri/src-tauri/Cargo.toml | 391 | # Maximum-speed local builds for updater e2e harness — no optimization, fastest compile. | COMMENT |
| MEDIUM | …ps/screenpipe-app-tauri/src-tauri/src/owned_browser.rs | 818 | // into the panel — a seamless handoff. | COMMENT |
| MEDIUM | …ps/screenpipe-app-tauri/lib/owned-browser-ownership.ts | 100 | // (robust to a lagging `conversationId` state or a non-matching spawn id). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | crates/screenpipe-engine/src/routes/artifacts.rs | 872 | /// GET /artifacts — unified listing of AI-generated artifacts. | COMMENT |
| HIGH | apps/screenpipe-app-tauri/src-tauri/src/suggestions.rs | 1669 | /// Store AI-generated tags on recent frames using the existing tags + vision_tags tables. | COMMENT |
| HIGH | apps/screenpipe-app-tauri/lib/chat-storage.ts | 560 | // timestamp. One copy usually wins the AI-generated title; the other is left | COMMENT |
| HIGH | …tauri/lib/hooks/__tests__/timeline-store-logic.test.ts | 291 | // Mark as requested | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .claude/skills/screenpipe-api/SKILL.md | 485 | # Mark speaker as hallucination (false detection) | COMMENT |
| MEDIUM | docs/VISION_PIPELINE_SPEC.md | 95 | ### 3.2 Target Pipeline (decoupled, event-driven) | COMMENT |
| MEDIUM | packages/sdk/Cargo.toml | 39 | # All orchestration lives here. The Tauri plugin | COMMENT |
| MEDIUM | packages/sdk/tauri/rust/Cargo.toml | 18 | # The pure-Rust recorder orchestration. Calling it in-process is what | COMMENT |
| MEDIUM | …ps/screenpipe-app-tauri/components/standalone-chat.tsx | 1828 | // chat with an agentic loop (≥2 assistant messages with citations between | COMMENT |
| MEDIUM | …ents/chat/standalone/hooks/use-pi-foreground-events.ts | 1377 | // tiers at a few dozen requests/minute; a single agentic run can trip | COMMENT |
| MEDIUM | apps/screenpipe-app-tauri/lib/source-citations.ts | 58 | // pipe-run chats where the whole transcript is one agentic loop and showing | COMMENT |
| MEDIUM | apps/screenpipe-app-tauri/lib/source-citations.ts | 96 | // assistant of that turn — that's the agentic-loop pattern (Pi looping | COMMENT |
| MEDIUM | …npipe-app-tauri/lib/__tests__/source-citations.test.ts | 593 | readState, // repeated step in the agentic loop | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/screenpipe-screen/tests/custom_ocr_test.rs | 50 | except Exception as e: | CODE |
| LOW | scripts/memory-leak/leak_probe.py | 335 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_probe.py | 365 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_probe.py | 382 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 104 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 150 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 159 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 259 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 269 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 285 | except Exception as exc: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 542 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 545 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 556 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 578 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 694 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 753 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 870 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 875 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 1010 | except Exception: | CODE |
| LOW | scripts/memory-leak/leak_hunt.py | 1105 | except Exception: | CODE |
| LOW | packages/ai-gateway/modal/screenpipe_qwen35.py | 79 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/screenpipe-screen/tests/custom_ocr_test.rs | 11 | # Create a simple FastAPI server (app.py) that uses EasyOCR to process images: | COMMENT |
| MEDIUM | .devcontainer/scripts/postCreateCommand.sh | 3 | # Define the alias | COMMENT |
| MEDIUM | .github/workflows/release-cli.yml | 808 | # Create a symlink so the linker can find it. | COMMENT |
| MEDIUM | .github/workflows/release-app.yml | 537 | # Create a symlink so the linker finds it, and set OPENBLAS_PATH with lib/ subdir. | COMMENT |
| MEDIUM | .github/scripts/install_dependencies.sh | 17 | # Create a symlink so the linker finds it, and set OPENBLAS_PATH with lib/ subdir. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | crates/screenpipe-engine/src/server.rs | 1615 | r#"{"error":"unauthorized: API access requires authentication. Pass `Authorizati | CODE |
| HIGH | …pe-app-tauri/components/rewind/ai-presets-selector.tsx | 858 | placeholder="your-api-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/screenpipe-app-tauri/e2e/helpers/spotlight.ts | 26 | print(path) | CODE |
| HIGH | apps/screenpipe-app-tauri/e2e/helpers/spotlight.ts | 43 | print("_MDSetExclusion removal failed with status \\(status)") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/capture-wedge-repro.sh | 22 | # Usage: | COMMENT |
| LOW | scripts/regenerate-locks.sh | 15 | # Usage: | COMMENT |
| LOW | packages/ai-gateway/test-vertex-local.sh | 4 | # Usage: | COMMENT |
| LOW | packages/ai-gateway/scripts/deploy.sh | 16 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/enrich-openapi.py | 469 | CODE | |
| LOW | scripts/memory-leak/leak_probe.py | 147 | CODE | |
| LOW | scripts/memory-leak/leak_probe.py | 370 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 371 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 564 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 686 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 745 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 825 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 1088 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/release-app.yml | 1421 | # Check if it's a transient signing/bundling failure (worth retrying) | COMMENT |
| LOW | .github/scripts/purge_crabnebula.sh | 8 | # Check if the CN_API_KEY is set or throw an error | COMMENT |
| LOW | .github/scripts/purge_crabnebula.sh | 23 | # Check if current_version is empty | COMMENT |
| LOW | .github/scripts/purge_crabnebula.sh | 34 | # Check if we got valid numbers | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/screenpipe-audio/tests/accuracy_test.rs | 39 | r#"bro - got some good stuff from screenpipe here's the lowdown on your day, you productivity ninja: absolut | CODE |
| LOW | crates/screenpipe-audio/examples/bench_quality2.rs | 439 | reference: r#"bro - got some good stuff from screenpipe here's the lowdown on your day, you productivity nin | CODE |
| LOW | crates/screenpipe-audio/examples/bench_quality.rs | 255 | reference: r#"bro - got some good stuff from screenpipe here's the lowdown on your day, you productivity nin | CODE |
| MEDIUM | …ipe-app-tauri/src-tauri/gen/schemas/acl-manifests.json | 1 | {"autostart":{"default_permission":{"identifier":"default","description":"This permission set configures if your\napplic | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/memory-leak/leak_probe.py | 16 | CODE | |
| LOW | scripts/memory-leak/leak_probe.py | 30 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 13 | CODE | |
| LOW | scripts/memory-leak/leak_hunt.py | 20 | CODE | |
| LOW | packages/ai-gateway/modal/screenpipe_qwen35.py | 7 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/ai-gateway/src/handlers/voice-ws.ts | 1 | // TODO: implement | COMMENT |
| LOW | apps/screenpipe-app-tauri/src-tauri/src/tray.rs | 995 | // TODO: implement safely once we can reliably identify our NSStatusItem. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | infra/release-artifact-uploader/src/index.js | 110 | export async function handleRequest(request, env) { | CODE |
| LOW | packages/ai-gateway/src/index.ts | 325 | export async function handleRequest(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/memory-leak/leak_hunt.py | 51 | def set_scenario(self, name: str) -> None: | CODE |