neoagent 2.4.1-beta.19 → 2.4.1-beta.21

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.
Files changed (55) hide show
  1. package/README.md +4 -1
  2. package/docs/getting-started.md +9 -3
  3. package/flutter_app/assets/branding/app_icon_light_1024.png +0 -0
  4. package/flutter_app/assets/branding/app_icon_light_128.png +0 -0
  5. package/flutter_app/assets/branding/app_icon_light_192.png +0 -0
  6. package/flutter_app/assets/branding/app_icon_light_256.png +0 -0
  7. package/flutter_app/assets/branding/app_icon_light_32.png +0 -0
  8. package/flutter_app/assets/branding/app_icon_light_512.png +0 -0
  9. package/flutter_app/assets/branding/app_icon_light_64.png +0 -0
  10. package/flutter_app/assets/branding/tray_icon_light_template.png +0 -0
  11. package/flutter_app/lib/features/location/location_service.dart +3 -0
  12. package/flutter_app/lib/main.dart +1 -0
  13. package/flutter_app/lib/main_account_settings.dart +9 -33
  14. package/flutter_app/lib/main_app_shell.dart +237 -197
  15. package/flutter_app/lib/main_controller.dart +0 -25
  16. package/flutter_app/lib/main_devices.dart +2 -0
  17. package/flutter_app/lib/main_models.dart +144 -0
  18. package/flutter_app/lib/main_operations.dart +150 -19
  19. package/flutter_app/lib/main_shared.dart +642 -195
  20. package/flutter_app/lib/main_theme.dart +2 -0
  21. package/flutter_app/lib/src/android_apk_drop_zone_web.dart +3 -1
  22. package/flutter_app/lib/src/security/password_strength.dart +84 -0
  23. package/flutter_app/lib/src/theme/palette.dart +15 -15
  24. package/flutter_app/pubspec.yaml +3 -0
  25. package/flutter_app/web/favicon_light.svg +3 -0
  26. package/flutter_app/web/icons/Icon-192-light.png +0 -0
  27. package/flutter_app/web/icons/Icon-512-light.png +0 -0
  28. package/flutter_app/web/icons/Icon-maskable-192-light.png +0 -0
  29. package/flutter_app/web/icons/Icon-maskable-512-light.png +0 -0
  30. package/lib/manager.js +282 -81
  31. package/package.json +17 -3
  32. package/server/config/origins.js +3 -1
  33. package/server/db/database.js +73 -0
  34. package/server/public/.last_build_id +1 -1
  35. package/server/public/assets/AssetManifest.bin +1 -1
  36. package/server/public/assets/AssetManifest.bin.json +1 -1
  37. package/server/public/assets/assets/branding/app_icon_light_256.png +0 -0
  38. package/server/public/assets/assets/branding/app_icon_light_512.png +0 -0
  39. package/server/public/assets/assets/branding/tray_icon_light_template.png +0 -0
  40. package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
  41. package/server/public/favicon_light.svg +3 -0
  42. package/server/public/flutter_bootstrap.js +1 -1
  43. package/server/public/icons/Icon-192-light.png +0 -0
  44. package/server/public/icons/Icon-512-light.png +0 -0
  45. package/server/public/icons/Icon-maskable-192-light.png +0 -0
  46. package/server/public/icons/Icon-maskable-512-light.png +0 -0
  47. package/server/public/main.dart.js +68769 -68268
  48. package/server/routes/agent_profiles.js +3 -0
  49. package/server/routes/memory.js +22 -1
  50. package/server/services/account/password_policy.js +6 -1
  51. package/server/services/memory/intelligence.js +181 -0
  52. package/server/services/memory/manager.js +475 -25
  53. package/server/utils/security.js +3 -0
  54. package/server/services/memory/openhuman_uplift.test.js +0 -98
  55. package/server/utils/version.test.js +0 -39
@@ -1,5 +1,7 @@
1
1
  part of 'main.dart';
2
2
 
3
+ // ignore_for_file: unused_element
4
+
3
5
  const NeoAgentPalette _darkPalette = darkPalette;
4
6
  const NeoAgentPalette _lightPalette = lightPalette;
5
7
 
