@adventurelabs/scout-core 2.0.7 → 2.0.9

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/README.md CHANGED
@@ -35,6 +35,8 @@ barrel.
35
35
  `ScoutRefreshProvider` accepts an existing browser Supabase client and otherwise
36
36
  creates one stable client. Its automatic refresh uses a fresh IndexedDB cache
37
37
  without another request; manual and reconnect refreshes still query the API.
38
+ Returning to a visible tab revalidates herd data and refreshes JWT mints that
39
+ are near expiry, covering browsers that suspend background timers.
38
40
  Offline PWAs can pass a persisted `offlineUserId` to restore that user's herd
39
41
  modules and JWT mints before online authentication is revalidated. Cached mints
40
42
  remain available when expired; pass `false` as the fourth argument to
@@ -42,6 +42,7 @@ export { create_device_query as create_device, delete_device_by_id_query as dele
42
42
  export { create_document_template_query as create_document_template, get_document_template_by_id_query as get_document_template_by_id, get_document_templates_by_localization_query as get_document_templates_by_localization, get_document_templates_query as get_document_templates, update_document_template_query as update_document_template, } from "../helpers/document_templates.queries";
43
43
  export { search_embeddings_vertex_multimodal_001_query as search_embeddings_vertex_multimodal_001 } from "../helpers/embeddings.queries";
44
44
  export { delete_event_query as delete_event, get_event_by_id_query as get_event_by_id, get_total_events_by_herd_query as get_total_events_by_herd, insert_event_query as insert_event, match_events_by_vertex_embedding_query as match_events_by_vertex_embedding, update_event_query as update_event, } from "../helpers/events.queries";
45
+ export { create_battery_cycle_count_query as create_battery_cycle_count, delete_battery_cycle_count_query as delete_battery_cycle_count, get_battery_cycle_counts_by_battery_id_query as get_battery_cycle_counts_by_battery_id, update_battery_cycle_count_query as update_battery_cycle_count, } from "../helpers/battery_cycle_counts.queries";
45
46
  export { get_health_metrics_query as get_health_metrics, get_health_metrics_summary_query as get_health_metrics_summary, } from "../helpers/health_metrics.queries";
46
47
  export { check_device_online_status_query as check_device_online_status, get_heartbeats_by_device_query as get_heartbeats_by_device, get_last_heartbeat_by_device_query as get_last_heartbeat_by_device, } from "../helpers/heartbeats.queries";
47
48
  export { get_herd_allowed_domains_query as get_herd_allowed_domains } from "../helpers/herd_allowed_domains.queries";
@@ -47,6 +47,7 @@ export { create_device_query as create_device, delete_device_by_id_query as dele
47
47
  export { create_document_template_query as create_document_template, get_document_template_by_id_query as get_document_template_by_id, get_document_templates_by_localization_query as get_document_templates_by_localization, get_document_templates_query as get_document_templates, update_document_template_query as update_document_template, } from "../helpers/document_templates.queries";
48
48
  export { search_embeddings_vertex_multimodal_001_query as search_embeddings_vertex_multimodal_001 } from "../helpers/embeddings.queries";
49
49
  export { delete_event_query as delete_event, get_event_by_id_query as get_event_by_id, get_total_events_by_herd_query as get_total_events_by_herd, insert_event_query as insert_event, match_events_by_vertex_embedding_query as match_events_by_vertex_embedding, update_event_query as update_event, } from "../helpers/events.queries";
50
+ export { create_battery_cycle_count_query as create_battery_cycle_count, delete_battery_cycle_count_query as delete_battery_cycle_count, get_battery_cycle_counts_by_battery_id_query as get_battery_cycle_counts_by_battery_id, update_battery_cycle_count_query as update_battery_cycle_count, } from "../helpers/battery_cycle_counts.queries";
50
51
  export { get_health_metrics_query as get_health_metrics, get_health_metrics_summary_query as get_health_metrics_summary, } from "../helpers/health_metrics.queries";
51
52
  export { check_device_online_status_query as check_device_online_status, get_heartbeats_by_device_query as get_heartbeats_by_device, get_last_heartbeat_by_device_query as get_last_heartbeat_by_device, } from "../helpers/heartbeats.queries";
52
53
  export { get_herd_allowed_domains_query as get_herd_allowed_domains } from "../helpers/herd_allowed_domains.queries";
@@ -0,0 +1,6 @@
1
+ import { BatteryCycleCountInsert, BatteryCycleCountUpdate, IBatteryCycleCount } from "../types/db";
2
+ import { IWebResponseCompatible } from "../types/requests";
3
+ export declare function server_get_battery_cycle_counts_by_battery_id(batteryId: number): Promise<IWebResponseCompatible<IBatteryCycleCount[]>>;
4
+ export declare function server_create_battery_cycle_count(row: BatteryCycleCountInsert): Promise<IWebResponseCompatible<IBatteryCycleCount | null>>;
5
+ export declare function server_update_battery_cycle_count(id: number, updates: BatteryCycleCountUpdate): Promise<IWebResponseCompatible<IBatteryCycleCount | null>>;
6
+ export declare function server_delete_battery_cycle_count(id: number): Promise<IWebResponseCompatible<boolean>>;
@@ -0,0 +1,14 @@
1
+ import { newServerClient } from "../supabase/server";
2
+ import { create_battery_cycle_count_query, delete_battery_cycle_count_query, get_battery_cycle_counts_by_battery_id_query, update_battery_cycle_count_query, } from "./battery_cycle_counts.queries";
3
+ export async function server_get_battery_cycle_counts_by_battery_id(batteryId) {
4
+ return get_battery_cycle_counts_by_battery_id_query(await newServerClient(), batteryId);
5
+ }
6
+ export async function server_create_battery_cycle_count(row) {
7
+ return create_battery_cycle_count_query(await newServerClient(), row);
8
+ }
9
+ export async function server_update_battery_cycle_count(id, updates) {
10
+ return update_battery_cycle_count_query(await newServerClient(), id, updates);
11
+ }
12
+ export async function server_delete_battery_cycle_count(id) {
13
+ return delete_battery_cycle_count_query(await newServerClient(), id);
14
+ }
@@ -0,0 +1,8 @@
1
+ import { SupabaseClient } from "@supabase/supabase-js";
2
+ import { BatteryCycleCountInsert, BatteryCycleCountUpdate, IBatteryCycleCount } from "../types/db";
3
+ import { IWebResponseCompatible } from "../types/requests";
4
+ import { Database } from "../types/supabase";
5
+ export declare function get_battery_cycle_counts_by_battery_id_query(client: SupabaseClient<Database>, batteryId: number): Promise<IWebResponseCompatible<IBatteryCycleCount[]>>;
6
+ export declare function create_battery_cycle_count_query(client: SupabaseClient<Database>, row: BatteryCycleCountInsert): Promise<IWebResponseCompatible<IBatteryCycleCount | null>>;
7
+ export declare function update_battery_cycle_count_query(client: SupabaseClient<Database>, id: number, updates: BatteryCycleCountUpdate): Promise<IWebResponseCompatible<IBatteryCycleCount | null>>;
8
+ export declare function delete_battery_cycle_count_query(client: SupabaseClient<Database>, id: number): Promise<IWebResponseCompatible<boolean>>;
@@ -0,0 +1,62 @@
1
+ import { EnumWebResponse, IWebResponse, } from "../types/requests";
2
+ export async function get_battery_cycle_counts_by_battery_id_query(client, batteryId) {
3
+ const { data, error } = await client
4
+ .from("battery_cycle_counts")
5
+ .select("*")
6
+ .eq("battery_id", batteryId)
7
+ .order("timestamp_observation", { ascending: false });
8
+ if (error) {
9
+ return {
10
+ status: EnumWebResponse.ERROR,
11
+ msg: error.message,
12
+ data: [],
13
+ };
14
+ }
15
+ return IWebResponse.success(data ?? []).to_compatible();
16
+ }
17
+ export async function create_battery_cycle_count_query(client, row) {
18
+ const { data, error } = await client
19
+ .from("battery_cycle_counts")
20
+ .insert(row)
21
+ .select("*")
22
+ .single();
23
+ if (error) {
24
+ return {
25
+ status: EnumWebResponse.ERROR,
26
+ msg: error.message,
27
+ data: null,
28
+ };
29
+ }
30
+ return IWebResponse.success(data).to_compatible();
31
+ }
32
+ export async function update_battery_cycle_count_query(client, id, updates) {
33
+ const { inserted_at: _insertedAt, ...patch } = updates;
34
+ const { data, error } = await client
35
+ .from("battery_cycle_counts")
36
+ .update(patch)
37
+ .eq("id", id)
38
+ .select("*")
39
+ .single();
40
+ if (error) {
41
+ return {
42
+ status: EnumWebResponse.ERROR,
43
+ msg: error.message,
44
+ data: null,
45
+ };
46
+ }
47
+ return IWebResponse.success(data).to_compatible();
48
+ }
49
+ export async function delete_battery_cycle_count_query(client, id) {
50
+ const { error } = await client
51
+ .from("battery_cycle_counts")
52
+ .delete()
53
+ .eq("id", id);
54
+ if (error) {
55
+ return {
56
+ status: EnumWebResponse.ERROR,
57
+ msg: error.message,
58
+ data: false,
59
+ };
60
+ }
61
+ return IWebResponse.success(true).to_compatible();
62
+ }
@@ -52,6 +52,7 @@ export declare function server_update_session_lifecycle(session_id: number, life
52
52
  lifecycle_reason: string | null;
53
53
  locations: unknown;
54
54
  post_approver: string | null;
55
+ secondary_battery_id: number | null;
55
56
  software_version: string;
56
57
  start_approver: string | null;
57
58
  status: import("../types").Database["public"]["Enums"]["session_status"];
@@ -355,14 +355,25 @@ export function useScoutRefresh(options = {}, identityOptions = {}) {
355
355
  useEffect(() => {
356
356
  if (!autoRefresh || typeof window === "undefined")
357
357
  return;
358
- const handleOnline = () => {
358
+ const revalidate = () => {
359
+ if (!navigator.onLine)
360
+ return;
359
361
  const now = Date.now();
360
362
  if (now - lastQueryAtRef.current >= onlineRefetchMinIntervalMs) {
361
363
  void handleRefresh({ force: true });
362
364
  }
363
365
  };
364
- window.addEventListener("online", handleOnline);
365
- return () => window.removeEventListener("online", handleOnline);
366
+ const handleVisibilityChange = () => {
367
+ if (document.visibilityState === "visible") {
368
+ revalidate();
369
+ }
370
+ };
371
+ window.addEventListener("online", revalidate);
372
+ document.addEventListener("visibilitychange", handleVisibilityChange);
373
+ return () => {
374
+ window.removeEventListener("online", revalidate);
375
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
376
+ };
366
377
  }, [autoRefresh, handleRefresh, onlineRefetchMinIntervalMs]);
367
378
  const clearCache = useCallback(async () => {
368
379
  try {
@@ -82,6 +82,7 @@ function useJwtMintLifecycle({ enabled, supabase, identity, cacheKey, ttlSec, re
82
82
  const [mint, setMint] = useState(null);
83
83
  const [inFlight, setInFlight] = useState(false);
84
84
  const [error, setError] = useState(null);
85
+ const [offline, setOffline] = useState(isBrowserOffline);
85
86
  const refreshIdRef = useRef(0);
86
87
  const authUserIdRef = useRef(null);
87
88
  const cacheHydrationIdRef = useRef(0);
@@ -101,7 +102,7 @@ function useJwtMintLifecycle({ enabled, supabase, identity, cacheKey, ttlSec, re
101
102
  console.error("[ScoutRefreshProvider] User validation callback failed:", validationError);
102
103
  }
103
104
  }, [onUserValidated]);
104
- const status = useMemo(() => derive_jwt_mint_status(enabled, mint, inFlight, error), [enabled, mint, inFlight, error]);
105
+ const status = useMemo(() => derive_jwt_mint_status(enabled, mint, inFlight, error, offline), [enabled, mint, inFlight, error, offline]);
105
106
  const refreshMint = useCallback(async (force = true) => {
106
107
  if (!enabled || isBrowserOffline())
107
108
  return;
@@ -312,15 +313,36 @@ function useJwtMintLifecycle({ enabled, supabase, identity, cacheKey, ttlSec, re
312
313
  }
313
314
  });
314
315
  const handleOnline = () => {
316
+ setOffline(false);
315
317
  void refreshMint(false);
316
318
  };
319
+ const handleOffline = () => {
320
+ setOffline(true);
321
+ };
322
+ const handleVisibilityChange = () => {
323
+ if (document.visibilityState !== "visible")
324
+ return;
325
+ const currentlyOffline = isBrowserOffline();
326
+ setOffline(currentlyOffline);
327
+ if (currentlyOffline)
328
+ return;
329
+ const currentMint = mintRef.current;
330
+ if (!currentMint ||
331
+ shouldRefreshMint(currentMint, ttlSec, refreshBeforeExpirySec)) {
332
+ void refreshMint(false);
333
+ }
334
+ };
317
335
  window.addEventListener("online", handleOnline);
336
+ window.addEventListener("offline", handleOffline);
337
+ document.addEventListener("visibilitychange", handleVisibilityChange);
318
338
  return () => {
319
339
  cancelled = true;
320
340
  cacheHydrationIdRef.current++;
321
341
  refreshIdRef.current++;
322
342
  unsubscribeAuth();
323
343
  window.removeEventListener("online", handleOnline);
344
+ window.removeEventListener("offline", handleOffline);
345
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
324
346
  };
325
347
  }, [
326
348
  enabled,
@@ -328,6 +350,8 @@ function useJwtMintLifecycle({ enabled, supabase, identity, cacheKey, ttlSec, re
328
350
  offlineUserId,
329
351
  validatedUserId,
330
352
  cacheKey,
353
+ ttlSec,
354
+ refreshBeforeExpirySec,
331
355
  refreshMint,
332
356
  updateMint,
333
357
  ]);
@@ -26,6 +26,7 @@ export { serverCreateDevice as create_device, serverDeleteDeviceById as delete_d
26
26
  export { server_create_document_template as create_document_template, server_get_document_template_by_id as get_document_template_by_id, server_get_document_templates_by_localization as get_document_templates_by_localization, server_get_document_templates as get_document_templates, server_update_document_template as update_document_template, } from "../helpers/document_templates";
27
27
  export { server_search_embeddings_vertex_multimodal_001 as search_embeddings_vertex_multimodal_001 } from "../helpers/embeddings";
28
28
  export { server_delete_event as delete_event, server_get_event_by_id as get_event_by_id, server_get_total_events_by_herd as get_total_events_by_herd, server_insert_event as insert_event, server_match_events_by_vertex_embedding as match_events_by_vertex_embedding, server_update_event as update_event, } from "../helpers/events";
29
+ export { server_create_battery_cycle_count as create_battery_cycle_count, server_delete_battery_cycle_count as delete_battery_cycle_count, server_get_battery_cycle_counts_by_battery_id as get_battery_cycle_counts_by_battery_id, server_update_battery_cycle_count as update_battery_cycle_count, } from "../helpers/battery_cycle_counts";
29
30
  export { server_get_health_metrics as get_health_metrics, server_get_health_metrics_summary as get_health_metrics_summary, } from "../helpers/health_metrics";
30
31
  export { server_check_device_online_status as check_device_online_status, server_get_heartbeats_by_device as get_heartbeats_by_device, server_get_last_heartbeat_by_device as get_last_heartbeat_by_device, } from "../helpers/heartbeats";
31
32
  export { server_get_herd_allowed_domains as get_herd_allowed_domains } from "../helpers/herd_allowed_domains";
@@ -26,6 +26,7 @@ export { serverCreateDevice as create_device, serverDeleteDeviceById as delete_d
26
26
  export { server_create_document_template as create_document_template, server_get_document_template_by_id as get_document_template_by_id, server_get_document_templates_by_localization as get_document_templates_by_localization, server_get_document_templates as get_document_templates, server_update_document_template as update_document_template, } from "../helpers/document_templates";
27
27
  export { server_search_embeddings_vertex_multimodal_001 as search_embeddings_vertex_multimodal_001 } from "../helpers/embeddings";
28
28
  export { server_delete_event as delete_event, server_get_event_by_id as get_event_by_id, server_get_total_events_by_herd as get_total_events_by_herd, server_insert_event as insert_event, server_match_events_by_vertex_embedding as match_events_by_vertex_embedding, server_update_event as update_event, } from "../helpers/events";
29
+ export { server_create_battery_cycle_count as create_battery_cycle_count, server_delete_battery_cycle_count as delete_battery_cycle_count, server_get_battery_cycle_counts_by_battery_id as get_battery_cycle_counts_by_battery_id, server_update_battery_cycle_count as update_battery_cycle_count, } from "../helpers/battery_cycle_counts";
29
30
  export { server_get_health_metrics as get_health_metrics, server_get_health_metrics_summary as get_health_metrics_summary, } from "../helpers/health_metrics";
30
31
  export { server_check_device_online_status as check_device_online_status, server_get_heartbeats_by_device as get_heartbeats_by_device, server_get_last_heartbeat_by_device as get_last_heartbeat_by_device, } from "../helpers/heartbeats";
31
32
  export { server_get_herd_allowed_domains as get_herd_allowed_domains } from "../helpers/herd_allowed_domains";
@@ -206,6 +206,9 @@ export type IVersionsSoftware = Database["public"]["Tables"]["versions_software"
206
206
  export type IArtifact = Database["public"]["Tables"]["artifacts"]["Row"];
207
207
  export type IHealthMetric = Database["public"]["Tables"]["health_metrics"]["Row"];
208
208
  export type IHealthMetricSummaryRow = Database["public"]["Functions"]["get_health_metrics_summary"]["Returns"][number];
209
+ export type IBatteryCycleCount = Database["public"]["Tables"]["battery_cycle_counts"]["Row"];
210
+ export type BatteryCycleCountInsert = Database["public"]["Tables"]["battery_cycle_counts"]["Insert"];
211
+ export type BatteryCycleCountUpdate = Database["public"]["Tables"]["battery_cycle_counts"]["Update"];
209
212
  export type IMinimalSubjectForArtifact = Database["public"]["Functions"]["get_minimal_subjects_for_artifact"]["Returns"][number];
210
213
  export type IAnalysisJob = Database["public"]["Tables"]["analysis_jobs"]["Row"];
211
214
  export type IAnalysisTask = Database["public"]["Tables"]["analysis_tasks"]["Row"];
@@ -7,4 +7,5 @@ export declare enum EnumJwtMintStatus {
7
7
  }
8
8
  export declare function derive_jwt_mint_status(enabled: boolean, mint: {
9
9
  token: string;
10
- } | null | undefined, inFlight: boolean, error: string | null): EnumJwtMintStatus;
10
+ exp?: number;
11
+ } | null | undefined, inFlight: boolean, error: string | null, allowExpired?: boolean): EnumJwtMintStatus;
@@ -6,17 +6,18 @@ export var EnumJwtMintStatus;
6
6
  EnumJwtMintStatus["READY"] = "ready";
7
7
  EnumJwtMintStatus["ERROR"] = "error";
8
8
  })(EnumJwtMintStatus || (EnumJwtMintStatus = {}));
9
- export function derive_jwt_mint_status(enabled, mint, inFlight, error) {
9
+ export function derive_jwt_mint_status(enabled, mint, inFlight, error, allowExpired = false) {
10
10
  if (!enabled) {
11
11
  return EnumJwtMintStatus.IDLE;
12
12
  }
13
- if (inFlight && !mint?.token) {
14
- return EnumJwtMintStatus.LOADING;
13
+ const expired = mint?.exp != null && mint.exp <= Math.floor(Date.now() / 1000);
14
+ const hasUsableMint = Boolean(mint?.token) && (allowExpired || !expired);
15
+ if (inFlight) {
16
+ return hasUsableMint
17
+ ? EnumJwtMintStatus.REFRESHING
18
+ : EnumJwtMintStatus.LOADING;
15
19
  }
16
- if (inFlight && mint?.token) {
17
- return EnumJwtMintStatus.REFRESHING;
18
- }
19
- if (mint?.token) {
20
+ if (hasUsableMint) {
20
21
  return EnumJwtMintStatus.READY;
21
22
  }
22
23
  if (error) {
@@ -347,6 +347,38 @@ export type Database = {
347
347
  }
348
348
  ];
349
349
  };
350
+ battery_cycle_counts: {
351
+ Row: {
352
+ battery_id: number;
353
+ cycle_count: number;
354
+ id: number;
355
+ inserted_at: string;
356
+ timestamp_observation: string;
357
+ };
358
+ Insert: {
359
+ battery_id: number;
360
+ cycle_count: number;
361
+ id?: number;
362
+ inserted_at?: string;
363
+ timestamp_observation: string;
364
+ };
365
+ Update: {
366
+ battery_id?: number;
367
+ cycle_count?: number;
368
+ id?: number;
369
+ inserted_at?: string;
370
+ timestamp_observation?: string;
371
+ };
372
+ Relationships: [
373
+ {
374
+ foreignKeyName: "battery_cycle_counts_battery_id_fkey";
375
+ columns: ["battery_id"];
376
+ isOneToOne: false;
377
+ referencedRelation: "parts";
378
+ referencedColumns: ["id"];
379
+ }
380
+ ];
381
+ };
350
382
  calibrations: {
351
383
  Row: {
352
384
  id: number;
@@ -678,6 +710,8 @@ export type Database = {
678
710
  mode: string | null;
679
711
  noise: number | null;
680
712
  quality_normalized: number | null;
713
+ secondary_battery_percentage: number | null;
714
+ secondary_battery_volts: number | null;
681
715
  session_id: number | null;
682
716
  signal: number | null;
683
717
  timestamp_start: string;
@@ -702,6 +736,8 @@ export type Database = {
702
736
  mode?: string | null;
703
737
  noise?: number | null;
704
738
  quality_normalized?: number | null;
739
+ secondary_battery_percentage?: number | null;
740
+ secondary_battery_volts?: number | null;
705
741
  session_id?: number | null;
706
742
  signal?: number | null;
707
743
  timestamp_start: string;
@@ -726,6 +762,8 @@ export type Database = {
726
762
  mode?: string | null;
727
763
  noise?: number | null;
728
764
  quality_normalized?: number | null;
765
+ secondary_battery_percentage?: number | null;
766
+ secondary_battery_volts?: number | null;
729
767
  session_id?: number | null;
730
768
  signal?: number | null;
731
769
  timestamp_start?: string;
@@ -2823,6 +2861,7 @@ export type Database = {
2823
2861
  created_at: string;
2824
2862
  created_by: string | null;
2825
2863
  description: string | null;
2864
+ frequency_required_for_contacts: boolean;
2826
2865
  herd_id: number;
2827
2866
  id: number;
2828
2867
  lifecycle: Database["public"]["Enums"]["entity_lifecycle"];
@@ -2840,6 +2879,7 @@ export type Database = {
2840
2879
  created_at?: string;
2841
2880
  created_by?: string | null;
2842
2881
  description?: string | null;
2882
+ frequency_required_for_contacts?: boolean;
2843
2883
  herd_id: number;
2844
2884
  id?: number;
2845
2885
  lifecycle?: Database["public"]["Enums"]["entity_lifecycle"];
@@ -2857,6 +2897,7 @@ export type Database = {
2857
2897
  created_at?: string;
2858
2898
  created_by?: string | null;
2859
2899
  description?: string | null;
2900
+ frequency_required_for_contacts?: boolean;
2860
2901
  herd_id?: number;
2861
2902
  id?: number;
2862
2903
  lifecycle?: Database["public"]["Enums"]["entity_lifecycle"];
@@ -3987,6 +4028,7 @@ export type Database = {
3987
4028
  category: string | null;
3988
4029
  description: string | null;
3989
4030
  id: number;
4031
+ image_uri: string | null;
3990
4032
  inserted_at: string;
3991
4033
  lifecycle: Database["public"]["Enums"]["entity_lifecycle"];
3992
4034
  lifecycle_changed_at: string;
@@ -4000,6 +4042,7 @@ export type Database = {
4000
4042
  category?: string | null;
4001
4043
  description?: string | null;
4002
4044
  id?: number;
4045
+ image_uri?: string | null;
4003
4046
  inserted_at?: string;
4004
4047
  lifecycle?: Database["public"]["Enums"]["entity_lifecycle"];
4005
4048
  lifecycle_changed_at?: string;
@@ -4013,6 +4056,7 @@ export type Database = {
4013
4056
  category?: string | null;
4014
4057
  description?: string | null;
4015
4058
  id?: number;
4059
+ image_uri?: string | null;
4016
4060
  inserted_at?: string;
4017
4061
  lifecycle?: Database["public"]["Enums"]["entity_lifecycle"];
4018
4062
  lifecycle_changed_at?: string;
@@ -4442,6 +4486,7 @@ export type Database = {
4442
4486
  lifecycle_reason: string | null;
4443
4487
  locations: unknown;
4444
4488
  post_approver: string | null;
4489
+ secondary_battery_id: number | null;
4445
4490
  software_version: string;
4446
4491
  start_approver: string | null;
4447
4492
  status: Database["public"]["Enums"]["session_status"];
@@ -4469,6 +4514,7 @@ export type Database = {
4469
4514
  lifecycle_reason?: string | null;
4470
4515
  locations?: unknown;
4471
4516
  post_approver?: string | null;
4517
+ secondary_battery_id?: number | null;
4472
4518
  software_version: string;
4473
4519
  start_approver?: string | null;
4474
4520
  status?: Database["public"]["Enums"]["session_status"];
@@ -4496,6 +4542,7 @@ export type Database = {
4496
4542
  lifecycle_reason?: string | null;
4497
4543
  locations?: unknown;
4498
4544
  post_approver?: string | null;
4545
+ secondary_battery_id?: number | null;
4499
4546
  software_version?: string;
4500
4547
  start_approver?: string | null;
4501
4548
  status?: Database["public"]["Enums"]["session_status"];
@@ -4541,6 +4588,13 @@ export type Database = {
4541
4588
  referencedRelation: "users";
4542
4589
  referencedColumns: ["id"];
4543
4590
  },
4591
+ {
4592
+ foreignKeyName: "sessions_secondary_battery_id_fkey";
4593
+ columns: ["secondary_battery_id"];
4594
+ isOneToOne: false;
4595
+ referencedRelation: "parts";
4596
+ referencedColumns: ["id"];
4597
+ },
4544
4598
  {
4545
4599
  foreignKeyName: "sessions_start_approver_fkey";
4546
4600
  columns: ["start_approver"];
@@ -6488,6 +6542,7 @@ export type Database = {
6488
6542
  lifecycle_reason: string | null;
6489
6543
  locations: unknown;
6490
6544
  post_approver: string | null;
6545
+ secondary_battery_id: number | null;
6491
6546
  software_version: string;
6492
6547
  start_approver: string | null;
6493
6548
  status: Database["public"]["Enums"]["session_status"];
@@ -6777,6 +6832,8 @@ export type Database = {
6777
6832
  battery_volts: number | null;
6778
6833
  link_type: Database["public"]["Enums"]["link_type"] | null;
6779
6834
  quality_normalized: number | null;
6835
+ secondary_battery_percentage: number | null;
6836
+ secondary_battery_volts: number | null;
6780
6837
  };
6781
6838
  device_heartbeat_analysis: {
6782
6839
  device_id: number | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adventurelabs/scout-core",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "description": "Core utilities and helpers for Adventure Labs Scout applications",
5
5
  "exports": {
6
6
  "./client": {