@nanocollective/nanocoder 1.20.3 → 1.21.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.md +1 -1
- package/README.md +100 -70
- package/assets/nanocoder-vscode.vsix +0 -0
- package/dist/ai-sdk-client/chat/chat-handler.d.ts +1 -0
- package/dist/ai-sdk-client/chat/chat-handler.d.ts.map +1 -1
- package/dist/ai-sdk-client/chat/chat-handler.js +65 -7
- package/dist/ai-sdk-client/chat/chat-handler.js.map +1 -1
- package/dist/ai-sdk-client/error-handling/tool-error-detector.d.ts +8 -0
- package/dist/ai-sdk-client/error-handling/tool-error-detector.d.ts.map +1 -0
- package/dist/ai-sdk-client/error-handling/tool-error-detector.js +52 -0
- package/dist/ai-sdk-client/error-handling/tool-error-detector.js.map +1 -0
- package/dist/ai-sdk-client/tools/tool-prompt-formatter.d.ts +8 -0
- package/dist/ai-sdk-client/tools/tool-prompt-formatter.d.ts.map +1 -0
- package/dist/ai-sdk-client/tools/tool-prompt-formatter.js +97 -0
- package/dist/ai-sdk-client/tools/tool-prompt-formatter.js.map +1 -0
- package/dist/app/App.d.ts.map +1 -1
- package/dist/app/App.js +11 -1
- package/dist/app/App.js.map +1 -1
- package/dist/app/components/modal-selectors.d.ts +7 -1
- package/dist/app/components/modal-selectors.d.ts.map +1 -1
- package/dist/app/components/modal-selectors.js +11 -3
- package/dist/app/components/modal-selectors.js.map +1 -1
- package/dist/app/utils/app-util.d.ts.map +1 -1
- package/dist/app/utils/app-util.js +174 -4
- package/dist/app/utils/app-util.js.map +1 -1
- package/dist/cli.js +22 -0
- package/dist/cli.js.map +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +19 -20
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/compact.d.ts +24 -0
- package/dist/commands/compact.d.ts.map +1 -0
- package/dist/commands/compact.js +31 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/exit.d.ts +1 -0
- package/dist/commands/exit.d.ts.map +1 -1
- package/dist/commands/exit.js +14 -0
- package/dist/commands/exit.js.map +1 -1
- package/dist/commands/help.js +1 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +4 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +4 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +15 -21
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/nanocoder-shape.d.ts +3 -0
- package/dist/commands/nanocoder-shape.d.ts.map +1 -0
- package/dist/commands/nanocoder-shape.js +46 -0
- package/dist/commands/nanocoder-shape.js.map +1 -0
- package/dist/commands/setup-mcp.d.ts +3 -0
- package/dist/commands/setup-mcp.d.ts.map +1 -0
- package/dist/commands/setup-mcp.js +15 -0
- package/dist/commands/setup-mcp.js.map +1 -0
- package/dist/commands/setup-providers.d.ts +3 -0
- package/dist/commands/setup-providers.d.ts.map +1 -0
- package/dist/commands/{setup-config.js → setup-providers.js} +4 -4
- package/dist/commands/setup-providers.js.map +1 -0
- package/dist/components/nanocoder-shape-selector.d.ts +8 -0
- package/dist/components/nanocoder-shape-selector.d.ts.map +1 -0
- package/dist/components/nanocoder-shape-selector.js +61 -0
- package/dist/components/nanocoder-shape-selector.js.map +1 -0
- package/dist/components/status.d.ts +11 -0
- package/dist/components/status.d.ts.map +1 -1
- package/dist/components/status.js +3 -3
- package/dist/components/status.js.map +1 -1
- package/dist/components/user-input.d.ts.map +1 -1
- package/dist/components/user-input.js +1 -14
- package/dist/components/user-input.js.map +1 -1
- package/dist/components/welcome-message.d.ts.map +1 -1
- package/dist/components/welcome-message.js +6 -2
- package/dist/components/welcome-message.js.map +1 -1
- package/dist/config/index.d.ts +7 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +100 -16
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-config-loader.d.ts +31 -0
- package/dist/config/mcp-config-loader.d.ts.map +1 -0
- package/dist/config/mcp-config-loader.js +341 -0
- package/dist/config/mcp-config-loader.js.map +1 -0
- package/dist/config/nanocoder-tools-config.d.ts +7 -0
- package/dist/config/nanocoder-tools-config.d.ts.map +1 -0
- package/dist/config/nanocoder-tools-config.js +14 -0
- package/dist/config/nanocoder-tools-config.js.map +1 -0
- package/dist/config/preferences.d.ts +3 -0
- package/dist/config/preferences.d.ts.map +1 -1
- package/dist/config/preferences.js +9 -0
- package/dist/config/preferences.js.map +1 -1
- package/dist/config/validation.d.ts +11 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +71 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts +2 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts.map +1 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.js +43 -18
- package/dist/hooks/chat-handler/conversation/conversation-loop.js.map +1 -1
- package/dist/hooks/chat-handler/useChatHandler.d.ts.map +1 -1
- package/dist/hooks/chat-handler/useChatHandler.js +2 -0
- package/dist/hooks/chat-handler/useChatHandler.js.map +1 -1
- package/dist/hooks/useAppHandlers.d.ts +2 -0
- package/dist/hooks/useAppHandlers.d.ts.map +1 -1
- package/dist/hooks/useAppHandlers.js +66 -2
- package/dist/hooks/useAppHandlers.js.map +1 -1
- package/dist/hooks/useAppInitialization.d.ts.map +1 -1
- package/dist/hooks/useAppInitialization.js +9 -2
- package/dist/hooks/useAppInitialization.js.map +1 -1
- package/dist/hooks/useAppState.d.ts +4 -0
- package/dist/hooks/useAppState.d.ts.map +1 -1
- package/dist/hooks/useAppState.js +6 -0
- package/dist/hooks/useAppState.js.map +1 -1
- package/dist/hooks/useModeHandlers.d.ts +10 -2
- package/dist/hooks/useModeHandlers.d.ts.map +1 -1
- package/dist/hooks/useModeHandlers.js +50 -2
- package/dist/hooks/useModeHandlers.js.map +1 -1
- package/dist/hooks/useTerminalWidth.d.ts +1 -1
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +2 -2
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +2 -0
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +13 -1
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/transport-factory.d.ts.map +1 -1
- package/dist/mcp/transport-factory.js +7 -1
- package/dist/mcp/transport-factory.js.map +1 -1
- package/dist/models/models-dev-client.d.ts.map +1 -1
- package/dist/models/models-dev-client.js +4 -0
- package/dist/models/models-dev-client.js.map +1 -1
- package/dist/services/bash-executor.d.ts.map +1 -1
- package/dist/services/bash-executor.js +7 -0
- package/dist/services/bash-executor.js.map +1 -1
- package/dist/test-utils/cli-test-harness.d.ts +181 -0
- package/dist/test-utils/cli-test-harness.d.ts.map +1 -0
- package/dist/test-utils/cli-test-harness.js +413 -0
- package/dist/test-utils/cli-test-harness.js.map +1 -0
- package/dist/tools/execute-bash.d.ts.map +1 -1
- package/dist/tools/execute-bash.js +10 -2
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/string-replace.d.ts.map +1 -1
- package/dist/tools/string-replace.js +6 -1
- package/dist/tools/string-replace.js.map +1 -1
- package/dist/tools/tool-manager.d.ts +1 -0
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/write-file.d.ts.map +1 -1
- package/dist/tools/write-file.js +6 -1
- package/dist/tools/write-file.js.map +1 -1
- package/dist/types/app.d.ts +2 -0
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/config.d.ts +48 -27
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/mcp.d.ts +1 -0
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/ui.d.ts +1 -0
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/utils/auto-compact.d.ts +23 -0
- package/dist/utils/auto-compact.d.ts.map +1 -0
- package/dist/utils/auto-compact.js +149 -0
- package/dist/utils/auto-compact.js.map +1 -0
- package/dist/utils/compression-backup.d.ts +14 -0
- package/dist/utils/compression-backup.d.ts.map +1 -0
- package/dist/utils/compression-backup.js +31 -0
- package/dist/utils/compression-backup.js.map +1 -0
- package/dist/utils/logging/config.d.ts +11 -0
- package/dist/utils/logging/config.d.ts.map +1 -1
- package/dist/utils/logging/config.js +19 -4
- package/dist/utils/logging/config.js.map +1 -1
- package/dist/utils/logging/logger-provider.d.ts +15 -0
- package/dist/utils/logging/logger-provider.d.ts.map +1 -1
- package/dist/utils/logging/logger-provider.js +48 -24
- package/dist/utils/logging/logger-provider.js.map +1 -1
- package/dist/utils/message-compression.d.ts +55 -0
- package/dist/utils/message-compression.d.ts.map +1 -0
- package/dist/utils/message-compression.js +401 -0
- package/dist/utils/message-compression.js.map +1 -0
- package/dist/wizards/mcp-wizard.d.ts +8 -0
- package/dist/wizards/mcp-wizard.d.ts.map +1 -0
- package/dist/wizards/mcp-wizard.js +256 -0
- package/dist/wizards/mcp-wizard.js.map +1 -0
- package/dist/wizards/provider-wizard.d.ts +8 -0
- package/dist/wizards/provider-wizard.d.ts.map +1 -0
- package/dist/wizards/provider-wizard.js +254 -0
- package/dist/wizards/provider-wizard.js.map +1 -0
- package/dist/wizards/steps/location-step.d.ts +10 -0
- package/dist/wizards/steps/location-step.d.ts.map +1 -0
- package/dist/{wizard → wizards}/steps/location-step.js +7 -10
- package/dist/wizards/steps/location-step.js.map +1 -0
- package/dist/{wizard → wizards}/steps/mcp-step.d.ts +3 -1
- package/dist/wizards/steps/mcp-step.d.ts.map +1 -0
- package/dist/{wizard → wizards}/steps/mcp-step.js +14 -11
- package/dist/wizards/steps/mcp-step.js.map +1 -0
- package/dist/wizards/steps/provider-step.d.ts +11 -0
- package/dist/wizards/steps/provider-step.d.ts.map +1 -0
- package/dist/{wizard → wizards}/steps/provider-step.js +12 -10
- package/dist/wizards/steps/provider-step.js.map +1 -0
- package/dist/{wizard → wizards}/steps/summary-step.d.ts +3 -2
- package/dist/wizards/steps/summary-step.d.ts.map +1 -0
- package/dist/{wizard → wizards}/steps/summary-step.js +2 -2
- package/dist/wizards/steps/summary-step.js.map +1 -0
- package/dist/{wizard → wizards}/templates/mcp-templates.d.ts +1 -0
- package/dist/wizards/templates/mcp-templates.d.ts.map +1 -0
- package/dist/wizards/templates/mcp-templates.js.map +1 -0
- package/dist/wizards/templates/provider-templates.d.ts.map +1 -0
- package/dist/{wizard → wizards}/templates/provider-templates.js +3 -14
- package/dist/wizards/templates/provider-templates.js.map +1 -0
- package/dist/wizards/utils/fetch-cloud-models.d.ts.map +1 -0
- package/dist/wizards/utils/fetch-cloud-models.js.map +1 -0
- package/dist/wizards/utils/fetch-local-models.d.ts.map +1 -0
- package/dist/wizards/utils/fetch-local-models.js.map +1 -0
- package/dist/wizards/validation.d.ts +70 -0
- package/dist/wizards/validation.d.ts.map +1 -0
- package/dist/{wizard → wizards}/validation.js +58 -1
- package/dist/wizards/validation.js.map +1 -0
- package/package.json +19 -7
- package/dist/commands/setup-config.d.ts +0 -3
- package/dist/commands/setup-config.d.ts.map +0 -1
- package/dist/commands/setup-config.js.map +0 -1
- package/dist/wizard/config-wizard.d.ts +0 -8
- package/dist/wizard/config-wizard.d.ts.map +0 -1
- package/dist/wizard/config-wizard.js +0 -212
- package/dist/wizard/config-wizard.js.map +0 -1
- package/dist/wizard/steps/location-step.d.ts +0 -9
- package/dist/wizard/steps/location-step.d.ts.map +0 -1
- package/dist/wizard/steps/location-step.js.map +0 -1
- package/dist/wizard/steps/mcp-step.d.ts.map +0 -1
- package/dist/wizard/steps/mcp-step.js.map +0 -1
- package/dist/wizard/steps/provider-step.d.ts +0 -9
- package/dist/wizard/steps/provider-step.d.ts.map +0 -1
- package/dist/wizard/steps/provider-step.js.map +0 -1
- package/dist/wizard/steps/summary-step.d.ts.map +0 -1
- package/dist/wizard/steps/summary-step.js.map +0 -1
- package/dist/wizard/templates/mcp-templates.d.ts.map +0 -1
- package/dist/wizard/templates/mcp-templates.js.map +0 -1
- package/dist/wizard/templates/provider-templates.d.ts.map +0 -1
- package/dist/wizard/templates/provider-templates.js.map +0 -1
- package/dist/wizard/utils/fetch-cloud-models.d.ts.map +0 -1
- package/dist/wizard/utils/fetch-cloud-models.js.map +0 -1
- package/dist/wizard/utils/fetch-local-models.d.ts.map +0 -1
- package/dist/wizard/utils/fetch-local-models.js.map +0 -1
- package/dist/wizard/validation.d.ts +0 -64
- package/dist/wizard/validation.d.ts.map +0 -1
- package/dist/wizard/validation.js.map +0 -1
- /package/dist/{wizard → wizards}/templates/mcp-templates.js +0 -0
- /package/dist/{wizard → wizards}/templates/provider-templates.d.ts +0 -0
- /package/dist/{wizard → wizards}/utils/fetch-cloud-models.d.ts +0 -0
- /package/dist/{wizard → wizards}/utils/fetch-cloud-models.js +0 -0
- /package/dist/{wizard → wizards}/utils/fetch-local-models.d.ts +0 -0
- /package/dist/{wizard → wizards}/utils/fetch-local-models.js +0 -0
package/LICENSE.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
MIT License with Attribution
|
|
4
4
|
|
|
5
|
-
Copyright (c)
|
|
5
|
+
Copyright (c) 2026 Nano Collective
|
|
6
6
|
|
|
7
7
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
8
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -37,6 +37,7 @@ A local-first CLI coding agent that brings the power of agentic coding tools lik
|
|
|
37
37
|
- [Advanced Tool System](#advanced-tool-system)
|
|
38
38
|
- [Custom Command System](#custom-command-system)
|
|
39
39
|
- [Enhanced User Experience](#enhanced-user-experience)
|
|
40
|
+
- [Keyboard Shortcuts](#keyboard-shortcuts)
|
|
40
41
|
- [Developer Features](#developer-features)
|
|
41
42
|
- [VS Code Extension](#vs-code-extension)
|
|
42
43
|
- [Community](#community)
|
|
@@ -181,6 +182,46 @@ pnpm run dev
|
|
|
181
182
|
|
|
182
183
|
## Usage
|
|
183
184
|
|
|
185
|
+
### CLI Options
|
|
186
|
+
|
|
187
|
+
Nanocoder supports standard CLI arguments for quick information and help:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# Show version information
|
|
191
|
+
nanocoder --version
|
|
192
|
+
nanocoder -v
|
|
193
|
+
|
|
194
|
+
# Show help and available options
|
|
195
|
+
nanocoder --help
|
|
196
|
+
nanocoder -h
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**CLI Options Reference:**
|
|
200
|
+
|
|
201
|
+
| Option | Short | Description |
|
|
202
|
+
|--------|-------|-------------|
|
|
203
|
+
| `--version` | `-v` | Display the installed version number |
|
|
204
|
+
| `--help` | `-h` | Show usage information and available options |
|
|
205
|
+
| `--vscode` | | Run in VS Code mode (for extension) |
|
|
206
|
+
| `--vscode-port` | | Specify VS Code server port |
|
|
207
|
+
| `run` | | Run in non-interactive mode |
|
|
208
|
+
|
|
209
|
+
**Common Use Cases:**
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
# Check version in scripts
|
|
213
|
+
echo "Nanocoder version: $(nanocoder --version)"
|
|
214
|
+
|
|
215
|
+
# Get help in CI/CD pipelines
|
|
216
|
+
nanocoder --help
|
|
217
|
+
|
|
218
|
+
# Quick version check
|
|
219
|
+
nanocoder -v
|
|
220
|
+
|
|
221
|
+
# Discover available options
|
|
222
|
+
nanocoder -h
|
|
223
|
+
```
|
|
224
|
+
|
|
184
225
|
### Interactive Mode
|
|
185
226
|
|
|
186
227
|
To start Nanocoder in interactive mode (the default), simply run:
|
|
@@ -243,9 +284,16 @@ Nanocoder supports any OpenAI-compatible API through a unified provider configur
|
|
|
243
284
|
|
|
244
285
|
**Configuration Methods:**
|
|
245
286
|
|
|
246
|
-
1. **Interactive Setup (Recommended for new users)**: Run `/setup-
|
|
287
|
+
1. **Interactive Setup (Recommended for new users)**: Run `/setup-providers` inside Nanocoder for a guided wizard with provider templates. The wizard allows you to:
|
|
288
|
+
- Choose between project-level or global configuration
|
|
289
|
+
- Select from common provider templates (Ollama, OpenRouter, LM Studio, etc.)
|
|
290
|
+
- Add custom OpenAI-compatible providers manually
|
|
291
|
+
- Edit or delete existing providers
|
|
292
|
+
- Fetch available models automatically from your provider
|
|
247
293
|
2. **Manual Configuration**: Create an `agents.config.json` file (see below for locations)
|
|
248
294
|
|
|
295
|
+
> **Note**: The `/setup-providers` wizard requires at least one provider to be configured before saving. You cannot exit without adding a provider.
|
|
296
|
+
|
|
249
297
|
**Configuration File Locations:**
|
|
250
298
|
|
|
251
299
|
Nanocoder looks for configuration in the following order (first found wins):
|
|
@@ -346,6 +394,7 @@ Nanocoder looks for configuration in the following order (first found wins):
|
|
|
346
394
|
- `baseUrl`: OpenAI-compatible API endpoint
|
|
347
395
|
- `apiKey`: API key (optional, may not be required)
|
|
348
396
|
- `models`: Available model list for `/model` command
|
|
397
|
+
- `disableToolModels`: List of model names to disable tool calling for (optional)
|
|
349
398
|
|
|
350
399
|
**Environment Variables:**
|
|
351
400
|
|
|
@@ -355,7 +404,7 @@ Keep API keys out of version control using environment variables. Variables are
|
|
|
355
404
|
- `NANOCODER_DATA_DIR`: Override the application data directory used for internal data like usage statistics.
|
|
356
405
|
|
|
357
406
|
**Syntax:** `$VAR_NAME`, `${VAR_NAME}`, or `${VAR_NAME:-default}`
|
|
358
|
-
**Supported in:** `baseUrl`, `apiKey`, `models`, MCP server `command`, `args`, `env`
|
|
407
|
+
**Supported in:** `baseUrl`, `apiKey`, `models`, `disableToolModels`, `MCP server`, `command`, `args`, `env`
|
|
359
408
|
|
|
360
409
|
See `.env.example` for setup instructions
|
|
361
410
|
|
|
@@ -441,84 +490,47 @@ For complete documentation, see [Pino Logging Guide](docs/pino-logging.md).
|
|
|
441
490
|
|
|
442
491
|
### MCP (Model Context Protocol) Servers
|
|
443
492
|
|
|
444
|
-
Nanocoder supports
|
|
493
|
+
Nanocoder supports MCP servers to extend its capabilities with additional tools. Configure servers using `.mcp.json` files at project or global level.
|
|
494
|
+
|
|
495
|
+
**Quick Start:**
|
|
496
|
+
|
|
497
|
+
1. Run `/setup-mcp` for an interactive wizard with templates
|
|
498
|
+
2. Or create `.mcp.json` in your project root:
|
|
445
499
|
|
|
446
500
|
```json
|
|
447
501
|
{
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
"command": "npx",
|
|
463
|
-
"args": ["@modelcontextprotocol/server-github"],
|
|
464
|
-
"env": {
|
|
465
|
-
"GITHUB_TOKEN": "your-github-token"
|
|
466
|
-
}
|
|
467
|
-
},
|
|
468
|
-
{
|
|
469
|
-
"name": "remote-search",
|
|
470
|
-
"transport": "http",
|
|
471
|
-
"url": "https://api.example.com/mcp",
|
|
472
|
-
"timeout": 30000
|
|
473
|
-
},
|
|
474
|
-
{
|
|
475
|
-
"name": "websocket-server",
|
|
476
|
-
"transport": "websocket",
|
|
477
|
-
"url": "wss://ws.example.com/mcp",
|
|
478
|
-
"timeout": 60000
|
|
479
|
-
}
|
|
480
|
-
]
|
|
481
|
-
}
|
|
502
|
+
"mcpServers": {
|
|
503
|
+
"filesystem": {
|
|
504
|
+
"transport": "stdio",
|
|
505
|
+
"command": "npx",
|
|
506
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "./src"],
|
|
507
|
+
"alwaysAllow": ["list_directory", "read_file"]
|
|
508
|
+
},
|
|
509
|
+
"github": {
|
|
510
|
+
"transport": "stdio",
|
|
511
|
+
"command": "npx",
|
|
512
|
+
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
513
|
+
"env": { "GITHUB_TOKEN": "$GITHUB_TOKEN" }
|
|
514
|
+
}
|
|
515
|
+
}
|
|
482
516
|
}
|
|
483
517
|
```
|
|
484
518
|
|
|
485
|
-
**
|
|
486
|
-
|
|
487
|
-
- `name`: Display name for the MCP server
|
|
488
|
-
- `transport`: Transport type (`stdio`, `http`, `websocket`)
|
|
489
|
-
- **For stdio transport:**
|
|
490
|
-
- `command`: Executable command to start the server
|
|
491
|
-
- `args`: Array of command-line arguments
|
|
492
|
-
- `env`: Environment variables for the server process
|
|
493
|
-
- **For http/websocket transport:**
|
|
494
|
-
- `url`: Server endpoint URL
|
|
495
|
-
- `timeout`: Connection timeout in milliseconds (optional)
|
|
496
|
-
|
|
497
|
-
**Transport Types:**
|
|
519
|
+
**Key Features:**
|
|
498
520
|
|
|
499
|
-
- **
|
|
500
|
-
- **
|
|
501
|
-
- **
|
|
521
|
+
- **Transport types**: `stdio` (local), `http`, `websocket` (remote)
|
|
522
|
+
- **Auto-approve tools**: Use `alwaysAllow` to skip confirmation for trusted tools
|
|
523
|
+
- **Environment variables**: Use `$VAR` or `${VAR:-default}` syntax
|
|
524
|
+
- **Hierarchical config**: Project-level (`.mcp.json`) overrides global (`~/.config/nanocoder/.mcp.json`)
|
|
502
525
|
|
|
503
|
-
|
|
526
|
+
**Commands:**
|
|
504
527
|
|
|
505
|
-
-
|
|
506
|
-
-
|
|
507
|
-
- Show connected servers and their tools with the `/mcp` command
|
|
508
|
-
- Display transport type and connection details in configuration summary
|
|
528
|
+
- `/setup-mcp` - Interactive configuration wizard (supports `Ctrl+E` for manual editing)
|
|
529
|
+
- `/mcp` - Show connected servers and their tools
|
|
509
530
|
|
|
510
|
-
Popular MCP servers:
|
|
531
|
+
Popular MCP servers: Filesystem, GitHub, Brave Search, Context7, DeepWiki, and [many more](https://github.com/modelcontextprotocol/servers).
|
|
511
532
|
|
|
512
|
-
|
|
513
|
-
- **GitHub**: Repository management (stdio)
|
|
514
|
-
- **Brave Search**: Web search capabilities (http)
|
|
515
|
-
- **Memory**: Persistent context storage
|
|
516
|
-
- **Context7**: Documentation lookup (http)
|
|
517
|
-
- **DeepWiki**: Wikipedia search (http)
|
|
518
|
-
- **Sequential Thinking**: Advanced reasoning (http)
|
|
519
|
-
- [View more MCP servers](https://github.com/modelcontextprotocol/servers)
|
|
520
|
-
|
|
521
|
-
> **Note**: MCP server configuration follows the same location hierarchy as AI provider setup above. Use `/setup-config` for an interactive configuration wizard with templates for both local and remote MCP servers, or manually edit `agents.config.json` at the project level (current directory) or user level (platform-specific paths listed above).
|
|
533
|
+
> **Full documentation**: See the [MCP Configuration Guide](docs/mcp-configuration.md) for detailed setup, examples, and troubleshooting.
|
|
522
534
|
|
|
523
535
|
### User Preferences
|
|
524
536
|
|
|
@@ -563,7 +575,8 @@ You can override this directory using `NANOCODER_DATA_DIR`.
|
|
|
563
575
|
|
|
564
576
|
- `/help` - Show available commands
|
|
565
577
|
- `/init` - Initialize project with intelligent analysis, create AGENTS.md and configuration files. Use `/init --force` to regenerate AGENTS.md if it already exists.
|
|
566
|
-
- `/setup-
|
|
578
|
+
- `/setup-providers` - Interactive wizard for configuring AI providers with templates
|
|
579
|
+
- `/setup-mcp` - Interactive wizard for configuring MCP servers with templates
|
|
567
580
|
- `/clear` - Clear chat history
|
|
568
581
|
- `/model` - Switch between available models
|
|
569
582
|
- `/provider` - Switch between configured AI providers
|
|
@@ -572,10 +585,12 @@ You can override this directory using `NANOCODER_DATA_DIR`.
|
|
|
572
585
|
- `/mcp` - Show connected MCP servers and their tools
|
|
573
586
|
- `/custom-commands` - List all custom commands
|
|
574
587
|
- `/checkpoint` - Save and restore conversation snapshots (see [Checkpointing](#checkpointing) section)
|
|
588
|
+
- `/compact` - Compress message history to reduce context usage (see [Context Compression](docs/context-compression.md))
|
|
575
589
|
- `/exit` - Exit the application
|
|
576
590
|
- `/export` - Export current session to markdown file
|
|
577
591
|
- `/theme` - Select a theme for the Nanocoder CLI
|
|
578
592
|
- `/title-shape` - Select a title shape style for the Nanocoder CLI (real-time preview)
|
|
593
|
+
- `/nanocoder-shape` - Select a branding font style for the Nanocoder welcome banner (real-time preview)
|
|
579
594
|
- `/update` - Update Nanocoder to the latest version
|
|
580
595
|
- `/usage` – Get current model context usage visually
|
|
581
596
|
- `/lsp` – List connected LSP servers
|
|
@@ -722,6 +737,21 @@ Generate comprehensive unit tests for {{component}}. Include:
|
|
|
722
737
|
- **Auto-accept mode**: Automatically accepts more tool calls without confirmation for faster workflows
|
|
723
738
|
- **Plan mode**: AI suggests actions but doesn't execute tools - useful for planning and exploration
|
|
724
739
|
|
|
740
|
+
### Keyboard Shortcuts
|
|
741
|
+
|
|
742
|
+
| Action | Shortcut | Notes |
|
|
743
|
+
|--------|----------|-------|
|
|
744
|
+
| Submit prompt | Enter | |
|
|
745
|
+
| New line (multi-line input) | Ctrl+J | Most reliable across terminals |
|
|
746
|
+
| New line (multi-line input) | Shift+Enter | Terminal-dependent |
|
|
747
|
+
| New line (multi-line input) | Option/Alt+Enter | VS Code integrated terminal |
|
|
748
|
+
| Toggle development mode | Shift+Tab | Cycles through normal/auto-accept/plan |
|
|
749
|
+
| Cancel AI response | Esc | While AI is processing |
|
|
750
|
+
| Clear input | Esc (twice) | Press Esc twice to clear current input |
|
|
751
|
+
| History navigation | ↑/↓ | Navigate through prompt history |
|
|
752
|
+
|
|
753
|
+
> **Note on multi-line input**: Terminal support for Shift+Enter / Option/Alt+Enter varies in terminals and operating systems. If one of these shortcuts doesn't work in your terminal, try and use Ctrl+J which sends a literal newline character and works more reliably across platforms and software.
|
|
754
|
+
|
|
725
755
|
### Developer Features
|
|
726
756
|
|
|
727
757
|
- **TypeScript-first**: Full type safety and IntelliSense support
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-handler.d.ts","sourceRoot":"","sources":["../../../source/ai-sdk-client/chat/chat-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,IAAI,CAAC;AAStC,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,OAAO,EACP,eAAe,EAEf,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-handler.d.ts","sourceRoot":"","sources":["../../../source/ai-sdk-client/chat/chat-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,IAAI,CAAC;AAStC,OAAO,KAAK,EACX,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,OAAO,EACP,eAAe,EAEf,MAAM,eAAe,CAAC;AA0BvB,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,gBAAgB,CAAC;IACjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC/B,MAAM,EAAE,iBAAiB,GACvB,OAAO,CAAC,eAAe,CAAC,CAuV1B"}
|
|
@@ -5,35 +5,79 @@ import { convertToModelMessages } from '../converters/message-converter.js';
|
|
|
5
5
|
import { convertAISDKToolCalls, generateToolCallId, getToolResultOutput, } from '../converters/tool-converter.js';
|
|
6
6
|
import { extractRootError } from '../error-handling/error-extractor.js';
|
|
7
7
|
import { parseAPIError } from '../error-handling/error-parser.js';
|
|
8
|
+
import { isToolSupportError } from '../error-handling/tool-error-detector.js';
|
|
9
|
+
import { formatToolsForPrompt } from '../tools/tool-prompt-formatter.js';
|
|
8
10
|
import { createOnStepFinishHandler, createPrepareStepHandler, } from './streaming-handler.js';
|
|
9
11
|
import { processXMLToolCalls } from './tool-processor.js';
|
|
10
12
|
/**
|
|
11
13
|
* Main chat handler - orchestrates the entire chat flow
|
|
12
14
|
*/
|
|
13
15
|
export async function handleChat(params) {
|
|
14
|
-
const { model, currentModel, providerConfig, messages, tools, callbacks, signal, maxRetries, } = params;
|
|
16
|
+
const { model, currentModel, providerConfig, messages, tools, callbacks, signal, maxRetries, skipTools = false, } = params;
|
|
15
17
|
const logger = getLogger();
|
|
16
18
|
// Check if already aborted before starting
|
|
17
19
|
if (signal?.aborted) {
|
|
18
20
|
logger.debug('Chat request already aborted');
|
|
19
21
|
throw new Error('Operation was cancelled');
|
|
20
22
|
}
|
|
23
|
+
// Check if tools should be disabled
|
|
24
|
+
const shouldDisableTools = skipTools ||
|
|
25
|
+
providerConfig.disableTools ||
|
|
26
|
+
(providerConfig.disableToolModels &&
|
|
27
|
+
providerConfig.disableToolModels.includes(currentModel));
|
|
21
28
|
// Start performance tracking
|
|
22
29
|
const metrics = startMetrics();
|
|
23
30
|
const correlationId = getCorrelationId() || generateCorrelationId();
|
|
31
|
+
if (shouldDisableTools) {
|
|
32
|
+
logger.info('Tools disabled for request', {
|
|
33
|
+
model: currentModel,
|
|
34
|
+
reason: skipTools
|
|
35
|
+
? 'retry without tools'
|
|
36
|
+
: providerConfig.disableTools
|
|
37
|
+
? 'provider configuration'
|
|
38
|
+
: 'model configuration',
|
|
39
|
+
correlationId,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
24
42
|
logger.info('Chat request starting', {
|
|
25
43
|
model: currentModel,
|
|
26
44
|
messageCount: messages.length,
|
|
27
|
-
toolCount: Object.keys(tools).length,
|
|
45
|
+
toolCount: shouldDisableTools ? 0 : Object.keys(tools).length,
|
|
28
46
|
correlationId,
|
|
29
47
|
provider: providerConfig.name,
|
|
30
48
|
});
|
|
31
49
|
return await withNewCorrelationContext(async (_context) => {
|
|
32
50
|
try {
|
|
33
51
|
// Tools are already in AI SDK format - use directly
|
|
34
|
-
const aiTools =
|
|
52
|
+
const aiTools = shouldDisableTools
|
|
53
|
+
? undefined
|
|
54
|
+
: Object.keys(tools).length > 0
|
|
55
|
+
? tools
|
|
56
|
+
: undefined;
|
|
57
|
+
// When native tools are disabled but we have tools, inject definitions into system prompt
|
|
58
|
+
// This allows the model to still use tools via XML format
|
|
59
|
+
let messagesWithToolPrompt = messages;
|
|
60
|
+
if (shouldDisableTools && Object.keys(tools).length > 0) {
|
|
61
|
+
const toolPrompt = formatToolsForPrompt(tools);
|
|
62
|
+
if (toolPrompt) {
|
|
63
|
+
// Find and augment the system message with tool definitions
|
|
64
|
+
messagesWithToolPrompt = messages.map((msg, index) => {
|
|
65
|
+
if (msg.role === 'system' && index === 0) {
|
|
66
|
+
return {
|
|
67
|
+
...msg,
|
|
68
|
+
content: msg.content + toolPrompt,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return msg;
|
|
72
|
+
});
|
|
73
|
+
logger.debug('Injected tool definitions into system prompt', {
|
|
74
|
+
toolCount: Object.keys(tools).length,
|
|
75
|
+
promptLength: toolPrompt.length,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
35
79
|
// Convert messages to AI SDK v5 ModelMessage format
|
|
36
|
-
const modelMessages = convertToModelMessages(
|
|
80
|
+
const modelMessages = convertToModelMessages(messagesWithToolPrompt);
|
|
37
81
|
logger.debug('AI SDK request prepared', {
|
|
38
82
|
messageCount: modelMessages.length,
|
|
39
83
|
hasTools: !!aiTools,
|
|
@@ -157,6 +201,20 @@ export async function handleChat(params) {
|
|
|
157
201
|
});
|
|
158
202
|
throw new Error('Operation was cancelled');
|
|
159
203
|
}
|
|
204
|
+
// Check if error indicates tool support issue and we haven't retried
|
|
205
|
+
if (!skipTools && isToolSupportError(error)) {
|
|
206
|
+
logger.warn('Tool support error detected, retrying without tools', {
|
|
207
|
+
model: currentModel,
|
|
208
|
+
error: error instanceof Error ? error.message : error,
|
|
209
|
+
correlationId,
|
|
210
|
+
provider: providerConfig.name,
|
|
211
|
+
});
|
|
212
|
+
// Retry without tools
|
|
213
|
+
return await handleChat({
|
|
214
|
+
...params,
|
|
215
|
+
skipTools: true, // Mark that we're retrying
|
|
216
|
+
});
|
|
217
|
+
}
|
|
160
218
|
// Handle tool-specific errors - NoSuchToolError
|
|
161
219
|
if (error instanceof NoSuchToolError) {
|
|
162
220
|
logger.error('Tool not found', {
|
|
@@ -168,8 +226,8 @@ export async function handleChat(params) {
|
|
|
168
226
|
// Provide helpful error message with available tools
|
|
169
227
|
const availableTools = Object.keys(tools).join(', ');
|
|
170
228
|
const errorMessage = availableTools
|
|
171
|
-
? `Tool "
|
|
172
|
-
: `Tool "
|
|
229
|
+
? `Tool "${error.toolName}" does not exist. Available tools: ${availableTools}`
|
|
230
|
+
: `Tool "${error.toolName}" does not exist and no tools are currently loaded.`;
|
|
173
231
|
throw new Error(errorMessage);
|
|
174
232
|
}
|
|
175
233
|
// Handle tool-specific errors - InvalidToolInputError
|
|
@@ -182,7 +240,7 @@ export async function handleChat(params) {
|
|
|
182
240
|
validationError: error.message,
|
|
183
241
|
});
|
|
184
242
|
// Provide clear validation error
|
|
185
|
-
throw new Error(`Invalid arguments for tool "
|
|
243
|
+
throw new Error(`Invalid arguments for tool "${error.toolName}": ${error.message}`);
|
|
186
244
|
}
|
|
187
245
|
// Handle tool-specific errors - ToolCallRepairError
|
|
188
246
|
if (error instanceof ToolCallRepairError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-handler.js","sourceRoot":"","sources":["../../../source/ai-sdk-client/chat/chat-handler.ts"],"names":[],"mappings":"AACA,OAAO,EACN,YAAY,EACZ,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,mBAAmB,GACnB,MAAM,IAAI,CAAC;AACZ,OAAO,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAS3C,OAAO,EACN,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,yBAAyB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,sBAAsB,EAAC,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACN,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAC,gBAAgB,EAAC,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAC,aAAa,EAAC,MAAM,mCAAmC,CAAC;AAChE,OAAO,EACN,yBAAyB,EACzB,wBAAwB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-handler.js","sourceRoot":"","sources":["../../../source/ai-sdk-client/chat/chat-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects if an error indicates the model doesn't support tool calling
|
|
3
|
+
*
|
|
4
|
+
* This is used to automatically retry requests without tools when a model
|
|
5
|
+
* rejects tool definitions (common with some local models like deepseek-r1 via Ollama)
|
|
6
|
+
*/
|
|
7
|
+
export declare function isToolSupportError(error: unknown): boolean;
|
|
8
|
+
//# sourceMappingURL=tool-error-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-detector.d.ts","sourceRoot":"","sources":["../../../source/ai-sdk-client/error-handling/tool-error-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqD1D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects if an error indicates the model doesn't support tool calling
|
|
3
|
+
*
|
|
4
|
+
* This is used to automatically retry requests without tools when a model
|
|
5
|
+
* rejects tool definitions (common with some local models like deepseek-r1 via Ollama)
|
|
6
|
+
*/
|
|
7
|
+
export function isToolSupportError(error) {
|
|
8
|
+
if (!(error instanceof Error)) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const message = error.message.toLowerCase();
|
|
12
|
+
// Pattern 1: 400 Bad Request with tool-related messages
|
|
13
|
+
if (message.includes('400') && message.includes('bad request')) {
|
|
14
|
+
const toolPatterns = [
|
|
15
|
+
/tool/i,
|
|
16
|
+
/function/i,
|
|
17
|
+
/invalid.*parameter/i,
|
|
18
|
+
/unexpected.*field/i,
|
|
19
|
+
/unrecognized/i,
|
|
20
|
+
];
|
|
21
|
+
for (const pattern of toolPatterns) {
|
|
22
|
+
if (pattern.test(message)) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Pattern 2: Direct mentions of tool/function not supported
|
|
28
|
+
const directPatterns = [
|
|
29
|
+
/tool.*not.*support/i,
|
|
30
|
+
/function.*not.*support/i,
|
|
31
|
+
/tool.*unsupported/i,
|
|
32
|
+
/function.*unsupported/i,
|
|
33
|
+
/invalid.*tool/i,
|
|
34
|
+
/invalid.*function/i,
|
|
35
|
+
/tool.*parameter.*invalid/i,
|
|
36
|
+
/function.*parameter.*invalid/i,
|
|
37
|
+
];
|
|
38
|
+
for (const pattern of directPatterns) {
|
|
39
|
+
if (pattern.test(message)) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Pattern 3: Ollama-specific error messages
|
|
44
|
+
// Ollama may return errors like: "invalid character 't' looking for beginning of value"
|
|
45
|
+
// when it encounters the 'tools' field in JSON
|
|
46
|
+
if (message.includes('invalid character') &&
|
|
47
|
+
message.includes('after top-level value')) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=tool-error-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-detector.js","sourceRoot":"","sources":["../../../source/ai-sdk-client/error-handling/tool-error-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAE5C,wDAAwD;IACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAChE,MAAM,YAAY,GAAG;YACpB,OAAO;YACP,WAAW;YACX,qBAAqB;YACrB,oBAAoB;YACpB,eAAe;SACf,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;IACF,CAAC;IAED,4DAA4D;IAC5D,MAAM,cAAc,GAAG;QACtB,qBAAqB;QACrB,yBAAyB;QACzB,oBAAoB;QACpB,wBAAwB;QACxB,gBAAgB;QAChB,oBAAoB;QACpB,2BAA2B;QAC3B,+BAA+B;KAC/B,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,4CAA4C;IAC5C,wFAAwF;IACxF,+CAA+C;IAC/C,IACC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACrC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EACxC,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AISDKCoreTool } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Formats tool definitions for injection into the system prompt
|
|
4
|
+
* Used when native tool calling is disabled but we still want the model
|
|
5
|
+
* to be able to call tools via XML format
|
|
6
|
+
*/
|
|
7
|
+
export declare function formatToolsForPrompt(tools: Record<string, AISDKCoreTool>): string;
|
|
8
|
+
//# sourceMappingURL=tool-prompt-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-prompt-formatter.d.ts","sourceRoot":"","sources":["../../../source/ai-sdk-client/tools/tool-prompt-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,eAAe,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAClC,MAAM,CAyBR"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats tool definitions for injection into the system prompt
|
|
3
|
+
* Used when native tool calling is disabled but we still want the model
|
|
4
|
+
* to be able to call tools via XML format
|
|
5
|
+
*/
|
|
6
|
+
export function formatToolsForPrompt(tools) {
|
|
7
|
+
const toolNames = Object.keys(tools);
|
|
8
|
+
if (toolNames.length === 0) {
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
let prompt = '\n\n## AVAILABLE TOOLS\n\n';
|
|
12
|
+
prompt +=
|
|
13
|
+
'You have access to the following tools. To use a tool, output an XML block in this exact format:\n\n';
|
|
14
|
+
prompt +=
|
|
15
|
+
'```xml\n<tool_name>\n<param1>value1</param1>\n<param2>value2</param2>\n</tool_name>\n```\n\n';
|
|
16
|
+
prompt += 'IMPORTANT:\n';
|
|
17
|
+
prompt += '- Use the exact tool name as the outer XML tag\n';
|
|
18
|
+
prompt += '- Each parameter should be its own XML tag inside\n';
|
|
19
|
+
prompt +=
|
|
20
|
+
'- Do NOT use attributes like <function=name> or <parameter=name>\n';
|
|
21
|
+
prompt += '- You may call multiple tools in sequence\n\n';
|
|
22
|
+
for (const name of toolNames) {
|
|
23
|
+
const tool = tools[name];
|
|
24
|
+
prompt += formatSingleTool(name, tool);
|
|
25
|
+
}
|
|
26
|
+
return prompt;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Formats a single tool definition
|
|
30
|
+
*/
|
|
31
|
+
function formatSingleTool(name, tool) {
|
|
32
|
+
let output = `### ${name}\n\n`;
|
|
33
|
+
// Extract description from tool
|
|
34
|
+
const description = extractDescription(tool);
|
|
35
|
+
if (description) {
|
|
36
|
+
output += `${description}\n\n`;
|
|
37
|
+
}
|
|
38
|
+
// Extract and format parameters
|
|
39
|
+
const schema = extractInputSchema(tool);
|
|
40
|
+
if (schema && schema.properties) {
|
|
41
|
+
output += '**Parameters:**\n';
|
|
42
|
+
const properties = schema.properties;
|
|
43
|
+
const required = schema.required || [];
|
|
44
|
+
for (const [paramName, paramSchema] of Object.entries(properties)) {
|
|
45
|
+
const isRequired = required.includes(paramName);
|
|
46
|
+
const typeStr = paramSchema.type || 'any';
|
|
47
|
+
const reqStr = isRequired ? '(required)' : '(optional)';
|
|
48
|
+
const descStr = paramSchema.description || '';
|
|
49
|
+
output += `- \`${paramName}\` (${typeStr}) ${reqStr}: ${descStr}\n`;
|
|
50
|
+
}
|
|
51
|
+
output += '\n';
|
|
52
|
+
// Add example usage
|
|
53
|
+
output += '**Example:**\n```xml\n';
|
|
54
|
+
output += `<${name}>\n`;
|
|
55
|
+
for (const paramName of required.slice(0, 2)) {
|
|
56
|
+
// Show first 2 required params
|
|
57
|
+
output += `<${paramName}>value</${paramName}>\n`;
|
|
58
|
+
}
|
|
59
|
+
output += `</${name}>\n`;
|
|
60
|
+
output += '```\n\n';
|
|
61
|
+
}
|
|
62
|
+
return output;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extracts description from AI SDK tool
|
|
66
|
+
*/
|
|
67
|
+
function extractDescription(tool) {
|
|
68
|
+
// AI SDK tools have description at the top level
|
|
69
|
+
if ('description' in tool && typeof tool.description === 'string') {
|
|
70
|
+
return tool.description;
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extracts input schema from AI SDK tool
|
|
76
|
+
*/
|
|
77
|
+
function extractInputSchema(tool) {
|
|
78
|
+
// AI SDK v6 tools use inputSchema (from jsonSchema())
|
|
79
|
+
if ('inputSchema' in tool && tool.inputSchema) {
|
|
80
|
+
const schema = tool.inputSchema;
|
|
81
|
+
// jsonSchema() wraps the schema, so we need to unwrap it
|
|
82
|
+
if (schema.jsonSchema) {
|
|
83
|
+
return schema.jsonSchema;
|
|
84
|
+
}
|
|
85
|
+
return schema;
|
|
86
|
+
}
|
|
87
|
+
// Fallback: check for parameters (older format)
|
|
88
|
+
if ('parameters' in tool && tool.parameters) {
|
|
89
|
+
const params = tool.parameters;
|
|
90
|
+
if (params.jsonSchema) {
|
|
91
|
+
return params.jsonSchema;
|
|
92
|
+
}
|
|
93
|
+
return params;
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=tool-prompt-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-prompt-formatter.js","sourceRoot":"","sources":["../../../source/ai-sdk-client/tools/tool-prompt-formatter.ts"],"names":[],"mappings":"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"}
|
package/dist/app/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../source/app/App.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AA6B1C,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAC3B,UAAkB,EAClB,UAAU,EACV,oBAAoB,EACpB,kBAA0B,GAC1B,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../source/app/App.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AA6B1C,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAC3B,UAAkB,EAClB,UAAU,EACV,oBAAoB,EACpB,kBAA0B,GAC1B,EAAE,QAAQ,2CAumBV"}
|