synheart_core 0.2.0
synheart_core: ^0.2.0 copied to clipboard
Flutter SDK for the Human State Interface (HSI) 1.3 — unified collection of wearable, behavior, and phone signals with consent-gated cloud upload.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased #
0.2.0 - 2026-05-09 #
Added #
- HSI 1.3 envelope parsing in
HSIStateandHSIPayload. Producers emit the closed 5-axis domain set (physiological,kinematic,digital,cognitive,affective) with deterministic UUIDv5hsi_id. The SDK now parses the new shape and exposes the digital readings (focus_quality,interruption_pressure,interaction_mode) alongside the existing physiological / cognitive / affective fields. The 1.2 wire shape is still accepted as a fallback; consumers should not rely on that path long-term.
Fixed #
BehaviorModule._convertSynheartEventnow forwardsBehaviorEventType.app_switchto the runtime instead of dropping it via the default-arm. The runtime needsapp_switchto detect notification responses (an app switch shortly after a notification) and to anchor session boundaries between foreground events of different apps. Without this forward, the digital readings on the HSI 1.3 envelope (axes.digital[]—focus_quality,interruption_pressure,interaction_mode) were silent on iOS and Android.
0.1.1 - 2026-05-08 #
Changed #
- Bumped
synheart_authdep to^0.1.2. Picks up the Maven Centralai.synheart:synheart-auth:0.1.1upgrade (clock-skew auto-apply, register/rotate race fix, HTTP timeouts, §13 audit-log PII redaction).
0.1.0 - 2026-05-08 #
First public open-source release on pub.dev. The SDK is now a thin FFI shell over the native Synheart Runtime — storage, crypto, sync, consent, the artifact pipeline, the cloud connector, and SRM live in the runtime, and this package exposes them through a Dart surface.
The native runtime is license-gated and installed via the
Synheart CLI
(synheart install runtime); see the README.
This release consolidates the OSS-launch refactors that were tagged
internally as 0.0.3 and 0.0.4 but never reached pub.dev, plus the
post-tag breaking change to processVendorEvent.
Breaking #
Synheart.processVendorEvent(...)andWearModule.processVendorEvent(...)now returnFuture<CanonicalWearableEvent?>instead ofFuture<void>. The previous void return discarded the canonical event the vendor payload was mapped to. Mirrors the Swift and Kotlin counterparts.- Removed
CloudConfig.tenantId. Drop the argument —app_idis the only identifier the SDK sends. - Removed
CloudConfig.hmacSecret. Request signing uses the device key;authProvideris now optional. - Removed
InvalidTenantError. ConsentFormshape is flat (profile_id,biosignals,phone_context,behavior,consent_tier,allow_cloud,allow_research,allow_vendor_sync) to mirror the runtime. Hosts that previously builtcategories[] → channels[]structures must migrate to the flat form.- Consent type strings are snake_case at the runtime boundary
(
phone_context/cloud_upload/vendor_sync). Flutter still accepts camelCase on its public API. - Removed
ConsentCategoryandConsentChanneltypes — channel-level truth is owned by the runtime.
Added #
Synheart.rawRamenEvents— broadcastStream<RamenEvent>re-exported fromsynheart_wear, surfacing every RAMEN event with its capability-flavoreddeliveryHint.app_id/user_idfrom the activestartVendorSyncconfig are stamped onto each event soRamenEventDispatchercan drive REST pulls without extra plumbing.- Offline-first consent FFI surface:
consentConfigureCloud,consentGetEditableForm,consentSubmitForm,consentEffectiveState,consentStatus,consentNeedsTokenRefresh,consentClearStored. Local choice is persisted immediately; cloud sync is best-effort. - Typed consent form accessors:
consentGetEditableFormTyped()andconsentSubmitFormTyped({ required ConsentForm form, … }). - Consent coverage for
vendorSyncandresearchthroughhasConsent()/getConsentStatusMap()and the granular grant API. - Durable
data_dirfor the native runtime viapath_provider. Fixes SRM snapshots and the artifact SQLite landing instd::env::temp_dir()(cleaned up by the OS), which broke baseline persistence across app restarts.
Changed #
setStreamCallbackauto-route now skipsdelivery_hint == "ping"events. Their inlinepayload_jsonis empty by design (Garmin / Oura / Fitbit only send a notification), so apps must subscribe torawRamenEventsand useRamenEventDispatcherto fetch the full record before re-feeding the canonical pipeline.- README rewritten to match the actual public API.
- Dependencies on sibling Synheart SDKs are now hosted on pub.dev
(
synheart_wear ^0.4.0,synheart_session ^0.2.0,synheart_behavior ^0.3.0,synheart_auth ^0.1.1) instead of git refs.