noah-code 0.3.0__tar.gz → 0.4.1__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 (139) hide show
  1. {noah_code-0.3.0 → noah_code-0.4.1}/PKG-INFO +7 -5
  2. {noah_code-0.3.0 → noah_code-0.4.1}/README.md +6 -4
  3. {noah_code-0.3.0 → noah_code-0.4.1}/docs/configuration.md +22 -3
  4. {noah_code-0.3.0 → noah_code-0.4.1}/docs/development.md +12 -0
  5. {noah_code-0.3.0 → noah_code-0.4.1}/docs/extensions.md +5 -0
  6. {noah_code-0.3.0 → noah_code-0.4.1}/docs/interactive-reference.md +15 -1
  7. noah_code-0.4.1/docs/releases/v0.4.0.md +61 -0
  8. noah_code-0.4.1/docs/releases/v0.4.1.md +54 -0
  9. {noah_code-0.3.0 → noah_code-0.4.1}/pyproject.toml +1 -1
  10. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/__init__.py +1 -1
  11. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/agent.py +247 -164
  12. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/budget.py +6 -6
  13. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/cli.py +10 -5
  14. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/commands.py +78 -22
  15. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/composer.py +4 -1
  16. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/config.py +59 -0
  17. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/host.py +321 -40
  18. noah_code-0.4.1/src/noah_code/predict.py +37 -0
  19. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/providers.py +7 -0
  20. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/steer.py +45 -1
  21. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/summarization.py +6 -2
  22. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/process_tools.py +277 -24
  23. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/task_tools.py +164 -8
  24. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/workspace_tools.py +86 -10
  25. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/ui/console.py +2 -1
  26. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/ui/textual.css +251 -5
  27. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/ui/textual_app.py +1632 -122
  28. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/usage.py +58 -6
  29. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_agent_security.py +7 -0
  30. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_cache_context.py +58 -7
  31. noah_code-0.4.1/tests/test_commands.py +65 -0
  32. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_composer.py +2 -0
  33. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_config.py +18 -0
  34. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_console_ui.py +12 -0
  35. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_host.py +215 -4
  36. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_process_tools.py +116 -0
  37. noah_code-0.4.1/tests/test_prompt_scorecard.py +232 -0
  38. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_providers.py +13 -0
  39. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_steer.py +27 -1
  40. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_task_tools.py +72 -0
  41. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_textual_tui.py +563 -19
  42. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_workspace_tools.py +41 -0
  43. {noah_code-0.3.0 → noah_code-0.4.1}/uv.lock +1 -1
  44. {noah_code-0.3.0 → noah_code-0.4.1}/.github/workflows/ci.yml +0 -0
  45. {noah_code-0.3.0 → noah_code-0.4.1}/.github/workflows/release.yml +0 -0
  46. {noah_code-0.3.0 → noah_code-0.4.1}/.gitignore +0 -0
  47. {noah_code-0.3.0 → noah_code-0.4.1}/.pre-commit-config.yaml +0 -0
  48. {noah_code-0.3.0 → noah_code-0.4.1}/docs/assets/noah-in-action.svg +0 -0
  49. {noah_code-0.3.0 → noah_code-0.4.1}/docs/assets/noah-logo.svg +0 -0
  50. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.1.0.md +0 -0
  51. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.1.1.md +0 -0
  52. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.2.0.md +0 -0
  53. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.2.1.md +0 -0
  54. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.2.2.md +0 -0
  55. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.2.3.md +0 -0
  56. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.2.4.md +0 -0
  57. {noah_code-0.3.0 → noah_code-0.4.1}/docs/releases/v0.3.0.md +0 -0
  58. {noah_code-0.3.0 → noah_code-0.4.1}/docs/reliability.md +0 -0
  59. {noah_code-0.3.0 → noah_code-0.4.1}/docs/security.md +0 -0
  60. {noah_code-0.3.0 → noah_code-0.4.1}/install.sh +0 -0
  61. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/__main__.py +0 -0
  62. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/agents.py +0 -0
  63. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/approvals.py +0 -0
  64. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/checkpoints.py +0 -0
  65. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/credentials.py +0 -0
  66. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/custom_commands.py +0 -0
  67. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/event_bridge.py +0 -0
  68. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/events.py +0 -0
  69. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/github.py +0 -0
  70. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/hooks.py +0 -0
  71. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/llm.py +0 -0
  72. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/llm_replies.py +0 -0
  73. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/macos_sandbox.py +0 -0
  74. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/mcp_setup.py +0 -0
  75. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/nooa_compat.py +0 -0
  76. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/permissions.py +0 -0
  77. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/project_notes.py +0 -0
  78. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/redaction.py +0 -0
  79. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/runtime_state.py +0 -0
  80. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/secure_files.py +0 -0
  81. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/sessions.py +0 -0
  82. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/skills_setup.py +0 -0
  83. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/snapshots.py +0 -0
  84. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/telemetry.py +0 -0
  85. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/themes.py +0 -0
  86. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tool_output.py +0 -0
  87. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/__init__.py +0 -0
  88. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/diff_tools.py +0 -0
  89. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/git_tools.py +0 -0
  90. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/github_tools.py +0 -0
  91. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/lsp_tools.py +0 -0
  92. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/media_tools.py +0 -0
  93. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/memory_tools.py +0 -0
  94. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/plan_tools.py +0 -0
  95. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/question_tools.py +0 -0
  96. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/tools/web_tools.py +0 -0
  97. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/ui/__init__.py +0 -0
  98. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/ui/protocol.py +0 -0
  99. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/updates.py +0 -0
  100. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/workspace.py +0 -0
  101. {noah_code-0.3.0 → noah_code-0.4.1}/src/noah_code/worktree.py +0 -0
  102. {noah_code-0.3.0 → noah_code-0.4.1}/tests/conftest.py +0 -0
  103. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_agents.py +0 -0
  104. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_approvals.py +0 -0
  105. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_budget.py +0 -0
  106. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_checkpoints.py +0 -0
  107. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_cli.py +0 -0
  108. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_compaction_eviction.py +0 -0
  109. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_credentials.py +0 -0
  110. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_custom_commands.py +0 -0
  111. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_diff_tools.py +0 -0
  112. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_efficiency.py +0 -0
  113. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_event_bridge.py +0 -0
  114. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_event_bridge_and_shell.py +0 -0
  115. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_git_tools.py +0 -0
  116. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_github.py +0 -0
  117. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_hooks.py +0 -0
  118. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_installer.py +0 -0
  119. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_llm.py +0 -0
  120. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_llm_replies.py +0 -0
  121. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_lsp_tools.py +0 -0
  122. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_mcp_setup.py +0 -0
  123. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_permissions.py +0 -0
  124. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_plan_memory_tools.py +0 -0
  125. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_project_notes.py +0 -0
  126. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_question_tools.py +0 -0
  127. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_redaction.py +0 -0
  128. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_run_exit.py +0 -0
  129. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_runtime_state.py +0 -0
  130. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_sessions.py +0 -0
  131. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_skills_setup.py +0 -0
  132. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_snapshots.py +0 -0
  133. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_summarization.py +0 -0
  134. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_telemetry.py +0 -0
  135. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_tool_output.py +0 -0
  136. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_updates.py +0 -0
  137. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_wave1_e2e.py +0 -0
  138. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_web_tools.py +0 -0
  139. {noah_code-0.3.0 → noah_code-0.4.1}/tests/test_worktree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: noah-code
