euron-code 0.4.1__tar.gz → 0.4.2__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 (85) hide show
  1. {euron_code-0.4.1 → euron_code-0.4.2}/CHANGELOG.md +5 -0
  2. {euron_code-0.4.1 → euron_code-0.4.2}/PKG-INFO +20 -33
  3. {euron_code-0.4.1 → euron_code-0.4.2}/README.md +19 -32
  4. {euron_code-0.4.1 → euron_code-0.4.2}/pyproject.toml +1 -1
  5. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/__init__.py +1 -1
  6. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/activity.py +1 -1
  7. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/repl.py +0 -5
  8. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v3_activity.py +3 -3
  9. {euron_code-0.4.1 → euron_code-0.4.2}/.gitignore +0 -0
  10. {euron_code-0.4.1 → euron_code-0.4.2}/LICENSE +0 -0
  11. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/__main__.py +0 -0
  12. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/agent.py +0 -0
  13. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/api.py +0 -0
  14. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/attachments.py +0 -0
  15. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/auth.py +0 -0
  16. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/builtin_skills/explain-codebase/SKILL.md +0 -0
  17. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/builtin_skills/review/SKILL.md +0 -0
  18. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/builtin_skills/test-writer/SKILL.md +0 -0
  19. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/cache.py +0 -0
  20. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/checkpoints.py +0 -0
  21. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/cli.py +0 -0
  22. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/config.py +0 -0
  23. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/context.py +0 -0
  24. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/contextforge/LICENSE +0 -0
  25. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/contextforge/__init__.py +0 -0
  26. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/contextforge/text.py +0 -0
  27. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/contextforge/toolout.py +0 -0
  28. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/credentials.py +0 -0
  29. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/doctor.py +0 -0
  30. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/documents.py +0 -0
  31. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/frontmatter.py +0 -0
  32. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/hooks.py +0 -0
  33. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/keys.py +0 -0
  34. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/memory.py +0 -0
  35. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/permissions.py +0 -0
  36. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/project_setup.py +0 -0
  37. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/prompts.py +0 -0
  38. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/repomap.py +0 -0
  39. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/rules.py +0 -0
  40. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/sessions.py +0 -0
  41. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/skills.py +0 -0
  42. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/textsafe.py +0 -0
  43. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/__init__.py +0 -0
  44. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/background.py +0 -0
  45. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/base.py +0 -0
  46. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/db.py +0 -0
  47. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/document.py +0 -0
  48. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/fs.py +0 -0
  49. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/ignore.py +0 -0
  50. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/reuse.py +0 -0
  51. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/search.py +0 -0
  52. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/shell.py +0 -0
  53. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/skill.py +0 -0
  54. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/symbols.py +0 -0
  55. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/task.py +0 -0
  56. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/todo.py +0 -0
  57. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/tools/web.py +0 -0
  58. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/trust.py +0 -0
  59. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/ui.py +0 -0
  60. {euron_code-0.4.1 → euron_code-0.4.2}/src/euron_code/usage_view.py +0 -0
  61. {euron_code-0.4.1 → euron_code-0.4.2}/tests/conftest.py +0 -0
  62. {euron_code-0.4.1 → euron_code-0.4.2}/tests/helpers.py +0 -0
  63. {euron_code-0.4.1 → euron_code-0.4.2}/tests/mock_gateway.py +0 -0
  64. {euron_code-0.4.1 → euron_code-0.4.2}/tests/serve_helper.py +0 -0
  65. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_agent_mock.py +0 -0
  66. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_api_shell.py +0 -0
  67. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_cli_e2e.py +0 -0
  68. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_context_memory_sessions.py +0 -0
  69. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_db.py +0 -0
  70. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_permissions.py +0 -0
  71. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_powershell_exit_codes.py +0 -0
  72. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_repl.py +0 -0
  73. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_search.py +0 -0
  74. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_textsafe.py +0 -0
  75. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_tools_fs.py +0 -0
  76. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v2_rules_skills_hooks.py +0 -0
  77. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v2_tokens_shortcuts.py +0 -0
  78. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v2_usage_headers.py +0 -0
  79. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v31_security.py +0 -0
  80. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v3_accounts_value_setup.py +0 -0
  81. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v3_attachments.py +0 -0
  82. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v3_context.py +0 -0
  83. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v3_live_repl.py +0 -0
  84. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v3_single_login.py +0 -0
  85. {euron_code-0.4.1 → euron_code-0.4.2}/tests/test_v4.py +0 -0
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.2 (2026-11-05)
4
+
5
+ ### Changed
6
+ - Documentation and messages describe what Euron Code does for you, without internal service details.
7
+
3
8
  ## 0.4.1 (2026-11-05)
