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.
Files changed (208) hide show
  1. eyra-4.3.4/.editorconfig +18 -0
  2. eyra-4.3.4/.env.example +139 -0
  3. eyra-4.3.4/.github/CODEOWNERS +1 -0
  4. eyra-4.3.4/.github/FUNDING.yml +1 -0
  5. eyra-4.3.4/.github/ISSUE_TEMPLATE/bug_report.yml +175 -0
  6. eyra-4.3.4/.github/ISSUE_TEMPLATE/config.yml +5 -0
  7. eyra-4.3.4/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
  8. eyra-4.3.4/.github/PULL_REQUEST_TEMPLATE.md +33 -0
  9. eyra-4.3.4/.github/dependabot.yml +11 -0
  10. eyra-4.3.4/.github/workflows/ci.yml +72 -0
  11. eyra-4.3.4/.github/workflows/docs-pages.yml +98 -0
  12. eyra-4.3.4/.github/workflows/publish-pypi.yml +35 -0
  13. eyra-4.3.4/.gitignore +44 -0
  14. eyra-4.3.4/.python-version +1 -0
  15. eyra-4.3.4/CHANGELOG.md +488 -0
  16. eyra-4.3.4/CODE_OF_CONDUCT.md +29 -0
  17. eyra-4.3.4/CONTRIBUTING.md +171 -0
  18. eyra-4.3.4/LICENSE +113 -0
  19. eyra-4.3.4/PKG-INFO +299 -0
  20. eyra-4.3.4/README.md +262 -0
  21. eyra-4.3.4/SECURITY.md +68 -0
  22. eyra-4.3.4/apps/EyraMenuBar/Package.swift +29 -0
  23. eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/AppState.swift +147 -0
  24. eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/EyraCLI.swift +64 -0
  25. eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/EyraMenuBarApp.swift +22 -0
  26. eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBar/MenuViews.swift +188 -0
  27. eyra-4.3.4/apps/EyraMenuBar/Sources/EyraMenuBarCore/StatusModel.swift +67 -0
  28. eyra-4.3.4/apps/EyraMenuBar/Tests/EyraMenuBarTests/StatusModelTests.swift +58 -0
  29. eyra-4.3.4/doc/.mintignore +16 -0
  30. eyra-4.3.4/doc/architecture/overview.mdx +55 -0
  31. eyra-4.3.4/doc/architecture/privacy.mdx +56 -0
  32. eyra-4.3.4/doc/architecture/routing.mdx +84 -0
  33. eyra-4.3.4/doc/architecture/runtime.mdx +45 -0
  34. eyra-4.3.4/doc/architecture/tools.mdx +62 -0
  35. eyra-4.3.4/doc/architecture/voice.mdx +38 -0
  36. eyra-4.3.4/doc/architecture/web-runtime.mdx +49 -0
  37. eyra-4.3.4/doc/development/extending-eyra.mdx +75 -0
  38. eyra-4.3.4/doc/development/local-development.mdx +69 -0
  39. eyra-4.3.4/doc/development/release-readiness.mdx +82 -0
  40. eyra-4.3.4/doc/development/source-map.mdx +80 -0
  41. eyra-4.3.4/doc/development/testing.mdx +78 -0
  42. eyra-4.3.4/doc/docs.json +101 -0
  43. eyra-4.3.4/doc/favicon.svg +6 -0
  44. eyra-4.3.4/doc/get-started/configuration.mdx +163 -0
  45. eyra-4.3.4/doc/get-started/first-session.mdx +92 -0
  46. eyra-4.3.4/doc/get-started/installation.mdx +216 -0
  47. eyra-4.3.4/doc/get-started/menu-bar.mdx +114 -0
  48. eyra-4.3.4/doc/get-started/troubleshooting.mdx +218 -0
  49. eyra-4.3.4/doc/guides/background-tasks.mdx +75 -0
  50. eyra-4.3.4/doc/guides/connectors.mdx +144 -0
  51. eyra-4.3.4/doc/guides/external-agents-and-mcp.mdx +66 -0
  52. eyra-4.3.4/doc/guides/local-file-work.mdx +74 -0
  53. eyra-4.3.4/doc/guides/memory-and-instructions.mdx +136 -0
  54. eyra-4.3.4/doc/guides/realtime-voice.mdx +51 -0
  55. eyra-4.3.4/doc/guides/triggers-and-reminders.mdx +45 -0
  56. eyra-4.3.4/doc/guides/voice-and-hands-free.mdx +118 -0
  57. eyra-4.3.4/doc/guides/web-ui.mdx +59 -0
  58. eyra-4.3.4/doc/index.mdx +78 -0
  59. eyra-4.3.4/doc/logo-dark.svg +7 -0
  60. eyra-4.3.4/doc/logo-light.svg +7 -0
  61. eyra-4.3.4/doc/project/changelog.mdx +47 -0
  62. eyra-4.3.4/doc/project/contributing.mdx +58 -0
  63. eyra-4.3.4/doc/project/strategy.mdx +44 -0
  64. eyra-4.3.4/doc/reference/agent-docs.mdx +83 -0
  65. eyra-4.3.4/doc/reference/certification.mdx +106 -0
  66. eyra-4.3.4/doc/reference/commands.mdx +164 -0
  67. eyra-4.3.4/doc/reference/settings.mdx +142 -0
  68. eyra-4.3.4/doc/reference/tools.mdx +88 -0
  69. eyra-4.3.4/doc/reference/web-endpoints.mdx +75 -0
  70. eyra-4.3.4/doc/scripts/prepare-github-pages.mjs +113 -0
  71. eyra-4.3.4/doc/security/privacy-model.mdx +58 -0
  72. eyra-4.3.4/doc/security/security-policy.mdx +41 -0
  73. eyra-4.3.4/install.sh +532 -0
  74. eyra-4.3.4/internal-docs/PRODUCT_STRATEGY.md +192 -0
  75. eyra-4.3.4/pyproject.toml +95 -0
  76. eyra-4.3.4/scripts/build_menu_bar_app.sh +89 -0
  77. eyra-4.3.4/scripts/certify_voice_to_computer.py +87 -0
  78. eyra-4.3.4/setup.sh +270 -0
  79. eyra-4.3.4/src/chat/__init__.py +0 -0
  80. eyra-4.3.4/src/chat/capture.py +153 -0
  81. eyra-4.3.4/src/chat/complexity_scorer.py +330 -0
  82. eyra-4.3.4/src/chat/message_handler.py +270 -0
  83. eyra-4.3.4/src/chat/session_state.py +14 -0
  84. eyra-4.3.4/src/clients/__init__.py +0 -0
  85. eyra-4.3.4/src/clients/ai_client.py +508 -0
  86. eyra-4.3.4/src/clients/base_client.py +131 -0
  87. eyra-4.3.4/src/main.py +128 -0
  88. eyra-4.3.4/src/runtime/__init__.py +0 -0
  89. eyra-4.3.4/src/runtime/actions.py +185 -0
  90. eyra-4.3.4/src/runtime/capabilities.py +206 -0
  91. eyra-4.3.4/src/runtime/certification.py +2690 -0
  92. eyra-4.3.4/src/runtime/cli.py +1207 -0
  93. eyra-4.3.4/src/runtime/coding_jobs.py +28 -0
  94. eyra-4.3.4/src/runtime/connectors/__init__.py +0 -0
  95. eyra-4.3.4/src/runtime/connectors/certification.py +136 -0
  96. eyra-4.3.4/src/runtime/connectors/cli.py +52 -0
  97. eyra-4.3.4/src/runtime/connectors/manifest.py +305 -0
  98. eyra-4.3.4/src/runtime/connectors/registry.py +218 -0
  99. eyra-4.3.4/src/runtime/connectors/runner.py +368 -0
  100. eyra-4.3.4/src/runtime/connectors/types.py +179 -0
  101. eyra-4.3.4/src/runtime/context.py +85 -0
  102. eyra-4.3.4/src/runtime/dictation.py +97 -0
  103. eyra-4.3.4/src/runtime/examples.py +47 -0
  104. eyra-4.3.4/src/runtime/external_agents.py +355 -0
  105. eyra-4.3.4/src/runtime/history/__init__.py +38 -0
  106. eyra-4.3.4/src/runtime/history/protocol.py +35 -0
  107. eyra-4.3.4/src/runtime/history/redaction.py +140 -0
  108. eyra-4.3.4/src/runtime/history/store.py +155 -0
  109. eyra-4.3.4/src/runtime/history/types.py +123 -0
  110. eyra-4.3.4/src/runtime/intents.py +90 -0
  111. eyra-4.3.4/src/runtime/jobs.py +523 -0
  112. eyra-4.3.4/src/runtime/live_session.py +2589 -0
  113. eyra-4.3.4/src/runtime/memory/__init__.py +11 -0
  114. eyra-4.3.4/src/runtime/memory/compression.py +48 -0
  115. eyra-4.3.4/src/runtime/memory/files.py +95 -0
  116. eyra-4.3.4/src/runtime/memory/mcp_client.py +181 -0
  117. eyra-4.3.4/src/runtime/memory/policy.py +35 -0
  118. eyra-4.3.4/src/runtime/memory/service.py +241 -0
  119. eyra-4.3.4/src/runtime/models.py +99 -0
  120. eyra-4.3.4/src/runtime/operator_loop.py +55 -0
  121. eyra-4.3.4/src/runtime/planner.py +193 -0
  122. eyra-4.3.4/src/runtime/preflight.py +433 -0
  123. eyra-4.3.4/src/runtime/privacy.py +108 -0
  124. eyra-4.3.4/src/runtime/routing/__init__.py +6 -0
  125. eyra-4.3.4/src/runtime/routing/effort.py +21 -0
  126. eyra-4.3.4/src/runtime/routing/fallback.py +61 -0
  127. eyra-4.3.4/src/runtime/routing/model_registry.py +158 -0
  128. eyra-4.3.4/src/runtime/routing/router.py +352 -0
  129. eyra-4.3.4/src/runtime/routing/tool_policy.py +350 -0
  130. eyra-4.3.4/src/runtime/routing/trace.py +80 -0
  131. eyra-4.3.4/src/runtime/routing/types.py +180 -0
  132. eyra-4.3.4/src/runtime/service.py +184 -0
  133. eyra-4.3.4/src/runtime/settings_catalog.py +131 -0
  134. eyra-4.3.4/src/runtime/shared.py +130 -0
  135. eyra-4.3.4/src/runtime/speech_controller.py +201 -0
  136. eyra-4.3.4/src/runtime/startup.py +550 -0
  137. eyra-4.3.4/src/runtime/status_presenter.py +186 -0
  138. eyra-4.3.4/src/runtime/tasks.py +370 -0
  139. eyra-4.3.4/src/runtime/tooling.py +244 -0
  140. eyra-4.3.4/src/runtime/triggers.py +344 -0
  141. eyra-4.3.4/src/runtime/vision.py +80 -0
  142. eyra-4.3.4/src/runtime/voice_diagnostics.py +529 -0
  143. eyra-4.3.4/src/runtime/voice_input.py +299 -0
  144. eyra-4.3.4/src/tools/__init__.py +6 -0
  145. eyra-4.3.4/src/tools/approval.py +121 -0
  146. eyra-4.3.4/src/tools/base.py +53 -0
  147. eyra-4.3.4/src/tools/browser.py +567 -0
  148. eyra-4.3.4/src/tools/clipboard.py +34 -0
  149. eyra-4.3.4/src/tools/filesystem.py +1146 -0
  150. eyra-4.3.4/src/tools/macos_context.py +94 -0
  151. eyra-4.3.4/src/tools/mcp_stdio.py +224 -0
  152. eyra-4.3.4/src/tools/operator.py +1692 -0
  153. eyra-4.3.4/src/tools/pdf.py +115 -0
  154. eyra-4.3.4/src/tools/registry.py +79 -0
  155. eyra-4.3.4/src/tools/screenshot.py +68 -0
  156. eyra-4.3.4/src/tools/system_info.py +106 -0
  157. eyra-4.3.4/src/tools/time_tool.py +19 -0
  158. eyra-4.3.4/src/tools/weather.py +53 -0
  159. eyra-4.3.4/src/utils/__init__.py +0 -0
  160. eyra-4.3.4/src/utils/image_history.py +55 -0
  161. eyra-4.3.4/src/utils/mock_client.py +60 -0
  162. eyra-4.3.4/src/utils/semantic_history.py +16 -0
  163. eyra-4.3.4/src/utils/settings.py +261 -0
  164. eyra-4.3.4/src/utils/sound_player.py +51 -0
  165. eyra-4.3.4/src/utils/theme.py +14 -0
  166. eyra-4.3.4/src/web/__init__.py +1 -0
  167. eyra-4.3.4/src/web/server.py +2470 -0
  168. eyra-4.3.4/tests/__init__.py +0 -0
  169. eyra-4.3.4/tests/test_browser_tool.py +397 -0
  170. eyra-4.3.4/tests/test_capabilities.py +131 -0
  171. eyra-4.3.4/tests/test_certification.py +696 -0
  172. eyra-4.3.4/tests/test_complexity_scorer.py +121 -0
  173. eyra-4.3.4/tests/test_connectors.py +814 -0
  174. eyra-4.3.4/tests/test_context.py +147 -0
  175. eyra-4.3.4/tests/test_docs_site.py +65 -0
  176. eyra-4.3.4/tests/test_external_agents.py +212 -0
  177. eyra-4.3.4/tests/test_filesystem_tool.py +690 -0
  178. eyra-4.3.4/tests/test_image_history.py +94 -0
  179. eyra-4.3.4/tests/test_job_system.py +158 -0
  180. eyra-4.3.4/tests/test_macos_context_tool.py +50 -0
  181. eyra-4.3.4/tests/test_main.py +357 -0
  182. eyra-4.3.4/tests/test_mcp_stdio_tool.py +247 -0
  183. eyra-4.3.4/tests/test_memory_service.py +262 -0
  184. eyra-4.3.4/tests/test_message_handler.py +219 -0
  185. eyra-4.3.4/tests/test_model_registry.py +97 -0
  186. eyra-4.3.4/tests/test_operator_tools.py +712 -0
  187. eyra-4.3.4/tests/test_package_metadata.py +30 -0
  188. eyra-4.3.4/tests/test_pdf_tool.py +74 -0
  189. eyra-4.3.4/tests/test_planner.py +77 -0
  190. eyra-4.3.4/tests/test_preflight.py +310 -0
  191. eyra-4.3.4/tests/test_routing_policy.py +234 -0
  192. eyra-4.3.4/tests/test_runtime.py +1067 -0
  193. eyra-4.3.4/tests/test_session_state.py +123 -0
  194. eyra-4.3.4/tests/test_sound_player.py +33 -0
  195. eyra-4.3.4/tests/test_startup.py +122 -0
  196. eyra-4.3.4/tests/test_system_info.py +28 -0
  197. eyra-4.3.4/tests/test_task_commands.py +1028 -0
  198. eyra-4.3.4/tests/test_task_manager.py +270 -0
  199. eyra-4.3.4/tests/test_tool_policy.py +284 -0
  200. eyra-4.3.4/tests/test_tooling.py +96 -0
  201. eyra-4.3.4/tests/test_tools.py +422 -0
  202. eyra-4.3.4/tests/test_triggers.py +193 -0
  203. eyra-4.3.4/tests/test_vision_flow.py +126 -0
  204. eyra-4.3.4/tests/test_voice_diagnostics.py +378 -0
  205. eyra-4.3.4/tests/test_voice_input.py +307 -0
  206. eyra-4.3.4/tests/test_weather_tool.py +25 -0
  207. eyra-4.3.4/tests/test_web_server.py +1432 -0
  208. eyra-4.3.4/uv.lock +1391 -0
@@ -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
@@ -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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Discussions
4
+ url: https://github.com/gabrimatic/eyra/discussions
5
+ about: "Questions, ideas, and general Eyra discussion."
@@ -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,11 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "uv"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+
8
+ - package-ecosystem: "github-actions"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -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