@@ -447,7 +447,9 @@ class _AndroidApkTileWebState extends State<_AndroidApkTileWeb> {
447
447
 
448
448
  @override
449
449
  void dispose() {
450
- for (final s in _subs) s.cancel();
450
+ for (final s in _subs) {
451
+ s.cancel();
452
+ }
451
453
  _dropElement.remove();
452
454
  super.dispose();
453
455
  }
@@ -0,0 +1,84 @@
1
+ class PasswordStrengthEvaluation {
2
+ const PasswordStrengthEvaluation({
3
+ required this.score,
4
+ required this.containsUserInfo,
5
+ required this.obviousPattern,
6
+ required this.hasMinimumLength,
7
+ });
8
+
9
+ final int score;
10
+ final bool containsUserInfo;
11
+ final bool obviousPattern;
12
+ final bool hasMinimumLength;
13
+ }
14
+
15
+ bool hasSequentialPattern(String input) {
16
+ if (input.length < 4) return false;
17
+
18
+ // check for ascending/descending sequences of length >= 4
19
+ for (int i = 0; i <= input.length - 4; i++) {
20
+ bool asc = true;
21
+ bool desc = true;
22
+ for (int j = 0; j < 3; j++) {
23
+ if (input.codeUnitAt(i + j + 1) != input.codeUnitAt(i + j) + 1) asc = false;
24
+ if (input.codeUnitAt(i + j + 1) != input.codeUnitAt(i + j) - 1) desc = false;
25
+ }
26
+ if (asc || desc) return true;
27
+ }
28
+ return false;
29
+ }
30
+
31
+ PasswordStrengthEvaluation evaluatePasswordStrength({
32
+ required String password,
33
+ String username = '',
34
+ String email = '',
35
+ }) {
36
+ final value = password.trim();
37
+ if (value.isEmpty) {
38
+ return const PasswordStrengthEvaluation(
39
+ score: 0,
40
+ containsUserInfo: false,
41
+ obviousPattern: false,
42
+ hasMinimumLength: false,
43
+ );
44
+ }
45
+
46
+ final lower = RegExp(r'[a-z]').hasMatch(value);
47
+ final upper = RegExp(r'[A-Z]').hasMatch(value);
48
+ final digits = RegExp(r'[0-9]').hasMatch(value);
49
+ final symbols = RegExp(r'[^A-Za-z0-9]').hasMatch(value);
50
+ final variety = <bool>[lower, upper, digits, symbols]
51
+ .where((item) => item)
52
+ .length;
53
+ final normalized = value.toLowerCase();
54
+ final userHints = <String>{
55
+ username.trim().toLowerCase(),
56
+ email.trim().toLowerCase(),
57
+ email.trim().toLowerCase().split('@').first,
58
+ }.where((item) => item.length >= 3);
59
+ final containsUserInfo = userHints.any(normalized.contains);
60
+ final obviousPattern =
61
+ RegExp(r'(.)\1\1').hasMatch(value) ||
62
+ normalized.contains('password') ||
63
+ normalized.contains('123456') ||
64
+ normalized.contains('qwerty') ||
65
+ normalized.contains('letmein') ||
66
+ normalized.contains('welcome') ||
67
+ normalized.contains('admin') ||
68
+ normalized.contains('neoagent') ||
69
+ hasSequentialPattern(normalized);
70
+
71
+ var score = 0;
72
+ if (value.length >= 8) score += 1;
73
+ if (value.length >= 12) score += 1;
74
+ if (variety >= 3) score += 1;
75
+ if (variety == 4 || value.length >= 16) score += 1;
76
+ if (containsUserInfo || obviousPattern) score -= 1;
77
+
78
+ return PasswordStrengthEvaluation(
79
+ score: score.clamp(0, 4),
80
+ containsUserInfo: containsUserInfo,
81
+ obviousPattern: obviousPattern,
82
+ hasMinimumLength: value.length >= 8,
83
+ );
84
+ }
@@ -41,17 +41,17 @@ class NeoAgentPalette {
41
41
  }
42
42
 
43
43
  const NeoAgentPalette darkPalette = NeoAgentPalette(
44
- bgPrimary: Color(0xFF071015),
45
- bgSecondary: Color(0xFF0E171E),
46
- bgTertiary: Color(0xFF15232B),
47
- bgCard: Color(0xFF16212A),
44
+ bgPrimary: Color(0xFF061015),
45
+ bgSecondary: Color(0xFF0B1820),
46
+ bgTertiary: Color(0xFF112733),
47
+ bgCard: Color(0xFF142430),
48
48
  textPrimary: Color(0xFFF5EFE4),
49
49
  textSecondary: Color(0xFFD2D7DC),
50
50
  textMuted: Color(0xFF95A0A8),
51
- accent: Color(0xFFC7A36A),
52
- accentHover: Color(0xFFE4C58D),
53
- accentAlt: Color(0xFF5FA897),
54
- accentMuted: Color(0x24C7A36A),
51
+ accent: Color(0xFFFFC857),
52
+ accentHover: Color(0xFFFFE29A),
53
+ accentAlt: Color(0xFF30D5C8),
54
+ accentMuted: Color(0x2EFFC857),
55
55
  border: Color(0x30576875),
56
56
  borderLight: Color(0x4A7B8D99),
57
57
  success: Color(0xFF37B67E),
@@ -61,17 +61,17 @@ const NeoAgentPalette darkPalette = NeoAgentPalette(
61
61
  );
62
62
 
63
63
  const NeoAgentPalette lightPalette = NeoAgentPalette(
64
- bgPrimary: Color(0xFFF3F0EB),
65
- bgSecondary: Color(0xFFEAE4DA),
66
- bgTertiary: Color(0xFFDED6CA),
64
+ bgPrimary: Color(0xFFF4F0E9),
65
+ bgSecondary: Color(0xFFEDE5D9),
66
+ bgTertiary: Color(0xFFDDD4C5),
67
67
  bgCard: Color(0xFFFFFEFC),
68
68
  textPrimary: Color(0xFF16181D),
69
69
  textSecondary: Color(0xFF444A55),
70
70
  textMuted: Color(0xFF727987),
71
- accent: Color(0xFF8F6D3E),
72
- accentHover: Color(0xFFAF8750),
73
- accentAlt: Color(0xFF2F7D6E),
74
- accentMuted: Color(0x1F8F6D3E),
71
+ accent: Color(0xFFB47716),
72
+ accentHover: Color(0xFFD69324),
73
+ accentAlt: Color(0xFF128B86),
74
+ accentMuted: Color(0x24B47716),
75
75
  border: Color(0x223F4652),
76
76
  borderLight: Color(0x3847505D),
77
77
  success: Color(0xFF1F8C58),
@@ -56,5 +56,8 @@ flutter:
56
56
  - web/icons/Icon-192.png
57
57
  - assets/branding/app_icon_256.png
58
58
  - assets/branding/app_icon_512.png
59
+ - assets/branding/app_icon_light_256.png
60
+ - assets/branding/app_icon_light_512.png
59
61
  - assets/branding/tray_icon_template.png
62
+ - assets/branding/tray_icon_light_template.png
60
63
  - assets/branding/onboarding_intro.mp4
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32">
2
+ <image width="32" height="32" xlink:href="data:image/png;base64,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"/>
3
+ </svg>