dexto 1.5.1 → 1.5.3

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.
Files changed (55) hide show
  1. package/dist/agents/agent-registry.json +9 -0
  2. package/dist/agents/coding-agent/coding-agent.yml +37 -6
  3. package/dist/agents/explore-agent/explore-agent.yml +124 -0
  4. package/dist/cli/approval/cli-approval-handler.d.ts +28 -0
  5. package/dist/cli/approval/cli-approval-handler.d.ts.map +1 -0
  6. package/dist/cli/approval/cli-approval-handler.js +146 -0
  7. package/dist/cli/approval/index.d.ts +7 -0
  8. package/dist/cli/approval/index.d.ts.map +1 -0
  9. package/dist/cli/approval/index.js +6 -0
  10. package/dist/cli/commands/interactive-commands/general-commands.d.ts.map +1 -1
  11. package/dist/cli/commands/interactive-commands/general-commands.js +5 -2
  12. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
  13. package/dist/cli/ink-cli/components/ApprovalPrompt.js +10 -2
  14. package/dist/cli/ink-cli/components/Footer.d.ts +3 -1
  15. package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -1
  16. package/dist/cli/ink-cli/components/Footer.js +4 -2
  17. package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
  18. package/dist/cli/ink-cli/components/ResourceAutocomplete.js +8 -2
  19. package/dist/cli/ink-cli/components/TextBufferInput.d.ts.map +1 -1
  20. package/dist/cli/ink-cli/components/TextBufferInput.js +20 -5
  21. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts +3 -1
  22. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
  23. package/dist/cli/ink-cli/components/chat/MessageItem.js +40 -9
  24. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -1
  25. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +4 -4
  26. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -1
  27. package/dist/cli/ink-cli/components/modes/StaticCLI.js +10 -3
  28. package/dist/cli/ink-cli/components/renderers/GenericRenderer.js +1 -1
  29. package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts.map +1 -1
  30. package/dist/cli/ink-cli/components/renderers/SearchRenderer.js +15 -1
  31. package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts.map +1 -1
  32. package/dist/cli/ink-cli/components/shared/MarkdownText.js +4 -4
  33. package/dist/cli/ink-cli/constants/processingPhrases.d.ts.map +1 -1
  34. package/dist/cli/ink-cli/constants/processingPhrases.js +58 -48
  35. package/dist/cli/ink-cli/constants/tips.d.ts.map +1 -1
  36. package/dist/cli/ink-cli/constants/tips.js +34 -32
  37. package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
  38. package/dist/cli/ink-cli/containers/InputContainer.js +18 -11
  39. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
  40. package/dist/cli/ink-cli/containers/OverlayContainer.js +24 -1
  41. package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -1
  42. package/dist/cli/ink-cli/hooks/useCLIState.js +14 -1
  43. package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -1
  44. package/dist/cli/ink-cli/services/processStream.js +77 -13
  45. package/dist/cli/ink-cli/state/types.d.ts +17 -0
  46. package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
  47. package/dist/cli/ink-cli/utils/messageFormatting.d.ts +24 -0
  48. package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
  49. package/dist/cli/ink-cli/utils/messageFormatting.js +131 -5
  50. package/dist/index.js +5 -15
  51. package/dist/webui/assets/index-CUVc7IDL.css +1 -0
  52. package/dist/webui/assets/{index-8j-KMkX1.js → index-SGm5dxhp.js} +208 -208
  53. package/dist/webui/index.html +2 -2
  54. package/package.json +7 -7
  55. package/dist/webui/assets/index-c_AX24V4.css +0 -1
@@ -5,7 +5,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
5
5
  */
6
6
  import { useCallback, useRef, useImperativeHandle, forwardRef, useState } from 'react';
7
7
  import { Box } from 'ink';
8
- import { ApprovalStatus, DenialReason } from '@dexto/core';
8
+ import { ApprovalStatus, DenialReason, isUserMessage } from '@dexto/core';
9
9
  import { ApprovalPrompt, } from '../components/ApprovalPrompt.js';
10
10
  import { SlashCommandAutocomplete, } from '../components/SlashCommandAutocomplete.js';
