dexto 1.4.0 → 1.5.1
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/README.md +62 -7
- package/dist/agents/agent-template.yml +2 -2
- package/dist/agents/coding-agent/coding-agent.yml +22 -16
- package/dist/agents/database-agent/database-agent.yml +2 -2
- package/dist/agents/default-agent.yml +7 -5
- package/dist/agents/github-agent/github-agent.yml +2 -2
- package/dist/agents/product-name-researcher/product-name-researcher.yml +2 -2
- package/dist/agents/talk2pdf-agent/talk2pdf-agent.yml +2 -2
- package/dist/analytics/events.d.ts +13 -6
- package/dist/analytics/events.d.ts.map +1 -1
- package/dist/analytics/index.d.ts +1 -1
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +6 -2
- package/dist/api/server-hono.d.ts.map +1 -1
- package/dist/api/server-hono.js +27 -5
- package/dist/cli/cli-subscriber.d.ts +4 -0
- package/dist/cli/cli-subscriber.d.ts.map +1 -1
- package/dist/cli/cli-subscriber.js +40 -2
- package/dist/cli/commands/create-app.d.ts +16 -14
- package/dist/cli/commands/create-app.d.ts.map +1 -1
- package/dist/cli/commands/create-app.js +626 -102
- package/dist/cli/commands/create-image.d.ts +7 -0
- package/dist/cli/commands/create-image.d.ts.map +1 -0
- package/dist/cli/commands/create-image.js +201 -0
- package/dist/cli/commands/helpers/formatters.js +7 -7
- package/dist/cli/commands/index.d.ts +2 -1
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -1
- package/dist/cli/commands/init-app.js +7 -7
- package/dist/cli/commands/install.d.ts +0 -3
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +10 -35
- package/dist/cli/commands/interactive-commands/command-parser.d.ts +1 -1
- package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/command-parser.js +18 -8
- package/dist/cli/commands/interactive-commands/general-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/general-commands.js +64 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.js +11 -11
- package/dist/cli/commands/interactive-commands/system/system-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/system/system-commands.js +6 -5
- package/dist/cli/commands/list-agents.js +2 -2
- package/dist/cli/commands/session-commands.js +16 -16
- package/dist/cli/commands/setup.d.ts +13 -5
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +995 -65
- package/dist/cli/commands/which.js +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +2 -0
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.js +29 -7
- package/dist/cli/ink-cli/components/CustomInput.js +1 -1
- package/dist/cli/ink-cli/components/EditableMultiLineInput.js +4 -4
- package/dist/cli/ink-cli/components/ElicitationForm.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ElicitationForm.js +6 -6
- package/dist/cli/ink-cli/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ErrorBoundary.js +1 -1
- package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/Footer.js +1 -1
- package/dist/cli/ink-cli/components/HistorySearchBar.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/HistorySearchBar.js +1 -1
- package/dist/cli/ink-cli/components/MultiLineInput.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/MultiLineInput.js +3 -3
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ResourceAutocomplete.js +4 -4
- package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +3 -3
- package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/StatusBar.js +7 -5
- package/dist/cli/ink-cli/components/TextBufferInput.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/TextBufferInput.js +13 -9
- package/dist/cli/ink-cli/components/base/BaseAutocomplete.js +4 -4
- package/dist/cli/ink-cli/components/base/BaseSelector.js +2 -2
- package/dist/cli/ink-cli/components/chat/Footer.js +1 -1
- package/dist/cli/ink-cli/components/chat/Header.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/Header.js +2 -4
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/MessageItem.js +9 -6
- package/dist/cli/ink-cli/components/chat/MessageList.js +1 -1
- package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.js +1 -1
- package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts +1 -1
- package/dist/cli/ink-cli/components/chat/ToolIcon.js +4 -4
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.js +2 -2
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.js +5 -5
- package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.js +2 -2
- package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.js +1 -1
- package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.js +2 -2
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +1 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.js +1 -1
- package/dist/cli/ink-cli/components/overlays/ApiKeyInput.js +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts +10 -2
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +209 -89
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +2 -2
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpAddChoice.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpAddSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.js +2 -2
- package/dist/cli/ink-cli/components/overlays/McpCustomWizard.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerActions.js +2 -2
- package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/McpServerList.js +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +6 -5
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +284 -68
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptAddChoice.js +2 -2
- package/dist/cli/ink-cli/components/overlays/PromptAddWizard.js +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.js +2 -2
- package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/PromptList.js +2 -2
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/SearchOverlay.js +4 -4
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/StreamSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +12 -12
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts +25 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.js +609 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts +15 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.js +14 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +33 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +462 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts +25 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.js +29 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts +17 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.js +11 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts +20 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.js +10 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts +30 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.js +13 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts +8 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.js +7 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts +85 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.js +38 -0
- package/dist/cli/ink-cli/components/renderers/DiffRenderer.js +2 -2
- package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +1 -1
- package/dist/cli/ink-cli/components/renderers/FileRenderer.js +4 -4
- package/dist/cli/ink-cli/components/renderers/GenericRenderer.js +2 -2
- package/dist/cli/ink-cli/components/renderers/SearchRenderer.js +1 -1
- package/dist/cli/ink-cli/components/renderers/ShellRenderer.js +3 -3
- package/dist/cli/ink-cli/components/renderers/diff-shared.js +1 -1
- package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/shared/MarkdownText.js +8 -6
- package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/InputContainer.js +23 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.js +81 -25
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts +9 -2
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.js +148 -6
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts +1 -1
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useCLIState.js +7 -2
- package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts +11 -7
- package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useTokenCounter.js +41 -18
- package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/processStream.js +97 -17
- package/dist/cli/ink-cli/state/types.d.ts +5 -4
- package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts +5 -0
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/messageFormatting.js +59 -1
- package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/toolUtils.js +2 -0
- package/dist/cli/utils/api-key-setup.d.ts +54 -4
- package/dist/cli/utils/api-key-setup.d.ts.map +1 -1
- package/dist/cli/utils/api-key-setup.js +433 -107
- package/dist/cli/utils/api-key-verification.d.ts +17 -0
- package/dist/cli/utils/api-key-verification.d.ts.map +1 -0
- package/dist/cli/utils/api-key-verification.js +211 -0
- package/dist/cli/utils/config-validation.d.ts +22 -2
- package/dist/cli/utils/config-validation.d.ts.map +1 -1
- package/dist/cli/utils/config-validation.js +354 -25
- package/dist/cli/utils/local-model-setup.d.ts +46 -0
- package/dist/cli/utils/local-model-setup.d.ts.map +1 -0
- package/dist/cli/utils/local-model-setup.js +662 -0
- package/dist/cli/utils/options.js +1 -1
- package/dist/cli/utils/prompt-helpers.d.ts +47 -0
- package/dist/cli/utils/prompt-helpers.d.ts.map +1 -0
- package/dist/cli/utils/prompt-helpers.js +66 -0
- package/dist/cli/utils/provider-setup.d.ts +66 -8
- package/dist/cli/utils/provider-setup.d.ts.map +1 -1
- package/dist/cli/utils/provider-setup.js +324 -84
- package/dist/cli/utils/scaffolding-utils.d.ts +76 -0
- package/dist/cli/utils/scaffolding-utils.d.ts.map +1 -0
- package/dist/cli/utils/scaffolding-utils.js +246 -0
- package/dist/cli/utils/setup-utils.d.ts +16 -0
- package/dist/cli/utils/setup-utils.d.ts.map +1 -1
- package/dist/cli/utils/setup-utils.js +72 -21
- package/dist/cli/utils/template-engine.d.ts +65 -0
- package/dist/cli/utils/template-engine.d.ts.map +1 -0
- package/dist/cli/utils/template-engine.js +1089 -0
- package/dist/config/cli-overrides.d.ts +44 -1
- package/dist/config/cli-overrides.d.ts.map +1 -1
- package/dist/config/cli-overrides.js +102 -0
- package/dist/index.js +339 -56
- package/dist/webui/assets/index-8j-KMkX1.js +2054 -0
- package/dist/webui/assets/index-c_AX24V4.css +1 -0
- package/dist/webui/index.html +3 -9
- package/dist/webui/logos/aws-color.svg +1 -0
- package/dist/webui/logos/dexto/dexto_logo.svg +1 -1
- package/dist/webui/logos/dexto/dexto_logo_light.svg +6 -6
- package/dist/webui/logos/glama.svg +7 -0
- package/dist/webui/logos/litellm.svg +7 -0
- package/dist/webui/logos/openrouter.svg +1 -0
- package/package.json +8 -7
- package/dist/webui/assets/index-BkwPkZpd.css +0 -1
- package/dist/webui/assets/index-D9u1XfyH.js +0 -2025
package/README.md
CHANGED
|
@@ -309,14 +309,31 @@ systemPrompt: |
|
|
|
309
309
|
|
|
310
310
|
Switch between providers instantly—no code changes required.
|
|
311
311
|
|
|
312
|
+
#### Built-in Providers
|
|
313
|
+
|
|
314
|
+
| Provider | Models | Setup |
|
|
315
|
+
|----------|--------|-------|
|
|
316
|
+
| **OpenAI** | `gpt-5.1-chat-latest`, `gpt-5.1`, `gpt-5.1-codex`, `gpt-5-mini`, `gpt-4.1`, `gpt-4o`, `o4-mini`, `o3`, `o1` | API key |
|
|
317
|
+
| **Anthropic** | `claude-sonnet-4-5-20250929`, `claude-opus-4-5-20251101`, `claude-haiku-4-5-20251001`, `claude-3-7-sonnet-20250219` | API key |
|
|
318
|
+
| **Google** | `gemini-3-pro-preview`, `gemini-3-pro-image-preview`, `gemini-3-flash-preview`, `gemini-2.5-pro`, `gemini-2.5-flash`, `gemini-2.0-flash` | API key |
|
|
319
|
+
| **Groq** | `llama-3.3-70b-versatile`, `gemma-2-9b-it`, `openai/gpt-oss-20b`, `openai/gpt-oss-120b`, `moonshotai/kimi-k2-instruct`, `meta-llama/llama-4-scout-17b-16e-instruct`, `meta-llama/llama-4-maverick-17b-128e-instruct`, `deepseek-r1-distill-llama-70b`, `qwen/qwen3-32b` | API key |
|
|
320
|
+
| **xAI** | `grok-4`, `grok-3`, `grok-3-mini`, `grok-code-fast-1` | API key |
|
|
321
|
+
| **Cohere** | `command-a-03-2025`, `command-r-plus`, `command-r`, `command-r7b` | API key |
|
|
322
|
+
|
|
323
|
+
#### Cloud Platforms
|
|
324
|
+
|
|
325
|
+
| Provider | Models | Setup |
|
|
326
|
+
|----------|--------|-------|
|
|
327
|
+
| **Vertex AI** | Gemini, Claude | GCP credentials ([docs](https://docs.dexto.ai/docs/guides/supported-llm-providers#google-cloud-vertex-ai)) |
|
|
328
|
+
| **AWS Bedrock** | Claude, Nova, Llama, Mistral | AWS credentials ([docs](https://docs.dexto.ai/docs/guides/supported-llm-providers#amazon-bedrock)) |
|
|
329
|
+
|
|
330
|
+
#### Gateway Providers
|
|
331
|
+
|
|
312
332
|
| Provider | Models | Setup |
|
|
313
333
|
|----------|--------|-------|
|
|
314
|
-
| **
|
|
315
|
-
| **
|
|
316
|
-
| **
|
|
317
|
-
| **Groq** | `llama-3.3-70b-versatile`, `meta-llama/llama-4-scout-17b-16e-instruct`, `meta-llama/llama-4-maverick-17b-128e-instruct`, `qwen/qwen3-32b`, `gemma-2-9b-it`, `openai/gpt-oss-20b`, `openai/gpt-oss-120b`, `moonshotai/kimi-k2-instruct`, `deepseek-r1-distill-llama-70b` | `change model in UI and add api key` |
|
|
318
|
-
| **xAI** | `grok-4`, `grok-3`, `grok-3-mini`, `grok-code-fast-1` | `change model in UI and add api key` |
|
|
319
|
-
| **Cohere** | `command-a-03-2025`, `command-r-plus`, `command-r`, `command-r7b` | `change model in UI and add api key` |
|
|
334
|
+
| **OpenRouter** | 100+ models via `provider/model` format | API key |
|
|
335
|
+
| **Glama** | Multi-provider access via `provider/model` format | API key |
|
|
336
|
+
| **LiteLLM** | Self-hosted proxy for any provider | API key + baseURL |
|
|
320
337
|
|
|
321
338
|
```bash
|
|
322
339
|
# Switch models via CLI
|
|
@@ -326,7 +343,9 @@ dexto -m gemini-2.5-pro
|
|
|
326
343
|
|
|
327
344
|
You can configure things like LLM, system prompt, MCP servers, storage, sessions, human-in-the loop, telemetry and more!
|
|
328
345
|
|
|
329
|
-
|
|
346
|
+
You can also switch within the interactive CLI (/model) and in the web UI easily without needing to set up configuration.
|
|
347
|
+
|
|
348
|
+
See our [Configuration Guide](https://docs.dexto.ai/docs/category/agent-configuration-guide) and [Supported LLM Providers](https://docs.dexto.ai/docs/guides/supported-llm-providers) for complete setup instructions.
|
|
330
349
|
|
|
331
350
|
|
|
332
351
|
## Dexto Agent SDK
|
|
@@ -381,6 +400,42 @@ See our [Dexto Agent SDK docs](https://docs.dexto.ai/docs/guides/dexto-sdk) for
|
|
|
381
400
|
|
|
382
401
|
## Advanced Usage
|
|
383
402
|
|
|
403
|
+
### Starting a Server
|
|
404
|
+
|
|
405
|
+
Start a Dexto server programmatically to expose REST and SSE streaming APIs to interact and manage your agent backend.
|
|
406
|
+
|
|
407
|
+
```typescript
|
|
408
|
+
import { DextoAgent } from '@dexto/core';
|
|
409
|
+
import { startHonoApiServer } from 'dexto';
|
|
410
|
+
|
|
411
|
+
// Create and configure agent
|
|
412
|
+
const agent = new DextoAgent({
|
|
413
|
+
llm: {
|
|
414
|
+
provider: 'openai',
|
|
415
|
+
model: 'gpt-5-mini',
|
|
416
|
+
apiKey: process.env.OPENAI_API_KEY
|
|
417
|
+
},
|
|
418
|
+
mcpServers: {
|
|
419
|
+
filesystem: {
|
|
420
|
+
type: 'stdio',
|
|
421
|
+
command: 'npx',
|
|
422
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', '.']
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// Start server on port 3001
|
|
428
|
+
const { server } = await startHonoApiServer(agent, 3001);
|
|
429
|
+
|
|
430
|
+
console.log('Dexto server running at http://localhost:3001');
|
|
431
|
+
// Server provides REST API and SSE streaming endpoints
|
|
432
|
+
// POST /api/message - Send messages
|
|
433
|
+
// GET /api/sessions - List sessions
|
|
434
|
+
// See docs.dexto.ai/api/rest/ for all endpoints
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
This starts an HTTP server with full REST and SSE APIs, enabling integration with web frontends, webhooks, and other services. See the [REST API Documentation](https://docs.dexto.ai/api/rest/) for available endpoints.
|
|
438
|
+
|
|
384
439
|
### Session Management
|
|
385
440
|
|
|
386
441
|
Create and manage multiple conversation sessions with persistent storage.
|
|
@@ -26,10 +26,10 @@ systemPrompt:
|
|
|
26
26
|
Use these tools when appropriate to answer user queries.
|
|
27
27
|
You can use multiple tools in sequence to solve complex problems.
|
|
28
28
|
After each tool result, determine if you need more information or can provide a final answer.
|
|
29
|
-
- id:
|
|
29
|
+
- id: date
|
|
30
30
|
type: dynamic
|
|
31
31
|
priority: 10
|
|
32
|
-
source:
|
|
32
|
+
source: date
|
|
33
33
|
enabled: true
|
|
34
34
|
|
|
35
35
|
# LLM configuration - describes the language model to use
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# Coding Agent Configuration
|
|
2
2
|
# Optimized for software development with internal coding tools
|
|
3
3
|
|
|
4
|
+
# Image: Specifies the provider bundle for this agent
|
|
5
|
+
# This agent requires local development tools (filesystem, process)
|
|
6
|
+
image: '@dexto/image-local'
|
|
7
|
+
|
|
4
8
|
# System prompt configuration - defines the agent's behavior as a coding assistant
|
|
5
9
|
systemPrompt:
|
|
6
10
|
contributors:
|
|
@@ -44,7 +48,7 @@ greeting: "👨💻 Ready to code! What are we building today?"
|
|
|
44
48
|
# LLM configuration - using a powerful model for coding tasks
|
|
45
49
|
llm:
|
|
46
50
|
provider: anthropic
|
|
47
|
-
model: claude-
|
|
51
|
+
model: claude-sonnet-4-5-20250929
|
|
48
52
|
apiKey: $ANTHROPIC_API_KEY
|
|
49
53
|
|
|
50
54
|
storage:
|
|
@@ -68,33 +72,35 @@ toolConfirmation:
|
|
|
68
72
|
# Tools that never require approval (safe, read-only operations)
|
|
69
73
|
alwaysAllow:
|
|
70
74
|
- internal--ask_user
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
75
|
+
- custom--filesystem-tools--read_file # Read files without approval
|
|
76
|
+
- custom--filesystem-tools--glob_files # Search for files without approval
|
|
77
|
+
- custom--filesystem-tools--grep_content # Search within files without approval
|
|
78
|
+
- custom--process-tools--bash_output # Check background process output
|
|
79
|
+
- custom--process-tools--kill_process # Kill processes without approval
|
|
76
80
|
|
|
77
81
|
# Tools that are always denied (dangerous operations)
|
|
78
82
|
# Uncomment to restrict certain operations
|
|
79
83
|
# alwaysDeny:
|
|
80
|
-
# -
|
|
84
|
+
# - custom--process-tools--bash_exec--rm -rf* # Prevent recursive deletion
|
|
81
85
|
|
|
82
86
|
# Elicitation configuration - required for ask_user tool
|
|
83
87
|
elicitation:
|
|
84
88
|
enabled: true
|
|
85
89
|
timeout: 120000
|
|
86
90
|
|
|
87
|
-
# Internal tools -
|
|
91
|
+
# Internal tools - core tools that are always available
|
|
88
92
|
internalTools:
|
|
89
93
|
- ask_user # Ask questions and collect input
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
|
|
95
|
+
# Custom tools - filesystem and process tools from image-local
|
|
96
|
+
customTools:
|
|
97
|
+
- type: filesystem-tools
|
|
98
|
+
allowedPaths: ["."]
|
|
99
|
+
blockedPaths: [".git", "node_modules/.bin", ".env"]
|
|
100
|
+
blockedExtensions: [".exe", ".dll", ".so"]
|
|
101
|
+
enableBackups: false
|
|
102
|
+
- type: process-tools
|
|
103
|
+
securityLevel: moderate
|
|
98
104
|
|
|
99
105
|
# Internal resources configuration - expanded for coding projects
|
|
100
106
|
internalResources:
|
|
@@ -105,10 +105,10 @@ systemPrompt:
|
|
|
105
105
|
Remember: You're demonstrating intelligent database interaction through
|
|
106
106
|
natural conversation and data analysis.
|
|
107
107
|
|
|
108
|
-
- id:
|
|
108
|
+
- id: date
|
|
109
109
|
type: dynamic
|
|
110
110
|
priority: 10
|
|
111
|
-
source:
|
|
111
|
+
source: date
|
|
112
112
|
enabled: true
|
|
113
113
|
|
|
114
114
|
# Storage configuration
|
|
@@ -25,10 +25,10 @@ systemPrompt:
|
|
|
25
25
|
Use these tools when appropriate to answer user queries.
|
|
26
26
|
You can use multiple tools in sequence to solve complex problems.
|
|
27
27
|
After each tool result, determine if you need more information or can provide a final answer.
|
|
28
|
-
- id:
|
|
28
|
+
- id: date
|
|
29
29
|
type: dynamic
|
|
30
30
|
priority: 10
|
|
31
|
-
source:
|
|
31
|
+
source: date
|
|
32
32
|
enabled: true
|
|
33
33
|
|
|
34
34
|
# Memory configuration - controls how memories are included in system prompt
|
|
@@ -77,11 +77,11 @@ storage:
|
|
|
77
77
|
type: sqlite
|
|
78
78
|
# path: ./data/dexto.db # Optional: customize database location
|
|
79
79
|
blob:
|
|
80
|
-
type: local #
|
|
80
|
+
type: local # CLI provides storePath automatically
|
|
81
|
+
# storePath: ./data/blobs # Optional: customize blob storage location (defaults to agent-specific path)
|
|
81
82
|
maxBlobSize: 52428800 # 50MB per blob
|
|
82
83
|
maxTotalSize: 1073741824 # 1GB total storage
|
|
83
|
-
cleanupAfterDays: 30
|
|
84
|
-
# storePath: (automatically provided by CLI as ~/.dexto/blobs/<agent-id>)
|
|
84
|
+
cleanupAfterDays: 30
|
|
85
85
|
|
|
86
86
|
toolConfirmation:
|
|
87
87
|
mode: manual
|
|
@@ -113,6 +113,8 @@ elicitation:
|
|
|
113
113
|
internalTools:
|
|
114
114
|
- ask_user # Allows the agent to ask you questions and collect structured input
|
|
115
115
|
- delegate_to_url
|
|
116
|
+
- list_resources
|
|
117
|
+
- get_resource
|
|
116
118
|
|
|
117
119
|
# Internal resources configuration - manages file system access and blob storage
|
|
118
120
|
# NOTE: Blob storage capacity and backend settings are in the 'storage.blob' section above
|
|
@@ -47,10 +47,10 @@ systemPrompt:
|
|
|
47
47
|
- After each tool interaction, decide whether additional context is needed or if you can deliver a confident answer
|
|
48
48
|
|
|
49
49
|
Stay practical, keep responses focused on the user’s goal, and highlight any assumptions or risks you notice.
|
|
50
|
-
- id:
|
|
50
|
+
- id: date
|
|
51
51
|
type: dynamic
|
|
52
52
|
priority: 10
|
|
53
|
-
source:
|
|
53
|
+
source: date
|
|
54
54
|
enabled: true
|
|
55
55
|
|
|
56
56
|
# Storage configuration
|
|
@@ -139,10 +139,10 @@ systemPrompt:
|
|
|
139
139
|
|
|
140
140
|
Use these tools strategically to provide comprehensive product name validation that combines technical availability with market intelligence.
|
|
141
141
|
|
|
142
|
-
- id:
|
|
142
|
+
- id: date
|
|
143
143
|
type: dynamic
|
|
144
144
|
priority: 10
|
|
145
|
-
source:
|
|
145
|
+
source: date
|
|
146
146
|
enabled: true
|
|
147
147
|
|
|
148
148
|
# LLM configuration
|
|
@@ -33,10 +33,10 @@ systemPrompt:
|
|
|
33
33
|
- "Extract all content containing 'invoice' from /path/to/file.pdf and explain what you found."
|
|
34
34
|
|
|
35
35
|
Always ask for the file path if not provided. If a file is not a PDF or does not exist, inform the user.
|
|
36
|
-
- id:
|
|
36
|
+
- id: date
|
|
37
37
|
type: dynamic
|
|
38
38
|
priority: 10
|
|
39
|
-
source:
|
|
39
|
+
source: date
|
|
40
40
|
enabled: true
|
|
41
41
|
|
|
42
42
|
# Storage configuration
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExecutionContext } from '@dexto/agent-management';
|
|
2
|
+
import type { SharedAnalyticsEventMap } from '@dexto/analytics';
|
|
2
3
|
export interface BaseEventContext {
|
|
3
4
|
app?: 'dexto';
|
|
4
5
|
app_version?: string;
|
|
@@ -44,8 +45,6 @@ export interface CliCommandTimeoutEvent extends CliCommandBaseEvent {
|
|
|
44
45
|
timeoutMs: number;
|
|
45
46
|
}
|
|
46
47
|
export type CliCommandEvent = CliCommandStartEvent | CliCommandEndEvent | CliCommandTimeoutEvent;
|
|
47
|
-
export interface SessionStartEvent {
|
|
48
|
-
}
|
|
49
48
|
export interface PromptEvent {
|
|
50
49
|
mode: 'cli' | 'headless';
|
|
51
50
|
provider: string;
|
|
@@ -54,14 +53,17 @@ export interface PromptEvent {
|
|
|
54
53
|
export interface SetupEvent {
|
|
55
54
|
provider: string;
|
|
56
55
|
model: string;
|
|
57
|
-
hadApiKeyBefore
|
|
56
|
+
hadApiKeyBefore?: boolean;
|
|
58
57
|
setupMode: 'interactive' | 'non-interactive';
|
|
58
|
+
setupVariant?: 'quick-start' | 'custom';
|
|
59
|
+
defaultMode?: string;
|
|
60
|
+
hasBaseURL?: boolean;
|
|
61
|
+
apiKeySkipped?: boolean;
|
|
59
62
|
}
|
|
60
63
|
export interface InstallAgentEvent {
|
|
61
64
|
agent: string;
|
|
62
65
|
status: 'installed' | 'skipped' | 'failed';
|
|
63
66
|
force: boolean;
|
|
64
|
-
injectPreferences: boolean;
|
|
65
67
|
reason?: string;
|
|
66
68
|
error_message?: string;
|
|
67
69
|
}
|
|
@@ -94,8 +96,13 @@ export interface InitProjectEvent {
|
|
|
94
96
|
provider: string;
|
|
95
97
|
providedKey: boolean;
|
|
96
98
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
/**
|
|
100
|
+
* CLI analytics event map extending shared events with CLI-specific events.
|
|
101
|
+
*
|
|
102
|
+
* IMPORTANT: If an event is also tracked by WebUI, move it to SharedAnalyticsEventMap
|
|
103
|
+
* in @dexto/analytics to avoid duplication.
|
|
104
|
+
*/
|
|
105
|
+
export interface DextoAnalyticsEventMap extends SharedAnalyticsEventMap {
|
|
99
106
|
dexto_cli_command: CliCommandEvent;
|
|
100
107
|
dexto_prompt: PromptEvent;
|
|
101
108
|
dexto_setup: SetupEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/analytics/events.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAClD;AAED,MAAM,MAAM,oBAAoB,GAC1B,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAE1D,UAAU,mBAAmB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC3D,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IAC/D,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAEjG,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/analytics/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ interface InitOptions {
|
|
|
7
7
|
*
|
|
8
8
|
* - Respects DEXTO_ANALYTICS_DISABLED.
|
|
9
9
|
* - Creates/loads the anonymous distinctId and a per-process session_id.
|
|
10
|
-
* - Emits a
|
|
10
|
+
* - Emits a dexto_session_created event for each process run.
|
|
11
11
|
*/
|
|
12
12
|
export declare function initAnalytics(opts: InitOptions): Promise<void>;
|
|
13
13
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EAErB,kBAAkB,EAClB,oBAAoB,EACvB,MAAM,aAAa,CAAC;AAErB,UAAU,WAAW;IACjB,UAAU,EAAE,MAAM,CAAC;CACtB;AAqBD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EAErB,kBAAkB,EAClB,oBAAoB,EACvB,MAAM,aAAa,CAAC;AAErB,UAAU,WAAW;IACjB,UAAU,EAAE,MAAM,CAAC;CACtB;AAqBD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCpE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,SAAS,kBAAkB,EACnD,KAAK,EAAE,IAAI,EACX,UAAU,GAAE,qBAAqB,CAAC,IAAI,CAAqC,GAC5E,IAAI,CAWN;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQvD;AAMD;;;GAGG;AACH,wBAAsB,cAAc,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,CAAM,GAClE,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC,CAAM,GAC3F,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACtB,GAAG,IAAI,CAAC,CAiBR"}
|
package/dist/analytics/index.js
CHANGED
|
@@ -26,7 +26,7 @@ function baseProps() {
|
|
|
26
26
|
*
|
|
27
27
|
* - Respects DEXTO_ANALYTICS_DISABLED.
|
|
28
28
|
* - Creates/loads the anonymous distinctId and a per-process session_id.
|
|
29
|
-
* - Emits a
|
|
29
|
+
* - Emits a dexto_session_created event for each process run.
|
|
30
30
|
*/
|
|
31
31
|
export async function initAnalytics(opts) {
|
|
32
32
|
if (enabled || client)
|
|
@@ -60,7 +60,11 @@ export async function initAnalytics(opts) {
|
|
|
60
60
|
// Ignore flush errors: analytics should never block process exit.
|
|
61
61
|
}
|
|
62
62
|
});
|
|
63
|
-
capture('
|
|
63
|
+
capture('dexto_session_created', {
|
|
64
|
+
source: 'cli',
|
|
65
|
+
sessionId: sessionId || 'unknown',
|
|
66
|
+
trigger: 'manual',
|
|
67
|
+
});
|
|
64
68
|
}
|
|
65
69
|
/**
|
|
66
70
|
* Capture a single analytics event with optional properties.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-hono.d.ts","sourceRoot":"","sources":["../../src/api/server-hono.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-hono.d.ts","sourceRoot":"","sources":["../../src/api/server-hono.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAuC,MAAM,aAAa,CAAC;AAQ9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EACH,cAAc,EACd,gBAAgB,EAShB,KAAK,kBAAkB,EAC1B,MAAM,eAAe,CAAC;AA6FvB,MAAM,MAAM,wBAAwB,GAAG;IACnC,GAAG,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IACvC,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtD,iBAAiB,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1F,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC9C,CAAC;AAGF,wBAAsB,iBAAiB,CACnC,KAAK,EAAE,UAAU,EACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EACtC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,kBAAkB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAiWnC;AAED,wBAAsB,kBAAkB,CACpC,KAAK,EAAE,UAAU,EACjB,IAAI,SAAO,EACX,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EACtC,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,kBAAkB,GACjC,OAAO,CAAC;IACP,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtD,iBAAiB,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;CAC7F,CAAC,CAgCD"}
|
package/dist/api/server-hono.js
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
import os from 'node:os';
|
|
2
|
-
import { createAgentCard, logger, AgentError
|
|
2
|
+
import { DextoAgent, createAgentCard, logger, AgentError } from '@dexto/core';
|
|
3
3
|
import { loadAgentConfig, enrichAgentConfig, deriveDisplayName, getAgentRegistry, AgentFactory, } from '@dexto/agent-management';
|
|
4
4
|
import { createDextoApp, createNodeServer, createMcpTransport as createServerMcpTransport, createMcpHttpHandlers, initializeMcpServer as initializeServerMcpServer, createManualApprovalHandler, WebhookEventSubscriber, A2ASseEventSubscriber, ApprovalCoordinator, } from '@dexto/server';
|
|
5
5
|
import { registerGracefulShutdown } from '../utils/graceful-shutdown.js';
|
|
6
6
|
const DEFAULT_AGENT_VERSION = '1.0.0';
|
|
7
|
+
/**
|
|
8
|
+
* Load image dynamically based on config and environment
|
|
9
|
+
* Priority: Config image field > Environment variable > Default
|
|
10
|
+
* Images are optional, but default to image-local for convenience
|
|
11
|
+
*/
|
|
12
|
+
async function loadImageForConfig(config) {
|
|
13
|
+
const imageName = config.image || process.env.DEXTO_IMAGE || '@dexto/image-local';
|
|
14
|
+
try {
|
|
15
|
+
await import(imageName);
|
|
16
|
+
logger.debug(`Loaded image: ${imageName}`);
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
const errorMsg = `Failed to load image '${imageName}': ${err instanceof Error ? err.message : String(err)}`;
|
|
20
|
+
logger.error(errorMsg);
|
|
21
|
+
throw new Error(errorMsg);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
7
24
|
/**
|
|
8
25
|
* List all agents (installed and available)
|
|
9
26
|
* Replacement for old Dexto.listAgents()
|
|
@@ -23,12 +40,14 @@ async function createAgentFromId(agentId) {
|
|
|
23
40
|
try {
|
|
24
41
|
// Use registry to resolve agent path (auto-installs if not present)
|
|
25
42
|
const registry = getAgentRegistry();
|
|
26
|
-
const agentPath = await registry.resolveAgent(agentId, true
|
|
43
|
+
const agentPath = await registry.resolveAgent(agentId, true);
|
|
27
44
|
// Load and enrich agent config
|
|
28
45
|
const config = await loadAgentConfig(agentPath);
|
|
29
46
|
const enrichedConfig = enrichAgentConfig(config, agentPath, {
|
|
30
47
|
logLevel: 'info', // Server uses info-level logging for visibility
|
|
31
48
|
});
|
|
49
|
+
// Load image dynamically based on config
|
|
50
|
+
await loadImageForConfig(enrichedConfig);
|
|
32
51
|
// Create agent instance
|
|
33
52
|
logger.info(`Creating agent: ${agentId} from ${agentPath}`);
|
|
34
53
|
return new DextoAgent(enrichedConfig, agentPath);
|
|
@@ -51,7 +70,7 @@ function resolveBaseUrl(port) {
|
|
|
51
70
|
export async function initializeHonoApi(agent, agentCardOverride, listenPort, agentId, webRoot, webUIConfig) {
|
|
52
71
|
// Declare before registering shutdown hook to avoid TDZ on signals
|
|
53
72
|
let activeAgent = agent;
|
|
54
|
-
let activeAgentId = agentId || '
|
|
73
|
+
let activeAgentId = agentId || 'coding-agent';
|
|
55
74
|
let isSwitchingAgent = false;
|
|
56
75
|
registerGracefulShutdown(() => activeAgent);
|
|
57
76
|
const resolvedPort = resolvePort(listenPort);
|
|
@@ -205,6 +224,8 @@ export async function initializeHonoApi(agent, agentCardOverride, listenPort, ag
|
|
|
205
224
|
const enrichedConfig = enrichAgentConfig(config, filePath, {
|
|
206
225
|
logLevel: 'info', // Server uses info-level logging for visibility
|
|
207
226
|
});
|
|
227
|
+
// 3.5. Load image dynamically based on config
|
|
228
|
+
await loadImageForConfig(enrichedConfig);
|
|
208
229
|
// 4. Create new agent instance directly (will initialize fresh telemetry in createAgentServices)
|
|
209
230
|
newAgent = new DextoAgent(enrichedConfig, filePath);
|
|
210
231
|
// 5. Use enriched agentId (derived from config or filename during enrichment)
|
|
@@ -232,7 +253,8 @@ export async function initializeHonoApi(agent, agentCardOverride, listenPort, ag
|
|
|
232
253
|
}
|
|
233
254
|
// Getter functions for routes (always use current agent)
|
|
234
255
|
// getAgent automatically ensures agent is available before returning it
|
|
235
|
-
|
|
256
|
+
// Accepts Context parameter for compatibility with GetAgentFn type
|
|
257
|
+
const getAgent = (_ctx) => {
|
|
236
258
|
// CRITICAL: Check agent availability before every access to prevent race conditions
|
|
237
259
|
// during agent switching, stopping, or startup failures
|
|
238
260
|
ensureAgentAvailable();
|
|
@@ -279,7 +301,7 @@ export async function initializeHonoApi(agent, agentCardOverride, listenPort, ag
|
|
|
279
301
|
}
|
|
280
302
|
// Create bridge with app
|
|
281
303
|
bridgeRef = createNodeServer(app, {
|
|
282
|
-
getAgent,
|
|
304
|
+
getAgent: () => activeAgent,
|
|
283
305
|
mcpHandlers: mcpTransport ? createMcpHttpHandlers(mcpTransport) : null,
|
|
284
306
|
});
|
|
285
307
|
// Register webhook subscriber for LLM streaming events
|
|
@@ -30,6 +30,10 @@ export declare class CLISubscriber implements EventSubscriber {
|
|
|
30
30
|
onResponse(text: string): void;
|
|
31
31
|
onError(error: Error): void;
|
|
32
32
|
onConversationReset(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Capture LLM token usage analytics
|
|
35
|
+
*/
|
|
36
|
+
private captureTokenUsage;
|
|
33
37
|
/**
|
|
34
38
|
* Run agent in headless mode and wait for completion
|
|
35
39
|
* Returns a promise that resolves when the response is complete
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-subscriber.d.ts","sourceRoot":"","sources":["../../src/cli/cli-subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"cli-subscriber.d.ts","sourceRoot":"","sources":["../../src/cli/cli-subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,aAAa,CAAC;AAGtE;;;GAGG;AACH,qBAAa,aAAc,YAAW,eAAe;IACjD,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,gBAAgB,CAAC,CAAyB;IAElD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IA6BxC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAcf,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM3B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAK9C,YAAY,CACR,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,mBAAmB,EAC9B,SAAS,CAAC,EAAE,OAAO,EACnB,OAAO,CAAC,EAAE,OAAO,GAClB,IAAI;IAMP,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA0B9B,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAyC3B,mBAAmB,IAAI,IAAI;IAM3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBxF"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* No TUI, no boxes - just clean text output
|
|
7
7
|
*/
|
|
8
8
|
import { logger } from '@dexto/core';
|
|
9
|
+
import { capture } from '../analytics/index.js';
|
|
9
10
|
/**
|
|
10
11
|
* Event subscriber for CLI headless mode
|
|
11
12
|
* Implements the standard EventSubscriber pattern used throughout the codebase
|
|
@@ -30,7 +31,10 @@ export class CLISubscriber {
|
|
|
30
31
|
}
|
|
31
32
|
// For error case (success=false), the error is handled via llm:error event
|
|
32
33
|
});
|
|
33
|
-
eventBus.on('llm:response', (payload) =>
|
|
34
|
+
eventBus.on('llm:response', (payload) => {
|
|
35
|
+
this.onResponse(payload.content);
|
|
36
|
+
this.captureTokenUsage(payload);
|
|
37
|
+
});
|
|
34
38
|
eventBus.on('llm:error', (payload) => this.onError(payload.error));
|
|
35
39
|
eventBus.on('session:reset', this.onConversationReset.bind(this));
|
|
36
40
|
}
|
|
@@ -93,9 +97,21 @@ export class CLISubscriber {
|
|
|
93
97
|
onError(error) {
|
|
94
98
|
// Clear any partial response state
|
|
95
99
|
this.streamingContent = '';
|
|
96
|
-
// Show error to stderr for immediate user feedback
|
|
100
|
+
// Show error to stderr for immediate user feedback
|
|
97
101
|
console.error(`❌ Error: ${error.message}`);
|
|
102
|
+
// Show recovery guidance if available (for DextoRuntimeError)
|
|
103
|
+
if ('recovery' in error && error.recovery) {
|
|
104
|
+
const recoveryMessages = Array.isArray(error.recovery)
|
|
105
|
+
? error.recovery
|
|
106
|
+
: [error.recovery];
|
|
107
|
+
console.error('');
|
|
108
|
+
recoveryMessages.forEach((msg) => {
|
|
109
|
+
console.error(`💡 ${msg}`);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Show stack for debugging if available
|
|
98
113
|
if (error.stack) {
|
|
114
|
+
console.error('');
|
|
99
115
|
console.error(error.stack);
|
|
100
116
|
}
|
|
101
117
|
// Log details to file
|
|
@@ -103,6 +119,7 @@ export class CLISubscriber {
|
|
|
103
119
|
stack: error.stack,
|
|
104
120
|
name: error.name,
|
|
105
121
|
cause: error.cause,
|
|
122
|
+
recovery: 'recovery' in error ? error.recovery : undefined,
|
|
106
123
|
});
|
|
107
124
|
// Reject completion promise if waiting
|
|
108
125
|
if (this.completionReject) {
|
|
@@ -117,6 +134,27 @@ export class CLISubscriber {
|
|
|
117
134
|
this.streamingContent = '';
|
|
118
135
|
logger.info('🔄 Conversation history cleared.', null, 'blue');
|
|
119
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Capture LLM token usage analytics
|
|
139
|
+
*/
|
|
140
|
+
captureTokenUsage(payload) {
|
|
141
|
+
const { tokenUsage, provider, model, sessionId } = payload;
|
|
142
|
+
if (!tokenUsage || (!tokenUsage.inputTokens && !tokenUsage.outputTokens)) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
capture('dexto_llm_tokens_consumed', {
|
|
146
|
+
source: 'cli',
|
|
147
|
+
sessionId,
|
|
148
|
+
provider,
|
|
149
|
+
model,
|
|
150
|
+
inputTokens: tokenUsage.inputTokens,
|
|
151
|
+
outputTokens: tokenUsage.outputTokens,
|
|
152
|
+
reasoningTokens: tokenUsage.reasoningTokens,
|
|
153
|
+
totalTokens: tokenUsage.totalTokens,
|
|
154
|
+
cacheReadTokens: tokenUsage.cacheReadTokens,
|
|
155
|
+
cacheWriteTokens: tokenUsage.cacheWriteTokens,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
120
158
|
/**
|
|
121
159
|
* Run agent in headless mode and wait for completion
|
|
122
160
|
* Returns a promise that resolves when the response is complete
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
+
type AppType = 'script' | 'webapp';
|
|
2
|
+
export interface CreateAppOptions {
|
|
3
|
+
fromImage?: string;
|
|
4
|
+
fromCore?: boolean;
|
|
5
|
+
type?: AppType;
|
|
6
|
+
}
|
|
1
7
|
/**
|
|
2
|
-
* Creates
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
8
|
+
* Creates a Dexto application with two possible modes:
|
|
9
|
+
* - from-image: Use existing image (recommended)
|
|
10
|
+
* - from-core: Build from @dexto/core with custom providers (advanced)
|
|
11
|
+
*
|
|
12
|
+
* Note: To create a new image that extends another image, use `dexto create-image` instead.
|
|
13
|
+
*
|
|
14
|
+
* @param name - Optional name of the app project
|
|
15
|
+
* @param options - Optional flags to specify mode and base image
|
|
6
16
|
* @returns The absolute path to the created project directory
|
|
7
17
|
*/
|
|
8
|
-
export declare function createDextoProject(name?: string): Promise<string>;
|
|
9
|
-
|
|
10
|
-
* Adds the dexto scripts to the package.json. Assumes the package.json already exists and is accessible
|
|
11
|
-
* @param directory - The directory of the project
|
|
12
|
-
*/
|
|
13
|
-
export declare function addDextoScriptsToPackageJson(directory: string, projectPath: string): Promise<void>;
|
|
14
|
-
/** Creates a tsconfig.json file in the project directory */
|
|
15
|
-
export declare function createTsconfigJson(projectPath: string, directory: string): Promise<void>;
|
|
16
|
-
/** Adds notes for users to get started with their new initialized Dexto project */
|
|
17
|
-
export declare function postCreateDexto(projectPath: string, directory: string): Promise<void>;
|
|
18
|
+
export declare function createDextoProject(name?: string, options?: CreateAppOptions): Promise<string>;
|
|
19
|
+
export {};
|
|
18
20
|
//# sourceMappingURL=create-app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create-app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create-app.ts"],"names":[],"mappings":"AA8BA,KAAK,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACpC,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA0JjB"}
|