3
- Version: 0.3.0
3
+ Version: 0.4.1
4
4
  Summary: Noah Code terminal coding agent, built on NVIDIA OO Agents (NOOA)
5
5
  Project-URL: Homepage, https://github.com/skundu42/noah-code
6
6
  Project-URL: Documentation, https://github.com/skundu42/noah-code#readme
@@ -101,8 +101,9 @@ configuration or session history.
101
101
  - **Persistent sessions.** Resume repository-scoped conversations, steering, todos, model choices,
102
102
  budgets, background-job logs, and compacted context without losing full tool results.
103
103
  - **Token-efficient by construction.** Lean tool-output bounds with disk-backed recall, condensed
104
- subagent results, cache-stable request prefixes (volatile status arrives as appended events),
105
- and pointer-eviction compaction measured live with `/tokens`.
104
+ subagent results, isolated low-token helper calls, cache-stable request prefixes (volatile status
105
+ arrives as appended events), route-aware cache telemetry, selective memory distillation, and
106
+ pointer-eviction compaction with a practical context ceiling — measured live with `/tokens`.
106
107
  - **Explicit control.** Switch between implementation-focused **build** mode and read-only
107
108
  **plan** mode, with ordered `allow`, `ask`, and `deny` permission rules.
108
109
  - **Extensible workflows.** Add slash commands, opt-in skills, MCP servers, or markdown subagents;
@@ -173,6 +174,7 @@ Type `/` to search the full command and configuration reference. The most common
173
174
  | `Tab` | Switch between build and plan mode |
