mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 01:21:20 -04:00
always show tools on spectator. rename neato locate to sound
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -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 || '');
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user