@bobfrankston/msger 0.1.67 → 0.1.71

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 (62) hide show
  1. package/.hintrc +2 -1
  2. package/README.md +8 -0
  3. package/index.js +7 -0
  4. package/index.js.map +1 -1
  5. package/index.ts +8 -0
  6. package/msger-native/bin/msgernative.exe +0 -0
  7. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Breadcrumbs +107 -34
  8. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Crashpad/settings.dat +0 -0
  9. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/CrashpadMetrics-active.pma +0 -0
  10. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/BrowsingTopicsState +1 -1
  11. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DIPS +0 -0
  12. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/data_1 +0 -0
  13. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnGraphiteCache/index +0 -0
  14. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/data_1 +0 -0
  15. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/DawnWebGPUCache/index +0 -0
  16. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG +3 -3
  17. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Extension State/LOG.old +3 -3
  18. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/data_1 +0 -0
  19. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/GPUCache/index +0 -0
  20. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG +3 -3
  21. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Local Storage/leveldb/LOG.old +3 -3
  22. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Preferences +1 -1
  23. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/000003.log +0 -0
  24. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG +3 -3
  25. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Session Storage/LOG.old +3 -3
  26. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG +3 -3
  27. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Site Characteristics Database/LOG.old +3 -3
  28. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG +3 -3
  29. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/Sync Data/LevelDB/LOG.old +3 -3
  30. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/favorites_diagnostic.log +35 -0
  31. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/000003.log +0 -0
  32. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG +3 -3
  33. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/LOG.old +3 -3
  34. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/000003.log +0 -0
  35. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG +3 -3
  36. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Default/shared_proto_db/metadata/LOG.old +3 -3
  37. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_0 +0 -0
  38. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_1 +0 -0
  39. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/data_3 +0 -0
  40. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000001 +0 -0
  41. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/f_000002 +0 -0
  42. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GrShaderCache/index +0 -0
  43. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/data_1 +0 -0
  44. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/GraphiteDawnCache/index +0 -0
  45. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/Local State +1 -1
  46. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/data_1 +0 -0
  47. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/ShaderCache/index +0 -0
  48. package/msger-native/build-pi.ps1 +243 -0
  49. package/msger-native/build.rs +1 -0
  50. package/msger-native/build.ts +101 -24
  51. package/msger-native/src/main.rs +3 -1
  52. package/msger-native/src/template.html +52 -1
  53. package/msgernative-linux-x64 +0 -0
  54. package/msgernative-win32-x64.exe +0 -0
  55. package/package.json +1 -1
  56. package/shower.d.ts.map +1 -1
  57. package/shower.js +13 -7
  58. package/shower.js.map +1 -1
  59. package/shower.ts +13 -7
  60. package/tests/test-input.json +6 -0
  61. package/tests/test-node-dot.js +14 -0
  62. package/msger-native/bin/msgernative.exe.WebView2/EBWebView/CrashpadMetrics.pma +0 -0
