@flowselections/ai-authenticatie 1.0.2

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 (159) hide show
  1. package/dist-lib/_core-safelist.d.ts +2 -0
  2. package/dist-lib/_core-safelist.d.ts.map +1 -0
  3. package/dist-lib/_core-safelist.js +15 -0
  4. package/dist-lib/components/AiAuthenticatieLogo.d.ts +3 -0
  5. package/dist-lib/components/AiAuthenticatieLogo.d.ts.map +1 -0
  6. package/dist-lib/components/AiAuthenticatieLogo.js +4 -0
  7. package/dist-lib/components/AiAuthenticatiePage.d.ts +4 -0
  8. package/dist-lib/components/AiAuthenticatiePage.d.ts.map +1 -0
  9. package/dist-lib/components/AiAuthenticatiePage.js +145 -0
  10. package/dist-lib/components/AiModuleDetailPage.d.ts +2 -0
  11. package/dist-lib/components/AiModuleDetailPage.d.ts.map +1 -0
  12. package/dist-lib/components/AiModuleDetailPage.js +43 -0
  13. package/dist-lib/components/AiModuleTestPanel.d.ts +4 -0
  14. package/dist-lib/components/AiModuleTestPanel.d.ts.map +1 -0
  15. package/dist-lib/components/AiModuleTestPanel.js +38 -0
  16. package/dist-lib/components/AiPeriodFilter.d.ts +7 -0
  17. package/dist-lib/components/AiPeriodFilter.d.ts.map +1 -0
  18. package/dist-lib/components/AiPeriodFilter.js +14 -0
  19. package/dist-lib/components/AiStatTile.d.ts +6 -0
  20. package/dist-lib/components/AiStatTile.d.ts.map +1 -0
  21. package/dist-lib/components/AiStatTile.js +5 -0
  22. package/dist-lib/components/ModuleAgentsDialog.d.ts +14 -0
  23. package/dist-lib/components/ModuleAgentsDialog.d.ts.map +1 -0
  24. package/dist-lib/components/ModuleAgentsDialog.js +78 -0
  25. package/dist-lib/components/ProviderLogo.d.ts +8 -0
  26. package/dist-lib/components/ProviderLogo.d.ts.map +1 -0
  27. package/dist-lib/components/ProviderLogo.js +24 -0
  28. package/dist-lib/components/ProviderManageDialog.d.ts +11 -0
  29. package/dist-lib/components/ProviderManageDialog.d.ts.map +1 -0
  30. package/dist-lib/components/ProviderManageDialog.js +173 -0
  31. package/dist-lib/components/settings/AiAuthenticatieSettingsCard.d.ts +2 -0
  32. package/dist-lib/components/settings/AiAuthenticatieSettingsCard.d.ts.map +1 -0
  33. package/dist-lib/components/settings/AiAuthenticatieSettingsCard.js +7 -0
  34. package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts +2 -0
  35. package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts.map +1 -0
  36. package/dist-lib/components/settings/MijnModuleSettingsCard.js +42 -0
  37. package/dist-lib/hooks/useAdminCredentials.d.ts +14 -0
  38. package/dist-lib/hooks/useAdminCredentials.d.ts.map +1 -0
  39. package/dist-lib/hooks/useAdminCredentials.js +17 -0
  40. package/dist-lib/hooks/useAiAdmin.d.ts +44 -0
  41. package/dist-lib/hooks/useAiAdmin.d.ts.map +1 -0
  42. package/dist-lib/hooks/useAiAdmin.js +32 -0
  43. package/dist-lib/hooks/useAiCostOverview.d.ts +7 -0
  44. package/dist-lib/hooks/useAiCostOverview.d.ts.map +1 -0
  45. package/dist-lib/hooks/useAiCostOverview.js +28 -0
  46. package/dist-lib/hooks/useAiForGoal.d.ts +21 -0
  47. package/dist-lib/hooks/useAiForGoal.d.ts.map +1 -0
  48. package/dist-lib/hooks/useAiForGoal.js +40 -0
  49. package/dist-lib/hooks/useAiForModule.d.ts +11 -0
  50. package/dist-lib/hooks/useAiForModule.d.ts.map +1 -0
  51. package/dist-lib/hooks/useAiForModule.js +11 -0
  52. package/dist-lib/hooks/useAiGoals.d.ts +8 -0
  53. package/dist-lib/hooks/useAiGoals.d.ts.map +1 -0
  54. package/dist-lib/hooks/useAiGoals.js +22 -0
  55. package/dist-lib/hooks/useAiModules.d.ts +15 -0
  56. package/dist-lib/hooks/useAiModules.d.ts.map +1 -0
  57. package/dist-lib/hooks/useAiModules.js +59 -0
  58. package/dist-lib/hooks/useAiPricing.d.ts +20 -0
  59. package/dist-lib/hooks/useAiPricing.d.ts.map +1 -0
  60. package/dist-lib/hooks/useAiPricing.js +97 -0
  61. package/dist-lib/hooks/useAiUsage.d.ts +12 -0
  62. package/dist-lib/hooks/useAiUsage.d.ts.map +1 -0
  63. package/dist-lib/hooks/useAiUsage.js +90 -0
  64. package/dist-lib/hooks/useAiUsageByModule.d.ts +8 -0
  65. package/dist-lib/hooks/useAiUsageByModule.d.ts.map +1 -0
  66. package/dist-lib/hooks/useAiUsageByModule.js +22 -0
  67. package/dist-lib/hooks/useIsAiAdmin.d.ts +6 -0
  68. package/dist-lib/hooks/useIsAiAdmin.d.ts.map +1 -0
  69. package/dist-lib/hooks/useIsAiAdmin.js +5 -0
  70. package/dist-lib/hooks/useMijnModuleData.d.ts +13 -0
  71. package/dist-lib/hooks/useMijnModuleData.d.ts.map +1 -0
  72. package/dist-lib/hooks/useMijnModuleData.js +49 -0
  73. package/dist-lib/hooks/useModules.d.ts +14 -0
  74. package/dist-lib/hooks/useModules.d.ts.map +1 -0
  75. package/dist-lib/hooks/useModules.js +47 -0
  76. package/dist-lib/index.d.ts +29 -0
  77. package/dist-lib/index.d.ts.map +1 -0
  78. package/dist-lib/index.js +33 -0
  79. package/dist-lib/integrations/supabase/auth-attacher.d.ts +2 -0
  80. package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -0
  81. package/dist-lib/integrations/supabase/auth-attacher.js +12 -0
  82. package/dist-lib/integrations/supabase/auth-middleware.d.ts +15971 -0
  83. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -0
  84. package/dist-lib/integrations/supabase/auth-middleware.js +49 -0
  85. package/dist-lib/integrations/supabase/client.d.ts +15967 -0
  86. package/dist-lib/integrations/supabase/client.d.ts.map +1 -0
  87. package/dist-lib/integrations/supabase/client.js +13 -0
  88. package/dist-lib/integrations/supabase/client.server.d.ts +15967 -0
  89. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -0
  90. package/dist-lib/integrations/supabase/client.server.js +30 -0
  91. package/dist-lib/integrations/supabase/types.d.ts +16477 -0
  92. package/dist-lib/integrations/supabase/types.d.ts.map +1 -0
  93. package/dist-lib/integrations/supabase/types.js +78 -0
  94. package/dist-lib/lib/aiChat.functions.d.ts +31948 -0
  95. package/dist-lib/lib/aiChat.functions.d.ts.map +1 -0
  96. package/dist-lib/lib/aiChat.functions.js +51 -0
  97. package/dist-lib/lib/aiChat.server.d.ts +8 -0
  98. package/dist-lib/lib/aiChat.server.d.ts.map +1 -0
  99. package/dist-lib/lib/aiChat.server.js +347 -0
  100. package/dist-lib/lib/aiChat.stream.d.ts +33 -0
  101. package/dist-lib/lib/aiChat.stream.d.ts.map +1 -0
  102. package/dist-lib/lib/aiChat.stream.js +77 -0
  103. package/dist-lib/lib/aiChat.stream.server.d.ts +38 -0
  104. package/dist-lib/lib/aiChat.stream.server.d.ts.map +1 -0
  105. package/dist-lib/lib/aiChat.stream.server.js +259 -0
  106. package/dist-lib/lib/aiChat.types.d.ts +63 -0
  107. package/dist-lib/lib/aiChat.types.d.ts.map +1 -0
  108. package/dist-lib/lib/aiChat.types.js +1 -0
  109. package/dist-lib/lib/aiCredentialTest.functions.d.ts +31959 -0
  110. package/dist-lib/lib/aiCredentialTest.functions.d.ts.map +1 -0
  111. package/dist-lib/lib/aiCredentialTest.functions.js +714 -0
  112. package/dist-lib/lib/aiGoals.functions.d.ts +12912 -0
  113. package/dist-lib/lib/aiGoals.functions.d.ts.map +1 -0
  114. package/dist-lib/lib/aiGoals.functions.js +14 -0
  115. package/dist-lib/lib/aiModules.functions.d.ts +95851 -0
  116. package/dist-lib/lib/aiModules.functions.d.ts.map +1 -0
  117. package/dist-lib/lib/aiModules.functions.js +41 -0
  118. package/dist-lib/lib/aiModules.server.d.ts +65 -0
  119. package/dist-lib/lib/aiModules.server.d.ts.map +1 -0
  120. package/dist-lib/lib/aiModules.server.js +119 -0
  121. package/dist-lib/lib/aiPeriod.d.ts +11 -0
  122. package/dist-lib/lib/aiPeriod.d.ts.map +1 -0
  123. package/dist-lib/lib/aiPeriod.js +53 -0
  124. package/dist-lib/lib/aiPricing.functions.d.ts +31943 -0
  125. package/dist-lib/lib/aiPricing.functions.d.ts.map +1 -0
  126. package/dist-lib/lib/aiPricing.functions.js +13 -0
  127. package/dist-lib/lib/aiPricing.server.d.ts +19 -0
  128. package/dist-lib/lib/aiPricing.server.d.ts.map +1 -0
  129. package/dist-lib/lib/aiPricing.server.js +97 -0
  130. package/dist-lib/lib/aiUsage.functions.d.ts +5 -0
  131. package/dist-lib/lib/aiUsage.functions.d.ts.map +1 -0
  132. package/dist-lib/lib/aiUsage.functions.js +12 -0
  133. package/dist-lib/lib/aiUsage.server.d.ts +3 -0
  134. package/dist-lib/lib/aiUsage.server.d.ts.map +1 -0
  135. package/dist-lib/lib/aiUsage.server.js +229 -0
  136. package/dist-lib/lib/aiUsage.types.d.ts +21 -0
  137. package/dist-lib/lib/aiUsage.types.d.ts.map +1 -0
  138. package/dist-lib/lib/aiUsage.types.js +1 -0
  139. package/dist-lib/lib/aiUsageByModule.functions.d.ts +31952 -0
  140. package/dist-lib/lib/aiUsageByModule.functions.d.ts.map +1 -0
  141. package/dist-lib/lib/aiUsageByModule.functions.js +37 -0
  142. package/dist-lib/lib/modules.functions.d.ts +47924 -0
  143. package/dist-lib/lib/modules.functions.d.ts.map +1 -0
  144. package/dist-lib/lib/modules.functions.js +21 -0
  145. package/dist-lib/lib/modules.server.d.ts +23 -0
  146. package/dist-lib/lib/modules.server.d.ts.map +1 -0
  147. package/dist-lib/lib/modules.server.js +52 -0
  148. package/dist-lib/lib/utils.d.ts +3 -0
  149. package/dist-lib/lib/utils.d.ts.map +1 -0
  150. package/dist-lib/lib/utils.js +5 -0
  151. package/dist-lib/lib/validationSchemas.d.ts +15 -0
  152. package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
  153. package/dist-lib/lib/validationSchemas.js +25 -0
  154. package/dist-lib/styles.css +1 -0
  155. package/package.json +92 -0
  156. package/public/flowselections-assets/ai-authenticatie/claude.png +0 -0
  157. package/public/flowselections-assets/ai-authenticatie/gemini.png +0 -0
  158. package/public/flowselections-assets/ai-authenticatie/openai.png +0 -0
  159. package/public/logo.png +0 -0
@@ -0,0 +1,20 @@
1
+ import { type ModelPricingRow } from '../lib/aiPricing.functions';
2
+ export type ProviderPricingSummary = {
3
+ provider_slug: string;
4
+ min_input: number | null;
5
+ min_output: number | null;
6
+ model_count: number;
7
+ fetched_at: string | null;
8
+ };
9
+ export declare function useModelPricing(): {
10
+ rows: ModelPricingRow[];
11
+ loading: boolean;
12
+ refreshing: boolean;
13
+ refresh: (force?: boolean) => Promise<void>;
14
+ reload: () => Promise<void>;
15
+ };
16
+ export declare function pricingByModelSlug(rows: ModelPricingRow[]): Map<string, ModelPricingRow>;
17
+ export declare function providerSummaries(rows: ModelPricingRow[]): Map<string, ProviderPricingSummary>;
18
+ export declare function formatUsd(v: number | null | undefined, digits?: number): string;
19
+ export declare function formatTokens(n: number | null | undefined): string;
20
+ //# sourceMappingURL=useAiPricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAiPricing.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiPricing.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgD,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAEhH,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe;;;;;;EAuC9B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAIxF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAoB9F;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,SAAI,GAAG,MAAM,CAM1E;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKjE"}
@@ -0,0 +1,97 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { supabase } from '@flowselections/core';
3
+ import { useServerFn } from '@tanstack/react-start';
4
+ import { ensureModelPricingFresh, refreshModelPricing } from '../lib/aiPricing.functions';
5
+ export function useModelPricing() {
6
+ const [rows, setRows] = useState([]);
7
+ const [loading, setLoading] = useState(true);
8
+ const [refreshing, setRefreshing] = useState(false);
9
+ const ensureFresh = useServerFn(ensureModelPricingFresh);
10
+ const forceRefresh = useServerFn(refreshModelPricing);
11
+ const load = useCallback(async () => {
12
+ const { data } = await supabase.from('ai_model_pricing').select('*');
13
+ setRows(Array.isArray(data) ? data : []);
14
+ setLoading(false);
15
+ }, []);
16
+ const refresh = useCallback(async (force = false) => {
17
+ setRefreshing(true);
18
+ try {
19
+ try {
20
+ if (force)
21
+ await forceRefresh();
22
+ else
23
+ await ensureFresh();
24
+ }
25
+ catch (e) {
26
+ console.warn('Tarieven vernieuwen mislukt', e);
27
+ }
28
+ await load();
29
+ }
30
+ finally {
31
+ setRefreshing(false);
32
+ }
33
+ }, [ensureFresh, forceRefresh, load]);
34
+ useEffect(() => {
35
+ let cancelled = false;
36
+ void (async () => {
37
+ await load();
38
+ try {
39
+ await ensureFresh();
40
+ }
41
+ catch { /* ignore */ }
42
+ if (!cancelled)
43
+ await load();
44
+ })();
45
+ return () => { cancelled = true; };
46
+ // eslint-disable-next-line react-hooks/exhaustive-deps
47
+ }, []);
48
+ return { rows, loading, refreshing, refresh, reload: load };
49
+ }
50
+ export function pricingByModelSlug(rows) {
51
+ const map = new Map();
52
+ for (const r of rows)
53
+ map.set(`${r.provider_slug}::${r.model_slug}`, r);
54
+ return map;
55
+ }
56
+ export function providerSummaries(rows) {
57
+ const out = new Map();
58
+ for (const r of rows) {
59
+ const prev = out.get(r.provider_slug);
60
+ const minIn = r.input_per_mtok;
61
+ const minOut = r.output_per_mtok;
62
+ if (!prev) {
63
+ out.set(r.provider_slug, {
64
+ provider_slug: r.provider_slug,
65
+ min_input: minIn, min_output: minOut,
66
+ model_count: 1, fetched_at: r.fetched_at,
67
+ });
68
+ }
69
+ else {
70
+ prev.model_count += 1;
71
+ if (minIn !== null && (prev.min_input === null || minIn < prev.min_input))
72
+ prev.min_input = minIn;
73
+ if (minOut !== null && (prev.min_output === null || minOut < prev.min_output))
74
+ prev.min_output = minOut;
75
+ if (r.fetched_at && (!prev.fetched_at || r.fetched_at > prev.fetched_at))
76
+ prev.fetched_at = r.fetched_at;
77
+ }
78
+ }
79
+ return out;
80
+ }
81
+ export function formatUsd(v, digits = 2) {
82
+ if (v === null || v === undefined || !Number.isFinite(v))
83
+ return '—';
84
+ return new Intl.NumberFormat('nl-NL', {
85
+ style: 'currency', currency: 'USD',
86
+ minimumFractionDigits: digits, maximumFractionDigits: digits,
87
+ }).format(v);
88
+ }
89
+ export function formatTokens(n) {
90
+ if (!n)
91
+ return '0';
92
+ if (n >= 1000000)
93
+ return `${(n / 1000000).toFixed(1)}M`;
94
+ if (n >= 1000)
95
+ return `${(n / 1000).toFixed(1)}K`;
96
+ return String(n);
97
+ }
@@ -0,0 +1,12 @@
1
+ import { type ProviderUsageResult } from '../lib/aiUsage.functions';
2
+ export declare function useProviderUsage(providerSlug: string | null | undefined): {
3
+ data: ProviderUsageResult | null;
4
+ loading: boolean;
5
+ reload: () => Promise<void>;
6
+ };
7
+ export declare function useAllProviderUsage(providerSlugs: string[]): {
8
+ byProvider: Record<string, ProviderUsageResult | null>;
9
+ loading: boolean;
10
+ reload: () => Promise<void>;
11
+ };
12
+ //# sourceMappingURL=useAiUsage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAiUsage.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiUsage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAyBxF,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;;;;EAwBvE;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE;;;;EAiC1D"}
@@ -0,0 +1,90 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { useServerFn } from '@tanstack/react-start';
3
+ import { supabase } from '@flowselections/core';
4
+ import { fetchProviderUsage } from '../lib/aiUsage.functions';
5
+ function usageFallback(providerSlug, message) {
6
+ return {
7
+ ok: false,
8
+ supported: true,
9
+ provider_slug: providerSlug,
10
+ total_cost_usd: 0,
11
+ currency: 'USD',
12
+ input_tokens: 0,
13
+ output_tokens: 0,
14
+ lines: [],
15
+ period_start: '',
16
+ period_end: '',
17
+ fetched_at: '',
18
+ message,
19
+ };
20
+ }
21
+ function errorMessage(error) {
22
+ if (error instanceof Response)
23
+ return error.statusText || `Ophalen mislukt (${error.status})`;
24
+ if (error instanceof Error)
25
+ return error.message;
26
+ return 'Ophalen mislukt';
27
+ }
28
+ export function useProviderUsage(providerSlug) {
29
+ const [data, setData] = useState(null);
30
+ const [loading, setLoading] = useState(false);
31
+ const fetchFn = useServerFn(fetchProviderUsage);
32
+ const load = useCallback(async () => {
33
+ if (!providerSlug)
34
+ return;
35
+ setLoading(true);
36
+ try {
37
+ const { data: authData, error: authError } = await supabase.auth.getUser();
38
+ if (authError || !authData.user) {
39
+ setData(usageFallback(providerSlug, 'Je sessie is verlopen of ongeldig. Meld je opnieuw aan.'));
40
+ return;
41
+ }
42
+ const res = await fetchFn({ data: { providerSlug } });
43
+ setData(res);
44
+ }
45
+ catch (e) {
46
+ setData(usageFallback(providerSlug, errorMessage(e)));
47
+ }
48
+ finally {
49
+ setLoading(false);
50
+ }
51
+ }, [providerSlug, fetchFn]);
52
+ useEffect(() => { void load(); }, [load]);
53
+ return { data, loading, reload: load };
54
+ }
55
+ export function useAllProviderUsage(providerSlugs) {
56
+ const [byProvider, setByProvider] = useState({});
57
+ const [loading, setLoading] = useState(false);
58
+ const fetchFn = useServerFn(fetchProviderUsage);
59
+ const load = useCallback(async () => {
60
+ if (providerSlugs.length === 0)
61
+ return;
62
+ setLoading(true);
63
+ try {
64
+ const { data: authData, error: authError } = await supabase.auth.getUser();
65
+ if (authError || !authData.user) {
66
+ setByProvider(Object.fromEntries(providerSlugs.map(slug => [
67
+ slug,
68
+ usageFallback(slug, 'Je sessie is verlopen of ongeldig. Meld je opnieuw aan.'),
69
+ ])));
70
+ return;
71
+ }
72
+ const results = await Promise.all(providerSlugs.map(async (slug) => {
73
+ try {
74
+ const r = await fetchFn({ data: { providerSlug: slug } });
75
+ return [slug, r];
76
+ }
77
+ catch (e) {
78
+ return [slug, usageFallback(slug, errorMessage(e))];
79
+ }
80
+ }));
81
+ setByProvider(Object.fromEntries(results));
82
+ }
83
+ finally {
84
+ setLoading(false);
85
+ }
86
+ // eslint-disable-next-line react-hooks/exhaustive-deps
87
+ }, [providerSlugs.join('|'), fetchFn]);
88
+ useEffect(() => { void load(); }, [load]);
89
+ return { byProvider, loading, reload: load };
90
+ }
@@ -0,0 +1,8 @@
1
+ import { type AiUsageByModuleRow } from '../lib/aiUsageByModule.functions';
2
+ export type { AiUsageByModuleRow };
3
+ export declare function useAiUsageByModule(days?: number): {
4
+ rows: AiUsageByModuleRow[];
5
+ loading: boolean;
6
+ reload: () => Promise<void>;
7
+ };
8
+ //# sourceMappingURL=useAiUsageByModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAiUsageByModule.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiUsageByModule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE/F,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAAW;;;;EAcnD"}
@@ -0,0 +1,22 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { useServerFn } from '@tanstack/react-start';
3
+ import { getAiUsageByModule } from '../lib/aiUsageByModule.functions';
4
+ export function useAiUsageByModule(days = 30) {
5
+ const fn = useServerFn(getAiUsageByModule);
6
+ const [rows, setRows] = useState([]);
7
+ const [loading, setLoading] = useState(true);
8
+ const reload = useCallback(async () => {
9
+ setLoading(true);
10
+ try {
11
+ setRows(await fn({ data: { days } }));
12
+ }
13
+ catch {
14
+ setRows([]);
15
+ }
16
+ finally {
17
+ setLoading(false);
18
+ }
19
+ }, [fn, days]);
20
+ useEffect(() => { void reload(); }, [reload]);
21
+ return { rows, loading, reload };
22
+ }
@@ -0,0 +1,6 @@
1
+ export declare function useIsAiAdmin(): {
2
+ isAdmin: boolean | null;
3
+ loading: boolean;
4
+ reload: () => Promise<void>;
5
+ };
6
+ //# sourceMappingURL=useIsAiAdmin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsAiAdmin.d.ts","sourceRoot":"","sources":["../../src/hooks/useIsAiAdmin.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY;aAEA,OAAO,GAAG,IAAI;;;EACzC"}
@@ -0,0 +1,5 @@
1
+ import { useCallback } from 'react';
2
+ export function useIsAiAdmin() {
3
+ const reload = useCallback(async () => { }, []);
4
+ return { isAdmin: true, loading: false, reload };
5
+ }
@@ -0,0 +1,13 @@
1
+ interface MijnItem {
2
+ id: string;
3
+ created_at: string;
4
+ [key: string]: unknown;
5
+ }
6
+ export declare function useMijnModuleData(): {
7
+ items: MijnItem[];
8
+ loading: boolean;
9
+ error: string | null;
10
+ reload: () => Promise<void>;
11
+ };
12
+ export {};
13
+ //# sourceMappingURL=useMijnModuleData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMijnModuleData.d.ts","sourceRoot":"","sources":["../../src/hooks/useMijnModuleData.ts"],"names":[],"mappings":"AAkBA,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,iBAAiB;;;;;EAkChC"}
@@ -0,0 +1,49 @@
1
+ // ============================================================================
2
+ // src/hooks/useMijnModuleData.ts — EXAMPLE DATA HOOK
3
+ // ============================================================================
4
+ // Put your data fetching logic in hooks like this, not directly in components.
5
+ // This keeps your pages clean and makes it easy to reuse data across pages.
6
+ //
7
+ // WHAT TO DO:
8
+ // - Rename to match your data (e.g. useProducts, useOrders, useSuppliers)
9
+ // - Replace the example query with your real Supabase query
10
+ // - Replace MijnItem with your actual table's row type
11
+ // - Import and use in your page components
12
+ // - Delete this file if you prefer a different pattern
13
+ // ============================================================================
14
+ import { useState, useEffect, useCallback } from "react";
15
+ import { supabase, toast } from "@flowselections/core";
16
+ export function useMijnModuleData() {
17
+ const [items, setItems] = useState([]);
18
+ const [loading, setLoading] = useState(true);
19
+ const [error, setError] = useState(null);
20
+ const load = useCallback(async () => {
21
+ setLoading(true);
22
+ setError(null);
23
+ try {
24
+ const { data, error } = await supabase
25
+ .from("products") // ← CHANGE THIS to your table
26
+ .select("*")
27
+ .order("created_at", { ascending: false });
28
+ if (error)
29
+ throw error;
30
+ setItems(data ?? []);
31
+ }
32
+ catch {
33
+ setError("Fout bij het laden van gegevens");
34
+ toast.error("Fout bij het laden van gegevens");
35
+ }
36
+ finally {
37
+ setLoading(false);
38
+ }
39
+ }, []);
40
+ useEffect(() => {
41
+ load();
42
+ }, [load]);
43
+ return {
44
+ items,
45
+ loading,
46
+ error,
47
+ reload: load,
48
+ };
49
+ }
@@ -0,0 +1,14 @@
1
+ import { type ModuleRow, type ModuleMutationResult } from '../lib/modules.functions';
2
+ export type { ModuleRow };
3
+ export declare function useModules(): {
4
+ registered: ModuleRow[];
5
+ loading: boolean;
6
+ reload: () => Promise<void>;
7
+ register: (input: {
8
+ module_key?: string;
9
+ module_name: string;
10
+ description?: string | null;
11
+ }) => Promise<ModuleMutationResult>;
12
+ setActive: (module_key: string, is_active: boolean) => Promise<ModuleMutationResult>;
13
+ };
14
+ //# sourceMappingURL=useModules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useModules.d.ts","sourceRoot":"","sources":["../../src/hooks/useModules.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EAAE,KAAK,oBAAoB,EAC1C,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,wBAAgB,UAAU;;;;sBAkBf;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAC/E,OAAO,CAAC,oBAAoB,CAAC;4BAUiB,MAAM,aAAa,OAAO,KAAG,OAAO,CAAC,oBAAoB,CAAC;EAW5G"}
@@ -0,0 +1,47 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { useServerFn } from '@tanstack/react-start';
3
+ import { listModules, registerModule, setModuleActiveFn, } from '../lib/modules.functions';
4
+ export function useModules() {
5
+ const listFn = useServerFn(listModules);
6
+ const registerFn = useServerFn(registerModule);
7
+ const activeFn = useServerFn(setModuleActiveFn);
8
+ const [registered, setRegistered] = useState([]);
9
+ const [loading, setLoading] = useState(true);
10
+ const reload = useCallback(async () => {
11
+ setLoading(true);
12
+ try {
13
+ const rows = await listFn();
14
+ setRegistered(Array.isArray(rows) ? rows : []);
15
+ }
16
+ catch {
17
+ setRegistered([]);
18
+ }
19
+ finally {
20
+ setLoading(false);
21
+ }
22
+ }, [listFn]);
23
+ useEffect(() => { void reload(); }, [reload]);
24
+ const register = useCallback(async (input) => {
25
+ try {
26
+ const res = await registerFn({ data: input });
27
+ if (res?.ok)
28
+ await reload();
29
+ return res ?? { ok: false, message: 'Registreren mislukt.' };
30
+ }
31
+ catch (e) {
32
+ return { ok: false, message: e instanceof Error ? e.message : 'Registreren mislukt.' };
33
+ }
34
+ }, [registerFn, reload]);
35
+ const setActive = useCallback(async (module_key, is_active) => {
36
+ try {
37
+ const res = await activeFn({ data: { module_key, is_active } });
38
+ if (res?.ok)
39
+ await reload();
40
+ return res ?? { ok: false, message: 'Opslaan mislukt.' };
41
+ }
42
+ catch (e) {
43
+ return { ok: false, message: e instanceof Error ? e.message : 'Opslaan mislukt.' };
44
+ }
45
+ }, [activeFn, reload]);
46
+ return { registered, loading, reload, register, setActive };
47
+ }
@@ -0,0 +1,29 @@
1
+ import type { FlowModule } from '@flowselections/core';
2
+ export * from './_core-safelist';
3
+ export { AiAuthenticatiePage } from './components/AiAuthenticatiePage';
4
+ export { AiAuthenticatieLogo } from './components/AiAuthenticatieLogo';
5
+ import { AiAuthenticatieSettingsCard } from './components/settings/AiAuthenticatieSettingsCard';
6
+ export { AiAuthenticatieSettingsCard };
7
+ export * from './hooks/useAiAdmin';
8
+ export { runAiChat, describeAiBinding } from './lib/aiChat.functions';
9
+ export { streamAiChat } from './lib/aiChat.stream';
10
+ export type { AiStreamHandlers } from './lib/aiChat.stream';
11
+ export { listAiModules, saveAiModule, setAiModuleEnabled, deleteAiModule, getAiCostOverview, getAiModuleCalls, } from './lib/aiModules.functions';
12
+ export type { AiModuleRow, AiModuleStats, AiCostTotals, AiCostOverview, AiCallLogEntry } from './lib/aiModules.functions';
13
+ export { listModules, registerModule, setModuleActiveFn } from './lib/modules.functions';
14
+ export type { ModuleRow, ModuleMutationResult } from './lib/modules.functions';
15
+ export { useModules } from './hooks/useModules';
16
+ export { getAiUsageByModule, isAiAdmin } from './lib/aiUsageByModule.functions';
17
+ export type { AiUsageByModuleRow } from './lib/aiUsageByModule.functions';
18
+ export type { AiChatMessage, AiChatRole, AiChatOptions, AiChatUsage, AiChatResult, AiChatSuccess, AiChatError, AiChatBindingInfo, } from './lib/aiChat.types';
19
+ export { useAiForGoal } from './hooks/useAiForGoal';
20
+ export type { UseAiForGoalReturn } from './hooks/useAiForGoal';
21
+ export { useAiForModule } from './hooks/useAiForModule';
22
+ export type { UseAiForModuleReturn } from './hooks/useAiForModule';
23
+ export { useAiModules } from './hooks/useAiModules';
24
+ export { useAiCostOverview } from './hooks/useAiCostOverview';
25
+ export { useIsAiAdmin } from './hooks/useIsAiAdmin';
26
+ export { useAiUsageByModule } from './hooks/useAiUsageByModule';
27
+ export { AiModuleDetailPage } from './components/AiModuleDetailPage';
28
+ export declare const aiAuthenticatieModule: FlowModule;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,2BAA2B,EAAE,CAAC;AACvC,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,GACrG,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG1H,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACzF,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAChF,YAAY,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,YAAY,EACV,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,eAAO,MAAM,qBAAqB,EAAE,UAUnC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { KeyRound } from 'lucide-react';
2
+ export * from './_core-safelist';
3
+ export { AiAuthenticatiePage } from './components/AiAuthenticatiePage';
4
+ export { AiAuthenticatieLogo } from './components/AiAuthenticatieLogo';
5
+ import { AiAuthenticatieSettingsCard } from './components/settings/AiAuthenticatieSettingsCard';
6
+ export { AiAuthenticatieSettingsCard };
7
+ export * from './hooks/useAiAdmin';
8
+ // Consumer-API voor andere modules
9
+ export { runAiChat, describeAiBinding } from './lib/aiChat.functions';
10
+ export { streamAiChat } from './lib/aiChat.stream';
11
+ export { listAiModules, saveAiModule, setAiModuleEnabled, deleteAiModule, getAiCostOverview, getAiModuleCalls, } from './lib/aiModules.functions';
12
+ // Centrale moduleregistratie
13
+ export { listModules, registerModule, setModuleActiveFn } from './lib/modules.functions';
14
+ export { useModules } from './hooks/useModules';
15
+ export { getAiUsageByModule, isAiAdmin } from './lib/aiUsageByModule.functions';
16
+ export { useAiForGoal } from './hooks/useAiForGoal';
17
+ export { useAiForModule } from './hooks/useAiForModule';
18
+ export { useAiModules } from './hooks/useAiModules';
19
+ export { useAiCostOverview } from './hooks/useAiCostOverview';
20
+ export { useIsAiAdmin } from './hooks/useIsAiAdmin';
21
+ export { useAiUsageByModule } from './hooks/useAiUsageByModule';
22
+ export { AiModuleDetailPage } from './components/AiModuleDetailPage';
23
+ export const aiAuthenticatieModule = {
24
+ id: 'ai-authenticatie',
25
+ name: 'AI-Authenticatie',
26
+ version: '1.0.0',
27
+ nav: {
28
+ label: 'AI-Authenticatie',
29
+ href: '/ai-authenticatie',
30
+ icon: KeyRound,
31
+ },
32
+ settingsCards: [{ component: AiAuthenticatieSettingsCard, order: 10 }],
33
+ };
@@ -0,0 +1,2 @@
1
+ export declare const attachSupabaseAuth: import("@tanstack/start-client-core").FunctionMiddlewareAfterClient<{}, unknown, undefined, undefined, undefined>;
2
+ //# sourceMappingURL=auth-attacher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-attacher.d.ts","sourceRoot":"","sources":["../../../src/integrations/supabase/auth-attacher.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,mHAQ9B,CAAA"}
@@ -0,0 +1,12 @@
1
+ // Intentionally overrides the generated attach-supabase-auth: this module
2
+ // authenticates against the shell's supabase client from @flowselections/core,
3
+ // not the local integrations/supabase/client. Do NOT regenerate.
4
+ import { createMiddleware } from '@tanstack/react-start';
5
+ import { supabase } from '@flowselections/core';
6
+ export const attachSupabaseAuth = createMiddleware({ type: 'function' }).client(async ({ next }) => {
7
+ const { data } = await supabase.auth.getSession();
8
+ const token = data.session?.access_token;
9
+ return next({
10
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
11
+ });
12
+ });