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:
parent
e0d4782c80
commit
1718f9cf7c
6 changed files with 42 additions and 14 deletions
12
README.md
12
README.md
|
|
@ -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
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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} />
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue