Always-on context for AI agents: screen capture, OCR, voice, MCP server. Local-first, AGPL-3.0.
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution in ContextPulse/contextpulse
- HIGH code analysis flagged dynamic code execution in ContextPulse/contextpulse
- HIGH code analysis flagged dynamic code execution in ContextPulse/contextpulse
transport stdio · streamable-http counts 44 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
about
-
add_to_vocabulary
-
check_corrections
-
consolidate_learning
-
describe_workspace
-
find_related_context
-
get_active_project
-
get_activity_summary
-
get_agent_stats
-
get_app_usage
-
get_buffer_status
-
get_clipboard_history
-
get_context_at
-
get_correction_history
-
get_event_timeline
-
get_monitor_summary
-
get_project_context
-
get_recent
-
get_recent_touch_events
-
get_recent_transcriptions
-
get_recent_voice
-
get_screen_text
-
get_screenshot
-
get_session_summary
-
get_touch_stats
-
get_vocabulary
-
get_voice_stats
-
identify_project
-
learn_from_session
-
list_projects
-
memory_forget
-
memory_list
-
memory_recall
-
memory_search
-
memory_semantic_search
-
memory_stats
-
memory_store
-
rebuild_context_vocabulary
-
remove_from_vocabulary
-
route_to_journal
-
search_all_events
-
search_clipboard
-
search_history
-
search_voice
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 06122cf · analyzer v33 · 21h ago
danger signals2
- dynamic code execution __import__ sink ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/app.py :621
logger.info("ContextPulse Sight starting (pid=%d)", __import__("os").getpid()) - dynamic code execution __import__() ContextPulse-contextpulse-06122cf/tests/test_user_acceptance.py :128
__import__(mod)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 169
filesystem 68
- fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/config.py :14
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/daemon.py :26
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/first_run.py :12
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/license.py :18
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/license_dialog.py :131
lambda _: __import__("webbrowser").open("https://contextpulse.ai/pricing"), - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/licensing.py :36
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/platform/macos.py :20
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/settings.py :298
webbrowser.open("https://contextpulse.ai/pricing") - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/skill_setup.py :20
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/spine/bus.py :21
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/core/tests/conftest.py :72
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/core/tests/test_daemon.py :237
daemon_mod.CRASH_LOG = tmp_path # directory, not file — open() will fail - fs ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/embeddings.py :14
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :23
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/storage.py :19
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/detector.py :5
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/journal_bridge.py :7
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/registry.py :7
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/scripts/auto_benchmark.py :12
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/scripts/benchmark_storage.py :14
4. VS Code with a file open (code) - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/scripts/verify_live.py :12
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/activity.py :14
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/app.py :10
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/buffer.py :19
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/capture.py :13
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/config.py :6
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/icon.py :6
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :22
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/ocr_worker.py :22
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/setup.py :12
import shutil - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/tests/conftest.py :4
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/tests/test_buffer.py :5
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/tests/test_capture.py :68
loaded = Image.open(path) - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/tests/test_config.py :27
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/screen/tests/test_e2e.py :92
img = Image.open(frame_path) - fs ContextPulse-contextpulse-06122cf/packages/touch/src/contextpulse_touch/correction_detector.py :21
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/conftest.py :4
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/test_correction_detector.py :5
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/test_edge_cases.py :6
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/test_integration.py :13
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/analyzer.py :13
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/clipboard_harvester.py :15
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/consolidator.py :13
import shutil - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/context_vocab.py :16
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/escalation.py :15
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/hot_words.py :16
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/metrics.py :15
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/model_manager.py :11
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/ocr_harvester.py :16
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/recorder.py :159
with wave.open(buf, "wb") as wf: - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/session_learner.py :21
from pathlib import Path - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/transcriber.py :126
os.unlink(tmp_path) - fs ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/vocabulary.py :12
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/conftest.py :4
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_audio_pipeline.py :29
wf = wave.open(io.BytesIO(wav_bytes), "rb") - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_clipboard_harvester.py :9
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_consolidator.py :9
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_context_vocab.py :7
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_escalation.py :9
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_hot_words.py :9
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_metrics.py :9
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_ocr_harvester.py :9
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_recorder.py :38
wav_file = wave.open(io.BytesIO(result), "rb") - fs (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_transcriber.py :151
with wave.open(buf, "wb") as wf: - fs (weak) ContextPulse-contextpulse-06122cf/scripts/canary_health_check.py :31
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/scripts/nightly_learning.py :18
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/tests/soak/generate_test_data.py :23
from pathlib import Path - fs (weak) ContextPulse-contextpulse-06122cf/tests/test_user_acceptance.py :22
import shutil
shell / exec 11
- shell ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/daemon.py :21
import subprocess - shell ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/platform/macos.py :18
import subprocess - shell ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/platform/macos_permissions.py :15
import subprocess - shell ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/platform/windows.py :184
import subprocess - shell ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/skill_setup.py :297
import subprocess - shell ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/tray_macos.py :9
import subprocess - shell ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/journal_bridge.py :5
import subprocess - shell (weak) ContextPulse-contextpulse-06122cf/packages/screen/scripts/auto_benchmark.py :8
import subprocess - shell ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/app.py :6
import subprocess - shell (weak) ContextPulse-contextpulse-06122cf/scripts/canary_health_check.py :26
import subprocess - shell (weak) ContextPulse-contextpulse-06122cf/tests/test_user_acceptance.py :23
import subprocess
network 1
- net ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/embeddings.py :13
import urllib.request
secrets 1
- secrets ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/config.py :48
return os.getenv("ANTHROPIC_API_KEY", "")
database 31
- db ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/spine/bus.py :19
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/core/tests/test_spine.py :4
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/storage.py :15
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/memory/tests/test_embeddings.py :337
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/activity.py :10
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/touch/src/contextpulse_touch/correction_detector.py :18
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/touch/src/contextpulse_touch/mcp_server.py :10
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/conftest.py :82
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/test_cross_modal.py :11
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/test_integration.py :10
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/touch/tests/test_mcp_tools.py :4
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/analyzer.py :28
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/clipboard_harvester.py :13
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/consolidator.py :14
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/escalation.py :13
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/hot_words.py :14
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :10
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/metrics.py :12
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/ocr_harvester.py :14
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/session_learner.py :19
import sqlite3 - db ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/voice_module.py :508
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/conftest.py :105
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_clipboard_harvester.py :7
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_consolidator.py :7
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_escalation.py :7
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_hot_words.py :7
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_integration.py :11
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_mcp_tools.py :3
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_metrics.py :7
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/packages/voice/tests/test_ocr_harvester.py :7
import sqlite3 - db (weak) ContextPulse-contextpulse-06122cf/tests/soak/generate_test_data.py :106
"import sqlite3\nconn = sqlite3.connect('activity.db')\ncursor = conn.execute('SELECT * FROM events WHERE timestamp > ?', (cutoff,))",
tool registrations 71
- about ContextPulse-contextpulse-06122cf/glama/server.py :39
- get_monitor_summary ContextPulse-contextpulse-06122cf/glama/server.py :67
- get_screenshot ContextPulse-contextpulse-06122cf/glama/server.py :85
- get_screen_text ContextPulse-contextpulse-06122cf/glama/server.py :109
- get_recent ContextPulse-contextpulse-06122cf/glama/server.py :129
- get_buffer_status ContextPulse-contextpulse-06122cf/glama/server.py :151
- get_context_at ContextPulse-contextpulse-06122cf/glama/server.py :167
- search_history ContextPulse-contextpulse-06122cf/glama/server.py :190
- get_activity_summary ContextPulse-contextpulse-06122cf/glama/server.py :216
- get_app_usage ContextPulse-contextpulse-06122cf/glama/server.py :238
- get_session_summary ContextPulse-contextpulse-06122cf/glama/server.py :257
- find_related_context ContextPulse-contextpulse-06122cf/glama/server.py :274
- describe_workspace ContextPulse-contextpulse-06122cf/glama/server.py :296
- identify_project ContextPulse-contextpulse-06122cf/glama/server.py :317
- get_active_project ContextPulse-contextpulse-06122cf/glama/server.py :338
- list_projects ContextPulse-contextpulse-06122cf/glama/server.py :355
- get_project_context ContextPulse-contextpulse-06122cf/glama/server.py :371
- route_to_journal ContextPulse-contextpulse-06122cf/glama/server.py :391
- get_recent_voice ContextPulse-contextpulse-06122cf/glama/server.py :419
- search_voice ContextPulse-contextpulse-06122cf/glama/server.py :439
- get_voice_stats ContextPulse-contextpulse-06122cf/glama/server.py :460
- get_correction_history ContextPulse-contextpulse-06122cf/glama/server.py :480
- add_to_vocabulary ContextPulse-contextpulse-06122cf/glama/server.py :503
- get_vocabulary ContextPulse-contextpulse-06122cf/glama/server.py :527
- remove_from_vocabulary ContextPulse-contextpulse-06122cf/glama/server.py :543
- get_clipboard_history ContextPulse-contextpulse-06122cf/glama/server.py :569
- search_clipboard ContextPulse-contextpulse-06122cf/glama/server.py :590
- get_recent_touch_events ContextPulse-contextpulse-06122cf/glama/server.py :614
- get_touch_stats ContextPulse-contextpulse-06122cf/glama/server.py :634
- memory_store ContextPulse-contextpulse-06122cf/glama/server.py :655
- memory_recall ContextPulse-contextpulse-06122cf/glama/server.py :683
- memory_search ContextPulse-contextpulse-06122cf/glama/server.py :704
- memory_semantic_search ContextPulse-contextpulse-06122cf/glama/server.py :725
- memory_list ContextPulse-contextpulse-06122cf/glama/server.py :750
- memory_forget ContextPulse-contextpulse-06122cf/glama/server.py :769
- memory_stats ContextPulse-contextpulse-06122cf/glama/server.py :790
- memory_store ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :84
- memory_recall ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :119
- memory_search ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :136
- memory_semantic_search ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :180
- memory_list ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :206
- memory_forget ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :227
- memory_stats ContextPulse-contextpulse-06122cf/packages/memory/src/contextpulse_memory/mcp_server.py :242
- identify_project ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/mcp_server.py :38
- get_active_project ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/mcp_server.py :63
- list_projects ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/mcp_server.py :84
- get_project_context ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/mcp_server.py :98
- route_to_journal ContextPulse-contextpulse-06122cf/packages/project/src/contextpulse_project/mcp_server.py :110
- get_monitor_summary ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :101
- get_screenshot ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :286
- get_recent ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :383
- get_screen_text ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :435
- get_buffer_status ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :473
- get_activity_summary ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :546
- search_history ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :589
- get_context_at ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :627
- get_clipboard_history ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :675
- search_clipboard ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :708
- get_agent_stats ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :741
- search_all_events ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :777
- get_event_timeline ContextPulse-contextpulse-06122cf/packages/screen/src/contextpulse_sight/mcp_server.py :836
- get_recent_touch_events ContextPulse-contextpulse-06122cf/packages/touch/src/contextpulse_touch/mcp_server.py :31
- get_touch_stats ContextPulse-contextpulse-06122cf/packages/touch/src/contextpulse_touch/mcp_server.py :106
- get_correction_history ContextPulse-contextpulse-06122cf/packages/touch/src/contextpulse_touch/mcp_server.py :182
- get_recent_transcriptions ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :32
- get_voice_stats ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :86
- get_vocabulary ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :143
- learn_from_session ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :175
- rebuild_context_vocabulary ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :210
- consolidate_learning ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :235
- check_corrections ContextPulse-contextpulse-06122cf/packages/voice/src/contextpulse_voice/mcp_server.py :271
declared dependencies 34
- mcp@>=1.0
- contextpulse-core@>=0.1.0
- contextpulse-sight@>=0.1.0
- contextpulse-voice@>=0.1.0
- contextpulse-touch@>=0.1.0
- python-dotenv@>=1.0
- cryptography@>=43.0
- mss@>=9.0
- pynput@>=1.7
- pystray@>=0.19
- Pillow@>=10.0
- numpy@>=1.26
- rapidocr-onnxruntime@>=1.2
- faster-whisper@>=1.0
- sounddevice@>=0.4
- pyperclip@>=1.8
- pyautogui@>=0.9
- anthropic@>=0.39
- onnxruntime@>=1.17
- tokenizers@>=0.19
- contextpulse-memory@>=0.1.0
- pyobjc-framework-Cocoa@>=12.1
- pyobjc-framework-Quartz@>=10.0
- pyobjc-framework-ApplicationServices@>=10.0
- pyobjc-framework-Vision@>=10.0
- rumps@>=0.4
- mlx-whisper@>=0.4.3
- openai@>=2.32.0
- pytest@>=8.0
- pytest-cov@>=5.0
- pytest-timeout@>=2.4.0
- pytest-threadleak@>=0.1
- hypothesis@>=6.100
- ruff@>=0.15.11
clipboard 1
- clipboard shell call ContextPulse-contextpulse-06122cf/packages/core/src/contextpulse_core/platform/linux.py :30
"For Wayland, use wl-paste --watch.",