@iaforged/context-code 1.1.9 → 1.2.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.
Files changed (78) hide show
  1. package/README.md +24 -0
  2. package/dist/src/commands/model/model.js +9 -5
  3. package/dist/src/commands/timeline/index.js +8 -0
  4. package/dist/src/commands/timeline/timeline.js +194 -0
  5. package/dist/src/commands.js +2 -0
  6. package/dist/src/components/AgentActivitySidebar.js +50 -0
  7. package/dist/src/components/AgentProgressLine.js +5 -5
  8. package/dist/src/components/ModelPicker.js +252 -441
  9. package/dist/src/components/PromptInput/PromptInputFooter.js +10 -29
  10. package/dist/src/components/Spinner/TeammateSpinnerLine.js +20 -62
  11. package/dist/src/components/Spinner/TeammateSpinnerTree.js +16 -258
  12. package/dist/src/components/Spinner/teammateSelectHint.js +1 -1
  13. package/dist/src/components/Spinner/utils.js +3 -6
  14. package/dist/src/components/ThemeBrowser.js +120 -0
  15. package/dist/src/components/ThemePicker.js +113 -321
  16. package/dist/src/components/design-system/ThemeProvider.js +3 -0
  17. package/dist/src/components/mcp/MCPListPanel.js +138 -444
  18. package/dist/src/components/permissions/SandboxPermissionRequest.js +5 -5
  19. package/dist/src/components/teams/TeamStatus.js +7 -71
  20. package/dist/src/constants/spinnerVerbs.js +80 -180
  21. package/dist/src/context/modalStackContext.js +12 -0
  22. package/dist/src/hooks/useTextInput.js +28 -18
  23. package/dist/src/main.js +12 -0
  24. package/dist/src/screens/REPL.js +386 -320
  25. package/dist/src/skills/loadSkillsDir.js +1 -0
  26. package/dist/src/tools/AgentTool/UI.js +8 -8
  27. package/dist/src/tools/BashTool/bashSecurity.js +1 -1
  28. package/dist/src/utils/handlePromptSubmit.js +12 -2
  29. package/dist/src/utils/processUserInput/processSlashCommand.js +9 -5
  30. package/dist/src/utils/sembleMcp/common.js +5 -0
  31. package/dist/src/utils/sembleMcp/setup.js +119 -0
  32. package/dist/src/utils/theme.js +24 -3
  33. package/dist/src/utils/themes/bootstrap.js +109 -0
  34. package/dist/src/utils/themes/builtin/opencode/_index.json +41 -0
  35. package/dist/src/utils/themes/builtin/opencode/amoled.json +49 -0
  36. package/dist/src/utils/themes/builtin/opencode/aura.json +51 -0
  37. package/dist/src/utils/themes/builtin/opencode/ayu.json +51 -0
  38. package/dist/src/utils/themes/builtin/opencode/carbonfox.json +53 -0
  39. package/dist/src/utils/themes/builtin/opencode/catppuccin-frappe.json +85 -0
  40. package/dist/src/utils/themes/builtin/opencode/catppuccin-macchiato.json +85 -0
  41. package/dist/src/utils/themes/builtin/opencode/catppuccin.json +45 -0
  42. package/dist/src/utils/themes/builtin/opencode/cobalt2.json +87 -0
  43. package/dist/src/utils/themes/builtin/opencode/cursor.json +91 -0
  44. package/dist/src/utils/themes/builtin/opencode/dracula.json +49 -0
  45. package/dist/src/utils/themes/builtin/opencode/everforest.json +89 -0
  46. package/dist/src/utils/themes/builtin/opencode/flexoki.json +86 -0
  47. package/dist/src/utils/themes/builtin/opencode/github.json +85 -0
  48. package/dist/src/utils/themes/builtin/opencode/gruvbox.json +45 -0
  49. package/dist/src/utils/themes/builtin/opencode/kanagawa.json +89 -0
  50. package/dist/src/utils/themes/builtin/opencode/lucent-orng.json +87 -0
  51. package/dist/src/utils/themes/builtin/opencode/material.json +87 -0
  52. package/dist/src/utils/themes/builtin/opencode/matrix.json +91 -0
  53. package/dist/src/utils/themes/builtin/opencode/mercury.json +86 -0
  54. package/dist/src/utils/themes/builtin/opencode/monokai.json +49 -0
  55. package/dist/src/utils/themes/builtin/opencode/nightowl.json +46 -0
  56. package/dist/src/utils/themes/builtin/opencode/nord.json +46 -0
  57. package/dist/src/utils/themes/builtin/opencode/oc-2.json +88 -0
  58. package/dist/src/utils/themes/builtin/opencode/one-dark.json +89 -0
  59. package/dist/src/utils/themes/builtin/opencode/onedarkpro.json +45 -0
  60. package/dist/src/utils/themes/builtin/opencode/opencode.json +89 -0
  61. package/dist/src/utils/themes/builtin/opencode/orng.json +87 -0
  62. package/dist/src/utils/themes/builtin/opencode/osaka-jade.json +88 -0
  63. package/dist/src/utils/themes/builtin/opencode/palenight.json +85 -0
  64. package/dist/src/utils/themes/builtin/opencode/rosepine.json +85 -0
  65. package/dist/src/utils/themes/builtin/opencode/shadesofpurple.json +51 -0
  66. package/dist/src/utils/themes/builtin/opencode/solarized.json +49 -0
  67. package/dist/src/utils/themes/builtin/opencode/synthwave84.json +87 -0
  68. package/dist/src/utils/themes/builtin/opencode/tokyonight.json +47 -0
  69. package/dist/src/utils/themes/builtin/opencode/vercel.json +90 -0
  70. package/dist/src/utils/themes/builtin/opencode/vesper.json +51 -0
  71. package/dist/src/utils/themes/builtin/opencode/zenburn.json +87 -0
  72. package/dist/src/utils/themes/index.js +4 -0
  73. package/dist/src/utils/themes/loader.js +147 -0
  74. package/dist/src/utils/themes/opencodeMapper.js +124 -0
  75. package/dist/src/utils/themes/resolver.js +66 -0
  76. package/dist/src/utils/themes/types.js +1 -0
  77. package/docs/MCP_SERVERS.md +27 -1
  78. package/package.json +1 -1
