neoagent 2.3.1-beta.56 → 2.3.1-beta.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -265,6 +265,8 @@ class _SettingsPanelState extends State<SettingsPanel> {
265
265
  ],
266
266
  _buildSettingsOverview(controller, availableModels.length),
267
267
  const SizedBox(height: 16),
268
+ _buildManagementSection(controller),
269
+ const SizedBox(height: 16),
268
270
  _buildWorkspaceSection(controller),
269
271
  const SizedBox(height: 16),
270
272
  _buildModelsSection(
@@ -451,6 +453,81 @@ class _SettingsPanelState extends State<SettingsPanel> {
451
453
  );
452
454
  }
453
455
 
456
+ Widget _buildManagementSection(NeoAgentController controller) {
457
+ return Card(
458
+ child: Padding(
459
+ padding: const EdgeInsets.all(20),
460
+ child: Column(
461
+ crossAxisAlignment: CrossAxisAlignment.start,
462
+ children: <Widget>[
463
+ const _SectionTitle('Subcategories'),
464
+ const SizedBox(height: 10),
465
+ Text(
466
+ 'Open settings areas that have their own dedicated management screens.',
467
+ style: TextStyle(color: _textSecondary, height: 1.45),
468
+ ),
469
+ const SizedBox(height: 16),
470
+ InkWell(
471
+ onTap: () => controller.setSelectedSection(AppSection.agents),
472
+ borderRadius: BorderRadius.circular(20),
473
+ child: Ink(
474
+ decoration: BoxDecoration(
475
+ color: _bgSecondary.withValues(alpha: 0.7),
476
+ borderRadius: BorderRadius.circular(20),
477
+ border: Border.all(color: _border),
478
+ ),
479
+ child: Padding(
480
+ padding: const EdgeInsets.all(16),
481
+ child: Row(
482
+ children: <Widget>[
483
+ Container(
484
+ width: 44,
485
+ height: 44,
486
+ decoration: BoxDecoration(
487
+ color: _accentMuted,
488
+ borderRadius: BorderRadius.circular(14),
489
+ ),
490
+ child: Icon(
491
+ Icons.smart_toy_outlined,
492
+ color: _accentHover,
493
+ ),
494
+ ),
495
+ const SizedBox(width: 14),
496
+ Expanded(
497
+ child: Column(
498
+ crossAxisAlignment: CrossAxisAlignment.start,
499
+ children: <Widget>[
500
+ Text(
501
+ 'Agents',
502
+ style: TextStyle(
503
+ fontWeight: FontWeight.w700,
504
+ color: _textPrimary,
505
+ ),
506
+ ),
507
+ const SizedBox(height: 4),
508
+ Text(
509
+ 'Manage specialist agents, routing roles, memory separation, and account assignment.',
510
+ style: TextStyle(
511
+ color: _textSecondary,
512
+ height: 1.4,
513
+ ),
514
+ ),
515
+ ],
516
+ ),
517
+ ),
518
+ const SizedBox(width: 12),
519
+ Icon(Icons.chevron_right_rounded, color: _textSecondary),
520
+ ],
521
+ ),
522
+ ),
523
+ ),
524
+ ),
525
+ ],
526
+ ),
527
+ ),
528
+ );
529
+ }
530
+
454
531
  Widget _buildModelsSection({
455
532
  required NeoAgentController controller,
456
533
  required List<DropdownMenuItem<String>> modelChoices,
@@ -158,6 +158,7 @@ class _EntranceMotionState extends State<_EntranceMotion> {
158
158
 
159
159
  class _GlassSurface extends StatelessWidget {
160
160
  const _GlassSurface({
161
+ super.key,
161
162
  required this.child,
162
163
  this.width,
163
164
  this.padding,
@@ -241,7 +242,6 @@ List<AppSection> _mainSections(NeoAgentController controller) {
241
242
  AppSection.memory,
242
243
  if (controller.showHealthSection) AppSection.health,
243
244
  AppSection.settings,
244
- AppSection.agents,
245
245
  AppSection.messaging,
246
246
  ];
247
247
  }
@@ -1513,11 +1513,13 @@ class _StatusPill extends StatelessWidget {
1513
1513
 
1514
1514
  @override
1515
1515
  Widget build(BuildContext context) {
1516
- return Container(
1516
+ return AnimatedContainer(
1517
+ duration: const Duration(milliseconds: 180),
1517
1518
  padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
1518
1519
  decoration: BoxDecoration(
1519
1520
  borderRadius: BorderRadius.circular(999),
1520
- color: color.withValues(alpha: 0.12),
1521
+ color: color.withValues(alpha: 0.14),
1522
+ border: Border.all(color: color.withValues(alpha: 0.18)),
1521
1523
  ),
1522
1524
  child: Text(
1523
1525
  label,
@@ -1539,14 +1541,13 @@ class _MetaPill extends StatelessWidget {
1539
1541
 
1540
1542
  @override
1541
1543
  Widget build(BuildContext context) {
1542
- final accentColor = color ?? const Color(0xFF5EEAD4);
1543
- return Container(
1544
+ final accentColor = color ?? _accentAlt;
1545
+ return _GlassSurface(
1544
1546
  padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
1545
- decoration: BoxDecoration(
1546
- color: _bgSecondary,
1547
- borderRadius: BorderRadius.circular(999),
1548
- border: Border.all(color: _border),
1549
- ),
1547
+ borderRadius: BorderRadius.circular(999),
1548
+ blurSigma: 10,
1549
+ fillColor: _bgCard.withValues(alpha: 0.86),
1550
+ borderColor: _borderLight,
1550
1551
  child: Row(
1551
1552
  mainAxisSize: MainAxisSize.min,
1552
1553
  children: <Widget>[
@@ -1573,14 +1574,13 @@ class _InfoChip extends StatelessWidget {
1573
1574
 
1574
1575
  @override
1575
1576
  Widget build(BuildContext context) {
1576
- return Container(
1577
+ return _GlassSurface(
1577
1578
  width: double.infinity,
1578
1579
  padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
1579
- decoration: BoxDecoration(
1580
- color: Colors.white.withValues(alpha: 0.06),
1581
- borderRadius: BorderRadius.circular(16),
1582
- border: Border.all(color: Colors.white.withValues(alpha: 0.10)),
1583
- ),
1580
+ borderRadius: BorderRadius.circular(16),
1581
+ blurSigma: 12,
1582
+ fillColor: _bgCard.withValues(alpha: 0.72),
1583
+ borderColor: _borderLight,
1584
1584
  child: Row(
1585
1585
  children: <Widget>[
1586
1586
  Icon(icon, size: 16, color: Colors.white.withValues(alpha: 0.72)),
@@ -1871,13 +1871,12 @@ class _RecordingPermissionBadge extends StatelessWidget {
1871
1871
  ),
1872
1872
  };
1873
1873
 
1874
- return Container(
1874
+ return _GlassSurface(
1875
1875
  padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 9),
1876
- decoration: BoxDecoration(
1877
- color: color.withValues(alpha: 0.10),
1878
- borderRadius: BorderRadius.circular(16),
1879
- border: Border.all(color: color.withValues(alpha: 0.20)),
1880
- ),
1876
+ borderRadius: BorderRadius.circular(16),
1877
+ blurSigma: 10,
1878
+ fillColor: color.withValues(alpha: 0.09),
1879
+ borderColor: color.withValues(alpha: 0.22),
1881
1880
  child: Row(
1882
1881
  mainAxisSize: MainAxisSize.min,
1883
1882
  children: <Widget>[
@@ -1950,8 +1949,13 @@ class _AudioLevelBar extends StatelessWidget {
1950
1949
  @override
1951
1950
  Widget build(BuildContext context) {
1952
1951
  final progress = ((valueDb + 72) / 72).clamp(0.0, 1.0);
1953
- return SizedBox(
1954
- width: compact ? 148 : 220,
1952
+ return _GlassSurface(
1953
+ width: compact ? 168 : 240,
1954
+ padding: const EdgeInsets.all(12),
1955
+ borderRadius: BorderRadius.circular(18),
1956
+ blurSigma: 10,
1957
+ fillColor: _bgCard.withValues(alpha: 0.88),
1958
+ borderColor: _borderLight,
1955
1959
  child: Column(
1956
1960
  crossAxisAlignment: CrossAxisAlignment.start,
1957
1961
  children: <Widget>[
@@ -1976,14 +1980,21 @@ class _AudioLevelBar extends StatelessWidget {
1976
1980
  ),
1977
1981
  ],
1978
1982
  ),
1979
- const SizedBox(height: 8),
1983
+ const SizedBox(height: 10),
1980
1984
  ClipRRect(
1981
1985
  borderRadius: BorderRadius.circular(999),
1982
- child: LinearProgressIndicator(
1983
- value: progress,
1984
- minHeight: compact ? 7 : 8,
1985
- color: color,
1986
- backgroundColor: _borderLight,
1986
+ child: TweenAnimationBuilder<double>(
1987
+ tween: Tween<double>(begin: 0, end: progress),
1988
+ duration: const Duration(milliseconds: 220),
1989
+ curve: Curves.easeOutCubic,
1990
+ builder: (context, animatedValue, _) {
1991
+ return LinearProgressIndicator(
1992
+ value: animatedValue,
1993
+ minHeight: compact ? 7 : 8,
1994
+ color: color,
1995
+ backgroundColor: _borderLight,
1996
+ );
1997
+ },
1987
1998
  ),
1988
1999
  ),
1989
2000
  ],
@@ -65,13 +65,13 @@ List<BoxShadow> get _softPanelShadow => <BoxShadow>[
65
65
  ];
66
66
 
67
67
  Color get _glassFill =>
68
- _bgCard.withValues(alpha: _palette == _darkPalette ? 0.58 : 0.72);
68
+ _bgCard.withValues(alpha: _palette == _darkPalette ? 0.78 : 0.88);
69
69
  Color get _glassOverlay =>
70
- Colors.white.withValues(alpha: _palette == _darkPalette ? 0.08 : 0.24);
70
+ Colors.white.withValues(alpha: _palette == _darkPalette ? 0.04 : 0.12);
71
71
  Color get _glassBorder =>
72
- Colors.white.withValues(alpha: _palette == _darkPalette ? 0.15 : 0.42);
72
+ Colors.white.withValues(alpha: _palette == _darkPalette ? 0.12 : 0.26);
73
73
  Color get _glassHighlight =>
74
- Colors.white.withValues(alpha: _palette == _darkPalette ? 0.18 : 0.4);
74
+ Colors.white.withValues(alpha: _palette == _darkPalette ? 0.1 : 0.18);
75
75
 
76
76
  LinearGradient get _liquidMetalGradient => LinearGradient(
77
77
  colors: <Color>[
@@ -84,18 +84,18 @@ LinearGradient get _liquidMetalGradient => LinearGradient(
84
84
  end: const Alignment(1, 1),
85
85
  );
86
86
 
87
- TextStyle _displayTitleStyle([double size = 28]) => GoogleFonts.spaceGrotesk(
87
+ TextStyle _displayTitleStyle([double size = 28]) => TextStyle(
88
88
  fontSize: size,
89
89
  fontWeight: FontWeight.w700,
90
- height: 1.05,
91
- letterSpacing: -0.6,
90
+ height: 1.08,
91
+ letterSpacing: -0.8,
92
92
  color: _textPrimary,
93
93
  );
94
94
 
95
- TextStyle _sectionEyebrowStyle() => GoogleFonts.spaceGrotesk(
96
- fontSize: 11,
95
+ TextStyle _sectionEyebrowStyle() => TextStyle(
96
+ fontSize: 12,
97
97
  fontWeight: FontWeight.w700,
98
- letterSpacing: 1.6,
98
+ letterSpacing: 1.0,
99
99
  color: _accentHover,
100
100
  );
101
101
 
@@ -117,24 +117,25 @@ ThemeData _buildNeoAgentTheme(NeoAgentPalette palette, Brightness brightness) {
117
117
  onSurface: palette.textPrimary,
118
118
  error: palette.danger,
119
119
  ),
120
- textTheme: GoogleFonts.manropeTextTheme(
121
- base.textTheme,
122
- ).apply(bodyColor: palette.textPrimary, displayColor: palette.textPrimary),
120
+ textTheme: base.textTheme.apply(
121
+ bodyColor: palette.textPrimary,
122
+ displayColor: palette.textPrimary,
123
+ ),
123
124
  cardTheme: CardThemeData(
124
125
  color: palette.bgCard.withValues(
125
- alpha: brightness == Brightness.dark ? 0.58 : 0.78,
126
+ alpha: brightness == Brightness.dark ? 0.86 : 0.96,
126
127
  ),
127
128
  shadowColor: Colors.black.withValues(
128
129
  alpha: brightness == Brightness.dark ? 0.24 : 0.12,
129
130
  ),
130
131
  surfaceTintColor: Colors.transparent,
131
- elevation: brightness == Brightness.dark ? 10 : 5,
132
+ elevation: brightness == Brightness.dark ? 8 : 3,
132
133
  margin: EdgeInsets.zero,
133
134
  shape: RoundedRectangleBorder(
134
135
  borderRadius: BorderRadius.circular(28),
135
136
  side: BorderSide(
136
137
  color: Colors.white.withValues(
137
- alpha: brightness == Brightness.dark ? 0.12 : 0.3,
138
+ alpha: brightness == Brightness.dark ? 0.08 : 0.22,
138
139
  ),
139
140
  ),
140
141
  ),
@@ -142,7 +143,7 @@ ThemeData _buildNeoAgentTheme(NeoAgentPalette palette, Brightness brightness) {
142
143
  inputDecorationTheme: InputDecorationTheme(
143
144
  filled: true,
144
145
  fillColor: palette.bgSecondary.withValues(
145
- alpha: brightness == Brightness.dark ? 0.54 : 0.52,
146
+ alpha: brightness == Brightness.dark ? 0.82 : 0.84,
146
147
  ),
147
148
  border: OutlineInputBorder(
148
149
  borderRadius: BorderRadius.circular(18),
@@ -186,10 +187,10 @@ ThemeData _buildNeoAgentTheme(NeoAgentPalette palette, Brightness brightness) {
186
187
  ),
187
188
  ),
188
189
  ),
189
- textStyle: GoogleFonts.manrope(
190
- fontSize: 14,
190
+ textStyle: const TextStyle(
191
+ fontSize: 15,
191
192
  fontWeight: FontWeight.w700,
192
- letterSpacing: 0.15,
193
+ letterSpacing: -0.1,
193
194
  ),
194
195
  ),
195
196
  ),
@@ -206,10 +207,7 @@ ThemeData _buildNeoAgentTheme(NeoAgentPalette palette, Brightness brightness) {
206
207
  ),
207
208
  padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 16),
208
209
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)),
209
- textStyle: GoogleFonts.manrope(
210
- fontSize: 14,
211
- fontWeight: FontWeight.w700,
212
- ),
210
+ textStyle: const TextStyle(fontSize: 15, fontWeight: FontWeight.w700),
213
211
  ),
214
212
  ),
215
213
  pageTransitionsTheme: const PageTransitionsTheme(
@@ -224,10 +222,10 @@ ThemeData _buildNeoAgentTheme(NeoAgentPalette palette, Brightness brightness) {
224
222
  textButtonTheme: TextButtonThemeData(
225
223
  style: TextButton.styleFrom(
226
224
  foregroundColor: palette.accentHover,
227
- textStyle: GoogleFonts.manrope(
228
- fontSize: 13,
225
+ textStyle: const TextStyle(
226
+ fontSize: 14,
229
227
  fontWeight: FontWeight.w700,
230
- letterSpacing: 0.15,
228
+ letterSpacing: -0.05,
231
229
  ),
232
230
  ),
233
231
  ),
@@ -236,11 +234,11 @@ ThemeData _buildNeoAgentTheme(NeoAgentPalette palette, Brightness brightness) {
236
234
  surfaceTintColor: Colors.transparent,
237
235
  foregroundColor: palette.textPrimary,
238
236
  elevation: 0,
239
- titleTextStyle: GoogleFonts.spaceGrotesk(
237
+ titleTextStyle: TextStyle(
240
238
  color: palette.textPrimary,
241
239
  fontSize: 18,
242
- fontWeight: FontWeight.w700,
243
- letterSpacing: -0.2,
240
+ fontWeight: FontWeight.w600,
241
+ letterSpacing: -0.3,
244
242
  ),
245
243
  ),
246
244
  dialogTheme: DialogThemeData(
@@ -44,16 +44,16 @@ const NeoAgentPalette darkPalette = NeoAgentPalette(
44
44
  bgPrimary: Color(0xFF071015),
45
45
  bgSecondary: Color(0xFF0E171E),
46
46
  bgTertiary: Color(0xFF15232B),
47
- bgCard: Color(0xFF131E25),
47
+ bgCard: Color(0xFF16212A),
48
48
  textPrimary: Color(0xFFF5EFE4),
49
- textSecondary: Color(0xFFB4B3AE),
50
- textMuted: Color(0xFF7E8B93),
49
+ textSecondary: Color(0xFFD2D7DC),
50
+ textMuted: Color(0xFF95A0A8),
51
51
  accent: Color(0xFFC7A36A),
52
52
  accentHover: Color(0xFFE4C58D),
53
53
  accentAlt: Color(0xFF5FA897),
54
54
  accentMuted: Color(0x24C7A36A),
55
- border: Color(0x204F626E),
56
- borderLight: Color(0x30667A86),
55
+ border: Color(0x30576875),
56
+ borderLight: Color(0x4A7B8D99),
57
57
  success: Color(0xFF37B67E),
58
58
  warning: Color(0xFFD49A43),
59
59
  danger: Color(0xFFE26E61),
@@ -61,19 +61,19 @@ const NeoAgentPalette darkPalette = NeoAgentPalette(
61
61
  );
62
62
 
63
63
  const NeoAgentPalette lightPalette = NeoAgentPalette(
64
- bgPrimary: Color(0xFFF6F1E8),
65
- bgSecondary: Color(0xFFF0E7DA),
66
- bgTertiary: Color(0xFFE3D7C7),
67
- bgCard: Color(0xFFFFFCF7),
68
- textPrimary: Color(0xFF211B16),
69
- textSecondary: Color(0xFF5E584F),
70
- textMuted: Color(0xFF998D7E),
64
+ bgPrimary: Color(0xFFF3F0EB),
65
+ bgSecondary: Color(0xFFEAE4DA),
66
+ bgTertiary: Color(0xFFDED6CA),
67
+ bgCard: Color(0xFFFFFEFC),
68
+ textPrimary: Color(0xFF16181D),
69
+ textSecondary: Color(0xFF444A55),
70
+ textMuted: Color(0xFF727987),
71
71
  accent: Color(0xFF8F6D3E),
72
72
  accentHover: Color(0xFFAF8750),
73
73
  accentAlt: Color(0xFF2F7D6E),
74
74
  accentMuted: Color(0x1F8F6D3E),
75
- border: Color(0x1F3C3227),
76
- borderLight: Color(0x333C3227),
75
+ border: Color(0x223F4652),
76
+ borderLight: Color(0x3847505D),
77
77
  success: Color(0xFF1F8C58),
78
78
  warning: Color(0xFFB87322),
79
79
  danger: Color(0xFFD25B4D),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoagent",
3
- "version": "2.3.1-beta.56",
3
+ "version": "2.3.1-beta.57",
4
4
  "description": "Proactive personal AI agent with no limits",
5
5
  "license": "MIT",
6
6
  "main": "server/index.js",
@@ -1 +1 @@
1
- af264d9a8e6140cadf8a95b90b714112
1
+ 4c06defd54f49c9d84625740934d71be
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"42d3d75a56efe1a2e9902f52dc8006099c45d9
37
37
 
38
38
  _flutter.loader.load({
39
39
  serviceWorkerSettings: {
40
- serviceWorkerVersion: "3546406361" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
40
+ serviceWorkerVersion: "1045065206" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
41
41
  }
42
42
  });