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.
- nooa_acp-0.0.10/.gitignore +406 -0
- nooa_acp-0.0.10/PKG-INFO +201 -0
- nooa_acp-0.0.10/README.md +185 -0
- nooa_acp-0.0.10/pyproject.toml +47 -0
- nooa_acp-0.0.10/src/nooa_acp/__init__.py +3 -0
- nooa_acp-0.0.10/src/nooa_acp/_runtime.py +237 -0
- nooa_acp-0.0.10/src/nooa_acp/cli.py +45 -0
- nooa_acp-0.0.10/src/nooa_acp/dispatcher.py +106 -0
- nooa_acp-0.0.10/src/nooa_acp/event_bridge.py +400 -0
- nooa_acp-0.0.10/src/nooa_acp/server.py +639 -0
- nooa_acp-0.0.10/tests/fixtures/fake_agent.py +37 -0
- nooa_acp-0.0.10/tests/test_cli.py +115 -0
- nooa_acp-0.0.10/tests/test_coding_agent.py +151 -0
- nooa_acp-0.0.10/tests/test_event_bridge.py +540 -0
- nooa_acp-0.0.10/tests/test_protocol.py +297 -0
- nooa_acp-0.0.10/tests/test_runtime.py +219 -0
- nooa_acp-0.0.10/tests/test_server.py +1569 -0
|
@@ -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/
|
nooa_acp-0.0.10/PKG-INFO
ADDED
|
@@ -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.
|