moderado 0.3.0
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.
- package/LICENSE +21 -0
- package/README.md +208 -0
- package/dist/args.d.ts +26 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +108 -0
- package/dist/args.js.map +1 -0
- package/dist/commands/chat.d.ts +121 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +1484 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +61 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +27 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +172 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/interactive_menu.d.ts +3 -0
- package/dist/commands/interactive_menu.d.ts.map +1 -0
- package/dist/commands/interactive_menu.js +98 -0
- package/dist/commands/interactive_menu.js.map +1 -0
- package/dist/commands/models.d.ts +8 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +81 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +140 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +195 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +14 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +23 -0
- package/dist/credentials.js.map +1 -0
- package/dist/diagnostic_log.d.ts +2 -0
- package/dist/diagnostic_log.d.ts.map +1 -0
- package/dist/diagnostic_log.js +21 -0
- package/dist/diagnostic_log.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/model_pricing.d.ts +4 -0
- package/dist/model_pricing.d.ts.map +1 -0
- package/dist/model_pricing.js +10 -0
- package/dist/model_pricing.js.map +1 -0
- package/dist/sessions.d.ts +203 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +82 -0
- package/dist/sessions.js.map +1 -0
- package/dist/ui/box.d.ts +14 -0
- package/dist/ui/box.d.ts.map +1 -0
- package/dist/ui/box.js +52 -0
- package/dist/ui/box.js.map +1 -0
- package/dist/ui/file_mentions.d.ts +38 -0
- package/dist/ui/file_mentions.d.ts.map +1 -0
- package/dist/ui/file_mentions.js +119 -0
- package/dist/ui/file_mentions.js.map +1 -0
- package/dist/ui/help_modal.d.ts +2 -0
- package/dist/ui/help_modal.d.ts.map +1 -0
- package/dist/ui/help_modal.js +101 -0
- package/dist/ui/help_modal.js.map +1 -0
- package/dist/ui/model_selector.d.ts +48 -0
- package/dist/ui/model_selector.d.ts.map +1 -0
- package/dist/ui/model_selector.js +829 -0
- package/dist/ui/model_selector.js.map +1 -0
- package/dist/ui/popup.d.ts +78 -0
- package/dist/ui/popup.d.ts.map +1 -0
- package/dist/ui/popup.js +274 -0
- package/dist/ui/popup.js.map +1 -0
- package/dist/ui/prompt.d.ts +21 -0
- package/dist/ui/prompt.d.ts.map +1 -0
- package/dist/ui/prompt.js +128 -0
- package/dist/ui/prompt.js.map +1 -0
- package/dist/ui/provider_connect.d.ts +33 -0
- package/dist/ui/provider_connect.d.ts.map +1 -0
- package/dist/ui/provider_connect.js +175 -0
- package/dist/ui/provider_connect.js.map +1 -0
- package/dist/ui/renderer.d.ts +19 -0
- package/dist/ui/renderer.d.ts.map +1 -0
- package/dist/ui/renderer.js +147 -0
- package/dist/ui/renderer.js.map +1 -0
- package/dist/ui/session_screen.d.ts +32 -0
- package/dist/ui/session_screen.d.ts.map +1 -0
- package/dist/ui/session_screen.js +148 -0
- package/dist/ui/session_screen.js.map +1 -0
- package/dist/ui/session_terminal.d.ts +46 -0
- package/dist/ui/session_terminal.d.ts.map +1 -0
- package/dist/ui/session_terminal.js +342 -0
- package/dist/ui/session_terminal.js.map +1 -0
- package/dist/ui/terminal_approval.d.ts +14 -0
- package/dist/ui/terminal_approval.d.ts.map +1 -0
- package/dist/ui/terminal_approval.js +98 -0
- package/dist/ui/terminal_approval.js.map +1 -0
- package/dist/ui/welcome.d.ts +130 -0
- package/dist/ui/welcome.d.ts.map +1 -0
- package/dist/ui/welcome.js +990 -0
- package/dist/ui/welcome.js.map +1 -0
- package/dist/vendor/contracts/approvals.d.ts +91 -0
- package/dist/vendor/contracts/approvals.d.ts.map +1 -0
- package/dist/vendor/contracts/approvals.js +22 -0
- package/dist/vendor/contracts/approvals.js.map +1 -0
- package/dist/vendor/contracts/events.d.ts +1215 -0
- package/dist/vendor/contracts/events.d.ts.map +1 -0
- package/dist/vendor/contracts/events.js +94 -0
- package/dist/vendor/contracts/events.js.map +1 -0
- package/dist/vendor/contracts/index.d.ts +7 -0
- package/dist/vendor/contracts/index.d.ts.map +1 -0
- package/dist/vendor/contracts/index.js +7 -0
- package/dist/vendor/contracts/index.js.map +1 -0
- package/dist/vendor/contracts/messages.d.ts +181 -0
- package/dist/vendor/contracts/messages.d.ts.map +1 -0
- package/dist/vendor/contracts/messages.js +40 -0
- package/dist/vendor/contracts/messages.js.map +1 -0
- package/dist/vendor/contracts/models.d.ts +117 -0
- package/dist/vendor/contracts/models.d.ts.map +1 -0
- package/dist/vendor/contracts/models.js +37 -0
- package/dist/vendor/contracts/models.js.map +1 -0
- package/dist/vendor/contracts/provider.d.ts +121 -0
- package/dist/vendor/contracts/provider.d.ts.map +1 -0
- package/dist/vendor/contracts/provider.js +64 -0
- package/dist/vendor/contracts/provider.js.map +1 -0
- package/dist/vendor/contracts/tools.d.ts +305 -0
- package/dist/vendor/contracts/tools.d.ts.map +1 -0
- package/dist/vendor/contracts/tools.js +65 -0
- package/dist/vendor/contracts/tools.js.map +1 -0
- package/dist/vendor/core/agent.d.ts +39 -0
- package/dist/vendor/core/agent.d.ts.map +1 -0
- package/dist/vendor/core/agent.js +710 -0
- package/dist/vendor/core/agent.js.map +1 -0
- package/dist/vendor/core/host_event_stream.d.ts +9 -0
- package/dist/vendor/core/host_event_stream.d.ts.map +1 -0
- package/dist/vendor/core/host_event_stream.js +12 -0
- package/dist/vendor/core/host_event_stream.js.map +1 -0
- package/dist/vendor/core/index.d.ts +7 -0
- package/dist/vendor/core/index.d.ts.map +1 -0
- package/dist/vendor/core/index.js +7 -0
- package/dist/vendor/core/index.js.map +1 -0
- package/dist/vendor/core/policy.d.ts +19 -0
- package/dist/vendor/core/policy.d.ts.map +1 -0
- package/dist/vendor/core/policy.js +31 -0
- package/dist/vendor/core/policy.js.map +1 -0
- package/dist/vendor/core/router.d.ts +26 -0
- package/dist/vendor/core/router.d.ts.map +1 -0
- package/dist/vendor/core/router.js +222 -0
- package/dist/vendor/core/router.js.map +1 -0
- package/dist/vendor/core/subagent.d.ts +29 -0
- package/dist/vendor/core/subagent.d.ts.map +1 -0
- package/dist/vendor/core/subagent.js +66 -0
- package/dist/vendor/core/subagent.js.map +1 -0
- package/dist/vendor/core/think_filter.d.ts +14 -0
- package/dist/vendor/core/think_filter.d.ts.map +1 -0
- package/dist/vendor/core/think_filter.js +136 -0
- package/dist/vendor/core/think_filter.js.map +1 -0
- package/dist/vendor/providers/fake/fake_provider.d.ts +16 -0
- package/dist/vendor/providers/fake/fake_provider.d.ts.map +1 -0
- package/dist/vendor/providers/fake/fake_provider.js +89 -0
- package/dist/vendor/providers/fake/fake_provider.js.map +1 -0
- package/dist/vendor/providers/index.d.ts +6 -0
- package/dist/vendor/providers/index.d.ts.map +1 -0
- package/dist/vendor/providers/index.js +6 -0
- package/dist/vendor/providers/index.js.map +1 -0
- package/dist/vendor/providers/model_discovery.d.ts +28 -0
- package/dist/vendor/providers/model_discovery.d.ts.map +1 -0
- package/dist/vendor/providers/model_discovery.js +106 -0
- package/dist/vendor/providers/model_discovery.js.map +1 -0
- package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts +23 -0
- package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts.map +1 -0
- package/dist/vendor/providers/nvidia/nvidia_adapter.js +197 -0
- package/dist/vendor/providers/nvidia/nvidia_adapter.js.map +1 -0
- package/dist/vendor/providers/nvidia/sse_parser.d.ts +3 -0
- package/dist/vendor/providers/nvidia/sse_parser.d.ts.map +1 -0
- package/dist/vendor/providers/nvidia/sse_parser.js +84 -0
- package/dist/vendor/providers/nvidia/sse_parser.js.map +1 -0
- package/dist/vendor/providers/openai_compatible_adapter.d.ts +10 -0
- package/dist/vendor/providers/openai_compatible_adapter.d.ts.map +1 -0
- package/dist/vendor/providers/openai_compatible_adapter.js +8 -0
- package/dist/vendor/providers/openai_compatible_adapter.js.map +1 -0
- package/dist/vendor/tools/checkpoints.d.ts +27 -0
- package/dist/vendor/tools/checkpoints.d.ts.map +1 -0
- package/dist/vendor/tools/checkpoints.js +145 -0
- package/dist/vendor/tools/checkpoints.js.map +1 -0
- package/dist/vendor/tools/diagnostics.d.ts +11 -0
- package/dist/vendor/tools/diagnostics.d.ts.map +1 -0
- package/dist/vendor/tools/diagnostics.js +16 -0
- package/dist/vendor/tools/diagnostics.js.map +1 -0
- package/dist/vendor/tools/diff.d.ts +7 -0
- package/dist/vendor/tools/diff.d.ts.map +1 -0
- package/dist/vendor/tools/diff.js +48 -0
- package/dist/vendor/tools/diff.js.map +1 -0
- package/dist/vendor/tools/errors.d.ts +17 -0
- package/dist/vendor/tools/errors.d.ts.map +1 -0
- package/dist/vendor/tools/errors.js +33 -0
- package/dist/vendor/tools/errors.js.map +1 -0
- package/dist/vendor/tools/git_workspace.d.ts +14 -0
- package/dist/vendor/tools/git_workspace.d.ts.map +1 -0
- package/dist/vendor/tools/git_workspace.js +42 -0
- package/dist/vendor/tools/git_workspace.js.map +1 -0
- package/dist/vendor/tools/index.d.ts +22 -0
- package/dist/vendor/tools/index.d.ts.map +1 -0
- package/dist/vendor/tools/index.js +22 -0
- package/dist/vendor/tools/index.js.map +1 -0
- package/dist/vendor/tools/jail.d.ts +17 -0
- package/dist/vendor/tools/jail.d.ts.map +1 -0
- package/dist/vendor/tools/jail.js +221 -0
- package/dist/vendor/tools/jail.js.map +1 -0
- package/dist/vendor/tools/lsp.d.ts +3 -0
- package/dist/vendor/tools/lsp.d.ts.map +1 -0
- package/dist/vendor/tools/lsp.js +43 -0
- package/dist/vendor/tools/lsp.js.map +1 -0
- package/dist/vendor/tools/mcp.d.ts +9 -0
- package/dist/vendor/tools/mcp.d.ts.map +1 -0
- package/dist/vendor/tools/mcp.js +54 -0
- package/dist/vendor/tools/mcp.js.map +1 -0
- package/dist/vendor/tools/mcp_adapter.d.ts +15 -0
- package/dist/vendor/tools/mcp_adapter.d.ts.map +1 -0
- package/dist/vendor/tools/mcp_adapter.js +29 -0
- package/dist/vendor/tools/mcp_adapter.js.map +1 -0
- package/dist/vendor/tools/registry.d.ts +10 -0
- package/dist/vendor/tools/registry.d.ts.map +1 -0
- package/dist/vendor/tools/registry.js +126 -0
- package/dist/vendor/tools/registry.js.map +1 -0
- package/dist/vendor/tools/tools/apply_patch.d.ts +3 -0
- package/dist/vendor/tools/tools/apply_patch.d.ts.map +1 -0
- package/dist/vendor/tools/tools/apply_patch.js +49 -0
- package/dist/vendor/tools/tools/apply_patch.js.map +1 -0
- package/dist/vendor/tools/tools/edit_file.d.ts +3 -0
- package/dist/vendor/tools/tools/edit_file.d.ts.map +1 -0
- package/dist/vendor/tools/tools/edit_file.js +71 -0
- package/dist/vendor/tools/tools/edit_file.js.map +1 -0
- package/dist/vendor/tools/tools/git_diff.d.ts +3 -0
- package/dist/vendor/tools/tools/git_diff.d.ts.map +1 -0
- package/dist/vendor/tools/tools/git_diff.js +91 -0
- package/dist/vendor/tools/tools/git_diff.js.map +1 -0
- package/dist/vendor/tools/tools/language_intelligence.d.ts +4 -0
- package/dist/vendor/tools/tools/language_intelligence.d.ts.map +1 -0
- package/dist/vendor/tools/tools/language_intelligence.js +13 -0
- package/dist/vendor/tools/tools/language_intelligence.js.map +1 -0
- package/dist/vendor/tools/tools/list_files.d.ts +9 -0
- package/dist/vendor/tools/tools/list_files.d.ts.map +1 -0
- package/dist/vendor/tools/tools/list_files.js +165 -0
- package/dist/vendor/tools/tools/list_files.js.map +1 -0
- package/dist/vendor/tools/tools/read_file.d.ts +3 -0
- package/dist/vendor/tools/tools/read_file.d.ts.map +1 -0
- package/dist/vendor/tools/tools/read_file.js +72 -0
- package/dist/vendor/tools/tools/read_file.js.map +1 -0
- package/dist/vendor/tools/tools/run_command.d.ts +12 -0
- package/dist/vendor/tools/tools/run_command.d.ts.map +1 -0
- package/dist/vendor/tools/tools/run_command.js +421 -0
- package/dist/vendor/tools/tools/run_command.js.map +1 -0
- package/dist/vendor/tools/tools/run_diagnostics.d.ts +3 -0
- package/dist/vendor/tools/tools/run_diagnostics.d.ts.map +1 -0
- package/dist/vendor/tools/tools/run_diagnostics.js +11 -0
- package/dist/vendor/tools/tools/run_diagnostics.js.map +1 -0
- package/dist/vendor/tools/tools/search_files.d.ts +3 -0
- package/dist/vendor/tools/tools/search_files.d.ts.map +1 -0
- package/dist/vendor/tools/tools/search_files.js +120 -0
- package/dist/vendor/tools/tools/search_files.js.map +1 -0
- package/dist/vendor/tools/tools/web_search.d.ts +46 -0
- package/dist/vendor/tools/tools/web_search.d.ts.map +1 -0
- package/dist/vendor/tools/tools/web_search.js +187 -0
- package/dist/vendor/tools/tools/web_search.js.map +1 -0
- package/dist/vendor/tools/tools/write_file.d.ts +3 -0
- package/dist/vendor/tools/tools/write_file.d.ts.map +1 -0
- package/dist/vendor/tools/tools/write_file.js +52 -0
- package/dist/vendor/tools/tools/write_file.js.map +1 -0
- package/dist/windows_credentials.d.ts +15 -0
- package/dist/windows_credentials.d.ts.map +1 -0
- package/dist/windows_credentials.js +23 -0
- package/dist/windows_credentials.js.map +1 -0
- package/package.json +28 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Moderado contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Moderado
|
|
2
|
+
|
|
3
|
+
> **A lightweight, provider-independent CLI coding agent with dynamic NVIDIA NIM discovery, free-first AUTO routing, and an uncompromised human-in-the-loop approval boundary.**
|
|
4
|
+
|
|
5
|
+
[](file:///d:/projects/moderado/VERSION)
|
|
6
|
+
[](file:///d:/projects/moderado/LICENSE)
|
|
7
|
+
[](https://github.com/marcuz-apl/alfazen-skills)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Highlights
|
|
12
|
+
|
|
13
|
+
- **Clean-Room & Original**: Built from scratch in TypeScript on Node.js (>= 20 LTS). No code copied from Cline, OpenCode, or legacy wrappers.
|
|
14
|
+
- **Provider-Independent Core**: Core agent loops, tool dispatching, and routing depend on pure contracts (`packages/contracts`) using Dependency Injection.
|
|
15
|
+
- **Dynamic NVIDIA Discovery**: Queries live `/v1/models` from NVIDIA NIM hosted catalog or local NIM instances; never relies on stale static lists.
|
|
16
|
+
- **Free-First AUTO Routing**: Intelligently ranks and selects verified free/trial tool-capable models before any paid endpoints. Paid models and unverified pricing require explicit user opt-in.
|
|
17
|
+
- **Strict Approval Boundary**: Auto-approved reads; interactive human approval for file writes, edits, and command executions. Non-interactive sessions fail closed.
|
|
18
|
+
- **Minimalist & Bloat-Free (`ponytail`)**: Follows the Decision Ladder: YAGNI, standard library first (native Node `fetch`, `AbortController`, `child_process.spawn`), and zero unnecessary dependencies.
|
|
19
|
+
- **Alfazen Versioning (`versioning-alfazen`)**: SemVer 2.0.0 with high-traceability connected UTC build prefixes (`v<m.n.p>+<yymmddc>`) and mandatory owner advisory gates for major releases.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Documentation Index
|
|
24
|
+
|
|
25
|
+
| Document | Purpose |
|
|
26
|
+
|---|---|
|
|
27
|
+
| [**PRD.md**](file:///d:/projects/moderado/PRD.md) | **Product Requirements Document**: Personas, requirements, CLI specs, and acceptance criteria |
|
|
28
|
+
| [**AGENTS.md**](file:///d:/projects/moderado/AGENTS.md) | **Agent Operational Manual**: Rules of engagement, Ponytail Decision Ladder, and subagent patterns |
|
|
29
|
+
| [**docs/ARCHITECTURE.md**](file:///d:/projects/moderado/docs/ARCHITECTURE.md) | **System Architecture**: Workspaces, Dependency Injection, state machines, and event streams |
|
|
30
|
+
| [**docs/TOOLS.md**](file:///d:/projects/moderado/docs/TOOLS.md) | **Tool Specifications**: Schemas, limits, atomic writes, and validation rules for the 7 tools |
|
|
31
|
+
| [**docs/ROUTING.md**](file:///d:/projects/moderado/docs/ROUTING.md) | **Discovery & Routing**: Classification taxonomy, AUTO selection algorithm, and retry/fallback cascades |
|
|
32
|
+
| [**docs/SECURITY.md**](file:///d:/projects/moderado/docs/SECURITY.md) | **Security Model**: Workspace jail, `shell: false` isolation, environment cleansing, and injection defense |
|
|
33
|
+
| [**HANDOFF.md**](file:///d:/projects/moderado/HANDOFF.md) | **Project Handoff Snapshot**: Real-time status, decisions, blockers, and next implementation milestones |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Workspace Layout
|
|
38
|
+
|
|
39
|
+
Moderado is organized as an npm workspace:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
moderado/
|
|
43
|
+
├── apps/
|
|
44
|
+
│ └── cli/ # v0.1 CLI application and terminal event rendering
|
|
45
|
+
├── packages/
|
|
46
|
+
│ ├── contracts/ # Pure TypeScript interfaces, Zod schemas, events
|
|
47
|
+
│ ├── core/ # Agent loop, routing policy, session state machine
|
|
48
|
+
│ ├── providers/ # NVIDIA NIM HTTP adapter and mock/fake providers
|
|
49
|
+
│ └── tools/ # Workspace file jail and process execution engine
|
|
50
|
+
├── tests/ # Cross-package and CLI integration tests
|
|
51
|
+
├── docs/ # Architectural and subsystem specifications
|
|
52
|
+
├── VERSION # Alfazen connected version identifier
|
|
53
|
+
├── PRD.md # Product requirements document
|
|
54
|
+
├── AGENTS.md # Agent operational guide
|
|
55
|
+
└── HANDOFF.md # Resumption and state ledger
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## CLI Command Quick Reference
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Discover live models and display access/capability classifications
|
|
64
|
+
moderado models
|
|
65
|
+
|
|
66
|
+
# Run a bounded coding task in the current workspace (default AUTO routing)
|
|
67
|
+
moderado run "Add unit tests for user authentication"
|
|
68
|
+
|
|
69
|
+
# Pin a specific model (disables fallback)
|
|
70
|
+
moderado run "Refactor database client" --model meta/llama-3.3-70b-instruct
|
|
71
|
+
|
|
72
|
+
# Run against a local NIM container
|
|
73
|
+
moderado run "Audit codebase" --profile local-nim
|
|
74
|
+
|
|
75
|
+
# Run in read-only audit mode (denies all writes and commands)
|
|
76
|
+
moderado run "Analyze security boundaries" --read-only
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Install Moderado
|
|
82
|
+
|
|
83
|
+
Moderado requires **Node.js 20 or newer**. M6.1 creates a verified npm tarball
|
|
84
|
+
but does not publish a public npm release yet. Once a release is published,
|
|
85
|
+
the global install command will be:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm install -g moderado
|
|
89
|
+
moderado
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Until then, build from the source checkout:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
git clone https://github.com/marcuz-apl/moderado.git
|
|
96
|
+
cd moderado
|
|
97
|
+
npm install
|
|
98
|
+
npm run build
|
|
99
|
+
node apps/cli/dist/index.js
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Maintainers can install a verified release artifact directly with
|
|
103
|
+
`npm install -g ./moderado-<version>.tgz`. See
|
|
104
|
+
[docs/RELEASING.md](docs/RELEASING.md) for the review procedure.
|
|
105
|
+
|
|
106
|
+
### Connect a provider
|
|
107
|
+
|
|
108
|
+
Open Moderado and use `/connect`. NVIDIA NIM is the default free-first provider;
|
|
109
|
+
OpenRouter, Agnes AI, and compatible OpenAI-style endpoints are also supported.
|
|
110
|
+
On Windows, newly saved provider keys go to Windows Credential Manager and
|
|
111
|
+
`~/.moderado/config.json` retains only a credential reference. On other
|
|
112
|
+
platforms, use an environment variable such as `NVIDIA_API_KEY` or
|
|
113
|
+
`OPENROUTER_API_KEY`.
|
|
114
|
+
|
|
115
|
+
Run `moderado doctor` to inspect local setup without exposing secrets. Add
|
|
116
|
+
`--connectivity` only when you want an optional live model-catalog check.
|
|
117
|
+
`npm test` never performs live provider calls.
|
|
118
|
+
## Getting Started & Development
|
|
119
|
+
|
|
120
|
+
### Connect a provider in the TUI
|
|
121
|
+
|
|
122
|
+
Run `moderado` to open the TUI immediately. A fresh installation does not require
|
|
123
|
+
an API key or a preselected model. The welcome card shows **No model connected —
|
|
124
|
+
use `/connect`** until you add one.
|
|
125
|
+
|
|
126
|
+
Use `/connect` to add NVIDIA NIM. NVIDIA NIM starts with `AUTO` free-first
|
|
127
|
+
routing, so choosing a model is optional; use `/model` later to pin one. Obtain
|
|
128
|
+
an NVIDIA key from [build.nvidia.com](https://build.nvidia.com), or set it as
|
|
129
|
+
`NVIDIA_API_KEY` before launching Moderado.
|
|
130
|
+
|
|
131
|
+
### Sessions and usage
|
|
132
|
+
|
|
133
|
+
Moderado stores sessions per workspace in `~/.moderado/sessions/`. Use
|
|
134
|
+
`/session` to create, resume, export, or compact a local conversation. Session
|
|
135
|
+
exports redact recognized API-key prefixes. The status line uses only
|
|
136
|
+
provider-reported token usage. It shows the calculated cost when the selected
|
|
137
|
+
model exposes prompt and completion prices, and **Cost unknown** otherwise.
|
|
138
|
+
|
|
139
|
+
`/connect` also accepts an OpenAI-compatible base URL, API key, and explicit
|
|
140
|
+
model ID for providers such as OpenRouter, Z.AI, DeepSeek, Moonshot, and
|
|
141
|
+
Mistral. Compatibility depends on each provider supporting `/v1/models` and
|
|
142
|
+
streaming `/v1/chat/completions` with tool calls. Provider credentials are saved
|
|
143
|
+
in `~/.moderado/config.json`; protect that file and never commit it.
|
|
144
|
+
|
|
145
|
+
### 1. Build & Test
|
|
146
|
+
```bash
|
|
147
|
+
# Install workspace dependencies
|
|
148
|
+
npm install
|
|
149
|
+
|
|
150
|
+
# Build all packages via TypeScript project references
|
|
151
|
+
npm run build
|
|
152
|
+
|
|
153
|
+
# Run full automated test suite (100% offline, zero API keys required)
|
|
154
|
+
npm test
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 2. Manual Live Smoke Test (Optional)
|
|
158
|
+
To test live model discovery and chat against NVIDIA NIM with real credentials:
|
|
159
|
+
```bash
|
|
160
|
+
# PowerShell
|
|
161
|
+
$env:NVIDIA_API_KEY="nvapi-..."
|
|
162
|
+
node scripts/smoke_test.js
|
|
163
|
+
|
|
164
|
+
# POSIX (bash/zsh)
|
|
165
|
+
export NVIDIA_API_KEY="nvapi-..."
|
|
166
|
+
node scripts/smoke_test.js
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
This project is licensed under the MIT License.
|
|
174
|
+
*NVIDIA NIM, NGC, and model weights/APIs are subject to their respective terms and licenses. Moderado is independent and not endorsed by NVIDIA.*
|
|
175
|
+
|
|
176
|
+
### Practical coding workflow
|
|
177
|
+
|
|
178
|
+
Use `/workflow` from the TUI to work through a change safely:
|
|
179
|
+
|
|
180
|
+
- **Git status** shows the current branch and changed files without using a shell.
|
|
181
|
+
- **Review diff** shows the bounded working-tree diff.
|
|
182
|
+
- In **Plan** mode, Moderado asks the model for a concise checklist and cannot make workspace changes. Choose **Build plan** and confirm to send that checklist to Execute mode.
|
|
183
|
+
- File writes, exact edits, and multi-file patches show their change preview and still require approval. Moderado records a byte-preserving checkpoint immediately before an approved file mutation.
|
|
184
|
+
- **Undo latest agent change** requires its own approval. It restores the latest completed checkpoint from `~/.moderado/checkpoints/` only when every affected file still has the expected post-change digest. If a file changed externally, it reports the conflict and restores nothing.
|
|
185
|
+
|
|
186
|
+
### Diagnostics evidence
|
|
187
|
+
|
|
188
|
+
Ask Moderado to run diagnostics, typecheck, lint, or tests in a TypeScript or JavaScript workspace. It may run only the direct `typecheck`, `lint`, or `test` script defined in that workspace�s `package.json`, and every run requires approval. A non-zero exit returns parsed TypeScript errors as repair evidence; it does not bypass the safety boundary.
|
|
189
|
+
|
|
190
|
+
### TypeScript language intelligence
|
|
191
|
+
|
|
192
|
+
Install `typescript-language-server` yourself, then set `typescriptLanguageServer` in `~/.moderado/config.json` to its executable path. Moderado can then use read-only definition and reference lookup for TypeScript/JavaScript files. When the executable is unavailable, it reports how to configure it and leaves normal tools available.
|
|
193
|
+
|
|
194
|
+
### Local MCP tools
|
|
195
|
+
|
|
196
|
+
Configure trusted local stdio MCP servers under `mcpServers` in `~/.moderado/config.json`, with an executable and fixed `args` list. Moderado discovers server tools at session startup, namespaces them as `mcp.<server>.<tool>`, and requires approval for every call. MCP network transports and automatic server installation are not supported.
|
|
197
|
+
|
|
198
|
+
### Host event protocol
|
|
199
|
+
|
|
200
|
+
Moderado exposes a versioned host-event envelope with session identity and monotonic sequence numbers. The CLI continues to render the contained agent event, while a future desktop host can consume the same protocol without importing CLI code.
|
|
201
|
+
|
|
202
|
+
### Doctor command
|
|
203
|
+
|
|
204
|
+
Run `moderado doctor` to check the local Node runtime, workspace, Moderado home directory, provider/key presence, Git, and npm without exposing credentials. Run `moderado doctor --connectivity` only when you want an explicit live provider catalog check.
|
|
205
|
+
|
|
206
|
+
## Windows credential storage
|
|
207
|
+
|
|
208
|
+
On Windows, /connect saves provider API keys in Windows Credential Manager and stores only a provider credential reference in ~/.moderado/config.json. Existing plaintext keys remain usable for compatibility. Migrate them explicitly with moderado doctor --migrate-credentials; a failed migration leaves the existing configuration unchanged. On other platforms, set the provider environment variable (for example, NVIDIA_API_KEY or OPENROUTER_API_KEY).
|
package/dist/args.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface CliParsedArgs {
|
|
2
|
+
command?: 'models' | 'run' | 'doctor';
|
|
3
|
+
task?: string;
|
|
4
|
+
workspace: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
provider?: string;
|
|
7
|
+
profile: string;
|
|
8
|
+
maxSteps: number;
|
|
9
|
+
timeout: number;
|
|
10
|
+
readOnly: boolean;
|
|
11
|
+
autoApprove: boolean;
|
|
12
|
+
nonInteractive: boolean;
|
|
13
|
+
allowPaid: boolean;
|
|
14
|
+
allowUnknown: boolean;
|
|
15
|
+
verbose: boolean;
|
|
16
|
+
json: boolean;
|
|
17
|
+
refresh: boolean;
|
|
18
|
+
connectivity: boolean;
|
|
19
|
+
migrateCredentials: boolean;
|
|
20
|
+
maxTokens?: number;
|
|
21
|
+
help: boolean;
|
|
22
|
+
version: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function parseCliArgs(args?: string[]): CliParsedArgs;
|
|
25
|
+
export declare function getHelpText(): string;
|
|
26
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,aAAa,CA0ElF;AAED,wBAAgB,WAAW,IAAI,MAAM,CA8BpC"}
|
package/dist/args.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { parseArgs } from 'node:util';
|
|
2
|
+
export function parseCliArgs(args = process.argv.slice(2)) {
|
|
3
|
+
const optionsConfig = {
|
|
4
|
+
workspace: { type: 'string', short: 'w', default: '.' },
|
|
5
|
+
model: { type: 'string', short: 'm' },
|
|
6
|
+
provider: { type: 'string' },
|
|
7
|
+
profile: { type: 'string', short: 'p', default: 'hosted-nvidia' },
|
|
8
|
+
'max-steps': { type: 'string', default: '25' },
|
|
9
|
+
'max-tokens': { type: 'string' },
|
|
10
|
+
timeout: { type: 'string', default: '600' },
|
|
11
|
+
'read-only': { type: 'boolean', default: false },
|
|
12
|
+
'auto-approve': { type: 'boolean', short: 'y', default: false },
|
|
13
|
+
'non-interactive': { type: 'boolean', default: false },
|
|
14
|
+
'allow-paid': { type: 'boolean', default: false },
|
|
15
|
+
'allow-unknown': { type: 'boolean', default: false },
|
|
16
|
+
verbose: { type: 'boolean', default: false },
|
|
17
|
+
json: { type: 'boolean', default: false },
|
|
18
|
+
refresh: { type: 'boolean', default: false },
|
|
19
|
+
connectivity: { type: 'boolean', default: false },
|
|
20
|
+
'migrate-credentials': { type: 'boolean', default: false },
|
|
21
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
22
|
+
version: { type: 'boolean', short: 'v', default: false },
|
|
23
|
+
};
|
|
24
|
+
const parsed = parseArgs({
|
|
25
|
+
args,
|
|
26
|
+
options: optionsConfig,
|
|
27
|
+
allowPositionals: true,
|
|
28
|
+
});
|
|
29
|
+
const positionals = parsed.positionals;
|
|
30
|
+
let command;
|
|
31
|
+
let task;
|
|
32
|
+
if (positionals.length > 0) {
|
|
33
|
+
const first = positionals[0].toLowerCase();
|
|
34
|
+
if (first === 'doctor') {
|
|
35
|
+
command = 'doctor';
|
|
36
|
+
}
|
|
37
|
+
else if (first === 'models') {
|
|
38
|
+
command = 'models';
|
|
39
|
+
}
|
|
40
|
+
else if (first === 'run') {
|
|
41
|
+
command = 'run';
|
|
42
|
+
task = positionals.slice(1).join(' ');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// If first positional is not a command, treat as task for implicit 'run'
|
|
46
|
+
command = 'run';
|
|
47
|
+
task = positionals.join(' ');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const maxSteps = parseInt(parsed.values['max-steps'], 10);
|
|
51
|
+
const maxTokens = parsed.values['max-tokens'] ? parseInt(parsed.values['max-tokens'], 10) : undefined;
|
|
52
|
+
const timeout = parseInt(parsed.values.timeout, 10);
|
|
53
|
+
return {
|
|
54
|
+
command,
|
|
55
|
+
task: task?.trim() || undefined,
|
|
56
|
+
workspace: parsed.values.workspace,
|
|
57
|
+
model: parsed.values.model,
|
|
58
|
+
provider: parsed.values.provider,
|
|
59
|
+
profile: parsed.values.profile,
|
|
60
|
+
maxSteps: isNaN(maxSteps) ? 25 : maxSteps,
|
|
61
|
+
maxTokens: maxTokens && !isNaN(maxTokens) ? maxTokens : undefined,
|
|
62
|
+
timeout: isNaN(timeout) ? 600 : timeout,
|
|
63
|
+
readOnly: Boolean(parsed.values['read-only']),
|
|
64
|
+
autoApprove: Boolean(parsed.values['auto-approve']),
|
|
65
|
+
nonInteractive: Boolean(parsed.values['non-interactive']),
|
|
66
|
+
allowPaid: Boolean(parsed.values['allow-paid']),
|
|
67
|
+
allowUnknown: Boolean(parsed.values['allow-unknown']),
|
|
68
|
+
verbose: Boolean(parsed.values.verbose),
|
|
69
|
+
json: Boolean(parsed.values.json),
|
|
70
|
+
refresh: Boolean(parsed.values.refresh),
|
|
71
|
+
connectivity: Boolean(parsed.values.connectivity),
|
|
72
|
+
migrateCredentials: Boolean(parsed.values['migrate-credentials']),
|
|
73
|
+
help: Boolean(parsed.values.help),
|
|
74
|
+
version: Boolean(parsed.values.version),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function getHelpText() {
|
|
78
|
+
return `Moderado - Lightweight CLI coding agent with NVIDIA NIM discovery and free-first routing.
|
|
79
|
+
|
|
80
|
+
USAGE:
|
|
81
|
+
moderado models [options]
|
|
82
|
+
moderado run "<task>" [options]
|
|
83
|
+
moderado "<task>" [options]
|
|
84
|
+
|
|
85
|
+
COMMANDS:
|
|
86
|
+
models Discover live models, capability & access tiers
|
|
87
|
+
run "<task>" Execute a bounded coding task in the workspace\n doctor Check local Moderado setup
|
|
88
|
+
|
|
89
|
+
OPTIONS:
|
|
90
|
+
-w, --workspace <path> Target workspace directory (default: current directory)
|
|
91
|
+
-m, --model <id> Pin a specific model (disables AUTO fallback)
|
|
92
|
+
-p, --profile <name> Target configured profile (default: hosted-nvidia)
|
|
93
|
+
--max-steps <int> Upper bound on tool interaction cycles (default: 25)
|
|
94
|
+
--max-tokens <int> Hard limit on generated output tokens per response (default: 1024)
|
|
95
|
+
--timeout <seconds> Global session execution timeout (default: 600s)
|
|
96
|
+
--read-only Enforce read-only mode (blocks writes & commands)
|
|
97
|
+
-y, --auto-approve Automatically approve all tool operations
|
|
98
|
+
--non-interactive Fail closed on operations requiring approval
|
|
99
|
+
--allow-paid Permit paid models during AUTO routing
|
|
100
|
+
--allow-unknown Permit unverified/unknown access models in AUTO
|
|
101
|
+
--verbose Display raw tool inputs and event logs
|
|
102
|
+
--json Output results in structured JSON (models command)
|
|
103
|
+
--migrate-credentials Move legacy Windows config keys into Credential Manager
|
|
104
|
+
-h, --help Show this help screen
|
|
105
|
+
-v, --version Show version identifier
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { NvidiaAdapter } from '@moderado/providers';
|
|
2
|
+
import { discoverMcpServers } from '@moderado/tools';
|
|
3
|
+
import type { WebSearchProviderName, WebSearchToolOptions } from '@moderado/tools';
|
|
4
|
+
import { ApprovalDecision, ApprovalRequest, ChatMessage, IToolRegistry, McpServerConfig, ToolResult } from '@moderado/contracts';
|
|
5
|
+
import { CliParsedArgs } from '../args.js';
|
|
6
|
+
import { ModeradoConfig } from '../config.js';
|
|
7
|
+
import { selectConfirmPopup, selectListPopup } from '../ui/popup.js';
|
|
8
|
+
export declare function createAgentTask(request: string, mode: 'Plan' | 'Execute'): string;
|
|
9
|
+
export declare const STANDARD_SLASH_COMMANDS: readonly ["/connect", "/model", "/init", "/btw", "/mcp", "/session", "/queue", "/workflow", "/clear", "/help", "/exit", "/quit"];
|
|
10
|
+
export declare function levenshteinDistance(a: string, b: string): number;
|
|
11
|
+
export interface SlashCommandAdvice {
|
|
12
|
+
isSlashCommand: boolean;
|
|
13
|
+
isValid: boolean;
|
|
14
|
+
suggestion?: string;
|
|
15
|
+
advice?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function findSlashCommandAdvice(rawInput: string): SlashCommandAdvice;
|
|
18
|
+
export declare function formatTurnFailureAnswer(status: string, errorEvent: {
|
|
19
|
+
code?: string;
|
|
20
|
+
message: string;
|
|
21
|
+
} | undefined, modelId: string, otherConnections?: string[]): string;
|
|
22
|
+
export declare function resolveTurnAssistantAnswer(result: {
|
|
23
|
+
status: string;
|
|
24
|
+
messages: ChatMessage[];
|
|
25
|
+
selectedModel?: {
|
|
26
|
+
id: string;
|
|
27
|
+
};
|
|
28
|
+
}, previousHistoryLength: number, lastErrorEvent?: {
|
|
29
|
+
code?: string;
|
|
30
|
+
message: string;
|
|
31
|
+
}, streamedAnswer?: string, currentModel?: string, otherConnections?: string[]): {
|
|
32
|
+
answer: string;
|
|
33
|
+
isError: boolean;
|
|
34
|
+
};
|
|
35
|
+
export declare function isBareExitCommand(input: string): boolean;
|
|
36
|
+
/** Resolve the required, explicit local destination for `/session share`. */
|
|
37
|
+
export declare function resolveSessionSharePath(workspaceRoot: string, outputPath: string): string;
|
|
38
|
+
export declare function isGenerationCancelKey(key: {
|
|
39
|
+
name?: string;
|
|
40
|
+
} | undefined, str?: string): boolean;
|
|
41
|
+
export declare class TurnCommandQueue {
|
|
42
|
+
private queue;
|
|
43
|
+
private draft;
|
|
44
|
+
get items(): readonly string[];
|
|
45
|
+
get currentDraft(): string;
|
|
46
|
+
get length(): number;
|
|
47
|
+
push(command: string): void;
|
|
48
|
+
shift(): string | undefined;
|
|
49
|
+
clear(): void;
|
|
50
|
+
setDraft(text: string): void;
|
|
51
|
+
appendDraft(text: string): void;
|
|
52
|
+
backspaceDraft(): void;
|
|
53
|
+
commitDraft(): string | undefined;
|
|
54
|
+
}
|
|
55
|
+
export declare function handleGenerationKeypress(str: string, key: {
|
|
56
|
+
name?: string;
|
|
57
|
+
ctrl?: boolean;
|
|
58
|
+
meta?: boolean;
|
|
59
|
+
shift?: boolean;
|
|
60
|
+
} | undefined, queue: TurnCommandQueue, actions: {
|
|
61
|
+
abort: () => void;
|
|
62
|
+
onDraftChange: () => void;
|
|
63
|
+
onQueueAdd: (item: string) => void;
|
|
64
|
+
onBtw?: (command: string) => void;
|
|
65
|
+
}): void;
|
|
66
|
+
export declare function isNetworkCommand(request: Pick<ApprovalRequest, 'toolName' | 'exactPayload'>): boolean;
|
|
67
|
+
export declare function isNetworkConsentReply(input: string, previousAnswer: string): boolean;
|
|
68
|
+
export declare function isLocalModelQuery(input: string): boolean;
|
|
69
|
+
export declare function isLocalProviderQuery(input: string): boolean;
|
|
70
|
+
export declare function isLocalIdentityQuery(input: string): boolean;
|
|
71
|
+
export declare function isLocalTokenQuery(input: string): boolean;
|
|
72
|
+
export declare function isLocalVersionQuery(input: string): boolean;
|
|
73
|
+
export declare function isLocalWorkspaceQuery(input: string): boolean;
|
|
74
|
+
export interface LocalMetaQueryContext {
|
|
75
|
+
currentModel?: string;
|
|
76
|
+
providerName?: string;
|
|
77
|
+
activeMode: 'Plan' | 'Execute';
|
|
78
|
+
workspace: string;
|
|
79
|
+
version?: string;
|
|
80
|
+
sessionTokens?: number;
|
|
81
|
+
sessionCost?: string;
|
|
82
|
+
}
|
|
83
|
+
export declare function resolveLocalMetaQuery(input: string, context: LocalMetaQueryContext): string | undefined;
|
|
84
|
+
/** Detect questions whose answer depends on changing public information. */
|
|
85
|
+
export declare function shouldFastRouteWebSearch(input: string): boolean;
|
|
86
|
+
/** Environment configuration overrides the optional persistent search endpoint. */
|
|
87
|
+
export declare function resolveWebSearchEndpoint(config: ModeradoConfig): string | undefined;
|
|
88
|
+
export declare function formatDirectWebSearchAnswer(result: ToolResult): string;
|
|
89
|
+
/** Environment configuration overrides the persistent search provider preference. */
|
|
90
|
+
export declare function resolveWebSearchProvider(config: ModeradoConfig): WebSearchProviderName | undefined;
|
|
91
|
+
export declare function resolveWebSearchOptions(config: ModeradoConfig): WebSearchToolOptions;
|
|
92
|
+
/** Feed completed search evidence into a single model turn instead of paying for a second tool round trip. */
|
|
93
|
+
export declare function buildSearchAnswerTask(question: string, result: ToolResult): string;
|
|
94
|
+
/** Keep the transcript honest: the injected evidence turn becomes the question the user actually asked. */
|
|
95
|
+
export declare function replaceEvidenceTurn(messages: ChatMessage[], evidenceTask: string, question: string): ChatMessage[];
|
|
96
|
+
export interface ApprovalPolicyOptions {
|
|
97
|
+
autoApprove: boolean;
|
|
98
|
+
networkAccessApproved: boolean;
|
|
99
|
+
requestInteractiveApproval: (request: ApprovalRequest, signal?: AbortSignal) => Promise<ApprovalDecision>;
|
|
100
|
+
}
|
|
101
|
+
export declare function decideApproval(request: ApprovalRequest, options: ApprovalPolicyOptions, signal?: AbortSignal): Promise<ApprovalDecision>;
|
|
102
|
+
export declare function createMcpToolRegistry(servers: Record<string, McpServerConfig> | undefined, webSearch?: WebSearchToolOptions): Promise<IToolRegistry>;
|
|
103
|
+
export interface McpCommandOptions {
|
|
104
|
+
reloadMcpTools: () => Promise<void>;
|
|
105
|
+
signal?: AbortSignal;
|
|
106
|
+
configHome?: string;
|
|
107
|
+
promptText?: (label: string) => Promise<string | undefined>;
|
|
108
|
+
discoverMcpServers?: typeof discoverMcpServers;
|
|
109
|
+
selectListPopup?: typeof selectListPopup;
|
|
110
|
+
selectConfirmPopup?: typeof selectConfirmPopup;
|
|
111
|
+
}
|
|
112
|
+
export declare function handleMcpCommand(command: string, drawFrame: (popupLines: string[]) => void, options: McpCommandOptions): Promise<void>;
|
|
113
|
+
export declare function executeBtwQuery(command: string, drawFrame: (popupLines: string[], options?: {
|
|
114
|
+
waitDismiss?: boolean;
|
|
115
|
+
}) => void | Promise<void>, provider: NvidiaAdapter | undefined, currentModel: string | undefined, btwHistory: Array<{
|
|
116
|
+
question: string;
|
|
117
|
+
answer: string;
|
|
118
|
+
timestamp: number;
|
|
119
|
+
}>, signal?: AbortSignal, btwSignal?: AbortSignal): Promise<void>;
|
|
120
|
+
export declare function handleChatSession(args: CliParsedArgs, version: string, signal?: AbortSignal): Promise<number>;
|
|
121
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|