neoagent 2.3.1-beta.58 → 2.3.1-beta.59

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.
@@ -32,42 +32,8 @@ class _OnboardingMessagingStepState extends State<OnboardingMessagingStep> {
32
32
  step: 2,
33
33
  totalSteps: 4,
34
34
  eyebrow: 'COMMUNICATION',
35
- title: 'Connect the channels\nyou actually use.',
36
- description:
37
- 'Choose one messaging surface to start. NeoOS can prepare context, monitor the right signals, and keep the interaction layer close to your real workflow.',
38
- sidePanel: OnboardingPanel(
39
- child: Column(
40
- crossAxisAlignment: CrossAxisAlignment.start,
41
- children: <Widget>[
42
- const Text(
43
- 'Setup principle',
44
- style: TextStyle(
45
- color: Colors.white,
46
- fontSize: 20,
47
- fontWeight: FontWeight.w800,
48
- ),
49
- ),
50
- const SizedBox(height: 10),
51
- Text(
52
- 'Start with one high-value integration first. The product feels smarter when the first connection is relevant, not exhaustive.',
53
- style: TextStyle(
54
- color: Colors.white.withValues(alpha: 0.72),
55
- fontSize: 15,
56
- height: 1.5,
57
- ),
58
- ),
59
- const SizedBox(height: 18),
60
- const Wrap(
61
- spacing: 12,
62
- runSpacing: 12,
63
- children: <Widget>[
64
- OnboardingMetricPill(label: 'Signal', value: 'Relevant only'),
65
- OnboardingMetricPill(label: 'Access', value: 'Configurable'),
66
- ],
67
- ),
68
- ],
69
- ),
70
- ).animate().fadeIn(duration: 600.ms, delay: 200.ms),
35
+ title: 'Connect a\nmessaging platform.',
36
+ description: 'Choose one to get started now. You can add more later.',
71
37
  footer: Row(
72
38
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
73
39
  children: <Widget>[
@@ -113,17 +79,7 @@ class _OnboardingMessagingStepState extends State<OnboardingMessagingStep> {
113
79
  separatorBuilder: (_, __) => const SizedBox(height: 14),
114
80
  itemBuilder: (context, index) {
115
81
  if (index == platforms.length) {
116
- return Padding(
117
- padding: const EdgeInsets.only(top: 10, bottom: 10),
118
- child: Text(
119
- 'More providers stay available later in Settings.',
120
- style: TextStyle(
121
- color: Colors.white.withValues(alpha: 0.52),
122
- fontSize: 14,
123
- fontWeight: FontWeight.w600,
124
- ),
125
- ),
126
- );
82
+ return const SizedBox.shrink();
127
83
  }
128
84
 
129
85
  final platform = platforms[index];
@@ -78,45 +78,8 @@ class _OnboardingModelStepState extends State<OnboardingModelStep> {
78
78
  step: 3,
79
79
  totalSteps: 4,
80
80
  eyebrow: 'INTELLIGENCE',
81
- title: 'Choose the model\nthat should feel like default.',
82
- description:
83
- 'This selection shapes the tone of the product from the first message onward. You can change it later, but the first default should already feel intentional.',
84
- sidePanel: OnboardingPanel(
85
- child: Column(
86
- crossAxisAlignment: CrossAxisAlignment.start,
87
- children: <Widget>[
88
- const Text(
89
- 'Selection notes',
90
- style: TextStyle(
91
- color: Colors.white,
92
- fontSize: 20,
93
- fontWeight: FontWeight.w800,
94
- ),
95
- ),
96
- const SizedBox(height: 10),
97
- Text(
98
- 'Favor the model you want to live with every day. Speed, tone, and reliability matter more here than benchmark theater.',
99
- style: TextStyle(
100
- color: Colors.white.withValues(alpha: 0.72),
101
- fontSize: 15,
102
- height: 1.5,
103
- ),
104
- ),
105
- const SizedBox(height: 18),
106
- const Wrap(
107
- spacing: 12,
108
- runSpacing: 12,
109
- children: <Widget>[
110
- OnboardingMetricPill(label: 'Priority', value: 'Daily default'),
111
- OnboardingMetricPill(
112
- label: 'Flexibility',
113
- value: 'Editable later',
114
- ),
115
- ],
116
- ),
117
- ],
118
- ),
119
- ).animate().fadeIn(duration: 620.ms, delay: 220.ms),
81
+ title: 'Choose your\ndefault model.',
82
+ description: 'Pick the model NeoOS should use by default.',
120
83
  footer: Row(
121
84
  mainAxisAlignment: MainAxisAlignment.end,
122
85
  children: <Widget>[
@@ -75,48 +75,55 @@ class _OnboardingVideoStepState extends State<OnboardingVideoStep> {
75
75
  final orientation = MediaQuery.orientationOf(context);
76
76
 
77
77
  if (_hasError) {
78
- return OnboardingScaffold(
79
- step: 0,
80
- totalSteps: 4,
81
- eyebrow: 'INTRO',
82
- title: 'A cinematic intro belongs here.',
83
- description:
84
- 'If the video asset is unavailable, the experience falls back cleanly so setup never feels broken or unfinished.',
85
- sidePanel: const _VideoFallbackPanel(),
86
- footer: Row(
87
- mainAxisAlignment: MainAxisAlignment.end,
88
- children: <Widget>[
89
- OnboardingPrimaryButton(
90
- label: 'Continue',
91
- icon: Icons.arrow_forward_rounded,
92
- onPressed: widget.onComplete,
78
+ return Scaffold(
79
+ backgroundColor: Colors.black,
80
+ body: Center(
81
+ child: Padding(
82
+ padding: const EdgeInsets.all(32),
83
+ child: Column(
84
+ mainAxisSize: MainAxisSize.min,
85
+ children: <Widget>[
86
+ const Icon(
87
+ Icons.play_circle_outline_rounded,
88
+ color: Colors.white70,
89
+ size: 56,
90
+ ),
91
+ const SizedBox(height: 18),
92
+ const Text(
93
+ 'Continue to setup',
94
+ style: TextStyle(
95
+ color: Colors.white,
96
+ fontSize: 26,
97
+ fontWeight: FontWeight.w800,
98
+ ),
99
+ ),
100
+ const SizedBox(height: 12),
101
+ Text(
102
+ 'The intro is not available on this device.',
103
+ textAlign: TextAlign.center,
104
+ style: TextStyle(
105
+ color: Colors.white.withValues(alpha: 0.68),
106
+ fontSize: 15,
107
+ height: 1.5,
108
+ ),
109
+ ),
110
+ const SizedBox(height: 28),
111
+ OnboardingPrimaryButton(
112
+ label: 'Continue',
113
+ icon: Icons.arrow_forward_rounded,
114
+ onPressed: widget.onComplete,
115
+ ),
116
+ ],
93
117
  ),
94
- ],
118
+ ),
95
119
  ),
96
- child: const SizedBox.shrink(),
97
120
  );
98
121
  }
99
122
 
100
123
  if (!_isInitialized || _controller == null) {
101
- return OnboardingScaffold(
102
- step: 0,
103
- totalSteps: 4,
104
- eyebrow: 'INTRO',
105
- title: 'Preparing the opening sequence.',
106
- description:
107
- 'The first impression should feel immediate and polished, so the transition in is staged before the rest of setup appears.',
108
- sidePanel: const _VideoFallbackPanel(),
109
- footer: Row(
110
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
111
- children: <Widget>[
112
- OnboardingGhostButton(
113
- label: 'Skip intro',
114
- onPressed: widget.onComplete,
115
- ),
116
- const SizedBox.shrink(),
117
- ],
118
- ),
119
- child: const Center(child: CircularProgressIndicator()),
124
+ return const Scaffold(
125
+ backgroundColor: Colors.black,
126
+ body: Center(child: CircularProgressIndicator(color: Colors.white)),
120
127
  );
121
128
  }
122
129
 
@@ -127,108 +134,46 @@ class _OnboardingVideoStepState extends State<OnboardingVideoStep> {
127
134
  _controller!.play();
128
135
  }
129
136
 
130
- return OnboardingScaffold(
131
- step: 0,
132
- totalSteps: 4,
133
- eyebrow: 'INTRO',
134
- title: 'See the product\nbefore you configure it.',
135
- description:
136
- 'The opening sequence sets tone and expectation: quiet motion, deliberate materials, and a system that feels already alive.',
137
- dense: true,
138
- sidePanel: Wrap(
139
- spacing: 12,
140
- runSpacing: 12,
141
- children: const <Widget>[
142
- OnboardingMetricPill(label: 'Feel', value: 'Editorial motion'),
143
- OnboardingMetricPill(label: 'Pacing', value: 'Fast, never rushed'),
144
- ],
145
- ).animate().fadeIn(duration: 500.ms, delay: 220.ms),
146
- footer: Row(
147
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
148
- children: <Widget>[
149
- OnboardingGhostButton(
150
- label: 'Skip intro',
151
- onPressed: widget.onComplete,
152
- ),
153
- Text(
154
- 'Auto-continues when the video ends',
155
- style: TextStyle(
156
- color: Colors.white.withValues(alpha: 0.56),
157
- fontSize: 13,
158
- fontWeight: FontWeight.w600,
159
- ),
160
- ),
161
- ],
162
- ),
163
- child: portrait
137
+ return Scaffold(
138
+ backgroundColor: Colors.black,
139
+ body: portrait
164
140
  ? const _RotatePrompt()
165
- : ClipRRect(
166
- borderRadius: BorderRadius.circular(28),
167
- child: Stack(
168
- fit: StackFit.expand,
169
- children: <Widget>[
170
- DecoratedBox(
171
- decoration: BoxDecoration(
172
- borderRadius: BorderRadius.circular(28),
173
- color: const Color(0xFF060709),
174
- ),
175
- child: FittedBox(
176
- fit: BoxFit.cover,
177
- child: SizedBox(
178
- width: _controller!.value.size.width,
179
- height: _controller!.value.size.height,
180
- child: VideoPlayer(_controller!),
181
- ),
182
- ),
141
+ : Stack(
142
+ fit: StackFit.expand,
143
+ children: <Widget>[
144
+ FittedBox(
145
+ fit: BoxFit.cover,
146
+ child: SizedBox(
147
+ width: _controller!.value.size.width,
148
+ height: _controller!.value.size.height,
149
+ child: VideoPlayer(_controller!),
183
150
  ),
184
- Positioned.fill(
185
- child: DecoratedBox(
186
- decoration: BoxDecoration(
187
- gradient: LinearGradient(
188
- colors: <Color>[
189
- Colors.black.withValues(alpha: 0.04),
190
- Colors.transparent,
191
- Colors.black.withValues(alpha: 0.42),
192
- ],
193
- begin: Alignment.topCenter,
194
- end: Alignment.bottomCenter,
195
- ),
151
+ ),
152
+ Positioned.fill(
153
+ child: DecoratedBox(
154
+ decoration: BoxDecoration(
155
+ gradient: LinearGradient(
156
+ colors: <Color>[
157
+ Colors.transparent,
158
+ Colors.transparent,
159
+ Colors.black.withValues(alpha: 0.22),
160
+ ],
161
+ begin: Alignment.topCenter,
162
+ end: Alignment.bottomCenter,
196
163
  ),
197
164
  ),
198
165
  ),
199
- ],
200
- ),
201
- ).animate().fadeIn(duration: 700.ms).scaleXY(begin: 0.98, end: 1),
202
- );
203
- }
204
- }
205
-
206
- class _VideoFallbackPanel extends StatelessWidget {
207
- const _VideoFallbackPanel();
208
-
209
- @override
210
- Widget build(BuildContext context) {
211
- return const OnboardingPanel(
212
- child: Column(
213
- crossAxisAlignment: CrossAxisAlignment.start,
214
- children: <Widget>[
215
- Icon(Icons.movie_creation_outlined, color: Colors.white, size: 30),
216
- SizedBox(height: 16),
217
- Text(
218
- 'Fallback mode',
219
- style: TextStyle(
220
- color: Colors.white,
221
- fontSize: 22,
222
- fontWeight: FontWeight.w800,
166
+ ),
167
+ Positioned(
168
+ top: 28,
169
+ right: 28,
170
+ child: OnboardingGhostButton(
171
+ label: 'Skip',
172
+ onPressed: widget.onComplete,
173
+ ).animate().fadeIn(duration: 280.ms, delay: 220.ms),
174
+ ),
175
+ ],
223
176
  ),
224
- ),
225
- SizedBox(height: 10),
226
- Text(
227
- 'Paste a real `onboarding_intro.mp4` into `assets/branding/` to restore the cinematic first step.',
228
- style: TextStyle(color: Colors.white70, fontSize: 15, height: 1.5),
229
- ),
230
- ],
231
- ),
232
177
  );
233
178
  }
234
179
  }
@@ -239,14 +184,15 @@ class _RotatePrompt extends StatelessWidget {
239
184
  @override
240
185
  Widget build(BuildContext context) {
241
186
  return Center(
242
- child: OnboardingPanel(
187
+ child: Padding(
188
+ padding: const EdgeInsets.all(32),
243
189
  child: Column(
244
190
  mainAxisSize: MainAxisSize.min,
245
191
  children: <Widget>[
246
192
  const Icon(Icons.screen_rotation, color: Colors.white, size: 54),
247
193
  const SizedBox(height: 18),
248
194
  const Text(
249
- 'Rotate for the full-screen intro',
195
+ 'Rotate to continue',
250
196
  textAlign: TextAlign.center,
251
197
  style: TextStyle(
252
198
  color: Colors.white,
@@ -256,7 +202,7 @@ class _RotatePrompt extends StatelessWidget {
256
202
  ),
257
203
  const SizedBox(height: 10),
258
204
  Text(
259
- 'The opening video is composed for landscape so it feels cinematic instead of cramped.',
205
+ 'This intro is designed for full-screen landscape playback.',
260
206
  textAlign: TextAlign.center,
261
207
  style: TextStyle(
262
208
  color: Colors.white.withValues(alpha: 0.7),
@@ -14,10 +14,8 @@ class OnboardingWelcomeStep extends StatelessWidget {
14
14
  step: 1,
15
15
  totalSteps: 4,
16
16
  eyebrow: 'WELCOME',
17
- title: 'A private\noperating layer\nfor your day.',
18
- description:
19
- 'NeoOS watches the right signals, stays out of the way, and surfaces context exactly when you need it. The experience should feel calm, tactile, and immediate.',
20
- sidePanel: _WelcomeSidePanel(),
17
+ title: 'Welcome to\nNeoOS',
18
+ description: 'Your assistant layer for capture, context, and action.',
21
19
  footer: Row(
22
20
  mainAxisAlignment: MainAxisAlignment.end,
23
21
  children: <Widget>[
@@ -33,74 +31,16 @@ class OnboardingWelcomeStep extends StatelessWidget {
33
31
  ),
34
32
  child: Align(
35
33
  alignment: Alignment.topLeft,
36
- child: Wrap(
37
- spacing: 14,
38
- runSpacing: 14,
39
- children: const <Widget>[
40
- OnboardingMetricPill(label: 'Memory', value: 'Context retained'),
41
- OnboardingMetricPill(
42
- label: 'Privacy',
43
- value: 'Local-first controls',
44
- ),
45
- OnboardingMetricPill(
46
- label: 'Automation',
47
- value: 'Reactive by design',
48
- ),
49
- ],
34
+ child: Text(
35
+ 'Set up your workspace in a few steps and start using NeoOS immediately.',
36
+ style: TextStyle(
37
+ color: Colors.white.withValues(alpha: 0.72),
38
+ fontSize: 18,
39
+ height: 1.55,
40
+ fontWeight: FontWeight.w500,
41
+ ),
50
42
  ).animate().fadeIn(duration: 600.ms, delay: 380.ms),
51
43
  ),
52
44
  );
53
45
  }
54
46
  }
55
-
56
- class _WelcomeSidePanel extends StatelessWidget {
57
- @override
58
- Widget build(BuildContext context) {
59
- final accent = Theme.of(context).colorScheme.primary;
60
- return OnboardingPanel(
61
- padding: const EdgeInsets.all(22),
62
- child: Column(
63
- crossAxisAlignment: CrossAxisAlignment.start,
64
- children: <Widget>[
65
- Container(
66
- width: 54,
67
- height: 54,
68
- decoration: BoxDecoration(
69
- gradient: LinearGradient(
70
- colors: <Color>[accent, const Color(0xFF6EDBFF)],
71
- begin: Alignment.topLeft,
72
- end: Alignment.bottomRight,
73
- ),
74
- borderRadius: BorderRadius.circular(18),
75
- ),
76
- child: const Icon(
77
- Icons.layers_rounded,
78
- color: Colors.white,
79
- size: 28,
80
- ),
81
- ),
82
- const SizedBox(height: 18),
83
- const Text(
84
- 'Designed to feel premium,\nnot noisy.',
85
- style: TextStyle(
86
- color: Colors.white,
87
- fontSize: 24,
88
- height: 1.15,
89
- fontWeight: FontWeight.w800,
90
- letterSpacing: -0.6,
91
- ),
92
- ),
93
- const SizedBox(height: 12),
94
- Text(
95
- 'Borrowing from Apple’s hierarchy guidance: stronger content contrast, fewer competing layers, and motion that explains rather than distracts.',
96
- style: TextStyle(
97
- color: Colors.white.withValues(alpha: 0.7),
98
- fontSize: 15,
99
- height: 1.5,
100
- ),
101
- ),
102
- ],
103
- ),
104
- ).animate().fadeIn(duration: 700.ms, delay: 260.ms).slideX(begin: 0.12);
105
- }
106
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoagent",
3
- "version": "2.3.1-beta.58",
3
+ "version": "2.3.1-beta.59",
4
4
  "description": "Proactive personal AI agent with no limits",
5
5
  "license": "MIT",
6
6
  "main": "server/index.js",
@@ -1 +1 @@
1
- 93cd7bc75cf0c5ecf37725d2813d4536
1
+ 154775e7dc374e782403c776404afd0b
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"42d3d75a56efe1a2e9902f52dc8006099c45d9
37
37
 
38
38
  _flutter.loader.load({
39
39
  serviceWorkerSettings: {
40
- serviceWorkerVersion: "678216660" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
40
+ serviceWorkerVersion: "3080522326" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
41
41
  }
42
42
  });