@townco/ui 0.1.123 → 0.1.125

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.
@@ -330,7 +330,7 @@ export function ChatView({ client, initialSessionId, error: initError, debuggerU
330
330
  logger.info("Prompt clicked", { prompt });
331
331
  }, onPromptHover: handlePromptHover, onPromptLeave: handlePromptLeave, onOpenFiles: openFiles, onOpenSettings: openSettings, toolsAndMcpsCount: agentTools.length +
332
332
  agentMcps.length +
333
- agentSubagents.length }) })) })) : null) : (_jsx("div", { className: "flex flex-col px-4 py-4", children: messages.map((message, index) => {
333
+ agentSubagents.length }) })) })) : null) : (_jsx("div", { className: "flex flex-col px-4 py-4 gap-4", children: messages.map((message, index) => {
334
334
  // Check if any message is streaming
335
335
  const anyMessageStreaming = messages.some((m) => m.isStreaming);
336
336
  // Calculate which user message number this is (1-indexed for display, 0-indexed for API)
@@ -343,41 +343,47 @@ export function ChatView({ client, initialSessionId, error: initError, debuggerU
343
343
  // Check if this message should be dimmed (comes after editing message)
344
344
  const shouldDim = editingMessageIndex !== null &&
345
345
  index > editingMessageIndex;
346
- return (_jsx(Message, { message: message, className: cn("group", shouldDim && "opacity-50", message.role === "user" && "mb-4"), isLastMessage: index === messages.length - 1, children: _jsx("div", { className: cn("flex flex-col w-full min-w-0"), children: message.role === "user" ? (_jsx(EditableUserMessage, { message: message, messageIndex: userMessageIndex, isStreaming: anyMessageStreaming, onEditAndResend: editAndResend, onEditingChange: (isEditing) => {
346
+ return (_jsx(Message, { message: message, className: cn("group", shouldDim && "opacity-50"), isLastMessage: index === messages.length - 1, children: _jsx("div", { className: cn("flex flex-col w-full min-w-0"), children: message.role === "user" ? (_jsx(EditableUserMessage, { message: message, messageIndex: userMessageIndex, isStreaming: anyMessageStreaming, onEditAndResend: editAndResend, onEditingChange: (isEditing) => {
347
347
  setEditingMessageIndex(isEditing ? index : null);
348
348
  } })) : (_jsxs(_Fragment, { children: [
349
- _jsx(MessageContent, { message: message, thinkingDisplayStyle: "collapsible" }), _jsx(MessageActions, { message: message, isStreaming: message.isStreaming, onSendMessage: sendMessage, isLastAssistantMessage: index ===
350
- messages.findLastIndex((m) => m.role === "assistant"), onRedo: () => {
351
- // Find the user message that preceded this assistant message
352
- let precedingUserMessage = null;
353
- let precedingUserMessageIndex = -1;
354
- const _userCount = 0;
355
- for (let i = index - 1; i >= 0; i--) {
356
- if (messages[i]?.role === "user") {
357
- precedingUserMessage = messages[i];
358
- // Count how many user messages came before this one
359
- precedingUserMessageIndex =
360
- messages
361
- .slice(0, i + 1)
362
- .filter((m) => m.role === "user")
363
- .length - 1;
364
- break;
349
+ _jsx(MessageContent, { message: message, thinkingDisplayStyle: "collapsible" }), (() => {
350
+ const isLastAssistantMessage = index ===
351
+ messages.findLastIndex((m) => m.role === "assistant");
352
+ // Hide actions for the last assistant message while streaming.
353
+ if (isLastAssistantMessage &&
354
+ message.isStreaming) {
355
+ return null;
356
+ }
357
+ return (_jsx(MessageActions, { message: message, isStreaming: message.isStreaming, onSendMessage: sendMessage, isLastAssistantMessage: isLastAssistantMessage, onRedo: () => {
358
+ // Find the user message that preceded this assistant message
359
+ let precedingUserMessage = null;
360
+ let precedingUserMessageIndex = -1;
361
+ const _userCount = 0;
362
+ for (let i = index - 1; i >= 0; i--) {
363
+ if (messages[i]?.role === "user") {
364
+ precedingUserMessage = messages[i];
365
+ // Count how many user messages came before this one
366
+ precedingUserMessageIndex =
367
+ messages
368
+ .slice(0, i + 1)
369
+ .filter((m) => m.role === "user").length - 1;
370
+ break;
371
+ }
365
372
  }
366
- }
367
- if (precedingUserMessage?.content &&
368
- precedingUserMessageIndex >= 0) {
369
- // Convert images back to attachments format
370
- const attachments = precedingUserMessage.images?.map((img, idx) => ({
371
- name: `image-${idx}`,
372
- path: "",
373
- size: 0,
374
- mimeType: img.mimeType,
375
- data: img.data,
376
- }));
377
- editAndResend(precedingUserMessageIndex, precedingUserMessage.content, attachments);
378
- }
379
- } })
380
- ] })) }) }, message.id));
373
+ if (precedingUserMessage?.content &&
374
+ precedingUserMessageIndex >= 0) {
375
+ // Convert images back to attachments format
376
+ const attachments = precedingUserMessage.images?.map((img, idx) => ({
377
+ name: `image-${idx}`,
378
+ path: "",
379
+ size: 0,
380
+ mimeType: img.mimeType,
381
+ data: img.data,
382
+ }));
383
+ editAndResend(precedingUserMessageIndex, precedingUserMessage.content, attachments);
384
+ }
385
+ } }));
386
+ })()] })) }) }, message.id));
381
387
  }) })) }), _jsx(ChatLayout.Footer, { children: _jsx(ChatInputWithAttachments, { client: client, startSession: startSession, placeholder: placeholder, commandMenuItems: commandMenuItems, onCancel: cancel, promptParameters: agentPromptParameters }) })
382
388
  ] })