package/README.md CHANGED
@@ -78,6 +78,30 @@ Comportamiento por defecto:
78
78
  - el idioma por defecto del dictado es espanol (`es`);
79
79
  - si quieres otro idioma o autodeteccion, puedes ajustarlo en la configuracion.
80
80
 
81
+ ## MCP integrados
82
+
83
+ Context Code soporta MCP externos, pero tambien incluye MCP integrados para ciertos flujos del runtime.
84
+
85
+ MCP integrados principales:
86
+
87
+ - `database`: expone herramientas de base de datos con prefijo `mcp__database__*` para operaciones como conexion, consultas, esquema, indices y transacciones sobre `Oracle`, `SQL Server`, `PostgreSQL` y `MySQL`.
88
+ - `semble`: expone herramientas de busqueda de codigo con prefijo `mcp__semble__*`, en particular `mcp__semble__search` y `mcp__semble__find_related`.
89
+
90
+ Comportamiento de `semble`:
91
+
92
+ - en el primer arranque, el CLI instala `semble` automaticamente si hace falta;
93
+ - si `uv` no existe, intenta instalarlo en una carpeta administrada por la aplicacion;
94
+ - despues instala `semble`, hace un warmup inicial y descarga el modelo local que usa para embeddings.
95
+
96
+ MCP opcionales o dependientes de plataforma/features:
97
+
98
+ - `claude-in-chrome`: integracion MCP para automatizacion y contexto desde navegadores Chromium compatibles cuando esa capacidad esta habilitada.
99
+ - `computer-use`: MCP orientado a interaccion asistida con interfaz grafica; su disponibilidad depende de plataforma y gates internos.
100
+
101
+ Para registrar servidores MCP externos y ver mas detalle sobre esta arquitectura:
102
+
103
+ - [Guia de MCP](docs/MCP_SERVERS.md)
104
+
81
105
  ## Documentacion
