Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
7c96096
feat(tauri): add macOS DMG configuration and background image
Loosand Aug 19, 2026
20811b8
Merge branch 'Stack-Cairn:main' into main
Loosand Aug 20, 2026
162bbee
feat(macos): Enhance DMG build process with new settings and verifica…
Loosand Aug 20, 2026
0ffabf3
Merge branch 'Stack-Cairn:main' into main
Loosand Aug 21, 2026
cb40e24
Merge branch 'main' of https://github.com/Loosand/LiveAgent
Loosand Aug 25, 2026
f1620e0
Merge branch 'main' of https://github.com/Loosand/LiveAgent
Loosand Aug 26, 2026
4b073a5
Merge branch 'main' of https://github.com/Loosand/LiveAgent
Loosand Aug 26, 2026
f491915
Merge branch 'main' of https://github.com/Loosand/LiveAgent
Loosand Sep 2, 2026
5c1b0e7
Merge branch 'Stack-Cairn:main' into main
Loosand Sep 7, 2026
529ae77
Merge branch 'Stack-Cairn:main' into main
Loosand Sep 10, 2026
5e30a86
update
Loosand Sep 10, 2026
842cca8
update
Loosand Sep 10, 2026
6da694c
update
Loosand Sep 10, 2026
9a7e480
refactor(ui): migrate application styles to Tailwind
Loosand Sep 10, 2026
a717be1
fix(ci): restore isolated TypeScript builds
Loosand Sep 10, 2026
bdbac4e
fix(ci): support shared TypeScript configs in isolated builds
Loosand Sep 10, 2026
c71dbff
refactor(ui): remove distracting decorative animations
Loosand Sep 10, 2026
fdf2556
refactor(ui): standardize collapses on Motion
Loosand Sep 10, 2026
4537248
refactor(ui): remove ornamental panel animations
Loosand Sep 10, 2026
c95d763
refactor(ui): standardize transient motion
Loosand Sep 10, 2026
bd18047
refactor(ui): simplify remaining CSS animations
Loosand Sep 10, 2026
4253cae
refactor(ui): group long Tailwind class lists
Loosand Sep 10, 2026
96e0c72
refactor(webui): isolate remote tree theme variables
Loosand Sep 10, 2026
37c8a1c
refactor(ui): relocate static component variables
Loosand Sep 10, 2026
70ae15e
update settings components
Loosand Sep 11, 2026
e3f0b8b
update font size
Loosand Sep 11, 2026
81eb534
update size
Loosand Sep 11, 2026
db010dc
fixed animation
Loosand Sep 11, 2026
0875e57
update color
Loosand Sep 11, 2026
753ca9a
update setting components
Loosand Sep 11, 2026
a2b5f4a
update
Loosand Sep 11, 2026
e4e7f66
update copy
Loosand Sep 11, 2026
e31e143
update setting tips
Loosand Sep 11, 2026
3e76c02
update
Loosand Sep 11, 2026
6db4e75
update
Loosand Sep 11, 2026
a4ad80a
update
Loosand Sep 11, 2026
9da86d7
update dropdown menu
Loosand Sep 11, 2026
147ad85
Merge branch 'Stack-Cairn:main' into main
Loosand Sep 12, 2026
fabe077
merge(main): 同步主分支并解决 UI 重构冲突
Loosand Sep 12, 2026
f94985d
refactor(ui): consolidate imperative DOM infrastructure
Loosand Sep 12, 2026
992db34
refactor(ui): replace custom motion and clipboard paths
Loosand Sep 12, 2026
1322682
update
Loosand Sep 12, 2026
573b484
refactor(ui): unify settings and resource management interfaces
Loosand Sep 12, 2026
7db38da
update
Loosand Sep 14, 2026
4c456e7
fix: 1. 修复历史记录连续加载
Loosand Sep 14, 2026
8f95157
refactor(ui): unify controls and refine chat navigation
Loosand Sep 14, 2026
85b4678
update sidebar
Loosand Sep 15, 2026
ece59dd
compatible(ui): Windows compatibility fixes
Loosand Sep 15, 2026
1962d2a
update(ui): update search chat command ui
Loosand Sep 16, 2026
232597e
refactor(ui): improve ChatHeader and ChatHistorySidebar layout and st…
chenyme Sep 16, 2026
04d16b6
refactor(ui): replace Mermaid fullscreen component with MarkdownMerma…
chenyme Sep 16, 2026
8dc6c7a
feat(ui): add Funnel icon and enhance ComposerModelControls layout an…
chenyme Sep 16, 2026
4bdb782
feat(ui): add highlight functionality to MentionComposer and Popup co…
chenyme Sep 16, 2026
cb7f777
feat(ui): enhance ConversationStatsBar with new metrics and improve L…
chenyme Sep 16, 2026
e52075a
refactor(ui): update styling and translations in settings components
chenyme Sep 17, 2026
1655514
refactor(ui): streamline settings tests and enhance Skills Hub compon…
chenyme Sep 17, 2026
d4a4833
refactor(ui): remove obsolete scan button state management and update…
chenyme Sep 17, 2026
80cdb81
refactor(ui): simplify layout in SettingsShell component for better r…
chenyme Sep 17, 2026
d3849d9
refactor(ui): enhance ToolPolicyToggle component with shared styling …
chenyme Sep 17, 2026
7812477
refactor(ui): adjust SshSection layout for improved readability and m…
chenyme Sep 17, 2026
b2084a7
refactor(ui): replace switch components with SettingsToggleGroup for …
chenyme Sep 17, 2026
d3b29ef
refactor(ui): enhance chat components with improved performance optim…
chenyme Sep 17, 2026
dfc87ce
refactor(ui): update test cases and component layouts for improved co…
chenyme Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 16 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ jobs:
run: npm install -g pnpm@10.32.1

