Compare commits

...

2 Commits

Author SHA1 Message Date
hailin 3074ea54a9 fix(dockerfile): add notification-service/package.json to builder and production stages
The package.json was missing from both the builder stage (lines ~20-31)
and the production stage (lines ~60-70), causing pnpm to skip installing
@nestjs/core and all other dependencies for notification-service.
Container started but immediately crashed with 'Cannot find module @nestjs/core'.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 23:12:13 -08:00
hailin 38594d6fd4 feat(flutter): rename iAgent→我智能体,创建/删除→招募,拉近人机关系距离
- App title、登录页、导航Tab、通话页等全局将 iAgent 改为 我智能体
- 底部导航 Tab "我的创建" → "我的智能体"
- 智能体语境下 "创建" → "招募":招募你的专属智能体、帮我招募一个...
- tasks_page 空状态文案 "创建" → "新增"(非智能体语境保持语义准确)
- 终端欢迎语、通知渠道描述同步更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 23:10:07 -08:00
11 changed files with 25 additions and 23 deletions

View File

@ -28,6 +28,7 @@ COPY packages/services/billing-service/package.json packages/services/billing-se
COPY packages/services/version-service/package.json packages/services/version-service/
COPY packages/services/presence-service/package.json packages/services/presence-service/
COPY packages/services/referral-service/package.json packages/services/referral-service/
COPY packages/services/notification-service/package.json packages/services/notification-service/
# Install all dependencies (cached unless package.json changes)
RUN pnpm install --frozen-lockfile
@ -68,6 +69,7 @@ COPY --from=builder /app/packages/services/billing-service/package.json packages
COPY --from=builder /app/packages/services/version-service/package.json packages/services/version-service/
COPY --from=builder /app/packages/services/presence-service/package.json packages/services/presence-service/
COPY --from=builder /app/packages/services/referral-service/package.json packages/services/referral-service/
COPY --from=builder /app/packages/services/notification-service/package.json packages/services/notification-service/
# Install production dependencies only
RUN pnpm install --frozen-lockfile --prod

View File