174
175
  | `F2` | Open execution activity |
175
176
  | `F3` | Open paginated conversation history |
177
+ | `F4` | Open the live agent, terminal, and job ledger |
176
178
  | `/model` | Configure a provider or switch the session model |
177
179
  | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
178
180
  | `/diff` | Review staged and unstaged changes |
@@ -182,8 +184,8 @@ Type `/` to search the full command and configuration reference. The most common
182
184
  | `/tokens` | Inspect tokens, cache usage, prefix stability, model wait, and tool output |
183
185
  | `/efficiency` | Switch between `fast`, `balanced`, and `deep` budgets |
184
186
 
185
- On wide terminals, the side rail prioritizes the active operation, Git branch and change counts,
186
- session, model usage, update state, and plan. Git status is refreshed in the background at turn
187
+ On wide terminals, the side rail prioritizes the active operation, delegated agents, named
188
+ terminals, Git branch and change counts, session, model usage, update state, and plan. Git status is refreshed in the background at turn
187
189
  boundaries, so the animated working state stays responsive. The main pane remains centered on the
188
190
  large Noah wordmark until the first prompt, then becomes the conversation and execution timeline.
189
191
 
@@ -56,8 +56,9 @@ configuration or session history.
56
56
  - **Persistent sessions.** Resume repository-scoped conversations, steering, todos, model choices,
57
57
  budgets, background-job logs, and compacted context without losing full tool results.
58
58
  - **Token-efficient by construction.** Lean tool-output bounds with disk-backed recall, condensed
59
- subagent results, cache-stable request prefixes (volatile status arrives as appended events),
60
- and pointer-eviction compaction measured live with `/tokens`.
59
+ subagent results, isolated low-token helper calls, cache-stable request prefixes (volatile status
60
+ arrives as appended events), route-aware cache telemetry, selective memory distillation, and
61
+ pointer-eviction compaction with a practical context ceiling — measured live with `/tokens`.
61
62
  - **Explicit control.** Switch between implementation-focused **build** mode and read-only
62
63
  **plan** mode, with ordered `allow`, `ask`, and `deny` permission rules.
63
64
  - **Extensible workflows.** Add slash commands, opt-in skills, MCP servers, or markdown subagents;
@@ -128,6 +129,7 @@ Type `/` to search the full command and configuration reference. The most common
128
129
  | `Tab` | Switch between build and plan mode |
129
130
  | `F2` | Open execution activity |
130
131
  | `F3` | Open paginated conversation history |
132
+ | `F4` | Open the live agent, terminal, and job ledger |
131
133
  | `/model` | Configure a provider or switch the session model |
