letfixit 0.1.0
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.
- package/.env.example +33 -0
- package/README.md +226 -0
- package/adapters/android/build.gradle +28 -0
- package/adapters/android/src/main/kotlin/dev/perfanalyzer/ChoreographerAdapter.kt +43 -0
- package/adapters/android/src/main/kotlin/dev/perfanalyzer/LogcatReader.kt +64 -0
- package/adapters/android/src/main/kotlin/dev/perfanalyzer/MemoryObserver.kt +46 -0
- package/adapters/android/src/main/kotlin/dev/perfanalyzer/OkHttpInterceptor.kt +53 -0
- package/adapters/android/src/main/kotlin/dev/perfanalyzer/PerfAnalyzer.kt +100 -0
- package/adapters/flutter/lib/perf_analyzer.dart +73 -0
- package/adapters/flutter/lib/src/frame_observer.dart +45 -0
- package/adapters/flutter/lib/src/network_observer.dart +72 -0
- package/adapters/flutter/lib/src/rebuild_observer.dart +57 -0
- package/adapters/flutter/lib/src/universal_event.dart +50 -0
- package/adapters/flutter/lib/src/vm_service_adapter.dart +81 -0
- package/adapters/flutter/pubspec.lock +184 -0
- package/adapters/flutter/pubspec.yaml +13 -0
- package/config/model.manifest.example.json +108 -0
- package/config/model.manifest.json +108 -0
- package/core/schema/universal_event.dart +63 -0
- package/dashboard/dist/assets/index-D5TCSsvB.js +107 -0
- package/dashboard/dist/index.html +118 -0
- package/package.json +62 -0
- package/scripts/encrypt-model.js +86 -0
- package/scripts/fill-manifest.js +67 -0
- package/scripts/load-env.js +20 -0
- package/scripts/model_crypto.js +14 -0
- package/scripts/setup-model.js +269 -0
- package/server/adb_bridge.js +201 -0
- package/server/adb_score.js +77 -0
- package/server/ai_proxy.js +373 -0
- package/server/analysis_engine.js +222 -0
- package/server/android_bridge.js +124 -0
- package/server/android_live.js +167 -0
- package/server/data/device_gpu_db.json +465 -0
- package/server/device_db.js +94 -0
- package/server/device_review.js +146 -0
- package/server/finding_generator.js +56 -0
- package/server/flutter_bridge.js +414 -0
- package/server/index.js +619 -0
- package/server/ios_bridge.js +181 -0
- package/server/model_config.js +54 -0
- package/server/report_template.js +169 -0
- package/server/session_manager.js +370 -0
- package/server/widget_gpu_classifier.js +77 -0
- package/server/widget_triage.js +78 -0
- package/setup.sh +160 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import 'dart:async';
|
|
2
|
+
import 'universal_event.dart';
|
|
3
|
+
import 'vm_service_adapter.dart';
|
|
4
|
+
|
|
5
|
+
class FrameObserver {
|
|
6
|
+
final VMServiceAdapter _adapter;
|
|
7
|
+
final _controller = StreamController<UniversalEvent>.broadcast();
|
|
8
|
+
final List<double> _frameBuffer = [];
|
|
9
|
+
int _jankCount = 0;
|
|
10
|
+
|
|
11
|
+
Stream<UniversalEvent> get events => _controller.stream;
|
|
12
|
+
int get jankCount => _jankCount;
|
|
13
|
+
|
|
14
|
+
FrameObserver(this._adapter) {
|
|
15
|
+
_adapter.eventStream
|
|
16
|
+
.where((e) => e.event == 'frame')
|
|
17
|
+
.listen(_process);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
void _process(UniversalEvent e) {
|
|
21
|
+
final ms = (e.metric['value'] as num).toDouble();
|
|
22
|
+
_frameBuffer.add(ms);
|
|
23
|
+
if (_frameBuffer.length > 60) _frameBuffer.removeAt(0);
|
|
24
|
+
if (ms > 16.6) _jankCount++;
|
|
25
|
+
|
|
26
|
+
final avg = _frameBuffer.reduce((a, b) => a + b) / _frameBuffer.length;
|
|
27
|
+
final fps = (1000.0 / avg).clamp(0.0, 120.0);
|
|
28
|
+
|
|
29
|
+
_controller.add(UniversalEvent(
|
|
30
|
+
platform: e.platform,
|
|
31
|
+
event: 'frame',
|
|
32
|
+
timestamp: e.timestamp,
|
|
33
|
+
severity: e.severity,
|
|
34
|
+
metric: {
|
|
35
|
+
...e.metric,
|
|
36
|
+
'fps': double.parse(fps.toStringAsFixed(1)),
|
|
37
|
+
'jankCount': _jankCount,
|
|
38
|
+
},
|
|
39
|
+
context: e.context,
|
|
40
|
+
raw: e.raw,
|
|
41
|
+
));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
void dispose() => _controller.close();
|
|
45
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import 'dart:async';
|
|
2
|
+
import 'package:http/http.dart' as http;
|
|
3
|
+
import 'universal_event.dart';
|
|
4
|
+
|
|
5
|
+
class PerfHttpClient extends http.BaseClient {
|
|
6
|
+
final http.Client _inner;
|
|
7
|
+
final void Function(UniversalEvent) _onEvent;
|
|
8
|
+
|
|
9
|
+
PerfHttpClient({http.Client? inner, required void Function(UniversalEvent) onEvent})
|
|
10
|
+
: _inner = inner ?? http.Client(),
|
|
11
|
+
_onEvent = onEvent;
|
|
12
|
+
|
|
13
|
+
@override
|
|
14
|
+
Future<http.StreamedResponse> send(http.BaseRequest request) async {
|
|
15
|
+
final start = DateTime.now().millisecondsSinceEpoch;
|
|
16
|
+
final streamed = await _inner.send(request);
|
|
17
|
+
final bytes = await streamed.stream.toBytes();
|
|
18
|
+
final duration = DateTime.now().millisecondsSinceEpoch - start;
|
|
19
|
+
final size = bytes.length;
|
|
20
|
+
|
|
21
|
+
_onEvent(UniversalEvent(
|
|
22
|
+
platform: 'flutter',
|
|
23
|
+
event: 'api',
|
|
24
|
+
timestamp: DateTime.now().millisecondsSinceEpoch,
|
|
25
|
+
severity: size > 512000 ? 'high' : duration > 500 ? 'medium' : 'low',
|
|
26
|
+
metric: {
|
|
27
|
+
'value': size,
|
|
28
|
+
'unit': 'bytes',
|
|
29
|
+
'budget': 512000,
|
|
30
|
+
'exceededBy': size > 512000 ? size - 512000 : 0,
|
|
31
|
+
'durationMs': duration,
|
|
32
|
+
'url': request.url.toString(),
|
|
33
|
+
'method': request.method,
|
|
34
|
+
'status': streamed.statusCode,
|
|
35
|
+
},
|
|
36
|
+
context: {},
|
|
37
|
+
));
|
|
38
|
+
|
|
39
|
+
return http.StreamedResponse(
|
|
40
|
+
Stream.value(bytes),
|
|
41
|
+
streamed.statusCode,
|
|
42
|
+
contentLength: bytes.length,
|
|
43
|
+
request: streamed.request,
|
|
44
|
+
headers: streamed.headers,
|
|
45
|
+
isRedirect: streamed.isRedirect,
|
|
46
|
+
persistentConnection: streamed.persistentConnection,
|
|
47
|
+
reasonPhrase: streamed.reasonPhrase,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@override
|
|
52
|
+
void close() {
|
|
53
|
+
_inner.close();
|
|
54
|
+
super.close();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class NetworkObserver {
|
|
59
|
+
final _controller = StreamController<UniversalEvent>.broadcast();
|
|
60
|
+
late final PerfHttpClient client;
|
|
61
|
+
|
|
62
|
+
Stream<UniversalEvent> get events => _controller.stream;
|
|
63
|
+
|
|
64
|
+
NetworkObserver() {
|
|
65
|
+
client = PerfHttpClient(onEvent: (e) => _controller.add(e));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void dispose() {
|
|
69
|
+
client.close();
|
|
70
|
+
_controller.close();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import 'dart:async';
|
|
2
|
+
import 'universal_event.dart';
|
|
3
|
+
import 'vm_service_adapter.dart';
|
|
4
|
+
|
|
5
|
+
class RebuildObserver {
|
|
6
|
+
final VMServiceAdapter _adapter;
|
|
7
|
+
final _controller = StreamController<UniversalEvent>.broadcast();
|
|
8
|
+
final Map<String, int> _counts = {};
|
|
9
|
+
Timer? _flushTimer;
|
|
10
|
+
|
|
11
|
+
Stream<UniversalEvent> get events => _controller.stream;
|
|
12
|
+
|
|
13
|
+
RebuildObserver(this._adapter) {
|
|
14
|
+
_adapter.eventStream
|
|
15
|
+
.where((e) => e.event == 'rebuild')
|
|
16
|
+
.listen(_process);
|
|
17
|
+
_flushTimer = Timer.periodic(const Duration(seconds: 1), (_) => _flush());
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
void _process(UniversalEvent e) {
|
|
21
|
+
final widget = e.widget ?? 'Unknown';
|
|
22
|
+
_counts[widget] = (_counts[widget] ?? 0) + 1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void _flush() {
|
|
26
|
+
if (_counts.isEmpty) return;
|
|
27
|
+
_counts.forEach((widget, count) {
|
|
28
|
+
final severity = count > 30
|
|
29
|
+
? 'critical'
|
|
30
|
+
: count > 15
|
|
31
|
+
? 'high'
|
|
32
|
+
: count > 10
|
|
33
|
+
? 'medium'
|
|
34
|
+
: 'low';
|
|
35
|
+
_controller.add(UniversalEvent(
|
|
36
|
+
platform: 'flutter',
|
|
37
|
+
event: 'rebuild',
|
|
38
|
+
timestamp: DateTime.now().millisecondsSinceEpoch,
|
|
39
|
+
severity: severity,
|
|
40
|
+
widget: widget,
|
|
41
|
+
metric: {
|
|
42
|
+
'value': count,
|
|
43
|
+
'unit': 'rebuilds/s',
|
|
44
|
+
'budget': 10,
|
|
45
|
+
'exceededBy': count > 10 ? count - 10 : 0,
|
|
46
|
+
},
|
|
47
|
+
context: {},
|
|
48
|
+
));
|
|
49
|
+
});
|
|
50
|
+
_counts.clear();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
void dispose() {
|
|
54
|
+
_flushTimer?.cancel();
|
|
55
|
+
_controller.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
class UniversalEvent {
|
|
2
|
+
final String platform;
|
|
3
|
+
final String event;
|
|
4
|
+
final int timestamp;
|
|
5
|
+
final String severity;
|
|
6
|
+
final String? widget;
|
|
7
|
+
final Map<String, dynamic> metric;
|
|
8
|
+
final Map<String, dynamic> context;
|
|
9
|
+
final Map<String, dynamic>? raw;
|
|
10
|
+
|
|
11
|
+
UniversalEvent({
|
|
12
|
+
required this.platform,
|
|
13
|
+
required this.event,
|
|
14
|
+
required this.timestamp,
|
|
15
|
+
required this.severity,
|
|
16
|
+
this.widget,
|
|
17
|
+
required this.metric,
|
|
18
|
+
required this.context,
|
|
19
|
+
this.raw,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
Map<String, dynamic> toJson() => {
|
|
23
|
+
'platform': platform,
|
|
24
|
+
'event': event,
|
|
25
|
+
'timestamp': timestamp,
|
|
26
|
+
'severity': severity,
|
|
27
|
+
'widget': widget,
|
|
28
|
+
'metric': metric,
|
|
29
|
+
'context': context,
|
|
30
|
+
if (raw != null) 'raw': raw,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
class PerfConfig {
|
|
35
|
+
final String? groqKey;
|
|
36
|
+
final String? geminiKey;
|
|
37
|
+
final String? claudeKey;
|
|
38
|
+
final int port;
|
|
39
|
+
final bool enableLocalAI;
|
|
40
|
+
final int localAIPort;
|
|
41
|
+
|
|
42
|
+
const PerfConfig({
|
|
43
|
+
this.groqKey,
|
|
44
|
+
this.geminiKey,
|
|
45
|
+
this.claudeKey,
|
|
46
|
+
this.port = 8081,
|
|
47
|
+
this.enableLocalAI = true,
|
|
48
|
+
this.localAIPort = 8080,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import 'dart:async';
|
|
2
|
+
import 'package:vm_service/vm_service.dart';
|
|
3
|
+
import 'package:vm_service/vm_service_io.dart';
|
|
4
|
+
import 'universal_event.dart';
|
|
5
|
+
|
|
6
|
+
class VMServiceAdapter {
|
|
7
|
+
VmService? _service;
|
|
8
|
+
final _controller = StreamController<UniversalEvent>.broadcast();
|
|
9
|
+
|
|
10
|
+
Stream<UniversalEvent> get eventStream => _controller.stream;
|
|
11
|
+
|
|
12
|
+
Future<void> connect({String uri = 'ws://127.0.0.1:8181/ws'}) async {
|
|
13
|
+
_service = await vmServiceConnectUri(uri);
|
|
14
|
+
|
|
15
|
+
await _service!.streamListen(EventStreams.kExtension);
|
|
16
|
+
await _service!.streamListen(EventStreams.kTimeline);
|
|
17
|
+
await _service!.streamListen(EventStreams.kIsolate);
|
|
18
|
+
|
|
19
|
+
_service!.onExtensionEvent.listen(_handleExtensionEvent);
|
|
20
|
+
_service!.onTimelineEvent.listen(_handleTimelineEvent);
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
await _service!.setVMTimelineFlags(['Dart', 'Embedder']);
|
|
24
|
+
} catch (_) {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
void _handleExtensionEvent(Event event) {
|
|
28
|
+
if (event.extensionKind != '_Flutter.FrameEnd') return;
|
|
29
|
+
final d = event.extensionData?.data ?? {};
|
|
30
|
+
final buildUs = (d['build'] as num?)?.toDouble() ?? 0.0;
|
|
31
|
+
final layoutUs = (d['layout'] as num?)?.toDouble() ?? 0.0;
|
|
32
|
+
final paintUs = (d['paint'] as num?)?.toDouble() ?? 0.0;
|
|
33
|
+
final totalMs = (buildUs + layoutUs + paintUs) / 1000.0;
|
|
34
|
+
|
|
35
|
+
_controller.add(UniversalEvent(
|
|
36
|
+
platform: 'flutter',
|
|
37
|
+
event: 'frame',
|
|
38
|
+
timestamp: DateTime.now().millisecondsSinceEpoch,
|
|
39
|
+
severity: totalMs > 33 ? 'critical' : totalMs > 16.6 ? 'high' : 'low',
|
|
40
|
+
metric: {
|
|
41
|
+
'value': double.parse(totalMs.toStringAsFixed(2)),
|
|
42
|
+
'unit': 'ms',
|
|
43
|
+
'budget': 16.6,
|
|
44
|
+
'exceededBy': totalMs > 16.6 ? double.parse((totalMs - 16.6).toStringAsFixed(2)) : 0,
|
|
45
|
+
'build': double.parse((buildUs / 1000).toStringAsFixed(2)),
|
|
46
|
+
'layout': double.parse((layoutUs / 1000).toStringAsFixed(2)),
|
|
47
|
+
'paint': double.parse((paintUs / 1000).toStringAsFixed(2)),
|
|
48
|
+
},
|
|
49
|
+
context: {},
|
|
50
|
+
raw: Map<String, dynamic>.from(d),
|
|
51
|
+
));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void _handleTimelineEvent(Event event) {
|
|
55
|
+
final events = event.timelineEvents;
|
|
56
|
+
if (events == null) return;
|
|
57
|
+
for (final e in events) {
|
|
58
|
+
final json = e.json ?? {};
|
|
59
|
+
final name = json['name'] as String? ?? '';
|
|
60
|
+
final phase = json['ph'] as String? ?? '';
|
|
61
|
+
if (!name.startsWith('BUILD') || phase != 'B') continue;
|
|
62
|
+
final args = json['args'] as Map<String, dynamic>? ?? {};
|
|
63
|
+
final widgetName = args['type']?.toString() ?? name.replaceFirst('BUILD', '').trim();
|
|
64
|
+
if (widgetName.isEmpty) continue;
|
|
65
|
+
_controller.add(UniversalEvent(
|
|
66
|
+
platform: 'flutter',
|
|
67
|
+
event: 'rebuild',
|
|
68
|
+
timestamp: DateTime.now().millisecondsSinceEpoch,
|
|
69
|
+
severity: 'medium',
|
|
70
|
+
widget: widgetName,
|
|
71
|
+
metric: {'value': 1, 'unit': 'rebuild', 'budget': 10},
|
|
72
|
+
context: {},
|
|
73
|
+
));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
Future<void> dispose() async {
|
|
78
|
+
await _service?.dispose();
|
|
79
|
+
await _controller.close();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Generated by pub
|
|
2
|
+
# See https://dart.dev/tools/pub/glossary#lockfile
|
|
3
|
+
packages:
|
|
4
|
+
async:
|
|
5
|
+
dependency: transitive
|
|
6
|
+
description:
|
|
7
|
+
name: async
|
|
8
|
+
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
|
|
9
|
+
url: "https://pub.dev"
|
|
10
|
+
source: hosted
|
|
11
|
+
version: "2.13.1"
|
|
12
|
+
characters:
|
|
13
|
+
dependency: transitive
|
|
14
|
+
description:
|
|
15
|
+
name: characters
|
|
16
|
+
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
|
|
17
|
+
url: "https://pub.dev"
|
|
18
|
+
source: hosted
|
|
19
|
+
version: "1.4.0"
|
|
20
|
+
collection:
|
|
21
|
+
dependency: transitive
|
|
22
|
+
description:
|
|
23
|
+
name: collection
|
|
24
|
+
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
|
25
|
+
url: "https://pub.dev"
|
|
26
|
+
source: hosted
|
|
27
|
+
version: "1.19.1"
|
|
28
|
+
crypto:
|
|
29
|
+
dependency: transitive
|
|
30
|
+
description:
|
|
31
|
+
name: crypto
|
|
32
|
+
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
|
|
33
|
+
url: "https://pub.dev"
|
|
34
|
+
source: hosted
|
|
35
|
+
version: "3.0.7"
|
|
36
|
+
flutter:
|
|
37
|
+
dependency: "direct main"
|
|
38
|
+
description: flutter
|
|
39
|
+
source: sdk
|
|
40
|
+
version: "0.0.0"
|
|
41
|
+
http:
|
|
42
|
+
dependency: "direct main"
|
|
43
|
+
description:
|
|
44
|
+
name: http
|
|
45
|
+
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
|
|
46
|
+
url: "https://pub.dev"
|
|
47
|
+
source: hosted
|
|
48
|
+
version: "1.6.0"
|
|
49
|
+
http_parser:
|
|
50
|
+
dependency: transitive
|
|
51
|
+
description:
|
|
52
|
+
name: http_parser
|
|
53
|
+
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
|
54
|
+
url: "https://pub.dev"
|
|
55
|
+
source: hosted
|
|
56
|
+
version: "4.1.2"
|
|
57
|
+
material_color_utilities:
|
|
58
|
+
dependency: transitive
|
|
59
|
+
description:
|
|
60
|
+
name: material_color_utilities
|
|
61
|
+
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
|
|
62
|
+
url: "https://pub.dev"
|
|
63
|
+
source: hosted
|
|
64
|
+
version: "0.11.1"
|
|
65
|
+
meta:
|
|
66
|
+
dependency: transitive
|
|
67
|
+
description:
|
|
68
|
+
name: meta
|
|
69
|
+
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
|
70
|
+
url: "https://pub.dev"
|
|
71
|
+
source: hosted
|
|
72
|
+
version: "1.17.0"
|
|
73
|
+
path:
|
|
74
|
+
dependency: transitive
|
|
75
|
+
description:
|
|
76
|
+
name: path
|
|
77
|
+
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
|
78
|
+
url: "https://pub.dev"
|
|
79
|
+
source: hosted
|
|
80
|
+
version: "1.9.1"
|
|
81
|
+
shelf:
|
|
82
|
+
dependency: "direct main"
|
|
83
|
+
description:
|
|
84
|
+
name: shelf
|
|
85
|
+
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
|
|
86
|
+
url: "https://pub.dev"
|
|
87
|
+
source: hosted
|
|
88
|
+
version: "1.4.2"
|
|
89
|
+
shelf_web_socket:
|
|
90
|
+
dependency: "direct main"
|
|
91
|
+
description:
|
|
92
|
+
name: shelf_web_socket
|
|
93
|
+
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
|
|
94
|
+
url: "https://pub.dev"
|
|
95
|
+
source: hosted
|
|
96
|
+
version: "1.0.4"
|
|
97
|
+
sky_engine:
|
|
98
|
+
dependency: transitive
|
|
99
|
+
description: flutter
|
|
100
|
+
source: sdk
|
|
101
|
+
version: "0.0.0"
|
|
102
|
+
source_span:
|
|
103
|
+
dependency: transitive
|
|
104
|
+
description:
|
|
105
|
+
name: source_span
|
|
106
|
+
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
|
|
107
|
+
url: "https://pub.dev"
|
|
108
|
+
source: hosted
|
|
109
|
+
version: "1.10.2"
|
|
110
|
+
stack_trace:
|
|
111
|
+
dependency: transitive
|
|
112
|
+
description:
|
|
113
|
+
name: stack_trace
|
|
114
|
+
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
|
115
|
+
url: "https://pub.dev"
|
|
116
|
+
source: hosted
|
|
117
|
+
version: "1.12.1"
|
|
118
|
+
stream_channel:
|
|
119
|
+
dependency: transitive
|
|
120
|
+
description:
|
|
121
|
+
name: stream_channel
|
|
122
|
+
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
|
123
|
+
url: "https://pub.dev"
|
|
124
|
+
source: hosted
|
|
125
|
+
version: "2.1.4"
|
|
126
|
+
string_scanner:
|
|
127
|
+
dependency: transitive
|
|
128
|
+
description:
|
|
129
|
+
name: string_scanner
|
|
130
|
+
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
|
131
|
+
url: "https://pub.dev"
|
|
132
|
+
source: hosted
|
|
133
|
+
version: "1.4.1"
|
|
134
|
+
term_glyph:
|
|
135
|
+
dependency: transitive
|
|
136
|
+
description:
|
|
137
|
+
name: term_glyph
|
|
138
|
+
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
|
139
|
+
url: "https://pub.dev"
|
|
140
|
+
source: hosted
|
|
141
|
+
version: "1.2.2"
|
|
142
|
+
typed_data:
|
|
143
|
+
dependency: transitive
|
|
144
|
+
description:
|
|
145
|
+
name: typed_data
|
|
146
|
+
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
|
147
|
+
url: "https://pub.dev"
|
|
148
|
+
source: hosted
|
|
149
|
+
version: "1.4.0"
|
|
150
|
+
vector_math:
|
|
151
|
+
dependency: transitive
|
|
152
|
+
description:
|
|
153
|
+
name: vector_math
|
|
154
|
+
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
|
|
155
|
+
url: "https://pub.dev"
|
|
156
|
+
source: hosted
|
|
157
|
+
version: "2.2.0"
|
|
158
|
+
vm_service:
|
|
159
|
+
dependency: "direct main"
|
|
160
|
+
description:
|
|
161
|
+
name: vm_service
|
|
162
|
+
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
|
163
|
+
url: "https://pub.dev"
|
|
164
|
+
source: hosted
|
|
165
|
+
version: "14.3.1"
|
|
166
|
+
web:
|
|
167
|
+
dependency: transitive
|
|
168
|
+
description:
|
|
169
|
+
name: web
|
|
170
|
+
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
|
|
171
|
+
url: "https://pub.dev"
|
|
172
|
+
source: hosted
|
|
173
|
+
version: "0.5.1"
|
|
174
|
+
web_socket_channel:
|
|
175
|
+
dependency: "direct main"
|
|
176
|
+
description:
|
|
177
|
+
name: web_socket_channel
|
|
178
|
+
sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42"
|
|
179
|
+
url: "https://pub.dev"
|
|
180
|
+
source: hosted
|
|
181
|
+
version: "2.4.5"
|
|
182
|
+
sdks:
|
|
183
|
+
dart: ">=3.8.0-0 <4.0.0"
|
|
184
|
+
flutter: ">=3.10.0"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
name: perf_analyzer
|
|
2
|
+
description: Flutter performance analyzer with AI suggestions
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
environment:
|
|
5
|
+
sdk: '>=3.0.0 <4.0.0'
|
|
6
|
+
flutter: '>=3.10.0'
|
|
7
|
+
dependencies:
|
|
8
|
+
flutter: { sdk: flutter }
|
|
9
|
+
vm_service: ^14.0.0
|
|
10
|
+
shelf: ^1.4.0
|
|
11
|
+
shelf_web_socket: ^1.0.0
|
|
12
|
+
web_socket_channel: ^2.4.0
|
|
13
|
+
http: ^1.0.0
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Ultron n0-beta",
|
|
3
|
+
"algorithm": "aes-256-gcm",
|
|
4
|
+
"salt": "31e4e3752dc130fdb06d1cd414c95fe6",
|
|
5
|
+
"sha256": "67514959734347b17cce57ab75e9e91cd469e57830acbd8ee2a4363060431741",
|
|
6
|
+
"chunks": [
|
|
7
|
+
{
|
|
8
|
+
"index": 0,
|
|
9
|
+
"file": "chunk.00.enc",
|
|
10
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0/chunk.00.enc",
|
|
11
|
+
"mirrors": [],
|
|
12
|
+
"iv": "fcd6ee403d8f8473e23ce821",
|
|
13
|
+
"authTag": "df00715413757710dccfa596c10b8622",
|
|
14
|
+
"sha256": "f22507109a4ac95316fb6cc7766d6c204699b7f5cb922b30194959820f3564dc",
|
|
15
|
+
"bytes": 283707303
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"index": 1,
|
|
19
|
+
"file": "chunk.01.enc",
|
|
20
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0/chunk.01.enc",
|
|
21
|
+
"mirrors": [],
|
|
22
|
+
"iv": "76cf80f7e08f16c0756ea832",
|
|
23
|
+
"authTag": "ab448e19883f295a4642aa0aad402f5d",
|
|
24
|
+
"sha256": "1d519c69732bcfdea0b1c13418446166b3b86ce0faf983f8397bac4618e2a481",
|
|
25
|
+
"bytes": 283707303
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"index": 2,
|
|
29
|
+
"file": "chunk.02.enc",
|
|
30
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0/chunk.02.enc",
|
|
31
|
+
"mirrors": [],
|
|
32
|
+
"iv": "2e60c9812f262867f8e69ba2",
|
|
33
|
+
"authTag": "381826635520ea6d3a518d9fd2dfc736",
|
|
34
|
+
"sha256": "f30d25c7f6407fbf8b1596cf8a378b663269597507b22992d86643ceba305051",
|
|
35
|
+
"bytes": 283707303
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"index": 3,
|
|
39
|
+
"file": "chunk.03.enc",
|
|
40
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0/chunk.03.enc",
|
|
41
|
+
"mirrors": [],
|
|
42
|
+
"iv": "06d919628e95861a7aa0d822",
|
|
43
|
+
"authTag": "082d1e84bc3f604257cb0114fea8ddac",
|
|
44
|
+
"sha256": "c03f4b03f675c8fe84ac66dd8f1d4ffc2e582e1fb58c6d25e40c2be3a5abb55f",
|
|
45
|
+
"bytes": 283707303
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"index": 4,
|
|
49
|
+
"file": "chunk.04.enc",
|
|
50
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0/chunk.04.enc",
|
|
51
|
+
"mirrors": [],
|
|
52
|
+
"iv": "76b1c96051d6bb614aded2c2",
|
|
53
|
+
"authTag": "6d7c8b0a946cf3916e94072236d1efa3",
|
|
54
|
+
"sha256": "42f0cf97147b7ed833a42fbc323fbfe61dadcdab67272c0056f7f50fe9eabe92",
|
|
55
|
+
"bytes": 283707302
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"index": 5,
|
|
59
|
+
"file": "chunk.05.enc",
|
|
60
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0-2/chunk.05.enc",
|
|
61
|
+
"mirrors": [],
|
|
62
|
+
"iv": "a1e775f8617e40eb7efcc79f",
|
|
63
|
+
"authTag": "f29086a6954538f942e8f387d19545c4",
|
|
64
|
+
"sha256": "0918b34baf837ce8e6b13c43430b1a5b4cc09597084180be12fb433ee02371e7",
|
|
65
|
+
"bytes": 283707302
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"index": 6,
|
|
69
|
+
"file": "chunk.06.enc",
|
|
70
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0-2/chunk.06.enc",
|
|
71
|
+
"mirrors": [],
|
|
72
|
+
"iv": "83e4b0edf971f8a567f09351",
|
|
73
|
+
"authTag": "b803d7b5df6c5354567eae445b608b92",
|
|
74
|
+
"sha256": "bc38aa59ddcb4c62553208abc6cfa39a9f8a45b0fd15579be421c743e662562c",
|
|
75
|
+
"bytes": 283707302
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"index": 7,
|
|
79
|
+
"file": "chunk.07.enc",
|
|
80
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0-2/chunk.07.enc",
|
|
81
|
+
"mirrors": [],
|
|
82
|
+
"iv": "fbbfe0890b073377a505f000",
|
|
83
|
+
"authTag": "eed74a1fe67710a254dc92997d239ec5",
|
|
84
|
+
"sha256": "2f824e82f9059e244dd448a0eb9521de87918f3da2ae2622caf5ef4fbfeb2f5d",
|
|
85
|
+
"bytes": 283707302
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"index": 8,
|
|
89
|
+
"file": "chunk.08.enc",
|
|
90
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0-2/chunk.08.enc",
|
|
91
|
+
"mirrors": [],
|
|
92
|
+
"iv": "e21a61b235abb6cb538085d8",
|
|
93
|
+
"authTag": "93f0d09f3f1835aced4a3f34f2cacf93",
|
|
94
|
+
"sha256": "1d73745269c8979b4320196139e14076c6bb6db517de7b1051e381d11f92bcaa",
|
|
95
|
+
"bytes": 283707302
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"index": 9,
|
|
99
|
+
"file": "chunk.09.enc",
|
|
100
|
+
"url": "https://github.com/JahidDev24/ultron-LLM-Coder/releases/download/model-v0-2/chunk.09.enc",
|
|
101
|
+
"mirrors": [],
|
|
102
|
+
"iv": "c5eba14c26399d45801f7e8b",
|
|
103
|
+
"authTag": "d2456e0981d60058c34cd71ec4f57f09",
|
|
104
|
+
"sha256": "f46e49ae0c6ac159c1f76aa608893cc1448deb23134617b4dbf37adffda55e35",
|
|
105
|
+
"bytes": 283707302
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|