@ -13,7 +13,7 @@ class IT0App extends ConsumerWidget {
final themeMode = ref.watch(themeModeProvider);
return MaterialApp.router(
title: 'iAgent',
title: '我智能体',
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
themeMode: themeMode,

View File

@ -169,7 +169,7 @@ class _ScaffoldWithNavState extends ConsumerState<ScaffoldWithNav>
const NavigationDestination(
icon: Icon(Icons.smart_toy_outlined),
selectedIcon: Icon(Icons.smart_toy),
label: '我的创建',
label: '我的智能体',
),
NavigationDestination(
icon: Badge(

View File

@ -71,7 +71,7 @@ class NotificationService {
const androidDetails = AndroidNotificationDetails(
'it0_notifications',
'运维通知',
channelDescription: 'iAgent 运维告警和通知',
channelDescription: '我智能体 运维告警和通知',
importance: Importance.high,
priority: Priority.high,
);

View File

@ -797,7 +797,7 @@ class _AgentCallPageState extends ConsumerState<AgentCallPage>
),
),
const SizedBox(width: 8),
const Text('iAgent',
const Text('我智能体',
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 15)),
const SizedBox(width: 8),
Text(
@ -944,11 +944,11 @@ class _AgentCallPageState extends ConsumerState<AgentCallPage>
String get _statusText {
switch (_phase) {
case _CallPhase.ringing:
return 'iAgent 语音通话';
return '我智能体 语音通话';
case _CallPhase.connecting:
return '连接中...';
case _CallPhase.active:
return 'iAgent';
return '我智能体';
case _CallPhase.ended:
return '通话结束';
}

View File

@ -89,7 +89,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
SvgPicture.asset('assets/icons/logo.svg', width: 96, height: 96),
const SizedBox(height: 12),
const Text(
'iAgent',
'我智能体',
style: TextStyle(
color: AppColors.textPrimary,
fontSize: 28,

View File

@ -527,7 +527,7 @@ class _ChatPageState extends ConsumerState<ChatPage> {
children: [
RobotAvatar(state: robotState, size: 32),
const SizedBox(width: 8),
const Text('iAgent',
const Text('我智能体',
style: TextStyle(
fontSize: 16, fontWeight: FontWeight.w600)),
],
@ -644,7 +644,7 @@ class _ChatPageState extends ConsumerState<ChatPage> {
Icon(Icons.smart_toy_outlined, size: 64, color: AppColors.textMuted),
const SizedBox(height: 16),
Text(
'开始与 iAgent 对话',
'开始与 我智能体 对话',
style: TextStyle(color: AppColors.textSecondary, fontSize: 16),
),
const SizedBox(height: 8),

View File

@ -48,7 +48,7 @@ class HomePage extends ConsumerWidget {
),
const SizedBox(height: 2),
const Text(
'iAgent 随时为你服务',
'我智能体 随时为你服务',
style: TextStyle(
fontSize: 12,
color: AppColors.textSecondary,
@ -191,7 +191,7 @@ class _AgentStatusCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'iAgent',
'我智能体',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
@ -273,7 +273,7 @@ class _OfficialAgentsRow extends StatelessWidget {
static const _agents = [
_AgentCard(
name: 'iAgent 运维助手',
name: '我智能体 运维助手',
desc: '服务器管理、SSH 执行、日志分析',
icon: Icons.dns_outlined,
color: Color(0xFF6366F1),
@ -433,7 +433,7 @@ class _MyAgentsPlaceholder extends StatelessWidget {
),
const SizedBox(height: 6),
const Text(
'点击下方机器人按钮,告诉 iAgent\n"帮我创建一个 OpenClaw 智能体"',
'点击下方机器人按钮,告诉 我智能体\n"帮我招募一个 OpenClaw 智能体"',
style: TextStyle(
fontSize: 13,
color: AppColors.textSecondary,
@ -455,7 +455,7 @@ class _QuickTipsCard extends StatelessWidget {
const _QuickTipsCard();
static const _tips = [
'💬 "帮我创建一个监控 GitHub Actions 的智能体"',
'💬 "帮我招募一个监控 GitHub Actions 的智能体"',
'🔧 "把我的 OpenClaw 配置导出为 JSON"',
'📊 "分析我的服务器最近7天的负载情况"',
'🛡️ "帮我设置每天凌晨2点自动备份数据库"',

View File

@ -108,7 +108,7 @@ class MyAgentsPage extends ConsumerWidget {
backgroundColor: AppColors.background,
appBar: AppBar(
backgroundColor: AppColors.background,
title: const Text('我的创建'),
title: const Text('我的智能体'),
actions: [
IconButton(
icon: const Icon(Icons.refresh_outlined),
@ -146,21 +146,21 @@ class MyAgentsPage extends ConsumerWidget {
),
const SizedBox(height: 24),
const Text(
'创建你的专属智能体',
'招募你的专属智能体',
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold, color: AppColors.textPrimary),
),
const SizedBox(height: 10),
const Text(
'通过与 iAgent 对话,你可以创建各种智能体:\nOpenClaw 编程助手、运维机器人、数据分析师...',
'通过与 我智能体 对话,你可以招募各种智能体:\nOpenClaw 编程助手、运维机器人、数据分析师...',
style: TextStyle(fontSize: 14, color: AppColors.textSecondary, height: 1.6),
textAlign: TextAlign.center,
),
const SizedBox(height: 36),
_StepCard(step: '1', title: '点击下方机器人', desc: '打开与 iAgent 的对话窗口', icon: Icons.smart_toy_outlined, color: AppColors.primary),
_StepCard(step: '1', title: '点击下方机器人', desc: '打开与 我智能体 的对话窗口', icon: Icons.smart_toy_outlined, color: AppColors.primary),
const SizedBox(height: 12),
_StepCard(step: '2', title: '描述你想要的智能体', desc: '例如:"帮我创建一个 OpenClaw 编程助手"', icon: Icons.record_voice_over_outlined, color: const Color(0xFF0EA5E9)),
_StepCard(step: '2', title: '描述你想要的智能体', desc: '例如:"帮我招募一个 OpenClaw 编程助手"', icon: Icons.record_voice_over_outlined, color: const Color(0xFF0EA5E9)),
const SizedBox(height: 12),
_StepCard(step: '3', title: 'iAgent 自动部署', desc: '部署完成后出现在这里,通过 Telegram/WhatsApp 等渠道与它对话', icon: Icons.check_circle_outline, color: AppColors.success),
_StepCard(step: '3', title: '我智能体 自动部署', desc: '部署完成后出现在这里,通过 Telegram/WhatsApp 等渠道与它对话', icon: Icons.check_circle_outline, color: AppColors.success),
const SizedBox(height: 36),
const _TemplatesSection(),
const SizedBox(height: 100),
@ -433,7 +433,7 @@ class _TemplatesSection extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('热门模板(告诉 iAgent 你想要哪种)', style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textSecondary)),
const Text('热门模板(告诉 我智能体 你想要哪种)', style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textSecondary)),
const SizedBox(height: 12),
GridView.count(
shrinkWrap: true,

View File

@ -175,7 +175,7 @@ class _StandingOrdersListBody extends StatelessWidget {
return const EmptyState(
icon: Icons.rule_outlined,
title: '暂无常驻指令',
subtitle: '通过 iAgent 对话创建常驻指令',
subtitle: '通过 我智能体 对话新增常驻指令',
);
}
return ListView.builder(

View File

@ -56,7 +56,7 @@ class _TerminalPageState extends ConsumerState<TerminalPage> {
super.initState();
_terminal = Terminal(maxLines: 10000);
_terminal.onOutput = _onTerminalInput;
_terminal.write('iAgent 远程终端\r\n');
_terminal.write('我智能体 远程终端\r\n');
_terminal.write('请选择服务器并点击连接。\r\n');
}