refactor(README): reorganize roadmap items for clarity and update language switcher flag icon

- Rearranged roadmap items in README.md for better organization, moving planning mode and visual workflow editor to the top.
- Updated the flag icon for English in LanguageSwitcher.vue from the US to the GB flag.
- Enhanced user environment setup in CliInstallerService.ts by adding user information retrieval.
- Improved timestamp handling in MemberLogsTab.tsx to better reflect recent activity.
- Adjusted button class names in ProvisioningProgressBlock.tsx for consistency.
This commit is contained in:
iliya 2026-03-24 16:52:12 +02:00
parent e0d4782c80
commit 1718f9cf7c
6 changed files with 42 additions and 14 deletions

View file

@ -295,14 +295,14 @@ pnpm dist # macOS + Windows + Linux
## Roadmap
- [ ] CLI runtime: Run not only on a local PC but in any headless/console environment (web UI), e.g. VPS, remote server, etc.
- [ ] Remote agent execution via SSH: launch and manage agent teams on remote machines over SSH (stream-json protocol over SSH channel, SFTP-based file monitoring for tasks/inboxes/config)
- [ ] 2 modes: current (agent teams), and a new mode: regular subagents (no communication between them)
- [ ] Visual workflow editor ([@xyflow/react](https://github.com/xyflow/xyflow)) for building and orchestrating agent pipelines with drag & drop
- [ ] Planning mode to organize agent plans before execution
- [ ] Curate what context each agent sees (files, docs, MCP servers, skills)
- [ ] Visual workflow editor ([@xyflow/react](https://github.com/xyflow/xyflow)) for building and
- [ ] Multi-model support: proxy layer to use other popular LLMs (GPT, Gemini, DeepSeek, Llama, etc.), including offline/local models
- [ ] Attach any files to messages/comments/tasks
- [ ] Remote agent execution via SSH: launch and manage agent teams on remote machines over SSH (stream-json protocol over SSH channel, SFTP-based file monitoring for tasks/inboxes/config)
- [ ] CLI runtime: Run not only on a local PC but in any headless/console environment (web UI), e.g. VPS, remote server, etc.
- [ ] 2 modes: current (agent teams), and a new mode: regular subagents (no communication between them)
orchestrating agent pipelines with drag & drop
- [ ] Curate what context each agent sees (files, docs, MCP servers, skills)
- [ ] Slash commands
---

View file

@ -17,7 +17,7 @@ onMounted(() => {
});
const flagIconMap: Record<string, string> = {
en: "circle-flags:us",
en: "circle-flags:gb",
zh: "circle-flags:cn",
es: "circle-flags:es",
hi: "circle-flags:in",

View file

@ -108,6 +108,13 @@ import type { TeamChangeEvent } from '@shared/types';
const logger = createLogger('App');
startEventLoopLagMonitor();
// Windows: set AppUserModelId early so native notifications show the correct
// application title instead of the default "electron.app.{name}" identifier.
// Must match the appId in electron-builder config (package.json → build.appId).
if (process.platform === 'win32') {
app.setAppUserModelId('com.agent-teams.app');
}
// --- Team message notification tracking ---
const teamInboxReader = new TeamInboxReader();
const sentMessagesStore = new TeamSentMessagesStore();

View file

@ -32,7 +32,7 @@ import { createHash } from 'crypto';
import { createWriteStream, existsSync, promises as fsp } from 'fs';
import http from 'http';
import https from 'https';
import { tmpdir } from 'os';
import { tmpdir, userInfo } from 'os';
import { join, posix as pathPosix, win32 as pathWin32 } from 'path';
import { ClaudeBinaryResolver } from '../team/ClaudeBinaryResolver';
@ -88,11 +88,20 @@ const AUTH_STATUS_RETRY_DELAY_MS = 1500;
*/
function buildChildEnv(binaryPath?: string | null): NodeJS.ProcessEnv {
const home = getShellPreferredHome();
const shellEnv = getCachedShellEnv();
let osUsername = '';
try {
osUsername = userInfo().username;
} catch {
// userInfo() can throw in restricted environments (Docker, no passwd entry)
}
const user = shellEnv?.USER?.trim() || process.env.USER?.trim() || osUsername || '';
return {
...process.env,
HOME: home,
USERPROFILE: home,
PATH: buildMergedCliPath(binaryPath),
...(user ? { USER: user, LOGNAME: user } : {}),
};
}

View file

@ -205,7 +205,7 @@ export const ProvisioningProgressBlock = ({
<Button
variant="ghost"
size="sm"
className="h-6 w-6 shrink-0 p-0 text-[var(--color-text-muted)] hover:text-[var(--color-text)]"
className="size-6 shrink-0 p-0 text-[var(--color-text-muted)] hover:text-[var(--color-text)]"
onClick={onDismiss}
>
<X size={12} />
@ -217,7 +217,7 @@ export const ProvisioningProgressBlock = ({
<Button
variant="ghost"
size="sm"
className="h-6 w-6 shrink-0 p-0 text-[var(--color-text-muted)] hover:text-[var(--color-text)]"
className="size-6 shrink-0 p-0 text-[var(--color-text-muted)] hover:text-[var(--color-text)]"
onClick={onDismiss}
>
<X size={12} />

View file

@ -363,12 +363,24 @@ export const MemberLogsTab = ({
const previewOnline = useMemo((): boolean => {
if (!previewLog) return false;
// Primary signal: the session file is still being written to
if (previewLog.isOngoing) return true;
// Secondary: check message freshness with generous windows
// Determine the most recent activity timestamp from preview messages
const newest = previewMessages[0];
const newestMs = newest ? newest.timestamp.getTime() : 0;
// Fallback: use session start time when no preview messages exist
const lastActivityMs = newestMs || new Date(previewLog.startTime).getTime() || 0;
if (!lastActivityMs) return false;
const ageMs = Date.now() - lastActivityMs;
// isOngoing (file still being written) grants a longer freshness window,
// but does NOT bypass age checks — the file may be updated by system messages
// even while the agent is idle
if (previewLog.isOngoing) {
// Ongoing + in_progress: generous 3-minute window
if (taskStatus === 'in_progress') return ageMs <= 180_000;
// Ongoing + other status: moderate window
return ageMs <= 60_000;
}
// Not ongoing: check message freshness with tighter windows
if (!newest) return false;
const ageMs = Date.now() - newest.timestamp.getTime();
// Task actively in progress — agent may pause between visible outputs
if (taskStatus === 'in_progress') return ageMs <= 60_000;
// Completed/other tasks — shorter window