From 1f1a1fcbd00882bc259072f9bc7365cfdef897a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:54:57 +0000 Subject: [PATCH 1/3] fix: remove postinstall electron-rebuild; fix rebuild status messages in start scripts Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/ee368e01-7a56-4aa1-a339-370c3ce9e126 Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com> --- package.json | 1 - start.bat | 9 ++++++--- start.sh | 10 +++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 1adb14f..15dfaa6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "description": "OpenClaw Harbour - Desktop companion for OpenClaw", "main": "./out/main/index.js", "scripts": { - "postinstall": "electron-rebuild || echo 'WARN: electron-rebuild failed — native modules like node-pty may not work. Run npm run rebuild manually.'", "dev": "electron-vite dev", "build": "electron-vite build", "preview": "electron-vite preview", diff --git a/start.bat b/start.bat index aeaa43e..4673241 100644 --- a/start.bat +++ b/start.bat @@ -77,11 +77,14 @@ if "!NEED_INSTALL!"=="1" ( echo. call npm run rebuild 2>nul if %ERRORLEVEL% neq 0 ( - echo ⚠️ Native rebuild had warnings ^(non-fatal — the app will still work^). + echo ⚠️ Native module build skipped — Visual Studio not found. + echo The terminal will use a basic shell instead. + echo Install Visual Studio Build Tools to enable full PTY support. + echo See: https://aka.ms/vs/buildtools + ) else ( + echo ✅ Native modules built successfully! ) echo. - echo ✅ Rebuild complete! - echo. ) echo 🌊 Launching OpenClaw Harbor... diff --git a/start.sh b/start.sh index b2d9143..c8abd9a 100755 --- a/start.sh +++ b/start.sh @@ -62,9 +62,13 @@ if [ "$NEED_INSTALL" -eq 1 ]; then echo " 🔧 Rebuilding native modules for Electron..." echo " (This makes sure node-pty works correctly.)" echo "" - npm run rebuild 2>/dev/null || echo " ⚠️ Native rebuild had warnings (non-fatal — the app will still work)." - echo "" - echo " ✅ Rebuild complete!" + if npm run rebuild 2>/dev/null; then + echo " ✅ Native modules built successfully!" + else + echo " ⚠️ Native module build skipped — compiler toolchain not found." + echo " The terminal will use a basic shell instead." + echo " Install build-essential (Linux) or Xcode CLT (macOS) for full PTY support." + fi echo "" fi From 4ffdeed49b54109c1b32158975d74138b68f0fc0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Apr 2026 19:00:56 +0000 Subject: [PATCH 2/3] fix: Data-like emissary voice in habit suggestions, per-session seabed seed, fish icon in bat title Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/99ab56f2-f3c3-48bb-b7e3-94ec9529b68b Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com> --- src/main/services/habitService.ts | 4 ++-- src/renderer/src/screens/Fishtank.tsx | 6 ++++-- start.bat | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/services/habitService.ts b/src/main/services/habitService.ts index 128aa74..a86c348 100644 --- a/src/main/services/habitService.ts +++ b/src/main/services/habitService.ts @@ -127,9 +127,9 @@ export function getSuggestion(): HabitSuggestion | null { let text: string if (latestExample && latestExample.promptSummary.length > 10) { - text = `Commander, you usually run ${modeLabel} tasks around this hour ${timeDescription}. Something like "${latestExample.promptSummary}"... Shall I?` + text = `I have observed that you tend toward ${modeLabel} tasks at this hour ${timeDescription}. Your last: "${latestExample.promptSummary}". I find I am... already anticipating it. Shall I prepare?` } else { - text = `Commander, you often dispatch ${modeLabel} tasks around this time ${timeDescription}. Shall I prepare one?` + text = `I have noted a pattern — ${modeLabel} work, around this time ${timeDescription}. I am... ready, if you are. Shall I?` } return { text, mode: topMode, confidence } diff --git a/src/renderer/src/screens/Fishtank.tsx b/src/renderer/src/screens/Fishtank.tsx index 2319078..2385c61 100644 --- a/src/renderer/src/screens/Fishtank.tsx +++ b/src/renderer/src/screens/Fishtank.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback, useRef } from 'react' +import React, { useState, useEffect, useCallback, useRef, useMemo } from 'react' import type { ServiceStatus, TaskResult } from '../../../shared/types' import { useIpc } from '../hooks/useIpc' import { useConfig } from '../hooks/useConfig' @@ -42,6 +42,8 @@ export const Fishtank: React.FC = ({ status, recentTasks = [], on const { invoke } = useIpc() const { config } = useConfig() const name = config.emissaryName || 'Azurel' + // Generate a unique seed once per session so the seabed layout differs every time the app is opened + const seabedSeed = useMemo(() => Math.floor(Math.random() * 1_000_000), []) const [animation, setAnimation] = useState('floating') const [saying, setSaying] = useState('') const [sayingKey, setSayingKey] = useState(0) @@ -370,7 +372,7 @@ export const Fishtank: React.FC = ({ status, recentTasks = [], on })} {/* Procedural seabed */} - + {/* The Emissary — clickable for interaction */}
Date: Mon, 20 Apr 2026 19:05:49 +0000 Subject: [PATCH 3/3] fix: weather tooltip, drop non-file feedback, retry uses original prompt Agent-Logs-Url: https://github.com/potemkin666/merman/sessions/406d3a74-e7fa-4a58-be3c-8ac9dc4229a1 Co-authored-by: potemkin666 <183807833+potemkin666@users.noreply.github.com> --- src/renderer/src/screens/Dispatch.tsx | 19 +++++++++----- src/renderer/src/screens/Fishtank.tsx | 38 ++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/renderer/src/screens/Dispatch.tsx b/src/renderer/src/screens/Dispatch.tsx index b91677b..2f1e310 100644 --- a/src/renderer/src/screens/Dispatch.tsx +++ b/src/renderer/src/screens/Dispatch.tsx @@ -26,6 +26,7 @@ export const Dispatch: React.FC = ({ config, onTaskAdded }) => { const [dispatching, setDispatching] = useState(false) const [result, setResult] = useState(null) const [elapsed, setElapsed] = useState(0) + const [lastDispatchedPrompt, setLastDispatchedPrompt] = useState('') const [cancelling, setCancelling] = useState(false) const [showAdvancedConfirm, setShowAdvancedConfirm] = useState(false) const [cooldown, setCooldown] = useState(0) @@ -83,8 +84,9 @@ export const Dispatch: React.FC = ({ config, onTaskAdded }) => { setCancelling(false) } - const handleDispatch = async () => { - if (!prompt.trim()) return + const handleDispatch = async (overridePrompt?: string) => { + const promptToUse = overridePrompt !== undefined ? overridePrompt : prompt.trim() + if (!promptToUse) return if (cooldown > 0) return // If the selected mode is "advanced" (Advanced Custom preset), require confirmation first @@ -97,10 +99,11 @@ export const Dispatch: React.FC = ({ config, onTaskAdded }) => { setShowAdvancedConfirm(false) setDispatching(true) setResult(null) + setLastDispatchedPrompt(promptToUse) const task: TaskResult = { id: Date.now().toString(), - prompt: prompt.trim(), + prompt: promptToUse, mode, status: 'running', startedAt: new Date().toISOString(), @@ -108,7 +111,7 @@ export const Dispatch: React.FC = ({ config, onTaskAdded }) => { const res = await invoke( IPC_CHANNELS.DISPATCH_TASK, - { prompt: prompt.trim(), mode, openClawPath: config.openClawPath } + { prompt: promptToUse, mode, openClawPath: config.openClawPath } ) const finalTask: TaskResult = { @@ -124,6 +127,10 @@ export const Dispatch: React.FC = ({ config, onTaskAdded }) => { setCooldown(DISPATCH_COOLDOWN_S) } + const handleRetry = () => { + if (lastDispatchedPrompt) handleDispatch(lastDispatchedPrompt) + } + return (
{/* Advanced Custom confirmation dialog */} @@ -258,9 +265,9 @@ export const Dispatch: React.FC = ({ config, onTaskAdded }) => { )} {result.explanation?.retryable !== false && ( - 0 ? `Cooling down — ready in ${cooldown}s.` : "Try the same task again. Sometimes things work on the second try if it was a temporary issue."}> + 0 ? `Cooling down — ready in ${cooldown}s.` : "Re-send the original task exactly as it was dispatched — even if you have edited the text above."}>