383
389
  ] }), _jsx(ChatLayout.Aside, { breakpoint: "md", children: _jsx(AsideTabs, { todos: todos, sources: allSources, tools: agentTools, mcps: agentMcps, subagents: agentSubagents, sessionId: sessionId, agentApiUrl: client?.getBaseUrl(), client: client }) })
@@ -65,7 +65,7 @@ function PureMessageActions({ message, isStreaming, onRedo, onSendMessage, isLas
65
65
  toast.info("Export not available");
66
66
  }
67
67
  };
68
- return (_jsx("div", { className: "mt-1", children: _jsxs(Actions, { className: cn(visibilityClass, isLastAssistantMessage
68
+ return (_jsx("div", { className: "mt-2", children: _jsxs(Actions, { className: cn(visibilityClass, isLastAssistantMessage
69
69
  ? "pointer-events-auto"
70
70
  : "pointer-events-none group-hover:pointer-events-auto"), children: [
71
71
  _jsx(Action, { disabled: !canCopy, onClick: handleCopy, tooltip: isCopied ? "Copied!" : "Copy", children: isCopied ? (_jsx(Check, { className: "size-4" })) : (_jsx(Copy, { className: "size-4" })) }), _jsx(Action, { disabled: disableWhileStreaming, onClick: handleRedo, tooltip: "Redo", children: _jsx(RotateCcw, { className: "size-4" }) }), _jsxs(DropdownMenu, { children: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@townco/ui",
3
- "version": "0.1.123",
3
+ "version": "0.1.125",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -49,7 +49,7 @@
49
49
  "@radix-ui/react-slot": "^1.2.4",
50
50
  "@radix-ui/react-tabs": "^1.1.13",
51
51
  "@radix-ui/react-tooltip": "^1.2.8",
52
- "@townco/core": "0.0.101",
52
+ "@townco/core": "0.0.103",
53
53
  "@types/mdast": "^4.0.4",
54
54
  "@uiw/react-json-view": "^2.0.0-alpha.39",
55
55
  "class-variance-authority": "^0.7.1",
@@ -67,7 +67,7 @@
67
67
  "zustand": "^5.0.8"
68
68
  },
69
69
  "devDependencies": {
70
- "@townco/tsconfig": "0.1.120",
70
+ "@townco/tsconfig": "0.1.122",
71
71
  "@types/node": "^24.10.0",
72
72
  "@types/react": "^19.2.2",
73
73
  "@types/unist": "^3.0.3",