noah-code 0.2.4__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.2.4 → noah_code-0.4.0}/PKG-INFO +8 -5
- {noah_code-0.2.4 → noah_code-0.4.0}/README.md +6 -4
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/configuration.md +40 -4
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/development.md +12 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/extensions.md +49 -5
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/interactive-reference.md +15 -1
- noah_code-0.4.0/docs/releases/v0.3.0.md +75 -0
- noah_code-0.4.0/docs/releases/v0.4.0.md +61 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/pyproject.toml +2 -1
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/__init__.py +1 -1
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/agent.py +239 -125
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/approvals.py +22 -10
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/budget.py +50 -18
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/cli.py +55 -11
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/commands.py +2 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/config.py +35 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/event_bridge.py +13 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/host.py +216 -56
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/permissions.py +114 -4
- noah_code-0.4.0/src/noah_code/predict.py +37 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/sessions.py +18 -3
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/snapshots.py +23 -6
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/steer.py +1 -1
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/summarization.py +6 -2
- noah_code-0.4.0/src/noah_code/telemetry.py +801 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tool_output.py +16 -9
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/git_tools.py +25 -8
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/github_tools.py +51 -5
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/lsp_tools.py +77 -30
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/process_tools.py +282 -27
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/question_tools.py +19 -4
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/task_tools.py +164 -8
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/web_tools.py +49 -11
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/workspace_tools.py +10 -1
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/console.py +2 -1
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/textual.css +52 -3
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/textual_app.py +214 -5
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/updates.py +74 -19
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/usage.py +58 -6
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/worktree.py +10 -3
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_agent_security.py +6 -4
- noah_code-0.4.0/tests/test_approvals.py +113 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_budget.py +43 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_cache_context.py +101 -1
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_cli.py +56 -3
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_config.py +23 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_console_ui.py +12 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_event_bridge.py +50 -4
- noah_code-0.4.0/tests/test_git_tools.py +270 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_github.py +52 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_host.py +224 -5
- noah_code-0.4.0/tests/test_lsp_tools.py +262 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_permissions.py +108 -0
- noah_code-0.4.0/tests/test_process_tools.py +454 -0
- noah_code-0.4.0/tests/test_prompt_scorecard.py +232 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_question_tools.py +57 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_sessions.py +63 -0
- noah_code-0.4.0/tests/test_snapshots.py +377 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_steer.py +1 -1
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_task_tools.py +72 -0
- noah_code-0.4.0/tests/test_telemetry.py +217 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_textual_tui.py +82 -4
- noah_code-0.4.0/tests/test_tool_output.py +192 -0
- noah_code-0.4.0/tests/test_updates.py +399 -0
- noah_code-0.4.0/tests/test_web_tools.py +565 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_workspace_tools.py +25 -0
- noah_code-0.4.0/tests/test_worktree.py +356 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/uv.lock +72 -1
- noah_code-0.2.4/tests/test_approvals.py +0 -54
- noah_code-0.2.4/tests/test_git_tools.py +0 -107
- noah_code-0.2.4/tests/test_lsp_tools.py +0 -90
- noah_code-0.2.4/tests/test_process_tools.py +0 -195
- noah_code-0.2.4/tests/test_snapshots.py +0 -99
- noah_code-0.2.4/tests/test_updates.py +0 -102
- noah_code-0.2.4/tests/test_web_tools.py +0 -166
- noah_code-0.2.4/tests/test_worktree.py +0 -92
- {noah_code-0.2.4 → noah_code-0.4.0}/.github/workflows/ci.yml +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/.github/workflows/release.yml +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/.gitignore +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/.pre-commit-config.yaml +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/assets/noah-in-action.svg +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/assets/noah-logo.svg +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.1.0.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.1.1.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.0.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.1.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.2.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.3.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.4.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/reliability.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/docs/security.md +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/install.sh +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/__main__.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/agents.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/checkpoints.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/composer.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/credentials.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/custom_commands.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/events.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/github.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/hooks.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/llm.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/llm_replies.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/macos_sandbox.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/mcp_setup.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/nooa_compat.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/project_notes.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/providers.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/redaction.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/runtime_state.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/secure_files.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/skills_setup.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/themes.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/__init__.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/diff_tools.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/media_tools.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/memory_tools.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/plan_tools.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/__init__.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/protocol.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/workspace.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/conftest.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_agents.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_checkpoints.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_compaction_eviction.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_composer.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_credentials.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_custom_commands.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_diff_tools.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_efficiency.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_event_bridge_and_shell.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_hooks.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_installer.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_llm.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_llm_replies.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_mcp_setup.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_plan_memory_tools.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_project_notes.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_providers.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_redaction.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_run_exit.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_runtime_state.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_skills_setup.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_summarization.py +0 -0
- {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_wave1_e2e.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
|
|
@@ -40,6 +40,7 @@ Provides-Extra: mcp
|
|
|
40
40
|
Requires-Dist: nooa[mcp]==0.0.9; extra == 'mcp'
|
|
41
41
|
Provides-Extra: tracing
|
|
42
42
|
Requires-Dist: nooa[tracing]==0.0.9; extra == 'tracing'
|
|
43
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.44.0; extra == 'tracing'
|
|
43
44
|
Description-Content-Type: text/markdown
|
|
44
45
|
|
|
45
46
|
<div align="center">
|
|
@@ -100,8 +101,9 @@ configuration or session history.
|
|
|
100
101
|
- **Persistent sessions.** Resume repository-scoped conversations, steering, todos, model choices,
|
|
101
102
|
budgets, background-job logs, and compacted context without losing full tool results.
|
|
102
103
|
- **Token-efficient by construction.** Lean tool-output bounds with disk-backed recall, condensed
|
|
103
|
-
subagent results, cache-stable request prefixes (volatile status
|
|
104
|
-
|
|
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`.
|
|
105
107
|
- **Explicit control.** Switch between implementation-focused **build** mode and read-only
|
|
106
108
|
**plan** mode, with ordered `allow`, `ask`, and `deny` permission rules.
|
|
107
109
|
- **Extensible workflows.** Add slash commands, opt-in skills, MCP servers, or markdown subagents;
|
|
@@ -172,6 +174,7 @@ Type `/` to search the full command and configuration reference. The most common
|
|
|
172
174
|
| `Tab` | Switch between build and plan mode |
|
|
173
175
|
| `F2` | Open execution activity |
|
|
174
176
|
| `F3` | Open paginated conversation history |
|
|
177
|
+
| `F4` | Open the live agent, terminal, and job ledger |
|
|
175
178
|
| `/model` | Configure a provider or switch the session model |
|
|
176
179
|
| `/theme` | Choose Atom One Dark, Noah Ocean, Graphite, or High Contrast |
|
|
177
180
|
| `/diff` | Review staged and unstaged changes |
|
|
@@ -181,8 +184,8 @@ Type `/` to search the full command and configuration reference. The most common
|
|
|
181
184
|
| `/tokens` | Inspect tokens, cache usage, prefix stability, model wait, and tool output |
|
|
182
185
|
| `/efficiency` | Switch between `fast`, `balanced`, and `deep` budgets |
|
|
183
186
|
|
|
184
|
-
On wide terminals, the side rail prioritizes the active operation,
|
|
185
|
-
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
|
|
186
189
|
boundaries, so the animated working state stays responsive. The main pane remains centered on the
|
|
187
190
|
large Noah wordmark until the first prompt, then becomes the conversation and execution timeline.
|
|
188
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
|
|
@@ -179,8 +181,19 @@ target_chars = 2500
|
|
|
179
181
|
|
|
180
182
|
[tracing]
|
|
181
183
|
enabled = true
|
|
182
|
-
#
|
|
184
|
+
# Local traces remain available without a collector.
|
|
185
|
+
jsonl_enabled = true
|
|
183
186
|
# jsonl_dir = "~/.local/share/noah-code/traces"
|
|
187
|
+
# Send traces, metrics, and structured logs over OTLP/HTTP.
|
|
188
|
+
# otlp_endpoint = "http://localhost:4318"
|
|
189
|
+
logs_enabled = true
|
|
190
|
+
metrics_enabled = true
|
|
191
|
+
# Sensitive agent content is excluded unless explicitly opted in.
|
|
192
|
+
capture_content = false
|
|
193
|
+
max_span_attributes = 256
|
|
194
|
+
max_attribute_length = 4096
|
|
195
|
+
metric_export_interval_millis = 30000
|
|
196
|
+
export_timeout_millis = 5000
|
|
184
197
|
|
|
185
198
|
[updates]
|
|
186
199
|
auto_install = false
|
|
@@ -199,6 +212,12 @@ Supported environment overrides include:
|
|
|
199
212
|
- `NOAH_CODE_UNSAFE_INPROCESS`
|
|
200
213
|
- `NOAH_CODE_AUTO_UPDATE`
|
|
201
214
|
|
|
215
|
+
OpenTelemetry's standard environment variables are also honored. In particular,
|
|
216
|
+
`OTEL_EXPORTER_OTLP_ENDPOINT` enables remote traces, metrics, and logs without storing an endpoint
|
|
217
|
+
in Noah configuration. Signal-specific endpoint variables and `OTEL_EXPORTER_OTLP_HEADERS` are
|
|
218
|
+
supported by the OTLP exporters; keep authentication headers in the environment or a collector
|
|
219
|
+
secret store rather than TOML.
|
|
220
|
+
|
|
202
221
|
Repository-controlled configuration cannot weaken the host trust boundary. Project config is
|
|
203
222
|
ignored for `auto_approve`, `budget`, `efficiency`, `enabled_skills`, `hooks`, `lsp`, `mcp`,
|
|
204
223
|
`permission_rules`, `processes`, `reliability`, `session_dir`, `tracing`, `updates`, and
|
|
@@ -272,8 +291,25 @@ fallback cache used when workspace tools are embedded without a durable session
|
|
|
272
291
|
|
|
273
292
|
Set `lightweight_model` to route compaction to a faster or cheaper model. If it is omitted, that
|
|
274
293
|
route follows live `/model` switches. Compaction starts at 35% of the active main model's context
|
|
275
|
-
window by default, preserves the six newest
|
|
276
|
-
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.
|
|
277
313
|
|
|
278
314
|
### Budgets, checkpoints, and reliability
|
|
279
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
|
|
|
@@ -149,8 +154,47 @@ local executables; define them only in `~/.config/noah-code/config.toml`.
|
|
|
149
154
|
|
|
150
155
|
## Tracing
|
|
151
156
|
|
|
152
|
-
Noah Code
|
|
153
|
-
|
|
154
|
-
`tracing.jsonl_dir` selects another trusted location.
|
|
155
|
-
`/
|
|
156
|
-
session-storage quota when they use the default
|
|
157
|
+
Noah Code emits OpenTelemetry traces for the complete agent invocation and NOOA/OpenInference child
|
|
158
|
+
spans for model generations and tool execution. Local JSONL traces are enabled by default and go
|
|
159
|
+
into the active session directory unless `tracing.jsonl_dir` selects another trusted location.
|
|
160
|
+
Use `/trace` to inspect active destinations and `/health` to inspect bounded runtime-event and
|
|
161
|
+
artifact state. Trace files count toward the session-storage quota when they use the default path.
|
|
162
|
+
|
|
163
|
+
Set an OTLP/HTTP collector endpoint to additionally export batched traces, metrics, and structured
|
|
164
|
+
logs:
|
|
165
|
+
|
|
166
|
+
```toml
|
|
167
|
+
[tracing]
|
|
168
|
+
otlp_endpoint = "http://localhost:4318"
|
|
169
|
+
logs_enabled = true
|
|
170
|
+
metrics_enabled = true
|
|
171
|
+
capture_content = false
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Install the `tracing` extra when Noah was installed without the standard installer. Configured
|
|
175
|
+
remote endpoints must use HTTPS; plain HTTP is accepted only for a loopback collector.
|
|
176
|
+
|
|
177
|
+
Or use standard OpenTelemetry environment configuration:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
|
|
181
|
+
export OTEL_EXPORTER_OTLP_HEADERS='authorization=Bearer%20...'
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Operational telemetry includes agent/LLM/tool duration, token usage, cached and reasoning token
|
|
185
|
+
counts, estimated cost, retries, outcomes, model/provider names, and trace-correlated lifecycle
|
|
186
|
+
events. Metric labels deliberately exclude session IDs, run IDs, workspace paths, prompts, and tool
|
|
187
|
+
targets to avoid high-cardinality series.
|
|
188
|
+
|
|
189
|
+
Content capture is off by default. Prompt and response messages, reasoning, generated code, tool
|
|
190
|
+
arguments/results, exception messages, stack traces, and file contents are removed at the exporter
|
|
191
|
+
boundary. `capture_content = true` is intended only for controlled development environments; values
|
|
192
|
+
and span attribute counts remain bounded, and NOOA's secret scrubber still runs before export. For
|
|
193
|
+
production, keep content disabled and apply an allowlist/redaction processor in the collector as a
|
|
194
|
+
second boundary.
|
|
195
|
+
|
|
196
|
+
The emitted standard instruments include `gen_ai.invoke_agent.duration`,
|
|
197
|
+
`gen_ai.client.operation.duration`, and `gen_ai.client.token.usage`. Noah-specific instruments cover
|
|
198
|
+
estimated cost, retries, and tool execution counts/duration. Export is best-effort and batched;
|
|
199
|
+
collector failure never blocks or fails an agent turn, and providers are flushed during orderly
|
|
200
|
+
shutdown.
|
|
@@ -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,75 @@
|
|
|
1
|
+
# Noah Code v0.3.0
|
|
2
|
+
|
|
3
|
+
This release adds production-grade OpenTelemetry observability, more control over long-running
|
|
4
|
+
agents, and a broad hardening pass across permissions, updates, sessions, worktrees, language
|
|
5
|
+
servers, and persisted tool state.
|
|
6
|
+
|
|
7
|
+
## Observability
|
|
8
|
+
|
|
9
|
+
- Added privacy-first OpenTelemetry support for the complete agent lifecycle, with OTLP/HTTP
|
|
10
|
+
export of traces, metrics, and structured logs alongside the existing local JSONL traces.
|
|
11
|
+
- Added standard GenAI instruments for agent and model duration and token usage, plus Noah-specific
|
|
12
|
+
cost, retry, and tool-execution metrics with deliberately low-cardinality labels.
|
|
13
|
+
- Content capture remains off by default. Exporters strip prompts, responses, reasoning, tool
|
|
14
|
+
arguments and results, exception details, host identity, and repository metadata unless content
|
|
15
|
+
capture is explicitly enabled; exported values and attribute counts remain bounded.
|
|
16
|
+
- Added secure collector configuration through `[tracing]` and standard OpenTelemetry environment
|
|
17
|
+
variables. Remote collectors require HTTPS, while plain HTTP remains available for loopback
|
|
18
|
+
development collectors.
|
|
19
|
+
|
|
20
|
+
## Agent controls and permissions
|
|
21
|
+
|
|
22
|
+
- Added `--max-iterations` and `NOAH_CODE_MAX_ITERATIONS` so larger or slower models can be given a
|
|
23
|
+
higher per-request tool-call budget than the default of 40.
|
|
24
|
+
- Added an explicit `--yolo` mode and matching configuration option for fully unrestricted local
|
|
25
|
+
operation. This bypasses every permission check, including secret, plan-mode, and destructive
|
|
26
|
+
command protections, and should only be used in an appropriately isolated environment.
|
|
27
|
+
- Added `run(..., read_only=True)` for trusted execution of whitelisted inspection commands inside
|
|
28
|
+
the sandbox.
|
|
29
|
+
- Read-only pipelines such as `git show | sed` and `rg | sort | wc` are now recognized when every
|
|
30
|
+
segment is independently read-only. Stream discards to `/dev/null` are also accepted without
|
|
31
|
+
weakening protections for file redirection or control-flow chains.
|
|
32
|
+
- Repaired disk-destruction deny rules so raw device writes are rejected correctly, and placed
|
|
33
|
+
ordinary `dd` use on the elevated-risk approval floor.
|
|
34
|
+
- Closed a concurrent approval race that could show duplicate prompts or miss a newly registered
|
|
35
|
+
session rule.
|
|
36
|
+
|
|
37
|
+
## Reliability and correctness
|
|
38
|
+
|
|
39
|
+
- Hardened language-server lifecycle management against timeout races, dead readers, failed
|
|
40
|
+
startup, and zombie processes; stale servers are now terminated and reaped before restart.
|
|
41
|
+
- Host shutdown now completes all teardown steps even under cancellation, and session switches
|
|
42
|
+
validate their targets before releasing the active session.
|
|
43
|
+
- Damaged session metadata and partially corrupted undo/redo journals now degrade to clear recovery
|
|
44
|
+
errors or skip only the affected records instead of crashing startup.
|
|
45
|
+
- Managed tool output is published atomically by content hash, with clean recovery from disk-full
|
|
46
|
+
and concurrent-writer races.
|
|
47
|
+
- Durable background-process log rotation now preserves the latest output line even when the final
|
|
48
|
+
pipe read contains only a small trailing fragment.
|
|
49
|
+
- Auto-update state paths, network reads, and version parsing are hardened, and a stale-aware lock
|
|
50
|
+
prevents concurrent processes from running duplicate upgrades.
|
|
51
|
+
- Orphaned worktrees whose directories were removed outside Noah can now be pruned and cleaned up.
|
|
52
|
+
- Git and GitHub helpers now turn missing binaries, timeouts, authentication failures, and network
|
|
53
|
+
failures into actionable user-facing errors.
|
|
54
|
+
- Fixed question timeout and background-process stdin races, bounded HTTP 429 retries using
|
|
55
|
+
`Retry-After`, and excluded skipped HTML blocks such as `noscript` from fetched page text.
|
|
56
|
+
- Non-finite cost and token reports can no longer disable budget enforcement or crash accounting.
|
|
57
|
+
|
|
58
|
+
## Agent guidance and tests
|
|
59
|
+
|
|
60
|
+
- Refined the model-facing tool guidance for synchronous messages, `return_result`, safe read-only
|
|
61
|
+
execution, forbidden imports, edit arguments, and iteration-limit recovery to avoid wasted turns.
|
|
62
|
+
- Expanded coverage across permissions, web transport, updates, snapshots, tool output, worktrees,
|
|
63
|
+
process jobs, Git, GitHub, sessions, LSP lifecycle, budgets, and host teardown.
|
|
64
|
+
|
|
65
|
+
## Upgrade
|
|
66
|
+
|
|
67
|
+
Existing managed installations can run:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
noah update
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
New installations can use the one-command installer from the README.
|
|
74
|
+
|
|
75
|
+
**Full changelog:** https://github.com/skundu42/noah-code/compare/v0.2.4...v0.3.0
|
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "noah-code"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.0"
|
|
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"
|
|
@@ -57,6 +57,7 @@ mcp = [
|
|
|
57
57
|
]
|
|
58
58
|
tracing = [
|
|
59
59
|
"nooa[tracing]==0.0.9",
|
|
60
|
+
"opentelemetry-exporter-otlp-proto-http>=1.44.0,<2.0.0",
|
|
60
61
|
]
|
|
61
62
|
|
|
62
63
|
[project.scripts]
|