11
11
  import ResourceAutocomplete from '../components/ResourceAutocomplete.js';
@@ -446,6 +446,29 @@ export const OverlayContainer = forwardRef(function OverlayContainer({ ui, input
446
446
  if (history && history.length > 0) {
447
447
  const historyMessages = convertHistoryToUIMessages(history, newSessionId);
448
448
  setMessages(historyMessages);
449
+ // Extract user messages for input history (arrow up navigation)
450
+ const userInputHistory = history
451
+ .filter(isUserMessage)
452
+ .map((msg) => {
453
+ // Extract text content from user message
454
+ if (typeof msg.content === 'string') {
455
+ return msg.content;
456
+ }
457
+ // Handle array content (text parts)
458
+ if (Array.isArray(msg.content)) {
459
+ return msg.content
460
+ .filter((part) => typeof part === 'object' && part.type === 'text')
461
+ .map((part) => part.text)
462
+ .join('\n');
463
+ }
464
+ return '';
465
+ })
466
+ .filter((text) => text.trim().length > 0);
467
+ setInput((prev) => ({
468
+ ...prev,
469
+ history: userInputHistory,
470
+ historyIndex: -1,
471
+ }));
449
472
  }
450
473
  setMessages((prev) => [
451
474
  ...prev,
@@ -1 +1 @@
1
- {"version":3,"file":"useCLIState.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/hooks/useCLIState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useCLIState.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/hooks/useCLIState.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAGH,KAAK,UAAU,EACf,KAAK,aAAa,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAGrF,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAE3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE7D,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAGpE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEnE,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACzE,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAG1E,MAAM,EAAE,UAAU,CAAC;IAGnB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAG/B,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAGpE,eAAe,EAAE,OAAO,EAAE,CAAC;IAG3B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAAE,iBAAiB,GACtC,EAAE,gBAAgB,GAAG,cAAc,CAuNnC"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { useState, useMemo, useEffect, useRef, useCallback } from 'react';
8
8
  import { useStdout } from 'ink';
9
- import { getModelDisplayName } from '@dexto/core';
9
+ import { getModelDisplayName, isUserMessage, } from '@dexto/core';
10
10
  import { useAgentEvents } from './useAgentEvents.js';
11
11
  import { useInputOrchestrator } from './useInputOrchestrator.js';
12
12
  import { InputService, MessageService } from '../services/index.js';
@@ -140,6 +140,19 @@ export function useCLIState({ agent, initialSessionId, startupInfo, onKeyboardSc
140
140
  return;
141
141
  const historyMessages = convertHistoryToUIMessages(history, initialSessionId);
142
142
  setMessages(historyMessages);
143
+ // Extract user messages for input history (arrow up navigation)
144
+ const userInputHistory = history
145
+ .filter(isUserMessage)
146
+ .map((msg) => msg.content
147
+ .filter((part) => part.type === 'text')
148
+ .map((part) => part.text)
149
+ .join('\n'))
150
+ .filter((text) => text.trim().length > 0);
151
+ setInput((prev) => ({
152
+ ...prev,
153
+ history: userInputHistory,
154
+ historyIndex: -1,
155
+ }));
143
156
  }
144
157
  catch (error) {
145
158
  if (cancelled)
@@ -1 +1 @@
1
- {"version":3,"file":"processStream.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/services/processStream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,aAAa,CAAC;AAGvE,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAc,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AA4BvE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,2DAA2D;IAC3D,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,oFAAoF;IACpF,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpE,iFAAiF;IACjF,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACnE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,yDAAyD;IACzD,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/F,4DAA4D;IAC5D,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,uDAAuD;IACvD,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;CAC7E;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,2FAA2F;IAC3F,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2FAA2F;IAC3F,mBAAmB,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,qDAAqD;IACrD,QAAQ,EAAE,OAAO,aAAa,EAAE,aAAa,CAAC;CACjD;AA0BD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAC/B,QAAQ,EAAE,qBAAqB,CAAC,cAAc,CAAC,EAC/C,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,oBAAoB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA+xBf"}
1
+ {"version":3,"file":"processStream.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/services/processStream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,aAAa,CAAC;AAGvE,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAc,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAwBvE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,2DAA2D;IAC3D,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,oFAAoF;IACpF,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpE,iFAAiF;IACjF,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACnE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,yDAAyD;IACzD,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IAC/F,4DAA4D;IAC5D,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,uDAAuD;IACvD,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;CAC7E;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,2FAA2F;IAC3F,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2FAA2F;IAC3F,mBAAmB,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,qDAAqD;IACrD,QAAQ,EAAE,OAAO,aAAa,EAAE,aAAa,CAAC;CACjD;AA0BD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAC/B,QAAQ,EAAE,qBAAqB,CAAC,cAAc,CAAC,EAC/C,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,oBAAoB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA02Bf"}
@@ -23,7 +23,7 @@ import { createDebugLogger } from '../utils/debugLog.js';
23
23
  import { ApprovalType as ApprovalTypeEnum, ApprovalStatus } from '@dexto/core';
24
24
  import { generateMessageId } from '../utils/idGenerator.js';
25
25
  import { checkForSplit } from '../utils/streamSplitter.js';
26
- import { getToolDisplayName, formatToolArgsForDisplay, getToolTypeBadge, } from '../utils/messageFormatting.js';
26
+ import { formatToolHeader } from '../utils/messageFormatting.js';
27
27
  import { isEditWriteTool } from '../utils/toolUtils.js';
28
28
  import { capture } from '../../../analytics/index.js';
29
29
  import chalk from 'chalk';
@@ -442,19 +442,13 @@ export async function processStream(iterator, setters, options) {
442
442
  const toolMessageId = event.callId
443
443
  ? `tool-${event.callId}`
444
444
  : generateMessageId('tool');
445
- // Get friendly display name, format args, and tool type badge
446
- const displayName = getToolDisplayName(event.toolName);
447
- const argsFormatted = formatToolArgsForDisplay(event.toolName, event.args || {});
448
- const badge = getToolTypeBadge(event.toolName);
449
- // Extract description if present
445
+ // Format tool header using shared utility
446
+ const { header: toolContent } = formatToolHeader(event.toolName, event.args || {});
447
+ // Add description if present (dim styling, on new line)
448
+ let finalToolContent = toolContent;
450
449
  const description = event.args?.description;
451
- // Format: toolName(args) [badge]
452
- // If description exists, add it on a new line with dim styling
453
- let toolContent = argsFormatted
454
- ? `${displayName}(${argsFormatted}) [${badge}]`
455
- : `${displayName}() [${badge}]`;
456
450
  if (description && typeof description === 'string') {
457
- toolContent += `\n${chalk.dim(description)}`;
451
+ finalToolContent += `\n${chalk.dim(description)}`;
458
452
  }
459
453
  // Tool calls start in 'pending' state (don't know if approval needed yet)
460
454
  // Status transitions: pending → pending_approval (if approval needed) → running → finished
@@ -462,7 +456,7 @@ export async function processStream(iterator, setters, options) {
462
456
  addToPending({
463
457
  id: toolMessageId,
464
458
  role: 'tool',
465
- content: toolContent,
459
+ content: finalToolContent,
466
460
  timestamp: new Date(),
467
461
  toolStatus: 'pending',
468
462
  });
@@ -712,6 +706,76 @@ export async function processStream(iterator, setters, options) {
712
706
  }
713
707
  break;
714
708
  }
709
+ case 'approval:response': {
710
+ // Handle approval responses - dismisses auto-approved parallel tool calls
711
+ //
712
+ // When user approves a tool with "remember", other pending parallel requests
713
+ // for the same tool are auto-approved. The handler emits approval:response
714
+ // for each, and we need to dismiss them from the UI.
715
+ //
716
+ // For user-initiated approvals, completeApproval() in OverlayContainer
717
+ // already clears the state before emitting, so these are no-ops.
718
+ const { approvalId } = event;
719
+ // Step 1: Remove from queue if present
720
+ setApprovalQueue((queue) => queue.filter((a) => a.approvalId !== approvalId));
721
+ // Step 2: If this is the current approval, dismiss and show next
722
+ // We use the same pattern as completeApproval in OverlayContainer:
723
+ // setApprovalQueue as coordinator, calling setApproval inside
724
+ setApproval((currentApproval) => {
725
+ if (currentApproval?.approvalId !== approvalId) {
726
+ return currentApproval; // Not current, nothing to do
727
+ }
728
+ // Current approval was auto-approved - show next or close
729
+ // Note: queue was already filtered in Step 1, so we read updated queue
730
+ setApprovalQueue((queue) => {
731
+ if (queue.length > 0) {
732
+ const [next, ...rest] = queue;
733
+ setApproval(next);
734
+ setUi((prev) => ({ ...prev, activeOverlay: 'approval' }));
735
+ return rest;
736
+ }
737
+ else {
738
+ setUi((prev) => ({ ...prev, activeOverlay: 'none' }));
739
+ return [];
740
+ }
741
+ });
742
+ return null; // Clear current while setApprovalQueue handles next
743
+ });
744
+ break;
745
+ }
746
+ case 'service:event': {
747
+ // Handle service events - extensible pattern for non-core services
748
+ debug.log('SERVICE-EVENT received', {
749
+ service: event.service,
750
+ eventType: event.event,
751
+ toolCallId: event.toolCallId,
752
+ sessionId: event.sessionId,
753
+ });
754
+ if (event.service === 'agent-spawner' && event.event === 'progress') {
755
+ const { toolCallId, data } = event;
756
+ // Guard against null/non-object data payloads
757
+ if (toolCallId && data && typeof data === 'object') {
758
+ // Update the tool message with sub-agent progress
759
+ const toolMessageId = `tool-${toolCallId}`;
760
+ const progressData = data;
761
+ debug.log('SERVICE-EVENT updating progress', {
762
+ toolMessageId,
763
+ toolsCalled: progressData.toolsCalled,
764
+ currentTool: progressData.currentTool,
765
+ });
766
+ updatePending(toolMessageId, {
767
+ subAgentProgress: {
768
+ task: progressData.task,
769
+ agentId: progressData.agentId,
770
+ toolsCalled: progressData.toolsCalled,
771
+ currentTool: progressData.currentTool,
772
+ currentArgs: progressData.currentArgs,
773
+ },
774
+ });
775
+ }
776
+ }
777
+ break;
778
+ }
715
779
  // Ignore other events
716
780
  default:
717
781
  break;
@@ -133,6 +133,21 @@ export interface ShortcutsStyledData {
133
133
  }>;
134
134
  }
135
135
  export type StyledData = ConfigStyledData | StatsStyledData | HelpStyledData | SessionListStyledData | SessionHistoryStyledData | LogConfigStyledData | RunSummaryStyledData | PromptsStyledData | SysPromptStyledData | ShortcutsStyledData;
136
+ /**
137
+ * Sub-agent progress data for spawn_agent tool calls
138
+ */
139
+ export interface SubAgentProgress {
140
+ /** Short task description */
141
+ task: string;
142
+ /** Agent ID (e.g., 'explore-agent') */
143
+ agentId: string;
144
+ /** Number of tools called by the sub-agent */
145
+ toolsCalled: number;
146
+ /** Current tool being executed */
147
+ currentTool: string;
148
+ /** Current tool arguments (optional) */
149
+ currentArgs?: Record<string, unknown> | undefined;
150
+ }
136
151
  /**
137
152
  * Message in the chat interface
138
153
  *
@@ -162,6 +177,8 @@ export interface Message {
162
177
  toolDisplayData?: ToolDisplayData;
163
178
  /** Content parts for tool result rendering */
164
179
  toolContent?: ContentPart[];
180
+ /** Sub-agent progress data (for spawn_agent tool calls) */
181
+ subAgentProgress?: SubAgentProgress;
165
182
  }
166
183
  /**
167
184
  * Streaming message state
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/state/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/state/types.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,30 @@ export declare function getToolDisplayName(toolName: string): string;
41
41
  * Returns: 'internal', MCP server name, or 'custom'
42
42
  */
43
43
  export declare function getToolTypeBadge(toolName: string): string;
44
+ /**
45
+ * Result of formatting a tool header for display
46
+ */
47
+ export interface FormattedToolHeader {
48
+ /** User-friendly display name (e.g., "Explore", "Read") */
49
+ displayName: string;
50
+ /** Formatted arguments string (e.g., "file.ts" or "pattern, path: /src") */
51
+ argsFormatted: string;
52
+ /** Tool type badge (e.g., "internal", "custom", "MCP: github") */
53
+ badge: string;
54
+ /** Full formatted header string (e.g., "Explore(task) [custom]") */
55
+ header: string;
56
+ }
57
+ /**
58
+ * Formats a tool call header for consistent display across CLI.
59
+ * Used by both tool messages and approval prompts.
60
+ *
61
+ * Handles special cases like spawn_agent (uses agentId as display name).
62
+ *
63
+ * @param toolName - Raw tool name (may include prefixes like "custom--")
64
+ * @param args - Tool arguments object
65
+ * @returns Formatted header components and full string
66
+ */
67
+ export declare function formatToolHeader(toolName: string, args?: Record<string, unknown>): FormattedToolHeader;
44
68
  /**
45
69
  * Formats tool arguments for display.
46
70
  * Format: ToolName(primary_arg) or ToolName(primary_arg, key: value)
@@ -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,EAAe,MAAM,aAAa,CAAC;AAE5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAmB1F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAW,EACrB,GAAG,GAAE,MAAsB,GAC5B,MAAM,CAWR;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiC7E;AAyED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6B3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8BzD;AA8BD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA0EhG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,GAAE,MAAW,GACvB,MAAM,CAeR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CASvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAQjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAQhD;AAgBD;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,eAAe,EAAE,EAC1B,SAAS,EAAE,MAAM,GAClB,OAAO,EAAE,CAmBX;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU;;;;;;;;GAiBrD"}
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;AAGjD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAmB1F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAW,EACrB,GAAG,GAAE,MAAsB,GAC5B,MAAM,CAWR;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiC7E;AA4ED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6B3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8BzD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,mBAAmB,CA8BrB;AA8BD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA0EhG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,GAAE,MAAW,GACvB,MAAM,CAeR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CASvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAQjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAQhD;AAqCD;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,eAAe,EAAE,EAC1B,SAAS,EAAE,MAAM,GAClB,OAAO,EAAE,CAgGX;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU;;;;;;;;GAiBrD"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import path from 'path';
6
6
  import os from 'os';
7
- import { isTextPart } from '@dexto/core';
7
+ import { isTextPart, isAssistantMessage, isToolMessage } from '@dexto/core';
8
8
  import { generateMessageId } from './idGenerator.js';
9
9
  /**
10
10
  * Convert absolute path to display-friendly relative path.
@@ -111,6 +111,8 @@ const TOOL_CONFIGS = {
111
111
  kill_process: { displayName: 'Kill', argsToShow: ['process_id'], primaryArg: 'process_id' },
112
112
  // User interaction
113
113
  ask_user: { displayName: 'Ask', argsToShow: ['question'], primaryArg: 'question' },
114
+ // Agent spawning - handled specially in getToolDisplayName for dynamic agentId
115
+ spawn_agent: { displayName: 'Agent', argsToShow: ['task'], primaryArg: 'task' },
114
116
  };
115
117
  /**
116
118
  * Gets the display config for a tool.
@@ -200,6 +202,43 @@ export function getToolTypeBadge(toolName) {
200
202
  // Unknown - likely custom
201
203
  return 'custom';
202
204
  }
205
+ /**
206
+ * Formats a tool call header for consistent display across CLI.
207
+ * Used by both tool messages and approval prompts.
208
+ *
209
+ * Handles special cases like spawn_agent (uses agentId as display name).
210
+ *
211
+ * @param toolName - Raw tool name (may include prefixes like "custom--")
212
+ * @param args - Tool arguments object
213
+ * @returns Formatted header components and full string
214
+ */
215
+ export function formatToolHeader(toolName, args = {}) {
216
+ let displayName = getToolDisplayName(toolName);
217
+ const argsFormatted = formatToolArgsForDisplay(toolName, args);
218
+ const badge = getToolTypeBadge(toolName);
219
+ // Special handling for spawn_agent: use agentId as display name
220
+ // Normalize tool name to handle all prefixes (internal--, custom--)
221
+ const normalizedToolName = toolName.replace(/^(?:internal--|custom--)/, '');
222
+ const isSpawnAgent = normalizedToolName === 'spawn_agent';
223
+ if (isSpawnAgent && args.agentId) {
224
+ const agentId = String(args.agentId);
225
+ const agentLabel = agentId.replace(/-agent$/, '');
226
+ displayName = agentLabel.charAt(0).toUpperCase() + agentLabel.slice(1);
227
+ }
228
+ // Only show badge for MCP tools (external tools worth distinguishing)
229
+ const isMcpTool = badge.startsWith('MCP');
230
+ const badgeSuffix = isMcpTool ? ` [${badge}]` : '';
231
+ // Format: DisplayName(args) [badge] (badge only for MCP)
232
+ const header = argsFormatted
233
+ ? `${displayName}(${argsFormatted})${badgeSuffix}`
234
+ : `${displayName}()${badgeSuffix}`;
235
+ return {
236
+ displayName,
237
+ argsFormatted,
238
+ badge,
239
+ header,
240
+ };
241
+ }
203
242
  /**
204
243
  * Fallback primary argument names for unknown tools.
205
244
  * Used when we don't have a specific config for a tool.
@@ -245,9 +284,9 @@ export function formatToolArgsForDisplay(toolName, args) {
245
284
  */
246
285
  const formatArgValue = (argName, value) => {
247
286
  const strValue = typeof value === 'string' ? value : JSON.stringify(value);
248
- // File paths: use relative path + center-truncation
287
+ // File paths: use relative path (no truncation)
249
288
  if (PATH_ARGS.has(argName)) {
250
- return formatPathForDisplay(strValue);
289
+ return makeRelativePath(strValue);
251
290
  }
252
291
  // Commands: show single-line in full, truncate multi-line (heredocs) to first line
253
292
  if (argName === 'command') {
@@ -407,13 +446,100 @@ function extractTextContent(content) {
407
446
  .map((part) => part.text)
408
447
  .join('\n');
409
448
  }
449
+ /**
450
+ * Generates a preview of tool result content for display
451
+ */
452
+ function generateToolResultPreview(content) {
453
+ const textContent = extractTextContent(content);
454
+ if (!textContent)
455
+ return '';
456
+ const lines = textContent.split('\n');
457
+ const previewLines = lines.slice(0, 5);
458
+ let preview = previewLines.join('\n');
459
+ // Truncate if too long
460
+ if (preview.length > 400) {
461
+ preview = preview.slice(0, 397) + '...';
462
+ }
463
+ else if (lines.length > 5) {
464
+ preview += '\n...';
465
+ }
466
+ return preview;
467
+ }
410
468
  /**
411
469
  * Converts session history messages to UI messages
412
470
  */
413
471
  export function convertHistoryToUIMessages(history, sessionId) {
414
472
  const uiMessages = [];
473
+ // Build a map of toolCallId -> ToolCall for looking up tool call args
474
+ const toolCallMap = new Map();
475
+ for (const msg of history) {
476
+ if (isAssistantMessage(msg) && msg.toolCalls) {
477
+ for (const toolCall of msg.toolCalls) {
478
+ toolCallMap.set(toolCall.id, toolCall);
479
+ }
480
+ }
481
+ }
415
482
  history.forEach((msg, index) => {
416
- // Extract text content properly
483
+ const timestamp = new Date(msg.timestamp ?? Date.now() - (history.length - index) * 1000);
484
+ // Handle tool messages specially
485
+ if (isToolMessage(msg)) {
486
+ // Look up the original tool call to get args
487
+ const toolCall = toolCallMap.get(msg.toolCallId);
488
+ // Format tool name
489
+ const displayName = getToolDisplayName(msg.name);
490
+ // Format args if we have them
491
+ let toolContent = displayName;
492
+ if (toolCall) {
493
+ try {
494
+ const args = JSON.parse(toolCall.function.arguments || '{}');
495
+ const argsFormatted = formatToolArgsForDisplay(msg.name, args);
496
+ if (argsFormatted) {
497
+ toolContent = `${displayName}(${argsFormatted})`;
498
+ }
499
+ }
500
+ catch {
501
+ // Ignore JSON parse errors
502
+ }
503
+ }
504
+ // Add tool type badge (only for MCP tools)
505
+ const badge = getToolTypeBadge(msg.name);
506
+ if (badge.startsWith('MCP')) {
507
+ toolContent = `${toolContent} [${badge}]`;
508
+ }
509
+ // Generate result preview
510
+ const resultPreview = generateToolResultPreview(msg.content);
511
+ uiMessages.push({
512
+ id: `session-${sessionId}-${index}`,
513
+ role: 'tool',
514
+ content: toolContent,
515
+ timestamp,
516
+ toolStatus: 'finished',
517
+ toolResult: resultPreview,
518
+ isError: msg.success === false,
519
+ // Store content parts for potential rich rendering
520
+ toolContent: msg.content,
521
+ // Restore structured display data for rich rendering (diffs, shell output, etc.)
522
+ ...(msg.displayData !== undefined && {
523
+ toolDisplayData: msg.displayData,
524
+ }),
525
+ });
526
+ return;
527
+ }
528
+ // Handle assistant messages - skip those with only tool calls (no text content)
529
+ if (isAssistantMessage(msg)) {
530
+ const textContent = extractTextContent(msg.content);
531
+ // Skip if no text content (message was just tool calls)
532
+ if (!textContent)
533
+ return;
534
+ uiMessages.push({
535
+ id: `session-${sessionId}-${index}`,
536
+ role: 'assistant',
537
+ content: textContent,
538
+ timestamp,
539
+ });
540
+ return;
541
+ }
542
+ // Handle other messages (user, system)
417
543
  const textContent = extractTextContent(msg.content);
418
544
  // Skip empty messages
419
545
  if (!textContent)
@@ -422,7 +548,7 @@ export function convertHistoryToUIMessages(history, sessionId) {
422
548
  id: `session-${sessionId}-${index}`,
423
549
  role: msg.role,
424
550
  content: textContent,
425
- timestamp: new Date(msg.timestamp ?? Date.now() - (history.length - index) * 1000),
551
+ timestamp,
426
552
  });
427
553
  });
428
554
  return uiMessages;
package/dist/index.js CHANGED
@@ -959,26 +959,16 @@ program
959
959
  case 'cli': {
960
960
  // Set up approval handler for interactive CLI if manual mode OR elicitation enabled
961
961
  // Note: Headless CLI with manual mode is blocked by validation above
962
- // Ink CLI uses ApprovalCoordinator (same as server/web mode) to coordinate
963
- // approval requests with React UI components
964
962
  const needsHandler = !headlessInput &&
965
963
  (validatedConfig.toolConfirmation?.mode === 'manual' ||
966
964
  validatedConfig.elicitation.enabled);
967
965
  if (needsHandler) {
968
- const { createManualApprovalHandler, ApprovalCoordinator } = await import('@dexto/server');
969
- const approvalCoordinator = new ApprovalCoordinator();
970
- const handler = createManualApprovalHandler(approvalCoordinator);
966
+ // CLI uses its own approval handler that works directly with AgentEventBus
967
+ // This avoids the indirection of ApprovalCoordinator (designed for HTTP flows)
968
+ const { createCLIApprovalHandler } = await import('./cli/approval/index.js');
969
+ const handler = createCLIApprovalHandler(agent.agentEventBus);
971
970
  agent.setApprovalHandler(handler);
972
- // Bridge approval events between coordinator and agent event bus for Ink CLI
973
- // Forward requests from coordinator to event bus (for UI to receive)
974
- approvalCoordinator.on('approval:request', (request) => {
975
- agent.agentEventBus.emit('approval:request', request);
976
- });
977
- // Forward responses from event bus to coordinator (for handler to receive)
978
- agent.agentEventBus.on('approval:response', (response) => {
979
- approvalCoordinator.emitResponse(response);
980
- });
981
- logger.debug('Event-based approval handler configured for Ink CLI');
971
+ logger.debug('CLI approval handler configured for Ink CLI');
982
972
  }
983
973
  // Start the agent now that approval handler is configured
984
974
  await agent.start();