@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.
- package/dist-lib/components/AiAuthenticatiePage.d.ts.map +1 -1
- package/dist-lib/components/AiAuthenticatiePage.js +6 -3
- package/dist-lib/hooks/useAiForGoal.d.ts +2 -2
- package/dist-lib/hooks/useAiForGoal.d.ts.map +1 -1
- package/dist-lib/hooks/useAiForGoal.js +1 -1
- package/dist-lib/hooks/useIsAiAdmin.d.ts +1 -0
- package/dist-lib/hooks/useIsAiAdmin.d.ts.map +1 -1
- package/dist-lib/hooks/useIsAiAdmin.js +22 -3
- package/dist-lib/index.d.ts +6 -1
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +4 -0
- package/dist-lib/integrations/supabase/types.d.ts +102 -15
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiAttachments.d.ts +22 -0
- package/dist-lib/lib/aiAttachments.d.ts.map +1 -0
- package/dist-lib/lib/aiAttachments.js +105 -0
- package/dist-lib/lib/aiChat.functions.d.ts +3 -2
- package/dist-lib/lib/aiChat.functions.d.ts.map +1 -1
- package/dist-lib/lib/aiChat.functions.js +6 -1
- package/dist-lib/lib/aiChat.server.d.ts +8 -1
- package/dist-lib/lib/aiChat.server.d.ts.map +1 -1
- package/dist-lib/lib/aiChat.server.js +37 -17
- package/dist-lib/lib/aiChat.stream.server.d.ts.map +1 -1
- package/dist-lib/lib/aiChat.stream.server.js +3 -1
- package/dist-lib/lib/aiChat.types.d.ts +8 -1
- package/dist-lib/lib/aiChat.types.d.ts.map +1 -1
- package/dist-lib/lib/aiModules.server.d.ts +4 -0
- package/dist-lib/lib/aiModules.server.d.ts.map +1 -1
- package/dist-lib/lib/aiModules.server.js +6 -3
- package/dist-lib/lib/aiRegistry.d.ts +31 -0
- package/dist-lib/lib/aiRegistry.d.ts.map +1 -0
- package/dist-lib/lib/aiRegistry.functions.d.ts +25 -0
- package/dist-lib/lib/aiRegistry.functions.d.ts.map +1 -0
- package/dist-lib/lib/aiRegistry.functions.js +25 -0
- package/dist-lib/lib/aiRegistry.js +46 -0
- package/dist-lib/lib/aiRegistry.server.d.ts +13 -0
- package/dist-lib/lib/aiRegistry.server.d.ts.map +1 -0
- package/dist-lib/lib/aiRegistry.server.js +21 -0
- package/dist-lib/lib/aiUsageByModule.functions.d.ts.map +1 -1
- package/dist-lib/lib/aiUsageByModule.functions.js +1 -4
- package/dist-lib/lib/modules.server.d.ts.map +1 -1
- package/dist-lib/lib/modules.server.js +7 -7
- package/package.json +14 -4
- package/schema/ai-authenticatie.sql +124 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiAuthenticatiePage.d.ts","sourceRoot":"","sources":["../../src/components/AiAuthenticatiePage.tsx"],"names":[],"mappings":"
|
|
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:
|
|
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:
|
|
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;
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsAiAdmin.d.ts","sourceRoot":"","sources":["../../src/hooks/useIsAiAdmin.ts"],"names":[],"mappings":"
|
|
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
|
|
4
|
-
|
|
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
|
}
|
package/dist-lib/index.d.ts
CHANGED
|
@@ -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';
|
package/dist-lib/index.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|