diff --git a/.env.example b/.env.example
index 445933a67..70c34f752 100644
--- a/.env.example
+++ b/.env.example
@@ -16,3 +16,5 @@
# `OBSERVABILITY_ENABLED=1` uses the same unified switch as the backend. When
# enabled by the LexVoice runtime, browser-side probes publish LiveKit data
# packets for the local observability report.
+# `ACTIVITY_INTELLIGENCE_PUBLIC_URL` enables the Team Pulse button and points
+# its embedded panel at the aggregate-only public activity page.
diff --git a/README.md b/README.md
index 54ebe2f90..c95bb5d09 100644
--- a/README.md
+++ b/README.md
@@ -149,6 +149,11 @@ input source as `lexvoice-${INPUT_SOURCE}-agent`; an explicit `AGENT_NAME`
always wins. Standalone deployments that do not run a matching agent worker
should set `AGENT_NAME` to the worker name they expect to dispatch.
+Set `ACTIVITY_INTELLIGENCE_PUBLIC_URL` in the LexVoice repository `.env` to
+show the “团队动态” entry in the voice UI. The URL must point to Activity
+Intelligence's aggregate `/public` page; the embedded surface intentionally
+excludes names, personal arrival times, and unobserved-member details.
+
Vision-related frontend variables use the `*_VISION_*` names. The older
`*_VIDEO_*` names are still accepted as migration fallbacks, but new
configuration should use the current names:
diff --git a/app-config.ts b/app-config.ts
index 79d6b54c8..58212b7fc 100644
--- a/app-config.ts
+++ b/app-config.ts
@@ -58,6 +58,7 @@ export interface AppConfig {
debugAudio?: boolean;
debugVideo?: boolean;
observabilityEnabled?: boolean;
+ activityIntelligencePublicUrl?: string;
// 全局调试配置
enableGlobalDebug?: boolean; // 全局调试开关,控制所有调试信息的显示
@@ -243,6 +244,7 @@ export const APP_CONFIG_DEFAULTS: AppConfig = {
debugAudio: false,
debugVideo: false,
observabilityEnabled: false,
+ activityIntelligencePublicUrl: undefined,
// 全局调试配置
enableGlobalDebug: process.env.NEXT_PUBLIC_ENABLE_GLOBAL_DEBUG === 'true' || false, // 全局调试开关
diff --git a/components/app/activity-panel.tsx b/components/app/activity-panel.tsx
new file mode 100644
index 000000000..294fa24f0
--- /dev/null
+++ b/components/app/activity-panel.tsx
@@ -0,0 +1,63 @@
+'use client';
+
+import { useState } from 'react';
+import { ChartLineUp, X } from '@phosphor-icons/react';
+
+interface ActivityPanelProps {
+ publicUrl?: string;
+}
+
+export function ActivityPanel({ publicUrl }: ActivityPanelProps) {
+ const [open, setOpen] = useState(false);
+
+ if (!publicUrl) return null;
+
+ return (
+ <>
+
+
+ {open && (
+
+
+