always show tools on spectator. rename neato locate to sound

This commit is contained in:
legop3
2026-05-19 20:51:10 -04:00
parent 3ce2bdc541
commit ab32b0416c
4 changed files with 17 additions and 10 deletions
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -11,7 +11,7 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Roomba Rover" /> <meta name="apple-mobile-web-app-title" content="Roomba Rover" />
<title>Roomba Rover</title> <title>Roomba Rover</title>
<script type="module" crossorigin src="/assets/index-BEDvTEJ5.js"></script> <script type="module" crossorigin src="/assets/index-DUTZ-8ek.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-91zM9j6A.css"> <link rel="stylesheet" crossorigin href="/assets/index-91zM9j6A.css">
</head> </head>
<body> <body>
@@ -1,7 +1,7 @@
module.exports = { module.exports = {
id: 'neato_locate', id: 'neato_play_sound',
signature: 'neato_locate()', signature: 'neato_play_sound()',
description: 'Play Neato locate/chime action.', description: 'Play a sound/chime on the Neato robot.',
parameters: { type: 'object', properties: {}, additionalProperties: false }, parameters: { type: 'object', properties: {}, additionalProperties: false },
availability(ctx = {}) { availability(ctx = {}) {
const mode = String(ctx.mode || ''); const mode = String(ctx.mode || '');
+12 -5
View File
@@ -4,6 +4,7 @@
import { useState } from 'react'; import { useState } from 'react';
import { FaDiscord } from 'react-icons/fa'; import { FaDiscord } from 'react-icons/fa';
import { roverBadgeStyle } from '../../lib/roverColor.js'; import { roverBadgeStyle } from '../../lib/roverColor.js';
import { useSessionSelector } from '../../context/SessionContext.jsx';
function roleColors(role) { function roleColors(role) {
switch (role) { switch (role) {
@@ -135,7 +136,10 @@ function chatRowClass(message) {
export default function ChatMessageRow({ message }) { export default function ChatMessageRow({ message }) {
const isBot = isBotMessage(message); const isBot = isBotMessage(message);
const role = useSessionSelector((state) => state.session?.role || null);
const isSpectator = role === 'spectator';
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const isOpen = isSpectator || open;
const toolCalls = Array.isArray(message?.toolCalls) ? message.toolCalls : []; const toolCalls = Array.isArray(message?.toolCalls) ? message.toolCalls : [];
const hasText = Boolean(String(message?.text || '').trim()); const hasText = Boolean(String(message?.text || '').trim());
const toolsToggle = const toolsToggle =
@@ -143,9 +147,12 @@ export default function ChatMessageRow({ message }) {
<button <button
type="button" type="button"
className="shrink-0 rounded border border-slate-600/70 bg-slate-800/60 px-1 py-[1px] text-[0.65rem] text-slate-200 hover:bg-slate-700/70" className="shrink-0 rounded border border-slate-600/70 bg-slate-800/60 px-1 py-[1px] text-[0.65rem] text-slate-200 hover:bg-slate-700/70"
onClick={() => setOpen((v) => !v)} onClick={() => {
if (isSpectator) return;
setOpen((v) => !v);
}}
> >
{open ? '▼' : '▶'} Tools ({toolCalls.length}) {isOpen ? '▼' : '▶'} Tools ({toolCalls.length})
</button> </button>
) : null; ) : null;
return ( return (
@@ -155,13 +162,13 @@ export default function ChatMessageRow({ message }) {
className={`min-w-0 flex-1 break-words leading-tight whitespace-pre-wrap ${isBot ? 'text-emerald-100' : 'text-slate-100'}`} className={`min-w-0 flex-1 break-words leading-tight whitespace-pre-wrap ${isBot ? 'text-emerald-100' : 'text-slate-100'}`}
> >
<ChatIdentity message={message} toolsToggle={toolsToggle} /> <ChatIdentity message={message} toolsToggle={toolsToggle} />
{!open && hasText ? ` ${message.text}` : ''} {!isOpen && hasText ? ` ${message.text}` : ''}
</span> </span>
<span className="shrink-0 text-[0.65rem] text-slate-400/60"> <span className="shrink-0 text-[0.65rem] text-slate-400/60">
{formatTime(message.ts)} {formatTime(message.ts)}
</span> </span>
</div> </div>
{open && toolCalls.length > 0 ? ( {isOpen && toolCalls.length > 0 ? (
<div className="w-full rounded border border-slate-700/70 bg-slate-900/70 p-0.5 text-[0.68rem] text-slate-200"> <div className="w-full rounded border border-slate-700/70 bg-slate-900/70 p-0.5 text-[0.68rem] text-slate-200">
{toolCalls.map((entry, idx) => { {toolCalls.map((entry, idx) => {
const status = String(entry?.status || 'unknown'); const status = String(entry?.status || 'unknown');
@@ -176,7 +183,7 @@ export default function ChatMessageRow({ message }) {
})} })}
</div> </div>
) : null} ) : null}
{open && hasText ? ( {isOpen && hasText ? (
<div className={`w-full break-words leading-tight whitespace-pre-wrap ${isBot ? 'text-emerald-100' : 'text-slate-100'}`}> <div className={`w-full break-words leading-tight whitespace-pre-wrap ${isBot ? 'text-emerald-100' : 'text-slate-100'}`}>
{message.text} {message.text}
</div> </div>