eyra 4.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- eyra-4.3.4/.editorconfig +18 -0
- eyra-4.3.4/.env.example +139 -0
- eyra-4.3.4/.github/CODEOWNERS +1 -0
- eyra-4.3.4/.github/FUNDING.yml +1 -0
- eyra-4.3.4/.github/ISSUE_TEMPLATE/bug_report.yml +175 -0
- eyra-4.3.4/.github/ISSUE_TEMPLATE/config.yml +5 -0
- eyra-4.3.4/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
- eyra-4.3.4/.github/PULL_REQUEST_TEMPLATE.md +33 -0
- eyra-4.3.4/.github/dependabot.yml +11 -0
- eyra-4.3.4/.github/workflows/ci.yml +72 -0
- eyra-4.3.4/.github/workflows/docs-pages.yml +98 -0
- eyra-4.3.4/.github/workflows/publish-pypi.yml +35 -0
- eyra-4.3.4/.gitignore +44 -0
- eyra-4.3.4/.python-version +1 -0
- eyra-4.3.4/CHANGELOG.md +488 -0
- eyra-4.3.4/CODE_OF_CONDUCT.md +29 -0
- eyra-4.3.4/CONTRIBUTING.md +171 -0
- eyra-4.3.4/LICENSE +113 -0
- eyra-4.3.4/PKG-INFO +299 -0
- eyra-4.3.4/README.md +262 -0
- eyra-4.3.4/SECURITY.md +68 -0
- eyra-4.3.4/apps/EyraMenuBar/Package.swift +29 -0
- eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/AppState.swift +147 -0
- eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/EyraCLI.swift +64 -0
- eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/EyraMenuBarApp.swift +22 -0
- eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/MenuViews.swift +188 -0
- eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBarCore/StatusModel.swift +67 -0
- eyra-4.3.4/apps/EyraMenuBar/Tests/EyraMenuBarTests/StatusModelTests.swift +58 -0
- eyra-4.3.4/doc/.mintignore +16 -0
- eyra-4.3.4/doc/architecture/overview.mdx +55 -0
- eyra-4.3.4/doc/architecture/privacy.mdx +56 -0
- eyra-4.3.4/doc/architecture/routing.mdx +84 -0
- eyra-4.3.4/doc/architecture/runtime.mdx +45 -0
- eyra-4.3.4/doc/architecture/tools.mdx +62 -0
- eyra-4.3.4/doc/architecture/voice.mdx +38 -0
- eyra-4.3.4/doc/architecture/web-runtime.mdx +49 -0
- eyra-4.3.4/doc/development/extending-eyra.mdx +75 -0
- eyra-4.3.4/doc/development/local-development.mdx +69 -0
- eyra-4.3.4/doc/development/release-readiness.mdx +82 -0
- eyra-4.3.4/doc/development/source-map.mdx +80 -0
- eyra-4.3.4/doc/development/testing.mdx +78 -0
- eyra-4.3.4/doc/docs.json +101 -0
- eyra-4.3.4/doc/favicon.svg +6 -0
- eyra-4.3.4/doc/get-started/configuration.mdx +163 -0
- eyra-4.3.4/doc/get-started/first-session.mdx +92 -0
- eyra-4.3.4/doc/get-started/installation.mdx +216 -0
- eyra-4.3.4/doc/get-started/menu-bar.mdx +114 -0
- eyra-4.3.4/doc/get-started/troubleshooting.mdx +218 -0
- eyra-4.3.4/doc/guides/background-tasks.mdx +75 -0
- eyra-4.3.4/doc/guides/connectors.mdx +144 -0
- eyra-4.3.4/doc/guides/external-agents-and-mcp.mdx +66 -0
- eyra-4.3.4/doc/guides/local-file-work.mdx +74 -0
- eyra-4.3.4/doc/guides/memory-and-instructions.mdx +136 -0
- eyra-4.3.4/doc/guides/realtime-voice.mdx +51 -0
- eyra-4.3.4/doc/guides/triggers-and-reminders.mdx +45 -0
- eyra-4.3.4/doc/guides/voice-and-hands-free.mdx +118 -0
- eyra-4.3.4/doc/guides/web-ui.mdx +59 -0
- eyra-4.3.4/doc/index.mdx +78 -0
- eyra-4.3.4/doc/logo-dark.svg +7 -0
- eyra-4.3.4/doc/logo-light.svg +7 -0
- eyra-4.3.4/doc/project/changelog.mdx +47 -0
- eyra-4.3.4/doc/project/contributing.mdx +58 -0
- eyra-4.3.4/doc/project/strategy.mdx +44 -0
- eyra-4.3.4/doc/reference/agent-docs.mdx +83 -0
- eyra-4.3.4/doc/reference/certification.mdx +106 -0
- eyra-4.3.4/doc/reference/commands.mdx +164 -0
- eyra-4.3.4/doc/reference/settings.mdx +142 -0
- eyra-4.3.4/doc/reference/tools.mdx +88 -0
- eyra-4.3.4/doc/reference/web-endpoints.mdx +75 -0
- eyra-4.3.4/doc/scripts/prepare-github-pages.mjs +113 -0
- eyra-4.3.4/doc/security/privacy-model.mdx +58 -0
- eyra-4.3.4/doc/security/security-policy.mdx +41 -0
- eyra-4.3.4/install.sh +532 -0
- eyra-4.3.4/internal-docs/PRODUCT_STRATEGY.md +192 -0
- eyra-4.3.4/pyproject.toml +95 -0
- eyra-4.3.4/scripts/build_menu_bar_app.sh +89 -0
- eyra-4.3.4/scripts/certify_voice_to_computer.py +87 -0
- eyra-4.3.4/setup.sh +270 -0
- eyra-4.3.4/src/chat/__init__.py +0 -0
- eyra-4.3.4/src/chat/capture.py +153 -0
- eyra-4.3.4/src/chat/complexity_scorer.py +330 -0
- eyra-4.3.4/src/chat/message_handler.py +270 -0
- eyra-4.3.4/src/chat/session_state.py +14 -0
- eyra-4.3.4/src/clients/__init__.py +0 -0
- eyra-4.3.4/src/clients/ai_client.py +508 -0
- eyra-4.3.4/src/clients/base_client.py +131 -0
- eyra-4.3.4/src/main.py +128 -0
- eyra-4.3.4/src/runtime/__init__.py +0 -0
- eyra-4.3.4/src/runtime/actions.py +185 -0
- eyra-4.3.4/src/runtime/capabilities.py +206 -0
- eyra-4.3.4/src/runtime/certification.py +2690 -0
- eyra-4.3.4/src/runtime/cli.py +1207 -0
- eyra-4.3.4/src/runtime/coding_jobs.py +28 -0
- eyra-4.3.4/src/runtime/connectors/__init__.py +0 -0
- eyra-4.3.4/src/runtime/connectors/certification.py +136 -0
- eyra-4.3.4/src/runtime/connectors/cli.py +52 -0
- eyra-4.3.4/src/runtime/connectors/manifest.py +305 -0
- eyra-4.3.4/src/runtime/connectors/registry.py +218 -0
- eyra-4.3.4/src/runtime/connectors/runner.py +368 -0
- eyra-4.3.4/src/runtime/connectors/types.py +179 -0
- eyra-4.3.4/src/runtime/context.py +85 -0
- eyra-4.3.4/src/runtime/dictation.py +97 -0
- eyra-4.3.4/src/runtime/examples.py +47 -0
- eyra-4.3.4/src/runtime/external_agents.py +355 -0
- eyra-4.3.4/src/runtime/history/__init__.py +38 -0
- eyra-4.3.4/src/runtime/history/protocol.py +35 -0
- eyra-4.3.4/src/runtime/history/redaction.py +140 -0
- eyra-4.3.4/src/runtime/history/store.py +155 -0
- eyra-4.3.4/src/runtime/history/types.py +123 -0
- eyra-4.3.4/src/runtime/intents.py +90 -0
- eyra-4.3.4/src/runtime/jobs.py +523 -0
- eyra-4.3.4/src/runtime/live_session.py +2589 -0
- eyra-4.3.4/src/runtime/memory/__init__.py +11 -0
- eyra-4.3.4/src/runtime/memory/compression.py +48 -0
- eyra-4.3.4/src/runtime/memory/files.py +95 -0
- eyra-4.3.4/src/runtime/memory/mcp_client.py +181 -0
- eyra-4.3.4/src/runtime/memory/policy.py +35 -0
- eyra-4.3.4/src/runtime/memory/service.py +241 -0
- eyra-4.3.4/src/runtime/models.py +99 -0
- eyra-4.3.4/src/runtime/operator_loop.py +55 -0
- eyra-4.3.4/src/runtime/planner.py +193 -0
- eyra-4.3.4/src/runtime/preflight.py +433 -0
- eyra-4.3.4/src/runtime/privacy.py +108 -0
- eyra-4.3.4/src/runtime/routing/__init__.py +6 -0
- eyra-4.3.4/src/runtime/routing/effort.py +21 -0
- eyra-4.3.4/src/runtime/routing/fallback.py +61 -0
- eyra-4.3.4/src/runtime/routing/model_registry.py +158 -0
- eyra-4.3.4/src/runtime/routing/router.py +352 -0
- eyra-4.3.4/src/runtime/routing/tool_policy.py +350 -0
- eyra-4.3.4/src/runtime/routing/trace.py +80 -0
- eyra-4.3.4/src/runtime/routing/types.py +180 -0
- eyra-4.3.4/src/runtime/service.py +184 -0
- eyra-4.3.4/src/runtime/settings_catalog.py +131 -0
- eyra-4.3.4/src/runtime/shared.py +130 -0
- eyra-4.3.4/src/runtime/speech_controller.py +201 -0
- eyra-4.3.4/src/runtime/startup.py +550 -0
- eyra-4.3.4/src/runtime/status_presenter.py +186 -0
- eyra-4.3.4/src/runtime/tasks.py +370 -0
- eyra-4.3.4/src/runtime/tooling.py +244 -0
- eyra-4.3.4/src/runtime/triggers.py +344 -0
- eyra-4.3.4/src/runtime/vision.py +80 -0
- eyra-4.3.4/src/runtime/voice_diagnostics.py +529 -0
- eyra-4.3.4/src/runtime/voice_input.py +299 -0
- eyra-4.3.4/src/tools/__init__.py +6 -0
- eyra-4.3.4/src/tools/approval.py +121 -0
- eyra-4.3.4/src/tools/base.py +53 -0
- eyra-4.3.4/src/tools/browser.py +567 -0
- eyra-4.3.4/src/tools/clipboard.py +34 -0
- eyra-4.3.4/src/tools/filesystem.py +1146 -0
- eyra-4.3.4/src/tools/macos_context.py +94 -0
- eyra-4.3.4/src/tools/mcp_stdio.py +224 -0
- eyra-4.3.4/src/tools/operator.py +1692 -0
- eyra-4.3.4/src/tools/pdf.py +115 -0
- eyra-4.3.4/src/tools/registry.py +79 -0
- eyra-4.3.4/src/tools/screenshot.py +68 -0
- eyra-4.3.4/src/tools/system_info.py +106 -0
- eyra-4.3.4/src/tools/time_tool.py +19 -0
- eyra-4.3.4/src/tools/weather.py +53 -0
- eyra-4.3.4/src/utils/__init__.py +0 -0
- eyra-4.3.4/src/utils/image_history.py +55 -0
- eyra-4.3.4/src/utils/mock_client.py +60 -0
- eyra-4.3.4/src/utils/semantic_history.py +16 -0
- eyra-4.3.4/src/utils/settings.py +261 -0
- eyra-4.3.4/src/utils/sound_player.py +51 -0
- eyra-4.3.4/src/utils/theme.py +14 -0
- eyra-4.3.4/src/web/__init__.py +1 -0
- eyra-4.3.4/src/web/server.py +2470 -0
- eyra-4.3.4/tests/__init__.py +0 -0
- eyra-4.3.4/tests/test_browser_tool.py +397 -0
- eyra-4.3.4/tests/test_capabilities.py +131 -0
- eyra-4.3.4/tests/test_certification.py +696 -0
- eyra-4.3.4/tests/test_complexity_scorer.py +121 -0
- eyra-4.3.4/tests/test_connectors.py +814 -0
- eyra-4.3.4/tests/test_context.py +147 -0
- eyra-4.3.4/tests/test_docs_site.py +65 -0
- eyra-4.3.4/tests/test_external_agents.py +212 -0
- eyra-4.3.4/tests/test_filesystem_tool.py +690 -0
- eyra-4.3.4/tests/test_image_history.py +94 -0
- eyra-4.3.4/tests/test_job_system.py +158 -0
- eyra-4.3.4/tests/test_macos_context_tool.py +50 -0
- eyra-4.3.4/tests/test_main.py +357 -0
- eyra-4.3.4/tests/test_mcp_stdio_tool.py +247 -0
- eyra-4.3.4/tests/test_memory_service.py +262 -0
- eyra-4.3.4/tests/test_message_handler.py +219 -0
- eyra-4.3.4/tests/test_model_registry.py +97 -0
- eyra-4.3.4/tests/test_operator_tools.py +712 -0
- eyra-4.3.4/tests/test_package_metadata.py +30 -0
- eyra-4.3.4/tests/test_pdf_tool.py +74 -0
- eyra-4.3.4/tests/test_planner.py +77 -0
- eyra-4.3.4/tests/test_preflight.py +310 -0
- eyra-4.3.4/tests/test_routing_policy.py +234 -0
- eyra-4.3.4/tests/test_runtime.py +1067 -0
- eyra-4.3.4/tests/test_session_state.py +123 -0
- eyra-4.3.4/tests/test_sound_player.py +33 -0
- eyra-4.3.4/tests/test_startup.py +122 -0
- eyra-4.3.4/tests/test_system_info.py +28 -0
- eyra-4.3.4/tests/test_task_commands.py +1028 -0
- eyra-4.3.4/tests/test_task_manager.py +270 -0
- eyra-4.3.4/tests/test_tool_policy.py +284 -0
- eyra-4.3.4/tests/test_tooling.py +96 -0
- eyra-4.3.4/tests/test_tools.py +422 -0
- eyra-4.3.4/tests/test_triggers.py +193 -0
- eyra-4.3.4/tests/test_vision_flow.py +126 -0
- eyra-4.3.4/tests/test_voice_diagnostics.py +378 -0
- eyra-4.3.4/tests/test_voice_input.py +307 -0
- eyra-4.3.4/tests/test_weather_tool.py +25 -0
- eyra-4.3.4/tests/test_web_server.py +1432 -0
- eyra-4.3.4/uv.lock +1391 -0
eyra-4.3.4/.editorconfig
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
end_of_line = lf
|
|
5
|
+
insert_final_newline = true
|
|
6
|
+
trim_trailing_whitespace = true
|
|
7
|
+
charset = utf-8
|
|
8
|
+
|
|
9
|
+
[*.py]
|
|
10
|
+
indent_style = space
|
|
11
|
+
indent_size = 4
|
|
12
|
+
|
|
13
|
+
[*.{yml,yaml,toml}]
|
|
14
|
+
indent_style = space
|
|
15
|
+
indent_size = 2
|
|
16
|
+
|
|
17
|
+
[*.md]
|
|
18
|
+
trim_trailing_whitespace = false
|
eyra-4.3.4/.env.example
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
API_BASE_URL=http://localhost:11434/v1
|
|
2
|
+
API_KEY=ollama
|
|
3
|
+
|
|
4
|
+
# Most people should run `eyra setup` instead of editing this file first.
|
|
5
|
+
# Edit values here when you want a specific model, provider, sandbox, or optional feature.
|
|
6
|
+
|
|
7
|
+
# Local development smoke tests without a running backend.
|
|
8
|
+
USE_MOCK_CLIENT=false
|
|
9
|
+
|
|
10
|
+
# Default model for all requests when complexity routing is off.
|
|
11
|
+
MODEL=gemma4:e4b
|
|
12
|
+
# Vision model for screen/image tasks. Empty means use MODEL.
|
|
13
|
+
VISION_MODEL=
|
|
14
|
+
|
|
15
|
+
# Model recovery.
|
|
16
|
+
AUTO_PULL_MODELS=true
|
|
17
|
+
|
|
18
|
+
# Voice and speech.
|
|
19
|
+
LIVE_LISTENING_ENABLED=true
|
|
20
|
+
LIVE_SPEECH_ENABLED=true
|
|
21
|
+
SPEECH_COOLDOWN_MS=3000
|
|
22
|
+
VOICE_INPUT_DEVICE=
|
|
23
|
+
VOICE_SAMPLE_RATE=16000
|
|
24
|
+
VOICE_DEBUG_RECORD_SECONDS=3
|
|
25
|
+
VOICE_DIAGNOSTIC_SAVE_AUDIO=false
|
|
26
|
+
VOICE_SILENCE_MS=1500
|
|
27
|
+
VOICE_VAD_THRESHOLD=0.15
|
|
28
|
+
VOICE_MAX_DURATION_SECONDS=300
|
|
29
|
+
|
|
30
|
+
# Background task coordinator. Keeps input responsive while long work continues.
|
|
31
|
+
BACKGROUND_TASKS_ENABLED=true
|
|
32
|
+
MAX_BACKGROUND_TASKS=2
|
|
33
|
+
# Optional worker model override. Empty means use MODEL.
|
|
34
|
+
WORKER_MODEL=
|
|
35
|
+
TASK_TIMEOUT_SECONDS=300
|
|
36
|
+
MAX_WORKER_TOOL_STEPS=8
|
|
37
|
+
TOOL_TIMEOUT_SECONDS=30
|
|
38
|
+
MODEL_CONCURRENCY=1
|
|
39
|
+
TASK_STATUS_UPDATES=true
|
|
40
|
+
# Local SQLite store for durable jobs, logs, and operation ledger.
|
|
41
|
+
JOB_STORE_PATH=~/.local/share/eyra/jobs.sqlite3
|
|
42
|
+
# Local SQLite store for user-created trigger definitions and status.
|
|
43
|
+
TRIGGER_STORE_PATH=~/.local/share/eyra/triggers.sqlite3
|
|
44
|
+
# Explicit file triggers are bounded. They do not run unless the user creates one.
|
|
45
|
+
TRIGGER_CHECK_INTERVAL_SECONDS=0.5
|
|
46
|
+
TRIGGER_TIMEOUT_SECONDS=300
|
|
47
|
+
|
|
48
|
+
# Optional network tools. Keep false for the local-first default.
|
|
49
|
+
# When true, weather and browser tools can contact remote sites on demand.
|
|
50
|
+
NETWORK_TOOLS_ENABLED=false
|
|
51
|
+
|
|
52
|
+
# Optional OS/operator tools. Disabled by default.
|
|
53
|
+
OS_TOOLS_ENABLED=false
|
|
54
|
+
# Optional local OCR command for screen text extraction. Must read PNG bytes from stdin.
|
|
55
|
+
SCREEN_OCR_COMMAND=
|
|
56
|
+
|
|
57
|
+
# Optional external agent bridges. Disabled by default.
|
|
58
|
+
AGENT_TOOLS_ENABLED=false
|
|
59
|
+
# Optional configured external-agent adapters. Static argv only, sandboxed cwd.
|
|
60
|
+
EXTERNAL_AGENT_TOOLS_ENABLED=false
|
|
61
|
+
EXTERNAL_AGENT_CONFIG_PATH=~/.config/eyra/agents.json
|
|
62
|
+
|
|
63
|
+
# Optional universal connectors. Disabled by default.
|
|
64
|
+
# Connectors are static manifests for external workers under Eyra policy.
|
|
65
|
+
CONNECTORS_ENABLED=false
|
|
66
|
+
CONNECTORS_CONFIG_PATH=~/.config/eyra/connectors.json
|
|
67
|
+
# Empty means use FILESYSTEM_ALLOWED_PATHS.
|
|
68
|
+
CONNECTORS_ALLOWED_ROOTS=
|
|
69
|
+
CONNECTORS_TIMEOUT_SECONDS=600
|
|
70
|
+
CONNECTORS_OUTPUT_CAP_BYTES=32768
|
|
71
|
+
CONNECTORS_ALLOW_REMOTE=false
|
|
72
|
+
CONNECTORS_ALLOW_PYTHON_MODULE=false
|
|
73
|
+
|
|
74
|
+
# Optional stdio MCP bridge. Disabled by default.
|
|
75
|
+
MCP_TOOLS_ENABLED=false
|
|
76
|
+
MCP_CONFIG_PATH=~/.config/eyra/mcp.json
|
|
77
|
+
|
|
78
|
+
# Compact local memory. Enabled by default and stored on this Mac.
|
|
79
|
+
# Eyra injects only small context summaries into model calls.
|
|
80
|
+
MEMORY_ENABLED=true
|
|
81
|
+
MEMORY_PROVIDER=mcp-prose-memory
|
|
82
|
+
MEMORY_AUTO_SAVE_ENABLED=true
|
|
83
|
+
MEMORY_PATH=~/.mcp-prose-memory/memory.json
|
|
84
|
+
MEMORY_MCP_COMMAND=mcp-prose-memory
|
|
85
|
+
MEMORY_MCP_ARGS=
|
|
86
|
+
MEMORY_CONTEXT_MAX_CHARS=1500
|
|
87
|
+
MEMORY_FACT_MAX_CHARS=220
|
|
88
|
+
MEMORY_SECTION_MAX_FACTS=30
|
|
89
|
+
MEMORY_WRITE_REQUIRE_CONFIRMATION=false
|
|
90
|
+
MEMORY_DEBUG=false
|
|
91
|
+
AGENTS_FILE=~/.config/eyra/AGENTS.md
|
|
92
|
+
AGENTS_MAX_CHARS=1200
|
|
93
|
+
PERSONALITY_FILE=~/.config/eyra/personality.md
|
|
94
|
+
PERSONALITY_MAX_CHARS=800
|
|
95
|
+
|
|
96
|
+
# Optional Web UI. Localhost by default.
|
|
97
|
+
WEB_UI_ENABLED=false
|
|
98
|
+
WEB_UI_HOST=127.0.0.1
|
|
99
|
+
WEB_UI_PORT=8765
|
|
100
|
+
# Empty means Eyra generates a session token at startup.
|
|
101
|
+
WEB_UI_TOKEN=
|
|
102
|
+
# auto = token required for all non-health API endpoints. false is allowed only on localhost.
|
|
103
|
+
WEB_UI_REQUIRE_TOKEN=auto
|
|
104
|
+
# Applies to chat requests, task APIs, and browser audio uploads.
|
|
105
|
+
WEB_UI_MAX_REQUEST_BYTES=1000000
|
|
106
|
+
|
|
107
|
+
# Optional online Realtime voice. Disabled by default.
|
|
108
|
+
REALTIME_VOICE_ENABLED=false
|
|
109
|
+
REALTIME_MODEL=gpt-realtime
|
|
110
|
+
REALTIME_VOICE=marin
|
|
111
|
+
# Realtime requires an OpenAI API key and never reuses generic API_KEY.
|
|
112
|
+
OPENAI_API_KEY=
|
|
113
|
+
# Realtime tools are off by default because tool outputs may leave the machine.
|
|
114
|
+
REALTIME_TOOLS_ENABLED=false
|
|
115
|
+
REALTIME_ALLOWED_TOOLS=
|
|
116
|
+
|
|
117
|
+
# Filesystem tool: comma-separated allowed root paths (~ is expanded).
|
|
118
|
+
# Default: ~/Documents,~/Desktop,~/Downloads,/tmp. The model can access only these directories.
|
|
119
|
+
# Add paths only when the workflow needs them: ~/Documents,~/Desktop,~/Downloads,/tmp,/Volumes/Data
|
|
120
|
+
FILESYSTEM_ALLOWED_PATHS=~/Documents,~/Desktop,~/Downloads,/tmp
|
|
121
|
+
|
|
122
|
+
# Filesystem tool: default working directory for relative paths (~ is expanded).
|
|
123
|
+
# Relative paths resolve here, then pass through FILESYSTEM_ALLOWED_PATHS.
|
|
124
|
+
# FILESYSTEM_DEFAULT_PATH=~/Documents
|
|
125
|
+
|
|
126
|
+
# Optional model-tier routing.
|
|
127
|
+
# When enabled, Eyra selects model tiers by prompt complexity. This is not a safety boundary:
|
|
128
|
+
# tool policy, sandboxing, approvals, and opt-in settings still decide what can run.
|
|
129
|
+
# COMPLEXITY_ROUTING_ENABLED=true
|
|
130
|
+
# SIMPLE_MODEL=qwen3.5:2b
|
|
131
|
+
# MODERATE_MODEL=gemma4:e4b
|
|
132
|
+
|
|
133
|
+
# Local policy routing is always on. It is deterministic and local; it does not
|
|
134
|
+
# call a model, embeddings, telemetry, analytics, or a network router.
|
|
135
|
+
ROUTING_DEBUG=false
|
|
136
|
+
|
|
137
|
+
# Optional hands-free mode marker. Spoken control phrases work in normal mode too;
|
|
138
|
+
# this flag makes the intended no-hands runtime state visible in status/capabilities.
|
|
139
|
+
HANDS_FREE_MODE=false
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @gabrimatic
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
buy_me_a_coffee: gabrimatic
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a bug or unexpected behavior
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: summary
|
|
7
|
+
attributes:
|
|
8
|
+
label: Summary
|
|
9
|
+
description: One sentence describing what broke.
|
|
10
|
+
placeholder: "Voice input does not produce a spoken response after transcription."
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: steps
|
|
16
|
+
attributes:
|
|
17
|
+
label: Steps to reproduce
|
|
18
|
+
description: Shortest path to reproduce the issue.
|
|
19
|
+
placeholder: |
|
|
20
|
+
1. Run python src/main.py
|
|
21
|
+
2. Speak a prompt
|
|
22
|
+
3. Observe no audio response
|
|
23
|
+
|
|
24
|
+
validations:
|
|
25
|
+
required: true
|
|
26
|
+
|
|
27
|
+
- type: textarea
|
|
28
|
+
id: expected
|
|
29
|
+
attributes:
|
|
30
|
+
label: Expected behavior
|
|
31
|
+
description: What correct behavior looks like.
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
|
|
35
|
+
- type: textarea
|
|
36
|
+
id: actual
|
|
37
|
+
attributes:
|
|
38
|
+
label: Actual behavior
|
|
39
|
+
description: What happened, including any error text.
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
|
|
43
|
+
- type: input
|
|
44
|
+
id: eyra_version
|
|
45
|
+
attributes:
|
|
46
|
+
label: Eyra version and install method
|
|
47
|
+
placeholder: "4.1.0, git clone from tag v4.1.0"
|
|
48
|
+
validations:
|
|
49
|
+
required: true
|
|
50
|
+
|
|
51
|
+
- type: input
|
|
52
|
+
id: python_version
|
|
53
|
+
attributes:
|
|
54
|
+
label: Python version
|
|
55
|
+
placeholder: "3.11.9"
|
|
56
|
+
validations:
|
|
57
|
+
required: true
|
|
58
|
+
|
|
59
|
+
- type: input
|
|
60
|
+
id: os
|
|
61
|
+
attributes:
|
|
62
|
+
label: macOS version and Apple Silicon model
|
|
63
|
+
placeholder: "macOS 15.3, MacBook Pro M4"
|
|
64
|
+
validations:
|
|
65
|
+
required: true
|
|
66
|
+
|
|
67
|
+
- type: input
|
|
68
|
+
id: models
|
|
69
|
+
attributes:
|
|
70
|
+
label: MODEL and VISION_MODEL
|
|
71
|
+
placeholder: "MODEL=gemma4:e4b, VISION_MODEL=(empty)"
|
|
72
|
+
validations:
|
|
73
|
+
required: true
|
|
74
|
+
|
|
75
|
+
- type: dropdown
|
|
76
|
+
id: input_method
|
|
77
|
+
attributes:
|
|
78
|
+
label: Input method
|
|
79
|
+
options:
|
|
80
|
+
- Voice
|
|
81
|
+
- Typed
|
|
82
|
+
- Both
|
|
83
|
+
validations:
|
|
84
|
+
required: true
|
|
85
|
+
|
|
86
|
+
- type: dropdown
|
|
87
|
+
id: backend
|
|
88
|
+
attributes:
|
|
89
|
+
label: AI backend
|
|
90
|
+
options:
|
|
91
|
+
- Ollama (local)
|
|
92
|
+
- LM Studio (local)
|
|
93
|
+
- OpenRouter
|
|
94
|
+
- Groq
|
|
95
|
+
- OpenAI
|
|
96
|
+
- Custom OpenAI-compatible
|
|
97
|
+
- Mock client
|
|
98
|
+
validations:
|
|
99
|
+
required: true
|
|
100
|
+
|
|
101
|
+
- type: checkboxes
|
|
102
|
+
id: enabled_surfaces
|
|
103
|
+
attributes:
|
|
104
|
+
label: Enabled optional surfaces
|
|
105
|
+
options:
|
|
106
|
+
- label: Web UI
|
|
107
|
+
- label: Network/browser tools
|
|
108
|
+
- label: OS/UI tools
|
|
109
|
+
- label: MCP tools
|
|
110
|
+
- label: Agent/coding tools
|
|
111
|
+
- label: Realtime voice
|
|
112
|
+
validations:
|
|
113
|
+
required: false
|
|
114
|
+
|
|
115
|
+
- type: textarea
|
|
116
|
+
id: status_output
|
|
117
|
+
attributes:
|
|
118
|
+
label: /status output
|
|
119
|
+
description: Paste `/status` output. Redact personal paths or secrets if needed.
|
|
120
|
+
render: shell
|
|
121
|
+
validations:
|
|
122
|
+
required: false
|
|
123
|
+
|
|
124
|
+
- type: textarea
|
|
125
|
+
id: capabilities_route
|
|
126
|
+
attributes:
|
|
127
|
+
label: /capabilities and /route last
|
|
128
|
+
description: Paste `/capabilities` and `/route last` output when the issue involves routing, tools, privacy, Web UI, Realtime, MCP, or external agents. Redact paths, URLs with tokens, and secrets.
|
|
129
|
+
render: shell
|
|
130
|
+
validations:
|
|
131
|
+
required: false
|
|
132
|
+
|
|
133
|
+
- type: textarea
|
|
134
|
+
id: certification
|
|
135
|
+
attributes:
|
|
136
|
+
label: Certification output
|
|
137
|
+
description: Paste relevant `uv run python scripts/certify_voice_to_computer.py` output if you ran it.
|
|
138
|
+
render: shell
|
|
139
|
+
validations:
|
|
140
|
+
required: false
|
|
141
|
+
|
|
142
|
+
- type: textarea
|
|
143
|
+
id: web_agent_context
|
|
144
|
+
attributes:
|
|
145
|
+
label: Web, Realtime, MCP, or external-agent context
|
|
146
|
+
description: Include Web URL mode (localhost/phone), redacted `/api/health` or `/api/capabilities`, task/job id, approval id/type, enabled tools, external agents configured, and job logs/artifacts with secrets redacted.
|
|
147
|
+
render: shell
|
|
148
|
+
validations:
|
|
149
|
+
required: false
|
|
150
|
+
|
|
151
|
+
- type: textarea
|
|
152
|
+
id: voice_diagnose
|
|
153
|
+
attributes:
|
|
154
|
+
label: /voice-diagnose output for voice issues
|
|
155
|
+
description: Required for voice-related issues. Redact personal device names if needed.
|
|
156
|
+
render: shell
|
|
157
|
+
validations:
|
|
158
|
+
required: false
|
|
159
|
+
|
|
160
|
+
- type: textarea
|
|
161
|
+
id: logs
|
|
162
|
+
attributes:
|
|
163
|
+
label: Terminal output
|
|
164
|
+
description: Paste relevant terminal output. Redact secrets, API keys, personal paths, and tokenized Web UI URLs.
|
|
165
|
+
render: shell
|
|
166
|
+
validations:
|
|
167
|
+
required: false
|
|
168
|
+
|
|
169
|
+
- type: textarea
|
|
170
|
+
id: additional
|
|
171
|
+
attributes:
|
|
172
|
+
label: Additional context
|
|
173
|
+
description: Any detail that would help reproduce or narrow the issue.
|
|
174
|
+
validations:
|
|
175
|
+
required: false
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest a feature or improvement
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: summary
|
|
7
|
+
attributes:
|
|
8
|
+
label: Summary
|
|
9
|
+
description: One line describing the capability you want.
|
|
10
|
+
placeholder: "Support for additional local model backends beyond Ollama."
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: problem
|
|
16
|
+
attributes:
|
|
17
|
+
label: Problem to solve
|
|
18
|
+
description: What limitation does this address?
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: solution
|
|
24
|
+
attributes:
|
|
25
|
+
label: Proposed solution
|
|
26
|
+
description: How should it work? Be specific about behavior or API.
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
|
|
30
|
+
- type: textarea
|
|
31
|
+
id: safety
|
|
32
|
+
attributes:
|
|
33
|
+
label: Safety and privacy model
|
|
34
|
+
description: What should stay local, what may leave the machine, what needs approval, and how should cancellation or undo work?
|
|
35
|
+
validations:
|
|
36
|
+
required: false
|
|
37
|
+
|
|
38
|
+
- type: textarea
|
|
39
|
+
id: certification
|
|
40
|
+
attributes:
|
|
41
|
+
label: Acceptance and certification
|
|
42
|
+
description: What tests, docs, route policy, or certification rows would prove the feature works?
|
|
43
|
+
validations:
|
|
44
|
+
required: false
|
|
45
|
+
|
|
46
|
+
- type: textarea
|
|
47
|
+
id: alternatives
|
|
48
|
+
attributes:
|
|
49
|
+
label: Alternatives considered
|
|
50
|
+
description: Other approaches you thought about and why they fall short.
|
|
51
|
+
validations:
|
|
52
|
+
required: false
|
|
53
|
+
|
|
54
|
+
- type: textarea
|
|
55
|
+
id: additional
|
|
56
|
+
attributes:
|
|
57
|
+
label: Additional context
|
|
58
|
+
description: Screenshots, examples, prior art, or other useful context.
|
|
59
|
+
validations:
|
|
60
|
+
required: false
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
- **What changed:**
|
|
4
|
+
- **Why:**
|
|
5
|
+
|
|
6
|
+
## Change type
|
|
7
|
+
|
|
8
|
+
- [ ] Bug fix
|
|
9
|
+
- [ ] New feature
|
|
10
|
+
- [ ] Refactor
|
|
11
|
+
- [ ] Documentation
|
|
12
|
+
- [ ] New backend or tool
|
|
13
|
+
|
|
14
|
+
## Test plan
|
|
15
|
+
|
|
16
|
+
1.
|
|
17
|
+
2.
|
|
18
|
+
3.
|
|
19
|
+
|
|
20
|
+
## Visible changes
|
|
21
|
+
|
|
22
|
+
_List any changes to behavior, config, or CLI. Write `None` if internal only._
|
|
23
|
+
|
|
24
|
+
## Checklist
|
|
25
|
+
|
|
26
|
+
- [ ] Tested end-to-end (voice input and/or typed input)
|
|
27
|
+
- [ ] README updated (if behavior changed)
|
|
28
|
+
- [ ] No breaking `.env` changes (or migration notes below)
|
|
29
|
+
- [ ] New backend follows `BaseAIClient` contract
|
|
30
|
+
|
|
31
|
+
## Migration notes
|
|
32
|
+
|
|
33
|
+
_If this PR changes config format, CLI behavior, or default models, describe the upgrade path. Otherwise delete this section._
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths-ignore:
|
|
7
|
+
- "doc/**"
|
|
8
|
+
- "internal-docs/**"
|
|
9
|
+
- "README.md"
|
|
10
|
+
- ".github/workflows/docs-pages.yml"
|
|
11
|
+
- "tests/test_docs_site.py"
|
|
12
|
+
pull_request:
|
|
13
|
+
branches: [main]
|
|
14
|
+
paths-ignore:
|
|
15
|
+
- "doc/**"
|
|
16
|
+
- "internal-docs/**"
|
|
17
|
+
- "README.md"
|
|
18
|
+
- ".github/workflows/docs-pages.yml"
|
|
19
|
+
- "tests/test_docs_site.py"
|
|
20
|
+
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
|
|
24
|
+
concurrency:
|
|
25
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
26
|
+
cancel-in-progress: true
|
|
27
|
+
|
|
28
|
+
jobs:
|
|
29
|
+
verify:
|
|
30
|
+
name: Verify
|
|
31
|
+
runs-on: ubuntu-24.04
|
|
32
|
+
timeout-minutes: 25
|
|
33
|
+
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@v6
|
|
36
|
+
|
|
37
|
+
- name: Set up Python
|
|
38
|
+
uses: actions/setup-python@v6
|
|
39
|
+
with:
|
|
40
|
+
python-version: "3.11"
|
|
41
|
+
|
|
42
|
+
- name: Set up uv
|
|
43
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
44
|
+
with:
|
|
45
|
+
enable-cache: true
|
|
46
|
+
cache-dependency-glob: uv.lock
|
|
47
|
+
|
|
48
|
+
- name: Install Ubuntu runtime packages
|
|
49
|
+
run: |
|
|
50
|
+
sudo apt-get update
|
|
51
|
+
sudo apt-get install -y --no-install-recommends libportaudio2
|
|
52
|
+
|
|
53
|
+
- name: Install dependencies
|
|
54
|
+
run: uv sync --locked
|
|
55
|
+
|
|
56
|
+
- name: Check lockfile
|
|
57
|
+
run: uv lock --check
|
|
58
|
+
|
|
59
|
+
- name: Lint
|
|
60
|
+
run: uv run --frozen ruff check src tests
|
|
61
|
+
|
|
62
|
+
- name: Install browser test runtime
|
|
63
|
+
run: uv run --frozen python -m playwright install --with-deps chromium
|
|
64
|
+
|
|
65
|
+
- name: Test
|
|
66
|
+
run: uv run --frozen python -m pytest -q
|
|
67
|
+
|
|
68
|
+
- name: Build wheel
|
|
69
|
+
run: uv build --wheel
|
|
70
|
+
|
|
71
|
+
- name: Check shell scripts
|
|
72
|
+
run: bash -n setup.sh install.sh
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
name: Docs Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- "doc/**"
|
|
8
|
+
- "install.sh"
|
|
9
|
+
- "README.md"
|
|
10
|
+
- ".github/workflows/docs-pages.yml"
|
|
11
|
+
- "tests/test_docs_site.py"
|
|
12
|
+
pull_request:
|
|
13
|
+
branches: [main]
|
|
14
|
+
paths:
|
|
15
|
+
- "doc/**"
|
|
16
|
+
- "install.sh"
|
|
17
|
+
- "README.md"
|
|
18
|
+
- ".github/workflows/docs-pages.yml"
|
|
19
|
+
- "tests/test_docs_site.py"
|
|
20
|
+
workflow_dispatch:
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
pages: write
|
|
25
|
+
id-token: write
|
|
26
|
+
|
|
27
|
+
concurrency:
|
|
28
|
+
group: docs-pages-${{ github.ref }}
|
|
29
|
+
cancel-in-progress: true
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
check:
|
|
33
|
+
name: Check docs
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
timeout-minutes: 15
|
|
36
|
+
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v6
|
|
39
|
+
|
|
40
|
+
- name: Set up Node
|
|
41
|
+
uses: actions/setup-node@v6
|
|
42
|
+
with:
|
|
43
|
+
node-version: "24"
|
|
44
|
+
|
|
45
|
+
- name: Run docs contract tests
|
|
46
|
+
run: |
|
|
47
|
+
python -m pip install --disable-pip-version-check --quiet pytest
|
|
48
|
+
python -m pytest -q tests/test_docs_site.py
|
|
49
|
+
|
|
50
|
+
- name: Validate docs
|
|
51
|
+
env:
|
|
52
|
+
MINTLIFY_TELEMETRY_DISABLED: "1"
|
|
53
|
+
working-directory: doc
|
|
54
|
+
run: npx -y mint@4.2.565 validate --disable-openapi
|
|
55
|
+
|
|
56
|
+
- name: Check links
|
|
57
|
+
env:
|
|
58
|
+
MINTLIFY_TELEMETRY_DISABLED: "1"
|
|
59
|
+
working-directory: doc
|
|
60
|
+
run: npx -y mint@4.2.565 broken-links
|
|
61
|
+
|
|
62
|
+
- name: Export static docs
|
|
63
|
+
env:
|
|
64
|
+
MINTLIFY_TELEMETRY_DISABLED: "1"
|
|
65
|
+
working-directory: doc
|
|
66
|
+
run: npx -y mint@4.2.565 export --disable-openapi --output ../docs-export.zip
|
|
67
|
+
|
|
68
|
+
- name: Prepare GitHub Pages artifact
|
|
69
|
+
run: |
|
|
70
|
+
rm -rf _site
|
|
71
|
+
mkdir -p _site
|
|
72
|
+
unzip -q docs-export.zip -d _site
|
|
73
|
+
cp install.sh _site/install.sh
|
|
74
|
+
node doc/scripts/prepare-github-pages.mjs _site /eyra
|
|
75
|
+
|
|
76
|
+
- name: Upload Pages artifact
|
|
77
|
+
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && vars.EYRA_DEPLOY_PAGES == 'true'
|
|
78
|
+
uses: actions/upload-pages-artifact@v5
|
|
79
|
+
with:
|
|
80
|
+
path: _site
|
|
81
|
+
|
|
82
|
+
deploy:
|
|
83
|
+
name: Deploy docs
|
|
84
|
+
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && vars.EYRA_DEPLOY_PAGES == 'true'
|
|
85
|
+
needs: check
|
|
86
|
+
runs-on: ubuntu-latest
|
|
87
|
+
timeout-minutes: 10
|
|
88
|
+
environment:
|
|
89
|
+
name: github-pages
|
|
90
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
91
|
+
|
|
92
|
+
steps:
|
|
93
|
+
- name: Configure Pages
|
|
94
|
+
uses: actions/configure-pages@v6
|
|
95
|
+
|
|
96
|
+
- name: Deploy to GitHub Pages
|
|
97
|
+
id: deployment
|
|
98
|
+
uses: actions/deploy-pages@v5
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Publish PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
release:
|
|
6
|
+
types: [published]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
name: Publish to PyPI
|
|
14
|
+
runs-on: ubuntu-24.04
|
|
15
|
+
environment: pypi
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v6
|
|
22
|
+
|
|
23
|
+
- name: Set up Python
|
|
24
|
+
uses: actions/setup-python@v6
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.11"
|
|
27
|
+
|
|
28
|
+
- name: Set up uv
|
|
29
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
30
|
+
|
|
31
|
+
- name: Build distributions
|
|
32
|
+
run: uv build --sdist --wheel
|
|
33
|
+
|
|
34
|
+
- name: Publish package distributions to PyPI
|
|
35
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
eyra-4.3.4/.gitignore
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Environment
|
|
2
|
+
.env
|
|
3
|
+
.venv/
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.pyc
|
|
8
|
+
*.pyo
|
|
9
|
+
*.egg-info/
|
|
10
|
+
dist/
|
|
11
|
+
build/
|
|
12
|
+
|
|
13
|
+
# Runtime artifacts
|
|
14
|
+
*.wav
|
|
15
|
+
*.log
|
|
16
|
+
models_cache/
|
|
17
|
+
screenshot.png
|
|
18
|
+
|
|
19
|
+
# macOS
|
|
20
|
+
.DS_Store
|
|
21
|
+
|
|
22
|
+
# Editors
|
|
23
|
+
.vscode/
|
|
24
|
+
*.swp
|
|
25
|
+
|
|
26
|
+
# Node (if any)
|
|
27
|
+
node_modules/
|
|
28
|
+
|
|
29
|
+
# Tool caches
|
|
30
|
+
.pytest_cache/
|
|
31
|
+
.ruff_cache/
|
|
32
|
+
|
|
33
|
+
# Review artifacts
|
|
34
|
+
.review/
|
|
35
|
+
.reviews/
|
|
36
|
+
|
|
37
|
+
# AI instructions (local only)
|
|
38
|
+
CLAUDE.md
|
|
39
|
+
AGENTS.md
|
|
40
|
+
INSTRUCTIONS.md
|
|
41
|
+
|
|
42
|
+
# Test fixtures
|
|
43
|
+
test.jpg
|
|
44
|
+
.scratchpad/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|