tycono 0.3.14-beta.21 → 0.3.14-beta.22

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tycono",
3
- "version": "0.3.14-beta.21",
3
+ "version": "0.3.14-beta.22",
4
4
  "description": "Build an AI company. Watch them work.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -83,16 +83,8 @@ export function summarizeEvent(event: SSEEvent, allRoleIds: string[]): StreamLin
83
83
  }
84
84
 
85
85
  case 'thinking': {
86
- const text = ((event.data.text as string) ?? '').slice(0, 120);
87
- if (!text.trim()) return null;
88
- return {
89
- id: ++lineCounter,
90
- prefix: isSupervisor ? undefined : event.roleId,
91
- prefixColor: roleColor,
92
- text: `\uD83D\uDCAD ${text}`,
93
- color: 'gray',
94
- indent: !isSupervisor,
95
- };
86
+ // Hide thinking by default internal noise for user
87
+ return null;
96
88
  }
97
89
 
98
90
  case 'dispatch:start': {
@@ -130,17 +122,19 @@ export function summarizeEvent(event: SSEEvent, allRoleIds: string[]): StreamLin
130
122
 
131
123
  case 'tool:start': {
132
124
  const toolName = (event.data.name as string) ?? 'tool';
125
+ // Only show Write/Edit (file changes) + Bash (commands). Hide Read/Grep/Glob (noise).
126
+ const isWrite = ['Write', 'Edit', 'NotebookEdit'].includes(toolName);
127
+ const isBash = toolName === 'Bash';
128
+ if (!isWrite && !isBash) return null; // Hide read-only tools
129
+
133
130
  const input = event.data.input;
134
131
  let detail = '';
135
132
  if (input && typeof input === 'object') {
136
133
  const inp = input as Record<string, unknown>;
137
- if (inp.file_path) detail = ` ${String(inp.file_path)}`;
138
- else if (inp.command) detail = ` ${String(inp.command).slice(0, 80)}`;
139
- else if (inp.pattern) detail = ` ${String(inp.pattern)}`;
140
- else if (inp.description) detail = ` ${String(inp.description).slice(0, 60)}`;
134
+ if (inp.file_path) detail = ` ${String(inp.file_path).split('/').slice(-2).join('/')}`;
135
+ else if (inp.command) detail = ` ${String(inp.command).slice(0, 60)}`;
136
+ else if (inp.description) detail = ` ${String(inp.description).slice(0, 40)}`;
141
137
  }
142
- // Highlight file writes
143
- const isWrite = ['Write', 'Edit'].includes(toolName);
144
138
  return {
145
139
  id: ++lineCounter,
146
140
  prefix: isSupervisor ? undefined : event.roleId,
@@ -152,15 +146,8 @@ export function summarizeEvent(event: SSEEvent, allRoleIds: string[]): StreamLin
152
146
  }
153
147
 
154
148
  case 'tool:result': {
155
- const toolName = (event.data.name as string) ?? 'tool';
156
- return {
157
- id: ++lineCounter,
158
- prefix: isSupervisor ? undefined : event.roleId,
159
- prefixColor: roleColor,
160
- text: ` \u2190 ${toolName} done`,
161
- color: 'gray',
162
- indent: !isSupervisor,
163
- };
149
+ // Hide tool results tool:start is sufficient
150
+ return null;
164
151
  }
165
152
 
166
153
  case 'msg:start': {
@@ -421,10 +408,10 @@ export const CommandMode: React.FC<CommandModeProps> = ({
421
408
  const handleSubmit = useCallback((value: string) => {
422
409
  const trimmed = value.trim();
423
410
  if (trimmed) {
424
- // Show user input immediately in scrollback (before AI responds)
411
+ // Show user input with visual separator for emphasis
425
412
  setUserInputs(prev => [...prev.slice(-10), {
426
413
  id: ++lineCounter,
427
- text: `> ${trimmed}`,
414
+ text: `\u2501\u2501 > ${trimmed}`,
428
415
  color: 'green',
429
416
  }]);
430
417
  onSubmit(trimmed);
@@ -179,7 +179,8 @@ const PanelModeInner: React.FC<PanelModeProps> = ({
179
179
  const rightContentLines: string[] = [];
180
180
  let selectedDocPath: string | null = null;
181
181
  if (rightTab === 'stream') {
182
- const maxEv = Math.max(5, contentHeight - 2);
182
+ if (selectedRoleId) rightContentLines.push(`\u25B8 ${selectedRoleId}`);
183
+ const maxEv = Math.max(5, contentHeight - 3);
183
184
  const filtered = selectedRoleId ? events.filter(e => e.roleId === selectedRoleId) : events;
184
185
  const visible = filtered.slice(-maxEv);
185
186
  for (const ev of visible) {