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.
Files changed (145) hide show
  1. {noah_code-0.2.4 → noah_code-0.4.0}/PKG-INFO +8 -5
  2. {noah_code-0.2.4 → noah_code-0.4.0}/README.md +6 -4
  3. {noah_code-0.2.4 → noah_code-0.4.0}/docs/configuration.md +40 -4
  4. {noah_code-0.2.4 → noah_code-0.4.0}/docs/development.md +12 -0
  5. {noah_code-0.2.4 → noah_code-0.4.0}/docs/extensions.md +49 -5
  6. {noah_code-0.2.4 → noah_code-0.4.0}/docs/interactive-reference.md +15 -1
  7. noah_code-0.4.0/docs/releases/v0.3.0.md +75 -0
  8. noah_code-0.4.0/docs/releases/v0.4.0.md +61 -0
  9. {noah_code-0.2.4 → noah_code-0.4.0}/pyproject.toml +2 -1
  10. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/__init__.py +1 -1
  11. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/agent.py +239 -125
  12. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/approvals.py +22 -10
  13. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/budget.py +50 -18
  14. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/cli.py +55 -11
  15. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/commands.py +2 -0
  16. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/config.py +35 -0
  17. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/event_bridge.py +13 -0
  18. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/host.py +216 -56
  19. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/permissions.py +114 -4
  20. noah_code-0.4.0/src/noah_code/predict.py +37 -0
  21. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/sessions.py +18 -3
  22. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/snapshots.py +23 -6
  23. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/steer.py +1 -1
  24. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/summarization.py +6 -2
  25. noah_code-0.4.0/src/noah_code/telemetry.py +801 -0
  26. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tool_output.py +16 -9
  27. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/git_tools.py +25 -8
  28. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/github_tools.py +51 -5
  29. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/lsp_tools.py +77 -30
  30. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/process_tools.py +282 -27
  31. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/question_tools.py +19 -4
  32. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/task_tools.py +164 -8
  33. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/web_tools.py +49 -11
  34. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/workspace_tools.py +10 -1
  35. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/console.py +2 -1
  36. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/textual.css +52 -3
  37. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/textual_app.py +214 -5
  38. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/updates.py +74 -19
  39. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/usage.py +58 -6
  40. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/worktree.py +10 -3
  41. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_agent_security.py +6 -4
  42. noah_code-0.4.0/tests/test_approvals.py +113 -0
  43. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_budget.py +43 -0
  44. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_cache_context.py +101 -1
  45. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_cli.py +56 -3
  46. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_config.py +23 -0
  47. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_console_ui.py +12 -0
  48. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_event_bridge.py +50 -4
  49. noah_code-0.4.0/tests/test_git_tools.py +270 -0
  50. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_github.py +52 -0
  51. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_host.py +224 -5
  52. noah_code-0.4.0/tests/test_lsp_tools.py +262 -0
  53. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_permissions.py +108 -0
  54. noah_code-0.4.0/tests/test_process_tools.py +454 -0
  55. noah_code-0.4.0/tests/test_prompt_scorecard.py +232 -0
  56. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_question_tools.py +57 -0
  57. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_sessions.py +63 -0
  58. noah_code-0.4.0/tests/test_snapshots.py +377 -0
  59. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_steer.py +1 -1
  60. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_task_tools.py +72 -0
  61. noah_code-0.4.0/tests/test_telemetry.py +217 -0
  62. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_textual_tui.py +82 -4
  63. noah_code-0.4.0/tests/test_tool_output.py +192 -0
  64. noah_code-0.4.0/tests/test_updates.py +399 -0
  65. noah_code-0.4.0/tests/test_web_tools.py +565 -0
  66. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_workspace_tools.py +25 -0
  67. noah_code-0.4.0/tests/test_worktree.py +356 -0
  68. {noah_code-0.2.4 → noah_code-0.4.0}/uv.lock +72 -1
  69. noah_code-0.2.4/tests/test_approvals.py +0 -54
  70. noah_code-0.2.4/tests/test_git_tools.py +0 -107
  71. noah_code-0.2.4/tests/test_lsp_tools.py +0 -90
  72. noah_code-0.2.4/tests/test_process_tools.py +0 -195
  73. noah_code-0.2.4/tests/test_snapshots.py +0 -99
  74. noah_code-0.2.4/tests/test_updates.py +0 -102
  75. noah_code-0.2.4/tests/test_web_tools.py +0 -166
  76. noah_code-0.2.4/tests/test_worktree.py +0 -92
  77. {noah_code-0.2.4 → noah_code-0.4.0}/.github/workflows/ci.yml +0 -0
  78. {noah_code-0.2.4 → noah_code-0.4.0}/.github/workflows/release.yml +0 -0
  79. {noah_code-0.2.4 → noah_code-0.4.0}/.gitignore +0 -0
  80. {noah_code-0.2.4 → noah_code-0.4.0}/.pre-commit-config.yaml +0 -0
  81. {noah_code-0.2.4 → noah_code-0.4.0}/docs/assets/noah-in-action.svg +0 -0
  82. {noah_code-0.2.4 → noah_code-0.4.0}/docs/assets/noah-logo.svg +0 -0
  83. {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.1.0.md +0 -0
  84. {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.1.1.md +0 -0
  85. {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.0.md +0 -0
  86. {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.1.md +0 -0
  87. {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.2.md +0 -0
  88. {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.3.md +0 -0
  89. {noah_code-0.2.4 → noah_code-0.4.0}/docs/releases/v0.2.4.md +0 -0
  90. {noah_code-0.2.4 → noah_code-0.4.0}/docs/reliability.md +0 -0
  91. {noah_code-0.2.4 → noah_code-0.4.0}/docs/security.md +0 -0
  92. {noah_code-0.2.4 → noah_code-0.4.0}/install.sh +0 -0
  93. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/__main__.py +0 -0
  94. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/agents.py +0 -0
  95. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/checkpoints.py +0 -0
  96. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/composer.py +0 -0
  97. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/credentials.py +0 -0
  98. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/custom_commands.py +0 -0
  99. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/events.py +0 -0
  100. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/github.py +0 -0
  101. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/hooks.py +0 -0
  102. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/llm.py +0 -0
  103. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/llm_replies.py +0 -0
  104. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/macos_sandbox.py +0 -0
  105. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/mcp_setup.py +0 -0
  106. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/nooa_compat.py +0 -0
  107. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/project_notes.py +0 -0
  108. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/providers.py +0 -0
  109. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/redaction.py +0 -0
  110. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/runtime_state.py +0 -0
  111. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/secure_files.py +0 -0
  112. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/skills_setup.py +0 -0
  113. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/themes.py +0 -0
  114. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/__init__.py +0 -0
  115. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/diff_tools.py +0 -0
  116. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/media_tools.py +0 -0
  117. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/memory_tools.py +0 -0
  118. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/tools/plan_tools.py +0 -0
  119. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/__init__.py +0 -0
  120. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/ui/protocol.py +0 -0
  121. {noah_code-0.2.4 → noah_code-0.4.0}/src/noah_code/workspace.py +0 -0
  122. {noah_code-0.2.4 → noah_code-0.4.0}/tests/conftest.py +0 -0
  123. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_agents.py +0 -0
  124. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_checkpoints.py +0 -0
  125. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_compaction_eviction.py +0 -0
  126. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_composer.py +0 -0
  127. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_credentials.py +0 -0
  128. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_custom_commands.py +0 -0
  129. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_diff_tools.py +0 -0
  130. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_efficiency.py +0 -0
  131. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_event_bridge_and_shell.py +0 -0
  132. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_hooks.py +0 -0
  133. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_installer.py +0 -0
  134. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_llm.py +0 -0
  135. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_llm_replies.py +0 -0
  136. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_mcp_setup.py +0 -0
  137. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_plan_memory_tools.py +0 -0
  138. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_project_notes.py +0 -0
  139. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_providers.py +0 -0
  140. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_redaction.py +0 -0
  141. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_run_exit.py +0 -0
  142. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_runtime_state.py +0 -0
  143. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_skills_setup.py +0 -0
  144. {noah_code-0.2.4 → noah_code-0.4.0}/tests/test_summarization.py +0 -0
  145. {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.2.4
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 arrives as appended events),
104
- 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`.
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, Git branch and change counts,
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 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
@@ -179,8 +181,19 @@ target_chars = 2500
179
181
 
180
182
  [tracing]
181
183
  enabled = true
182
- # By default JSONL traces live inside each session directory.
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 events, and writes a coding checkpoint covering the
276
- 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.
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 integrates with NOOA tracing. Tracing is enabled by default, and JSONL output goes into
153
- the active session directory unless
154
- `tracing.jsonl_dir` selects another trusted location. Use `/trace` to inspect the destination and
155
- `/health` to inspect bounded runtime-event and artifact state. Trace files count toward the total
156
- session-storage quota when they use the default location.
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.2.4"
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]
@@ -1,3 +1,3 @@
1
1
  """Noah Code: terminal coding agent on NVIDIA OO Agents."""
2
2
 
3
- __version__ = "0.2.4"
3
+ __version__ = "0.4.0"