82
106
 
83
107
  Hemos organizado toda la documentacion tecnica, guias operativas y arquitectura en la carpeta `docs/`.
@@ -111,17 +111,21 @@ export function ModelPickerWrapper(t0) {
111
111
  t3 = $[10];
112
112
  }
113
113
  let t4;
114
- if ($[11] !== handleCancel || $[12] !== handleSelect || $[13] !== mainLoopModel || $[14] !== mainLoopModelForSession || $[15] !== t3) {
115
- t4 = _jsx(ModelPicker, { initial: mainLoopModel, sessionModel: mainLoopModelForSession, onSelect: handleSelect, onCancel: handleCancel, isStandaloneCommand: true, showFastModeNotice: t3 });
114
+ if ($[11] !== handleCancel || $[12] !== handleSelect || $[13] !== mainLoopModel || $[14] !== mainLoopModelForSession || $[15] !== onDone || $[16] !== t3) {
115
+ t4 = _jsx(ModelPicker, { initial: mainLoopModel, sessionModel: mainLoopModelForSession, onSelect: handleSelect, onCancel: handleCancel, isStandaloneCommand: true, showFastModeNotice: t3, onOpenProvider: () => onDone('Abriendo selector de proveedor...', {
116
+ nextInput: '/provider',
117
+ submitNextInput: true
118
+ }) });
116
119
  $[11] = handleCancel;
117
120
  $[12] = handleSelect;
118
121
  $[13] = mainLoopModel;
119
122
  $[14] = mainLoopModelForSession;
120
- $[15] = t3;
121
- $[16] = t4;
123
+ $[15] = onDone;
124
+ $[16] = t3;
125
+ $[17] = t4;
122
126
  }
123
127
  else {
124
- t4 = $[16];
128
+ t4 = $[17];
125
129
  }
126
130
  return t4;
127
131
  }
