@datatechsolutions/ui 2.11.81 → 2.11.83
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/astrlabe/contracts.d.mts +5 -0
- package/dist/astrlabe/contracts.d.ts +5 -0
- package/dist/astrlabe/index.d.mts +59 -82
- package/dist/astrlabe/index.d.ts +59 -82
- package/dist/astrlabe/index.js +179 -4777
- package/dist/astrlabe/index.js.map +1 -1
- package/dist/astrlabe/index.mjs +3 -4740
- package/dist/astrlabe/index.mjs.map +1 -1
- package/dist/astrlabe/workflow-canvas.d.mts +69 -5
- package/dist/astrlabe/workflow-canvas.d.ts +69 -5
- package/dist/chunk-6PBTB5ZX.js +165 -0
- package/dist/chunk-6PBTB5ZX.js.map +1 -0
- package/dist/chunk-HZ4LOVHM.js +46 -0
- package/dist/chunk-HZ4LOVHM.js.map +1 -0
- package/dist/chunk-JFWZHROG.js +4996 -0
- package/dist/chunk-JFWZHROG.js.map +1 -0
- package/dist/chunk-UHHPBREK.mjs +135 -0
- package/dist/chunk-UHHPBREK.mjs.map +1 -0
- package/dist/chunk-UVGMKHWH.mjs +4951 -0
- package/dist/chunk-UVGMKHWH.mjs.map +1 -0
- package/dist/chunk-ZJPNP2YW.mjs +44 -0
- package/dist/chunk-ZJPNP2YW.mjs.map +1 -0
- package/dist/{workflow-canvas-NSxfr5dy.d.ts → index-AioB90qq.d.mts} +2 -67
- package/dist/{workflow-canvas-D4928AfA.d.mts → index-D5ai0cGZ.d.ts} +2 -67
- package/dist/platform/index.d.mts +41 -0
- package/dist/platform/index.d.ts +41 -0
- package/dist/platform/index.js +237 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/index.mjs +109 -0
- package/dist/platform/index.mjs.map +1 -0
- package/dist/platform/pages/index.d.mts +272 -0
- package/dist/platform/pages/index.d.ts +272 -0
- package/dist/platform/pages/index.js +1793 -0
- package/dist/platform/pages/index.js.map +1 -0
- package/dist/platform/pages/index.mjs +1777 -0
- package/dist/platform/pages/index.mjs.map +1 -0
- package/dist/platform/rbac.d.mts +41 -0
- package/dist/platform/rbac.d.ts +41 -0
- package/dist/platform/rbac.js +13 -0
- package/dist/platform/rbac.js.map +1 -0
- package/dist/platform/rbac.mjs +4 -0
- package/dist/platform/rbac.mjs.map +1 -0
- package/dist/platform/utils/index.d.mts +32 -0
- package/dist/platform/utils/index.d.ts +32 -0
- package/dist/platform/utils/index.js +131 -0
- package/dist/platform/utils/index.js.map +1 -0
- package/dist/platform/utils/index.mjs +119 -0
- package/dist/platform/utils/index.mjs.map +1 -0
- package/dist/platform/windsock-admin-client.d.mts +57 -0
- package/dist/platform/windsock-admin-client.d.ts +57 -0
- package/dist/platform/windsock-admin-client.js +125 -0
- package/dist/platform/windsock-admin-client.js.map +1 -0
- package/dist/platform/windsock-admin-client.mjs +4 -0
- package/dist/platform/windsock-admin-client.mjs.map +1 -0
- package/dist/rule-form-F5jBOeqk.d.mts +79 -0
- package/dist/rule-form-F5jBOeqk.d.ts +79 -0
- package/package.json +27 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/platform/pages/users-page-view.tsx","../../../src/platform/pages/agents-models-page-view.tsx","../../../src/platform/pages/agents-config-page-view.tsx","../../../src/platform/pages/agents-prompts-page-view.tsx","../../../src/platform/pages/agents-tool-definitions-page-view.tsx","../../../src/platform/pages/rules-page-view.tsx","../../../src/platform/pages/datasource-modal.tsx","../../../src/platform/pages/datasources-page-view.tsx"],"names":["jsx","useState","jsxs","Fragment","CircleStackIcon"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useState, type FormEvent } from 'react'\nimport { UserGroupIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n InlineForm,\n} from '@ui/index'\nimport type { UserRole, ManagedUser, UsersPageViewProps } from '@datatechsolutions/shared-domain/common'\n\nconst ROLE_OPTIONS: Array<{ value: UserRole; label: string }> = [\n { value: 'admin', label: 'Admin' },\n { value: 'manager', label: 'Manager' },\n { value: 'analyst', label: 'Analyst' },\n { value: 'viewer', label: 'Viewer' },\n]\n\nexport function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps) {\n const [createOpen, setCreateOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<UserGroupIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.list}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user: ManagedUser) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <UserGroupIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold ${\n user.active\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300'\n : 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300'\n }`}\n >\n {user.active ? labels.statusActive : labels.statusInactive}\n </span>\n )}\n footer={(\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n onUpdateRole({ email: user.email, role })\n }}\n >\n <InlineForm>\n <FormSelect name=\"role\" options={ROLE_OPTIONS} defaultValue={user.role} />\n <Button type=\"submit\" outline size=\"sm\">{labels.save}</Button>\n </InlineForm>\n </form>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.create}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.list}\n submitLabel={labels.add}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const name = String(formData.get('name') ?? '').trim()\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!name || !email) return\n onCreateUser({ name, email, role })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} placeholder={labels.userNamePlaceholder} required />\n <FormInput name=\"email\" label={labels.email} placeholder={labels.userEmailPlaceholder} required type=\"email\" />\n <FormSelect name=\"role\" label={labels.role} options={ROLE_OPTIONS} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import {\n Badge,\n EntityCard,\n HeroSection,\n ManagementPageLayout,\n PageEmptyState,\n PageLoadingState,\n} from '@ui/index'\nimport { CubeTransparentIcon } from '@heroicons/react/24/outline'\nimport type { AgentModel } from '../../astrlabe/contracts'\n\nexport type AgentsModelsLabels = {\n title: string\n subtitle: string\n provider: string\n enabled: string\n disabled: string\n empty: string\n}\n\ntype Props = {\n labels: AgentsModelsLabels\n models: AgentModel[]\n loading: boolean\n}\n\nexport function AgentsModelsPageView({ labels, models, loading }: Props) {\n const hero = (\n <HeroSection\n icon={<CubeTransparentIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-emerald-500 to-teal-700\"\n />\n )\n\n const content = loading ? (\n <PageLoadingState />\n ) : models.length === 0 ? (\n <PageEmptyState title={labels.empty} message={labels.subtitle} iconName=\"folder-open\" />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {models.map((model) => (\n <EntityCard\n key={model.id}\n accentGradient=\"from-emerald-500 to-teal-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <CubeTransparentIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={model.name}\n subtitle={`${labels.provider}: ${model.provider}`}\n status={(\n <Badge color={model.enabled ? 'emerald' : 'zinc'}>\n {model.enabled ? labels.enabled : labels.disabled}\n </Badge>\n )}\n />\n ))}\n </div>\n )\n\n return <ManagementPageLayout hero={hero} content={content} />\n}\n","import { useState, type FormEvent } from 'react'\nimport { CpuChipIcon } from '@heroicons/react/24/outline'\nimport {\n Badge,\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n FormSelect,\n FormTextarea,\n GlassModal,\n HeroSection,\n ManagementPageLayout,\n PageEmptyState,\n PageLoadingState,\n} from '@ui/index'\nimport type { AgentModel } from '../../astrlabe/contracts'\nimport type { AgentWithPrompts } from '../../astrlabe'\n\nexport type AgentConfigFormInput = {\n agentId?: string\n name: string\n modelId: string\n systemPrompt: string\n maxTokens: number\n temperature: number\n outputSchema?: string\n}\n\nexport type AgentsConfigLabels = {\n title: string\n subtitle: string\n addAgent: string\n createTitle: string\n editTitle: string\n name: string\n model: string\n systemPrompt: string\n maxTokens: number | string\n temperature: string\n outputSchema: string\n outputSchemaPlaceholder: string\n save: string\n delete: string\n edit: string\n deleteConfirm: string\n activeVersion: string\n empty: string\n}\n\ntype Props = {\n labels: AgentsConfigLabels\n agents: AgentWithPrompts[]\n models: AgentModel[]\n loading: boolean\n onCreate: (input: AgentConfigFormInput) => void\n onUpdate: (agentId: string, input: AgentConfigFormInput) => void\n onDelete: (agent: AgentWithPrompts) => void\n}\n\nexport function AgentsConfigPageView({ labels, agents, models, loading, onCreate, onUpdate, onDelete }: Props) {\n const [editing, setEditing] = useState<AgentWithPrompts | null>(null)\n const [createOpen, setCreateOpen] = useState(false)\n\n const modelOptions = models.map((model) => ({ value: model.id, label: `${model.name} (${model.provider})` }))\n\n const hero = (\n <HeroSection\n icon={<CpuChipIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-700\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.addAgent}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n )\n\n const mobileAction = (\n <CreateActionButton\n mode=\"mobile\"\n label={labels.addAgent}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )\n\n const content = loading ? (\n <PageLoadingState />\n ) : agents.length === 0 ? (\n <PageEmptyState title={labels.empty} message={labels.subtitle} iconName=\"folder-open\" />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {agents.map((agent) => {\n const modelRecord = models.find((model) => model.id === String(agent.modelId ?? ''))\n return (\n <EntityCard\n key={String(agent.agentId ?? agent.id ?? agent.name)}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <CpuChipIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={String(agent.name ?? '')}\n subtitle={String(modelRecord?.name ?? agent.modelId ?? '')}\n status={agent.activePromptVersion > 0 ? (\n <Badge color=\"emerald\">v{agent.activePromptVersion}</Badge>\n ) : null}\n footer={(\n <div className=\"flex gap-2\">\n <Button type=\"button\" size=\"sm\" outline onClick={() => setEditing(agent)}>\n {labels.edit}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"rose\"\n onClick={() => {\n if (window.confirm(labels.deleteConfirm)) onDelete(agent)\n }}\n >\n {labels.delete}\n </Button>\n </div>\n )}\n >\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {labels.activeVersion}: {agent.activePromptVersion} · Prompts: {agent.promptCount}\n </p>\n </EntityCard>\n )\n })}\n </div>\n )\n\n const renderForm = (initial: Partial<AgentConfigFormInput> & { title: string }, onSubmit: (input: AgentConfigFormInput) => void) => (\n <GlassModal\n open\n onClose={() => { setEditing(null); setCreateOpen(false) }}\n title={initial.title}\n maxWidth=\"lg\"\n showFormFooter\n submitLabel={labels.save}\n onSubmit={(event: FormEvent) => {\n const form = new FormData(event.currentTarget as HTMLFormElement)\n onSubmit({\n agentId: initial.agentId,\n name: String(form.get('name') ?? '').trim(),\n modelId: String(form.get('modelId') ?? ''),\n systemPrompt: String(form.get('systemPrompt') ?? '').trim(),\n maxTokens: Number(form.get('maxTokens') ?? 2048),\n temperature: Number(form.get('temperature') ?? 0.2),\n outputSchema: String(form.get('outputSchema') ?? '').trim() || undefined,\n })\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} defaultValue={initial.name ?? ''} required />\n <FormSelect name=\"modelId\" label={labels.model} options={modelOptions} defaultValue={initial.modelId ?? modelOptions[0]?.value ?? ''} required />\n <FormInput name=\"maxTokens\" label={String(labels.maxTokens)} type=\"number\" defaultValue={String(initial.maxTokens ?? 2048)} />\n <FormInput name=\"temperature\" label={labels.temperature} type=\"number\" step={0.1} min={0} max={2} defaultValue={String(initial.temperature ?? 0.2)} />\n <FormTextarea name=\"systemPrompt\" label={labels.systemPrompt} defaultValue={initial.systemPrompt ?? ''} rows={4} />\n <FormTextarea name=\"outputSchema\" label={labels.outputSchema} placeholder={labels.outputSchemaPlaceholder} defaultValue={initial.outputSchema ?? ''} rows={4} />\n </FormGrid>\n </GlassModal>\n )\n\n return (\n <>\n <ManagementPageLayout hero={hero} content={content} mobileAction={mobileAction} />\n {createOpen && renderForm({ title: labels.createTitle }, (input) => {\n onCreate(input)\n setCreateOpen(false)\n })}\n {editing && renderForm(\n {\n title: labels.editTitle,\n agentId: String(editing.agentId ?? editing.id ?? ''),\n name: String(editing.name ?? ''),\n modelId: String(editing.modelId ?? ''),\n systemPrompt: String((editing as Record<string, unknown>).systemPrompt ?? ''),\n maxTokens: Number(editing.maxTokens ?? 2048),\n temperature: Number((editing as Record<string, unknown>).temperature ?? 0.2),\n outputSchema: String((editing as Record<string, unknown>).outputSchema ?? ''),\n },\n (input) => {\n onUpdate(String(editing.agentId ?? editing.id ?? ''), input)\n setEditing(null)\n },\n )}\n </>\n )\n}\n","import { useMemo, useState, type FormEvent } from 'react'\nimport { ChatBubbleLeftEllipsisIcon } from '@heroicons/react/24/outline'\nimport {\n Badge,\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n FormSelect,\n FormTextarea,\n GlassModal,\n HeroSection,\n ManagementPageLayout,\n PageEmptyState,\n PageLoadingState,\n} from '@ui/index'\nimport type { AgentPrompt } from '@datatechsolutions/shared-domain/ports/workflow'\nimport type { AgentWithPrompts } from '../../astrlabe'\n\nexport type PromptFormInput = {\n agentId: string\n locale: string\n prompt: string\n systemPrompt?: string\n userTemplate?: string\n isActive: boolean\n reason?: string\n}\n\nexport type AgentsPromptsLabels = {\n title: string\n subtitle: string\n addPrompt: string\n createTitle: string\n editTitle: string\n agent: string\n locale: string\n version: string\n isActive: string\n prompt: string\n systemPrompt: string\n userTemplate: string\n reason: string\n save: string\n delete: string\n activate: string\n deleteConfirm: string\n empty: string\n}\n\ntype Props = {\n labels: AgentsPromptsLabels\n agents: AgentWithPrompts[]\n prompts: AgentPrompt[]\n loading: boolean\n onCreate: (input: PromptFormInput) => void\n onActivate: (prompt: AgentPrompt) => void\n onDelete: (prompt: AgentPrompt) => void\n}\n\nconst LOCALE_OPTIONS = [\n { value: 'en', label: 'English' },\n { value: 'pt-BR', label: 'Português (Brasil)' },\n { value: 'es', label: 'Español' },\n { value: 'fr', label: 'Français' },\n { value: 'de', label: 'Deutsch' },\n { value: 'it', label: 'Italiano' },\n]\n\nexport function AgentsPromptsPageView({ labels, agents, prompts, loading, onCreate, onActivate, onDelete }: Props) {\n const [createOpen, setCreateOpen] = useState(false)\n\n const agentOptions = useMemo(\n () => agents.map((agent) => ({\n value: String(agent.agentId ?? agent.id ?? ''),\n label: String(agent.name ?? agent.agentId ?? agent.id ?? ''),\n })),\n [agents],\n )\n\n const agentNameById = useMemo(() => {\n const map = new Map<string, string>()\n for (const agent of agents) {\n const id = String(agent.agentId ?? agent.id ?? '')\n if (id) map.set(id, String(agent.name ?? id))\n }\n return map\n }, [agents])\n\n const hero = (\n <HeroSection\n icon={<ChatBubbleLeftEllipsisIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-sky-500 to-blue-700\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.addPrompt}\n onClick={() => setCreateOpen(true)}\n accent=\"sky\"\n />\n )}\n />\n )\n\n const mobileAction = (\n <CreateActionButton\n mode=\"mobile\"\n label={labels.addPrompt}\n onClick={() => setCreateOpen(true)}\n accent=\"sky\"\n />\n )\n\n const content = loading ? (\n <PageLoadingState />\n ) : prompts.length === 0 ? (\n <PageEmptyState title={labels.empty} message={labels.subtitle} iconName=\"folder-open\" />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {prompts.map((prompt) => {\n const agentName = agentNameById.get(prompt.agentId) ?? prompt.agentId\n const key = `${prompt.agentId}:${prompt.locale}:${prompt.version}`\n return (\n <EntityCard\n key={key}\n accentGradient=\"from-sky-500 to-blue-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-sky-500/10 text-sky-600 dark:bg-sky-500/20 dark:text-sky-400\">\n <ChatBubbleLeftEllipsisIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={agentName}\n subtitle={`${prompt.locale} · v${prompt.version}`}\n status={prompt.isActive ? <Badge color=\"emerald\">{labels.isActive}</Badge> : null}\n footer={(\n <div className=\"flex gap-2\">\n {!prompt.isActive && (\n <Button type=\"button\" size=\"sm\" outline onClick={() => onActivate(prompt)}>{labels.activate}</Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"rose\"\n onClick={() => {\n if (window.confirm(labels.deleteConfirm)) onDelete(prompt)\n }}\n >{labels.delete}</Button>\n </div>\n )}\n >\n {prompt.prompt && (\n <p className=\"mt-1 line-clamp-3 text-xs text-slate-500 dark:text-slate-400\">{prompt.prompt}</p>\n )}\n </EntityCard>\n )\n })}\n </div>\n )\n\n return (\n <>\n <ManagementPageLayout hero={hero} content={content} mobileAction={mobileAction} />\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.createTitle}\n maxWidth=\"2xl\"\n showFormFooter\n submitLabel={labels.save}\n onSubmit={(event: FormEvent) => {\n const form = new FormData(event.currentTarget as HTMLFormElement)\n const systemPrompt = String(form.get('systemPrompt') ?? '').trim()\n const userTemplate = String(form.get('userTemplate') ?? '').trim()\n const reason = String(form.get('reason') ?? '').trim()\n onCreate({\n agentId: String(form.get('agentId') ?? '').trim(),\n locale: String(form.get('locale') ?? 'en').trim(),\n prompt: String(form.get('prompt') ?? '').trim(),\n systemPrompt: systemPrompt || undefined,\n userTemplate: userTemplate || undefined,\n reason: reason || undefined,\n isActive: String(form.get('isActive') ?? 'true') === 'true',\n })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormSelect name=\"agentId\" label={labels.agent} options={agentOptions} required />\n <FormSelect name=\"locale\" label={labels.locale} options={LOCALE_OPTIONS} defaultValue=\"en\" />\n <FormSelect\n name=\"isActive\"\n label={labels.isActive}\n options={[{ value: 'true', label: labels.isActive }, { value: 'false', label: labels.isActive }]}\n defaultValue=\"true\"\n />\n <FormInput name=\"reason\" label={labels.reason} />\n <FormTextarea name=\"systemPrompt\" label={labels.systemPrompt} rows={3} />\n <FormTextarea name=\"userTemplate\" label={labels.userTemplate} rows={3} />\n <FormTextarea name=\"prompt\" label={labels.prompt} rows={6} required />\n </FormGrid>\n </GlassModal>\n </>\n )\n}\n","import { useState } from 'react'\nimport { WrenchScrewdriverIcon } from '@heroicons/react/24/outline'\nimport {\n Badge,\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n FormSelect,\n FormTextarea,\n GlassModal,\n HeroSection,\n ManagementPageLayout,\n PageEmptyState,\n PageLoadingState,\n} from '@ui/index'\nimport type { AgentTool } from '../../astrlabe/contracts'\n\nexport const TOOL_TYPES = [\n 'http',\n 'function',\n 'database_query',\n 'code_execution',\n 'api_call',\n] as const\n\nexport type ToolType = (typeof TOOL_TYPES)[number]\n\nexport type ToolParameter = {\n name: string\n type: 'string' | 'number' | 'boolean' | 'array' | 'object'\n description: string\n required: boolean\n}\n\n/**\n * Canonical form payload the page emits. The page wrapper turns this\n * into the backend POST/PATCH bodies — parameters go through\n * `parametersToJsonSchema` to produce `inputSchema`, and `handlerConfig`\n * stays as-is.\n */\nexport type ToolDefinitionFormInput = {\n agentToolId?: string\n name: string\n description?: string\n toolType: ToolType\n parameters: ToolParameter[]\n handlerConfig: Record<string, unknown>\n enabled: boolean\n icon?: string\n}\n\nexport type AgentsToolDefinitionsLabels = {\n title: string\n subtitle: string\n addTool: string\n createTitle: string\n editTitle: string\n name: string\n description: string\n category: string\n enabled: string\n disabled: string\n icon: string\n save: string\n delete: string\n edit: string\n deleteConfirm: string\n empty: string\n}\n\nconst TOOL_TYPE_OPTIONS: Array<{ value: ToolType; label: string; description: string }> = [\n { value: 'http', label: 'HTTP', description: 'Call an HTTP endpoint with templated URL/body.' },\n { value: 'function', label: 'Function', description: 'Invoke a pre-registered server-side implementation.' },\n { value: 'database_query', label: 'Database query', description: 'Run a parameterized SELECT against a datasource.' },\n { value: 'code_execution', label: 'Code execution', description: 'Run sandboxed code (JS/Python) — experimental.' },\n { value: 'api_call', label: 'API call', description: 'Call a third-party API via stored credentials.' },\n]\n\nconst PARAMETER_TYPE_OPTIONS: Array<{ value: ToolParameter['type']; label: string }> = [\n { value: 'string', label: 'string' },\n { value: 'number', label: 'number' },\n { value: 'boolean', label: 'boolean' },\n { value: 'array', label: 'array' },\n { value: 'object', label: 'object' },\n]\n\ntype Props = {\n labels: AgentsToolDefinitionsLabels\n tools: AgentTool[]\n loading: boolean\n onCreate: (input: ToolDefinitionFormInput) => void\n onUpdate: (toolId: string, input: ToolDefinitionFormInput) => void\n onDelete: (tool: AgentTool) => void\n}\n\nexport function AgentsToolDefinitionsPageView({ labels, tools, loading, onCreate, onUpdate, onDelete }: Props) {\n const [editing, setEditing] = useState<AgentTool | null>(null)\n const [createOpen, setCreateOpen] = useState(false)\n\n const hero = (\n <HeroSection\n icon={<WrenchScrewdriverIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-amber-500 to-orange-700\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.addTool}\n onClick={() => setCreateOpen(true)}\n accent=\"amber\"\n />\n )}\n />\n )\n\n const mobileAction = (\n <CreateActionButton\n mode=\"mobile\"\n label={labels.addTool}\n onClick={() => setCreateOpen(true)}\n accent=\"amber\"\n />\n )\n\n const content = loading ? (\n <PageLoadingState />\n ) : tools.length === 0 ? (\n <PageEmptyState title={labels.empty} message={labels.subtitle} iconName=\"folder-open\" />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {tools.map((tool) => (\n <EntityCard\n key={tool.agentToolId}\n accentGradient=\"from-amber-500 to-orange-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-amber-500/10 text-amber-600 dark:bg-amber-500/20 dark:text-amber-400\">\n <WrenchScrewdriverIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={tool.name}\n subtitle={toolTypeLabel(tool)}\n status={(\n <Badge color={tool.enabled ? 'emerald' : 'zinc'}>\n {tool.enabled ? labels.enabled : labels.disabled}\n </Badge>\n )}\n footer={(\n <div className=\"flex gap-2\">\n <Button type=\"button\" size=\"sm\" outline onClick={() => setEditing(tool)}>{labels.edit}</Button>\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"rose\"\n onClick={() => {\n if (window.confirm(labels.deleteConfirm)) onDelete(tool)\n }}\n >{labels.delete}</Button>\n </div>\n )}\n >\n {tool.description && (\n <p className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">{tool.description}</p>\n )}\n </EntityCard>\n ))}\n </div>\n )\n\n return (\n <>\n <ManagementPageLayout hero={hero} content={content} mobileAction={mobileAction} />\n {createOpen && (\n <ToolEditor\n title={labels.createTitle}\n saveLabel={labels.save}\n initial={defaultForm()}\n onClose={() => setCreateOpen(false)}\n onSubmit={(input) => {\n onCreate(input)\n setCreateOpen(false)\n }}\n />\n )}\n {editing && (\n <ToolEditor\n title={labels.editTitle}\n saveLabel={labels.save}\n initial={toolToForm(editing)}\n onClose={() => setEditing(null)}\n onSubmit={(input) => {\n onUpdate(editing.agentToolId, input)\n setEditing(null)\n }}\n />\n )}\n </>\n )\n}\n\n// ── Form modal ──────────────────────────────────────────────────\n\nfunction ToolEditor({\n title,\n saveLabel,\n initial,\n onSubmit,\n onClose,\n}: {\n title: string\n saveLabel: string\n initial: ToolDefinitionFormInput\n onSubmit: (input: ToolDefinitionFormInput) => void\n onClose: () => void\n}) {\n const [value, setValue] = useState<ToolDefinitionFormInput>(initial)\n const [error, setError] = useState<string | null>(null)\n\n const handleSubmit = () => {\n if (!value.name.trim()) {\n setError('Name is required')\n return\n }\n // Validate parameter names — JSON Schema keys must not collide.\n const names = value.parameters.map((p) => p.name.trim())\n if (names.some((n) => n.length === 0)) {\n setError('Every parameter must have a name')\n return\n }\n if (new Set(names).size !== names.length) {\n setError('Parameter names must be unique')\n return\n }\n onSubmit(value)\n }\n\n const update = <K extends keyof ToolDefinitionFormInput>(key: K, next: ToolDefinitionFormInput[K]) => {\n setValue((v) => ({ ...v, [key]: next }))\n }\n\n return (\n <GlassModal\n open\n onClose={onClose}\n title={title}\n maxWidth=\"3xl\"\n showFormFooter\n submitLabel={saveLabel}\n onSubmit={(event) => {\n event.preventDefault()\n handleSubmit()\n }}\n >\n <div className=\"space-y-5\">\n <FormGrid>\n <FormInput\n label=\"Name\"\n required\n value={value.name}\n onValueChange={(name) => update('name', name)}\n placeholder=\"get_station_prices\"\n />\n <FormSelect\n label=\"Tool type\"\n value={value.toolType}\n options={TOOL_TYPE_OPTIONS.map((o) => ({ value: o.value, label: o.label }))}\n onValueChange={(v) => update('toolType', v as ToolType)}\n hint={TOOL_TYPE_OPTIONS.find((o) => o.value === value.toolType)?.description}\n />\n <FormSelect\n label=\"Enabled\"\n value={value.enabled ? 'true' : 'false'}\n options={[{ value: 'true', label: 'Enabled' }, { value: 'false', label: 'Disabled' }]}\n onValueChange={(v) => update('enabled', v === 'true')}\n />\n <FormInput\n label=\"Icon (optional)\"\n value={value.icon ?? ''}\n onValueChange={(icon) => update('icon', icon)}\n placeholder=\"heroicons:wrench-screwdriver\"\n />\n </FormGrid>\n\n <FormTextarea\n label=\"Description\"\n rows={2}\n value={value.description ?? ''}\n onValueChange={(description) => update('description', description)}\n placeholder=\"One-sentence summary shown to the agent when it picks tools.\"\n />\n\n <ParametersEditor\n parameters={value.parameters}\n onChange={(parameters) => update('parameters', parameters)}\n />\n\n <HandlerConfigEditor\n toolType={value.toolType}\n config={value.handlerConfig}\n onChange={(handlerConfig) => update('handlerConfig', handlerConfig)}\n />\n\n {error && (\n <p className=\"rounded-lg border border-red-400/40 bg-red-500/10 p-2 text-xs text-red-600 dark:text-red-300\">\n {error}\n </p>\n )}\n </div>\n </GlassModal>\n )\n}\n\n// ── Parameters editor — produces JSON Schema on save ──\n\nfunction ParametersEditor({\n parameters,\n onChange,\n}: {\n parameters: ToolParameter[]\n onChange: (next: ToolParameter[]) => void\n}) {\n const update = (index: number, patch: Partial<ToolParameter>) => {\n onChange(parameters.map((p, i) => (i === index ? { ...p, ...patch } : p)))\n }\n const remove = (index: number) => {\n onChange(parameters.filter((_, i) => i !== index))\n }\n const add = () => {\n onChange([...parameters, { name: '', type: 'string', description: '', required: false }])\n }\n\n return (\n <section className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <h3 className=\"mb-2 text-sm font-semibold text-slate-700 dark:text-slate-200\">Parameters</h3>\n <p className=\"mb-3 text-xs text-slate-500 dark:text-slate-400\">\n The agent gets these as a JSON Schema. Any parameter marked required must be supplied for the LLM to call the tool.\n </p>\n <div className=\"space-y-2\">\n {parameters.map((param, index) => (\n <div key={index} className=\"grid grid-cols-[1fr_160px_1fr_110px_auto] items-end gap-2\">\n <FormInput\n label=\"Name\"\n value={param.name}\n onValueChange={(name) => update(index, { name })}\n placeholder=\"station_id\"\n />\n <FormSelect\n label=\"Type\"\n value={param.type}\n options={PARAMETER_TYPE_OPTIONS}\n onValueChange={(t) => update(index, { type: t as ToolParameter['type'] })}\n />\n <FormInput\n label=\"Description\"\n value={param.description}\n onValueChange={(description) => update(index, { description })}\n />\n <label className=\"flex items-center gap-2 pb-2 text-xs text-gray-700 dark:text-gray-300\">\n <input\n type=\"checkbox\"\n checked={param.required}\n onChange={(event) => update(index, { required: event.target.checked })}\n className=\"h-4 w-4 rounded border-gray-300\"\n />\n Required\n </label>\n <Button type=\"button\" plain onClick={() => remove(index)}>Remove</Button>\n </div>\n ))}\n <Button type=\"button\" outline onClick={add}>+ Add parameter</Button>\n </div>\n </section>\n )\n}\n\n// ── Handler config editor — per-tool-type UI ──\n\nfunction HandlerConfigEditor({\n toolType,\n config,\n onChange,\n}: {\n toolType: ToolType\n config: Record<string, unknown>\n onChange: (next: Record<string, unknown>) => void\n}) {\n const set = (key: string, value: unknown) => onChange({ ...config, [key]: value })\n\n if (toolType === 'http') {\n return (\n <section className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <h3 className=\"mb-2 text-sm font-semibold text-slate-700 dark:text-slate-200\">HTTP handler</h3>\n <FormGrid>\n <FormSelect\n label=\"Method\"\n value={stringProp(config, 'method', 'GET')}\n options={['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].map((m) => ({ value: m, label: m }))}\n onValueChange={(m) => set('method', m)}\n />\n <FormInput\n label=\"URL template\"\n value={stringProp(config, 'url')}\n onValueChange={(u) => set('url', u)}\n placeholder=\"https://api.example.com/stations/{{ station_id }}\"\n />\n </FormGrid>\n <FormTextarea\n label=\"Headers (JSON)\"\n rows={3}\n value={jsonProp(config, 'headers')}\n onValueChange={(raw) => setFromJson(set, 'headers', raw)}\n placeholder='{ \"Authorization\": \"Bearer {{ apiKey }}\" }'\n />\n <FormTextarea\n label=\"Body template\"\n rows={3}\n value={stringProp(config, 'bodyTemplate')}\n onValueChange={(b) => set('bodyTemplate', b)}\n placeholder='{\"query\": \"{{ search }}\"}'\n />\n </section>\n )\n }\n\n if (toolType === 'function') {\n return (\n <section className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <h3 className=\"mb-2 text-sm font-semibold text-slate-700 dark:text-slate-200\">Function handler</h3>\n <FormInput\n label=\"Implementation key\"\n value={stringProp(config, 'implementationKey')}\n onValueChange={(k) => set('implementationKey', k)}\n placeholder=\"fuel.get_station_prices\"\n hint=\"Must match a pre-registered handler on the server side.\"\n />\n </section>\n )\n }\n\n if (toolType === 'database_query') {\n return (\n <section className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <h3 className=\"mb-2 text-sm font-semibold text-slate-700 dark:text-slate-200\">Database query handler</h3>\n <FormGrid>\n <FormInput\n label=\"Datasource ID\"\n value={stringProp(config, 'datasourceId')}\n onValueChange={(v) => set('datasourceId', v)}\n placeholder=\"UUID from /datasources\"\n />\n <FormInput\n label=\"Max rows\"\n type=\"number\"\n value={numberProp(config, 'maxRows', 100)}\n onValueChange={(v) => set('maxRows', Number(v) || 100)}\n />\n </FormGrid>\n <FormTextarea\n label=\"Query template\"\n rows={4}\n value={stringProp(config, 'queryTemplate')}\n onValueChange={(v) => set('queryTemplate', v)}\n placeholder={'SELECT id, current_price FROM current_prices WHERE station_id = {{ station_id }}'}\n />\n </section>\n )\n }\n\n if (toolType === 'code_execution') {\n return (\n <section className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <h3 className=\"mb-2 text-sm font-semibold text-slate-700 dark:text-slate-200\">Code execution handler</h3>\n <p className=\"mb-2 text-xs text-amber-600 dark:text-amber-400\">\n Experimental — sandbox is not yet enforced. Only enable for trusted tools.\n </p>\n <FormSelect\n label=\"Language\"\n value={stringProp(config, 'language', 'javascript')}\n options={[\n { value: 'javascript', label: 'JavaScript' },\n { value: 'python', label: 'Python' },\n ]}\n onValueChange={(v) => set('language', v)}\n />\n <FormTextarea\n label=\"Code\"\n rows={6}\n value={stringProp(config, 'code')}\n onValueChange={(v) => set('code', v)}\n placeholder={'// return value becomes the tool output\\nreturn { price: inputs.x * 1.08 }'}\n />\n </section>\n )\n }\n\n // api_call — generic: url + auth method\n return (\n <section className=\"rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40\">\n <h3 className=\"mb-2 text-sm font-semibold text-slate-700 dark:text-slate-200\">API call handler</h3>\n <FormGrid>\n <FormInput\n label=\"URL\"\n value={stringProp(config, 'url')}\n onValueChange={(v) => set('url', v)}\n />\n <FormSelect\n label=\"Auth\"\n value={stringProp(config, 'authType', 'bearer')}\n options={[\n { value: 'none', label: 'None' },\n { value: 'bearer', label: 'Bearer token' },\n { value: 'api_key', label: 'API key header' },\n { value: 'basic', label: 'Basic auth' },\n ]}\n onValueChange={(v) => set('authType', v)}\n />\n <FormInput\n label=\"Credential secret id\"\n value={stringProp(config, 'credentialRef')}\n onValueChange={(v) => set('credentialRef', v)}\n placeholder=\"UUID from vault\"\n hint=\"Leave blank if Auth is None.\"\n />\n </FormGrid>\n </section>\n )\n}\n\n// ── Translators + helpers ───────────────────────────────────────\n\n/**\n * Build a JSON Schema object from the parameter list. Mirrors the\n * format the backend validator (`validate_input_schema`) expects —\n * `{ type: 'object', properties, required }`.\n */\nexport function parametersToJsonSchema(params: ToolParameter[]): Record<string, unknown> {\n const properties: Record<string, unknown> = {}\n const required: string[] = []\n for (const param of params) {\n if (!param.name.trim()) continue\n properties[param.name] = {\n type: param.type,\n ...(param.description ? { description: param.description } : {}),\n }\n if (param.required) required.push(param.name)\n }\n const schema: Record<string, unknown> = { type: 'object', properties }\n if (required.length > 0) schema.required = required\n return schema\n}\n\n/**\n * Inverse of `parametersToJsonSchema` — hydrate the editor UI from an\n * existing schema so the Edit flow shows what was stored.\n */\nexport function jsonSchemaToParameters(schema: unknown): ToolParameter[] {\n if (!schema || typeof schema !== 'object' || Array.isArray(schema)) return []\n const root = schema as Record<string, unknown>\n const properties = root.properties\n if (!properties || typeof properties !== 'object' || Array.isArray(properties)) return []\n const required = Array.isArray(root.required) ? (root.required as unknown[]).filter((r): r is string => typeof r === 'string') : []\n const entries = Object.entries(properties as Record<string, unknown>)\n return entries.map(([name, raw]) => {\n const def = (raw ?? {}) as Record<string, unknown>\n const rawType = def.type\n const type = isParameterType(rawType) ? rawType : 'string'\n return {\n name,\n type,\n description: typeof def.description === 'string' ? def.description : '',\n required: required.includes(name),\n }\n })\n}\n\nfunction isParameterType(v: unknown): v is ToolParameter['type'] {\n return v === 'string' || v === 'number' || v === 'boolean' || v === 'array' || v === 'object'\n}\n\nfunction defaultForm(): ToolDefinitionFormInput {\n return {\n name: '',\n description: '',\n toolType: 'http',\n parameters: [],\n handlerConfig: { method: 'GET' },\n enabled: true,\n }\n}\n\nfunction toolToForm(tool: AgentTool): ToolDefinitionFormInput {\n const raw = tool as Record<string, unknown>\n // Parse the nested `implementationKey` JSON that the backend stores —\n // it holds `{organizationId, handlerConfig}` per the Rust handler.\n const implRaw = raw.implementationKey ?? raw.implementation_key\n let handlerConfig: Record<string, unknown> = {}\n if (typeof implRaw === 'string') {\n try {\n const parsed = JSON.parse(implRaw) as Record<string, unknown>\n if (parsed && typeof parsed === 'object') {\n const inner = parsed.handlerConfig ?? parsed.handler_config\n if (inner && typeof inner === 'object' && !Array.isArray(inner)) {\n handlerConfig = inner as Record<string, unknown>\n }\n }\n } catch {\n // Legacy rows that stored implementationKey as a plain string —\n // surface it under a single `implementationKey` handler field.\n handlerConfig = { implementationKey: implRaw }\n }\n }\n\n const toolTypeRaw = raw.toolType ?? raw.tool_type ?? raw.category\n const toolType: ToolType = (TOOL_TYPES as readonly string[]).includes(String(toolTypeRaw))\n ? (toolTypeRaw as ToolType)\n : 'function'\n\n const parameters = jsonSchemaToParameters(raw.parameters ?? raw.inputSchema ?? raw.input_schema)\n\n return {\n agentToolId: tool.agentToolId,\n name: tool.name,\n description: tool.description,\n toolType,\n parameters,\n handlerConfig,\n enabled: tool.enabled,\n icon: tool.icon,\n }\n}\n\nfunction toolTypeLabel(tool: AgentTool): string {\n const raw = tool as Record<string, unknown>\n const t = raw.toolType ?? raw.tool_type ?? tool.category\n const entry = TOOL_TYPE_OPTIONS.find((o) => o.value === t)\n return entry?.label ?? (typeof t === 'string' ? t : 'tool')\n}\n\nfunction stringProp(obj: Record<string, unknown>, key: string, fallback = ''): string {\n const value = obj[key]\n return typeof value === 'string' ? value : fallback\n}\n\nfunction numberProp(obj: Record<string, unknown>, key: string, fallback: number): string {\n const value = obj[key]\n return typeof value === 'number' && Number.isFinite(value) ? String(value) : String(fallback)\n}\n\nfunction jsonProp(obj: Record<string, unknown>, key: string): string {\n const value = obj[key]\n if (!value) return ''\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return ''\n }\n}\n\nfunction setFromJson(\n set: (key: string, value: unknown) => void,\n key: string,\n raw: string,\n) {\n if (!raw.trim()) {\n set(key, undefined)\n return\n }\n try {\n set(key, JSON.parse(raw))\n } catch {\n // Keep the string around so the textarea's value round-trips; the\n // page wrapper refuses to submit if this is still invalid on save.\n set(key, raw)\n }\n}\n","import { useState } from 'react'\nimport { AdjustmentsHorizontalIcon } from '@heroicons/react/24/outline'\nimport {\n Badge,\n Button,\n CreateActionButton,\n EntityCard,\n GlassModal,\n HeroSection,\n ManagementPageLayout,\n PageEmptyState,\n PageLoadingState,\n} from '@ui/index'\nimport {\n RuleForm,\n defaultRuleForm,\n type RuleFormValue,\n} from '../../astrlabe'\nimport type { AgentRule } from '../../astrlabe/contracts'\n\nexport type { RuleFormValue }\n\nexport type RulesLabels = {\n title: string\n subtitle: string\n addRule: string\n createTitle: string\n editTitle: string\n save: string\n delete: string\n edit: string\n deleteConfirm: string\n empty: string\n enabled: string\n disabled: string\n order: string\n}\n\ntype Props = {\n labels: RulesLabels\n rules: AgentRule[]\n loading: boolean\n onCreate: (input: RuleFormValue) => void\n onUpdate: (ruleId: string, input: RuleFormValue) => void\n onDelete: (rule: AgentRule) => void\n}\n\nexport function RulesPageView({ labels, rules, loading, onCreate, onUpdate, onDelete }: Props) {\n const [createOpen, setCreateOpen] = useState(false)\n const [editing, setEditing] = useState<AgentRule | null>(null)\n\n const hero = (\n <HeroSection\n icon={<AdjustmentsHorizontalIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-fuchsia-500 to-purple-700\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.addRule}\n onClick={() => setCreateOpen(true)}\n accent=\"fuchsia\"\n />\n )}\n />\n )\n\n const mobileAction = (\n <CreateActionButton\n mode=\"mobile\"\n label={labels.addRule}\n onClick={() => setCreateOpen(true)}\n accent=\"fuchsia\"\n />\n )\n\n const content = loading ? (\n <PageLoadingState />\n ) : rules.length === 0 ? (\n <PageEmptyState title={labels.empty} message={labels.subtitle} iconName=\"folder-open\" />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {rules.map((rule) => (\n <EntityCard\n key={rule.ruleId}\n accentGradient=\"from-fuchsia-500 to-purple-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-fuchsia-500/10 text-fuchsia-600 dark:bg-fuchsia-500/20 dark:text-fuchsia-400\">\n <AdjustmentsHorizontalIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={rule.name}\n subtitle={`${labels.order}: ${rule.order ?? 0}`}\n status={(\n <Badge color={rule.enabled ? 'emerald' : 'zinc'}>\n {rule.enabled ? labels.enabled : labels.disabled}\n </Badge>\n )}\n footer={(\n <div className=\"flex gap-2\">\n <Button type=\"button\" size=\"sm\" outline onClick={() => setEditing(rule)}>{labels.edit}</Button>\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"rose\"\n onClick={() => {\n if (window.confirm(labels.deleteConfirm)) onDelete(rule)\n }}\n >{labels.delete}</Button>\n </div>\n )}\n >\n {rule.description && (\n <p className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">{rule.description}</p>\n )}\n </EntityCard>\n ))}\n </div>\n )\n\n return (\n <>\n <ManagementPageLayout hero={hero} content={content} mobileAction={mobileAction} />\n {createOpen && (\n <RuleEditor\n title={labels.createTitle}\n saveLabel={labels.save}\n initial={defaultRuleForm()}\n onClose={() => setCreateOpen(false)}\n onSubmit={(value) => {\n onCreate(value)\n setCreateOpen(false)\n }}\n />\n )}\n {editing && (\n <RuleEditor\n title={labels.editTitle}\n saveLabel={labels.save}\n initial={ruleToFormValue(editing)}\n onClose={() => setEditing(null)}\n onSubmit={(value) => {\n onUpdate(editing.ruleId, value)\n setEditing(null)\n }}\n />\n )}\n </>\n )\n}\n\nfunction RuleEditor({\n title,\n saveLabel,\n initial,\n onSubmit,\n onClose,\n}: {\n title: string\n saveLabel: string\n initial: RuleFormValue\n onSubmit: (value: RuleFormValue) => void\n onClose: () => void\n}) {\n const [value, setValue] = useState<RuleFormValue>(initial)\n return (\n <GlassModal\n open\n onClose={onClose}\n title={title}\n maxWidth=\"3xl\"\n showFormFooter\n submitLabel={saveLabel}\n onSubmit={(event) => {\n event.preventDefault()\n onSubmit(value)\n }}\n >\n <RuleForm value={value} onChange={setValue} />\n </GlassModal>\n )\n}\n\n/**\n * Convert an `AgentRule` wire payload (which may carry a legacy singular\n * `condition` + plural `actions[]` or the newer singular `action`) into\n * the canonical `RuleFormValue` shape the builder expects.\n */\nfunction ruleToFormValue(rule: AgentRule): RuleFormValue {\n const base = defaultRuleForm()\n const rawCondition = (rule.condition ?? rule.conditions) as RuleFormValue['condition'] | undefined\n const rawAction = pickAction(rule)\n return {\n ...base,\n ruleId: rule.ruleId,\n name: rule.name ?? '',\n description: rule.description ?? '',\n enabled: rule.enabled,\n priority: typeof rule.order === 'number' ? rule.order : typeof rule.priority === 'number' ? (rule.priority as number) : 0,\n condition: rawCondition && typeof rawCondition === 'object'\n ? (rawCondition as RuleFormValue['condition'])\n : base.condition,\n action: rawAction ?? base.action,\n status: typeof rule.status === 'string' ? (rule.status as RuleFormValue['status']) : base.status,\n validFrom: typeof rule.validFrom === 'string' ? rule.validFrom : base.validFrom,\n validUntil: typeof rule.validUntil === 'string' ? rule.validUntil : base.validUntil,\n tags: Array.isArray(rule.tags)\n ? (rule.tags as unknown[]).filter((tag): tag is string => typeof tag === 'string')\n : base.tags,\n }\n}\n\nfunction pickAction(rule: AgentRule): RuleFormValue['action'] | undefined {\n const singular = rule.action as Record<string, unknown> | undefined\n if (singular && typeof singular === 'object' && 'type' in singular) {\n return singular as RuleFormValue['action']\n }\n if (Array.isArray(rule.actions) && rule.actions.length > 0) {\n const first = rule.actions[0]\n if (first && typeof first === 'object' && 'type' in first) {\n return first as RuleFormValue['action']\n }\n }\n return undefined\n}\n","import { useState, type FormEvent, type ReactNode } from 'react'\nimport {\n CircleStackIcon,\n ServerStackIcon,\n CloudIcon,\n ClockIcon,\n ShareIcon,\n KeyIcon,\n MagnifyingGlassIcon,\n ArrowLeftIcon,\n CheckCircleIcon,\n XCircleIcon,\n} from '@heroicons/react/24/outline'\nimport {\n GlassModal,\n FormGrid,\n FormInput,\n FormSelect,\n Button,\n} from '@ui/index'\n\n/* ─── Dialect catalog ─── */\n\ntype DialectCategory = {\n id: string\n labelKey: string\n icon: React.ComponentType<{ className?: string }>\n gradient: string\n dialects: DialectOption[]\n}\n\ntype DialectOption = {\n value: string\n label: string\n defaultPort?: number\n /** 'standard' = host/port/db, 'connection-string' = single URL, 'cloud' = project/dataset/key */\n formType: 'standard' | 'connection-string' | 'cloud-bigquery' | 'cloud-snowflake' | 'cloud-key' | 'vector-key'\n}\n\nconst DIALECT_CATEGORIES: DialectCategory[] = [\n {\n id: 'relational',\n labelKey: 'categoryRelational',\n icon: CircleStackIcon,\n gradient: 'from-blue-500 to-indigo-600',\n dialects: [\n { value: 'postgres', label: 'PostgreSQL', defaultPort: 5432, formType: 'standard' },\n { value: 'mysql', label: 'MySQL', defaultPort: 3306, formType: 'standard' },\n { value: 'mariadb', label: 'MariaDB', defaultPort: 3306, formType: 'standard' },\n { value: 'mssql', label: 'SQL Server', defaultPort: 1433, formType: 'standard' },\n { value: 'oracle', label: 'Oracle', defaultPort: 1521, formType: 'standard' },\n { value: 'db2', label: 'IBM Db2', defaultPort: 50000, formType: 'standard' },\n { value: 'cockroachdb', label: 'CockroachDB', defaultPort: 26257, formType: 'standard' },\n { value: 'timescaledb', label: 'TimescaleDB', defaultPort: 5432, formType: 'standard' },\n { value: 'sqlite', label: 'SQLite', formType: 'connection-string' },\n { value: 'duckdb', label: 'DuckDB', formType: 'connection-string' },\n ],\n },\n {\n id: 'nosql',\n labelKey: 'categoryNoSql',\n icon: ServerStackIcon,\n gradient: 'from-emerald-500 to-teal-600',\n dialects: [\n { value: 'mongodb', label: 'MongoDB', defaultPort: 27017, formType: 'connection-string' },\n { value: 'cassandra', label: 'Cassandra', defaultPort: 9042, formType: 'standard' },\n { value: 'scylladb', label: 'ScyllaDB', defaultPort: 9042, formType: 'standard' },\n { value: 'dynamodb', label: 'DynamoDB', formType: 'cloud-key' },\n { value: 'cosmosdb', label: 'CosmosDB', formType: 'connection-string' },\n { value: 'arangodb', label: 'ArangoDB', defaultPort: 8529, formType: 'standard' },\n ],\n },\n {\n id: 'warehouse',\n labelKey: 'categoryWarehouse',\n icon: CloudIcon,\n gradient: 'from-purple-500 to-violet-600',\n dialects: [\n { value: 'bigquery', label: 'BigQuery', formType: 'cloud-bigquery' },\n { value: 'snowflake', label: 'Snowflake', formType: 'cloud-snowflake' },\n { value: 'clickhouse', label: 'ClickHouse', defaultPort: 8123, formType: 'standard' },\n ],\n },\n {\n id: 'timeseries',\n labelKey: 'categoryTimeSeries',\n icon: ClockIcon,\n gradient: 'from-sky-500 to-cyan-600',\n dialects: [\n { value: 'influxdb', label: 'InfluxDB', formType: 'cloud-key' },\n { value: 'timestream', label: 'Timestream', formType: 'cloud-key' },\n ],\n },\n {\n id: 'graph',\n labelKey: 'categoryGraph',\n icon: ShareIcon,\n gradient: 'from-pink-500 to-rose-600',\n dialects: [\n { value: 'neo4j', label: 'Neo4j', defaultPort: 7687, formType: 'standard' },\n { value: 'neptune', label: 'Neptune', formType: 'connection-string' },\n ],\n },\n {\n id: 'keyvalue',\n labelKey: 'categoryKeyValue',\n icon: KeyIcon,\n gradient: 'from-red-500 to-orange-600',\n dialects: [\n { value: 'redis', label: 'Redis', defaultPort: 6379, formType: 'standard' },\n ],\n },\n {\n id: 'search',\n labelKey: 'categorySearch',\n icon: MagnifyingGlassIcon,\n gradient: 'from-amber-500 to-yellow-600',\n dialects: [\n { value: 'elasticsearch', label: 'Elasticsearch', defaultPort: 9200, formType: 'standard' },\n { value: 'opensearch', label: 'OpenSearch', defaultPort: 9200, formType: 'standard' },\n { value: 'pinecone', label: 'Pinecone', formType: 'vector-key' },\n { value: 'qdrant', label: 'Qdrant', defaultPort: 6333, formType: 'standard' },\n { value: 'weaviate', label: 'Weaviate', defaultPort: 8080, formType: 'standard' },\n { value: 'milvus', label: 'Milvus', defaultPort: 19530, formType: 'standard' },\n { value: 'chromadb', label: 'ChromaDB', defaultPort: 8000, formType: 'standard' },\n ],\n },\n]\n\nfunction findDialect(value: string): DialectOption | undefined {\n for (const category of DIALECT_CATEGORIES) {\n const found = category.dialects.find((d) => d.value === value)\n if (found) return found\n }\n return undefined\n}\n\nfunction findCategory(dialectValue: string): DialectCategory | undefined {\n return DIALECT_CATEGORIES.find((c) => c.dialects.some((d) => d.value === dialectValue))\n}\n\n/* ─── Types ─── */\n\nexport type DatasourceFormData = {\n name: string\n dialect: string\n host?: string\n port?: number\n database?: string\n username?: string\n password?: string\n schema?: string\n ssl?: boolean\n readOnly?: boolean\n connectionString?: string\n projectId?: string\n dataset?: string\n keyFile?: string\n account?: string\n warehouse?: string\n region?: string\n bucket?: string\n token?: string\n apiKey?: string\n environment?: string\n index?: string\n url?: string\n /** Whitelist of tables the engine is allowed to query. Empty/undef =\n * allow every table the credential can see. */\n allowedTables?: string[]\n /** Columns the engine MUST NOT surface to workflows. Applied at the\n * driver layer — trying to SELECT a blocked column still fails. */\n blockedColumns?: string[]\n /** Max concurrent connections in the org's cached pool (default 5). */\n maxPoolSize?: number\n /** Query/connect timeout in ms (default 5000). */\n timeoutMs?: number\n}\n\ntype Labels = Record<string, string>\n\nexport type DatasourceFormModalProps = {\n open: boolean\n onClose: () => void\n labels: Labels\n onSave: (data: DatasourceFormData) => void\n}\n\n/* ─── Step 1: Category + dialect picker ─── */\n\nfunction DialectPicker({\n labels,\n onSelect,\n}: {\n labels: Labels\n onSelect: (dialect: string) => void\n}) {\n return (\n <div className=\"space-y-6\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{labels.stepSelectType}</p>\n {DIALECT_CATEGORIES.map((category) => (\n <div key={category.id}>\n <div className=\"mb-2 flex items-center gap-2\">\n <div className={`flex h-7 w-7 items-center justify-center rounded-lg bg-gradient-to-br ${category.gradient}`}>\n <category.icon className=\"h-4 w-4 text-white\" />\n </div>\n <span className=\"text-sm font-semibold text-gray-700 dark:text-gray-200\">\n {labels[category.labelKey] ?? category.id}\n </span>\n </div>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {category.dialects.map((dialect) => (\n <button\n key={dialect.value}\n type=\"button\"\n onClick={() => onSelect(dialect.value)}\n className=\"group flex items-center gap-2 rounded-xl border border-gray-200/60 bg-white/60 px-3 py-2.5 text-left text-sm font-medium text-gray-700 transition-all hover:border-amber-400/60 hover:bg-amber-50/50 hover:text-amber-700 active:scale-[0.97] dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:hover:border-amber-400/40 dark:hover:bg-amber-500/10 dark:hover:text-amber-300\"\n >\n <CircleStackIcon className=\"h-4 w-4 shrink-0 text-gray-400 transition-colors group-hover:text-amber-500 dark:text-gray-500\" />\n {dialect.label}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n )\n}\n\n/* ─── Step 2: Connection form ─── */\n\nfunction ConnectionForm({\n dialect,\n labels,\n onBack,\n onSubmit,\n}: {\n dialect: DialectOption\n labels: Labels\n onBack: () => void\n onSubmit: (data: DatasourceFormData) => void\n}) {\n const [testStatus, setTestStatus] = useState<'idle' | 'testing' | 'success' | 'failed'>('idle')\n const category = findCategory(dialect.value)\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault()\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const data: DatasourceFormData = {\n name: String(formData.get('name') ?? '').trim(),\n dialect: dialect.value,\n }\n\n // Collect all possible fields\n for (const key of ['host', 'database', 'username', 'password', 'schema', 'connectionString', 'projectId', 'dataset', 'keyFile', 'account', 'warehouse', 'region', 'bucket', 'token', 'apiKey', 'environment', 'index', 'url'] as const) {\n const val = String(formData.get(key) ?? '').trim()\n if (val) (data as Record<string, unknown>)[key] = val\n }\n\n const port = String(formData.get('port') ?? '').trim()\n if (port) data.port = Number(port)\n\n data.ssl = formData.get('ssl') === 'on'\n data.readOnly = formData.get('readOnly') === 'on'\n\n // Advanced — pool size, timeout, allowlist/blocklist\n const maxPoolSize = String(formData.get('maxPoolSize') ?? '').trim()\n if (maxPoolSize) {\n const parsed = Number(maxPoolSize)\n if (Number.isFinite(parsed) && parsed > 0) data.maxPoolSize = parsed\n }\n const timeoutMs = String(formData.get('timeoutMs') ?? '').trim()\n if (timeoutMs) {\n const parsed = Number(timeoutMs)\n if (Number.isFinite(parsed) && parsed > 0) data.timeoutMs = parsed\n }\n const allowedTables = splitList(String(formData.get('allowedTables') ?? ''))\n if (allowedTables.length > 0) data.allowedTables = allowedTables\n const blockedColumns = splitList(String(formData.get('blockedColumns') ?? ''))\n if (blockedColumns.length > 0) data.blockedColumns = blockedColumns\n\n onSubmit(data)\n }\n\n function handleTestConnection() {\n setTestStatus('testing')\n // Simulate test connection — real implementation would call API\n setTimeout(() => {\n setTestStatus('success')\n setTimeout(() => setTestStatus('idle'), 3000)\n }, 1500)\n }\n\n function renderFields(): ReactNode {\n switch (dialect.formType) {\n case 'standard':\n return (\n <>\n <FormInput name=\"host\" label={labels.fieldHost} placeholder={labels.fieldHostPlaceholder} required />\n <FormInput name=\"port\" label={labels.fieldPort} type=\"number\" defaultValue={dialect.defaultPort} />\n <FormInput name=\"database\" label={labels.fieldDatabase} placeholder={labels.fieldDatabasePlaceholder} required />\n <FormInput name=\"username\" label={labels.fieldUsername} placeholder={labels.fieldUsernamePlaceholder} />\n <FormInput name=\"password\" label={labels.fieldPassword} type=\"password\" placeholder={labels.fieldPasswordPlaceholder} />\n <FormInput name=\"schema\" label={labels.fieldSchema} placeholder={labels.fieldSchemaPlaceholder} />\n </>\n )\n\n case 'connection-string':\n return (\n <div className=\"col-span-full\">\n <FormInput name=\"connectionString\" label={labels.fieldConnectionString} placeholder={labels.fieldConnectionStringPlaceholder} required />\n </div>\n )\n\n case 'cloud-bigquery':\n return (\n <>\n <FormInput name=\"projectId\" label={labels.fieldProjectId} placeholder={labels.fieldProjectIdPlaceholder} required />\n <FormInput name=\"dataset\" label={labels.fieldDataset} placeholder={labels.fieldDatasetPlaceholder} required />\n <div className=\"col-span-full\">\n <FormInput name=\"keyFile\" label={labels.fieldKeyFile} placeholder={labels.fieldKeyFilePlaceholder} />\n </div>\n </>\n )\n\n case 'cloud-snowflake':\n return (\n <>\n <FormInput name=\"account\" label={labels.fieldAccount} placeholder={labels.fieldAccountPlaceholder} required />\n <FormInput name=\"warehouse\" label={labels.fieldWarehouse} placeholder={labels.fieldWarehousePlaceholder} required />\n <FormInput name=\"database\" label={labels.fieldDatabase} placeholder={labels.fieldDatabasePlaceholder} required />\n <FormInput name=\"username\" label={labels.fieldUsername} placeholder={labels.fieldUsernamePlaceholder} required />\n <FormInput name=\"password\" label={labels.fieldPassword} type=\"password\" placeholder={labels.fieldPasswordPlaceholder} />\n <FormInput name=\"schema\" label={labels.fieldSchema} placeholder={labels.fieldSchemaPlaceholder} />\n </>\n )\n\n case 'cloud-key':\n return (\n <>\n <FormInput name=\"region\" label={labels.fieldRegion} placeholder={labels.fieldRegionPlaceholder} required />\n <FormInput name=\"token\" label={labels.fieldToken} type=\"password\" placeholder={labels.fieldTokenPlaceholder} required />\n <FormInput name=\"bucket\" label={labels.fieldBucket} placeholder={labels.fieldBucketPlaceholder} />\n </>\n )\n\n case 'vector-key':\n return (\n <>\n <FormInput name=\"apiKey\" label={labels.fieldApiKey} type=\"password\" placeholder={labels.fieldApiKeyPlaceholder} required />\n <FormInput name=\"environment\" label={labels.fieldEnvironment} placeholder={labels.fieldEnvironmentPlaceholder} required />\n <FormInput name=\"index\" label={labels.fieldIndex} placeholder={labels.fieldIndexPlaceholder} />\n </>\n )\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* Back button + dialect badge */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-white/10 dark:hover:text-gray-300\"\n >\n <ArrowLeftIcon className=\"h-4 w-4\" />\n </button>\n <div className=\"flex items-center gap-2\">\n <div className={`flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br ${category?.gradient ?? 'from-gray-400 to-gray-500'}`}>\n {category ? <category.icon className=\"h-4 w-4 text-white\" /> : <CircleStackIcon className=\"h-4 w-4 text-white\" />}\n </div>\n <div>\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">{dialect.label}</span>\n <span className=\"ml-2 text-xs text-gray-400\">{labels[category?.labelKey ?? ''] ?? ''}</span>\n </div>\n </div>\n </div>\n\n {/* Name field — always present */}\n <FormInput name=\"name\" label={labels.fieldName} placeholder={labels.fieldNamePlaceholder} required />\n\n {/* Dynamic fields per dialect form type */}\n <FormGrid>\n {renderFields()}\n </FormGrid>\n\n {/* Toggles */}\n <div className=\"flex flex-wrap items-center gap-6 pt-2\">\n <label className=\"flex items-center gap-2 text-sm text-gray-700 dark:text-gray-300\">\n <input\n type=\"checkbox\"\n name=\"ssl\"\n defaultChecked\n className=\"h-4 w-4 rounded border-gray-300 text-amber-600 focus:ring-amber-500 dark:border-gray-600 dark:bg-gray-800\"\n />\n {labels.fieldSsl}\n </label>\n <label className=\"flex items-center gap-2 text-sm text-gray-700 dark:text-gray-300\">\n <input\n type=\"checkbox\"\n name=\"readOnly\"\n defaultChecked\n className=\"h-4 w-4 rounded border-gray-300 text-amber-600 focus:ring-amber-500 dark:border-gray-600 dark:bg-gray-800\"\n />\n {labels.fieldReadOnly}\n </label>\n </div>\n <p className=\"text-xs text-gray-400 dark:text-gray-500\">{labels.fieldReadOnlyHelp}</p>\n\n {/* Advanced — pool, timeout, table/column governance. Collapsed by\n default because the defaults (pool=5, timeout=5s, no allow/block)\n are correct for almost every datasource. Shown when an admin\n needs to lock down a specific table or raise the timeout for\n a slow analytic warehouse. */}\n <details className=\"rounded-xl border border-gray-200/60 bg-white/40 p-3 dark:border-white/10 dark:bg-white/5\">\n <summary className=\"cursor-pointer text-sm font-medium text-gray-700 dark:text-gray-300\">\n {labels.advancedToggle ?? 'Governance & performance'}\n </summary>\n <div className=\"mt-3 space-y-3\">\n <FormGrid>\n <FormInput\n name=\"maxPoolSize\"\n label={labels.fieldMaxPoolSize ?? 'Max pool size'}\n type=\"number\"\n min={1}\n max={100}\n placeholder=\"5\"\n />\n <FormInput\n name=\"timeoutMs\"\n label={labels.fieldTimeoutMs ?? 'Timeout (ms)'}\n type=\"number\"\n min={100}\n placeholder=\"5000\"\n />\n </FormGrid>\n <FormInput\n name=\"allowedTables\"\n label={labels.fieldAllowedTables ?? 'Allowed tables (comma-separated)'}\n placeholder=\"stations, current_prices, competitor_prices\"\n />\n <p className=\"text-xs text-gray-400 dark:text-gray-500\">\n {labels.fieldAllowedTablesHelp\n ?? 'Leave blank to allow every table the credential can see. Otherwise only the listed tables are queryable from workflows.'}\n </p>\n <FormInput\n name=\"blockedColumns\"\n label={labels.fieldBlockedColumns ?? 'Blocked columns (comma-separated)'}\n placeholder=\"customers.ssn, employees.salary\"\n />\n <p className=\"text-xs text-gray-400 dark:text-gray-500\">\n {labels.fieldBlockedColumnsHelp\n ?? 'Columns the driver must never surface, even if referenced by a workflow. Use table.column notation for specificity.'}\n </p>\n </div>\n </details>\n\n {/* Actions */}\n <div className=\"flex items-center gap-3 border-t border-gray-200/60 pt-5 dark:border-white/10\">\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"zinc\"\n onClick={handleTestConnection}\n disabled={testStatus === 'testing'}\n >\n {testStatus === 'testing' ? labels.testing : labels.testConnection}\n </Button>\n\n {testStatus === 'success' && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-400\">\n <CheckCircleIcon className=\"h-4 w-4\" />\n {labels.connectionSuccess}\n </span>\n )}\n {testStatus === 'failed' && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\n <XCircleIcon className=\"h-4 w-4\" />\n {labels.connectionFailed}\n </span>\n )}\n\n <div className=\"flex-1\" />\n\n <Button type=\"submit\" size=\"sm\" color=\"amber\">\n {labels.save}\n </Button>\n </div>\n </form>\n )\n}\n\n/* ─── Form Modal ─── */\n\nexport function DatasourceFormModal({ open, onClose, labels, onSave }: DatasourceFormModalProps) {\n const [selectedDialect, setSelectedDialect] = useState<string | null>(null)\n const dialect = selectedDialect ? findDialect(selectedDialect) : null\n\n function handleClose() {\n setSelectedDialect(null)\n onClose()\n }\n\n function handleSave(data: DatasourceFormData) {\n onSave(data)\n handleClose()\n }\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={labels.createTitle}\n subtitle={dialect ? labels.stepConfigure : labels.stepSelectType}\n icon={<CircleStackIcon className=\"h-5 w-5\" />}\n gradient=\"from-amber-500 to-orange-600\"\n maxWidth=\"3xl\"\n >\n {dialect ? (\n <ConnectionForm\n dialect={dialect}\n labels={labels}\n onBack={() => setSelectedDialect(null)}\n onSubmit={handleSave}\n />\n ) : (\n <DialectPicker labels={labels} onSelect={setSelectedDialect} />\n )}\n </GlassModal>\n )\n}\n\n/* ─── Modal (for /datasources page) ─── */\n\nexport type DatasourceModalProps = {\n open: boolean\n onClose: () => void\n labels: Labels\n onSave: (data: DatasourceFormData) => void\n}\n\nexport function DatasourceModal({ open, onClose, labels, onSave }: DatasourceModalProps) {\n const [selectedDialect, setSelectedDialect] = useState<string | null>(null)\n const dialect = selectedDialect ? findDialect(selectedDialect) : null\n\n function handleClose() {\n setSelectedDialect(null)\n onClose()\n }\n\n function handleSave(data: DatasourceFormData) {\n onSave(data)\n handleClose()\n }\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={labels.createTitle}\n subtitle={dialect ? labels.stepConfigure : labels.stepSelectType}\n icon={<CircleStackIcon className=\"h-5 w-5\" />}\n gradient=\"from-amber-500 to-orange-600\"\n maxWidth=\"3xl\"\n >\n {dialect ? (\n <ConnectionForm\n dialect={dialect}\n labels={labels}\n onBack={() => setSelectedDialect(null)}\n onSubmit={handleSave}\n />\n ) : (\n <DialectPicker labels={labels} onSelect={setSelectedDialect} />\n )}\n </GlassModal>\n )\n}\n\nexport { DIALECT_CATEGORIES, findDialect, findCategory }\n\nfunction splitList(raw: string): string[] {\n return raw\n .split(',')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n}\n","import { useState } from 'react'\nimport { CircleStackIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n CreateActionButton,\n EntityCard,\n HeroSection,\n PageEmptyState,\n Badge,\n} from '@ui/index'\nimport type { DataSource } from '@datatechsolutions/shared-domain/common'\nimport { DatasourceModal, DIALECT_CATEGORIES, findCategory, type DatasourceFormData } from './datasource-modal'\n\n/* ─── Sample data for the landing preview ─── */\n\nconst SAMPLE_DATASOURCES: DataSource[] = [\n {\n id: 'ds_bigquery_analytics',\n organizationId: 'org_demo',\n name: 'BigQuery Analytics',\n dialect: 'bigquery',\n credentials: null,\n readOnly: true,\n maxPoolSize: null,\n timeoutMs: 30000,\n allowedTables: null,\n blockedColumns: null,\n enabled: true,\n createdAt: '2026-03-20T10:00:00Z',\n updatedAt: '2026-03-20T10:00:00Z',\n slug: 'bigquery-analytics',\n },\n {\n id: 'ds_postgres_prod',\n organizationId: 'org_demo',\n name: 'Production PostgreSQL',\n dialect: 'postgres',\n credentials: null,\n readOnly: true,\n maxPoolSize: 10,\n timeoutMs: 15000,\n allowedTables: null,\n blockedColumns: null,\n enabled: true,\n createdAt: '2026-03-18T08:30:00Z',\n updatedAt: '2026-03-22T14:00:00Z',\n slug: 'production-postgresql',\n },\n {\n id: 'ds_snowflake_dw',\n organizationId: 'org_demo',\n name: 'Snowflake Data Warehouse',\n dialect: 'snowflake',\n credentials: null,\n readOnly: true,\n maxPoolSize: null,\n timeoutMs: 30000,\n allowedTables: null,\n blockedColumns: null,\n enabled: true,\n createdAt: '2026-03-15T09:00:00Z',\n updatedAt: '2026-03-21T11:00:00Z',\n slug: 'snowflake-data-warehouse',\n },\n {\n id: 'ds_mongodb_events',\n organizationId: 'org_demo',\n name: 'Event Store (MongoDB)',\n dialect: 'mongodb',\n credentials: null,\n readOnly: true,\n maxPoolSize: 5,\n timeoutMs: 10000,\n allowedTables: null,\n blockedColumns: null,\n enabled: false,\n createdAt: '2026-03-10T12:00:00Z',\n updatedAt: '2026-03-19T16:00:00Z',\n slug: 'event-store-mongodb',\n },\n {\n id: 'ds_redis_cache',\n organizationId: 'org_demo',\n name: 'Redis Cache Layer',\n dialect: 'redis',\n credentials: null,\n readOnly: false,\n maxPoolSize: 20,\n timeoutMs: 5000,\n allowedTables: null,\n blockedColumns: null,\n enabled: true,\n createdAt: '2026-03-12T07:00:00Z',\n updatedAt: '2026-03-23T09:00:00Z',\n slug: 'redis-cache-layer',\n },\n {\n id: 'ds_pinecone_vectors',\n organizationId: 'org_demo',\n name: 'Pinecone Embeddings',\n dialect: 'pinecone',\n credentials: null,\n readOnly: true,\n maxPoolSize: null,\n timeoutMs: 20000,\n allowedTables: null,\n blockedColumns: null,\n enabled: true,\n createdAt: '2026-03-22T15:00:00Z',\n updatedAt: '2026-03-25T10:00:00Z',\n slug: 'pinecone-embeddings',\n },\n]\n\n/* ─── Helpers ─── */\n\nfunction getDialectLabel(dialect: string | null): string {\n if (!dialect) return 'Unknown'\n for (const category of DIALECT_CATEGORIES) {\n const found = category.dialects.find((d) => d.value === dialect)\n if (found) return found.label\n }\n return dialect\n}\n\nfunction getDialectGradient(dialect: string | null): string {\n if (!dialect) return 'from-gray-400 to-gray-500'\n const category = findCategory(dialect)\n return category?.gradient ?? 'from-gray-400 to-gray-500'\n}\n\nfunction getDialectIcon(dialect: string | null) {\n if (!dialect) return CircleStackIcon\n const category = findCategory(dialect)\n return category?.icon ?? CircleStackIcon\n}\n\n// Map every supported dialect (and common aliases) to the brand SVG under\n// `/public/logos/datasources/`. When the dialect has an SVG the card shows\n// the real logo; when it does not we fall back to the gradient + Heroicon.\nconst DIALECT_LOGO: Record<string, string> = {\n bigquery: '/logos/datasources/bigquery.svg',\n postgres: '/logos/datasources/postgres.svg',\n postgresql: '/logos/datasources/postgres.svg',\n mysql: '/logos/datasources/mysql.svg',\n mariadb: '/logos/datasources/mariadb.svg',\n snowflake: '/logos/datasources/snowflake.svg',\n mongodb: '/logos/datasources/mongodb.svg',\n redis: '/logos/datasources/redis.svg',\n clickhouse: '/logos/datasources/clickhouse.svg',\n elasticsearch: '/logos/datasources/elasticsearch.svg',\n duckdb: '/logos/datasources/duckdb.svg',\n sqlite: '/logos/datasources/sqlite.svg',\n oracle: '/logos/datasources/oracle.svg',\n mssql: '/logos/datasources/mssql.svg',\n sqlserver: '/logos/datasources/mssql.svg',\n cassandra: '/logos/datasources/cassandra.svg',\n dynamodb: '/logos/datasources/dynamodb.svg',\n cockroach: '/logos/datasources/cockroachdb.svg',\n cockroachdb: '/logos/datasources/cockroachdb.svg',\n supabase: '/logos/datasources/supabase.svg',\n firebase: '/logos/datasources/firebase.svg',\n neo4j: '/logos/datasources/neo4j.svg',\n}\n\nfunction getDialectLogoSrc(dialect: string | null): string | null {\n if (!dialect) return null\n return DIALECT_LOGO[dialect.toLowerCase()] ?? null\n}\n\n/* ─── Props ─── */\n\ntype Labels = Record<string, string>\n\nexport type DatasourcesPageViewProps = {\n labels: Labels\n datasources?: DataSource[]\n useSampleData?: boolean\n onCreate?: (data: DatasourceFormData) => void\n}\n\n/* ─── Component ─── */\n\nexport function DatasourcesPageView({\n labels,\n datasources: externalDatasources,\n useSampleData = false,\n onCreate,\n}: DatasourcesPageViewProps) {\n const [modalOpen, setModalOpen] = useState(false)\n const [localDatasources, setLocalDatasources] = useState<DataSource[]>(\n useSampleData ? SAMPLE_DATASOURCES : []\n )\n\n const datasources = externalDatasources ?? localDatasources\n const isEmpty = datasources.length === 0\n\n function handleCreate(data: DatasourceFormData) {\n if (onCreate) {\n onCreate(data)\n return\n }\n // Local state fallback (for sample/demo mode)\n const newDs: DataSource = {\n id: `ds_${Date.now()}`,\n organizationId: 'org_demo',\n name: data.name,\n dialect: data.dialect,\n credentials: null,\n readOnly: data.readOnly ?? true,\n maxPoolSize: null,\n timeoutMs: 30000,\n allowedTables: null,\n blockedColumns: null,\n enabled: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n slug: data.name.toLowerCase().replace(/\\s+/g, '-'),\n }\n setLocalDatasources((previous) => [...previous, newDs])\n }\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<CircleStackIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-amber-500 to-orange-600\"\n toolbar={\n <CreateActionButton\n mode=\"desktop\"\n label={labels.addDatasource}\n onClick={() => setModalOpen(true)}\n accent=\"amber\"\n />\n }\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.addDatasource}\n onClick={() => setModalOpen(true)}\n accent=\"amber\"\n />\n\n {isEmpty ? (\n <PageEmptyState\n title={labels.emptyTitle}\n message={labels.emptyDescription}\n iconName=\"link\"\n customIcon={<CircleStackIcon className=\"h-10 w-10 text-amber-500 dark:text-amber-400\" />}\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {datasources.map((ds) => {\n const Icon = getDialectIcon(ds.dialect)\n const gradient = getDialectGradient(ds.dialect)\n const dialectLabel = getDialectLabel(ds.dialect)\n const logoSrc = getDialectLogoSrc(ds.dialect)\n\n // Prefer the brand SVG (`/logos/datasources/{dialect}.svg`) —\n // matches the node-palette chips inside the canvas. Fall back\n // to the gradient-boxed Heroicon when the dialect has no SVG\n // so a new/custom dialect still renders a card.\n const iconElement = logoSrc ? (\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-white shadow-sm ring-1 ring-black/5 dark:bg-white/10 dark:ring-white/10\">\n <img src={logoSrc} alt={dialectLabel} className=\"h-7 w-7 object-contain\" />\n </div>\n ) : (\n <div className={`flex h-11 w-11 items-center justify-center rounded-lg bg-gradient-to-br ${gradient} shadow-lg`}>\n <Icon className=\"h-6 w-6 text-white\" />\n </div>\n )\n\n return (\n <EntityCard\n key={ds.id}\n accentGradient={gradient}\n icon={iconElement}\n title={ds.name ?? ds.id}\n subtitle={dialectLabel}\n status={\n <Badge color={ds.enabled ? 'emerald' : 'zinc'}>\n {ds.enabled ? labels.enabled : labels.disabled}\n </Badge>\n }\n footer={\n <div className=\"flex items-center gap-2 text-xs text-gray-400 dark:text-gray-500\">\n {ds.readOnly && (\n <span className=\"rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-semibold text-blue-700 dark:bg-blue-900/30 dark:text-blue-300\">\n Read-only\n </span>\n )}\n {ds.timeoutMs && (\n <span>{ds.timeoutMs / 1000}s timeout</span>\n )}\n </div>\n }\n >\n <div className=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">\n <div>{labels.dialect}: {dialectLabel}</div>\n {ds.slug && <div className=\"truncate text-gray-400\">/{ds.slug}</div>}\n </div>\n </EntityCard>\n )\n })}\n </div>\n )}\n\n <DatasourceModal\n open={modalOpen}\n onClose={() => setModalOpen(false)}\n labels={labels}\n onSave={handleCreate}\n />\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AuthUser } from '@datatechsolutions/windsock/client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generic role-based access factory shared across platform apps (astrlabe,
|
|
5
|
+
* kori-erp, etc). Each app instantiates this with its own role + permission
|
|
6
|
+
* unions and seed-claim mapping. The factory closes over the config and
|
|
7
|
+
* exports `ROLE_DEFINITIONS`, `MODULE_PERMISSIONS`, `normalizePlatformRole`,
|
|
8
|
+
* and `can()` — the same surface the per-app file used to expose.
|
|
9
|
+
*
|
|
10
|
+
* The factory deliberately does not hardcode any specific role enum here —
|
|
11
|
+
* astrlabe, kori-erp, and future apps each pick their own union (admin,
|
|
12
|
+
* manager, analyst, viewer, …) and pass the role definitions in.
|
|
13
|
+
*/
|
|
14
|
+
type PlatformRoleDefinition<TRole extends string> = {
|
|
15
|
+
id: TRole;
|
|
16
|
+
label: string;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
type CreatePlatformRbacOptions<TRole extends string, TPermission extends string> = {
|
|
20
|
+
/** Definitions for every role the app supports (id/label/description). */
|
|
21
|
+
roles: Record<TRole, PlatformRoleDefinition<TRole>>;
|
|
22
|
+
/**
|
|
23
|
+
* Maps each app-level permission to one or more JWT permission claim
|
|
24
|
+
* strings. `can()` returns true when ANY of the listed claims (using
|
|
25
|
+
* wildcard matching) is present in the user's JWT permissions.
|
|
26
|
+
*/
|
|
27
|
+
permissionClaimsMap: Record<TPermission, readonly string[]>;
|
|
28
|
+
/** Optional map from navigation/module IDs to required permissions. */
|
|
29
|
+
modulePermissions?: Record<string, TPermission>;
|
|
30
|
+
/** Role to fall back to when an unknown role string comes in. */
|
|
31
|
+
defaultRole?: TRole;
|
|
32
|
+
};
|
|
33
|
+
type PlatformRbac<TRole extends string, TPermission extends string> = {
|
|
34
|
+
ROLE_DEFINITIONS: Record<TRole, PlatformRoleDefinition<TRole>>;
|
|
35
|
+
MODULE_PERMISSIONS: Record<string, TPermission>;
|
|
36
|
+
normalizePlatformRole: (input: unknown) => TRole;
|
|
37
|
+
can: (user: AuthUser | null, permission: TPermission) => boolean;
|
|
38
|
+
};
|
|
39
|
+
declare function createPlatformRbac<TRole extends string, TPermission extends string>(opts: CreatePlatformRbacOptions<TRole, TPermission>): PlatformRbac<TRole, TPermission>;
|
|
40
|
+
|
|
41
|
+
export { type CreatePlatformRbacOptions, type PlatformRbac, type PlatformRoleDefinition, createPlatformRbac };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AuthUser } from '@datatechsolutions/windsock/client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generic role-based access factory shared across platform apps (astrlabe,
|
|
5
|
+
* kori-erp, etc). Each app instantiates this with its own role + permission
|
|
6
|
+
* unions and seed-claim mapping. The factory closes over the config and
|
|
7
|
+
* exports `ROLE_DEFINITIONS`, `MODULE_PERMISSIONS`, `normalizePlatformRole`,
|
|
8
|
+
* and `can()` — the same surface the per-app file used to expose.
|
|
9
|
+
*
|
|
10
|
+
* The factory deliberately does not hardcode any specific role enum here —
|
|
11
|
+
* astrlabe, kori-erp, and future apps each pick their own union (admin,
|
|
12
|
+
* manager, analyst, viewer, …) and pass the role definitions in.
|
|
13
|
+
*/
|
|
14
|
+
type PlatformRoleDefinition<TRole extends string> = {
|
|
15
|
+
id: TRole;
|
|
16
|
+
label: string;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
type CreatePlatformRbacOptions<TRole extends string, TPermission extends string> = {
|
|
20
|
+
/** Definitions for every role the app supports (id/label/description). */
|
|
21
|
+
roles: Record<TRole, PlatformRoleDefinition<TRole>>;
|
|
22
|
+
/**
|
|
23
|
+
* Maps each app-level permission to one or more JWT permission claim
|
|
24
|
+
* strings. `can()` returns true when ANY of the listed claims (using
|
|
25
|
+
* wildcard matching) is present in the user's JWT permissions.
|
|
26
|
+
*/
|
|
27
|
+
permissionClaimsMap: Record<TPermission, readonly string[]>;
|
|
28
|
+
/** Optional map from navigation/module IDs to required permissions. */
|
|
29
|
+
modulePermissions?: Record<string, TPermission>;
|
|
30
|
+
/** Role to fall back to when an unknown role string comes in. */
|
|
31
|
+
defaultRole?: TRole;
|
|
32
|
+
};
|
|
33
|
+
type PlatformRbac<TRole extends string, TPermission extends string> = {
|
|
34
|
+
ROLE_DEFINITIONS: Record<TRole, PlatformRoleDefinition<TRole>>;
|
|
35
|
+
MODULE_PERMISSIONS: Record<string, TPermission>;
|
|
36
|
+
normalizePlatformRole: (input: unknown) => TRole;
|
|
37
|
+
can: (user: AuthUser | null, permission: TPermission) => boolean;
|
|
38
|
+
};
|
|
39
|
+
declare function createPlatformRbac<TRole extends string, TPermission extends string>(opts: CreatePlatformRbacOptions<TRole, TPermission>): PlatformRbac<TRole, TPermission>;
|
|
40
|
+
|
|
41
|
+
export { type CreatePlatformRbacOptions, type PlatformRbac, type PlatformRoleDefinition, createPlatformRbac };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkHZ4LOVHM_js = require('../chunk-HZ4LOVHM.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "createPlatformRbac", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkHZ4LOVHM_js.createPlatformRbac; }
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=rbac.js.map
|
|
13
|
+
//# sourceMappingURL=rbac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"rbac.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"rbac.mjs"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { WorkflowGraph } from '@datatechsolutions/shared-domain/ports/workflow';
|
|
2
|
+
import { WorkflowGraph as WorkflowGraph$1 } from '../../astrlabe/contracts.mjs';
|
|
3
|
+
|
|
4
|
+
/** Formats a millisecond count as a short, human-readable duration string. */
|
|
5
|
+
declare function formatDurationMs(ms: number | null | undefined): string;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Parses a JSON string into a typed value, returning undefined (not throwing)
|
|
9
|
+
* on empty input or malformed JSON. Used by form builders where the user types
|
|
10
|
+
* JSON into a textarea and we want to surface a friendly "couldn't parse" state
|
|
11
|
+
* rather than crashing the submit handler.
|
|
12
|
+
*/
|
|
13
|
+
declare function tryParseJson<T = unknown>(value: FormDataEntryValue | string | null | undefined): T | undefined;
|
|
14
|
+
/** Parses JSON into an object record. Returns undefined if the result is not a plain object. */
|
|
15
|
+
declare function tryParseJsonObject(value: FormDataEntryValue | string | null | undefined): Record<string, unknown> | undefined;
|
|
16
|
+
/** Parses JSON into an array of records. Returns undefined if not a plain array. */
|
|
17
|
+
declare function tryParseJsonArray(value: FormDataEntryValue | string | null | undefined): Array<Record<string, unknown>> | undefined;
|
|
18
|
+
|
|
19
|
+
type ToolCategory = 'search' | 'code' | 'file' | 'web' | 'math' | 'custom';
|
|
20
|
+
declare const TOOL_CATEGORY_VALUES: readonly ToolCategory[];
|
|
21
|
+
/** Narrows a form value to a ToolCategory, returning undefined if not one of the known values. */
|
|
22
|
+
declare function parseToolCategory(value: FormDataEntryValue | null | undefined): ToolCategory | undefined;
|
|
23
|
+
|
|
24
|
+
declare function adaptWorkflowGraphToUi(graph: WorkflowGraph): WorkflowGraph$1;
|
|
25
|
+
|
|
26
|
+
declare function getLambdaApiBase(): string;
|
|
27
|
+
declare function buildLambdaApiUrl(path: string): string;
|
|
28
|
+
|
|
29
|
+
declare function getAuthAppUrl(): string;
|
|
30
|
+
declare function buildHostedAuthUrl(path: string, search?: string): string;
|
|
31
|
+
|
|
32
|
+
export { TOOL_CATEGORY_VALUES, type ToolCategory, adaptWorkflowGraphToUi, buildHostedAuthUrl, buildLambdaApiUrl, formatDurationMs, getAuthAppUrl, getLambdaApiBase, parseToolCategory, tryParseJson, tryParseJsonArray, tryParseJsonObject };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { WorkflowGraph } from '@datatechsolutions/shared-domain/ports/workflow';
|
|
2
|
+
import { WorkflowGraph as WorkflowGraph$1 } from '../../astrlabe/contracts.js';
|
|
3
|
+
|
|
4
|
+
/** Formats a millisecond count as a short, human-readable duration string. */
|
|
5
|
+
declare function formatDurationMs(ms: number | null | undefined): string;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Parses a JSON string into a typed value, returning undefined (not throwing)
|
|
9
|
+
* on empty input or malformed JSON. Used by form builders where the user types
|
|
10
|
+
* JSON into a textarea and we want to surface a friendly "couldn't parse" state
|
|
11
|
+
* rather than crashing the submit handler.
|
|
12
|
+
*/
|
|
13
|
+
declare function tryParseJson<T = unknown>(value: FormDataEntryValue | string | null | undefined): T | undefined;
|
|
14
|
+
/** Parses JSON into an object record. Returns undefined if the result is not a plain object. */
|
|
15
|
+
declare function tryParseJsonObject(value: FormDataEntryValue | string | null | undefined): Record<string, unknown> | undefined;
|
|
16
|
+
/** Parses JSON into an array of records. Returns undefined if not a plain array. */
|
|
17
|
+
declare function tryParseJsonArray(value: FormDataEntryValue | string | null | undefined): Array<Record<string, unknown>> | undefined;
|
|
18
|
+
|
|
19
|
+
type ToolCategory = 'search' | 'code' | 'file' | 'web' | 'math' | 'custom';
|
|
20
|
+
declare const TOOL_CATEGORY_VALUES: readonly ToolCategory[];
|
|
21
|
+
/** Narrows a form value to a ToolCategory, returning undefined if not one of the known values. */
|
|
22
|
+
declare function parseToolCategory(value: FormDataEntryValue | null | undefined): ToolCategory | undefined;
|
|
23
|
+
|
|
24
|
+
declare function adaptWorkflowGraphToUi(graph: WorkflowGraph): WorkflowGraph$1;
|
|
25
|
+
|
|
26
|
+
declare function getLambdaApiBase(): string;
|
|
27
|
+
declare function buildLambdaApiUrl(path: string): string;
|
|
28
|
+
|
|
29
|
+
declare function getAuthAppUrl(): string;
|
|
30
|
+
declare function buildHostedAuthUrl(path: string, search?: string): string;
|
|
31
|
+
|
|
32
|
+
export { TOOL_CATEGORY_VALUES, type ToolCategory, adaptWorkflowGraphToUi, buildHostedAuthUrl, buildLambdaApiUrl, formatDurationMs, getAuthAppUrl, getLambdaApiBase, parseToolCategory, tryParseJson, tryParseJsonArray, tryParseJsonObject };
|