nooa-acp 0.0.10__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.
@@ -0,0 +1,406 @@
1
+ # Rust toolchain (installed for nemo_relay PyO3 build)
2
+ .cargo/
3
+ .rustup/
4
+
5
+ # Node.js dependencies (never commit)
6
+ node_modules/
7
+
8
+ # Byte-compiled / optimized / DLL files
9
+ __pycache__/
10
+ *.py[cod]
11
+ *$py.class
12
+
13
+ # C extensions
14
+ *.so
15
+
16
+ # Distribution / packaging
17
+ .Python
18
+ build/
19
+ develop-eggs/
20
+ dist/
21
+ !packages/nemo-oo-agents-viewer/frontend-react/dist/
22
+ !src/nooa/viewer/frontend-react/dist/
23
+ downloads/
24
+ eggs/
25
+ .eggs/
26
+ lib/
27
+ lib64/
28
+ # Exception: allow util/*/lib/ directories (our code, not build artifacts)
29
+ !util/*/lib/
30
+ !util/**/lib/
31
+ parts/
32
+ sdist/
33
+ var/
34
+ wheels/
35
+ pip-wheel-metadata/
36
+ share/python-wheels/
37
+ *.egg-info/
38
+ .installed.cfg
39
+ *.egg
40
+ MANIFEST
41
+
42
+ # PyInstaller
43
+ # Usually these files are written by a python script from a template
44
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
45
+ *.manifest
46
+ *.spec
47
+
48
+ # Installer logs
49
+ pip-log.txt
50
+ pip-delete-this-directory.txt
51
+
52
+ # Unit test / coverage reports
53
+ htmlcov/
54
+ .tox/
55
+ .nox/
56
+ .coverage
57
+ .coverage.*
58
+ .cache
59
+ nosetests.xml
60
+ coverage.xml
61
+ *.cover
62
+ *.py,cover
63
+ .hypothesis/
64
+ .pytest_cache/
65
+
66
+ # Translations
67
+ *.mo
68
+ *.pot
69
+
70
+ # Django stuff:
71
+ *.log
72
+ local_settings.py
73
+ db.sqlite3
74
+ db.sqlite3-journal
75
+
76
+ # Flask stuff:
77
+ instance/
78
+ .webassets-cache
79
+
80
+ # Scrapy stuff:
81
+ .scrapy
82
+
83
+ # Sphinx documentation
84
+ docs/_build/
85
+
86
+ # PyBuilder
87
+ target/
88
+
89
+ # Jupyter Notebook
90
+ .ipynb_checkpoints
91
+
92
+ # IPython
93
+ profile_default/
94
+ ipython_config.py
95
+
96
+ # pyenv
97
+ .python-version
98
+
99
+ # pipenv
100
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
101
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
102
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
103
+ # install all needed dependencies.
104
+ #Pipfile.lock
105
+
106
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
107
+ __pypackages__/
108
+
109
+ # Celery stuff
110
+ celerybeat-schedule
111
+ celerybeat.pid
112
+
113
+ # SageMath parsed files
114
+ *.sage.py
115
+
116
+ # Environments
117
+ .env
118
+ .env.*
119
+ !.env.example
120
+ !.env.template
121
+ .venv
122
+ .venv-macos
123
+ env/
124
+ venv/
125
+ ENV/
126
+ env.bak/
127
+ venv.bak/
128
+
129
+ # uv cache directory
130
+ .uv-cache/
131
+
132
+ # Spyder project settings
133
+ .spyderproject
134
+ .spyproject
135
+
136
+ # Rope project settings
137
+ .ropeproject
138
+
139
+ # mkdocs documentation
140
+ /site
141
+
142
+ # mypy
143
+ .mypy_cache/
144
+ .dmypy.json
145
+ dmypy.json
146
+
147
+ # Pyre type checker
148
+ .pyre/
149
+
150
+ # IDEs
151
+ .vscode/*
152
+ .vscode-server/*
153
+ .idea/*
154
+ *.swp
155
+ *.swo
156
+
157
+ # OS
158
+ .DS_Store
159
+ Thumbs.db
160
+
161
+ # Temporal
162
+ temporal/
163
+ .temporal/
164
+
165
+ # Custom
166
+ secrets.env
167
+ local_config.yaml
168
+
169
+ # Security: JWT tokens and API keys
170
+ **/test-nvauth.py
171
+ **/debug-auth*.py
172
+ # JWT token patterns (eyJ...)
173
+ eyJ*
174
+
175
+ # Third-party dependencies
176
+ 3P/
177
+ 3p/
178
+
179
+ # Trash folder for temporary files
180
+ trash/
181
+
182
+ # Tools directory (generated traces) - only root level
183
+ /tools/
184
+
185
+ # Agent trace files and results (root level)
186
+ /trace/
187
+ /traces/
188
+ /results/
189
+ trace*.json
190
+ !trace_viewer_config.json
191
+ /tmp/
192
+
193
+ # NVIDIA OO Agents generated trace and evaluation files (anywhere)
194
+ *.noo-eval.jsonl
195
+ *.006summary.json
196
+ # Exception: Allow trace fixtures for testing/eval
197
+ !evaluation/fixtures/**/*.noo-eval.jsonl
198
+
199
+ # Interface output markdown (experiment results)
200
+ docs/interface_output/
201
+
202
+ # Trace viewer config backups
203
+ **/trace_viewer_config.json.backup
204
+
205
+ # Local config overrides (user-specific, not tracked)
206
+ **/*.local.json
207
+
208
+ # Bridge watchpoint file (runtime job monitoring, not tracked)
209
+ .bridge_watch.json
210
+
211
+ # Slurm job output files (runtime artifacts, not tracked)
212
+ *.err
213
+ *.out
214
+
215
+ # Cursor IDE rules (keep local but don't track)
216
+ .cursorrules
217
+
218
+ # PDFs
219
+ *.pdf
220
+ packages/.venv/
221
+
222
+ # Experimental implementations (on experimental-implementations branch)
223
+ composer-packages/
224
+ gpt-packages/
225
+ trace_tui/
226
+ NEW_AGENT_TUI.md
227
+ RUN_NEW_AGENT_TUI.md
228
+ SETUP_QWEN_TUI.md
229
+ TUI_INTEGRATION_SUMMARY.md
230
+ run-new-tui.sh
231
+ test-tui-debug.py
232
+ test-tui.sh
233
+ scratch/ALIGNMENT_SUMMARY.md
234
+ scratch/DESIGN_ALIGNMENT_REPORT.md
235
+ packages/nemo_oo_agents-core/src/nemo_oo_agents/cli.py
236
+ packages/nemo_oo_agents-tui/src/nemo_oo_agents_tui/cli.py
237
+
238
+ # Prompt optimization experiment results
239
+ util/prompt-optimization/results/*.json
240
+ util/prompt-optimization/results/*.jsonl
241
+ util/prompt-optimization/results/*/*.json
242
+ util/prompt-optimization/results/*/*.jsonl
243
+ util/prompt-optimization/traces/
244
+ util/prompt-optimization/traces_test/
245
+
246
+ # Eval pipeline experiments and data
247
+ util/e2e_optimization/experiments/
248
+ util/e2e_optimization/src/e2e_optimization/examples/**/*.jsonl
249
+ util/e2e_optimization/src/e2e_optimization/examples/**/results/
250
+ # Exception: allow data_*.jsonl (test datasets)
251
+ !util/e2e_optimization/src/e2e_optimization/examples/**/data_*.jsonl
252
+ util/eval_pipeline/experiments/
253
+
254
+ # Experiment test result directories
255
+ experiments/tau_bench_test*/
256
+ experiments/**/results/
257
+
258
+ traces.db
259
+ traces.db-wal
260
+ traces.db-shm
261
+ # Large result files
262
+ experiments/**/results/
263
+
264
+ # Test files
265
+ test_arxiv_fetch.py
266
+ trigger_librarian_fetch.py
267
+ experiments/evaluation-ablations/*.db
268
+ experiments/evaluation-ablations/test_case_*/
269
+ experiments/evaluation-ablations/test.csv
270
+ experiments/evaluation-ablations/test.json
271
+ agents/**/traces/
272
+
273
+ # Claude Code settings (user-specific)
274
+ .claude/settings.json
275
+
276
+ # Claude Code runtime directories (cache, sessions, IDE state, plugins, skills)
277
+ .claude/backups/
278
+ .claude/history.jsonl
279
+ .claude/cache/
280
+ .claude/file-history/
281
+ .claude/ide/
282
+ .claude/plugins/
283
+ .claude/policy-limits.json
284
+ .claude/projects/
285
+ .claude/sessions/
286
+ .claude/shell-snapshots/
287
+ .claude.json
288
+
289
+ # Agent runtime directory
290
+ .agents/
291
+
292
+ # Shell history
293
+ .bash_history
294
+
295
+ # User-level XDG config/local dirs (injected by sandbox/environment)
296
+ .config/
297
+ .local/
298
+
299
+ # Rust toolchain (installed by rustup for nemo-relay build)
300
+ .cargo/
301
+ .rustup/
302
+
303
+ # VS Code Server (remote development runtime)
304
+ .vscode-server/
305
+
306
+ debug_http_logs/
307
+
308
+ # SWE-bench evaluation logs (generated during test runs)
309
+ **/logs/run_evaluation/
310
+
311
+ # Trace analyzer batch results
312
+ **/analysis_batch/
313
+
314
+ # Claude Code local settings (personal, not shared)
315
+ .claude/settings.local.json
316
+ .claude/agents
317
+
318
+ # Claude Code sandbox artifacts (created at runtime, not project files)
319
+ .srt-settings.json
320
+ # Debug handler dumps (written to cwd on SIGUSR2)
321
+ debug_dump_*.txt
322
+ # NeMo OO project directory (libraries, traces, config)
323
+ .nemo_oo/
324
+ .nooa/
325
+ .nemo_oo_agents/
326
+ # Shell config stubs (empty read-only files injected by sandbox)
327
+ .zshrc
328
+ .zprofile
329
+ .bash_profile
330
+ .bashrc
331
+ .profile
332
+ .gitconfig
333
+ .ripgreprc
334
+ .idea
335
+ .vscode
336
+ # Git internal stubs (root-level sandbox artifacts only)
337
+ /HEAD
338
+ /config
339
+ /hooks
340
+ /objects
341
+ /refs
342
+ # pytest temp directories
343
+ pytest-of-*/
344
+ experiments/evaluation-ablations/task_temp/
345
+
346
+ # DABStep experiment outputs (top-level scratch directory)
347
+ /dabstep/
348
+
349
+ # Harbor generated task directories (regenerated via `harbor adapter run`)
350
+ util/harbor/tasks/
351
+
352
+ # OpenSkills workspace files
353
+ .openskills/
354
+
355
+ # Local lockfile
356
+ prpm.lock
357
+
358
+ # Git worktrees
359
+ .worktrees/
360
+ worktrees/
361
+
362
+ # Bridge session ID file — written by slack bridge into each agent worktree root
363
+ .claude_session_id
364
+
365
+ sft_data/**/*.jsonl
366
+
367
+ # Git credentials (must not be committed)
368
+ .git-credentials
369
+ # Bridge watchpoint file — per-worktree, never committed
370
+ .bridge_watch.json
371
+
372
+ .claude/backups
373
+ .claude/file-history
374
+ .claude/projects
375
+ .claude/shell-snapshots
376
+ .claude/telemetry
377
+ ./claude/sessions
378
+ ./claude/cache
379
+ ./claude/plugins
380
+
381
+ .local/
382
+ .config/
383
+ util/harbor/tasks/terminal_bench/
384
+
385
+ # WTF skills (generated by wtf install-skills)
386
+ .claude/skills/wtf*
387
+ tests/integration/fixtures/*.db
388
+ tests/integration/fixtures/*.lock
389
+
390
+ # Worktree directories
391
+ .wt-*
392
+
393
+ # Throwaway benchmark smoke-test configs
394
+ util/harbor/tb1_opus_smoke.yaml
395
+ util/harbor/tb1_ultra_smoke.yaml
396
+ .claude/scheduled_tasks.lock
397
+ .commit_msg
398
+
399
+ # LoCoMo benchmark data (downloaded on demand, not vendored)
400
+ examples/memory_bench/data/
401
+
402
+ # Local scratch/working files (never commit)
403
+ .scratch/
404
+
405
+ # Claude Code local session dir (never commit)
406
+ .claude/
@@ -0,0 +1,201 @@
1
+ Metadata-Version: 2.5
2
+ Name: nooa-acp
3
+ Version: 0.0.10
4
+ Summary: Agent Client Protocol adapter for the NOOA coding agent
5
+ Project-URL: Homepage, https://github.com/NVIDIA-NeMo/labs-OO-Agents
6
+ Project-URL: Repository, https://github.com/NVIDIA-NeMo/labs-OO-Agents
7
+ Project-URL: Issues, https://github.com/NVIDIA-NeMo/labs-OO-Agents/issues
8
+ License: Apache-2.0
9
+ Requires-Python: <3.14,>=3.12
10
+ Requires-Dist: agent-client-protocol<0.12,>=0.11
11
+ Requires-Dist: click>=8.1.0
12
+ Requires-Dist: litellm!=1.95.0
13
+ Requires-Dist: nooa-cli
14
+ Requires-Dist: nooa[mcp]
15
+ Description-Content-Type: text/markdown
16
+
17
+ # nooa-acp
18
+
19
+ **Run the NOOA coding agent inside your editor.** `nooa-acp` is an
20
+ [Agent Client Protocol](https://agentclientprotocol.com) server, so any
21
+ ACP-speaking client — Zed today — can drive the same agent the terminal host
22
+ uses: CodeAct, repository tools, a persistent shell, installed skills, workspace
23
+ slash commands and durable sessions, with file edits and terminal commands
24
+ surfaced as structured activity.
25
+
26
+ It hosts `nooa_cli.coding.CodingAgent` directly. Repository instructions
27
+ (`AGENTS.md`), coding tools, summarization, installed `nooa.skills` entry points
28
+ and semantic file and terminal activity therefore have no separate ACP
29
+ implementations — fix something here and the terminal host gets it too.
30
+
31
+ This is new and we would like it exercised. If something breaks, please say so.
32
+
33
+ ## Install
34
+
35
+ ```bash
36
+ uv add nooa-acp # or: uv add "nooa[acp]"
37
+ ```
38
+
39
+ There is no default model. Set `NOOA_MODEL` or pass `--model`, or the command
40
+ exits with a usage error.
41
+
42
+ ## Quick start: Zed
43
+
44
+ Zed launches ACP agents as "external agents". Add NOOA to `settings.json`
45
+ (`cmd-,`):
46
+
47
+ ```json
48
+ {
49
+ "agent_servers": {
50
+ "NOOA": {
51
+ "type": "custom",
52
+ "command": "uvx",
53
+ "args": ["nooa-acp"],
54
+ "env": {
55
+ "NOOA_MODEL": "nvidia_nim/nvidia/nemotron-3-super-120b-a12b",
56
+ "NVIDIA_API_KEY": "nvapi-..."
57
+ }
58
+ }
59
+ }
60
+ }
61
+ ```
62
+
63
+ Open a repository, then pick **NOOA** from the `+` menu in the agent panel. Zed
64
+ runs the command with your worktree as its working directory, so repository
65
+ instructions, project skills and sessions resolve against the open project.
66
+
67
+ Credentials go in `env` here rather than in Zed's own settings: the agent is a
68
+ separate process and inherits only what Zed passes it. Use a secret-manager
69
+ wrapper as the `command` if you would rather not put a key in `settings.json`.
70
+
71
+ From a checkout of this repository, point the client at the workspace package
72
+ instead:
73
+
74
+ ```bash
75
+ uv run --project "$PWD" --package nooa-acp -- nooa-acp
76
+ ```
77
+
78
+ ### MCP servers do not carry over from Zed
79
+
80
+ **Remote MCP servers you authenticated inside Zed are not usable from an ACP
81
+ agent.** Zed holds those OAuth tokens itself and does not pass them down, so a
82
+ server showing a green indicator in Zed's own UI arrives at the agent either
83
+ with no tools at all or with nothing but its `authenticate` /
84
+ `__complete_authentication` stubs. Local stdio MCP servers are unaffected.
85
+
86
+ This is a known Zed limitation, tracked in
87
+ [zed-industries/zed#54410](https://github.com/zed-industries/zed/issues/54410)
88
+ (open, labelled `area:ai/mcp` + `area:ai/acp`). A maintainer has said the
89
+ plumbing largely exists and the work is queued, but as of this writing it is
90
+ unresolved.
91
+
92
+ Configure the MCP server directly for NOOA instead — through NOOA's own
93
+ `.mcp.json` — and it works normally, because the agent then owns the
94
+ connection and its credentials rather than borrowing Zed's.
95
+
96
+ ## Launching the server yourself
97
+
98
+ ```bash
99
+ nooa-acp --model nvidia_nim/nvidia/nemotron-3-super-120b-a12b
100
+ ```
101
+
102
+ This is a JSON-RPC server, not an interactive program: it speaks ACP on
103
+ stdin/stdout and exits when its input closes, so running it in a terminal
104
+ without a client does nothing. Launch it this way to wire up an ACP client
105
+ other than Zed, or to watch the diagnostics it writes to stderr while a client
106
+ drives it. `--model` accepts any LiteLLM model name or configured NOOA alias.
107
+
108
+ ## Opening a repository runs code from it
109
+
110
+ **Creating a session imports Python from the workspace, before you send a
111
+ prompt.** This is deliberate — it is how workspace skills work — but it means
112
+ opening a folder is enough to execute code it contains. Treat opening a
113
+ repository with NOOA as equivalent to running its build.
114
+
115
+ Three paths load workspace code at `session/new` and `session/load`:
116
+
117
+ - **Skill roots.** Every `.py` file under `.agents/skills`, `.cursor/skills`,
118
+ `.claude/skills`, or `.claude/commands` is imported. Module-level code runs
119
+ during import, before anything checks whether the file defines a skill, so the
120
+ contents are irrelevant.
121
+ - **Workspace settings.** `<workspace>/.nooa/settings.yaml` and the legacy
122
+ `.nooa/config.toml` may name *additional* skill roots. Those paths are not
123
+ confined to the workspace: a relative path escaping it, an absolute path, or a
124
+ symlink is accepted as written.
125
+ - **Libraries.** `<workspace>/.nooa/libs/<package>/` is imported and its
126
+ directory is prepended to `sys.path` for the life of the process. One ACP
127
+ server serves several workspaces, so a package name there can shadow the same
128
+ import for later sessions on other workspaces.
129
+
130
+ The agent runs as you, in a process holding your model credentials. There is no
131
+ consent prompt on these paths.
132
+
133
+ **Open repositories you would run.** For anything else, use an OS-level sandbox,
134
+ or start a separate server per workspace with credentials scoped to that task.
135
+
136
+ ## How it behaves
137
+
138
+ ACP uses standard input and output for JSON-RPC. Diagnostics are written to
139
+ standard error. The agent can execute generated Python and shell commands, so
140
+ use an OS-level sandbox for untrusted tasks. Generated code shares the agent's
141
+ process environment, including model credentials; launch it with only the
142
+ credentials and network access that the session may use.
143
+ Cancellation stops cooperative local work immediately. An in-flight provider
144
+ request may finish in the background when its client does not support
145
+ transport-level aborts. Slash commands run on the agent's event loop so they
146
+ have the same semantics as the native TUI and can safely start agent jobs. An
147
+ async command is cooperatively cancellable; a synchronous command that blocks
148
+ that loop cannot be preempted by the current in-process adapter. The planned
149
+ one-process-per-agent boundary is the safe kill mechanism for that case.
150
+
151
+ ## Sessions and skills
152
+
153
+ Each ACP session has an independent live agent and allows one foreground prompt
154
+ at a time. Sessions are stored in `<workspace>/.nooa/sessions`, where the TUI
155
+ and ACP adapter can share list and replay metadata. These files are inside the
156
+ workspace trust boundary: a repository can supply session records that appear
157
+ in `session/list` and are replayed as conversation history by `session/load`.
158
+ Open only repositories whose code and conversation history you trust. The
159
+ adapter also advertises session close; closing a live session preserves its
160
+ durable history.
161
+
162
+ The current stdio adapter hosts those live agents in its own process. That is
163
+ an adapter-private implementation detail rather than part of the durable
164
+ session API: the live-session registry is isolated inside `nooa-acp` so it can
165
+ later be replaced by handles to an agent daemon without changing stored
166
+ sessions, the shared coding agent, or the ACP protocol surface.
167
+
168
+ Python skill packages use the interpreter's normal import machinery. Multiple
169
+ sessions may use distinct skill package names, but two workspaces must not load
170
+ different checkouts under the same top-level Python package name in one ACP
171
+ server process. Launch a separate stdio server for those workspaces. A future
172
+ one-process-per-agent daemon will make that isolation an OS process boundary.
173
+
174
+ Installed `nooa.skills` entry points are loaded into the shared skill registry
175
+ but remain opt-in. The agent can activate a relevant skill with
176
+ `self.skills.activate(["name"])`. Stdio MCP servers supplied by an ACP client
177
+ are registered and activated as `mcp.<name>` skills for that session.
178
+
179
+ Workspace and user skill roots are shared with the terminal host through
180
+ layered `settings.yaml`. New configuration should use:
181
+
182
+ ```yaml
183
+ coding:
184
+ additional_skills_dirs:
185
+ - ../nemo-oo-skills
186
+ ```
187
+
188
+ The existing `tui.additional_skills_dirs` key remains supported during the
189
+ migration, as does the older project-local `.nooa/config.toml` key
190
+ `[tui].libs_dirs`. Packaged libraries declared through `nooa.skills`, `SKILL.md`
191
+ skills, and standalone Python skills are discovered from each configured root.
192
+ Loaded `@slash_command` methods are advertised through ACP and matching
193
+ `/command arguments` prompts are dispatched through the shared typed command
194
+ router. Command discovery is refreshed when loaded skills change.
195
+
196
+ The current adapter accepts text and resource-link prompts plus stdio, HTTP,
197
+ and SSE MCP servers forwarded by an ACP client. ACP-transport MCP proxies,
198
+ additional workspace directories, images, and embedded resources are not
199
+ advertised yet. An unavailable, duplicate, or unsupported MCP server is skipped
200
+ with a session warning so it cannot prevent a new or restored NOOA session from
201
+ opening.