@@ -1 +1 @@
1
- {"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"Z0swlvRuUso="},"breadcrumbs":{"enabled":true,"enabled_time":"13405633918874559"},"default_browser":{"browser_name_enum":13},"desktop_session_duration_tracker":{"last_session_end_timestamp":"1761957411"},"domain_actions_config":"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","edge":{"manageability":{"edge_last_active_time":"13406429477856750"},"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_ci":{"metrics_bookmark":"\u003CBookmarkList>\r\n\u003C/BookmarkList>","num_healthy_browsers_since_failure":4},"hardware_acceleration_mode_previous":true,"identity_combined_status":{"aad":2,"ad":1},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"network_time":{"network_time_mapping":{"local":1.76194174839255e+12,"network":1.761941748e+12,"ticks":90497411694.0,"uncertainty":1533873.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"141.0.3537.99","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAACWsZDMa44HSK7x1dmjd6ipEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAABUDgRRN7xKnFSlG748Z6Z6L7wjJeDNkNRQbADhVGx2QwAAAAAOgAAAAAIAACAAAAAeRg4a0szaeRhhR4zyWUOXoN869md2k4OjiNxVsFyndDAAAABX6PEdpHgByL3/WreTcHkR0ONVUzobTbjrxDRAxz19Xogq6pDJx9NcYvkhB9tNZn5AAAAAAarRg3ZjWGAzXfUcMXhN7NcR2b98uvYED0Xpbs4YvVdt9Zen35uTQZXwlc7O4gtOB3Ve11sZlNLFCZ2DDrwa2g=="},"performance_intervention":{"last_daily_sample":"13406423851861134"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13406423851677887"},"profile":{"info_cache":{"Default":{"active_time":1761958876.031548,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":[],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13406423851529085","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"guided_switch_pref":[],"multiple_profiles_with_same_account":false},"edge_sso_info":{"msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"141.0.3537.99","signin_last_updated_time":1761950251.846855},"sentinel_creation_time":"0","session_id_generator_last_value":"1371522808","signin":{"active_accounts_last_emitted":"13406423851514275"},"startup_boost":{"last_browser_open_time":"13406432477700245"},"subresource_filter":{"ruleset_version":{"checksum":860988201,"content":"10.34.0.81","format":37}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13406423851646032","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":1,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":15625462},"governance":{"last_dma_change_date":"13405633918837393","last_known_cps":0},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVdlYlZpZXdcQXBwbGljYXRpb25cMTQxLjAuMzUzNy45OVx0ZWxjbGllbnQuZGxs","sample_id":78116406},"uninstall_metrics":{"installation_date2":"1761160318"},"updateclientdata":{"apps":{"alpjnmnfbgfkmmpcfpejmmoebdndedno":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"28.0.0.1"},"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.0.0.10"},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"2025.9.29.1"},"fppmbhmldokgmleojlplaaodlkibgikh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.15.0.1"},"hajigopbbjhghbfimgkfmpenfkclmohk":{"cohort":"","cohortname":"","installdate":-1},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"120.0.6050.0"},"ldfkbgjbencjpgjfleiooeldhjdapggh":{"cohort":"","cohortname":"","installdate":-1},"mcfjlbnicoclaecapilmleaelokfnijm":{"cohort":"","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"10.34.0.81"},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"6498.2025.9.4"},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"0.0.1.7"},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"","cohortname":"","installdate":-1},"pghocgajpebopihickglahgebcmkcekh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"3.0.0.16"},"pmagihnlncbcefglppponlgakiphldeh":{"cohort":"","cohortname":"","installdate":-1}}},"updateclientlastupdatecheckerror":0,"updateclientlastupdatecheckerrorcategory":0,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"chrome_download_action_count":0,"client_id2":"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}C:\\Users\\Bob1s:38D38C2A-D364-45F8-BC50-333D72CBE58F","client_id_timestamp":"1761160318","diagnostics":{"last_data_collection_level_on_launch":3},"initial_logs2":[],"last_seen":{"BrowserMetrics":"13406430113362207","CrashpadMetrics":"13406432465643564"},"limited_entropy_randomization_source":"AD9091DE8790396A4D0B7389E394605A","log_finalized_record_id":148,"log_record_id":148,"low_entropy_source3":5625,"machine_id":4256001,"ongoing_logs2":[],"payload_counter":2,"pseudo_low_entropy_source":1574,"reporting_enabled":true,"reset_client_id_deterministic":true,"session_id":62,"stability":{"browser_last_live_timestamp":"13406432477875337","exited_cleanly":true,"saved_system_profile":"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","saved_system_profile_hash":"F121E6925B537C7AB456DAB5F8C77EF0CED89608","stats_buildtime":"1761167620","stats_version":"141.0.3537.99-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations_compressed_seed":"safe_seed_content","variations_config_ids":"{\"ECS\":\"P-R-1082570-1-11,P-D-42388-2-6\",\"EdgeConfig\":\"P-R-1315481-1-8,P-R-1695353-4-7,P-R-1671932-3-6,P-R-1541171-6-9,P-R-1528200-3-4,P-R-1113531-4-9,P-R-68474-9-12,P-R-60617-8-21,P-R-45373-8-85\",\"EdgeFirstRunConfig\":\"P-R-1075865-4-7\",\"Segmentation\":\"P-R-1473016-1-8,P-R-1159985-1-5,P-R-1113915-25-11,P-R-1098334-1-6,P-R-66078-1-3,P-R-66077-1-5,P-R-60882-1-2,P-R-43082-3-5,P-R-42744-1-2\"}","variations_country":"US","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":1,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13406415347165014","variations_last_runtime_fetch_time":"13406415348603522","variations_permanent_consistency_country":["141.0.3537.99","US"],"variations_runtime_compressed_seed":"H4sIAAAAAAAAAG1Q0W7bMBD7leCefYCkk2TJwB6KOGk6bF3WNFjRuQ9urBnGEnmLHWBF4H8vZGXJsPaRIHlH8gjT1v9o6pu8gwyOBcymqwKyApZ4h5wZoVKGHDlPlpijFGQMCtQFJAXMqtrl7a5s/NWmb1rf/WO0JKQKRpucLmkmkSOlI04NMR1oEyFpMcLIauJaoUShR6hISEKBkZSMWUL6S5JJpcQUbWSJG2tRWJTWjpE5V0ZziQLlOfTdwffNzsXml9DaCm4YEqpTZjKpZijQjs6Vq3fO92WoejHJlBgP2WMTzpW1JjQ/HeGcLFcoVNxw3MYQhS1iAa1ZasIyZ5Se3ZoZI5CjiM2JGXGOJ0UozlEUMEDythdkR8ibrnzeukl+KLeTma8b7yZ5U9a+7fpm0wVJFSVzV/aHvesg+w67Luij/KK+8XPnqudy8xOehgRmu1/9y7tPnf//oHP7DTwNQwILV1ZuPz6etgff71+mbeUgg/UqdLgva8iggD17/LRwX66Xn8vtekFr+XB7/02pj9rc/nmk/Orhq5j539dzU7EPBcAwvAKFq0pbxwIAAA==","variations_safe_compressed_seed":"H4sIAAAAAAAAAJVVbW/iOBD+K5W/XtyNnVc43QcKtIu23bIFykm3VWWSIfjq2Mh2oKjiv5+cpLT0iu42H6LMzDPPvMZ+QcP+BHVf0PA5E1UOw2cLWjLRV3LJi1FuRvJaFahrdQUearTXqpgyXYBFXQR5AY/GsoUAtPfQMC+gATnO7YZOmMwX6tlJOTcOdgnMVhoM6v6FRkYJZqEFQT5aalaCQQ97D815blc9mX8FXqxsz4w1GJCWWa5kz1rNF5UFcyu/g7GQTzbFmO2EYvmJUL9MVyfh6pnD4s5mp2hr40yWlYWpZtmTma9Ajln2BLanNd+01QxaVy5gsjMWyl6WgTH9FWRPght7gv4jfsA1ZFbp3ciCrnO/EKphqKmapKWjmd/TXp5zh2FirJVz/8aFgHwKAkqweueCgvwYszRzWNxz2P63v4s2ybNVE/EUnWuiQ9XwH7NR3wHXzI3agnagFyRZCaiLshWTEgTy0IaJymku0d47mGGtstU7Y+A3z3uMBquZNCW39VY+Kvm45RoeLS9BVfax5EJwA5mSuXlHRR2LS/B2A1rzHIYbkNacrKm29oRQ22s3vgfvREUt9JW1Br9FveGZVkYt7fkcFhdabQ3o87FWVi2q5fns2815M/2xVksuwPM9Ev3+P5wss+b8WhUTy7T1fC/8Fae+KtcCLNR+TVMOIx+r9YQ5c/3msjjVoEulMzi4HdAeKo07P8DYmeRLpcsBN83fx5X8yo1VhWbl6X4WWlVrekjjaILv1yCHJauEvXLwz9BH4OqpPEn5sG/PgUuujb2r5Nv5NizXdve56d8tAVjqDNVsEyjK17PHgW96o54QqIuWTBgXfz4fHitMtl5WTuPX30XFdP4qbEDXnzdBHPWVhmPPvpIWpJ2A3vAMzIc4sPhzeqy64LI41rgCjzWHXZoZF7vV7z30FVhez+sFDaesQF30E212s/LH/ZUofku237NVurr6e3q/5mYdmTs5T+xo8GXSp4n4Qv0/fiIX73nN656hOeTeGaVnt5k9oz6NzqjfJbTrx2dXN9O6tkpaveur3A1rNkEecktcmVZT/9Ovt9Zo0OTlrjs0xneY+CmNEh8TTIg3xgMc0iBNMcUxOr7IGnRAojAlmODUq+W4EwVRgEOctHJCOgHFAY4bOQoJSQiOcaeVaUp9Hwc4bGRCgiggOGztcRomIe5gQhvRj0mCU0xJLYZRkAQ4xWmEPl/GtqIkSuPI5YQ+blkDCJPAJ/FbESTqdNIIExwdkuqQCNOo6Ymj7KRBEGLSlhXHfpJigoODlBy8Yz9NKSa4qSAM/NS1o7GFNAkdC0X7/T+fXvwedAgAAA==","variations_safe_seed_date":"13406337073000000","variations_safe_seed_fetch_time":"13406415347165014","variations_safe_seed_locale":"en-US","variations_safe_seed_milestone":141,"variations_safe_seed_permanent_consistency_country":"US","variations_safe_seed_session_consistency_country":"US","variations_safe_seed_signature":"","variations_seed_client_version_at_store":"141.0.3537.92","variations_seed_date":"13406415347000000","variations_seed_etag":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_milestone":141,"variations_seed_runtime_etag":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_runtime_serial_number":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_serial_number":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_signature":"","was":{"restarted":false}}
1
+ {"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"Z0swlvRuUso="},"breadcrumbs":{"enabled":true,"enabled_time":"13405633918874559"},"default_browser":{"browser_name_enum":13},"desktop_session_duration_tracker":{"last_session_end_timestamp":"1761969825"},"domain_actions_config":"H4sIAAAAAAAAAK2abW/cNhKA/4qxuA9J4ZU3TpvgfAiCwPUhBRo0SFP0gLq3GJEjabp8C0mtJDf57wV3ta42K8mi3A9+WZrPDF+Gw5mh/1wwLtd6i9YSx8XVnwswRhADT1q5xdVvbQPytdGCWLO4WvykRHNTG+3wvYDmAwJvFucLriWQWlwtnCCVJ0zLxZfzUfpX4rglhV3Y6zLx2zmkhJpriQnHOTSkbPaQt0kgcC4v4GVCfg5ZZ6TIN3MVV+BZ4bcJ0/VcEZQr8ui3idU5WjdXTCpKZKXdBkmugCphMEdMgYLqZEsctbdazR0Ns+TRklasAKVQzJWjPPgimOTc/dGVsehQeWdEOXtxt0U980gVpSjnagVjkk8lsU2BwswV8j254o1qqgJtu4q/ny92LOHeOSmQOOiSfGPCH0OT3TWFIZwQHcUtcN8S1G3ROtJqcfXsy/mCaY4s0l2+JY7vsre4ZdeBjnMdI7Ai5VFxPbowp3w7x25jzzRlWJk1KUEKY68H438q/de2kFuQEqwY81YnoCvAotGk/DxqybMYUOkwrcTpqYCg7djpPumvs4zYDOL5i+9mQ4lk4BLpJsMKuZ03L4VD11j/ykX09wjSJZKY1U5nM80hKSevAtNSahUMV9t8KlRhmlQFeBe4UXe1R3vOXTjSfp2R8GjXWq11lq1dRZ4V0w7f9V7Cf3cCjsKj46UbGNgxfjI+ZCbSGbwXQOoj1v6XDz+64HOP7hdQuS69S3Kt8zEvOCqFFeAfJ8EJYJuZbAYMU63n4hXuhj8XpppGwpxR+NOn2VpTHAkYx1lteYhpRoKZUd5X5D3amTQnx7TloyegT0B7Zd5cvw8Nux6+7XF6RoiLyDPSBi4WM6qR37y7ObqT0Gchqh2c8RTa+ZKTHln0USGydMQSkHC3i6mTP8w/IKTcPF7IoyczlCtOl4ADN8p0CZl9rARSj5YwcA9HbMZAwha1nUk6Zy0eqDeMstqgIs60Ush8uL7hrrRYYerIo9sHKAOOok/uIeE4NMqeFIIk5LiWkCvKmrXFHOtIfyF0he4omAoNyTf988cUGpJ5t3/bNEQwC5Q7Qe44IrpvHeK8vDvy1fJusCfYHI/ju13LUP80dR48HaU/h7YhxpDyFo/nQIkhFWY+aC3BIDyk4igNtejoDm2ifatyEAeyqUq/snEGrBgJTSQqsPxoQxlXyb6ZjV5WB0vYgijD59vb12Gkr55I/rkWT8/2n+padDPfvw3igLmleHJ7y795euaW4tmL1arb/cgaDsT6+WpVP1+tbm+Ts/Wzy9Wq/vdqlXSxvTHc95d817UWx50OdnDo9/9/nb2uiL8KIrsdOwZw6PofCfVbpLzwr/aDDw2/EvdF+/msK6BjDQcBF5fPX9QXZxcvw49u364NHDo/kciplJ9FGPHn2kkQ4unFWVHmeMTeG8C9ltck19Wrl5ers/bXZ99+ezS3v/f/Xtm7vbKfg5bPPwaVTy/O/rf75eLUoxhLTq6xNkLbkDU8Mlu/lFzFpGYk86VbSqeWwYXDBiTQHfIYET1edxqYksqXWJshJ9BPxGSPVRWqkeQcLtGAzRUO3th9WSRHgyqhyRUFZhE8zkt0OWaoOFoLd3okRO4DHeUK7Uy1WuVguRoLy3uokm3CV65jqIezrR7GIi7DN4ZCLJ0W5IFsVH2jzS4nG9m+v2sUbw9fjDLK9bJCmyJYTxsU09UGUqd/oHemTKMwY3VGcZqM1VJHEMp5CEXAmKUQpDbISU1XE1uRk2A+lTgc0/QUCduEbDIwt+gHxrgkusJoUFkgUUEjIap4pUufWnggPDrFDNYoxt4mTutxCJYViYJtnMdouQYKHeUzZhaRN3pLUX4m2He4jnZ3UtA22UKc1xZyjN5st2URhV3X5MPRcl/FlRWhClrunhhn3QyeNj7OVz9Y35lSdJ3GNSBlnKZGl75Mo3aoLegmAuPuOQPWhws1lnOFNkl6mc4BK6u1jAYF5sCaAkH4IsbdpCAEeu9YUQpcarSCNuGeLCbvOwlQbtPEKJWQE1uKkDQ8VJ//QXXzeXLypo2vPzYG93/vviYeVI0QvRX/0qFdQx6K/nFx+3VhtcRf3hyFHVZXbSV8cb4w4Iu1hN3TwW+LCwYW0S65RZBoL8LD9MXi996F65PtSBS6RO9xGU7coIX0sbJJquZu/AW3w7VriDzHj3qD6gMaAQwlqm76drqWFabr8ISXtSsX+1RhtTQnsb9FzmmsQN9LeRSYWzAFKU4QQ3uS6HS253bfdy0xIkzpClR5uFFihx1UKV0prKI07pIkXRqtLCiKJatCC3RaYlOORIf9LLiNABJRSxw4B1LqlEafjHpBZCVsyUUpLO8SZ0qvaLNbWFvGKFR89y86cYMUJA1YRjDyzyv9qNFbsKj0JnKY6Dxw0KNl3FNSi9rAhpwHlWiXeDb5mKDA6G3QInJ4OwuryaWgxh74TjhZ+hJEViqeACffQEpWAANDPn5HJrww9nITMq5+UKJzqPKx4OgHxbQklV+DEA8+0w+9tB2Ut/7e7D93btWvtLT9qG1ds9Dc6b4X+Ebxfm4vfw2Kr78ScXyRfPkL2ObC1xQpAAA=","edge":{"manageability":{"edge_last_active_time":"13406443173916620"},"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_ci":{"metrics_bookmark":"\u003CBookmarkList>\r\n\u003C/BookmarkList>","num_healthy_browsers_since_failure":4},"hardware_acceleration_mode_previous":true,"identity_combined_status":{"aad":2,"ad":1},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"network_time":{"network_time_mapping":{"local":1.76194174839255e+12,"network":1.761941748e+12,"ticks":90497411694.0,"uncertainty":1533873.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"141.0.3537.99","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAACWsZDMa44HSK7x1dmjd6ipEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAABUDgRRN7xKnFSlG748Z6Z6L7wjJeDNkNRQbADhVGx2QwAAAAAOgAAAAAIAACAAAAAeRg4a0szaeRhhR4zyWUOXoN869md2k4OjiNxVsFyndDAAAABX6PEdpHgByL3/WreTcHkR0ONVUzobTbjrxDRAxz19Xogq6pDJx9NcYvkhB9tNZn5AAAAAAarRg3ZjWGAzXfUcMXhN7NcR2b98uvYED0Xpbs4YvVdt9Zen35uTQZXwlc7O4gtOB3Ve11sZlNLFCZ2DDrwa2g=="},"performance_intervention":{"last_daily_sample":"13406423851861134"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13406423851677887"},"profile":{"info_cache":{"Default":{"active_time":1761969812.997085,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":[],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13406423851529085","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"guided_switch_pref":[],"multiple_profiles_with_same_account":false},"edge_sso_info":{"msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"141.0.3537.99","signin_last_updated_time":1761950251.846855},"sentinel_creation_time":"0","session_id_generator_last_value":"1371524928","signin":{"active_accounts_last_emitted":"13406423851514275"},"startup_boost":{"last_browser_open_time":"13406443425737408"},"subresource_filter":{"ruleset_version":{"checksum":860988201,"content":"10.34.0.81","format":37}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13406423851646032","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":1,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":15625462},"governance":{"last_dma_change_date":"13405633918837393","last_known_cps":0},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVdlYlZpZXdcQXBwbGljYXRpb25cMTQxLjAuMzUzNy45OVx0ZWxjbGllbnQuZGxs","sample_id":78116406},"uninstall_metrics":{"installation_date2":"1761160318"},"updateclientdata":{"apps":{"alpjnmnfbgfkmmpcfpejmmoebdndedno":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"28.0.0.1"},"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.0.0.10"},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"2025.9.29.1"},"fppmbhmldokgmleojlplaaodlkibgikh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.15.0.1"},"hajigopbbjhghbfimgkfmpenfkclmohk":{"cohort":"","cohortname":"","installdate":-1},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"120.0.6050.0"},"ldfkbgjbencjpgjfleiooeldhjdapggh":{"cohort":"","cohortname":"","installdate":-1},"mcfjlbnicoclaecapilmleaelokfnijm":{"cohort":"","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"10.34.0.81"},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"6498.2025.9.4"},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"0.0.1.7"},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"","cohortname":"","installdate":-1},"pghocgajpebopihickglahgebcmkcekh":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"3.0.0.16"},"pmagihnlncbcefglppponlgakiphldeh":{"cohort":"","cohortname":"","installdate":-1}}},"updateclientlastupdatecheckerror":0,"updateclientlastupdatecheckerrorcategory":0,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"chrome_download_action_count":0,"client_id2":"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}C:\\Users\\Bob1s:38D38C2A-D364-45F8-BC50-333D72CBE58F","client_id_timestamp":"1761160318","diagnostics":{"last_data_collection_level_on_launch":3},"initial_logs2":[],"last_seen":{"BrowserMetrics":"13406430113362207","CrashpadMetrics":"13406443393468067"},"limited_entropy_randomization_source":"AD9091DE8790396A4D0B7389E394605A","log_finalized_record_id":227,"log_record_id":227,"low_entropy_source3":5625,"machine_id":4256001,"ongoing_logs2":[],"payload_counter":2,"pseudo_low_entropy_source":1574,"reporting_enabled":true,"reset_client_id_deterministic":true,"session_id":102,"stability":{"browser_last_live_timestamp":"13406443425867674","exited_cleanly":true,"saved_system_profile":"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","saved_system_profile_hash":"BB786B83A8C9DE5E84AD6E18FF66EAFB7798CDF8","stats_buildtime":"1761167620","stats_version":"141.0.3537.99-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations_compressed_seed":"safe_seed_content","variations_config_ids":"{\"ECS\":\"P-R-1082570-1-11,P-D-42388-2-6\",\"EdgeConfig\":\"P-R-1315481-1-8,P-R-1695353-4-7,P-R-1671932-3-6,P-R-1541171-6-9,P-R-1528200-3-4,P-R-1113531-4-9,P-R-68474-9-12,P-R-60617-8-21,P-R-45373-8-85\",\"EdgeFirstRunConfig\":\"P-R-1075865-4-7\",\"Segmentation\":\"P-R-1473016-1-8,P-R-1159985-1-5,P-R-1113915-25-11,P-R-1098334-1-6,P-R-66078-1-3,P-R-66077-1-5,P-R-60882-1-2,P-R-43082-3-5,P-R-42744-1-2\"}","variations_country":"US","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":1,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13406415347165014","variations_last_runtime_fetch_time":"13406415348603522","variations_permanent_consistency_country":["141.0.3537.99","US"],"variations_runtime_compressed_seed":"H4sIAAAAAAAAAG1Q0W7bMBD7leCefYCkk2TJwB6KOGk6bF3WNFjRuQ9urBnGEnmLHWBF4H8vZGXJsPaRIHlH8gjT1v9o6pu8gwyOBcymqwKyApZ4h5wZoVKGHDlPlpijFGQMCtQFJAXMqtrl7a5s/NWmb1rf/WO0JKQKRpucLmkmkSOlI04NMR1oEyFpMcLIauJaoUShR6hISEKBkZSMWUL6S5JJpcQUbWSJG2tRWJTWjpE5V0ZziQLlOfTdwffNzsXml9DaCm4YEqpTZjKpZijQjs6Vq3fO92WoejHJlBgP2WMTzpW1JjQ/HeGcLFcoVNxw3MYQhS1iAa1ZasIyZ5Se3ZoZI5CjiM2JGXGOJ0UozlEUMEDythdkR8ibrnzeukl+KLeTma8b7yZ5U9a+7fpm0wVJFSVzV/aHvesg+w67Luij/KK+8XPnqudy8xOehgRmu1/9y7tPnf//oHP7DTwNQwILV1ZuPz6etgff71+mbeUgg/UqdLgva8iggD17/LRwX66Xn8vtekFr+XB7/02pj9rc/nmk/Orhq5j539dzU7EPBcAwvAKFq0pbxwIAAA==","variations_safe_compressed_seed":"H4sIAAAAAAAAAJVVbW/iOBD+K5W/XtyNnVc43QcKtIu23bIFykm3VWWSIfjq2Mh2oKjiv5+cpLT0iu42H6LMzDPPvMZ+QcP+BHVf0PA5E1UOw2cLWjLRV3LJi1FuRvJaFahrdQUearTXqpgyXYBFXQR5AY/GsoUAtPfQMC+gATnO7YZOmMwX6tlJOTcOdgnMVhoM6v6FRkYJZqEFQT5aalaCQQ97D815blc9mX8FXqxsz4w1GJCWWa5kz1rNF5UFcyu/g7GQTzbFmO2EYvmJUL9MVyfh6pnD4s5mp2hr40yWlYWpZtmTma9Ajln2BLanNd+01QxaVy5gsjMWyl6WgTH9FWRPght7gv4jfsA1ZFbp3ciCrnO/EKphqKmapKWjmd/TXp5zh2FirJVz/8aFgHwKAkqweueCgvwYszRzWNxz2P63v4s2ybNVE/EUnWuiQ9XwH7NR3wHXzI3agnagFyRZCaiLshWTEgTy0IaJymku0d47mGGtstU7Y+A3z3uMBquZNCW39VY+Kvm45RoeLS9BVfax5EJwA5mSuXlHRR2LS/B2A1rzHIYbkNacrKm29oRQ22s3vgfvREUt9JW1Br9FveGZVkYt7fkcFhdabQ3o87FWVi2q5fns2815M/2xVksuwPM9Ev3+P5wss+b8WhUTy7T1fC/8Fae+KtcCLNR+TVMOIx+r9YQ5c/3msjjVoEulMzi4HdAeKo07P8DYmeRLpcsBN83fx5X8yo1VhWbl6X4WWlVrekjjaILv1yCHJauEvXLwz9BH4OqpPEn5sG/PgUuujb2r5Nv5NizXdve56d8tAVjqDNVsEyjK17PHgW96o54QqIuWTBgXfz4fHitMtl5WTuPX30XFdP4qbEDXnzdBHPWVhmPPvpIWpJ2A3vAMzIc4sPhzeqy64LI41rgCjzWHXZoZF7vV7z30FVhez+sFDaesQF30E212s/LH/ZUofku237NVurr6e3q/5mYdmTs5T+xo8GXSp4n4Qv0/fiIX73nN656hOeTeGaVnt5k9oz6NzqjfJbTrx2dXN9O6tkpaveur3A1rNkEecktcmVZT/9Ovt9Zo0OTlrjs0xneY+CmNEh8TTIg3xgMc0iBNMcUxOr7IGnRAojAlmODUq+W4EwVRgEOctHJCOgHFAY4bOQoJSQiOcaeVaUp9Hwc4bGRCgiggOGztcRomIe5gQhvRj0mCU0xJLYZRkAQ4xWmEPl/GtqIkSuPI5YQ+blkDCJPAJ/FbESTqdNIIExwdkuqQCNOo6Ymj7KRBEGLSlhXHfpJigoODlBy8Yz9NKSa4qSAM/NS1o7GFNAkdC0X7/T+fXvwedAgAAA==","variations_safe_seed_date":"13406337073000000","variations_safe_seed_fetch_time":"13406415347165014","variations_safe_seed_locale":"en-US","variations_safe_seed_milestone":141,"variations_safe_seed_permanent_consistency_country":"US","variations_safe_seed_session_consistency_country":"US","variations_safe_seed_signature":"","variations_seed_client_version_at_store":"141.0.3537.92","variations_seed_date":"13406415347000000","variations_seed_etag":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_milestone":141,"variations_seed_runtime_etag":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_runtime_serial_number":"\"r0ZLHeOGPMalUH3U4XNTW55J68NxZ3DAXQ2EnqGF8d0=\"","variations_seed_serial_number":"\"vyUmQVGlg+7wNch8hGjTVpisp5sRnW7tID/SC27l/20=\"","variations_seed_signature":"","was":{"restarted":false}}
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env pwsh
2
+ # Build ARM64 binary on Raspberry Pi via SSH and mounted SMB share
3
+ # Usage: .\build-pi.ps1 [hostname]
4
+ # Default hostname: pi4c
5
+
6
+ param(
7
+ [string]$PiHost = "pi4c"
8
+ )
9
+
10
+ $ErrorActionPreference = "Stop"
11
+
12
+ $ProjectRoot = "y:\dev\utils\msger"
13
+ $NativeDir = "$ProjectRoot\msger-native"
14
+
15
+ Write-Host ""
16
+ Write-Host "======================================"
17
+ Write-Host "Building ARM64 binary on Raspberry Pi"
18
+ Write-Host "======================================"
19
+ Write-Host "Target: $PiHost"
20
+ Write-Host ""
21
+
22
+ # Mount SMB share
23
+ Write-Host "Mounting SMB share from $PiHost..."
24
+ try {
25
+ & mountsmb.ps1 $PiHost
26
+ if ($LASTEXITCODE -ne 0) {
27
+ throw "mountsmb.ps1 failed"
28
+ }
29
+ } catch {
30
+ Write-Error "ERROR: Failed to mount SMB share: $_"
31
+ exit 1
32
+ }
33
+
34
+ $PPath = "c:\drives\smb\$PiHost\home\pi"
35
+ Write-Host "SMB path: $PPath"
36
+ Write-Host ""
37
+
38
+ # Verify mount exists
39
+ if (!(Test-Path $PPath)) {
40
+ Write-Error "ERROR: Mounted path does not exist: $PPath"
41
+ exit 1
42
+ }
43
+
44
+ # Create project directory on Pi
45
+ Write-Host "Creating project directory on Pi..."
46
+ New-Item -ItemType Directory -Force -Path "$PPath\msger\src" | Out-Null
47
+
48
+ # Copy source files
49
+ Write-Host "Copying source files to Pi..."
50
+ try {
51
+ Copy-Item "$NativeDir\Cargo.toml" "$PPath\msger\" -Force
52
+ Copy-Item "$NativeDir\src\*" "$PPath\msger\src\" -Recurse -Force
53
+ Write-Host "Source files copied successfully"
54
+ } catch {
55
+ Write-Error "ERROR: Failed to copy source files: $_"
56
+ exit 1
57
+ }
58
+ Write-Host ""
59
+
60
+ # Check SSH connectivity
61
+ Write-Host "Testing SSH connection..."
62
+ try {
63
+ $null = ssh $PiHost "echo Connected" 2>&1
64
+ if ($LASTEXITCODE -ne 0) {
65
+ throw "SSH connection failed"
66
+ }
67
+ Write-Host "SSH connection successful"
68
+ } catch {
69
+ Write-Error "ERROR: Cannot connect to Pi via SSH"
70
+ Write-Error " Make sure you can run: ssh $PiHost"
71
+ Write-Error " You may need to set up SSH keys: ssh-copy-id $PiHost"
72
+ exit 1
73
+ }
74
+ Write-Host ""
75
+
76
+ # Check and install Rust
77
+ Write-Host "Checking for Rust/Cargo on Pi..."
78
+ ssh $PiHost "command -v cargo" 2>$null | Out-Null
79
+ if ($LASTEXITCODE -ne 0) {
80
+ Write-Host "Installing Rust on Pi (this may take a few minutes)..."
81
+ ssh $PiHost "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y"
82
+ if ($LASTEXITCODE -ne 0) {
83
+ Write-Error "ERROR: Failed to install Rust"
84
+ exit 1
85
+ }
86
+ Write-Host "Rust installed successfully"
87
+ } else {
88
+ Write-Host "Rust/Cargo found"
89
+ }
90
+ Write-Host ""
91
+
92
+ # Check and install pkg-config
93
+ Write-Host "Checking for pkg-config on Pi..."
94
+ ssh $PiHost "command -v pkg-config" 2>$null | Out-Null
95
+ if ($LASTEXITCODE -ne 0) {
96
+ Write-Host "Installing pkg-config..."
97
+ ssh $PiHost "sudo apt-get update && sudo apt-get install -y pkg-config"
98
+ if ($LASTEXITCODE -ne 0) {
99
+ Write-Error "ERROR: Failed to install pkg-config"
100
+ exit 1
101
+ }
102
+ Write-Host "pkg-config installed"
103
+ } else {
104
+ Write-Host "pkg-config found"
105
+ }
106
+ Write-Host ""
107
+
108
+ # Check and install build dependencies
109
+ Write-Host "Checking for build dependencies (GLib, GTK, WebKit) on Pi..."
110
+ $hasDeps = ssh $PiHost "pkg-config --exists glib-2.0 gobject-2.0 gio-2.0 gtk+-3.0 webkit2gtk-4.0 2>&1 && echo 'OK' || echo 'MISSING'"
111
+ if ($hasDeps -notcontains "OK") {
112
+ Write-Host "Installing build dependencies (this may take several minutes)..."
113
+ Write-Host " - build-essential"
114
+ Write-Host " - libglib2.0-dev"
115
+ Write-Host " - libgtk-3-dev"
116
+ Write-Host " - libwebkit2gtk-4.0-dev"
117
+ Write-Host " - libsoup2.4-dev"
118
+ Write-Host ""
119
+ Write-Host "Running: sudo apt-get update && sudo apt-get install -y ..."
120
+ ssh $PiHost "sudo apt-get update -qq && sudo apt-get install -y build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libsoup2.4-dev"
121
+ if ($LASTEXITCODE -ne 0) {
122
+ Write-Error "ERROR: Failed to install build dependencies"
123
+ Write-Host ""
124
+ Write-Host "TRY MANUALLY:"
125
+ Write-Host " ssh $PiHost"
126
+ Write-Host " sudo apt-get update"
127
+ Write-Host " sudo apt-get install -y build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libsoup2.4-dev"
128
+ exit 1
129
+ }
130
+ Write-Host "Build dependencies installed successfully"
131
+
132
+ # Verify installation
133
+ Write-Host "Verifying installation..."
134
+ $verify = ssh $PiHost "pkg-config --exists glib-2.0 gobject-2.0 gio-2.0 gtk+-3.0 webkit2gtk-4.0 2>&1 && echo 'OK' || echo 'STILL_MISSING'"
135
+ if ($verify -contains "STILL_MISSING") {
136
+ Write-Error "ERROR: Dependencies still missing after installation"
137
+ Write-Host "Try running manually on the Pi:"
138
+ Write-Host " sudo apt-get update"
139
+ Write-Host " sudo apt-get install -y build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libsoup2.4-dev"
140
+ exit 1
141
+ }
142
+ } else {
143
+ Write-Host "Build dependencies found"
144
+ }
145
+ Write-Host ""
146
+
147
+ # Build on Pi
148
+ Write-Host "======================================"
149
+ Write-Host "Checking if rebuild is needed..."
150
+ Write-Host "======================================"
151
+ Write-Host ""
152
+
153
+ # Check if binary exists and is up to date
154
+ $destBinary = "$binDir\msgernative-arm64"
155
+ $needsRebuild = $false
156
+
157
+ if (!(Test-Path $destBinary)) {
158
+ Write-Host "Binary does not exist, build needed"
159
+ $needsRebuild = $true
160
+ } else {
161
+ $binaryTime = (Get-Item $destBinary).LastWriteTime
162
+ Write-Host "Binary timestamp: $binaryTime"
163
+
164
+ # Check source files
165
+ $sourceFiles = @(
166
+ "$NativeDir\Cargo.toml"
167
+ "$NativeDir\build.rs"
168
+ )
169
+ $sourceFiles += Get-ChildItem "$NativeDir\src" -Recurse -File
170
+
171
+ foreach ($file in $sourceFiles) {
172
+ if ($file.LastWriteTime -gt $binaryTime) {
173
+ Write-Host "Source file changed: $($file.Name) ($($file.LastWriteTime))"
174
+ $needsRebuild = $true
175
+ break
176
+ }
177
+ }
178
+ }
179
+
180
+ if (!$needsRebuild) {
181
+ Write-Host ""
182
+ Write-Host "======================================"
183
+ Write-Host "Binary is up to date, skipping build"
184
+ Write-Host "======================================"
185
+ $fileSize = (Get-Item $destBinary).Length
186
+ $sizeMB = [math]::Round($fileSize / 1MB, 2)
187
+ Write-Host "Binary: $destBinary"
188
+ Write-Host "Size: $sizeMB MB"
189
+ Write-Host ""
190
+ exit 0
191
+ }
192
+
193
+ Write-Host ""
194
+ Write-Host "======================================"
195
+ Write-Host "Building ARM64 binary on Pi..."
196
+ Write-Host "This may take several minutes..."
197
+ Write-Host "======================================"
198
+ Write-Host ""
199
+ ssh $PiHost "cd ~/msger && export PATH=~/.cargo/bin:`$PATH && cargo build --release"
200
+ if ($LASTEXITCODE -ne 0) {
201
+ Write-Host ""
202
+ Write-Error "ERROR: Build failed on Pi"
203
+ exit 1
204
+ }
205
+ Write-Host ""
206
+ Write-Host "Build completed successfully!"
207
+ Write-Host ""
208
+
209
+ # Copy binary back
210
+ Write-Host "Copying binary back from Pi..."
211
+ $binDir = "$NativeDir\bin"
212
+ if (!(Test-Path $binDir)) {
213
+ New-Item -ItemType Directory -Force -Path $binDir | Out-Null
214
+ }
215
+
216
+ $sourceBinary = "$PPath\msger\target\release\msgernative"
217
+ $destBinary = "$binDir\msgernative-arm64"
218
+
219
+ if (!(Test-Path $sourceBinary)) {
220
+ Write-Error "ERROR: Built binary not found at: $sourceBinary"
221
+ exit 1
222
+ }
223
+
224
+ Copy-Item $sourceBinary $destBinary -Force
225
+
226
+ # Get file size
227
+ $fileSize = (Get-Item $destBinary).Length
228
+ $sizeMB = [math]::Round($fileSize / 1MB, 2)
229
+ Write-Host "Binary copied to: $destBinary"
230
+ Write-Host "Binary size: $sizeMB MB"
231
+ Write-Host ""
232
+
233
+ # Cleanup on Pi
234
+ Write-Host "Cleaning up build artifacts on Pi..."
235
+ ssh $PiHost "rm -rf ~/msger/target" 2>$null
236
+
237
+ Write-Host ""
238
+ Write-Host "======================================"
239
+ Write-Host "ARM64 binary ready!"
240
+ Write-Host "======================================"
241
+ Write-Host "The binary is now included in the project"
242
+ Write-Host "and will be packaged with npm publish"
243
+ Write-Host ""
@@ -20,6 +20,7 @@ fn main() {
20
20
  let version = &after_colon[quote_start+1..quote_start+1+quote_end];
21
21
  println!("cargo:rustc-env=NPM_VERSION={}", version);
22
22
  println!("cargo:rerun-if-changed=../package.json");
23
+ println!("cargo:rerun-if-changed=src/template.html");
23
24
  return;
24
25
  }
25
26
  }
@@ -2,7 +2,8 @@
2
2
 
3
3
  import { execSync } from 'child_process';
4
4
  import { platform, arch } from 'os';
5
- import { existsSync, mkdirSync, copyFileSync, readFileSync, statSync, chmodSync } from 'fs';
5
+ import { existsSync, mkdirSync, copyFileSync, readFileSync, statSync, chmodSync, readdirSync } from 'fs';
6
+ import { join } from 'path';
6
7
 
7
8
  function isWSL() {
8
9
  try {
@@ -29,36 +30,102 @@ function runCommand(cmd: string, description: string) {
29
30
  }
30
31
  }
31
32
 
33
+ function needsRebuild(binaryPath: string, sourceDirs: string[]): boolean {
34
+ // If binary doesn't exist, we need to build
35
+ if (!existsSync(binaryPath)) {
36
+ return true;
37
+ }
38
+
39
+ const binaryTime = statSync(binaryPath).mtime.getTime();
40
+
41
+ // Helper to recursively check directory
42
+ function checkDir(dirPath: string): boolean {
43
+ const entries = readdirSync(dirPath, { withFileTypes: true });
44
+ for (const entry of entries) {
45
+ const fullPath = join(dirPath, entry.name);
46
+ if (entry.isFile()) {
47
+ const fileTime = statSync(fullPath).mtime.getTime();
48
+ if (fileTime > binaryTime) {
49
+ console.log(`šŸ“ Source file changed: ${entry.name}`);
50
+ return true;
51
+ }
52
+ } else if (entry.isDirectory()) {
53
+ if (checkDir(fullPath)) {
54
+ return true;
55
+ }
56
+ }
57
+ }
58
+ return false;
59
+ }
60
+
61
+ // Check if any source file is newer than the binary
62
+ for (const path of sourceDirs) {
63
+ if (!existsSync(path)) continue;
64
+
65
+ const stats = statSync(path);
66
+ if (stats.isFile()) {
67
+ // For files (like Cargo.toml, build.rs)
68
+ const fileTime = stats.mtime.getTime();
69
+ if (fileTime > binaryTime) {
70
+ console.log(`šŸ“ Source file changed: ${path}`);
71
+ return true;
72
+ }
73
+ } else if (stats.isDirectory()) {
74
+ // For directories (like ./src)
75
+ if (checkDir(path)) {
76
+ return true;
77
+ }
78
+ }
79
+ }
80
+
81
+ return false;
82
+ }
83
+
32
84
  function main() {
33
85
  console.log('šŸš€ Building msger (Rust)...');
34
86
 
35
87
  if (isWindows()) {
36
88
  console.log('šŸ“ Running on Windows');
37
89
 
38
- // Try building with cargo directly first
39
- // Cargo should find the VS linker if available
40
- const success = runCommand('cargo build --release', 'Building Windows x64 binary (release)');
41
-
42
- if (success) {
43
- // Copy binary to parent directory with platform-specific name
44
- const srcPath = `./target/release/msgernative.exe`;
45
- const destPath = `../msgernative-win32-x64.exe`;
46
-
47
- if (existsSync(srcPath)) {
48
- copyFileSync(srcPath, destPath);
49
- console.log(`\nāœ… Binary copied to: ${destPath}`);
50
-
51
- // Show file size
52
- const stats = statSync(destPath);
53
- const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
54
- console.log(`šŸ“Š Binary size: ${sizeMB} MB`);
55
- }
90
+ const destPath = `./bin/msgernative.exe`;
91
+
92
+ // Check if rebuild is needed
93
+ if (!needsRebuild(destPath, ['./src', './Cargo.toml', './build.rs'])) {
94
+ console.log('āœ… Binary is up to date, skipping build');
95
+ console.log(` Binary: ${destPath}`);
96
+ const stats = statSync(destPath);
97
+ const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
98
+ console.log(` Size: ${sizeMB} MB`);
56
99
  } else {
57
- console.log('\nāš ļø Build failed. You may need to:');
58
- console.log(' 1. Open "x64 Native Tools Command Prompt for VS 2022"');
59
- console.log(' 2. Run: cd Y:\\dev\\utils\\msger && cargo build --release');
60
- console.log(' 3. Or install Visual Studio Build Tools with C++ workload');
61
- process.exit(1);
100
+ // Try building with cargo directly first
101
+ // Cargo should find the VS linker if available
102
+ const success = runCommand('cargo build --release', 'Building Windows x64 binary (release)');
103
+
104
+ if (success) {
105
+ // Copy binary to bin directory
106
+ const srcPath = `./target/release/msgernative.exe`;
107
+
108
+ if (existsSync(srcPath)) {
109
+ // Ensure bin directory exists
110
+ if (!existsSync('./bin')) {
111
+ mkdirSync('./bin', { recursive: true });
112
+ }
113
+
114
+ copyFileSync(srcPath, destPath);
115
+ console.log(`\nāœ… Binary copied to: ${destPath}`);
116
+
117
+ // Show file size
118
+ const stats = statSync(destPath);
119
+ const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
120
+ console.log(`šŸ“Š Binary size: ${sizeMB} MB`);
121
+ }
122
+ } else {
123
+ console.log('\nāš ļø Build failed. You may need to:');
124
+ console.log(' 1. Open "x64 Native Tools Command Prompt for VS 2022"');
125
+ console.log(' 2. Run: cd Y:\\dev\\utils\\msger && cargo build --release');
126
+ console.log(' 3. Or install Visual Studio Build Tools with C++ workload');
127
+ process.exit(1);
128
+ }
62
129
  }
63
130
 
64
131
  } else if (isWSL()) {
@@ -106,6 +173,16 @@ function main() {
106
173
  }
107
174
 
108
175
  console.log('\nšŸŽ‰ Build process completed!');
176
+
177
+ // Check if ARM64 binary exists
178
+ const arm64BinaryPath = `./bin/msgernative-arm64`;
179
+ if (!existsSync(arm64BinaryPath)) {
180
+ // Reminder about ARM64/Pi build
181
+ console.log('\n\x1b[30m\x1b[41m \x1b[0m');
182
+ console.log('\x1b[30m\x1b[41m āš ļø REMINDER: ARM64/Pi binary not built \x1b[0m');
183
+ console.log('\x1b[30m\x1b[41m Run: .\\build-pi.ps1 to build for Raspberry Pi \x1b[0m');
184
+ console.log('\x1b[30m\x1b[41m \x1b[0m\n');
185
+ }
109
186
  }
110
187
 
111
188
  main();
@@ -141,12 +141,14 @@ fn generate_html(options: &MessageBoxOptions) -> String {
141
141
  // Load HTML template and replace placeholders
142
142
  let template = include_str!("template.html");
143
143
  let html = template
144
+ .replace("{TITLE}", &options.title)
144
145
  .replace("{CONTENT}", &html_content)
145
146
  .replace("{INPUT}", &input_html)
146
147
  .replace("{BUTTONS}", &buttons_html)
147
148
  .replace("{AUTO_SIZE}", if options.auto_size { "true" } else { "false" })
148
149
  .replace("{ZOOM_PERCENT}", &options.zoom_percent.unwrap_or(100.0).to_string())
149
- .replace("{DEFAULT_BUTTON}", options.buttons.first().unwrap_or(&"Cancel".to_string()));
150
+ .replace("{DEFAULT_BUTTON}", options.buttons.first().unwrap_or(&"Cancel".to_string()))
151
+ .replace("{TIMEOUT_SECONDS}", &options.timeout.map(|t| t.to_string()).unwrap_or_else(|| "0".to_string()));
150
152
 
151
153
  html
152
154
  }
@@ -2,6 +2,7 @@
2
2
  <html>
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
+ <title>{TITLE}</title>
5
6
  <style>
6
7
  body {
7
8
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
@@ -61,7 +62,7 @@
61
62
  }
62
63
  </style>
63
64
  </head>
64
- <body>
65
+ <body tabindex="0">
65
66
  <div id="content">
66
67
  {CONTENT}
67
68
  </div>
@@ -69,7 +70,39 @@
69
70
  <div id="buttons">
70
71
  {BUTTONS}
71
72
  </div>
73
+ <div id="countdown" style="position: fixed; top: 5px; right: 5px; background: rgba(255, 255, 0, 0.3); padding: 5px 10px; font-size: 14px; font-weight: bold; border-radius: 4px; display: none;"></div>
72
74
  <script>
75
+ // Countdown timer overlay
76
+ try {
77
+ const timeoutSeconds = {TIMEOUT_SECONDS};
78
+
79
+ if (timeoutSeconds > 0) {
80
+ const countdownDiv = document.getElementById('countdown');
81
+ let remainingSeconds = timeoutSeconds;
82
+
83
+ const updateCountdown = () => {
84
+ if (remainingSeconds > 0) {
85
+ countdownDiv.textContent = `${remainingSeconds}s`;
86
+ countdownDiv.style.display = 'block';
87
+ } else {
88
+ countdownDiv.style.display = 'none';
89
+ }
90
+ };
91
+
92
+ updateCountdown(); // Set initial countdown
93
+
94
+ const countdownInterval = setInterval(() => {
95
+ remainingSeconds--;
96
+ updateCountdown();
97
+ if (remainingSeconds <= 0) {
98
+ clearInterval(countdownInterval);
99
+ }
100
+ }, 1000);
101
+ }
102
+ } catch (e) {
103
+ // Silently fail if countdown doesn't work
104
+ }
105
+
73
106
  function sendResult(button) {
74
107
  const result = { button: button };
75
108
 
@@ -160,11 +193,29 @@
160
193
  }
161
194
  }, { passive: false });
162
195
 
196
+ // Ensure body has focus for keyboard events - try multiple strategies
197
+ window.addEventListener('load', function() {
198
+ document.body.focus();
199
+ });
200
+
201
+ // Also focus when window gets focus
202
+ window.addEventListener('focus', function() {
203
+ document.body.focus();
204
+ });
205
+
206
+ // And try again after a short delay
207
+ setTimeout(() => {
208
+ document.body.focus();
209
+ }, 100);
210
+
163
211
  document.addEventListener('keydown', function(e) {
164
212
  if (e.key === 'Escape') {
213
+ e.preventDefault();
165
214
  const result = { button: 'Cancel', dismissed: true };
166
215
  window.ipc.postMessage(JSON.stringify(result));
167
216
  } else if (e.key === 'Enter') {
217
+ // Prevent default form submission
218
+ e.preventDefault();
168
219
  const buttons = document.querySelectorAll('button');
169
220
  if (buttons.length > 0) {
170
221
  buttons[buttons.length - 1].click();
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/msger",
3
- "version": "0.1.67",
3
+ "version": "0.1.71",
4
4
  "description": "Fast, lightweight, cross-platform message box - Rust-powered alternative to msgview",
5
5
  "type": "module",
6
6
  "main": "./index.js",
package/shower.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+I1F"}
1
+ {"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqJ1F"}