132
134
  | `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
133
135
  | `/diff` | Review staged and unstaged changes |
@@ -137,8 +139,8 @@ Type `/` to search the full command and configuration reference. The most common
137
139
  | `/tokens` | Inspect tokens, cache usage, prefix stability, model wait, and tool output |
138
140
  | `/efficiency` | Switch between `fast`, `balanced`, and `deep` budgets |
139
141
 
140
- On wide terminals, the side rail prioritizes the active operation, Git branch and change counts,
141
- session, model usage, update state, and plan. Git status is refreshed in the background at turn
142
+ On wide terminals, the side rail prioritizes the active operation, delegated agents, named
143
+ terminals, Git branch and change counts, session, model usage, update state, and plan. Git status is refreshed in the background at turn
142
144
  boundaries, so the animated working state stays responsive. The main pane remains centered on the
143
145
  large Noah wordmark until the first prompt, then becomes the conversation and execution timeline.
144
146
 
@@ -107,7 +107,9 @@ max_output_chars = 16000
107
107
  profile = "fast" # "fast", "balanced", or "deep"
108
108
  strategy = "lean" # "standard" is the comparison fallback
109
109
  deterministic_titles = true
110
- lazy_mcp = false # true catalogs servers without attaching them at start
110
+ memory_distillation = "heuristic" # "off", "heuristic", or "always"
111
+ lazy_mcp = false # true catalogs servers without attaching them at start
112
+ context_token_budget = 64000 # automatic compaction ceiling unless max_tokens is explicit
111
113
  max_output_lines = 250
112
114
  max_search_results = 100
113
115
  max_file_results = 500
@@ -289,8 +291,25 @@ fallback cache used when workspace tools are embedded without a durable session
289
291
 
290
292
  Set `lightweight_model` to route compaction to a faster or cheaper model. If it is omitted, that
291
293
  route follows live `/model` switches. Compaction starts at 35% of the active main model's context
292
- window by default, preserves the six newest events, and writes a coding checkpoint covering the
293
- objective, decisions, files, validation, blockers, and next steps.
294
+ window, capped at `efficiency.context_token_budget` (64k by default), preserves the six newest
295
+ events, and writes a coding checkpoint covering the objective, decisions, files, validation,
296
+ blockers, and next steps. An explicit `summarization.max_tokens` overrides the ceiling.
297
+
298
+ `memory_distillation = "heuristic"` avoids an auxiliary model call on ordinary coding prompts and
299
+ runs only when the user states a likely standing convention (for example “remember”, “we always”,
300
+ or “for this project”). Use `"always"` for the earlier every-turn behavior or `"off"` to disable
301
+ automatic memory extraction; explicit `self.memory.save(...)` remains available to the agent.
302
+
303
+ Noah keeps provider `prompt_cache_key` affinity stable for a durable session, including after a
304
+ process restart. Cache namespaces, histories, summaries, memory state, and telemetry remain
305
+ independent between sessions. `/tokens` reports provider cache hits plus route-aware prefix
306
+ stability and an estimated common-prefix reuse ratio; provider-reported cached tokens remain the
307
+ authoritative billing measure.
308
+
309
+ Auxiliary model work (optional title generation, memory extraction, subagent-result condensation,
310
+ and history compaction) uses isolated histories and distinct session-local cache routes. These
311
+ calls do not inherit repository/tool context or add their internal Tasks and results to the coding
312
+ conversation; only their usage and runtime observability events feed the parent session.
294
313
 
295
314
  ### Budgets, checkpoints, and reliability
296
315
 
@@ -35,6 +35,18 @@ uvx pre-commit install
35
35
  Use `/tokens` during a real session to inspect provider-reported token use, cache hits, model wait,
36
36
  tool output, and estimated cost.
37
37
 
38
+ The hermetic prompt scorecard prevents efficiency work from silently dropping agent contracts or
39
+ growing the first request. Run it with:
40
+
41
+ ```bash
42
+ uv run --all-extras pytest -q tests/test_prompt_scorecard.py tests/test_cache_context.py
43
+ ```
44
+
45
+ It gates the initial token estimate, per-session cache-key and system-prefix stability, compact
46
+ dynamic task instructions, and the required editing, validation, delegation, and safety guidance.
47
+ It also caps isolated helper routes at 250 estimated input tokens and proves they do not mutate the
48
+ main coding history. Live `/tokens` results remain authoritative for provider cache billing.
49
+
38
50
  ## CI
39
51
 
40
52
  GitHub Actions runs the complete test suite on Python 3.12 and 3.13, plus platform smoke tests on
@@ -36,6 +36,11 @@ oversized transcripts are condensed by the lightweight model (fallback: truncati
36
36
  pointer) before they enter the parent's context. Tune with `subagent_result_max_chars` and
37
37
  `max_concurrent_subagents` under `[efficiency]`. Add project or user markdown agents:
38
38
 
39
+ Use `self.task.collaborate(objective, assignments, lead="general")` when parallel findings need a
40
+ deliberate handoff. Contributors run under the same concurrency and mutation-lane rules, then the
41
+ lead receives their bounded reports and returns one synthesized result. Live queued, running,
42
+ completed, failed, and cancelled states are visible in the TUI work ledger (`F4`) and `/work`.
43
+
39
44
  - `~/.config/noah-code/agents/*.md`
40
45
  - `.noah-code/agents/*.md`
41
46
 
@@ -16,6 +16,7 @@
16
16
  | `F1` or `?` | Show help |
17
17
  | `F2` | Open recent activity and full captured output |
18
18
  | `F3` | Open paginated persisted conversation history |
19
+ | `F4` | Open the live work ledger for agents, terminals, and background jobs |
19
20
  | `Ctrl+]` | Return to live transcript output and clear the new-output counter |
20
21
 
21
22
  At an approval prompt, press `1` to approve once, `2` to remember the approval for the current
@@ -69,7 +70,7 @@ clears it.
69
70
  Approval and `ask.question` modals keep the composer. Queueing resumes after the modal closes.
70
71
 
71
72
  These slash commands still run while a turn is in progress: `/status`, `/tokens`, `/todos`,
72
- `/health`, `/help`, `/trace`. `/attach PATH` remembers the file for the next queued follow-up.
73
+ `/health`, `/help`, `/trace`, `/work`, and `/terminals`. `/attach PATH` remembers the file for the next queued follow-up.
73
74
  `/exit` cancels the turn (and the queue) then leaves. Mutating commands wait until the turn
74
75
  finishes, including `/undo`, `/redo`, `/mode`, `/model`, `/diff`, `/new`, `/sessions`, `/worktree`,
75
76
  `/pr`, `/plan`, `/memory`, and `/compact`.
@@ -107,6 +108,8 @@ compact. `F2` retains the latest 100 activity records, bounded by the configured
107
108
  | `/todos` | Show the agent's current task list |
108
109
  | `/health` | Show durable run, job, inbox, interaction, event, database, and artifact health |
109
110
  | `/agents` | List built-in and markdown subagents |
111
+ | `/work` | Show live and recent subagent, terminal, and background-job work |
112
+ | `/terminals` | List named persistent terminal sessions |
110
113
  | `/attach PATH` | Attach a workspace file or image to the next turn |
111
114
  | `/status` | Inspect the current session and repository state |
112
115
  | `/diff` | Review staged and unstaged files, patches, diagnostics, and changed symbols |
@@ -215,6 +218,13 @@ output, including output from jobs recovered after restart. Lifecycle updates ap
215
218
  without copying continuous logs into model context. An agent waiting for a job wakes and continues
216
219
  the same turn when the job finishes.
217
220
 
221
+ For command sequences that benefit from retained shell state, the agent can open multiple named
222
+ sessions with `self.processes.open_terminal(name)`, run commands with `terminal_run`, inspect them
223
+ with `terminal_status`, and close them with `close_terminal`. Each command passes through the same
224
+ permission and checkpoint policy as an ordinary shell command; raw `input` is blocked for managed
225
+ terminals so an approved shell cannot become a permission bypass. Terminal stderr is merged into
226
+ its ordered output stream, and session state such as the current directory persists between calls.
227
+
218
228
  ### Subagents, web, questions, and attachments
219
229
 
220
230
  The parent agent can run isolated NOOA subagents with `self.task.run("explore", ...)` or
@@ -224,6 +234,10 @@ them with `/agents`. Repository files cannot replace the built-in `explore` or `
224
234
  and unsafe linked or oversized repository definitions are ignored. Plan mode can run read-only
225
235
  agents only. Read-only agents may run concurrently; mutating agents share one serialized mutation
226
236
  lane so parallel delegation cannot corrupt the checkout.
237
+ For coordinated work, `self.task.collaborate(objective, assignments, lead="general")` fans out
238
+ bounded assignments and then hands all reports to one lead agent for conflict resolution and a
239
+ single synthesis. Agent lifecycle records and terminal/job state appear in the context rail and
240
+ the live `F4` work ledger; `/work` provides the same information in console-friendly text.
227
241
 
228
242
  `self.web.fetch(url)` and `self.web.search(query)` are read-only and allowed by default. Fetch
229
243
  follows a bounded number of redirects and accepts only public HTTP(S) destinations; private,
@@ -0,0 +1,61 @@
1
+ # Noah Code v0.4.0
2
+
3
+ This release makes Noah's coding harness easier to follow and more capable during complex,
4
+ long-running work. It adds a live work ledger, independent persistent terminal sessions, richer
5
+ multi-agent collaboration, and substantial prompt and cache-efficiency improvements.
6
+
7
+ ## Live coding UX
8
+
9
+ - Added an F4 work ledger that surfaces active subagents, terminal sessions, background jobs, and
10
+ recent activity without interrupting the main conversation.
11
+ - Added `/work` and `/terminals` commands for quickly inspecting current agent activity and shell
12
+ state.
13
+ - Removed internal completion-summary rows from the transcript so user messages and useful agent
14
+ output remain the focus.
15
+ - Replaced verbose checkpoint-saved text with a compact status icon.
16
+
17
+ ## Independent terminal sessions
18
+
19
+ - Added multiple named, persistent terminal sessions. Each session keeps its own working directory,
20
+ environment, process state, and output history.
21
+ - Added predictable session lifecycle controls for creating, selecting, restarting, and closing
22
+ terminals while preserving isolation between sessions.
23
+ - Preserved Noah's permission and checkpoint protections for terminal commands, blocked unsafe raw
24
+ input paths, and kept output ordering deterministic.
25
+
26
+ ## Multi-agent collaboration
27
+
28
+ - Added visible lifecycle tracking for delegated tasks, including queued, running, completed, and
29
+ failed work.
30
+ - Added collaboration primitives for parallel fan-out and lead-agent synthesis, with bounded result
31
+ condensation to keep parent contexts focused.
32
+ - Improved coordination safety by allowing concurrent read-only work while serializing conflicting
33
+ writers.
34
+
35
+ ## Prompt and cache efficiency
36
+
37
+ - Reworked the main system prompt into a smaller, Noah-specific cacheable contract and isolated
38
+ helper-model calls from the main conversation history.
39
+ - Added per-session and per-route cache namespaces, cache-prefix telemetry, selective memory
40
+ distillation, and a 64k context ceiling.
41
+ - Added a prompt scorecard for catching token regressions. Measured main-prompt size dropped by
42
+ about 41%, while common helper routes dropped by roughly 90%.
43
+
44
+ ## Reliability and validation
45
+
46
+ - Expanded tests for terminal isolation, agent collaboration, permission handling, context
47
+ compaction, cache routing, TUI activity rendering, and session lifecycle behavior.
48
+ - Hardened terminal teardown and restart paths so independent sessions do not leak state or leave
49
+ managed processes behind.
50
+
51
+ ## Upgrade
52
+
53
+ Existing managed installations can run:
54
+
55
+ ```bash
56
+ noah update
57
+ ```
58
+
59
+ New installations can use the one-command installer from the README.
60
+
61
+ **Full changelog:** https://github.com/skundu42/noah-code/compare/v0.3.0...v0.4.0
@@ -0,0 +1,54 @@
1
+ # Noah Code v0.4.1
2
+
3
+ This release makes Noah's terminal interface easier to learn, calmer during long-running work,
4
+ and more reliable across supported platforms.
5
+
6
+ ## Guided and discoverable UX
7
+
8
+ - Added first-run onboarding that detects missing model configuration and guides users through
9
+ provider setup instead of stopping at an error.
10
+ - Added a searchable, context-aware keyboard help overlay with shortcuts for the currently focused
11
+ panel.
12
+ - Streamlined slash-command discovery into one flat list, removed duplicate command entries, and
13
+ kept labels focused on the commands themselves.
14
+ - Added `/continue` session selection for the ten most recent sessions in the current workspace.
15
+ - Added automatic update notices with the appropriate upgrade command.
16
+
17
+ ## Clearer long-running work
18
+
19
+ - Added tool-aware progress with elapsed time and concise counts for searches and other operations.
20
+ - Added a collapsible task timeline for thinking, tool calls, retries, approvals, and validation
21
+ without adding noise to the transcript.
22
+ - Added context visibility for active files, instructions, project memory, and attachments.
23
+ - Added queue management for pending prompts and attachments, expandable error details, safer undo
24
+ confirmation, and compact completion receipts.
25
+
26
+ ## Faster, steadier TUI
27
+
28
+ - Reworked the working indicator into a continuous left-to-right animation with isolated 80 ms
29
+ loader updates, while elapsed status refreshes remain throttled separately.
30
+ - Added reduced-motion support and semantic states for thinking, running tools, waiting for input or
31
+ approval, cancelling, and errors.
32
+ - Improved live-output following so users can inspect earlier output while new-line counts remain
33
+ visible and can jump back to the latest output on demand.
34
+ - Avoided unnecessary full-screen redraws that caused flashing and visual instability.
35
+
36
+ ## Reliability
37
+
38
+ - Made common search and read requests accept familiar paths, regex arguments, and content helper
39
+ forms more consistently.
40
+ - Hardened loader shutdown against timer/widget teardown races found on Intel macOS CI.
41
+ - Added a direct-child termination fallback when macOS denies an owned process-group signal.
42
+ - Stabilized asynchronous TUI validation across Linux, Apple-silicon macOS, and Intel macOS.
43
+
44
+ ## Upgrade
45
+
46
+ Existing managed installations can run:
47
+
48
+ ```bash
49
+ noah update
50
+ ```
51
+
52
+ New installations can use the one-command installer from the README.
53
+
54
+ **Full changelog:** https://github.com/skundu42/noah-code/compare/v0.4.0...v0.4.1
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "noah-code"
3
- version = "0.3.0"
3
+ version = "0.4.1"
4
4
  description = "Noah Code terminal coding agent, built on NVIDIA OO Agents (NOOA)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<3.14"
@@ -1,3 +1,3 @@
1
1
  """Noah Code: terminal coding agent on NVIDIA OO Agents."""
2
2
 
3
- __version__ = "0.3.0"
3
+ __version__ = "0.4.1"