@adventurelabs/scout-core 1.4.54 → 1.4.56
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/dist/helpers/events.d.ts +1 -0
- package/dist/helpers/events.js +9 -0
- package/dist/helpers/session_summaries.d.ts +3 -3
- package/dist/helpers/session_summaries.js +6 -3
- package/dist/helpers/sessions.d.ts +2 -2
- package/dist/helpers/sessions.js +4 -2
- package/dist/hooks/useScoutBrowserClient.d.ts +11 -0
- package/dist/hooks/useScoutBrowserClient.js +17 -0
- package/dist/hooks/useScoutRefresh.d.ts +4 -0
- package/dist/hooks/useScoutRefresh.js +6 -4
- package/dist/providers/ScoutRefreshProvider.d.ts +2 -0
- package/dist/providers/ScoutRefreshProvider.js +1 -1
- package/dist/types/db.d.ts +1 -0
- package/dist/types/supabase.d.ts +2 -0
- package/package.json +1 -1
package/dist/helpers/events.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare function server_update_event(events: (EventUpdate & {
|
|
|
10
10
|
}) | (EventUpdate & {
|
|
11
11
|
id: number;
|
|
12
12
|
})[], client?: SupabaseClient): Promise<IWebResponseCompatible<IEvent[]>>;
|
|
13
|
+
export declare function server_delete_event(id: number | number[], client?: SupabaseClient): Promise<IWebResponseCompatible<boolean>>;
|
|
13
14
|
/** Semantic search over events using Vertex multimodal embedding (embedding_vertex_mm_01). */
|
|
14
15
|
export declare function server_match_events_by_vertex_embedding(query_embedding: number[], match_threshold: number, match_count: number, options?: {
|
|
15
16
|
herd_id?: number | null;
|
package/dist/helpers/events.js
CHANGED
|
@@ -94,6 +94,15 @@ export async function server_update_event(events, client) {
|
|
|
94
94
|
}
|
|
95
95
|
return IWebResponse.success(updatedEvents).to_compatible();
|
|
96
96
|
}
|
|
97
|
+
export async function server_delete_event(id, client) {
|
|
98
|
+
const supabase = client || (await newServerClient());
|
|
99
|
+
const ids = Array.isArray(id) ? id : [id];
|
|
100
|
+
const { error } = await supabase.from("events").delete().in("id", ids);
|
|
101
|
+
if (error) {
|
|
102
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
103
|
+
}
|
|
104
|
+
return IWebResponse.success(true).to_compatible();
|
|
105
|
+
}
|
|
97
106
|
/** Semantic search over events using Vertex multimodal embedding (embedding_vertex_mm_01). */
|
|
98
107
|
export async function server_match_events_by_vertex_embedding(query_embedding, match_threshold, match_count, options) {
|
|
99
108
|
const supabase = options?.client ?? (await newServerClient());
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ISessionSummary } from "../types/db";
|
|
2
2
|
import { IWebResponseCompatible } from "../types/requests";
|
|
3
3
|
import { SupabaseClient } from "@supabase/supabase-js";
|
|
4
|
-
export declare function server_get_session_summaries_by_herd(herd_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionSummary>>;
|
|
5
|
-
export declare function server_get_session_summaries_by_device(device_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionSummary>>;
|
|
6
|
-
export declare function server_get_session_summaries_with_filters(herd_id?: number, device_id?: number, start_date?: string, end_date?: string, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionSummary>>;
|
|
4
|
+
export declare function server_get_session_summaries_by_herd(herd_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number, product_numbers_caller?: string[]): Promise<IWebResponseCompatible<ISessionSummary>>;
|
|
5
|
+
export declare function server_get_session_summaries_by_device(device_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number, product_numbers_caller?: string[]): Promise<IWebResponseCompatible<ISessionSummary>>;
|
|
6
|
+
export declare function server_get_session_summaries_with_filters(herd_id?: number, device_id?: number, start_date?: string, end_date?: string, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number, product_numbers_caller?: string[]): Promise<IWebResponseCompatible<ISessionSummary>>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use server";
|
|
2
2
|
import { newServerClient } from "../supabase/server";
|
|
3
3
|
import { IWebResponse, } from "../types/requests";
|
|
4
|
-
export async function server_get_session_summaries_by_herd(herd_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
|
|
4
|
+
export async function server_get_session_summaries_by_herd(herd_id, client, min_duration_minutes_caller, min_distance_meters_caller, product_numbers_caller) {
|
|
5
5
|
const supabase = client || (await newServerClient());
|
|
6
6
|
const { data, error } = await supabase.rpc("get_session_summaries", {
|
|
7
7
|
start_date_caller: undefined,
|
|
@@ -10,6 +10,7 @@ export async function server_get_session_summaries_by_herd(herd_id, client, min_
|
|
|
10
10
|
herd_id_caller: herd_id,
|
|
11
11
|
min_duration_minutes_caller,
|
|
12
12
|
min_distance_meters_caller,
|
|
13
|
+
product_numbers_caller,
|
|
13
14
|
});
|
|
14
15
|
if (error) {
|
|
15
16
|
return IWebResponse.error(error.message).to_compatible();
|
|
@@ -19,7 +20,7 @@ export async function server_get_session_summaries_by_herd(herd_id, client, min_
|
|
|
19
20
|
}
|
|
20
21
|
return IWebResponse.success(data).to_compatible();
|
|
21
22
|
}
|
|
22
|
-
export async function server_get_session_summaries_by_device(device_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
|
|
23
|
+
export async function server_get_session_summaries_by_device(device_id, client, min_duration_minutes_caller, min_distance_meters_caller, product_numbers_caller) {
|
|
23
24
|
const supabase = client || (await newServerClient());
|
|
24
25
|
const { data, error } = await supabase.rpc("get_session_summaries", {
|
|
25
26
|
start_date_caller: undefined,
|
|
@@ -28,6 +29,7 @@ export async function server_get_session_summaries_by_device(device_id, client,
|
|
|
28
29
|
herd_id_caller: undefined,
|
|
29
30
|
min_duration_minutes_caller,
|
|
30
31
|
min_distance_meters_caller,
|
|
32
|
+
product_numbers_caller,
|
|
31
33
|
});
|
|
32
34
|
if (error) {
|
|
33
35
|
return IWebResponse.error(error.message).to_compatible();
|
|
@@ -37,7 +39,7 @@ export async function server_get_session_summaries_by_device(device_id, client,
|
|
|
37
39
|
}
|
|
38
40
|
return IWebResponse.success(data).to_compatible();
|
|
39
41
|
}
|
|
40
|
-
export async function server_get_session_summaries_with_filters(herd_id, device_id, start_date, end_date, client, min_duration_minutes_caller, min_distance_meters_caller) {
|
|
42
|
+
export async function server_get_session_summaries_with_filters(herd_id, device_id, start_date, end_date, client, min_duration_minutes_caller, min_distance_meters_caller, product_numbers_caller) {
|
|
41
43
|
const supabase = client || (await newServerClient());
|
|
42
44
|
const { data, error } = await supabase.rpc("get_session_summaries", {
|
|
43
45
|
start_date_caller: start_date || undefined,
|
|
@@ -46,6 +48,7 @@ export async function server_get_session_summaries_with_filters(herd_id, device_
|
|
|
46
48
|
herd_id_caller: herd_id || undefined,
|
|
47
49
|
min_duration_minutes_caller,
|
|
48
50
|
min_distance_meters_caller,
|
|
51
|
+
product_numbers_caller,
|
|
49
52
|
});
|
|
50
53
|
if (error) {
|
|
51
54
|
return IWebResponse.error(error.message).to_compatible();
|
|
@@ -2,8 +2,8 @@ import { ISessionWithCoordinates, ISessionUsageOverTime, IEventAndTagsPrettyLoca
|
|
|
2
2
|
import { IWebResponseCompatible } from "../types/requests";
|
|
3
3
|
import { SupabaseClient } from "@supabase/supabase-js";
|
|
4
4
|
export declare function server_get_session_by_id(sessionId: number, client?: SupabaseClient): Promise<IWebResponseCompatible<ISessionWithCoordinates | null>>;
|
|
5
|
-
export declare function server_get_session_usage_over_time_by_herd(herd_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
|
|
6
|
-
export declare function server_get_session_usage_over_time_by_device(device_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
|
|
5
|
+
export declare function server_get_session_usage_over_time_by_herd(herd_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number, product_numbers_caller?: string[]): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
|
|
6
|
+
export declare function server_get_session_usage_over_time_by_device(device_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number, product_numbers_caller?: string[]): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
|
|
7
7
|
export declare function server_get_events_and_tags_by_session_id(sessionId: number, limit?: number, offset?: number): Promise<IWebResponseCompatible<IEventAndTagsPrettyLocation[]>>;
|
|
8
8
|
export declare function server_insert_session(sessions: SessionInsert | SessionInsert[], client?: SupabaseClient): Promise<IWebResponseCompatible<ISession[]>>;
|
|
9
9
|
export declare function server_update_session(sessions: (SessionUpdate & {
|
package/dist/helpers/sessions.js
CHANGED
|
@@ -21,7 +21,7 @@ export async function server_get_session_by_id(sessionId, client) {
|
|
|
21
21
|
return IWebResponse.success(session).to_compatible();
|
|
22
22
|
}
|
|
23
23
|
// Get session usage over time by herd
|
|
24
|
-
export async function server_get_session_usage_over_time_by_herd(herd_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
|
|
24
|
+
export async function server_get_session_usage_over_time_by_herd(herd_id, client, min_duration_minutes_caller, min_distance_meters_caller, product_numbers_caller) {
|
|
25
25
|
const supabase = client || (await newServerClient());
|
|
26
26
|
const { data, error } = await supabase.rpc("get_session_usage_over_time", {
|
|
27
27
|
start_date_caller: undefined,
|
|
@@ -30,6 +30,7 @@ export async function server_get_session_usage_over_time_by_herd(herd_id, client
|
|
|
30
30
|
herd_id_caller: herd_id,
|
|
31
31
|
min_duration_minutes_caller,
|
|
32
32
|
min_distance_meters_caller,
|
|
33
|
+
product_numbers_caller,
|
|
33
34
|
});
|
|
34
35
|
if (error) {
|
|
35
36
|
return IWebResponse.error(error.message).to_compatible();
|
|
@@ -40,7 +41,7 @@ export async function server_get_session_usage_over_time_by_herd(herd_id, client
|
|
|
40
41
|
return IWebResponse.success(data).to_compatible();
|
|
41
42
|
}
|
|
42
43
|
// Get session usage over time by device
|
|
43
|
-
export async function server_get_session_usage_over_time_by_device(device_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
|
|
44
|
+
export async function server_get_session_usage_over_time_by_device(device_id, client, min_duration_minutes_caller, min_distance_meters_caller, product_numbers_caller) {
|
|
44
45
|
const supabase = client || (await newServerClient());
|
|
45
46
|
const { data, error } = await supabase.rpc("get_session_usage_over_time", {
|
|
46
47
|
start_date_caller: undefined,
|
|
@@ -49,6 +50,7 @@ export async function server_get_session_usage_over_time_by_device(device_id, cl
|
|
|
49
50
|
herd_id_caller: undefined,
|
|
50
51
|
min_duration_minutes_caller,
|
|
51
52
|
min_distance_meters_caller,
|
|
53
|
+
product_numbers_caller,
|
|
52
54
|
});
|
|
53
55
|
if (error) {
|
|
54
56
|
return IWebResponse.error(error.message).to_compatible();
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
import { Database } from "../types/supabase";
|
|
3
|
+
/**
|
|
4
|
+
* Creates one browser Supabase client (reads NEXT_PUBLIC_* env each call).
|
|
5
|
+
* Prefer {@link useScoutBrowserClient} in components so creation runs once via lazy state init.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createScoutBrowserClient(): SupabaseClient<Database>;
|
|
8
|
+
/**
|
|
9
|
+
* One browser Supabase client per component instance, created on first render (lazy state initializer).
|
|
10
|
+
*/
|
|
11
|
+
export declare function useScoutBrowserClient(): SupabaseClient<Database>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { createBrowserClient } from "@supabase/ssr";
|
|
4
|
+
/**
|
|
5
|
+
* Creates one browser Supabase client (reads NEXT_PUBLIC_* env each call).
|
|
6
|
+
* Prefer {@link useScoutBrowserClient} in components so creation runs once via lazy state init.
|
|
7
|
+
*/
|
|
8
|
+
export function createScoutBrowserClient() {
|
|
9
|
+
return createBrowserClient(process.env.NEXT_PUBLIC_SUPABASE_URL || "", process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "");
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* One browser Supabase client per component instance, created on first render (lazy state initializer).
|
|
13
|
+
*/
|
|
14
|
+
export function useScoutBrowserClient() {
|
|
15
|
+
const [client] = useState(createScoutBrowserClient);
|
|
16
|
+
return client;
|
|
17
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
import { Database } from "../types/supabase";
|
|
1
3
|
export interface UseScoutRefreshOptions {
|
|
4
|
+
supabase?: SupabaseClient<Database>;
|
|
2
5
|
autoRefresh?: boolean;
|
|
3
6
|
onRefreshComplete?: () => void;
|
|
4
7
|
cacheFirst?: boolean;
|
|
@@ -14,6 +17,7 @@ export interface UseScoutRefreshOptions {
|
|
|
14
17
|
* @param options.cacheFirst - Whether to load from cache first, then refresh (default: true)
|
|
15
18
|
* @param options.cacheTtlMs - Cache time-to-live in milliseconds (default: 24 hours)
|
|
16
19
|
* @param options.onlineRefetchMinIntervalMs - Min ms since last refresh before refetch on "online" (default: 15s)
|
|
20
|
+
* @param options.supabase - Optional shared browser client; when omitted, the hook creates its own via `createBrowserClient`
|
|
17
21
|
*
|
|
18
22
|
* @returns Object containing:
|
|
19
23
|
* - handleRefresh: Function to manually trigger a refresh
|
|
@@ -16,6 +16,7 @@ import { createBrowserClient } from "@supabase/ssr";
|
|
|
16
16
|
* @param options.cacheFirst - Whether to load from cache first, then refresh (default: true)
|
|
17
17
|
* @param options.cacheTtlMs - Cache time-to-live in milliseconds (default: 24 hours)
|
|
18
18
|
* @param options.onlineRefetchMinIntervalMs - Min ms since last refresh before refetch on "online" (default: 15s)
|
|
19
|
+
* @param options.supabase - Optional shared browser client; when omitted, the hook creates its own via `createBrowserClient`
|
|
19
20
|
*
|
|
20
21
|
* @returns Object containing:
|
|
21
22
|
* - handleRefresh: Function to manually trigger a refresh
|
|
@@ -32,18 +33,19 @@ import { createBrowserClient } from "@supabase/ssr";
|
|
|
32
33
|
* ```
|
|
33
34
|
*/
|
|
34
35
|
export function useScoutRefresh(options = {}) {
|
|
35
|
-
const { autoRefresh = true, onRefreshComplete, cacheFirst = true, cacheTtlMs = 24 * 60 * 60 * 1000, // 24 hours default (1 day)
|
|
36
|
+
const { supabase: supabaseOption, autoRefresh = true, onRefreshComplete, cacheFirst = true, cacheTtlMs = 24 * 60 * 60 * 1000, // 24 hours default (1 day)
|
|
36
37
|
onlineRefetchMinIntervalMs = 15 * 1000, // 15 seconds
|
|
37
38
|
} = options;
|
|
38
39
|
const dispatch = useAppDispatch();
|
|
39
40
|
const store = useStore();
|
|
40
41
|
const refreshInProgressRef = useRef(false);
|
|
41
42
|
const lastQueryAtRef = useRef(0);
|
|
42
|
-
// Create Supabase client directly to avoid circular dependency
|
|
43
|
-
// Assumes Next.js environment variables (NEXT_PUBLIC_*)
|
|
44
43
|
const supabase = useMemo(() => {
|
|
44
|
+
if (supabaseOption) {
|
|
45
|
+
return supabaseOption;
|
|
46
|
+
}
|
|
45
47
|
return createBrowserClient(process.env.NEXT_PUBLIC_SUPABASE_URL || "", process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "");
|
|
46
|
-
}, []);
|
|
48
|
+
}, [supabaseOption]);
|
|
47
49
|
// Refs to store timing measurements
|
|
48
50
|
const timingRefs = useRef({
|
|
49
51
|
startTime: 0,
|
|
@@ -2463,6 +2463,7 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
2463
2463
|
herd_id_caller?: number;
|
|
2464
2464
|
min_distance_meters_caller?: number;
|
|
2465
2465
|
min_duration_minutes_caller?: number;
|
|
2466
|
+
product_numbers_caller?: string[];
|
|
2466
2467
|
start_date_caller?: string;
|
|
2467
2468
|
};
|
|
2468
2469
|
Returns: import("../types/supabase").Json;
|
|
@@ -2474,6 +2475,7 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
2474
2475
|
herd_id_caller?: number;
|
|
2475
2476
|
min_distance_meters_caller?: number;
|
|
2476
2477
|
min_duration_minutes_caller?: number;
|
|
2478
|
+
product_numbers_caller?: string[];
|
|
2477
2479
|
start_date_caller?: string;
|
|
2478
2480
|
};
|
|
2479
2481
|
Returns: import("../types/supabase").Json;
|
|
@@ -32,7 +32,7 @@ export function ScoutRefreshProvider({ children, ...refreshOptions }) {
|
|
|
32
32
|
console.log("[ScoutRefreshProvider] Creating Supabase client");
|
|
33
33
|
return createBrowserClient(urlRef.current, anonKeyRef.current);
|
|
34
34
|
}, []); // Empty dependency array ensures this only runs once
|
|
35
|
-
useScoutRefresh(refreshOptions);
|
|
35
|
+
useScoutRefresh({ ...refreshOptions, supabase: supabaseClient });
|
|
36
36
|
// // Log connection status changes for debugging
|
|
37
37
|
// if (connectionStatus.lastError) {
|
|
38
38
|
// console.warn(
|
package/dist/types/db.d.ts
CHANGED
|
@@ -64,6 +64,7 @@ export interface ISessionSummary {
|
|
|
64
64
|
herd_id: number | null;
|
|
65
65
|
min_duration_minutes: number | null;
|
|
66
66
|
min_distance_meters: number | null;
|
|
67
|
+
product_numbers: string[] | null;
|
|
67
68
|
};
|
|
68
69
|
}
|
|
69
70
|
export type ISessionUsageOverTime = Database["public"]["Functions"]["get_session_usage_over_time"]["Returns"];
|
package/dist/types/supabase.d.ts
CHANGED
|
@@ -2548,6 +2548,7 @@ export type Database = {
|
|
|
2548
2548
|
herd_id_caller?: number;
|
|
2549
2549
|
min_distance_meters_caller?: number;
|
|
2550
2550
|
min_duration_minutes_caller?: number;
|
|
2551
|
+
product_numbers_caller?: string[];
|
|
2551
2552
|
start_date_caller?: string;
|
|
2552
2553
|
};
|
|
2553
2554
|
Returns: Json;
|
|
@@ -2559,6 +2560,7 @@ export type Database = {
|
|
|
2559
2560
|
herd_id_caller?: number;
|
|
2560
2561
|
min_distance_meters_caller?: number;
|
|
2561
2562
|
min_duration_minutes_caller?: number;
|
|
2563
|
+
product_numbers_caller?: string[];
|
|
2562
2564
|
start_date_caller?: string;
|
|
2563
2565
|
};
|
|
2564
2566
|
Returns: Json;
|