@@ -0,0 +1,8 @@
1
+ const timeline = {
2
+ type: 'local-jsx',
3
+ name: 'timeline',
4
+ aliases: ['tl'],
5
+ description: 'Mostrar mensajes del usuario de la sesión actual',
6
+ load: () => import('./timeline.js'),
7
+ };
8
+ export default timeline;
@@ -0,0 +1,194 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import figures from 'figures';
3
+ import { useEffect, useMemo, useState } from 'react';
4
+ import { createHistoryAuthCtx, fetchLatestEvents, fetchOlderEvents, } from '../../assistant/sessionHistory.js';
5
+ import { getSessionId } from '../../bootstrap/state.js';
6
+ import { Select } from '../../components/CustomSelect/select.js';
7
+ import { Spinner } from '../../components/Spinner.js';
8
+ import { FuzzyPicker } from '../../components/design-system/FuzzyPicker.js';
9
+ import { stringWidth } from '../../ink/stringWidth.js';
10
+ import { setClipboard } from '../../ink/termio/osc.js';
11
+ import { Box, Text } from '../../ink.js';
12
+ import { formatRelativeTimeAgo, truncateToWidth } from '../../utils/format.js';
13
+ import { logForDebugging } from '../../utils/debug.js';
14
+ const AGE_WIDTH = 8;
15
+ const MAX_PREVIEW_WIDTH = 140;
16
+ const MAX_PREVIEW_CHARS = 220;
17
+ const MAX_PAGES = 30;
18
+ function extractPreviewText(content) {
19
+ if (typeof content === 'string') {
20
+ const cleaned = content.trim();
21
+ return cleaned.length > 0 ? cleaned : null;
22
+ }
23
+ if (!Array.isArray(content))
24
+ return null;
25
+ const textBlock = content.find(b => b?.type === 'text' && typeof b.text === 'string');
26
+ const text = textBlock?.text?.trim();
27
+ return text && text.length > 0 ? text : null;
28
+ }
29
+ function isHumanUserMessage(msg) {
30
+ if (msg.type !== 'user')
31
+ return false;
32
+ if (msg.parent_tool_use_id != null || msg.isSynthetic || msg.isReplay)
33
+ return false;
34
+ return true;
35
+ }
36
+ function asTimelineItem(msg, sessionId) {
37
+ if (!isHumanUserMessage(msg))
38
+ return null;
39
+ if (!msg.uuid)
40
+ return null;
41
+ const previewText = extractPreviewText(msg.message?.content);
42
+ if (!previewText)
43
+ return null;
44
+ const timestamp = msg.timestamp ?? new Date().toISOString();
45
+ const age = formatRelativeTimeAgo(new Date(timestamp));
46
+ return {
47
+ sessionId,
48
+ messageId: msg.uuid,
49
+ preview: previewText.slice(0, MAX_PREVIEW_CHARS),
50
+ fullText: previewText,
51
+ timestamp,
52
+ age: age + ' '.repeat(Math.max(0, AGE_WIDTH - stringWidth(age))),
53
+ lower: previewText.toLowerCase(),
54
+ };
55
+ }
56
+ async function loadTimelineItems(sessionId) {
57
+ const ctx = await createHistoryAuthCtx(sessionId);
58
+ const latest = await fetchLatestEvents(ctx);
59
+ if (!latest)
60
+ return [];
61
+ const events = [...latest.events];
62
+ let cursor = latest.firstId;
63
+ let hasMore = latest.hasMore;
64
+ let pageCount = 1;
65
+ while (hasMore && cursor && pageCount < MAX_PAGES) {
66
+ const page = await fetchOlderEvents(ctx, cursor);
67
+ if (!page)
68
+ break;
69
+ events.unshift(...page.events);
70
+ cursor = page.firstId;
71
+ hasMore = page.hasMore;
72
+ pageCount++;
73
+ }
74
+ if (hasMore) {
75
+ logForDebugging(`[timeline] Stopped pagination at MAX_PAGES=${MAX_PAGES} for session ${sessionId}`);
76
+ }
77
+ const items = events
78
+ .map(msg => asTimelineItem(msg, sessionId))
79
+ .filter((item) => item !== null)
80
+ .reverse();
81
+ return items;
82
+ }
83
+ function TimelinePicker({ onDone, onJumpToMessage, onOpenMessageSelectorAtMessage, }) {
84
+ const [loading, setLoading] = useState(true);
85
+ const [items, setItems] = useState([]);
86
+ const [query, setQuery] = useState('');
87
+ const [selectedItem, setSelectedItem] = useState(null);
88
+ useEffect(() => {
89
+ let cancelled = false;
90
+ void (async () => {
91
+ try {
92
+ const sessionId = getSessionId();
93
+ const loaded = await loadTimelineItems(sessionId);
94
+ if (!cancelled)
95
+ setItems(loaded);
96
+ }
97
+ catch (_error) {
98
+ if (!cancelled)
99
+ setItems([]);
100
+ }
101
+ finally {
102
+ if (!cancelled)
103
+ setLoading(false);
104
+ }
105
+ })();
106
+ return () => {
107
+ cancelled = true;
108
+ };
109
+ }, []);
110
+ const filtered = useMemo(() => {
111
+ const q = query.trim().toLowerCase();
112
+ if (!q)
113
+ return items;
114
+ return items.filter(item => item.lower.includes(q));
115
+ }, [items, query]);
116
+ if (loading) {
117
+ return (_jsxs(Box, { children: [_jsx(Spinner, {}), _jsx(Text, { children: " Loading timeline\u2026" })] }));
118
+ }
119
+ if (selectedItem) {
120
+ const options = [
121
+ {
122
+ label: 'Copy',
123
+ value: 'copy',
124
+ description: 'Copy message content to input (no auto-submit)',
125
+ },
126
+ {
127
+ label: 'Fork',
128
+ value: 'fork',
129
+ description: 'Prepare /branch flow (current CLI has no messageId fork)',
130
+ },
131
+ {
132
+ label: 'Revert',
133
+ value: 'revert',
134
+ description: 'Open existing /rewind flow',
135
+ },
136
+ {
137
+ label: 'Back',
138
+ value: 'back',
139
+ },
140
+ ];
141
+ const handleAction = async (action) => {
142
+ if (action === 'back') {
143
+ setSelectedItem(null);
144
+ return;
145
+ }
146
+ if (action === 'copy') {
147
+ const raw = await setClipboard(selectedItem.fullText);
148
+ if (raw)
149
+ process.stdout.write(raw);
150
+ onDone('Timeline message copied to input and clipboard.', {
151
+ display: 'system',
152
+ nextInput: selectedItem.fullText,
153
+ submitNextInput: false,
154
+ jumpToMessageId: selectedItem.messageId,
155
+ });
156
+ return;
157
+ }
158
+ if (action === 'fork') {
159
+ onDone(`Prepared /branch and kept focus on selected timeline message (${selectedItem.messageId}).`, {
160
+ display: 'system',
161
+ nextInput: '/branch',
162
+ submitNextInput: false,
163
+ jumpToMessageId: selectedItem.messageId,
164
+ });
165
+ return;
166
+ }
167
+ onJumpToMessage(selectedItem.messageId);
168
+ onOpenMessageSelectorAtMessage(selectedItem.messageId);
169
+ onDone('Opened rewind selector at selected timeline message.', {
170
+ display: 'skip',
171
+ });
172
+ };
173
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { bold: true, children: "Timeline actions" }), _jsx(Text, { dimColor: true, children: new Date(selectedItem.timestamp).toLocaleString() }), _jsx(Text, { children: selectedItem.preview }), _jsxs(Text, { dimColor: true, children: [figures.pointer, " messageId: ", selectedItem.messageId] }), _jsx(Select, { options: options, onChange: value => {
174
+ void handleAction(value);
175
+ }, onCancel: () => setSelectedItem(null) })] }));
176
+ }
177
+ return (_jsx(FuzzyPicker, { title: "Session timeline", placeholder: "Filter user messages\u2026", items: filtered, getKey: item => item.messageId, onQueryChange: setQuery, onSelect: item => {
178
+ onJumpToMessage(item.messageId);
179
+ setSelectedItem(item);
180
+ }, onCancel: () => onDone('Timeline cancelled'), emptyMessage: q => items.length === 0
181
+ ? 'No user messages found in current session'
182
+ : q
183
+ ? 'No matching messages'
184
+ : 'No user messages found', selectAction: "select message", renderItem: (item, isFocused) => (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: item.age }), _jsxs(Text, { color: isFocused ? 'suggestion' : undefined, children: [' ', truncateToWidth(item.preview, MAX_PREVIEW_WIDTH)] })] })), renderPreview: item => (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderDimColor: true, paddingX: 1, children: [_jsx(Text, { dimColor: true, children: new Date(item.timestamp).toLocaleString() }), _jsx(Text, { children: item.preview }), _jsxs(Text, { dimColor: true, children: [figures.pointer, " sessionId: ", item.sessionId] }), _jsxs(Text, { dimColor: true, children: [figures.pointer, " messageId: ", item.messageId] })] })) }));
185
+ }
186
+ export const call = async (onDone, _context, _args) => {
187
+ const onJumpToMessage = (messageId) => {
188
+ _context.jumpToMessage?.(messageId);
189
+ };
190
+ const onOpenMessageSelectorAtMessage = (messageId) => {
191
+ _context.openMessageSelectorAtMessage?.(messageId);
192
+ };
193
+ return (_jsx(TimelinePicker, { onDone: onDone, onJumpToMessage: onJumpToMessage, onOpenMessageSelectorAtMessage: onOpenMessageSelectorAtMessage }));
194
+ };
@@ -58,6 +58,7 @@ import securityReview from './commands/security-review.js';
58
58
  import bughunter from './commands/bughunter/index.js';