- name: Install dependencies
run: pnpm install --frozen-lockfile --filter @liveagent/gateway-webui...
run: pnpm install --frozen-lockfile --filter liveagent-workspace --filter @liveagent/gateway-webui...

- name: Build WebUI
working-directory: crates/agent-gateway/web
Expand Down Expand Up @@ -150,7 +150,7 @@ jobs:
- name: Install dependencies
# GUI frontend tests load shared Gateway WebUI modules (including STT adapters).
# Install that workspace and its transitive dependencies in this isolated job.
run: pnpm install --frozen-lockfile --filter liveagent... --filter @liveagent/gateway-webui...
run: pnpm install --frozen-lockfile --filter liveagent-workspace --filter liveagent... --filter @liveagent/gateway-webui...

- name: Typecheck and build GUI frontend
working-directory: crates/agent-gui
Expand Down Expand Up @@ -249,14 +249,27 @@ jobs:
run: npm install -g pnpm@10.32.1

- name: Install dependencies
run: pnpm install --frozen-lockfile --filter @liveagent/ui...
# Shared UI resolves host adapters from the desktop package while typechecking.
run: pnpm install --frozen-lockfile --filter liveagent-workspace --filter liveagent... --filter @liveagent/ui...

- name: Typecheck shared UI
run: pnpm typecheck:ui

- name: Lint shared UI
run: pnpm lint:ui

- name: Run check script tests
run: pnpm check:script-tests

- name: Check shared UI dependency boundaries
run: pnpm check:ui-boundaries

- name: Reject new Biome warnings
run: |
node scripts/check-biome-changed.mjs ui
node scripts/check-biome-changed.mjs gui
node scripts/check-biome-changed.mjs webui

whitespace:
name: Diff Hygiene
runs-on: ubuntu-latest
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ FROM --platform=$BUILDPLATFORM node:22.17.1-bookworm-slim AS webui
WORKDIR /src
RUN npm install -g pnpm@10.32.1

COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.base.json tsconfig.node.base.json ./
COPY crates/virtual-core/package.json crates/virtual-core/package.json
COPY crates/agent-ui/package.json crates/agent-ui/package.json
COPY crates/agent-gui/package.json crates/agent-gui/package.json
Expand Down
27 changes: 9 additions & 18 deletions crates/agent-gui/biome.json → biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@
},
"files": {
"includes": [
"src/**",
"crates/agent-ui/src/**",
"crates/agent-gui/src/**",
"crates/agent-gateway/web/src/**",
"!!**/dist",
"!!**/node_modules",
"!src/lib/models/catalog.generated.ts"
"!**/src/lib/models/catalog.generated.ts",
"!crates/agent-gateway/web/src/lib/proto/gen/**"
]
},
"formatter": {
Expand Down Expand Up @@ -39,7 +42,9 @@
"noUnusedImports": "error"
},
"suspicious": {
"noArrayIndexKey": "warn"
"noArrayIndexKey": "warn",
"noDuplicateCustomProperties": "error",
"noDuplicateProperties": "error"
}
}
},
Expand All @@ -62,19 +67,5 @@
"organizeImports": "on"
}
}
},
"overrides": [
{
"includes": [
"**/*.css"
],
"linter": {
"rules": {
"suspicious": {
"noDuplicateProperties": "off"
}
}
}
}
]
}
}
4 changes: 2 additions & 2 deletions crates/agent-gateway/test/helpers/load-web-module.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ export function createWebModuleLoader(options = {}) {
specifier.startsWith("@liveagent/adapters/");

if (!isRootRelative && !specifier.startsWith(".") && !path.isAbsolute(specifier)) {
return requireFromRoot(specifier);
return createRequire(path.join(parentDir, "__liveagent_test_loader__.js"))(specifier);
}

const filePath = resolveLocal(specifier, isRootRelative ? rootDir : parentDir);
Expand Down Expand Up @@ -236,7 +236,7 @@ export function createWebModuleLoader(options = {}) {
nextSpecifier.startsWith("@liveagent/app/") ||
nextSpecifier.startsWith("@liveagent/adapters/")
? resolveLocal(nextSpecifier, dirname)
: requireFromRoot.resolve(nextSpecifier);
: createRequire(path.join(dirname, "__liveagent_test_loader__.js")).resolve(nextSpecifier);

const wrapped = `(function (exports, require, module, __filename, __dirname) {\n${outputText}\n})`;
const script = new vm.Script(wrapped, { filename: filePath });
Expand Down
5 changes: 3 additions & 2 deletions crates/agent-gateway/test/webui/history-chat-ui.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -949,8 +949,9 @@ test("GatewayTranscript renders folded and live rows in one virtualized list", (
findTreeNode(
listTree,
(node) =>
typeof node.props?.className === "string" &&
node.props.className.includes("gateway-transcript-row-user"),
typeof node.type === "function" &&
node.props?.row?.kind === "user" &&
node.props.row.text === "queued from gui",
),
"live user bubble renders before the live assistant output",
);
Expand Down
81 changes: 0 additions & 81 deletions crates/agent-gateway/web/biome.json

This file was deleted.

6 changes: 3 additions & 3 deletions crates/agent-gateway/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"build": "pnpm typecheck && vite build",
"preview": "vite preview",
"test": "node ../../../scripts/run-node-tests.mjs ../test/webui test",
"lint": "biome check src/ --max-diagnostics=none",
"format": "biome format --write src/",
"lint:fix": "biome check --write src/"
"lint:fix": "biome check --write src/",
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.node.json"
},
"dependencies": {
"@liveagent/ui": "workspace:*",
Expand Down Expand Up @@ -40,7 +41,6 @@
"tailwind-merge": "^3.5.0"
},
"devDependencies": {
"@biomejs/biome": "^2.4.15",
"@bufbuild/protoc-gen-es": "2.12.1",
"@earendil-works/pi-ai": "^0.84.2",
"@iconify-json/logos": "^1.2.11",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { AppSettings, CustomProvider, ProviderId } from "../lib/settings";
import type { AppSettings, CustomProvider } from "../lib/settings";
import type { SettingsSectionProps } from "../pages/settings/types";

/** WebUI 会脱敏 API Key,复制配置按钮仅在桌面端提供。 */
Expand All @@ -9,7 +9,6 @@ export function ProviderCopyConfigButton(_props: {
}

export function ProviderSettingsExtension(_props: {
activeTab: ProviderId;
settings: AppSettings;
setSettings: SettingsSectionProps["setSettings"];
triggerClassName?: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export function createSettingsExtension(props: SettingsPageProps): {
} {
return {
surface: "web",
iconClassName: "h-4 w-4",
iconClassName: "size-4",
slots: {},
sections: [
{
Expand All @@ -20,7 +20,7 @@ export function createSettingsExtension(props: SettingsPageProps): {
groupOrder: 40,
order: 30,
labelKey: "settings.navAgentManagement",
icon: <MonitorSmartphone className="h-4 w-4" />,
icon: <MonitorSmartphone className="size-4" />,
showSaveIndicator: false,
render: () => <DevicesSection onDirectoryChanged={props.onAgentDirectoryChanged} />,
},
Expand Down
28 changes: 12 additions & 16 deletions crates/agent-gateway/web/src/app/AgentSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,17 +81,15 @@ export function AgentSelector({
: t("settings.devicesOfflineStatus");
return (
<div className="px-1">
<DropdownMenuLabel className="px-2 pb-1 pt-2 text-xs font-medium text-muted-foreground">
{t("settings.devicesTitle")}
</DropdownMenuLabel>
<DropdownMenuLabel>{t("settings.devicesTitle")}</DropdownMenuLabel>
<div className="px-2.5 pb-2.5 pt-1">
<div className="flex min-w-0 items-center gap-2.5">
<span
className={cn(
"h-2 w-2 shrink-0 rounded-full",
"size-2 shrink-0 rounded-full",
agent.online
? "bg-emerald-500 shadow-[0_0_0_3px_rgb(16_185_129_/_0.12)]"
: "bg-rose-500 shadow-[0_0_0_3px_rgb(244_63_94_/_0.10)]",
? "bg-emerald-500 shadow-ui-agentselector-53"
: "bg-rose-500 shadow-ui-agentselector-54",
)}
title={statusLabel}
>
Expand All @@ -101,13 +99,13 @@ export function AgentSelector({
<span className="block truncate text-sm font-medium" title={name || agentID}>
{name || truncateMiddle(agentID)}
</span>
<span className="block truncate font-mono text-[11px] text-muted-foreground">
<span className="block truncate font-mono text-xs text-muted-foreground">
{truncateMiddle(agentID)}
</span>
</span>
<span
className={cn(
"shrink-0 rounded-full px-2 py-0.5 text-[10px] font-medium",
"shrink-0 rounded-full px-2 py-0.5 text-tiny font-medium",
agent.online
? "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"
: "bg-rose-500/10 text-rose-600 dark:text-rose-400",
Expand All @@ -123,9 +121,7 @@ export function AgentSelector({

return (
<>
<DropdownMenuLabel className="px-3 pb-1 pt-2 text-xs font-medium text-muted-foreground">
{t("settings.devicesTitle")}
</DropdownMenuLabel>
<DropdownMenuLabel>{t("settings.devicesTitle")}</DropdownMenuLabel>
<div className="max-h-64 overflow-y-auto px-1">
{sortedAgents.map((agent) => {
const agentID = agent.agent_id?.trim() || "";
Expand All @@ -143,10 +139,10 @@ export function AgentSelector({
>
<span
className={cn(
"h-2 w-2 shrink-0 rounded-full",
"size-2 shrink-0 rounded-full",
agent.online
? "bg-emerald-500 shadow-[0_0_0_3px_rgb(16_185_129_/_0.12)]"
: "bg-rose-500 shadow-[0_0_0_3px_rgb(244_63_94_/_0.10)]",
? "bg-emerald-500 shadow-ui-agentselector-53"
: "bg-rose-500 shadow-ui-agentselector-54",
)}
title={statusLabel}
>
Expand All @@ -158,14 +154,14 @@ export function AgentSelector({
</span>
{name ? (
<span
className="block truncate font-mono text-[11px] text-muted-foreground"
className="block truncate font-mono text-xs text-muted-foreground"
title={agentID}
>
{truncateMiddle(agentID)}
</span>
) : null}
</span>
{selected ? <Check className="h-4 w-4 shrink-0 text-emerald-600" /> : null}
{selected ? <Check className="size-4 shrink-0 text-emerald-600" /> : null}
</DropdownMenuItem>
);
})}
Expand Down
Loading
Loading