4
9
 
5
10
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: euron-code
3
- Version: 0.4.1
3
+ Version: 0.4.2
4
4
  Summary: Euron Code: an agentic coding assistant in your terminal for Euron Plus and Super 30 students.
5
5
  Project-URL: Homepage, https://euron.one/code-agent
6
6
  Author-email: Euron <contact@euron.one>
@@ -105,8 +105,7 @@ That's it. Press **Esc** to stop it, **Ctrl-D** to quit.
105
105
  improve `EURON.md`.
106
106
  - **Context management.** Old tool output is cleared and long conversations are summarised before
107
107
  they fill the context, so it never runs out mid-task. Long answers continue by themselves.
108
- - **Token saving.** Unchanged files are not re-read, big files are read in parts, the prompt is kept
109
- cache-friendly for the servers.
108
+ - **Token saving.** Unchanged files are not re-read and big files are read in parts.
110
109
  - **Local cache.** `.euron/cache/` remembers the repo map and file list, so new sessions start fast.
111
110
  Safe to delete; never holds secrets; git-ignored.
112
111
  - **Runs your app.** It can start your dev server in the background, check it answers
@@ -167,7 +166,7 @@ Shift+Tab cycles default -> acceptEdits -> plan, and reaches bypass only if you
167
166
 
168
167
  ## Where your data goes
169
168
 
170
- - Your code stays on your computer. Euron Code runs on Euron's GPUs.
169
+ - Your code stays on your computer.
171
170
  - Images you attach are turned into a text description by Euron's image understanding and are not stored.
172
171
  - One login at a time: signing in on another computer signs this one out.
173
172
  - Don't paste passwords or API keys into prompts.
