dexto 1.5.7 → 1.6.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/README.md +3 -3
- package/dist/agents/agent-template.yml +2 -2
- package/dist/agents/coding-agent/README.md +10 -10
- package/dist/agents/coding-agent/coding-agent.yml +81 -80
- package/dist/agents/default-agent.yml +32 -47
- package/dist/agents/explore-agent/explore-agent.yml +3 -6
- package/dist/agents/image-editor-agent/image-editor-agent.yml +1 -1
- package/dist/agents/nano-banana-agent/nano-banana-agent.yml +1 -1
- package/dist/agents/podcast-agent/podcast-agent.yml +1 -1
- package/dist/agents/product-name-researcher/product-name-researcher.yml +1 -1
- package/dist/agents/sora-video-agent/sora-video-agent.yml +4 -6
- package/dist/agents/triage-demo/triage-agent.yml +1 -1
- package/dist/analytics/events.d.ts +2 -2
- package/dist/analytics/events.d.ts.map +1 -1
- package/dist/api/mcp/tool-aggregation-handler.d.ts +2 -2
- package/dist/api/server-hono.d.ts +2 -2
- package/dist/api/server-hono.d.ts.map +1 -1
- package/dist/api/server-hono.js +37 -60
- package/dist/cli/approval/cli-approval-handler.d.ts +10 -3
- package/dist/cli/approval/cli-approval-handler.d.ts.map +1 -1
- package/dist/cli/approval/cli-approval-handler.js +1 -1
- package/dist/cli/auth/constants.d.ts +4 -0
- package/dist/cli/auth/constants.d.ts.map +1 -1
- package/dist/cli/auth/constants.js +4 -0
- package/dist/cli/commands/auth/logout.js +2 -2
- package/dist/cli/commands/billing/status.d.ts +3 -1
- package/dist/cli/commands/billing/status.d.ts.map +1 -1
- package/dist/cli/commands/billing/status.js +23 -1
- package/dist/cli/commands/create-app.d.ts +1 -11
- package/dist/cli/commands/create-app.d.ts.map +1 -1
- package/dist/cli/commands/create-app.js +21 -545
- package/dist/cli/commands/create-image.d.ts.map +1 -1
- package/dist/cli/commands/create-image.js +54 -53
- package/dist/cli/commands/image.d.ts +52 -0
- package/dist/cli/commands/image.d.ts.map +1 -0
- package/dist/cli/commands/image.js +118 -0
- 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 +3 -1
- package/dist/cli/commands/init-app.d.ts +4 -8
- package/dist/cli/commands/init-app.d.ts.map +1 -1
- package/dist/cli/commands/init-app.js +37 -161
- package/dist/cli/commands/interactive-commands/command-parser.d.ts +2 -0
- package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/commands.d.ts +1 -1
- package/dist/cli/commands/interactive-commands/commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/commands.js +2 -2
- package/dist/cli/commands/interactive-commands/general-commands.js +2 -2
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.js +13 -2
- package/dist/cli/commands/interactive-commands/session/index.d.ts +2 -1
- package/dist/cli/commands/interactive-commands/session/index.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/session/index.js +2 -1
- package/dist/cli/commands/interactive-commands/session/session-commands.d.ts +2 -2
- package/dist/cli/commands/interactive-commands/session/session-commands.js +2 -2
- package/dist/cli/commands/interactive-commands/system/system-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/system/system-commands.js +7 -29
- package/dist/cli/commands/list-agents.d.ts.map +1 -1
- package/dist/cli/commands/list-agents.js +3 -2
- package/dist/cli/commands/plugin.d.ts +4 -4
- package/dist/cli/commands/setup.d.ts +5 -5
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +766 -207
- package/dist/cli/commands/sync-agents.d.ts +2 -12
- package/dist/cli/commands/sync-agents.d.ts.map +1 -1
- package/dist/cli/commands/sync-agents.js +2 -50
- package/dist/cli/ink-cli/InkCLIRefactored.d.ts +7 -1
- package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/InkCLIRefactored.js +17 -7
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +2 -2
- package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ApprovalPrompt.js +15 -14
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts +18 -0
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts.map +1 -0
- package/dist/cli/ink-cli/components/BackgroundTasksPanel.js +48 -0
- 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 +5 -6
- package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/ResourceAutocomplete.js +150 -41
- package/dist/cli/ink-cli/components/StatusBar.d.ts +3 -1
- package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/StatusBar.js +27 -7
- package/dist/cli/ink-cli/components/TodoPanel.js +1 -1
- package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/chat/MessageItem.js +9 -5
- package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +1 -1
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts +3 -1
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +3 -2
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts +3 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/modes/StaticCLI.js +3 -2
- package/dist/cli/ink-cli/components/overlays/ContextStatsOverlay.js +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +8 -4
- package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +1 -0
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +144 -41
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +2 -1
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +286 -44
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +9 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -1
- package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +35 -9
- package/dist/cli/ink-cli/constants/tips.js +1 -1
- package/dist/cli/ink-cli/containers/InputContainer.d.ts +4 -0
- package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/InputContainer.js +30 -8
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts +2 -0
- package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
- package/dist/cli/ink-cli/containers/OverlayContainer.js +215 -59
- package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useAgentEvents.js +73 -13
- package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useCLIState.js +3 -0
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +8 -0
- package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts.map +1 -1
- package/dist/cli/ink-cli/hooks/useTokenCounter.js +7 -4
- package/dist/cli/ink-cli/services/CommandService.d.ts +1 -1
- package/dist/cli/ink-cli/services/CommandService.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/CommandService.js +2 -2
- package/dist/cli/ink-cli/services/processStream.d.ts +2 -2
- package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -1
- package/dist/cli/ink-cli/services/processStream.js +55 -8
- package/dist/cli/ink-cli/state/initialState.d.ts.map +1 -1
- package/dist/cli/ink-cli/state/initialState.js +3 -0
- package/dist/cli/ink-cli/state/types.d.ts +11 -2
- package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/llm-provider-display.d.ts +3 -0
- package/dist/cli/ink-cli/utils/llm-provider-display.d.ts.map +1 -0
- package/dist/cli/ink-cli/utils/llm-provider-display.js +22 -0
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts +13 -9
- package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/messageFormatting.js +106 -151
- package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -1
- package/dist/cli/ink-cli/utils/toolUtils.js +2 -9
- package/dist/cli/utils/config-validation.d.ts +11 -11
- package/dist/cli/utils/config-validation.d.ts.map +1 -1
- package/dist/cli/utils/config-validation.js +56 -290
- package/dist/cli/utils/dexto-auth-check.d.ts +7 -7
- package/dist/cli/utils/dexto-auth-check.d.ts.map +1 -1
- package/dist/cli/utils/dexto-auth-check.js +16 -16
- package/dist/cli/utils/image-store.d.ts +16 -0
- package/dist/cli/utils/image-store.d.ts.map +1 -0
- package/dist/cli/utils/image-store.js +289 -0
- package/dist/cli/utils/options.js +1 -1
- package/dist/cli/utils/provider-setup.d.ts +2 -2
- package/dist/cli/utils/provider-setup.d.ts.map +1 -1
- package/dist/cli/utils/provider-setup.js +10 -2
- package/dist/cli/utils/scaffolding-utils.d.ts +5 -0
- package/dist/cli/utils/scaffolding-utils.d.ts.map +1 -1
- package/dist/cli/utils/scaffolding-utils.js +46 -4
- package/dist/cli/utils/template-engine.d.ts +28 -16
- package/dist/cli/utils/template-engine.d.ts.map +1 -1
- package/dist/cli/utils/template-engine.js +339 -479
- package/dist/config/cli-overrides.d.ts +4 -3
- package/dist/config/cli-overrides.d.ts.map +1 -1
- package/dist/config/cli-overrides.js +8 -10
- package/dist/config/effective-llm.d.ts +4 -4
- package/dist/config/effective-llm.d.ts.map +1 -1
- package/dist/config/effective-llm.js +4 -4
- package/dist/index-main.d.ts +2 -0
- package/dist/index-main.d.ts.map +1 -0
- package/dist/index-main.js +1554 -0
- package/dist/index.js +2 -1580
- package/dist/utils/session-logger-factory.d.ts +3 -0
- package/dist/utils/session-logger-factory.d.ts.map +1 -0
- package/dist/utils/session-logger-factory.js +19 -0
- package/dist/webui/assets/{index-Dl3mj53P.js → index-DwtueA8l.js} +231 -231
- package/dist/webui/index.html +1 -1
- package/package.json +10 -7
- package/dist/cli/cli-subscriber.d.ts +0 -45
- package/dist/cli/cli-subscriber.d.ts.map +0 -1
- package/dist/cli/cli-subscriber.js +0 -204
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { DextoAgent, InternalMessage } from '@dexto/core';
|
|
6
6
|
import type { Message } from '../state/types.js';
|
|
7
|
+
export declare function normalizeToolName(toolName: string): string;
|
|
8
|
+
export declare function shouldHideTool(toolName: string | undefined): boolean;
|
|
7
9
|
/**
|
|
8
10
|
* Formats a skill invocation message for clean display.
|
|
9
11
|
* Converts verbose <skill-invocation> blocks to clean /skill-name format.
|
|
@@ -42,16 +44,10 @@ export declare function formatPathForDisplay(absolutePath: string, maxWidth?: nu
|
|
|
42
44
|
* 3. Add "…" in the middle
|
|
43
45
|
*/
|
|
44
46
|
export declare function centerTruncatePath(filePath: string, maxWidth: number): string;
|
|
45
|
-
/**
|
|
46
|
-
* Gets a user-friendly display name for a tool.
|
|
47
|
-
* Returns the friendly name if known, otherwise returns the original name
|
|
48
|
-
* with any "internal--" prefix stripped.
|
|
49
|
-
* MCP tools keep their server prefix for clarity (e.g., "mcp_server__tool").
|
|
50
|
-
*/
|
|
51
47
|
export declare function getToolDisplayName(toolName: string): string;
|
|
52
48
|
/**
|
|
53
49
|
* Gets the tool type badge for display.
|
|
54
|
-
* Returns: '
|
|
50
|
+
* Returns: 'local' or MCP server name.
|
|
55
51
|
*/
|
|
56
52
|
export declare function getToolTypeBadge(toolName: string): string;
|
|
57
53
|
/**
|
|
@@ -73,11 +69,15 @@ export interface FormattedToolHeader {
|
|
|
73
69
|
*
|
|
74
70
|
* Handles special cases like spawn_agent (uses agentId as display name).
|
|
75
71
|
*
|
|
76
|
-
* @param toolName -
|
|
72
|
+
* @param toolName - Tool name (local tool id or `mcp--...`)
|
|
77
73
|
* @param args - Tool arguments object
|
|
78
74
|
* @returns Formatted header components and full string
|
|
79
75
|
*/
|
|
80
|
-
export declare function formatToolHeader(
|
|
76
|
+
export declare function formatToolHeader(options: {
|
|
77
|
+
toolName: string;
|
|
78
|
+
args: Record<string, unknown>;
|
|
79
|
+
toolDisplayName?: string;
|
|
80
|
+
}): FormattedToolHeader;
|
|
81
81
|
/**
|
|
82
82
|
* Formats tool arguments for display.
|
|
83
83
|
* Format: ToolName(primary_arg) or ToolName(primary_arg, key: value)
|
|
@@ -117,6 +117,10 @@ export declare function createToolMessage(toolName: string): Message;
|
|
|
117
117
|
* Formats a streaming placeholder message
|
|
118
118
|
*/
|
|
119
119
|
export declare function createStreamingMessage(): Message;
|
|
120
|
+
/**
|
|
121
|
+
* Generates a preview of tool result content for display
|
|
122
|
+
*/
|
|
123
|
+
export declare function formatToolResultPreview(result: string): string;
|
|
120
124
|
/**
|
|
121
125
|
* Converts session history messages to UI messages
|
|
122
126
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageFormatting.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/utils/messageFormatting.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AAEtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"messageFormatting.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/utils/messageFormatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,23 @@
|
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import os from 'os';
|
|
7
7
|
import { isTextPart, isAssistantMessage, isToolMessage } from '@dexto/core';
|
|
8
|
+
const HIDDEN_TOOL_NAMES = new Set(['wait_for']);
|
|
9
|
+
export function normalizeToolName(toolName) {
|
|
10
|
+
if (toolName.startsWith('mcp--')) {
|
|
11
|
+
const trimmed = toolName.substring('mcp--'.length);
|
|
12
|
+
const parts = trimmed.split('--');
|
|
13
|
+
return parts.length >= 2 ? parts.slice(1).join('--') : trimmed;
|
|
14
|
+
}
|
|
15
|
+
return toolName;
|
|
16
|
+
}
|
|
17
|
+
export function shouldHideTool(toolName) {
|
|
18
|
+
if (!toolName) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return HIDDEN_TOOL_NAMES.has(normalizeToolName(toolName));
|
|
22
|
+
}
|
|
23
|
+
const backgroundCompletionRegex = /<background-task-completion>[\s\S]*?<\/background-task-completion>/g;
|
|
24
|
+
const stripBackgroundCompletion = (text) => text.replace(backgroundCompletionRegex, '').replace('<background-task-completion>', '').trim();
|
|
8
25
|
import { generateMessageId } from './idGenerator.js';
|
|
9
26
|
/**
|
|
10
27
|
* Regex to detect skill invocation messages.
|
|
@@ -114,112 +131,35 @@ export function centerTruncatePath(filePath, maxWidth) {
|
|
|
114
131
|
// Filename itself is too long, end-truncate it
|
|
115
132
|
return filename.slice(0, maxWidth - 1) + '…';
|
|
116
133
|
}
|
|
117
|
-
/**
|
|
118
|
-
* Per-tool display configurations.
|
|
119
|
-
* Each tool specifies exactly which arguments to show and how.
|
|
120
|
-
*/
|
|
121
|
-
const TOOL_CONFIGS = {
|
|
122
|
-
// File tools - show file_path as primary
|
|
123
|
-
read_file: { displayName: 'Read', argsToShow: ['file_path'], primaryArg: 'file_path' },
|
|
124
|
-
write_file: { displayName: 'Write', argsToShow: ['file_path'], primaryArg: 'file_path' },
|
|
125
|
-
edit_file: { displayName: 'Update', argsToShow: ['file_path'], primaryArg: 'file_path' },
|
|
126
|
-
// Search tools - show pattern as primary, path as secondary
|
|
127
|
-
glob_files: {
|
|
128
|
-
displayName: 'Find files',
|
|
129
|
-
argsToShow: ['pattern', 'path'],
|
|
130
|
-
primaryArg: 'pattern',
|
|
131
|
-
},
|
|
132
|
-
grep_content: {
|
|
133
|
-
displayName: 'Search files',
|
|
134
|
-
argsToShow: ['pattern', 'path'],
|
|
135
|
-
primaryArg: 'pattern',
|
|
136
|
-
},
|
|
137
|
-
// Bash - show command only, skip description
|
|
138
|
-
bash_exec: { displayName: 'Bash', argsToShow: ['command'], primaryArg: 'command' },
|
|
139
|
-
bash_output: {
|
|
140
|
-
displayName: 'BashOutput',
|
|
141
|
-
argsToShow: ['process_id'],
|
|
142
|
-
primaryArg: 'process_id',
|
|
143
|
-
},
|
|
144
|
-
kill_process: { displayName: 'Kill', argsToShow: ['process_id'], primaryArg: 'process_id' },
|
|
145
|
-
// User interaction
|
|
146
|
-
ask_user: { displayName: 'Ask', argsToShow: ['question'], primaryArg: 'question' },
|
|
147
|
-
// Agent spawning - handled specially in formatToolHeader for dynamic agentId
|
|
148
|
-
spawn_agent: { displayName: 'Agent', argsToShow: ['task'], primaryArg: 'task' },
|
|
149
|
-
// Skill invocation - handled specially in formatToolHeader to show clean skill name
|
|
150
|
-
invoke_skill: { displayName: 'Skill', argsToShow: ['skill'], primaryArg: 'skill' },
|
|
151
|
-
plan_create: { displayName: 'Plan', argsToShow: [] },
|
|
152
|
-
plan_read: { displayName: 'Plan', argsToShow: [] },
|
|
153
|
-
plan_update: { displayName: 'Plan', argsToShow: [] },
|
|
154
|
-
plan_review: { displayName: 'Plan', argsToShow: [] },
|
|
155
|
-
todo_write: { displayName: 'UpdateTasks', argsToShow: [] },
|
|
156
|
-
};
|
|
157
|
-
/**
|
|
158
|
-
* Gets the display config for a tool.
|
|
159
|
-
* Handles internal-- prefix by stripping it before lookup.
|
|
160
|
-
*/
|
|
161
|
-
function getToolConfig(toolName) {
|
|
162
|
-
// Try direct lookup first
|
|
163
|
-
if (TOOL_CONFIGS[toolName]) {
|
|
164
|
-
return TOOL_CONFIGS[toolName];
|
|
165
|
-
}
|
|
166
|
-
// Strip internal-- prefix and try again
|
|
167
|
-
if (toolName.startsWith('internal--')) {
|
|
168
|
-
const baseName = toolName.replace('internal--', '');
|
|
169
|
-
return TOOL_CONFIGS[baseName];
|
|
170
|
-
}
|
|
171
|
-
// Strip "custom--" prefix and try again
|
|
172
|
-
if (toolName.startsWith('custom--')) {
|
|
173
|
-
const baseName = toolName.replace('custom--', '');
|
|
174
|
-
return TOOL_CONFIGS[baseName];
|
|
175
|
-
}
|
|
176
|
-
return undefined;
|
|
177
|
-
}
|
|
178
134
|
/**
|
|
179
135
|
* Gets a user-friendly display name for a tool.
|
|
180
|
-
* Returns the friendly name if known, otherwise returns
|
|
181
|
-
*
|
|
182
|
-
* MCP tools keep their server prefix for clarity (e.g., "mcp_server__tool").
|
|
136
|
+
* Returns the friendly name if known, otherwise returns a title-cased version.
|
|
137
|
+
* MCP tools keep their server prefix for clarity (e.g., "mcp--filesystem--read_file").
|
|
183
138
|
*/
|
|
139
|
+
function toTitleCase(name) {
|
|
140
|
+
return name
|
|
141
|
+
.replace(/[_-]+/g, ' ')
|
|
142
|
+
.split(' ')
|
|
143
|
+
.filter(Boolean)
|
|
144
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
145
|
+
.join(' ');
|
|
146
|
+
}
|
|
184
147
|
export function getToolDisplayName(toolName) {
|
|
185
|
-
|
|
186
|
-
if (config) {
|
|
187
|
-
return config.displayName;
|
|
188
|
-
}
|
|
189
|
-
// Strip "internal--" prefix for unknown internal tools
|
|
190
|
-
if (toolName.startsWith('internal--')) {
|
|
191
|
-
return toolName.replace('internal--', '');
|
|
192
|
-
}
|
|
193
|
-
// Strip "custom--" prefix for custom tools
|
|
194
|
-
if (toolName.startsWith('custom--')) {
|
|
195
|
-
return toolName.replace('custom--', '');
|
|
196
|
-
}
|
|
197
|
-
// MCP tools: strip mcp-- or mcp__ prefix and server name for clean display
|
|
148
|
+
// MCP tools: strip `mcp--` prefix and server name for clean display
|
|
198
149
|
if (toolName.startsWith('mcp--')) {
|
|
199
150
|
const parts = toolName.split('--');
|
|
200
151
|
if (parts.length >= 3) {
|
|
201
|
-
return parts.slice(2).join('--');
|
|
152
|
+
return toTitleCase(parts.slice(2).join('--'));
|
|
202
153
|
}
|
|
203
|
-
return toolName.substring(5);
|
|
154
|
+
return toTitleCase(toolName.substring(5));
|
|
204
155
|
}
|
|
205
|
-
|
|
206
|
-
const parts = toolName.substring(5).split('__');
|
|
207
|
-
if (parts.length >= 2) {
|
|
208
|
-
return parts.slice(1).join('__');
|
|
209
|
-
}
|
|
210
|
-
return toolName.substring(5);
|
|
211
|
-
}
|
|
212
|
-
return toolName;
|
|
156
|
+
return toTitleCase(toolName);
|
|
213
157
|
}
|
|
214
158
|
/**
|
|
215
159
|
* Gets the tool type badge for display.
|
|
216
|
-
* Returns: '
|
|
160
|
+
* Returns: 'local' or MCP server name.
|
|
217
161
|
*/
|
|
218
162
|
export function getToolTypeBadge(toolName) {
|
|
219
|
-
// Internal tools
|
|
220
|
-
if (toolName.startsWith('internal--') || toolName.startsWith('internal__')) {
|
|
221
|
-
return 'internal';
|
|
222
|
-
}
|
|
223
163
|
// MCP tools with server name
|
|
224
164
|
if (toolName.startsWith('mcp--')) {
|
|
225
165
|
const parts = toolName.split('--');
|
|
@@ -228,19 +168,7 @@ export function getToolTypeBadge(toolName) {
|
|
|
228
168
|
}
|
|
229
169
|
return 'MCP';
|
|
230
170
|
}
|
|
231
|
-
|
|
232
|
-
const parts = toolName.substring(5).split('__');
|
|
233
|
-
if (parts.length >= 2 && parts[0]) {
|
|
234
|
-
return `MCP: ${parts[0]}`; // Format: 'MCP: servername'
|
|
235
|
-
}
|
|
236
|
-
return 'MCP';
|
|
237
|
-
}
|
|
238
|
-
// Custom tools
|
|
239
|
-
if (toolName.startsWith('custom--')) {
|
|
240
|
-
return 'custom';
|
|
241
|
-
}
|
|
242
|
-
// Unknown - likely custom
|
|
243
|
-
return 'custom';
|
|
171
|
+
return 'local';
|
|
244
172
|
}
|
|
245
173
|
/**
|
|
246
174
|
* Formats a tool call header for consistent display across CLI.
|
|
@@ -248,25 +176,26 @@ export function getToolTypeBadge(toolName) {
|
|
|
248
176
|
*
|
|
249
177
|
* Handles special cases like spawn_agent (uses agentId as display name).
|
|
250
178
|
*
|
|
251
|
-
* @param toolName -
|
|
179
|
+
* @param toolName - Tool name (local tool id or `mcp--...`)
|
|
252
180
|
* @param args - Tool arguments object
|
|
253
181
|
* @returns Formatted header components and full string
|
|
254
182
|
*/
|
|
255
|
-
export function formatToolHeader(
|
|
256
|
-
|
|
183
|
+
export function formatToolHeader(options) {
|
|
184
|
+
const { toolName, args, toolDisplayName } = options;
|
|
185
|
+
let displayName = toolDisplayName ?? getToolDisplayName(toolName);
|
|
257
186
|
const argsFormatted = formatToolArgsForDisplay(toolName, args);
|
|
258
187
|
const badge = getToolTypeBadge(toolName);
|
|
259
|
-
//
|
|
260
|
-
|
|
188
|
+
// TODO: Move tool-specific header formatting into tool display metadata, so the CLI doesn't
|
|
189
|
+
// need to special-case tool IDs here.
|
|
261
190
|
// Special handling for spawn_agent: use agentId as display name
|
|
262
|
-
const isSpawnAgent =
|
|
191
|
+
const isSpawnAgent = toolName === 'spawn_agent';
|
|
263
192
|
if (isSpawnAgent && args.agentId) {
|
|
264
193
|
const agentId = String(args.agentId);
|
|
265
194
|
const agentLabel = agentId.replace(/-agent$/, '');
|
|
266
195
|
displayName = agentLabel.charAt(0).toUpperCase() + agentLabel.slice(1);
|
|
267
196
|
}
|
|
268
197
|
// Special handling for invoke_skill: show skill as /skill-name
|
|
269
|
-
const isInvokeSkill =
|
|
198
|
+
const isInvokeSkill = toolName === 'invoke_skill';
|
|
270
199
|
if (isInvokeSkill && args.skill) {
|
|
271
200
|
const skillName = String(args.skill);
|
|
272
201
|
// Extract display name from skill identifier (e.g., "config:test-fork" -> "test-fork")
|
|
@@ -332,7 +261,6 @@ export function formatToolArgsForDisplay(toolName, args) {
|
|
|
332
261
|
const entries = Object.entries(args);
|
|
333
262
|
if (entries.length === 0)
|
|
334
263
|
return '';
|
|
335
|
-
const config = getToolConfig(toolName);
|
|
336
264
|
const parts = [];
|
|
337
265
|
/**
|
|
338
266
|
* Format a single argument value for display
|
|
@@ -360,42 +288,21 @@ export function formatToolArgsForDisplay(toolName, args) {
|
|
|
360
288
|
// Other args: simple truncation
|
|
361
289
|
return strValue.length > 40 ? strValue.slice(0, 37) + '...' : strValue;
|
|
362
290
|
};
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
parts.unshift(formattedValue);
|
|
376
|
-
}
|
|
377
|
-
else {
|
|
378
|
-
// Secondary args with key name
|
|
379
|
-
parts.push(`${argName}: ${formattedValue}`);
|
|
380
|
-
}
|
|
291
|
+
// Generic formatting for all tools:
|
|
292
|
+
// - Prefer common "primary" args (path/command/pattern/question/etc.)
|
|
293
|
+
// - Show up to 3 args total
|
|
294
|
+
// - Skip description (it's shown separately in the UI when present)
|
|
295
|
+
for (const [key, value] of entries) {
|
|
296
|
+
if (key === 'description')
|
|
297
|
+
continue;
|
|
298
|
+
if (parts.length >= 3)
|
|
299
|
+
break;
|
|
300
|
+
const formattedValue = formatArgValue(key, value);
|
|
301
|
+
if (FALLBACK_PRIMARY_ARGS.has(key) || PATH_ARGS.has(key)) {
|
|
302
|
+
parts.unshift(formattedValue);
|
|
381
303
|
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
// Fallback for unknown tools (MCP, etc.)
|
|
385
|
-
for (const [key, value] of entries) {
|
|
386
|
-
if (key === 'description')
|
|
387
|
-
continue; // Skip description field
|
|
388
|
-
if (parts.length >= 3)
|
|
389
|
-
break;
|
|
390
|
-
const formattedValue = formatArgValue(key, value);
|
|
391
|
-
if (FALLBACK_PRIMARY_ARGS.has(key) || PATH_ARGS.has(key)) {
|
|
392
|
-
// Primary arg without key name
|
|
393
|
-
parts.unshift(formattedValue);
|
|
394
|
-
}
|
|
395
|
-
else {
|
|
396
|
-
// Other args with key name
|
|
397
|
-
parts.push(`${key}: ${formattedValue}`);
|
|
398
|
-
}
|
|
304
|
+
else {
|
|
305
|
+
parts.push(`${key}: ${formattedValue}`);
|
|
399
306
|
}
|
|
400
307
|
}
|
|
401
308
|
return parts.join(', ');
|
|
@@ -462,7 +369,7 @@ export function createErrorMessage(error) {
|
|
|
462
369
|
return {
|
|
463
370
|
id: generateMessageId('error'),
|
|
464
371
|
role: 'system',
|
|
465
|
-
content:
|
|
372
|
+
content: `Error: ${content}`,
|
|
466
373
|
timestamp: new Date(),
|
|
467
374
|
};
|
|
468
375
|
}
|
|
@@ -504,10 +411,53 @@ function extractTextContent(content) {
|
|
|
504
411
|
/**
|
|
505
412
|
* Generates a preview of tool result content for display
|
|
506
413
|
*/
|
|
414
|
+
export function formatToolResultPreview(result) {
|
|
415
|
+
try {
|
|
416
|
+
const parsed = JSON.parse(result);
|
|
417
|
+
if (parsed.status === 'running' && parsed.taskId) {
|
|
418
|
+
return `Background task started (id: ${parsed.taskId})`;
|
|
419
|
+
}
|
|
420
|
+
if (parsed.found !== undefined && parsed.taskId) {
|
|
421
|
+
return parsed.found
|
|
422
|
+
? `Task ${parsed.taskId} status: ${parsed.status ?? 'unknown'}`
|
|
423
|
+
: `Task ${parsed.taskId} not found`;
|
|
424
|
+
}
|
|
425
|
+
if (Array.isArray(parsed.tasks) && typeof parsed.count === 'number') {
|
|
426
|
+
const running = parsed.tasks.filter((task) => task.status === 'running').length;
|
|
427
|
+
return `Tasks: ${parsed.count} total${running > 0 ? ` • ${running} running` : ''}`;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
// fall through
|
|
432
|
+
}
|
|
433
|
+
const maxChars = 200;
|
|
434
|
+
if (result.length <= maxChars) {
|
|
435
|
+
return result;
|
|
436
|
+
}
|
|
437
|
+
return result.slice(0, maxChars) + '…';
|
|
438
|
+
}
|
|
507
439
|
function generateToolResultPreview(content) {
|
|
508
440
|
const textContent = extractTextContent(content);
|
|
509
441
|
if (!textContent)
|
|
510
442
|
return '';
|
|
443
|
+
try {
|
|
444
|
+
const parsed = JSON.parse(textContent);
|
|
445
|
+
if (parsed.status === 'running' && parsed.taskId) {
|
|
446
|
+
return `Background task started (id: ${parsed.taskId})`;
|
|
447
|
+
}
|
|
448
|
+
if (Array.isArray(parsed.tasks) && typeof parsed.count === 'number') {
|
|
449
|
+
const running = parsed.tasks.filter((task) => task.status === 'running').length;
|
|
450
|
+
return `Tasks: ${parsed.count} total${running > 0 ? ` • ${running} running` : ''}`;
|
|
451
|
+
}
|
|
452
|
+
if (parsed.found !== undefined && parsed.taskId) {
|
|
453
|
+
return parsed.found
|
|
454
|
+
? `Task ${parsed.taskId} status: ${parsed.status ?? 'unknown'}`
|
|
455
|
+
: `Task ${parsed.taskId} not found`;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
// Not JSON; fall through to raw text preview
|
|
460
|
+
}
|
|
511
461
|
const lines = textContent.split('\n');
|
|
512
462
|
const previewLines = lines.slice(0, 5);
|
|
513
463
|
let preview = previewLines.join('\n');
|
|
@@ -538,10 +488,13 @@ export function convertHistoryToUIMessages(history, sessionId) {
|
|
|
538
488
|
const timestamp = new Date(msg.timestamp ?? Date.now() - (history.length - index) * 1000);
|
|
539
489
|
// Handle tool messages specially
|
|
540
490
|
if (isToolMessage(msg)) {
|
|
491
|
+
if (shouldHideTool(msg.name)) {
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
541
494
|
// Look up the original tool call to get args
|
|
542
495
|
const toolCall = toolCallMap.get(msg.toolCallId);
|
|
543
496
|
// Format tool name
|
|
544
|
-
const displayName = getToolDisplayName(msg.name);
|
|
497
|
+
const displayName = msg.toolDisplayName ?? getToolDisplayName(msg.name);
|
|
545
498
|
// Format args if we have them
|
|
546
499
|
let toolContent = displayName;
|
|
547
500
|
if (toolCall) {
|
|
@@ -582,7 +535,8 @@ export function convertHistoryToUIMessages(history, sessionId) {
|
|
|
582
535
|
}
|
|
583
536
|
// Handle assistant messages - skip those with only tool calls (no text content)
|
|
584
537
|
if (isAssistantMessage(msg)) {
|
|
585
|
-
|
|
538
|
+
let textContent = extractTextContent(msg.content);
|
|
539
|
+
textContent = stripBackgroundCompletion(textContent);
|
|
586
540
|
// Skip if no text content (message was just tool calls)
|
|
587
541
|
if (!textContent)
|
|
588
542
|
return;
|
|
@@ -596,6 +550,7 @@ export function convertHistoryToUIMessages(history, sessionId) {
|
|
|
596
550
|
}
|
|
597
551
|
// Handle other messages (user, system)
|
|
598
552
|
let textContent = extractTextContent(msg.content);
|
|
553
|
+
textContent = stripBackgroundCompletion(textContent);
|
|
599
554
|
// Skip empty messages
|
|
600
555
|
if (!textContent)
|
|
601
556
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolUtils.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/utils/toolUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"toolUtils.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/utils/toolUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAErE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEhF"}
|
|
@@ -6,12 +6,7 @@
|
|
|
6
6
|
* Used for "accept all edits" mode which auto-approves these tools.
|
|
7
7
|
*/
|
|
8
8
|
export function isEditWriteTool(toolName) {
|
|
9
|
-
return
|
|
10
|
-
toolName === 'internal--write_file' ||
|
|
11
|
-
toolName === 'custom--write_file' ||
|
|
12
|
-
toolName === 'custom--edit_file' ||
|
|
13
|
-
toolName === 'edit_file' ||
|
|
14
|
-
toolName === 'write_file');
|
|
9
|
+
return toolName === 'edit_file' || toolName === 'write_file';
|
|
15
10
|
}
|
|
16
11
|
/**
|
|
17
12
|
* Check if a tool is a plan update tool.
|
|
@@ -19,9 +14,7 @@ export function isEditWriteTool(toolName) {
|
|
|
19
14
|
* (typically marking tasks as complete during implementation).
|
|
20
15
|
*/
|
|
21
16
|
export function isPlanUpdateTool(toolName) {
|
|
22
|
-
return
|
|
23
|
-
toolName === 'custom--plan_update' ||
|
|
24
|
-
toolName === 'internal--plan_update');
|
|
17
|
+
return toolName === 'plan_update';
|
|
25
18
|
}
|
|
26
19
|
/**
|
|
27
20
|
* Check if a tool should be auto-approved in "accept all edits" mode.
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import { type AgentConfig, type ValidatedAgentConfig
|
|
1
|
+
import { type AgentConfig, type ValidatedAgentConfig } from '@dexto/agent-config';
|
|
2
2
|
export interface ValidationResult {
|
|
3
3
|
success: boolean;
|
|
4
4
|
config?: ValidatedAgentConfig;
|
|
5
5
|
errors?: string[];
|
|
6
|
+
warnings?: string[];
|
|
6
7
|
skipped?: boolean;
|
|
7
8
|
}
|
|
9
|
+
export interface ValidationOptions {
|
|
10
|
+
agentPath?: string;
|
|
11
|
+
credentialPolicy?: 'warn' | 'error' | 'ignore';
|
|
12
|
+
}
|
|
8
13
|
/**
|
|
9
14
|
* Validates agent config with optional interactive fixes for user experience.
|
|
10
|
-
* Uses schema parsing
|
|
15
|
+
* Uses schema parsing for structural validation and performs targeted credential checks.
|
|
11
16
|
* Returns validated config with all defaults applied.
|
|
12
17
|
*
|
|
13
18
|
* IMPORTANT: This function NEVER exits the process. It always returns a result
|
|
@@ -15,16 +20,11 @@ export interface ValidationResult {
|
|
|
15
20
|
*
|
|
16
21
|
* @param config - The agent configuration to validate
|
|
17
22
|
* @param interactive - Whether to allow interactive prompts to fix issues
|
|
18
|
-
* @param
|
|
19
|
-
* @param
|
|
20
|
-
* When false, allows missing credentials for interactive config.
|
|
23
|
+
* @param options.credentialPolicy - Behavior when credentials are missing (warn, error, ignore)
|
|
24
|
+
* @param options.agentPath - Agent config path (used for manual-edit instructions).
|
|
21
25
|
*/
|
|
22
|
-
export declare function validateAgentConfig(config: AgentConfig, interactive?: boolean,
|
|
23
|
-
agentPath?: string;
|
|
24
|
-
}): Promise<ValidationResult>;
|
|
26
|
+
export declare function validateAgentConfig(config: AgentConfig, interactive?: boolean, options?: ValidationOptions): Promise<ValidationResult>;
|
|
25
27
|
/**
|
|
26
|
-
*
|
|
27
|
-
* @deprecated Use validateAgentConfig with result handling instead
|
|
28
|
+
* Note: validateAgentConfig never exits. Callers own exit behavior.
|
|
28
29
|
*/
|
|
29
|
-
export declare function validateAgentConfigOrExit(config: AgentConfig, interactive?: boolean): Promise<ValidatedAgentConfig>;
|
|
30
30
|
//# sourceMappingURL=config-validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-validation.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config-validation.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"config-validation.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config-validation.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,KAAK,WAAW,EAChB,KAAK,oBAAoB,EAC5B,MAAM,qBAAqB,CAAC;AAW7B,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;CAClD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,WAAW,EACnB,WAAW,GAAE,OAAe,EAC5B,OAAO,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAsC3B;AAsLD;;GAEG"}
|