59
59
  import terminalSetup from './commands/terminalSetup/index.js';
60
60
  import theme from './commands/theme/index.js';
61
+ import timeline from './commands/timeline/index.js';
61
62
  import vim from './commands/vim/index.js';
62
63
  // Dead code elimination: conditional imports
63
64
  /* eslint-disable @typescript-eslint/no-require-imports */
@@ -256,6 +257,7 @@ const COMMANDS = memoize(() => [
256
257
  teamAuto,
257
258
  limites,
258
259
  theme,
260
+ timeline,
259
261
  feedback,
260
262
  review,
261
263
  ultrareview,
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import figures from 'figures';
4
+ import { Box, Text, wrapText } from '../ink.js';
5
+ import { useAppState } from '../state/AppState.js';
6
+ import { getVisibleAgentTasks } from './CoordinatorAgentStatus.js';
7
+ import { isTerminalStatus } from './tasks/taskStatusUtils.js';
8
+ import { formatDuration, formatNumber } from '../utils/format.js';
9
+ export function AgentActivitySidebar({ width = 34 }) {
10
+ const tasks = useAppState(s => s.tasks);
11
+ const agentNameRegistry = useAppState(s => s.agentNameRegistry);
12
+ const viewingAgentTaskId = useAppState(s => s.viewingAgentTaskId);
13
+ const visibleTasks = getVisibleAgentTasks(tasks);
14
+ const [, setTick] = React.useState(0);
15
+ React.useEffect(() => {
16
+ if (visibleTasks.length === 0)
17
+ return;
18
+ const timer = setInterval(() => setTick(n => n + 1), 1000);
19
+ return () => clearInterval(timer);
20
+ }, [visibleTasks.length]);
21
+ const nameByAgentId = React.useMemo(() => {
22
+ const inv = new Map();
23
+ for (const [name, id] of agentNameRegistry)
24
+ inv.set(id, name);
25
+ return inv;
26
+ }, [agentNameRegistry]);
27
+ // Keep startup layout clean; only show the sidebar when there is real activity.
28
+ if (visibleTasks.length === 0)
29
+ return null;
30
+ return (_jsxs(Box, { width: width, minWidth: width, maxWidth: width, marginLeft: 1, borderStyle: "round", borderColor: "border", flexDirection: "column", children: [_jsx(Box, { paddingX: 1, children: _jsx(Text, { bold: true, color: "accent", children: "Agentes" }) }), _jsx(Box, { paddingX: 1, children: _jsxs(Text, { dimColor: true, children: [visibleTasks.length, " activos"] }) }), _jsx(Box, { flexDirection: "column", paddingX: 1, marginTop: 1, children: visibleTasks.slice(-8).map(task => {
31
+ const isRunning = !isTerminalStatus(task.status);
32
+ const pausedMs = task.totalPausedMs ?? 0;
33
+ const elapsedMs = Math.max(0, isRunning
34
+ ? Date.now() - task.startTime - pausedMs
35
+ : (task.endTime ?? task.startTime) - task.startTime - pausedMs);
36
+ const elapsed = formatDuration(elapsedMs);
37
+ const name = nameByAgentId.get(task.id) ?? 'agente';
38
+ const desc = task.progress?.summary || task.description || 'Procesando';
39
+ const tokenCount = task.progress?.tokenCount;
40
+ const statusIcon = isRunning ? figures.play : figures.squareSmallFilled;
41
+ const activeMark = viewingAgentTaskId === task.id ? '*' : 'o';
42
+ const header = `${activeMark} ${statusIcon} ${name} - ${elapsed}`;
43
+ const headerText = wrapText(header, width - 4, 'truncate-end');
44
+ const descText = wrapText(desc, width - 4, 'truncate-end');
45
+ const tokenText = tokenCount !== undefined && tokenCount > 0
46
+ ? `tokens ${formatNumber(tokenCount)}`
47
+ : 'tokens -';
48
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: viewingAgentTaskId === task.id, children: headerText }), _jsx(Text, { dimColor: true, children: descText }), _jsx(Text, { dimColor: true, children: tokenText })] }, task.id));
49
+ }) })] }));
50
+ }
@@ -13,12 +13,12 @@ export function AgentProgressLine(t0) {
13
13
  if ($[0] !== isBackgrounded || $[1] !== isResolved || $[2] !== lastToolInfo || $[3] !== taskDescription) {
14
14
  t3 = () => {
15
15
  if (!isResolved) {
16
- return lastToolInfo || "Initializing\u2026";
16
+ return lastToolInfo || "Inicializando\u2026";
17
17
  }
18
18
  if (isBackgrounded) {
19
- return taskDescription ?? "Running in the background";
19
+ return taskDescription ?? "Ejecutándose en segundo plano";
20
20
  }
21
- return "Done";
21
+ return "Listo";
22
22
  };
23
23
  $[0] = isBackgrounded;
24
24
  $[1] = isResolved;
@@ -42,7 +42,7 @@ export function AgentProgressLine(t0) {
42
42
  const t5 = !isResolved;
43
43
  let t6;
44
44
  if ($[7] !== agentType || $[8] !== color || $[9] !== description || $[10] !== descriptionColor || $[11] !== hideType || $[12] !== name) {
45
- t6 = hideType ? _jsxs(_Fragment, { children: [_jsx(Text, { bold: true, children: name ?? description ?? agentType }), name && description && _jsxs(Text, { dimColor: true, children: [": ", description] })] }) : _jsxs(_Fragment, { children: [_jsx(Text, { bold: true, backgroundColor: color, color: color ? "inverseText" : undefined, children: agentType }), description && _jsxs(_Fragment, { children: [" (", _jsx(Text, { backgroundColor: descriptionColor, color: descriptionColor ? "inverseText" : undefined, children: description }), ")"] })] });
45
+ t6 = hideType ? _jsxs(_Fragment, { children: [_jsx(Text, { bold: true, color: color, children: name ?? description ?? agentType }), name && description && _jsxs(Text, { color: descriptionColor ?? color, dimColor: descriptionColor == null, children: [": ", description] })] }) : _jsxs(_Fragment, { children: [_jsx(Text, { bold: true, color: color, children: agentType }), description && _jsxs(_Fragment, { children: [" (", _jsx(Text, { color: descriptionColor ?? color, children: description }), ")"] })] });
46
46
  $[7] = agentType;
47
47
  $[8] = color;
48
48
  $[9] = description;
@@ -56,7 +56,7 @@ export function AgentProgressLine(t0) {
56
56
  }
57
57
  let t7;
58
58
  if ($[14] !== isBackgrounded || $[15] !== tokens || $[16] !== toolUseCount) {
59
- t7 = !isBackgrounded && _jsxs(_Fragment, { children: [" \xB7 ", toolUseCount, " tool ", toolUseCount === 1 ? "use" : "uses", tokens !== null && _jsxs(_Fragment, { children: [" \u00B7 ", formatNumber(tokens), " tokens"] })] });
59
+ t7 = !isBackgrounded && _jsxs(_Fragment, { children: [" \xB7 ", toolUseCount, " herramienta ", toolUseCount === 1 ? "usada" : "usadas", tokens !== null && _jsxs(_Fragment, { children: [" \u00B7 ", formatNumber(tokens), " tokens"] })] });
60
60
  $[14] = isBackgrounded;
61
61
  $[15] = tokens;
62
62
  $[16] = toolUseCount;