@@ -219,7 +218,7 @@ running Euron Code in another terminal, you are asked whether to take over (`-p
219
218
  The approval page approves for whichever Euron account is signed in on euron.one in that browser, so
220
219
  to switch accounts sign in there with the other account first (or open the link in a private window).
221
220
  If no browser opens (SSH, WSL), copy the link it prints. The key is kept in the system keychain, or in
222
- `~/.euron/credentials.json` (readable only by you). To revoke a key on the server, delete it at
221
+ `~/.euron/credentials.json` (readable only by you). To revoke a login, remove it at
223
222
  https://euron.one/code-agent.
224
223
 
225
224
  Optional extras: `pip install "euron-code[images]"` (image resizing, clipboard), `"euron-code[postgres]"`,
@@ -242,7 +241,7 @@ Optional extras: `pip install "euron-code[images]"` (image resizing, clipboard),
242
241
  | `/help` | list commands, your own commands and skills, and the shortcuts |
243
242
  | `/status`, `/whoami` | account, key, API, model, mode, session, uptime, quota |
244
243
  | `/usage` (`/users`) | quota per period, refill times, value, sessions, tasks, cache share, last 30 days |
245
- | `/cost`, `/context` | session tokens, server cache, savings, session value; what fills the context |
244
+ | `/cost`, `/context` | what this session used; what fills the context |
246
245
  | `/model [id]`, `/effort` | pick or set the model; reasoning effort |
247
246
  | `/compact [focus]`, `/clear` | summarise to free context; start fresh |
248
247
  | `/resume [id]`, `/rewind`, `/export [file]` | saved sessions; undo the last turn; save as Markdown |
@@ -406,31 +405,22 @@ always run.
406
405
 
407
406
  ## Context and tokens (automatic)
408
407
 
409
- The default model has a 32k-token context and writes at most about 8k tokens per step. Euron Code
410
- manages that for you, with nothing to set up:
411
-
412
- - **Room for the answer.** An output budget (about 8k) is always kept free; "100% full" means the
413
- prompt leaves no more than that. Each request asks for as many output tokens as really fit, and a
414
- request that would not fit is compacted first.
415
- - **Clearing.** From 50% full, tool outputs are replaced with one-line stubs, biggest and oldest first,
416
- until it is under 40%. The latest step is never touched, and each stub says what to re-read (for
417
- example `read_file src/app.py lines 1-200`). The note shows real numbers: "freed 9,400 tokens,
418
- now 38%".
419
- - **Summary.** At 70%, or when the next request would not fit, older messages are summarised: the task,
420
- decisions, files changed, commands and results, the last error and open todos.
421
- - **Long answers and big edits.** An answer cut by the output limit continues by itself. A tool call cut
422
- in the middle (a huge file write) is never run; the model is asked to make the change in smaller
423
- steps. If the model spent its whole budget thinking, it retries with less reasoning.
408
+ Euron Code manages the conversation for you, with nothing to set up:
409
+
410
+ - **Always room to answer.** Each request leaves space for the reply; a conversation that is getting
411
+ full is tidied up first.
412
+ - **Clearing.** Old tool output is replaced with one-line notes that say what to re-read (for example
413
+ `read_file src/app.py lines 1-200`), so the agent keeps going without losing track.
414
+ - **Summary.** Long conversations are summarised: the task, decisions, files changed, commands and
415
+ results, the last error and open todos.
416
+ - **Long answers and big edits.** An answer that gets cut off continues by itself. A huge edit that gets
417
+ cut off is never applied half-way; the change is made in smaller steps instead.
424
418
  - **Reasoning effort** is `medium` by default and `low` for quick follow-ups ("thanks", "continue");
425
419
  change it with `/effort low|medium|high`.
426
- - **Reads.** `read_file` reads 200 lines at a time and stops before about 6k tokens; a file over 2,000
427
- lines returns an outline of its definitions first. Re-reading an unchanged file returns a one-line
428
- note instead of the content.
429
- - **Cache-friendly.** The system prompt and tool list never change during a session, so the servers can
430
- reuse their prefix cache; changing data goes at the end of your message.
420
+ - **Reads.** Files are read in parts; a very large file returns an outline first. Re-reading an
421
+ unchanged file returns a one-line note instead of the content.
431
422
 
432
- `/cost` and `/context` show what was sent, how much the server served from its cache, and how many
433
- tokens these measures kept out of the context.
423
+ `/cost` and `/context` show what this session used and what fills the context.
434
424
 
435
425
  ## Non-interactive use (scripts, CI)
436
426
 
@@ -491,9 +481,8 @@ the connection itself is opened read-only. To let it write (local dev databases
491
481
  | `webFetch` | `true` | allow the web page tool (it still asks per site) |
492
482
  | `db.connections.<name>` | | database DSNs |
493
483
 
494
- Environment variables: `EURON_CODE_API` (gateway URL, default
495
- `https://api.euron.one/api/v1/code-agent`), `EURON_API_KEY` (use a key without logging in, for CI),
496
- `EURON_HOME` (instead of `~/.euron`), `EURON_NO_BROWSER=1`.
484
+ Environment variables: `EURON_API_KEY` (use a key without logging in, for CI), `EURON_HOME` (instead of
485
+ `~/.euron`), `EURON_NO_BROWSER=1`.
497
486
 
498
487
  ## In VS Code
499
488
 
@@ -534,8 +523,6 @@ and the keychain.
534
523
  stored.
535
524
  - Your key is never printed in full and never logged.
536
525
  - Edits and commands ask first. Files outside the project folder always ask, even to read.
537
- - Each request carries a random session id and task id so your usage page can count sessions and
538
- tasks. Nothing else about the conversation is stored by the gateway.
539
526
  - Hooks are commands you configure; project hooks only run after you trust them.
540
527
  - Text inside your files, web pages and command output is treated as data, not instructions.
541
528
 
@@ -39,8 +39,7 @@ That's it. Press **Esc** to stop it, **Ctrl-D** to quit.
39
39
  improve `EURON.md`.
40
40
  - **Context management.** Old tool output is cleared and long conversations are summarised before
41
41
  they fill the context, so it never runs out mid-task. Long answers continue by themselves.
42
- - **Token saving.** Unchanged files are not re-read, big files are read in parts, the prompt is kept
43
- cache-friendly for the servers.
42
+ - **Token saving.** Unchanged files are not re-read and big files are read in parts.
44
43
  - **Local cache.** `.euron/cache/` remembers the repo map and file list, so new sessions start fast.
45
44
  Safe to delete; never holds secrets; git-ignored.
46
45
  - **Runs your app.** It can start your dev server in the background, check it answers
@@ -101,7 +100,7 @@ Shift+Tab cycles default -> acceptEdits -> plan, and reaches bypass only if you
101
100
 
102
101
  ## Where your data goes
103
102
 
104
- - Your code stays on your computer. Euron Code runs on Euron's GPUs.
103
+ - Your code stays on your computer.
105
104
  - Images you attach are turned into a text description by Euron's image understanding and are not stored.
106
105
  - One login at a time: signing in on another computer signs this one out.
107
106
  - Don't paste passwords or API keys into prompts.
@@ -153,7 +152,7 @@ running Euron Code in another terminal, you are asked whether to take over (`-p
153
152
  The approval page approves for whichever Euron account is signed in on euron.one in that browser, so
154
153
  to switch accounts sign in there with the other account first (or open the link in a private window).
155
154
  If no browser opens (SSH, WSL), copy the link it prints. The key is kept in the system keychain, or in
156
- `~/.euron/credentials.json` (readable only by you). To revoke a key on the server, delete it at
155
+ `~/.euron/credentials.json` (readable only by you). To revoke a login, remove it at
157
156
  https://euron.one/code-agent.
158
157
 
159
158
  Optional extras: `pip install "euron-code[images]"` (image resizing, clipboard), `"euron-code[postgres]"`,
@@ -176,7 +175,7 @@ Optional extras: `pip install "euron-code[images]"` (image resizing, clipboard),
176
175
  | `/help` | list commands, your own commands and skills, and the shortcuts |
177
176
  | `/status`, `/whoami` | account, key, API, model, mode, session, uptime, quota |
178
177
  | `/usage` (`/users`) | quota per period, refill times, value, sessions, tasks, cache share, last 30 days |
179
- | `/cost`, `/context` | session tokens, server cache, savings, session value; what fills the context |
178
+ | `/cost`, `/context` | what this session used; what fills the context |
180
179
  | `/model [id]`, `/effort` | pick or set the model; reasoning effort |
181
180
  | `/compact [focus]`, `/clear` | summarise to free context; start fresh |
182
181
  | `/resume [id]`, `/rewind`, `/export [file]` | saved sessions; undo the last turn; save as Markdown |
@@ -340,31 +339,22 @@ always run.
340
339
 
341
340
  ## Context and tokens (automatic)
342
341
 
343
- The default model has a 32k-token context and writes at most about 8k tokens per step. Euron Code
344
- manages that for you, with nothing to set up:
345
-
346
- - **Room for the answer.** An output budget (about 8k) is always kept free; "100% full" means the
347
- prompt leaves no more than that. Each request asks for as many output tokens as really fit, and a
348
- request that would not fit is compacted first.
349
- - **Clearing.** From 50% full, tool outputs are replaced with one-line stubs, biggest and oldest first,
350
- until it is under 40%. The latest step is never touched, and each stub says what to re-read (for
351
- example `read_file src/app.py lines 1-200`). The note shows real numbers: "freed 9,400 tokens,
352
- now 38%".
353
- - **Summary.** At 70%, or when the next request would not fit, older messages are summarised: the task,
354
- decisions, files changed, commands and results, the last error and open todos.
355
- - **Long answers and big edits.** An answer cut by the output limit continues by itself. A tool call cut
356
- in the middle (a huge file write) is never run; the model is asked to make the change in smaller
357
- steps. If the model spent its whole budget thinking, it retries with less reasoning.
342
+ Euron Code manages the conversation for you, with nothing to set up:
343
+
344
+ - **Always room to answer.** Each request leaves space for the reply; a conversation that is getting
345
+ full is tidied up first.
346
+ - **Clearing.** Old tool output is replaced with one-line notes that say what to re-read (for example
347
+ `read_file src/app.py lines 1-200`), so the agent keeps going without losing track.
348
+ - **Summary.** Long conversations are summarised: the task, decisions, files changed, commands and
349
+ results, the last error and open todos.
350
+ - **Long answers and big edits.** An answer that gets cut off continues by itself. A huge edit that gets
351
+ cut off is never applied half-way; the change is made in smaller steps instead.
358
352
  - **Reasoning effort** is `medium` by default and `low` for quick follow-ups ("thanks", "continue");
359
353
  change it with `/effort low|medium|high`.
360
- - **Reads.** `read_file` reads 200 lines at a time and stops before about 6k tokens; a file over 2,000
361
- lines returns an outline of its definitions first. Re-reading an unchanged file returns a one-line
362
- note instead of the content.
363
- - **Cache-friendly.** The system prompt and tool list never change during a session, so the servers can
364
- reuse their prefix cache; changing data goes at the end of your message.
354
+ - **Reads.** Files are read in parts; a very large file returns an outline first. Re-reading an
355
+ unchanged file returns a one-line note instead of the content.
365
356
 
366
- `/cost` and `/context` show what was sent, how much the server served from its cache, and how many
367
- tokens these measures kept out of the context.
357
+ `/cost` and `/context` show what this session used and what fills the context.
368
358
 
369
359
  ## Non-interactive use (scripts, CI)
370
360
 
@@ -425,9 +415,8 @@ the connection itself is opened read-only. To let it write (local dev databases
425
415
  | `webFetch` | `true` | allow the web page tool (it still asks per site) |
426
416
  | `db.connections.<name>` | | database DSNs |
427
417
 
428
- Environment variables: `EURON_CODE_API` (gateway URL, default
429
- `https://api.euron.one/api/v1/code-agent`), `EURON_API_KEY` (use a key without logging in, for CI),
430
- `EURON_HOME` (instead of `~/.euron`), `EURON_NO_BROWSER=1`.
418
+ Environment variables: `EURON_API_KEY` (use a key without logging in, for CI), `EURON_HOME` (instead of
419
+ `~/.euron`), `EURON_NO_BROWSER=1`.
431
420
 
432
421
  ## In VS Code
433
422
 
@@ -468,8 +457,6 @@ and the keychain.
468
457
  stored.
469
458
  - Your key is never printed in full and never logged.
470
459
  - Edits and commands ask first. Files outside the project folder always ask, even to read.
471
- - Each request carries a random session id and task id so your usage page can count sessions and
472
- tasks. Nothing else about the conversation is stored by the gateway.
473
460
  - Hooks are commands you configure; project hooks only run after you trust them.
474
461
  - Text inside your files, web pages and command output is treated as data, not instructions.
475
462
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "euron-code"
7
- version = "0.4.1"
7
+ version = "0.4.2"
8
8
  description = "Euron Code: an agentic coding assistant in your terminal for Euron Plus and Super 30 students."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """Euron Code: an agentic coding assistant for the terminal."""
2
2
 
3
- __version__ = "0.4.1"
3
+ __version__ = "0.4.2"
@@ -64,7 +64,7 @@ def phase_from_comment(comment: Optional[str]) -> Optional[str]:
64
64
  m = QUEUED.search(comment)
65
65
  if m:
66
66
  n = int(m.group(1))
67
- return "waiting for a GPU slot" + (f" ({n} ahead)" if n else " (next in line)")
67
+ return "waiting for capacity" + (f" ({n} ahead)" if n else " (next in line)")
68
68
  if "previous request" in comment:
69
69
  return "waiting for your previous request to finish"
70
70
  return None
@@ -1203,11 +1203,6 @@ class Repl:
1203
1203
  if weekly_limit(q) > 0:
1204
1204
  rows.append(("This week", f"{fmt_int(self.remaining_week())} of {fmt_int(weekly_limit(q))} left, "
1205
1205
  f"resets {local_when(q.get('weekResetsAt'))}"))
1206
- fleet = me.get("fleet") or me.get("gpus") or me.get("capacity")
1207
- if isinstance(fleet, dict) and fleet:
1208
- rows.append(("GPU fleet", ", ".join(f"{k} {v}" for k, v in fleet.items() if not isinstance(v, (dict, list)))))
1209
- elif isinstance(fleet, str) and fleet:
1210
- rows.append(("GPU fleet", fleet))
1211
1206
  if self.agent.permissions.extra_roots:
1212
1207
  rows.append(("Extra dirs", ", ".join(str(r) for r in self.agent.permissions.extra_roots)))
1213
1208
  rows.append(("Version", f"euron-code {__version__}, Python {platform.python_version()}, "
@@ -112,8 +112,8 @@ def test_tool_elapsed_queue_count_and_ascii_fallback():
112
112
 
113
113
 
114
114
  def test_helpers():
115
- assert phase_from_comment("queued, 2 ahead") == "waiting for a GPU slot (2 ahead)"
116
- assert phase_from_comment("queued, 0 ahead") == "waiting for a GPU slot (next in line)"
115
+ assert phase_from_comment("queued, 2 ahead") == "waiting for capacity (2 ahead)"
116
+ assert phase_from_comment("queued, 0 ahead") == "waiting for capacity (next in line)"
117
117
  assert "previous request" in phase_from_comment("waiting for your previous request to finish")
118
118
  assert phase_from_comment("keep-alive") is None and phase_from_comment(None) is None
119
119
  assert tool_label("write_file", "create app.py") == "writing app.py"
@@ -142,7 +142,7 @@ def test_queue_comments_show_gpu_wait(project, logged_in, mock_url):
142
142
  ui = ActivityUI()
143
143
  a = make_agent(project, mock_url, logged_in, ui)
144
144
  assert a.run_turn("[mock:queued] hi").stop_reason == "end_turn"
145
- assert "waiting for a GPU slot (2 ahead)" in ui.phases and "waiting for a GPU slot (next in line)" in ui.phases
145
+ assert "waiting for capacity (2 ahead)" in ui.phases and "waiting for capacity (next in line)" in ui.phases
146
146
 
147
147
 
148
148
  def test_busy_retries_keep_the_line_alive(project, logged_in, mock_url, monkeypatch):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes