@flowselections/ai-authenticatie 1.0.14 → 1.1.1

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 (44) hide show
  1. package/dist-lib/components/AiAuthenticatiePage.d.ts.map +1 -1
  2. package/dist-lib/components/AiAuthenticatiePage.js +6 -3
  3. package/dist-lib/hooks/useAiForGoal.d.ts +2 -2
  4. package/dist-lib/hooks/useAiForGoal.d.ts.map +1 -1
  5. package/dist-lib/hooks/useAiForGoal.js +1 -1
  6. package/dist-lib/hooks/useIsAiAdmin.d.ts +1 -0
  7. package/dist-lib/hooks/useIsAiAdmin.d.ts.map +1 -1
  8. package/dist-lib/hooks/useIsAiAdmin.js +22 -3
  9. package/dist-lib/index.d.ts +6 -1
  10. package/dist-lib/index.d.ts.map +1 -1
  11. package/dist-lib/index.js +4 -0
  12. package/dist-lib/integrations/supabase/types.d.ts +1544 -15
  13. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  14. package/dist-lib/lib/aiAttachments.d.ts +22 -0
  15. package/dist-lib/lib/aiAttachments.d.ts.map +1 -0
  16. package/dist-lib/lib/aiAttachments.js +105 -0
  17. package/dist-lib/lib/aiChat.functions.d.ts +3 -2
  18. package/dist-lib/lib/aiChat.functions.d.ts.map +1 -1
  19. package/dist-lib/lib/aiChat.functions.js +6 -1
  20. package/dist-lib/lib/aiChat.server.d.ts +8 -1
  21. package/dist-lib/lib/aiChat.server.d.ts.map +1 -1
  22. package/dist-lib/lib/aiChat.server.js +37 -17
  23. package/dist-lib/lib/aiChat.stream.server.d.ts.map +1 -1
  24. package/dist-lib/lib/aiChat.stream.server.js +3 -1
  25. package/dist-lib/lib/aiChat.types.d.ts +8 -1
  26. package/dist-lib/lib/aiChat.types.d.ts.map +1 -1
  27. package/dist-lib/lib/aiModules.server.d.ts +4 -0
  28. package/dist-lib/lib/aiModules.server.d.ts.map +1 -1
  29. package/dist-lib/lib/aiModules.server.js +6 -3
  30. package/dist-lib/lib/aiRegistry.d.ts +31 -0
  31. package/dist-lib/lib/aiRegistry.d.ts.map +1 -0
  32. package/dist-lib/lib/aiRegistry.functions.d.ts +25 -0
  33. package/dist-lib/lib/aiRegistry.functions.d.ts.map +1 -0
  34. package/dist-lib/lib/aiRegistry.functions.js +25 -0
  35. package/dist-lib/lib/aiRegistry.js +46 -0
  36. package/dist-lib/lib/aiRegistry.server.d.ts +13 -0
  37. package/dist-lib/lib/aiRegistry.server.d.ts.map +1 -0
  38. package/dist-lib/lib/aiRegistry.server.js +21 -0
  39. package/dist-lib/lib/aiUsageByModule.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/aiUsageByModule.functions.js +1 -4
  41. package/dist-lib/lib/modules.server.d.ts.map +1 -1
  42. package/dist-lib/lib/modules.server.js +7 -7
  43. package/package.json +14 -4
  44. package/schema/ai-authenticatie.sql +124 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AiAuthenticatiePage.d.ts","sourceRoot":"","sources":["../../src/components/AiAuthenticatiePage.tsx"],"names":[],"mappings":"AA6CA,wBAAgB,mBAAmB,CAAC,EAAE,QAAgB,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,+BA2QpF"}
1
+ {"version":3,"file":"AiAuthenticatiePage.d.ts","sourceRoot":"","sources":["../../src/components/AiAuthenticatiePage.tsx"],"names":[],"mappings":"AA8CA,wBAAgB,mBAAmB,CAAC,EAAE,QAAgB,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,+BAyRpF"}
@@ -8,6 +8,7 @@ import { useModelPricing, providerSummaries, formatUsd, formatTokens } from '../
8
8
  import { useAllProviderUsage } from '../hooks/useAiUsage.js';
9
9
  import { useAiModules } from '../hooks/useAiModules.js';
10
10
  import { useModules } from '../hooks/useModules.js';
11
+ import { useIsAiAdmin } from '../hooks/useIsAiAdmin.js';
11
12
  import { useAiCostOverview } from '../hooks/useAiCostOverview.js';
12
13
  import { periodFromPreset } from '../lib/aiPeriod.js';
13
14
  import { AiPeriodFilter } from './AiPeriodFilter.js';
@@ -36,6 +37,8 @@ if (res.ok) console.log(res.content);`;
36
37
  export function AiAuthenticatiePage({ embedded = false } = {}) {
37
38
  const { providers, models, credentials, bindings, loading, reload } = useAiAdminData();
38
39
  const { modules, loading: modulesLoading, save: saveModule, setEnabled, remove: removeModule } = useAiModules();
40
+ const { isAdmin } = useIsAiAdmin();
41
+ const canManage = isAdmin === true;
39
42
  const [period, setPeriod] = useState(() => periodFromPreset('month'));
40
43
  const { overview, loading: overviewLoading, reload: reloadOverview } = useAiCostOverview(period.from, period.to);
41
44
  const safeProviders = Array.isArray(providers) ? providers : [];
@@ -75,11 +78,11 @@ export function AiAuthenticatiePage({ embedded = false } = {}) {
75
78
  const primaryModel = primary ? safeModels.find(x => x.id === primary.model_id) : undefined;
76
79
  const primaryProvider = primaryModel ? safeProviders.find(p => p.id === primaryModel.provider_id) : undefined;
77
80
  const s = statsByModule.get(m.module_key);
78
- return (_jsxs("li", { className: "grid grid-cols-1 md:grid-cols-[1.4fr_1.2fr_.7fr_.7fr_.8fr_auto] gap-3 md:gap-4 items-center px-4 md:px-6 py-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "font-semibold text-sm truncate", children: m.module_name }), _jsx("p", { className: "text-xs text-muted-foreground truncate", children: m.module_key }), m.ai_enabled && (!primary || !safeCreds.some(c => c.id === primary.credential_id && c.active)) && (_jsx("span", { className: "mt-1 inline-flex items-center rounded-full bg-destructive/10 px-2 py-0.5 text-[11px] font-medium text-destructive", children: primary ? 'Geen actieve sleutel' : 'Nog geen AI-agent' }))] }), _jsx("button", { type: "button", onClick: () => setAgentsFor(m), className: "text-left min-w-0 rounded-lg hover:bg-muted/40 px-2 py-1 -mx-2", children: primary ? (_jsxs("span", { className: "flex items-center gap-2 min-w-0", children: [primaryProvider && _jsx(ProviderLogo, { slug: primaryProvider.slug, name: primaryProvider.name, className: "h-4 w-4 shrink-0" }), _jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "block text-sm truncate", children: primary.label || primaryModel?.display_name || 'Onbekend model' }), _jsxs("span", { className: "block text-xs text-muted-foreground truncate", children: [primaryProvider?.name ?? '—', (() => {
81
+ return (_jsxs("li", { className: `${m.is_in_use === false ? 'opacity-50 ' : ''}grid grid-cols-1 md:grid-cols-[1.4fr_1.2fr_.7fr_.7fr_.8fr_auto] gap-3 md:gap-4 items-center px-4 md:px-6 py-4`, children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "font-semibold text-sm truncate", children: m.module_name }), _jsxs("p", { className: "text-xs text-muted-foreground truncate", children: [m.module_key, m.ai_source === 'manifest' && ' · aangemeld door module', m.ai_source === 'runtime' && ' · automatisch herkend', m.last_declared_at && ` · laatst gezien ${new Date(m.last_declared_at).toLocaleDateString('nl-NL')}`] }), m.is_in_use === false && (_jsx("span", { className: "mt-1 mr-1 inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground", children: "Niet meer in gebruik" })), m.ai_enabled && (!primary || !safeCreds.some(c => c.id === primary.credential_id && c.active)) && (_jsx("span", { className: "mt-1 inline-flex items-center rounded-full bg-destructive/10 px-2 py-0.5 text-[11px] font-medium text-destructive", children: primary ? 'Geen actieve sleutel' : 'Nog geen AI-agent' }))] }), _jsx("button", { type: "button", onClick: () => canManage && setAgentsFor(m), disabled: !canManage, className: "text-left min-w-0 rounded-lg hover:bg-muted/40 px-2 py-1 -mx-2", children: primary ? (_jsxs("span", { className: "flex items-center gap-2 min-w-0", children: [primaryProvider && _jsx(ProviderLogo, { slug: primaryProvider.slug, name: primaryProvider.name, className: "h-4 w-4 shrink-0" }), _jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "block text-sm truncate", children: primary.label || primaryModel?.display_name || 'Onbekend model' }), _jsxs("span", { className: "block text-xs text-muted-foreground truncate", children: [primaryProvider?.name ?? '—', (() => {
79
82
  const cred = safeCreds.find(c => c.id === primary.credential_id && c.active);
80
83
  return cred ? ` · sleutel: ${cred.label}` : ' · geen actieve sleutel';
81
- })(), moduleBindings.length > 1 && ` · +${moduleBindings.length - 1} agent${moduleBindings.length > 2 ? 's' : ''}`] })] })] })) : (_jsxs("span", { className: "text-sm text-primary inline-flex items-center gap-1", children: [_jsx(Plus, { className: "h-3.5 w-3.5" }), " AI-agent koppelen"] })) }), _jsx("span", { className: "text-sm md:text-right", children: s?.calls ?? 0 }), _jsx("span", { className: "text-sm md:text-right", children: formatTokens(s?.total_tokens ?? 0) }), _jsx("span", { className: "text-sm md:text-right font-medium", children: formatUsd(s?.cost_usd ?? 0) }), _jsxs("div", { className: "flex items-center justify-end gap-2 md:pl-2", children: [_jsx(Switch, { checked: m.ai_enabled, onCheckedChange: v => handleToggle(m, v), title: "AI in-/uitschakelen" }), _jsx(Button, { variant: "ghost", size: "icon", className: "h-9 w-9", title: "Integratiecode kopi\u00EBren", onClick: () => void copyIntegrationSnippet(m.module_key), children: _jsx(Code2, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "icon", className: "h-9 w-9", title: "AI-agents beheren", onClick: () => setAgentsFor(m), children: _jsx(Settings2, { className: "h-4 w-4" }) }), _jsx(Button, { asChild: true, variant: "outline", size: "icon", className: "h-9 w-9", title: "Details bekijken", children: _jsx(Link, { to: "/ai-authenticatie/$moduleKey", params: { moduleKey: m.module_key }, children: _jsx(ChevronRight, { className: "h-4 w-4" }) }) }), _jsx(Button, { variant: "ghost", size: "icon", className: "h-9 w-9 text-muted-foreground hover:text-destructive", title: "Module verwijderen", onClick: () => handleDelete(m), children: _jsx(Trash2, { className: "h-4 w-4" }) })] })] }, m.id));
82
- }) })), _jsxs("div", { className: "border-t px-4 md:px-6 py-3 flex items-center justify-between gap-3 bg-muted/10", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Modules met AI uitgeschakeld worden hier niet getoond en kunnen geen AI-agent gebruiken." }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => setAddModuleOpen(true), children: [_jsx(Plus, { className: "h-4 w-4 mr-1.5" }), " Module toevoegen"] })] })] }), !modulesLoading && safeModules.some(m => !m.ai_enabled) && (_jsxs("div", { className: `${embedded ? 'rounded-xl border bg-background/40' : 'rounded-2xl border bg-card shadow-sm'} p-4 space-y-2`, children: [_jsx("p", { className: "text-sm font-semibold", children: "Modules zonder AI" }), _jsx("ul", { className: "divide-y", children: safeModules.filter(m => !m.ai_enabled).map(m => (_jsxs("li", { className: "flex items-center justify-between gap-3 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-sm truncate", children: m.module_name }), _jsx("p", { className: "text-xs text-muted-foreground truncate", children: m.module_key })] }), _jsx(Switch, { checked: false, onCheckedChange: () => handleToggle(m, true), title: "AI inschakelen" })] }, m.id))) })] })), _jsx(ModuleDialog, { open: addModuleOpen, onOpenChange: setAddModuleOpen, existingKeys: safeModules.map(m => m.module_key), onSubmit: (key, name, enabled) => saveModule({ module_key: key, module_name: name, ai_enabled: enabled }) }), agentsFor && (_jsx(ModuleAgentsDialog, { module: agentsFor, open: !!agentsFor, onOpenChange: o => { if (!o)
84
+ })(), moduleBindings.length > 1 && ` · +${moduleBindings.length - 1} agent${moduleBindings.length > 2 ? 's' : ''}`] })] })] })) : (_jsxs("span", { className: "text-sm text-primary inline-flex items-center gap-1", children: [_jsx(Plus, { className: "h-3.5 w-3.5" }), " AI-agent koppelen"] })) }), _jsx("span", { className: "text-sm md:text-right", children: s?.calls ?? 0 }), _jsx("span", { className: "text-sm md:text-right", children: formatTokens(s?.total_tokens ?? 0) }), _jsx("span", { className: "text-sm md:text-right font-medium", children: formatUsd(s?.cost_usd ?? 0) }), _jsxs("div", { className: "flex items-center justify-end gap-2 md:pl-2", children: [_jsx(Switch, { checked: m.ai_enabled, disabled: !canManage, onCheckedChange: v => handleToggle(m, v), title: canManage ? 'AI in-/uitschakelen' : 'Alleen beheerders kunnen dit wijzigen' }), _jsx(Button, { variant: "ghost", size: "icon", className: "h-9 w-9", title: "Integratiecode kopi\u00EBren", onClick: () => void copyIntegrationSnippet(m.module_key), children: _jsx(Code2, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "icon", className: "h-9 w-9", title: "AI-agents beheren", disabled: !canManage, onClick: () => setAgentsFor(m), children: _jsx(Settings2, { className: "h-4 w-4" }) }), _jsx(Button, { asChild: true, variant: "outline", size: "icon", className: "h-9 w-9", title: "Details bekijken", children: _jsx(Link, { to: "/ai-authenticatie/$moduleKey", params: { moduleKey: m.module_key }, children: _jsx(ChevronRight, { className: "h-4 w-4" }) }) }), _jsx(Button, { variant: "ghost", size: "icon", className: "h-9 w-9 text-muted-foreground hover:text-destructive", title: "Module verwijderen", disabled: !canManage, onClick: () => handleDelete(m), children: _jsx(Trash2, { className: "h-4 w-4" }) })] })] }, m.id));
85
+ }) })), _jsxs("div", { className: "border-t px-4 md:px-6 py-3 flex items-center justify-between gap-3 bg-muted/10", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Modules met AI uitgeschakeld worden hier niet getoond en kunnen geen AI-agent gebruiken." }), _jsxs(Button, { variant: "outline", size: "sm", disabled: !canManage, onClick: () => setAddModuleOpen(true), children: [_jsx(Plus, { className: "h-4 w-4 mr-1.5" }), " Module toevoegen"] })] })] }), !modulesLoading && safeModules.some(m => !m.ai_enabled) && (_jsxs("div", { className: `${embedded ? 'rounded-xl border bg-background/40' : 'rounded-2xl border bg-card shadow-sm'} p-4 space-y-2`, children: [_jsx("p", { className: "text-sm font-semibold", children: "Modules zonder AI" }), _jsx("ul", { className: "divide-y", children: safeModules.filter(m => !m.ai_enabled).map(m => (_jsxs("li", { className: "flex items-center justify-between gap-3 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-sm truncate", children: m.module_name }), _jsx("p", { className: "text-xs text-muted-foreground truncate", children: m.module_key })] }), _jsx(Switch, { checked: false, onCheckedChange: () => handleToggle(m, true), title: "AI inschakelen" })] }, m.id))) })] })), _jsx(ModuleDialog, { open: addModuleOpen, onOpenChange: setAddModuleOpen, existingKeys: safeModules.map(m => m.module_key), onSubmit: (key, name, enabled) => saveModule({ module_key: key, module_name: name, ai_enabled: enabled }) }), agentsFor && (_jsx(ModuleAgentsDialog, { module: agentsFor, open: !!agentsFor, onOpenChange: o => { if (!o)
83
86
  setAgentsFor(null); }, providers: safeProviders, models: safeModels, credentials: safeCreds, bindings: safeBindings.filter(b => b.consumer_module_id === agentsFor.module_key), onChange: reload, onOpenProvider: p => { setAgentsFor(null); setManageProvider(p); } })), _jsx("button", { onClick: () => setKeysOpen(true), className: "w-full text-left", children: _jsxs("div", { className: `${embedded ? 'rounded-xl border bg-background/40' : 'rounded-2xl border bg-card shadow-sm'} p-5 flex items-center gap-4 hover:border-primary/60 hover:bg-muted/30 transition-colors`, children: [_jsx("div", { className: "h-11 w-11 rounded-xl bg-primary/10 text-primary flex items-center justify-center shrink-0", children: _jsx(KeyRound, { className: "h-5 w-5" }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("p", { className: "font-semibold text-sm", children: "API sleutels beheren" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Beheer je API sleutels voor de verschillende AI providers." })] }), _jsx(ChevronRight, { className: "h-5 w-5 text-muted-foreground shrink-0" })] }) }), _jsx(ApiKeysDialog, { open: keysOpen, onOpenChange: setKeysOpen, providers: safeProviders, models: safeModels, credentials: safeCreds, onOpenProvider: p => { setKeysOpen(false); setManageProvider(p); } }), manageProvider && (_jsx(ProviderManageDialog, { provider: manageProvider, credentials: safeCreds.filter(c => c.provider_id === manageProvider.id), open: !!manageProvider, onOpenChange: o => { if (!o) {
84
87
  setManageProvider(null);
85
88
  setKeysOpen(true);
@@ -1,5 +1,5 @@
1
1
  import { type AiStreamHandlers } from '../lib/aiChat.stream.js';
2
- import type { AiChatBindingInfo, AiChatMessage, AiChatOptions, AiChatResult } from '../lib/aiChat.types.js';
2
+ import type { AiChatAttachment, AiChatBindingInfo, AiChatMessage, AiChatOptions, AiChatResult } from '../lib/aiChat.types.js';
3
3
  export type UseAiForGoalReturn = {
4
4
  ready: boolean;
5
5
  loading: boolean;
@@ -8,7 +8,7 @@ export type UseAiForGoalReturn = {
8
8
  credential?: AiChatBindingInfo['credential'];
9
9
  reason?: string;
10
10
  reload: () => Promise<void>;
11
- run: (messages: AiChatMessage[], options?: AiChatOptions) => Promise<AiChatResult>;
11
+ run: (messages: AiChatMessage[], options?: AiChatOptions, attachments?: AiChatAttachment[]) => Promise<AiChatResult>;
12
12
  stream: (messages: AiChatMessage[], handlers: AiStreamHandlers, options?: AiChatOptions) => Promise<{
13
13
  ok: boolean;
14
14
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useAiForGoal.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiForGoal.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzG,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACxC,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACnF,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpI,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,kBAAkB,CA6CzE"}
1
+ {"version":3,"file":"useAiForGoal.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiForGoal.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE3H,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACxC,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,gBAAgB,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACrH,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpI,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,kBAAkB,CA6CzE"}
@@ -25,7 +25,7 @@ export function useAiForGoal(consumerModuleId) {
25
25
  }
26
26
  }, [describe, consumerModuleId]);
27
27
  useEffect(() => { void reload(); }, [reload]);
28
- const run = useCallback((messages, options) => chat({ data: { consumerModuleId, messages, options } }), [chat, consumerModuleId]);
28
+ const run = useCallback((messages, options, attachments) => chat({ data: attachments?.length ? { consumerModuleId, messages, options, attachments } : { consumerModuleId, messages, options } }), [chat, consumerModuleId]);
29
29
  const stream = useCallback((messages, handlers, options) => streamAiChat({ consumerModuleId, messages, options, ...handlers }), [consumerModuleId]);
30
30
  return {
31
31
  ready: info.ready,
@@ -1,3 +1,4 @@
1
+ /** Echte beheerderscontrole (ai_admin, admin, superadmin of developer), server-side bepaald. */
1
2
  export declare function useIsAiAdmin(): {
2
3
  isAdmin: boolean | null;
3
4
  loading: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useIsAiAdmin.d.ts","sourceRoot":"","sources":["../../src/hooks/useIsAiAdmin.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY;aAEA,OAAO,GAAG,IAAI;;;EACzC"}
1
+ {"version":3,"file":"useIsAiAdmin.d.ts","sourceRoot":"","sources":["../../src/hooks/useIsAiAdmin.ts"],"names":[],"mappings":"AAIA,gGAAgG;AAChG,wBAAgB,YAAY;;;;EAY3B"}
@@ -1,5 +1,24 @@
1
- import { useCallback } from 'react';
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { useServerFn } from '@tanstack/react-start';
3
+ import { isAiAdmin } from '../lib/aiUsageByModule.functions.js';
4
+ /** Echte beheerderscontrole (ai_admin, admin, superadmin of developer), server-side bepaald. */
2
5
  export function useIsAiAdmin() {
3
- const reload = useCallback(async () => { }, []);
4
- return { isAdmin: true, loading: false, reload };
6
+ const check = useServerFn(isAiAdmin);
7
+ const [isAdmin, setIsAdmin] = useState(null);
8
+ const [loading, setLoading] = useState(true);
9
+ const reload = useCallback(async () => {
10
+ setLoading(true);
11
+ try {
12
+ const r = await check();
13
+ setIsAdmin(r?.ok === true);
14
+ }
15
+ catch {
16
+ setIsAdmin(false);
17
+ }
18
+ finally {
19
+ setLoading(false);
20
+ }
21
+ }, [check]);
22
+ useEffect(() => { void reload(); }, [reload]);
23
+ return { isAdmin, loading, reload };
5
24
  }
@@ -10,12 +10,17 @@ export { streamAiChat } from './lib/aiChat.stream.js';
10
10
  export type { AiStreamHandlers } from './lib/aiChat.stream.js';
11
11
  export { listAiModules, saveAiModule, setAiModuleEnabled, deleteAiModule, getAiCostOverview, getAiModuleCalls, } from './lib/aiModules.functions.js';
12
12
  export type { AiModuleRow, AiModuleStats, AiCostTotals, AiCostOverview, AiCallLogEntry } from './lib/aiModules.functions.js';
13
+ export { registerAiConsumers } from './lib/aiRegistry.functions.js';
14
+ export type { AiRegistrationResult } from './lib/aiRegistry.functions.js';
15
+ export { normalizeAiDeclarations, declarationsFromManifest, buildRegistration } from './lib/aiRegistry.js';
16
+ export type { AiConsumerDeclaration, InstalledPackageRead } from './lib/aiRegistry.js';
17
+ export { pdfSupportProblem } from './lib/aiAttachments.js';
13
18
  export { listModules, registerModule, setModuleActiveFn } from './lib/modules.functions.js';
14
19
  export type { ModuleRow, ModuleMutationResult } from './lib/modules.functions.js';
15
20
  export { useModules } from './hooks/useModules.js';
16
21
  export { getAiUsageByModule, isAiAdmin } from './lib/aiUsageByModule.functions.js';
17
22
  export type { AiUsageByModuleRow } from './lib/aiUsageByModule.functions.js';
18
- export type { AiChatMessage, AiChatRole, AiChatOptions, AiChatUsage, AiChatResult, AiChatSuccess, AiChatError, AiChatBindingInfo, } from './lib/aiChat.types.js';
23
+ export type { AiChatMessage, AiChatAttachment, AiChatRole, AiChatOptions, AiChatUsage, AiChatResult, AiChatSuccess, AiChatError, AiChatBindingInfo, } from './lib/aiChat.types.js';
19
24
  export { useAiForGoal } from './hooks/useAiForGoal.js';
20
25
  export type { UseAiForGoalReturn } from './hooks/useAiForGoal.js';
21
26
  export { useAiForModule } from './hooks/useAiForModule.js';
@@ -1 +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"}
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,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxG,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,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,gBAAgB,EAChB,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"}
package/dist-lib/index.js CHANGED
@@ -9,6 +9,10 @@ export * from './hooks/useAiAdmin.js';
9
9
  export { runAiChat, describeAiBinding } from './lib/aiChat.functions.js';
10
10
  export { streamAiChat } from './lib/aiChat.stream.js';
11
11
  export { listAiModules, saveAiModule, setAiModuleEnabled, deleteAiModule, getAiCostOverview, getAiModuleCalls, } from './lib/aiModules.functions.js';
12
+ // Automatische registratie van AI-gebruikende modules (flowselections.ai)
13
+ export { registerAiConsumers } from './lib/aiRegistry.functions.js';
14
+ export { normalizeAiDeclarations, declarationsFromManifest, buildRegistration } from './lib/aiRegistry.js';
15
+ export { pdfSupportProblem } from './lib/aiAttachments.js';
12
16
  // Centrale moduleregistratie
13
17
  export { listModules, registerModule, setModuleActiveFn } from './lib/modules.functions.js';
14
18
  export { useModules } from './hooks/useModules.js';