@flowselections/ai-authenticatie 1.0.15 → 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 +102 -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';
@@ -606,24 +606,36 @@ export type Database = {
606
606
  ai_modules: {
607
607
  Row: {
608
608
  ai_enabled: boolean;
609
+ ai_source: string;
609
610
  created_at: string;
611
+ declared_ai: boolean;
610
612
  id: string;
613
+ is_in_use: boolean;
614
+ last_declared_at: string | null;
611
615
  module_key: string;
612
616
  module_name: string;
613
617
  updated_at: string;
614
618
  };
615
619
  Insert: {
616
620
  ai_enabled?: boolean;
621
+ ai_source?: string;
617
622
  created_at?: string;
623
+ declared_ai?: boolean;
618
624
  id?: string;
625
+ is_in_use?: boolean;
626
+ last_declared_at?: string | null;
619
627
  module_key: string;
620
628
  module_name: string;
621
629
  updated_at?: string;
622
630
  };
623
631
  Update: {
624
632
  ai_enabled?: boolean;
633
+ ai_source?: string;
625
634
  created_at?: string;
635
+ declared_ai?: boolean;
626
636
  id?: string;
637
+ is_in_use?: boolean;
638
+ last_declared_at?: string | null;
627
639
  module_key?: string;
628
640
  module_name?: string;
629
641
  updated_at?: string;
@@ -15687,7 +15699,7 @@ export type Database = {
15687
15699
  name: string;
15688
15700
  produced_stock: number;
15689
15701
  product_code: string;
15690
- tenant_id: string;
15702
+ tenant_id: string | null;
15691
15703
  updated_at: string;
15692
15704
  };
15693
15705
  Insert: {
@@ -15698,7 +15710,7 @@ export type Database = {
15698
15710
  name: string;
15699
15711
  produced_stock?: number;
15700
15712
  product_code: string;
15701
- tenant_id: string;
15713
+ tenant_id?: string | null;
15702
15714
  updated_at?: string;
15703
15715
  };
15704
15716
  Update: {
@@ -15709,7 +15721,7 @@ export type Database = {
15709
15721
  name?: string;
15710
15722
  produced_stock?: number;
15711
15723
  product_code?: string;
15712
- tenant_id?: string;
15724
+ tenant_id?: string | null;
15713
15725
  updated_at?: string;
15714
15726
  };
15715
15727
  Relationships: [];
@@ -17504,6 +17516,7 @@ export type Database = {
17504
17516
  created_at: string;
17505
17517
  id: string;
17506
17518
  layers_per_cart: number | null;
17519
+ needs_sticker: boolean;
17507
17520
  order_id: string;
17508
17521
  packing_locked_at: string | null;
17509
17522
  packing_locked_by: string | null;
@@ -17523,6 +17536,7 @@ export type Database = {
17523
17536
  created_at?: string;
17524
17537
  id?: string;
17525
17538
  layers_per_cart?: number | null;
17539
+ needs_sticker?: boolean;
17526
17540
  order_id: string;
17527
17541
  packing_locked_at?: string | null;
17528
17542
  packing_locked_by?: string | null;
@@ -17542,6 +17556,7 @@ export type Database = {
17542
17556
  created_at?: string;
17543
17557
  id?: string;
17544
17558
  layers_per_cart?: number | null;
17559
+ needs_sticker?: boolean;
17545
17560
  order_id?: string;
17546
17561
  packing_locked_at?: string | null;
17547
17562
  packing_locked_by?: string | null;
@@ -20998,7 +21013,7 @@ export type Database = {
20998
21013
  parent_trade_item_floriday_id: string | null;
20999
21014
  quantity: number;
21000
21015
  sort_order: number;
21001
- tenant_id: string;
21016
+ tenant_id: string | null;
21002
21017
  unit: string;
21003
21018
  updated_at: string;
21004
21019
  };
@@ -21011,7 +21026,7 @@ export type Database = {
21011
21026
  parent_trade_item_floriday_id?: string | null;
21012
21027
  quantity?: number;
21013
21028
  sort_order?: number;
21014
- tenant_id: string;
21029
+ tenant_id?: string | null;
21015
21030
  unit?: string;
21016
21031
  updated_at?: string;
21017
21032
  };
@@ -21024,7 +21039,7 @@ export type Database = {
21024
21039
  parent_trade_item_floriday_id?: string | null;
21025
21040
  quantity?: number;
21026
21041
  sort_order?: number;
21027
- tenant_id?: string;
21042
+ tenant_id?: string | null;
21028
21043
  unit?: string;
21029
21044
  updated_at?: string;
21030
21045
  };
@@ -21057,7 +21072,7 @@ export type Database = {
21057
21072
  parent_trade_item_floriday_id: string | null;
21058
21073
  quantity: number;
21059
21074
  sort_order: number;
21060
- tenant_id: string;
21075
+ tenant_id: string | null;
21061
21076
  unit: string;
21062
21077
  updated_at: string;
21063
21078
  };
@@ -21072,7 +21087,7 @@ export type Database = {
21072
21087
  parent_trade_item_floriday_id?: string | null;
21073
21088
  quantity?: number;
21074
21089
  sort_order?: number;
21075
- tenant_id: string;
21090
+ tenant_id?: string | null;
21076
21091
  unit?: string;
21077
21092
  updated_at?: string;
21078
21093
  };
@@ -21087,7 +21102,7 @@ export type Database = {
21087
21102
  parent_trade_item_floriday_id?: string | null;
21088
21103
  quantity?: number;
21089
21104
  sort_order?: number;
21090
- tenant_id?: string;
21105
+ tenant_id?: string | null;
21091
21106
  unit?: string;
21092
21107
  updated_at?: string;
21093
21108
  };
@@ -21267,7 +21282,7 @@ export type Database = {
21267
21282
  id: string;
21268
21283
  is_active: boolean;
21269
21284
  name: string;
21270
- tenant_id: string;
21285
+ tenant_id: string | null;
21271
21286
  updated_at: string;
21272
21287
  };
21273
21288
  Insert: {
@@ -21278,7 +21293,7 @@ export type Database = {
21278
21293
  id?: string;
21279
21294
  is_active?: boolean;
21280
21295
  name: string;
21281
- tenant_id: string;
21296
+ tenant_id?: string | null;
21282
21297
  updated_at?: string;
21283
21298
  };
21284
21299
  Update: {
@@ -21289,7 +21304,7 @@ export type Database = {
21289
21304
  id?: string;
21290
21305
  is_active?: boolean;
21291
21306
  name?: string;
21292
- tenant_id?: string;
21307
+ tenant_id?: string | null;
21293
21308
  updated_at?: string;
21294
21309
  };
21295
21310
  Relationships: [
@@ -21324,7 +21339,7 @@ export type Database = {
21324
21339
  packages_per_layer: number | null;
21325
21340
  packing_configuration_id: string;
21326
21341
  product_id: string | null;
21327
- tenant_id: string;
21342
+ tenant_id: string | null;
21328
21343
  trade_item_floriday_id: string | null;
21329
21344
  units_per_package: number | null;
21330
21345
  updated_at: string;
@@ -21343,7 +21358,7 @@ export type Database = {
21343
21358
  packages_per_layer?: number | null;
21344
21359
  packing_configuration_id?: string;
21345
21360
  product_id?: string | null;
21346
- tenant_id: string;
21361
+ tenant_id?: string | null;
21347
21362
  trade_item_floriday_id?: string | null;
21348
21363
  units_per_package?: number | null;
21349
21364
  updated_at?: string;
@@ -21362,7 +21377,7 @@ export type Database = {
21362
21377
  packages_per_layer?: number | null;
21363
21378
  packing_configuration_id?: string;
21364
21379
  product_id?: string | null;
21365
- tenant_id?: string;
21380
+ tenant_id?: string | null;
21366
21381
  trade_item_floriday_id?: string | null;
21367
21382
  units_per_package?: number | null;
21368
21383
  updated_at?: string;
@@ -29681,6 +29696,26 @@ export type Database = {
29681
29696
  Args: never;
29682
29697
  Returns: Json;
29683
29698
  };
29699
+ ai_is_admin: {
29700
+ Args: {
29701
+ _uid: string;
29702
+ };
29703
+ Returns: boolean;
29704
+ };
29705
+ ai_register_consumers: {
29706
+ Args: {
29707
+ _full_list?: boolean;
29708
+ _modules: Json;
29709
+ _source?: string;
29710
+ };
29711
+ Returns: Json;
29712
+ };
29713
+ ai_register_runtime_consumer: {
29714
+ Args: {
29715
+ _module_key: string;
29716
+ };
29717
+ Returns: boolean;
29718
+ };
29684
29719
  ai_usage_by_module: {
29685
29720
  Args: {
29686
29721
  _from: string;
@@ -31836,10 +31871,25 @@ export type Database = {
31836
31871
  };
31837
31872
  Returns: boolean;
31838
31873
  };
31874
+ klanten_auto_promote_status: {
31875
+ Args: never;
31876
+ Returns: Json;
31877
+ };
31839
31878
  klanten_install_check: {
31840
31879
  Args: never;
31841
31880
  Returns: Json;
31842
31881
  };
31882
+ klanten_promote_round: {
31883
+ Args: never;
31884
+ Returns: Json;
31885
+ };
31886
+ klanten_set_auto_promote: {
31887
+ Args: {
31888
+ p_kind: string;
31889
+ p_on: boolean;
31890
+ };
31891
+ Returns: Json;
31892
+ };
31843
31893
  layout_print_document: {
31844
31894
  Args: {
31845
31895
  _documentnaam: string;
@@ -36605,6 +36655,17 @@ export type Database = {
36605
36655
  };
36606
36656
  Returns: string;
36607
36657
  };
36658
+ productontwerp_can_write: {
36659
+ Args: never;
36660
+ Returns: boolean;
36661
+ };
36662
+ productontwerp_create_missing_products: {
36663
+ Args: {
36664
+ p_items: Json;
36665
+ p_run_id: string;
36666
+ };
36667
+ Returns: Json;
36668
+ };
36608
36669
  productontwerp_export: {
36609
36670
  Args: never;
36610
36671
  Returns: Json;
@@ -36616,12 +36677,38 @@ export type Database = {
36616
36677
  };
36617
36678
  Returns: Json;
36618
36679
  };
36680
+ productontwerp_nl_error: {
36681
+ Args: {
36682
+ p_detail: string;
36683
+ p_msg: string;
36684
+ p_state: string;
36685
+ };
36686
+ Returns: string;
36687
+ };
36619
36688
  productontwerp_product_ref: {
36620
36689
  Args: {
36621
36690
  p_id: string;
36622
36691
  };
36623
36692
  Returns: Json;
36624
36693
  };
36694
+ productontwerp_queue_count: {
36695
+ Args: never;
36696
+ Returns: number;
36697
+ };
36698
+ productontwerp_rollback_created_products: {
36699
+ Args: {
36700
+ p_run_id: string;
36701
+ };
36702
+ Returns: Json;
36703
+ };
36704
+ productontwerp_unique_group_name: {
36705
+ Args: {
36706
+ p_article: string;
36707
+ p_base: string;
36708
+ p_used: string[];
36709
+ };
36710
+ Returns: string;
36711
+ };
36625
36712
  promote_floriday_customer: {
36626
36713
  Args: {
36627
36714
  _org_id: string;