noah-code 0.3.0__tar.gz → 0.4.0__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.
- {noah_code-0.3.0 → noah_code-0.4.0}/PKG-INFO +7 -5
- {noah_code-0.3.0 → noah_code-0.4.0}/README.md +6 -4
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/configuration.md +22 -3
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/development.md +12 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/extensions.md +5 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/interactive-reference.md +15 -1
- noah_code-0.4.0/docs/releases/v0.4.0.md +61 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/pyproject.toml +1 -1
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/__init__.py +1 -1
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/agent.py +237 -164
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/budget.py +6 -6
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/commands.py +2 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/config.py +2 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/host.py +168 -39
- noah_code-0.4.0/src/noah_code/predict.py +37 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/steer.py +1 -1
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/summarization.py +6 -2
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/process_tools.py +267 -22
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/task_tools.py +164 -8
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/ui/console.py +2 -1
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/ui/textual.css +52 -3
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/ui/textual_app.py +214 -5
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/usage.py +58 -6
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_cache_context.py +57 -7
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_config.py +2 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_console_ui.py +12 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_host.py +164 -3
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_process_tools.py +93 -0
- noah_code-0.4.0/tests/test_prompt_scorecard.py +232 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_steer.py +1 -1
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_task_tools.py +72 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_textual_tui.py +82 -4
- {noah_code-0.3.0 → noah_code-0.4.0}/uv.lock +1 -1
- {noah_code-0.3.0 → noah_code-0.4.0}/.github/workflows/ci.yml +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/.github/workflows/release.yml +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/.gitignore +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/.pre-commit-config.yaml +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/assets/noah-in-action.svg +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/assets/noah-logo.svg +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.1.0.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.1.1.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.2.0.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.2.1.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.2.2.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.2.3.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.2.4.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/releases/v0.3.0.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/reliability.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/docs/security.md +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/install.sh +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/__main__.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/agents.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/approvals.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/checkpoints.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/cli.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/composer.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/credentials.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/custom_commands.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/event_bridge.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/events.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/github.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/hooks.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/llm.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/llm_replies.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/macos_sandbox.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/mcp_setup.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/nooa_compat.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/permissions.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/project_notes.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/providers.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/redaction.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/runtime_state.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/secure_files.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/sessions.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/skills_setup.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/snapshots.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/telemetry.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/themes.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tool_output.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/__init__.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/diff_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/git_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/github_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/lsp_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/media_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/memory_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/plan_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/question_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/web_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/tools/workspace_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/ui/__init__.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/ui/protocol.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/updates.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/workspace.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/src/noah_code/worktree.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/conftest.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_agent_security.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_agents.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_approvals.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_budget.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_checkpoints.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_cli.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_compaction_eviction.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_composer.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_credentials.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_custom_commands.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_diff_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_efficiency.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_event_bridge.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_event_bridge_and_shell.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_git_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_github.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_hooks.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_installer.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_llm.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_llm_replies.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_lsp_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_mcp_setup.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_permissions.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_plan_memory_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_project_notes.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_providers.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_question_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_redaction.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_run_exit.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_runtime_state.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_sessions.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_skills_setup.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_snapshots.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_summarization.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_telemetry.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_tool_output.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_updates.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_wave1_e2e.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_web_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/tests/test_workspace_tools.py +0 -0
- {noah_code-0.3.0 → noah_code-0.4.0}/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
|
+
Version: 0.4.0
|
|
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
|
|
105
|
-
|
|
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,
|
|
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
|
|
60
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
293
|
-
objective, decisions, files, validation,
|
|
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
|