@flexkit/studio 0.2.35 → 0.2.36
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/{activity-nav-button-ZHQOZBCC.js → activity-nav-button-KOOMUTOW.js} +2 -2
- package/dist/{activity-nav-button-ZHQOZBCC.js.map → activity-nav-button-KOOMUTOW.js.map} +1 -1
- package/dist/chat-page-NDVHLH5Q.js +4 -0
- package/dist/chat-page-NDVHLH5Q.js.map +1 -0
- package/dist/{chunk-XYE6ZAUB.js → chunk-27JTWTU6.js} +2 -2
- package/dist/{chunk-XYE6ZAUB.js.map → chunk-27JTWTU6.js.map} +1 -1
- package/dist/{chunk-PZWEC6KD.js → chunk-2PBDHGRR.js} +2 -2
- package/dist/{chunk-PZWEC6KD.js.map → chunk-2PBDHGRR.js.map} +1 -1
- package/dist/{chunk-ZRTWLY77.js → chunk-474MQNDK.js} +3 -3
- package/dist/{chunk-ZRTWLY77.js.map → chunk-474MQNDK.js.map} +1 -1
- package/dist/{chunk-RFKMFD2O.js → chunk-CGMKGENV.js} +2 -2
- package/dist/{chunk-RFKMFD2O.js.map → chunk-CGMKGENV.js.map} +1 -1
- package/dist/{chunk-DEG7QP5C.js → chunk-FF5EBXYN.js} +3 -3
- package/dist/{chunk-DEG7QP5C.js.map → chunk-FF5EBXYN.js.map} +1 -1
- package/dist/{chunk-KEGJNZLW.js → chunk-FJS4SN3K.js} +3 -3
- package/dist/{chunk-KEGJNZLW.js.map → chunk-FJS4SN3K.js.map} +1 -1
- package/dist/{chunk-W7JDZHCV.js → chunk-FXUD4JRG.js} +2 -2
- package/dist/{chunk-W7JDZHCV.js.map → chunk-FXUD4JRG.js.map} +1 -1
- package/dist/{chunk-PWGLA33F.js → chunk-GTR4M2BQ.js} +3 -3
- package/dist/{chunk-PWGLA33F.js.map → chunk-GTR4M2BQ.js.map} +1 -1
- package/dist/{chunk-J6EGNRRT.js → chunk-HXPETSXC.js} +3 -3
- package/dist/{chunk-J6EGNRRT.js.map → chunk-HXPETSXC.js.map} +1 -1
- package/dist/{chunk-WU2KCXBC.js → chunk-L5Z56DDM.js} +2 -2
- package/dist/{chunk-WU2KCXBC.js.map → chunk-L5Z56DDM.js.map} +1 -1
- package/dist/{chunk-RAUQCO6W.js → chunk-LTM3MW2D.js} +2 -2
- package/dist/{chunk-RAUQCO6W.js.map → chunk-LTM3MW2D.js.map} +1 -1
- package/dist/{chunk-36DLIVZF.js → chunk-LVKBKU6Q.js} +2 -2
- package/dist/{chunk-36DLIVZF.js.map → chunk-LVKBKU6Q.js.map} +1 -1
- package/dist/{chunk-PMLDA2FF.js → chunk-LXLEUEWT.js} +2 -2
- package/dist/{chunk-PMLDA2FF.js.map → chunk-LXLEUEWT.js.map} +1 -1
- package/dist/{chunk-BTH7HU5Y.js → chunk-MHEFVYKP.js} +2 -2
- package/dist/{chunk-BTH7HU5Y.js.map → chunk-MHEFVYKP.js.map} +1 -1
- package/dist/{chunk-Q4CWQHBJ.js → chunk-NKDQQHCL.js} +2 -2
- package/dist/{chunk-Q4CWQHBJ.js.map → chunk-NKDQQHCL.js.map} +1 -1
- package/dist/{chunk-ZMONKGWJ.js → chunk-OJ4RI6IQ.js} +3 -3
- package/dist/{chunk-ZMONKGWJ.js.map → chunk-OJ4RI6IQ.js.map} +1 -1
- package/dist/chunk-PLCI2RJA.js +3 -0
- package/dist/chunk-PLCI2RJA.js.map +1 -0
- package/dist/{chunk-R6DPAMLC.js → chunk-SOA2F7Z6.js} +3 -3
- package/dist/{chunk-R6DPAMLC.js.map → chunk-SOA2F7Z6.js.map} +1 -1
- package/dist/{chunk-TI3EHLRE.js → chunk-TWA6OG5U.js} +3 -3
- package/dist/{chunk-TI3EHLRE.js.map → chunk-TWA6OG5U.js.map} +1 -1
- package/dist/{chunk-7N3LTSVX.js → chunk-VIBGMCLS.js} +2 -2
- package/dist/{chunk-7N3LTSVX.js.map → chunk-VIBGMCLS.js.map} +1 -1
- package/dist/{chunk-FJRDLP7V.js → chunk-YJ4NWJCC.js} +4 -4
- package/dist/{chunk-FJRDLP7V.js.map → chunk-YJ4NWJCC.js.map} +1 -1
- package/dist/{entry-NQRN7SWV.js → entry-XHH3NKN2.js} +2 -2
- package/dist/{entry-NQRN7SWV.js.map → entry-XHH3NKN2.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/{list-RPIG75US.js → list-R64THLZD.js} +2 -2
- package/dist/{list-RPIG75US.js.map → list-R64THLZD.js.map} +1 -1
- package/dist/{list-7SCWJXUE.js → list-XIE55HYD.js} +3 -3
- package/dist/{list-7SCWJXUE.js.map → list-XIE55HYD.js.map} +1 -1
- package/dist/{pages-KXERA5Z6.js → pages-OWXBU64L.js} +3 -3
- package/dist/{pages-KXERA5Z6.js.map → pages-OWXBU64L.js.map} +1 -1
- package/dist/{plugin-pages-NXA4BT7Y.js → plugin-pages-JBJQHBIN.js} +2 -2
- package/dist/{plugin-pages-NXA4BT7Y.js.map → plugin-pages-JBJQHBIN.js.map} +1 -1
- package/dist/{project-selector-SA6UUVBK.js → project-selector-L2WZ3MB5.js} +2 -2
- package/dist/{project-selector-SA6UUVBK.js.map → project-selector-L2WZ3MB5.js.map} +1 -1
- package/dist/record-links-BEKOPDDR.js +2 -0
- package/dist/{record-links-RTMCYEPM.js.map → record-links-BEKOPDDR.js.map} +1 -1
- package/dist/{root-MBFQXX4E.js → root-B5XP6VYU.js} +2 -2
- package/dist/{root-MBFQXX4E.js.map → root-B5XP6VYU.js.map} +1 -1
- package/dist/{root-TZIXWEZO.js → root-DUQULYRX.js} +2 -2
- package/dist/{root-TZIXWEZO.js.map → root-DUQULYRX.js.map} +1 -1
- package/dist/{root-6H6K3YQF.js → root-I22KNOFC.js} +3 -3
- package/dist/{root-6H6K3YQF.js.map → root-I22KNOFC.js.map} +1 -1
- package/dist/{root-W5ZPSNQ2.js → root-O4DMQLEH.js} +2 -2
- package/dist/{root-W5ZPSNQ2.js.map → root-O4DMQLEH.js.map} +1 -1
- package/dist/{root-IBZPU2D4.js → root-RUOT5OSO.js} +3 -3
- package/dist/{root-IBZPU2D4.js.map → root-RUOT5OSO.js.map} +1 -1
- package/dist/{root-TSZ3CSJU.js → root-VLD6GNZL.js} +3 -3
- package/dist/{root-TSZ3CSJU.js.map → root-VLD6GNZL.js.map} +1 -1
- package/dist/{search-ZLEYFT3T.js → search-4UQR6ENH.js} +2 -2
- package/dist/{search-ZLEYFT3T.js.map → search-4UQR6ENH.js.map} +1 -1
- package/dist/{skills-pages-RPMWIBLS.js → skills-pages-VUIOUEYQ.js} +2 -2
- package/dist/{skills-pages-RPMWIBLS.js.map → skills-pages-VUIOUEYQ.js.map} +1 -1
- package/dist/{source-VYWE5EB5.js → source-L54C4T3X.js} +2 -2
- package/dist/{source-VYWE5EB5.js.map → source-L54C4T3X.js.map} +1 -1
- package/package.json +3 -3
- package/dist/chat-page-IR4RF46H.js +0 -4
- package/dist/chat-page-IR4RF46H.js.map +0 -1
- package/dist/chunk-U6VZY3V2.js +0 -3
- package/dist/chunk-U6VZY3V2.js.map +0 -1
- package/dist/record-links-RTMCYEPM.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/components/project-label.ts","../src/core/config/create-project.ts","../src/core/config/use-hosted-session.ts","../src/ui/components/new-project-flow.tsx"],"names":["getProjectLabel","projectId","projects","projectSummaries","project","groupProjectIdsByTeam","projectIds","teams","id","summary","key","group","FALLBACK_MESSAGE","createHostedProject","input","outcome","send","userApiPaths","ownedTeams","team","newProjectPath","SESSION_KEY","fetchMe","response","error","toHostedSession","useHostedSession","data","useSWR","withCreatedProject","created","rememberCreatedProject","mutate","current","withDisplayName","displayName","rememberDisplayName","NewProjectFlow","askForName","isFirstProject","onCancel","onCreated","navigate","useNavigate","ids","useId","owned","step","setStep","useState","setDisplayName","name","setName","pickedTeamId","setPickedTeamId","selectedTeamId","startKind","setStartKind","sampleData","setSampleData","description","setDescription","setError","isSubmitting","setIsSubmitting","setCreated","submitName","trimmed","saveDisplayName","submitProjectName","invalid","validateProjectName","createProject","start","toProjectStart","state","applied","applyStarter","watchStarter","describeBusinessPrompt","path","errorAlert","jsx","Alert","AlertDescription","jsxs","StepForm","Label","Input","event","StepActions","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","StartOption","ShoppingBag","Switch","MessageSquareText","Textarea","Sparkles","children","onSubmit","onBack","submitLabel","secondary","Button","Loader2","checked","disabled","Icon","onSelect","recommended","title","cn"],"mappings":"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","file":"chunk-PMLDA2FF.js","sourcesContent":["import type { ProjectSummary, ProjectUiConfig } from '../../core/config/types';\n\n/** Name of a project: the listed name, else the deployed schema title, else the id. */\nexport function getProjectLabel(\n projectId: string,\n projects: ProjectUiConfig[],\n projectSummaries: ProjectSummary[] = []\n): string {\n return (\n projectSummaries.find((project) => project.id === projectId)?.name ??\n projects.find((project) => project.projectId === projectId)?.title ??\n projectId\n );\n}\n\n/** Groups ids by team when the summaries span more than one team; otherwise a single unnamed group. */\nexport function groupProjectIdsByTeam(\n projectIds: string[],\n projectSummaries: ProjectSummary[]\n): { label: string | null; projectIds: string[] }[] {\n const teams = new Map<string, { label: string; projectIds: string[] }>();\n\n for (const id of projectIds) {\n const summary = projectSummaries.find((project) => project.id === id);\n const key = summary?.team.id ?? '';\n const group = teams.get(key) ?? { label: summary?.team.name ?? '', projectIds: [] };\n group.projectIds.push(id);\n teams.set(key, group);\n }\n\n if (teams.size <= 1) {\n return [{ label: null, projectIds }];\n }\n\n return [...teams.values()].map((group) => ({ label: group.label || null, projectIds: group.projectIds }));\n}\n","import { userApiPaths } from '../api-paths';\nimport { send } from './onboarding';\nimport type { HostedTeam } from './types';\n\n/** What `POST /api/me/projects` answers: the new project and the team it went to (possibly a new personal team). */\nexport type CreatedProject = { project: { id: string; name: string }; team: { id: string; name: string } };\n\nexport type CreateProjectOutcome = ({ ok: true } & CreatedProject) | { ok: false; code: string; message: string };\n\nconst FALLBACK_MESSAGE = 'Could not create the project. Please try again.';\n\n/** Hosted mode: creates a project for the signed-in user (Free plan, user as owner). */\nexport async function createHostedProject(input: { name: string; teamId?: string }): Promise<CreateProjectOutcome> {\n const outcome = await send<Partial<CreatedProject>>(userApiPaths.myProjects, 'POST', input, FALLBACK_MESSAGE);\n\n if (!outcome.ok) {\n return outcome;\n }\n\n if (!outcome.project?.id || !outcome.team?.id) {\n return { ok: false, code: 'unknown_error', message: FALLBACK_MESSAGE };\n }\n\n return { ok: true, project: outcome.project, team: outcome.team };\n}\n\n/** Teams the user may create projects in, in the order `/api/me` lists them (oldest first). */\nexport function ownedTeams(teams: HostedTeam[]): HostedTeam[] {\n return teams.filter((team) => team.role === 'owner');\n}\n\n/**\n * Where a new project opens: the AI chat, which can design its schema. The\n * chat route itself, not `/ai`: that redirect would drop the navigation state\n * carrying the onboarding prompt.\n */\nexport function newProjectPath(projectId: string): string {\n return `/${projectId}/ai/agent`;\n}\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { userApiPaths } from '../api-paths';\nimport type { CreatedProject } from './create-project';\nimport type { HostedTeam, HostedUser, ProjectSummary } from './types';\n\nexport type HostedSession =\n | { status: 'loading' }\n | { status: 'anonymous' }\n | { status: 'error'; message: string }\n | { status: 'ready'; user: HostedUser; projects: ProjectSummary[]; teams: HostedTeam[] };\n\n/** `teams` is missing from backends older than Studio onboarding. */\ntype MeResponse = { projects: ProjectSummary[]; teams?: HostedTeam[]; user: HostedUser };\n\nconst SESSION_KEY = 'hosted-session';\nexport type MeOutcome =\n | { kind: 'anonymous' }\n | { kind: 'error'; message: string }\n | { kind: 'ready'; data: MeResponse };\n\nasync function fetchMe(): Promise<MeOutcome> {\n try {\n const response = await fetch(userApiPaths.me, { credentials: 'same-origin' });\n\n if (response.status === 401) {\n return { kind: 'anonymous' };\n }\n\n if (!response.ok) {\n return { kind: 'error', message: `Flexkit answered ${String(response.status)} while loading your projects.` };\n }\n\n return { kind: 'ready', data: (await response.json()) as MeResponse };\n } catch (error) {\n return { kind: 'error', message: error instanceof Error ? error.message : 'Flexkit is not reachable.' };\n }\n}\n\nexport function toHostedSession(outcome: MeOutcome | undefined): HostedSession {\n if (!outcome) {\n return { status: 'loading' };\n }\n\n if (outcome.kind === 'anonymous') {\n return { status: 'anonymous' };\n }\n\n if (outcome.kind === 'error') {\n return { status: 'error', message: outcome.message };\n }\n\n return {\n status: 'ready',\n projects: outcome.data.projects,\n teams: outcome.data.teams ?? [],\n user: outcome.data.user,\n };\n}\n\n/**\n * Hosted mode: who is signed in and which projects they can open. Fetched once\n * per page load; `rememberCreatedProject` adds a project the user just created.\n */\nexport function useHostedSession(): HostedSession {\n const { data } = useSWR(SESSION_KEY, fetchMe, {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n shouldRetryOnError: false,\n });\n\n return toHostedSession(data);\n}\n\n/** The session with a just-created project (and its team, if new) added; the user owns both. */\nexport function withCreatedProject(outcome: MeOutcome | undefined, created: CreatedProject): MeOutcome | undefined {\n if (outcome?.kind !== 'ready' || outcome.data.projects.some((project) => project.id === created.project.id)) {\n return outcome;\n }\n\n const teams = outcome.data.teams ?? [];\n const project: ProjectSummary = {\n avatarUrl: null,\n id: created.project.id,\n name: created.project.name,\n readOnly: false,\n role: 'owner',\n suspended: false,\n team: created.team,\n };\n\n return {\n kind: 'ready',\n data: {\n ...outcome.data,\n projects: [...outcome.data.projects, project],\n teams: teams.some((team) => team.id === created.team.id) ? teams : [...teams, { ...created.team, role: 'owner' }],\n },\n };\n}\n\n/**\n * Adds a project the user just created to the session, so the Studio can open\n * it at once. No `/api/me` round trip: the create response says everything the\n * session needs, and a failed re-read must not hide a project that exists.\n */\nexport async function rememberCreatedProject(created: CreatedProject): Promise<void> {\n await mutate<MeOutcome>(SESSION_KEY, (current) => withCreatedProject(current, created), { revalidate: false });\n}\n\n/** The session with the signed-in user's new display name. */\nexport function withDisplayName(outcome: MeOutcome | undefined, displayName: string): MeOutcome | undefined {\n if (outcome?.kind !== 'ready') {\n return outcome;\n }\n\n return { kind: 'ready', data: { ...outcome.data, user: { ...outcome.data.user, displayName } } };\n}\n\n/** Shows a display name the user just saved, without re-reading `/api/me`. */\nexport async function rememberDisplayName(displayName: string): Promise<void> {\n await mutate<MeOutcome>(SESSION_KEY, (current) => withDisplayName(current, displayName), { revalidate: false });\n}\n","import { useId, useState, type JSX, type ReactNode } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Loader2, MessageSquareText, ShoppingBag, Sparkles, type LucideIcon } from 'lucide-react';\nimport { watchStarter } from '../../apps/ai/starter-watch';\nimport {\n createHostedProject,\n newProjectPath,\n ownedTeams,\n type CreateProjectOutcome,\n} from '../../core/config/create-project';\nimport {\n applyStarter,\n describeBusinessPrompt,\n saveDisplayName,\n toProjectStart,\n validateProjectName,\n type OnboardingNavigationState,\n type ProjectStart,\n} from '../../core/config/onboarding';\nimport type { HostedTeam } from '../../core/config/types';\nimport { rememberCreatedProject, rememberDisplayName } from '../../core/config/use-hosted-session';\nimport { cn } from '../lib/utils';\nimport { Alert, AlertDescription } from '../primitives/alert';\nimport { Button } from '../primitives/button';\nimport { Input } from '../primitives/input';\nimport { Label } from '../primitives/label';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../primitives/select';\nimport { Switch } from '../primitives/switch';\nimport { Textarea } from '../primitives/textarea';\n\ntype Step = 'you' | 'project' | 'start';\ntype StartKind = ProjectStart['kind'];\n\n/**\n * Hosted mode: create a project in at most three short steps. Your name (only\n * when the account has none, e.g. an email sign-up), the project name, and how\n * to start: the commerce starter (schema plus an optional sample store), a\n * description the agent turns into a schema, or an empty project. The project\n * then opens in its AI chat.\n */\nexport function NewProjectFlow({\n askForName = false,\n isFirstProject = false,\n onCancel,\n onCreated,\n teams,\n}: {\n /** Ask for the user's own name first. */\n askForName?: boolean;\n /**\n * The user has no project yet, so the Studio shows this at `/`. Leave `/`\n * before the session lists the project: there, `/` redirects to the project\n * root instead of its AI chat.\n */\n isFirstProject?: boolean;\n onCancel?: () => void;\n /** Called with the new project's id once the Studio opened it. */\n onCreated?: (projectId: string) => void;\n teams: HostedTeam[];\n}): JSX.Element {\n const navigate = useNavigate();\n const ids = { you: useId(), name: useId(), team: useId(), description: useId(), sample: useId() };\n const owned = ownedTeams(teams);\n const [step, setStep] = useState<Step>(askForName ? 'you' : 'project');\n const [displayName, setDisplayName] = useState('');\n const [name, setName] = useState('');\n const [pickedTeamId, setPickedTeamId] = useState<string | null>(null);\n // Follow the teams prop: a pick that is no longer owned falls back to the first owned team.\n const selectedTeamId = owned.some((team) => team.id === pickedTeamId) ? (pickedTeamId ?? '') : (owned[0]?.id ?? '');\n const [startKind, setStartKind] = useState<StartKind>('starter');\n const [sampleData, setSampleData] = useState(true);\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Set once the project exists, so a failed starter is retried on it instead of creating another project.\n const [created, setCreated] = useState<Extract<CreateProjectOutcome, { ok: true }> | null>(null);\n\n async function submitName(): Promise<void> {\n const trimmed = displayName.trim();\n\n if (!trimmed) {\n setError('Tell us your name.');\n\n return;\n }\n\n setError(null);\n setIsSubmitting(true);\n\n const outcome = await saveDisplayName(trimmed);\n\n setIsSubmitting(false);\n\n if (!outcome.ok) {\n setError(outcome.message);\n\n return;\n }\n\n await rememberDisplayName(trimmed);\n setStep('project');\n }\n\n function submitProjectName(): void {\n const invalid = validateProjectName(name);\n\n setError(invalid);\n\n if (!invalid) {\n setStep('start');\n }\n }\n\n async function createProject(): Promise<void> {\n if (startKind === 'describe' && !description.trim()) {\n setError('Describe your business in a sentence or two, or pick another way to start.');\n\n return;\n }\n\n setError(null);\n setIsSubmitting(true);\n\n // No owned team yet: let the backend create the personal team.\n const outcome =\n created ??\n (await createHostedProject({\n name: name.trim(),\n ...(selectedTeamId ? { teamId: selectedTeamId } : {}),\n }));\n\n if (!outcome.ok) {\n setError(outcome.message);\n setIsSubmitting(false);\n\n if (outcome.code === 'invalid_name') {\n setStep('project');\n }\n\n return;\n }\n\n setCreated(outcome);\n\n const projectId = outcome.project.id;\n const start = toProjectStart(startKind, sampleData, description);\n let state: OnboardingNavigationState = {};\n\n if (start.kind === 'starter') {\n const applied = await applyStarter(projectId, { template: start.template, sampleData: start.sampleData });\n\n if (!applied.ok) {\n setError(`${outcome.project.name} was created, but the starter could not be applied: ${applied.message}`);\n setIsSubmitting(false);\n\n // List it now, so closing the dialog does not hide the project until a reload. The welcome screen\n // (first project) would leave this flow once the session lists a project, so it waits for Continue.\n if (!isFirstProject && !created) {\n await rememberCreatedProject(outcome);\n }\n\n return;\n }\n\n watchStarter({ projectId });\n } else if (start.kind === 'describe') {\n state = { onboardingPrompt: describeBusinessPrompt(start.description) };\n }\n\n const path = newProjectPath(projectId);\n\n // Inside a project the Studio only opens ids the session lists, so add it first there.\n if (isFirstProject) {\n navigate(path, { state });\n await rememberCreatedProject(outcome);\n } else {\n await rememberCreatedProject(outcome);\n navigate(path, { state });\n }\n\n onCreated?.(projectId);\n }\n\n const errorAlert = error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null;\n\n if (step === 'you') {\n return (\n <StepForm onSubmit={() => void submitName()}>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={ids.you}>Your name</Label>\n <Input\n autoComplete=\"name\"\n autoFocus\n disabled={isSubmitting}\n id={ids.you}\n maxLength={80}\n onChange={(event) => {\n setDisplayName(event.target.value);\n }}\n placeholder=\"e.g. Ann Meyer\"\n value={displayName}\n />\n <p className=\"fk:text-xs fk:text-muted-foreground\">Your teammates see it on changes and comments.</p>\n </div>\n {errorAlert}\n <StepActions isSubmitting={isSubmitting} submitLabel=\"Continue\" />\n </StepForm>\n );\n }\n\n if (step === 'project') {\n return (\n <StepForm onSubmit={submitProjectName}>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={ids.name}>Project name</Label>\n <Input\n aria-invalid={error ? true : undefined}\n autoComplete=\"off\"\n autoFocus\n id={ids.name}\n maxLength={48}\n onChange={(event) => {\n setName(event.target.value);\n }}\n placeholder=\"e.g. Aven Living\"\n value={name}\n />\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Usually your store or company name. You can change it later.\n </p>\n </div>\n {owned.length > 1 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={ids.team}>Team</Label>\n <Select onValueChange={setPickedTeamId} value={selectedTeamId}>\n <SelectTrigger id={ids.team}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {owned.map((team) => (\n <SelectItem key={team.id} value={team.id}>\n {team.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n {errorAlert}\n <StepActions onCancel={onCancel} submitLabel=\"Continue\" />\n </StepForm>\n );\n }\n\n return (\n <StepForm onSubmit={() => void createProject()}>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <p className=\"fk:text-sm fk:font-medium\" id={`${ids.name}-start`}>\n How do you want to start?\n </p>\n <div aria-labelledby={`${ids.name}-start`} className=\"fk:flex fk:flex-col fk:gap-2\" role=\"radiogroup\">\n <StartOption\n checked={startKind === 'starter'}\n description=\"22 ready-made entities for catalog, inventory, orders, customers and marketing, with EU, UK and US markets.\"\n disabled={isSubmitting}\n icon={ShoppingBag}\n onSelect={() => {\n setStartKind('starter');\n }}\n recommended\n title=\"Commerce starter\"\n >\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-3 fk:pt-1\">\n <Label className=\"fk:text-xs fk:font-normal fk:text-muted-foreground\" htmlFor={ids.sample}>\n Add a sample store (Aven Living) to try things out\n </Label>\n <Switch checked={sampleData} disabled={isSubmitting} id={ids.sample} onCheckedChange={setSampleData} />\n </div>\n </StartOption>\n <StartOption\n checked={startKind === 'describe'}\n description=\"Tell the agent what you sell and how you work; it proposes a schema for you to review.\"\n disabled={isSubmitting}\n icon={MessageSquareText}\n onSelect={() => {\n setStartKind('describe');\n }}\n title=\"Describe your business\"\n >\n <Textarea\n aria-label=\"Your business\"\n autoFocus\n disabled={isSubmitting}\n id={ids.description}\n maxLength={2000}\n onChange={(event) => {\n setDescription(event.target.value);\n }}\n placeholder=\"e.g. We sell handmade ceramics online and to 40 shops in Europe, with seasonal collections.\"\n rows={3}\n value={description}\n />\n </StartOption>\n <StartOption\n checked={startKind === 'empty'}\n description=\"Start with an empty project and build the schema in the chat.\"\n disabled={isSubmitting}\n icon={Sparkles}\n onSelect={() => {\n setStartKind('empty');\n }}\n title=\"Start from scratch\"\n />\n </div>\n </div>\n {errorAlert}\n <StepActions\n isSubmitting={isSubmitting}\n onBack={\n created\n ? undefined\n : () => {\n setError(null);\n setStep('project');\n }\n }\n submitLabel={created ? 'Continue' : 'Create project'}\n />\n </StepForm>\n );\n}\n\nfunction StepForm({ children, onSubmit }: { children: ReactNode; onSubmit: () => void }): JSX.Element {\n return (\n <form\n className=\"fk:flex fk:w-full fk:flex-col fk:gap-4\"\n onSubmit={(event) => {\n event.preventDefault();\n onSubmit();\n }}\n >\n {children}\n </form>\n );\n}\n\nfunction StepActions({\n isSubmitting = false,\n onBack,\n onCancel,\n submitLabel,\n}: {\n isSubmitting?: boolean;\n onBack?: () => void;\n onCancel?: () => void;\n submitLabel: string;\n}): JSX.Element {\n const secondary = onBack ?? onCancel;\n\n return (\n <div className=\"fk:flex fk:justify-end fk:gap-2\">\n {secondary ? (\n <Button disabled={isSubmitting} onClick={secondary} type=\"button\" variant=\"outline\">\n {onBack ? 'Back' : 'Cancel'}\n </Button>\n ) : null}\n <Button className={secondary ? undefined : 'fk:w-full'} disabled={isSubmitting} type=\"submit\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {submitLabel}\n </Button>\n </div>\n );\n}\n\nfunction StartOption({\n checked,\n children,\n description,\n disabled,\n icon: Icon,\n onSelect,\n recommended = false,\n title,\n}: {\n checked: boolean;\n children?: ReactNode;\n description: string;\n disabled: boolean;\n icon: LucideIcon;\n onSelect: () => void;\n recommended?: boolean;\n title: string;\n}): JSX.Element {\n return (\n <div\n className={cn(\n 'fk:rounded-lg fk:border fk:p-3 fk:transition-colors',\n checked\n ? 'fk:border-foreground/70 fk:bg-muted/50 fk:ring-1 fk:ring-foreground/20'\n : 'fk:border-border fk:hover:bg-muted/30'\n )}\n >\n <button\n aria-checked={checked}\n className=\"fk:flex fk:w-full fk:items-start fk:gap-3 fk:text-left fk:disabled:opacity-60\"\n disabled={disabled}\n onClick={onSelect}\n role=\"radio\"\n type=\"button\"\n >\n <Icon className=\"fk:mt-0.5 fk:h-4 fk:w-4 fk:shrink-0 fk:text-muted-foreground\" />\n <span className=\"fk:flex fk:flex-col fk:gap-0.5\">\n <span className=\"fk:flex fk:items-center fk:gap-2 fk:text-sm fk:font-medium\">\n {title}\n {recommended ? (\n <span className=\"fk:rounded-full fk:bg-primary/10 fk:px-2 fk:py-0.5 fk:text-[11px] fk:font-medium fk:text-primary\">\n Recommended\n </span>\n ) : null}\n </span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">{description}</span>\n </span>\n </button>\n {checked && children ? <div className=\"fk:mt-2 fk:pl-7\">{children}</div> : null}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/components/project-label.ts","../src/core/config/create-project.ts","../src/core/config/use-hosted-session.ts","../src/ui/components/new-project-flow.tsx"],"names":["getProjectLabel","projectId","projects","projectSummaries","project","groupProjectIdsByTeam","projectIds","teams","id","summary","key","group","FALLBACK_MESSAGE","createHostedProject","input","outcome","send","userApiPaths","ownedTeams","team","newProjectPath","SESSION_KEY","fetchMe","response","error","toHostedSession","useHostedSession","data","useSWR","withCreatedProject","created","rememberCreatedProject","mutate","current","withDisplayName","displayName","rememberDisplayName","NewProjectFlow","askForName","isFirstProject","onCancel","onCreated","navigate","useNavigate","ids","useId","owned","step","setStep","useState","setDisplayName","name","setName","pickedTeamId","setPickedTeamId","selectedTeamId","startKind","setStartKind","sampleData","setSampleData","description","setDescription","setError","isSubmitting","setIsSubmitting","setCreated","submitName","trimmed","saveDisplayName","submitProjectName","invalid","validateProjectName","createProject","start","toProjectStart","state","applied","applyStarter","watchStarter","describeBusinessPrompt","path","errorAlert","jsx","Alert","AlertDescription","jsxs","StepForm","Label","Input","event","StepActions","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","StartOption","ShoppingBag","Switch","MessageSquareText","Textarea","Sparkles","children","onSubmit","onBack","submitLabel","secondary","Button","Loader2","checked","disabled","Icon","onSelect","recommended","title","cn"],"mappings":"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","file":"chunk-LXLEUEWT.js","sourcesContent":["import type { ProjectSummary, ProjectUiConfig } from '../../core/config/types';\n\n/** Name of a project: the listed name, else the deployed schema title, else the id. */\nexport function getProjectLabel(\n projectId: string,\n projects: ProjectUiConfig[],\n projectSummaries: ProjectSummary[] = []\n): string {\n return (\n projectSummaries.find((project) => project.id === projectId)?.name ??\n projects.find((project) => project.projectId === projectId)?.title ??\n projectId\n );\n}\n\n/** Groups ids by team when the summaries span more than one team; otherwise a single unnamed group. */\nexport function groupProjectIdsByTeam(\n projectIds: string[],\n projectSummaries: ProjectSummary[]\n): { label: string | null; projectIds: string[] }[] {\n const teams = new Map<string, { label: string; projectIds: string[] }>();\n\n for (const id of projectIds) {\n const summary = projectSummaries.find((project) => project.id === id);\n const key = summary?.team.id ?? '';\n const group = teams.get(key) ?? { label: summary?.team.name ?? '', projectIds: [] };\n group.projectIds.push(id);\n teams.set(key, group);\n }\n\n if (teams.size <= 1) {\n return [{ label: null, projectIds }];\n }\n\n return [...teams.values()].map((group) => ({ label: group.label || null, projectIds: group.projectIds }));\n}\n","import { userApiPaths } from '../api-paths';\nimport { send } from './onboarding';\nimport type { HostedTeam } from './types';\n\n/** What `POST /api/me/projects` answers: the new project and the team it went to (possibly a new personal team). */\nexport type CreatedProject = { project: { id: string; name: string }; team: { id: string; name: string } };\n\nexport type CreateProjectOutcome = ({ ok: true } & CreatedProject) | { ok: false; code: string; message: string };\n\nconst FALLBACK_MESSAGE = 'Could not create the project. Please try again.';\n\n/** Hosted mode: creates a project for the signed-in user (Free plan, user as owner). */\nexport async function createHostedProject(input: { name: string; teamId?: string }): Promise<CreateProjectOutcome> {\n const outcome = await send<Partial<CreatedProject>>(userApiPaths.myProjects, 'POST', input, FALLBACK_MESSAGE);\n\n if (!outcome.ok) {\n return outcome;\n }\n\n if (!outcome.project?.id || !outcome.team?.id) {\n return { ok: false, code: 'unknown_error', message: FALLBACK_MESSAGE };\n }\n\n return { ok: true, project: outcome.project, team: outcome.team };\n}\n\n/** Teams the user may create projects in, in the order `/api/me` lists them (oldest first). */\nexport function ownedTeams(teams: HostedTeam[]): HostedTeam[] {\n return teams.filter((team) => team.role === 'owner');\n}\n\n/**\n * Where a new project opens: the AI chat, which can design its schema. The\n * chat route itself, not `/ai`: that redirect would drop the navigation state\n * carrying the onboarding prompt.\n */\nexport function newProjectPath(projectId: string): string {\n return `/${projectId}/ai/agent`;\n}\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { userApiPaths } from '../api-paths';\nimport type { CreatedProject } from './create-project';\nimport type { HostedTeam, HostedUser, ProjectSummary } from './types';\n\nexport type HostedSession =\n | { status: 'loading' }\n | { status: 'anonymous' }\n | { status: 'error'; message: string }\n | { status: 'ready'; user: HostedUser; projects: ProjectSummary[]; teams: HostedTeam[] };\n\n/** `teams` is missing from backends older than Studio onboarding. */\ntype MeResponse = { projects: ProjectSummary[]; teams?: HostedTeam[]; user: HostedUser };\n\nconst SESSION_KEY = 'hosted-session';\nexport type MeOutcome =\n | { kind: 'anonymous' }\n | { kind: 'error'; message: string }\n | { kind: 'ready'; data: MeResponse };\n\nasync function fetchMe(): Promise<MeOutcome> {\n try {\n const response = await fetch(userApiPaths.me, { credentials: 'same-origin' });\n\n if (response.status === 401) {\n return { kind: 'anonymous' };\n }\n\n if (!response.ok) {\n return { kind: 'error', message: `Flexkit answered ${String(response.status)} while loading your projects.` };\n }\n\n return { kind: 'ready', data: (await response.json()) as MeResponse };\n } catch (error) {\n return { kind: 'error', message: error instanceof Error ? error.message : 'Flexkit is not reachable.' };\n }\n}\n\nexport function toHostedSession(outcome: MeOutcome | undefined): HostedSession {\n if (!outcome) {\n return { status: 'loading' };\n }\n\n if (outcome.kind === 'anonymous') {\n return { status: 'anonymous' };\n }\n\n if (outcome.kind === 'error') {\n return { status: 'error', message: outcome.message };\n }\n\n return {\n status: 'ready',\n projects: outcome.data.projects,\n teams: outcome.data.teams ?? [],\n user: outcome.data.user,\n };\n}\n\n/**\n * Hosted mode: who is signed in and which projects they can open. Fetched once\n * per page load; `rememberCreatedProject` adds a project the user just created.\n */\nexport function useHostedSession(): HostedSession {\n const { data } = useSWR(SESSION_KEY, fetchMe, {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n shouldRetryOnError: false,\n });\n\n return toHostedSession(data);\n}\n\n/** The session with a just-created project (and its team, if new) added; the user owns both. */\nexport function withCreatedProject(outcome: MeOutcome | undefined, created: CreatedProject): MeOutcome | undefined {\n if (outcome?.kind !== 'ready' || outcome.data.projects.some((project) => project.id === created.project.id)) {\n return outcome;\n }\n\n const teams = outcome.data.teams ?? [];\n const project: ProjectSummary = {\n avatarUrl: null,\n id: created.project.id,\n name: created.project.name,\n readOnly: false,\n role: 'owner',\n suspended: false,\n team: created.team,\n };\n\n return {\n kind: 'ready',\n data: {\n ...outcome.data,\n projects: [...outcome.data.projects, project],\n teams: teams.some((team) => team.id === created.team.id) ? teams : [...teams, { ...created.team, role: 'owner' }],\n },\n };\n}\n\n/**\n * Adds a project the user just created to the session, so the Studio can open\n * it at once. No `/api/me` round trip: the create response says everything the\n * session needs, and a failed re-read must not hide a project that exists.\n */\nexport async function rememberCreatedProject(created: CreatedProject): Promise<void> {\n await mutate<MeOutcome>(SESSION_KEY, (current) => withCreatedProject(current, created), { revalidate: false });\n}\n\n/** The session with the signed-in user's new display name. */\nexport function withDisplayName(outcome: MeOutcome | undefined, displayName: string): MeOutcome | undefined {\n if (outcome?.kind !== 'ready') {\n return outcome;\n }\n\n return { kind: 'ready', data: { ...outcome.data, user: { ...outcome.data.user, displayName } } };\n}\n\n/** Shows a display name the user just saved, without re-reading `/api/me`. */\nexport async function rememberDisplayName(displayName: string): Promise<void> {\n await mutate<MeOutcome>(SESSION_KEY, (current) => withDisplayName(current, displayName), { revalidate: false });\n}\n","import { useId, useState, type JSX, type ReactNode } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Loader2, MessageSquareText, ShoppingBag, Sparkles, type LucideIcon } from 'lucide-react';\nimport { watchStarter } from '../../apps/ai/starter-watch';\nimport {\n createHostedProject,\n newProjectPath,\n ownedTeams,\n type CreateProjectOutcome,\n} from '../../core/config/create-project';\nimport {\n applyStarter,\n describeBusinessPrompt,\n saveDisplayName,\n toProjectStart,\n validateProjectName,\n type OnboardingNavigationState,\n type ProjectStart,\n} from '../../core/config/onboarding';\nimport type { HostedTeam } from '../../core/config/types';\nimport { rememberCreatedProject, rememberDisplayName } from '../../core/config/use-hosted-session';\nimport { cn } from '../lib/utils';\nimport { Alert, AlertDescription } from '../primitives/alert';\nimport { Button } from '../primitives/button';\nimport { Input } from '../primitives/input';\nimport { Label } from '../primitives/label';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../primitives/select';\nimport { Switch } from '../primitives/switch';\nimport { Textarea } from '../primitives/textarea';\n\ntype Step = 'you' | 'project' | 'start';\ntype StartKind = ProjectStart['kind'];\n\n/**\n * Hosted mode: create a project in at most three short steps. Your name (only\n * when the account has none, e.g. an email sign-up), the project name, and how\n * to start: the commerce starter (schema plus an optional sample store), a\n * description the agent turns into a schema, or an empty project. The project\n * then opens in its AI chat.\n */\nexport function NewProjectFlow({\n askForName = false,\n isFirstProject = false,\n onCancel,\n onCreated,\n teams,\n}: {\n /** Ask for the user's own name first. */\n askForName?: boolean;\n /**\n * The user has no project yet, so the Studio shows this at `/`. Leave `/`\n * before the session lists the project: there, `/` redirects to the project\n * root instead of its AI chat.\n */\n isFirstProject?: boolean;\n onCancel?: () => void;\n /** Called with the new project's id once the Studio opened it. */\n onCreated?: (projectId: string) => void;\n teams: HostedTeam[];\n}): JSX.Element {\n const navigate = useNavigate();\n const ids = { you: useId(), name: useId(), team: useId(), description: useId(), sample: useId() };\n const owned = ownedTeams(teams);\n const [step, setStep] = useState<Step>(askForName ? 'you' : 'project');\n const [displayName, setDisplayName] = useState('');\n const [name, setName] = useState('');\n const [pickedTeamId, setPickedTeamId] = useState<string | null>(null);\n // Follow the teams prop: a pick that is no longer owned falls back to the first owned team.\n const selectedTeamId = owned.some((team) => team.id === pickedTeamId) ? (pickedTeamId ?? '') : (owned[0]?.id ?? '');\n const [startKind, setStartKind] = useState<StartKind>('starter');\n const [sampleData, setSampleData] = useState(true);\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Set once the project exists, so a failed starter is retried on it instead of creating another project.\n const [created, setCreated] = useState<Extract<CreateProjectOutcome, { ok: true }> | null>(null);\n\n async function submitName(): Promise<void> {\n const trimmed = displayName.trim();\n\n if (!trimmed) {\n setError('Tell us your name.');\n\n return;\n }\n\n setError(null);\n setIsSubmitting(true);\n\n const outcome = await saveDisplayName(trimmed);\n\n setIsSubmitting(false);\n\n if (!outcome.ok) {\n setError(outcome.message);\n\n return;\n }\n\n await rememberDisplayName(trimmed);\n setStep('project');\n }\n\n function submitProjectName(): void {\n const invalid = validateProjectName(name);\n\n setError(invalid);\n\n if (!invalid) {\n setStep('start');\n }\n }\n\n async function createProject(): Promise<void> {\n if (startKind === 'describe' && !description.trim()) {\n setError('Describe your business in a sentence or two, or pick another way to start.');\n\n return;\n }\n\n setError(null);\n setIsSubmitting(true);\n\n // No owned team yet: let the backend create the personal team.\n const outcome =\n created ??\n (await createHostedProject({\n name: name.trim(),\n ...(selectedTeamId ? { teamId: selectedTeamId } : {}),\n }));\n\n if (!outcome.ok) {\n setError(outcome.message);\n setIsSubmitting(false);\n\n if (outcome.code === 'invalid_name') {\n setStep('project');\n }\n\n return;\n }\n\n setCreated(outcome);\n\n const projectId = outcome.project.id;\n const start = toProjectStart(startKind, sampleData, description);\n let state: OnboardingNavigationState = {};\n\n if (start.kind === 'starter') {\n const applied = await applyStarter(projectId, { template: start.template, sampleData: start.sampleData });\n\n if (!applied.ok) {\n setError(`${outcome.project.name} was created, but the starter could not be applied: ${applied.message}`);\n setIsSubmitting(false);\n\n // List it now, so closing the dialog does not hide the project until a reload. The welcome screen\n // (first project) would leave this flow once the session lists a project, so it waits for Continue.\n if (!isFirstProject && !created) {\n await rememberCreatedProject(outcome);\n }\n\n return;\n }\n\n watchStarter({ projectId });\n } else if (start.kind === 'describe') {\n state = { onboardingPrompt: describeBusinessPrompt(start.description) };\n }\n\n const path = newProjectPath(projectId);\n\n // Inside a project the Studio only opens ids the session lists, so add it first there.\n if (isFirstProject) {\n navigate(path, { state });\n await rememberCreatedProject(outcome);\n } else {\n await rememberCreatedProject(outcome);\n navigate(path, { state });\n }\n\n onCreated?.(projectId);\n }\n\n const errorAlert = error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null;\n\n if (step === 'you') {\n return (\n <StepForm onSubmit={() => void submitName()}>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={ids.you}>Your name</Label>\n <Input\n autoComplete=\"name\"\n autoFocus\n disabled={isSubmitting}\n id={ids.you}\n maxLength={80}\n onChange={(event) => {\n setDisplayName(event.target.value);\n }}\n placeholder=\"e.g. Ann Meyer\"\n value={displayName}\n />\n <p className=\"fk:text-xs fk:text-muted-foreground\">Your teammates see it on changes and comments.</p>\n </div>\n {errorAlert}\n <StepActions isSubmitting={isSubmitting} submitLabel=\"Continue\" />\n </StepForm>\n );\n }\n\n if (step === 'project') {\n return (\n <StepForm onSubmit={submitProjectName}>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={ids.name}>Project name</Label>\n <Input\n aria-invalid={error ? true : undefined}\n autoComplete=\"off\"\n autoFocus\n id={ids.name}\n maxLength={48}\n onChange={(event) => {\n setName(event.target.value);\n }}\n placeholder=\"e.g. Aven Living\"\n value={name}\n />\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Usually your store or company name. You can change it later.\n </p>\n </div>\n {owned.length > 1 ? (\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Label htmlFor={ids.team}>Team</Label>\n <Select onValueChange={setPickedTeamId} value={selectedTeamId}>\n <SelectTrigger id={ids.team}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {owned.map((team) => (\n <SelectItem key={team.id} value={team.id}>\n {team.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n {errorAlert}\n <StepActions onCancel={onCancel} submitLabel=\"Continue\" />\n </StepForm>\n );\n }\n\n return (\n <StepForm onSubmit={() => void createProject()}>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <p className=\"fk:text-sm fk:font-medium\" id={`${ids.name}-start`}>\n How do you want to start?\n </p>\n <div aria-labelledby={`${ids.name}-start`} className=\"fk:flex fk:flex-col fk:gap-2\" role=\"radiogroup\">\n <StartOption\n checked={startKind === 'starter'}\n description=\"22 ready-made entities for catalog, inventory, orders, customers and marketing, with EU, UK and US markets.\"\n disabled={isSubmitting}\n icon={ShoppingBag}\n onSelect={() => {\n setStartKind('starter');\n }}\n recommended\n title=\"Commerce starter\"\n >\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-3 fk:pt-1\">\n <Label className=\"fk:text-xs fk:font-normal fk:text-muted-foreground\" htmlFor={ids.sample}>\n Add a sample store (Aven Living) to try things out\n </Label>\n <Switch checked={sampleData} disabled={isSubmitting} id={ids.sample} onCheckedChange={setSampleData} />\n </div>\n </StartOption>\n <StartOption\n checked={startKind === 'describe'}\n description=\"Tell the agent what you sell and how you work; it proposes a schema for you to review.\"\n disabled={isSubmitting}\n icon={MessageSquareText}\n onSelect={() => {\n setStartKind('describe');\n }}\n title=\"Describe your business\"\n >\n <Textarea\n aria-label=\"Your business\"\n autoFocus\n disabled={isSubmitting}\n id={ids.description}\n maxLength={2000}\n onChange={(event) => {\n setDescription(event.target.value);\n }}\n placeholder=\"e.g. We sell handmade ceramics online and to 40 shops in Europe, with seasonal collections.\"\n rows={3}\n value={description}\n />\n </StartOption>\n <StartOption\n checked={startKind === 'empty'}\n description=\"Start with an empty project and build the schema in the chat.\"\n disabled={isSubmitting}\n icon={Sparkles}\n onSelect={() => {\n setStartKind('empty');\n }}\n title=\"Start from scratch\"\n />\n </div>\n </div>\n {errorAlert}\n <StepActions\n isSubmitting={isSubmitting}\n onBack={\n created\n ? undefined\n : () => {\n setError(null);\n setStep('project');\n }\n }\n submitLabel={created ? 'Continue' : 'Create project'}\n />\n </StepForm>\n );\n}\n\nfunction StepForm({ children, onSubmit }: { children: ReactNode; onSubmit: () => void }): JSX.Element {\n return (\n <form\n className=\"fk:flex fk:w-full fk:flex-col fk:gap-4\"\n onSubmit={(event) => {\n event.preventDefault();\n onSubmit();\n }}\n >\n {children}\n </form>\n );\n}\n\nfunction StepActions({\n isSubmitting = false,\n onBack,\n onCancel,\n submitLabel,\n}: {\n isSubmitting?: boolean;\n onBack?: () => void;\n onCancel?: () => void;\n submitLabel: string;\n}): JSX.Element {\n const secondary = onBack ?? onCancel;\n\n return (\n <div className=\"fk:flex fk:justify-end fk:gap-2\">\n {secondary ? (\n <Button disabled={isSubmitting} onClick={secondary} type=\"button\" variant=\"outline\">\n {onBack ? 'Back' : 'Cancel'}\n </Button>\n ) : null}\n <Button className={secondary ? undefined : 'fk:w-full'} disabled={isSubmitting} type=\"submit\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {submitLabel}\n </Button>\n </div>\n );\n}\n\nfunction StartOption({\n checked,\n children,\n description,\n disabled,\n icon: Icon,\n onSelect,\n recommended = false,\n title,\n}: {\n checked: boolean;\n children?: ReactNode;\n description: string;\n disabled: boolean;\n icon: LucideIcon;\n onSelect: () => void;\n recommended?: boolean;\n title: string;\n}): JSX.Element {\n return (\n <div\n className={cn(\n 'fk:rounded-lg fk:border fk:p-3 fk:transition-colors',\n checked\n ? 'fk:border-foreground/70 fk:bg-muted/50 fk:ring-1 fk:ring-foreground/20'\n : 'fk:border-border fk:hover:bg-muted/30'\n )}\n >\n <button\n aria-checked={checked}\n className=\"fk:flex fk:w-full fk:items-start fk:gap-3 fk:text-left fk:disabled:opacity-60\"\n disabled={disabled}\n onClick={onSelect}\n role=\"radio\"\n type=\"button\"\n >\n <Icon className=\"fk:mt-0.5 fk:h-4 fk:w-4 fk:shrink-0 fk:text-muted-foreground\" />\n <span className=\"fk:flex fk:flex-col fk:gap-0.5\">\n <span className=\"fk:flex fk:items-center fk:gap-2 fk:text-sm fk:font-medium\">\n {title}\n {recommended ? (\n <span className=\"fk:rounded-full fk:bg-primary/10 fk:px-2 fk:py-0.5 fk:text-[11px] fk:font-medium fk:text-primary\">\n Recommended\n </span>\n ) : null}\n </span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">{description}</span>\n </span>\n </button>\n {checked && children ? <div className=\"fk:mt-2 fk:pl-7\">{children}</div> : null}\n </div>\n );\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {c,e}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {c,e}from'./chunk-2PBDHGRR.js';import {b}from'./chunk-FJS4SN3K.js';import {f}from'./chunk-TWA6OG5U.js';import {d}from'./chunk-MBBE4RND.js';import {useMemo}from'react';import I from'swr';import {find,propEq}from'ramda';function $(n,o){let{scope:l}=c(),{currentProject:e$1}=f(),a=useMemo(()=>e$1?.schema??[],[e$1]),m=e$1?.scopes,u=e(m),t=o?.commonParams.q?JSON.stringify(o):null,{data:r,error:s,isLoading:y}=I(t,()=>fetch(d(n).search,{headers:{"Content-Type":"application/json"},body:JSON.stringify(o),method:"POST",mode:"cors"}).then(i=>i.json()),{keepPreviousData:true});return {results:useMemo(()=>t?O(r?.results??[],n,a,l,u)??[]:[],[r,u,n,a,l,t]),error:s,isLoading:y}}function O(n,o,l,e,a){return n?.filter(m=>m?.hits?.length>0).map(m=>{let u=m,t=u.collection.replace(`${o}_`,"").replace(/_\d+$/,""),r=find(propEq(t,"plural"))(l);if(!r)return [];let s=b(r)?.name??"",y=r?.name??t;return u.hits.map(({document:c})=>{let i=c[s],N=(i&&typeof i!="string"?i[e]??i[a]:null)??c[s],_=Object.entries(c).reduce((h,[p,f])=>{if(p!==s&&p!=="id"&&p!=="_updatedAt"){let A=typeof f!="string"?f[e]??f[a]:f;h[p]=A;}return h},{});return {_id:c.id,_entityName:y,_entityNamePlural:t,[s]:N,..._}})}).flat()}export{$ as a};//# sourceMappingURL=chunk-MHEFVYKP.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-MHEFVYKP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/use-search.tsx"],"names":["useSearch","projectId","searchRequest","scope","useAppContext","currentProject","useConfig","schema","useMemo","scopes","defaultScope","defaultScopeName","swrKey","data","error","isLoading","useSWR","apiPaths","res","mapResults","results","result","item","entityNamePlural","entitySchema","find","propEq","primaryAttributeName","getDisplayAttribute","entityName","document","primaryAttribute","primaryAttributeValue","attributes","acc","key","value","scopedValue"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/core/use-search.tsx"],"names":["useSearch","projectId","searchRequest","scope","useAppContext","currentProject","useConfig","schema","useMemo","scopes","defaultScope","defaultScopeName","swrKey","data","error","isLoading","useSWR","apiPaths","res","mapResults","results","result","item","entityNamePlural","entitySchema","find","propEq","primaryAttributeName","getDisplayAttribute","entityName","document","primaryAttribute","primaryAttributeValue","attributes","acc","key","value","scopedValue"],"mappings":"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","file":"chunk-MHEFVYKP.js","sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { defaultScopeName } from './default-scope';\nimport useSWR from 'swr';\nimport { find, propEq } from 'ramda';\nimport { apiPaths } from './api-paths';\nimport { useAppContext } from './app-context';\nimport { useConfig } from './config/config-context';\nimport { getDisplayAttribute } from './get-display-attribute';\nimport type { Entity, RawResultItem, RawSearchResultItems, SearchRequestProps, SearchResultItem } from './types';\n\nexport function useSearch(\n projectId: string,\n searchRequest: SearchRequestProps | null\n): { results: SearchResultItem[] | []; error: Error; isLoading: boolean } {\n const { scope } = useAppContext();\n const { currentProject } = useConfig();\n const schema = useMemo(() => currentProject?.schema ?? [], [currentProject]);\n const scopes = currentProject?.scopes;\n const defaultScope = defaultScopeName(scopes);\n const swrKey = searchRequest?.commonParams.q ? JSON.stringify(searchRequest) : null;\n const { data, error, isLoading } = useSWR(\n swrKey,\n () =>\n fetch(apiPaths(projectId).search, {\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(searchRequest),\n method: 'POST',\n mode: 'cors',\n }).then((res) => res.json() as Promise<{ results: RawSearchResultItems }>),\n // Show the previous hits until the next request lands instead of flashing an empty list per keystroke.\n { keepPreviousData: true }\n );\n const results = useMemo(\n // SWR keeps the previous key's data while a new key loads, and also after the key becomes null.\n // Callers treat an empty query as \"no search\", so return no hits once there is nothing to search for.\n () => (swrKey ? (mapResults(data?.results ?? [], projectId, schema, scope, defaultScope) ?? []) : []),\n [data, defaultScope, projectId, schema, scope, swrKey]\n );\n\n return { results, error, isLoading };\n}\n\nfunction mapResults(\n results: RawSearchResultItems | undefined,\n projectId: string,\n schema: Entity[],\n scope: string,\n defaultScope: string\n): SearchResultItem[] | undefined {\n return results\n ?.filter((result) => (result as RawResultItem)?.hits?.length > 0)\n .map((result) => {\n const item = result as RawResultItem;\n const entityNamePlural = item.collection.replace(`${projectId}_`, '').replace(/_\\d+$/, '');\n const entitySchema = find<Entity>(propEq(entityNamePlural, 'plural'))(schema);\n\n if (!entitySchema) {\n return [];\n }\n\n const primaryAttributeName = getDisplayAttribute(entitySchema)?.name ?? '';\n const entityName = entitySchema?.name ?? entityNamePlural;\n\n // iterate over the hits and return an object with the primary attribute value first and then the rest of the attributes.\n return item.hits.map(({ document }) => {\n const primaryAttribute = document[primaryAttributeName];\n const scopedPrimaryAttribute =\n primaryAttribute && typeof primaryAttribute !== 'string'\n ? (primaryAttribute[scope] ?? primaryAttribute[defaultScope])\n : null;\n const primaryAttributeValue = scopedPrimaryAttribute ?? document[primaryAttributeName];\n const attributes = Object.entries(document).reduce(\n (acc: Omit<SearchResultItem, '_id' | '_entityName' | '_entityNamePlural'>, [key, value]) => {\n if (key !== primaryAttributeName && key !== 'id' && key !== '_updatedAt') {\n const scopedValue = typeof value !== 'string' ? (value[scope] ?? value[defaultScope]) : value;\n\n acc[key] = scopedValue;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n _id: document.id,\n _entityName: entityName,\n _entityNamePlural: entityNamePlural,\n [primaryAttributeName]: primaryAttributeValue as string,\n ...attributes,\n };\n });\n })\n .flat();\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {e,c,b,a,g,h as h$1,m,k as k$2,n}from'./chunk-7N3LTSVX.js';import {e as e$3}from'./chunk-W7JDZHCV.js';import {b as b$2}from'./chunk-DSLPTDZX.js';import {j as j$1}from'./chunk-ZRTWLY77.js';import {c as c$4}from'./chunk-PZWEC6KD.js';import {t,s,u,q as q$2,v,k as k$1,i,o as o$1,r as r$1,p as p$2}from'./chunk-7KLXWCDS.js';import {s as s$3,b as b$5}from'./chunk-KEGJNZLW.js';import {f}from'./chunk-TI3EHLRE.js';import {ja,o,p as p$1,q as q$1,r,s as s$2,t as t$3,ma}from'./chunk-RULCANNM.js';import {t as t$1}from'./chunk-A4DPLZZF.js';import {b as b$4}from'./chunk-G5N6HEPW.js';import {b as b$1,c as c$3,e as e$2,f as f$1,g as g$1,h,j}from'./chunk-5JUG4BEF.js';import {k,p,q,s as s$1,t as t$2}from'./chunk-S7Z6KKIN.js';import {a as a$1,b as b$3,c as c$2,e as e$1}from'./chunk-N33S7BSG.js';import {c as c$1}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useDeferredValue}from'react';import {BookOpenTextIcon,PaperclipIcon,ChevronRightIcon,LayersIcon,XIcon,PlusIcon,Unlink2Icon,LoaderCircle,SearchIcon}from'lucide-react';import {Link}from'react-router-dom';import H from'swr';import Qe from'swr/infinite';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var Be=50;function fe({disabled:n,label:l,onClick:o}){return jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx(c$1,{"aria-label":l,className:"fk:size-7 fk:shrink-0",disabled:n,size:"icon",variant:"ghost",onClick:o,children:jsx(Unlink2Icon,{className:"fk:size-4"})})}),jsx(e$1,{children:l})]})}function Xe({api:n$1,attachedIds:l,onAttached:o,onOpenChange:a,open:s,projectId:u,target:r,targetLabel:c$1}){let[p$1,h]=useState(""),m$1=useDeferredValue(p$1.trim()),[y,f]=useState(null),b$1=(k,K)=>!s||K&&!K.hasMore?null:c(u).sources({limit:Be,offset:k*Be,search:m$1||void 0}),{data:v,error:w,isLoading:x,setSize:i$1,size:d}=Qe(b$1,b,{keepPreviousData:true}),g=useMemo(()=>r$1(v?.flatMap(k=>k.sources)??[],l),[l,v]),L=v?.[v.length-1]?.hasMore??false,C=v!==void 0&&d>v.length;async function A(k){f(k.id);try{let K=await n$1.linkSource(k.id,r);ma.success(K.linked?`Attached "${k.title}".`:`"${k.title}" was already attached.`),o(k),a(!1);}catch(K){ma.error(h$1(K,"The document could not be attached."));}finally{f(null);}}let R;return w?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):x&&!v?R=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-3 fk:py-2",children:[jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"})]}):g.length===0&&!L?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground",children:m$1?"No documents match your search.":"Every document is attached already, or there are none yet. Add documents in Knowledge first."}):R=jsxs("ul",{className:"fk:flex fk:max-h-80 fk:flex-col fk:overflow-y-auto fk:-mx-2",children:[g.map(k=>{let K=k$1(k),B=y===k.id;return jsx("li",{children:jsxs("button",{className:"fk:flex fk:w-full fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-2 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:disabled:opacity-60 fk:corner-squircle",disabled:y!==null,type:"button",onClick:()=>{A(k);},children:[jsx(m,{source:k}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:k.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(k)," \xB7 ",K.detail]})]}),B?jsx(LoaderCircle,{className:"fk:size-4 fk:shrink-0 fk:animate-spin fk:text-muted-foreground"}):jsx(k$2,{label:K.label,tone:K.tone})]})},k.id)}),L&&!C?jsx("li",{"aria-hidden":true,children:jsx(n,{onVisible:()=>{i$1(k=>k+1);}})}):null,C?jsx("li",{className:"fk:flex fk:justify-center fk:py-2",children:jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin fk:text-muted-foreground"})}):null]}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg",children:[jsxs(q,{children:[jsx(s$1,{children:"Attach a document"}),jsx(t$2,{children:r.recordId===void 0?`Documents attached to every ${c$1} are searched before the rest of Knowledge when a question is about one of them, or about ${c$1} in general.`:`Documents attached to ${c$1} are searched before the rest of Knowledge when a question is about it.`})]}),jsxs("div",{className:"fk:relative",children:[jsx(SearchIcon,{className:"fk:pointer-events-none fk:absolute fk:left-2.5 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground"}),jsx(b$4,{"aria-label":"Search documents",autoFocus:true,className:"fk:pl-8",placeholder:"Search documents by title",value:p$1,onChange:k=>h(k.target.value)})]}),R]})})}function re({projectId:n,renderAction:l,sources:o}){return jsx("ul",{className:"fk:flex fk:flex-col fk:gap-1 fk:-mx-2",children:o.map(a=>{let s=k$1(a);return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1.5 fk:corner-squircle",children:[jsxs(Link,{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-3 fk:rounded-md fk:hover:underline fk:underline-offset-2",to:o$1(n,a.id),children:[jsx(m,{source:a}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:a.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(a)," \xB7 ",s.detail]})]})]}),jsx(k$2,{label:s.label,tone:s.tone}),l?.(a)]},a.id)})})}function yt({entityName:n}){let{api:l,projectId:o}=e(),{currentProject:a$1}=f(),[s$1,u$1]=useState(false),r=t(a$1?.schema??[],n),c$2=!!r&&s(n),{data:p,error:h}=H(o&&c$2?c(o).entitySources(n):null,b);if(!l||!o||!r||!c$2||h instanceof a&&h.status===404)return null;let m=p?.sources.length??0;return jsxs(Fragment,{children:[jsxs(c$1,{"aria-label":`Knowledge for every ${u(r)}`,className:"fk:mr-2 fk:h-8","data-knowledge-entity-button":true,size:"sm",variant:"outline",onClick:()=>u$1(true),children:[jsx(BookOpenTextIcon,{}),"Knowledge",m>0?jsx(b$1,{className:"fk:corner-squircle",variant:"secondary",children:m}):null]}),jsx(Ue,{api:l,entityLabel:u(r),entityName:n,open:s$1,projectId:o,onOpenChange:u$1})]})}function Ue({api:n,entityLabel:l,entityName:o,onOpenChange:a,open:s,projectId:u}){let r=b$2(),[c$2,p$1]=useState(false),[h,m]=useState(null),{data:y,error:f,isLoading:b$3,mutate:v}=H(c(u).entitySources(o),b),w=y?.sources??[],x=useMemo(()=>({entity:o}),[o]);async function i(g$1){m(g$1.id);try{await n.unlinkSource(g$1.id,x),ma.success(`"${g$1.title}" no longer applies to every ${l}.`),await v({sources:w.filter(L=>L.id!==g$1.id)},{revalidate:!1}),g();}catch(L){ma.error(h$1(L,"The document could not be detached."));}finally{m(null);}}let d;return f?d=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):b$3&&!y?d=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):w.length===0?d=jsxs("p",{className:"fk:text-sm fk:text-muted-foreground",children:["No documents apply to every ",l," yet. Attach a guide, a policy or a spec that holds for all of them and the agent searches it first when asked about any ",l,", or about ",l," in general."]}):d=jsx(re,{projectId:u,sources:w,renderAction:g=>r?jsx(fe,{disabled:h!==null,label:`Detach ${g.title}`,onClick:()=>{i(g);}}):null}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg","data-knowledge-entity-dialog":true,children:[jsxs(q,{children:[jsxs(s$1,{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenTextIcon,{className:"fk:size-4 fk:text-muted-foreground"}),"Knowledge for every ",l,y?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:w.length}):null]}),jsxs(t$2,{children:["Documents attached here apply to every ",l,"; each record can hold its own on top."]})]}),jsx("div",{className:"fk:max-h-80 fk:overflow-y-auto",children:d}),jsx("div",{className:"fk:flex fk:justify-end",children:jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>p$1(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})})}),jsx(Xe,{api:n,attachedIds:w.map(g=>g.id),open:c$2,projectId:u,target:x,targetLabel:l,onAttached:g$1=>{v({sources:w.some(L=>L.id===g$1.id)?w:[...w,g$1]},{revalidate:false}),g();},onOpenChange:p$1})]})})}function bt({entityName:n,recordId:l,recordLabel:o$1}){let{api:a$2,projectId:s$1}=e(),{currentProject:u$1}=f(),r=b$2(),[c$2,p]=useState(false),[h,m]=useState(false),[y,f$1]=useState(null),b$3=useMemo(()=>({entity:n,recordId:l}),[n,l]),v=t(u$1?.schema??[],n),w=v?u(v):n,x=s(n),{data:i,error:d,isLoading:g$1,mutate:L}=H(s$1&&x?c(s$1).recordSources(b$3):null,b);if(!a$2||!s$1||!x||d instanceof a&&d.status===404)return null;let C=i?.sources??[],A=i?.inherited??[],R=C.map(N=>N.id),k=a$2;async function K(N){f$1(N.id);try{await k.unlinkSource(N.id,b$3),ma.success(`Detached "${N.title}".`),await L({sources:C.filter($=>$.id!==N.id),inherited:A},{revalidate:!1}),g();}catch($){ma.error(h$1($,"The document could not be detached."));}finally{f$1(null);}}let B;return d?B=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The attached documents could not be loaded."}):g$1&&!i?B=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):B=jsxs("div",{className:"fk:flex fk:flex-col fk:gap-4",children:[C.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:A.length>0?"No documents attached to this record itself; the ones below apply to every record of its type.":"No documents attached. Attach a manual, spec or contract and the agent will use it alongside the record's data when asked about this record."}):jsx(re,{projectId:s$1,sources:C,renderAction:N=>r?jsx(fe,{disabled:y!==null,label:`Detach ${N.title}`,onClick:()=>{K(N);}}):null}),A.length>0?jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1","data-knowledge-inherited":true,children:[jsxs("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:["Applies to every ",w]}),jsx(re,{projectId:s$1,sources:A})]}):null]}),jsx(a$1,{children:jsxs(o,{className:`fk:z-10 fk:flex fk:shrink-0 fk:flex-col fk:border-t fk:bg-background ${c$2?"fk:h-1/2":""}`,"data-knowledge-record-panel":true,open:c$2,onOpenChange:p,children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pl-4 fk:pr-10 fk:py-2",children:[jsx(p$1,{asChild:true,children:jsxs("button",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2 fk:rounded-md fk:py-1 fk:text-left fk:text-sm fk:font-semibold fk:tracking-tight fk:hover:text-foreground/80 fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring",type:"button",children:[jsx(ChevronRightIcon,{className:`fk:size-4 fk:shrink-0 fk:text-muted-foreground fk:transition-transform ${c$2?"fk:rotate-90":""}`}),jsx(BookOpenTextIcon,{className:"fk:size-4 fk:shrink-0 fk:text-muted-foreground"}),"Knowledge",i?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:C.length+A.length}):null]})}),c$2?jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>m(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})}):null]}),jsx(q$1,{className:"fk:min-h-0 fk:flex-1 fk:overflow-y-auto fk:px-10 fk:pb-6",children:B}),jsx(Xe,{api:a$2,attachedIds:R,open:h,projectId:s$1,target:b$3,targetLabel:o$1||`this ${n}`,onAttached:N=>{L({sources:C.some($=>$.id===N.id)?C:[...C,N],inherited:A.filter($=>$.id!==N.id)},{revalidate:false}),g();},onOpenChange:m})]})})}function Ze(n,l,o){let{scope:a}=c$4(),s=n.links.map(r=>r.recordId),{data:u}=e$3({entityNamePlural:n.entityPlural,schema:l,scope:a,selection:"display",includeCount:false,variables:{where:{_id:{in:s}},limit:s.length}});return useMemo(()=>{let r={};for(let c of u??[]){let p=c[o.name];typeof p=="string"&&p.trim()&&(r[c._id]=p);}return r},[u,o])}function Ye(n){let{currentProject:l}=f(),o=useMemo(()=>l?.schema??[],[l]),a=s$3(o,n.group.entityPlural),s=b$5(a);return !a||!s?jsx(Je,{...n,entityLabel:a?u(a):n.group.entityPlural,labels:{}}):jsx(et,{...n,displayAttribute:s,schema:o,entityLabel:u(a)})}function et({displayAttribute:n,entityLabel:l,schema:o,...a}){let s=Ze(a.group,o,n);return jsx(Je,{...a,entityLabel:l,labels:s})}function Je({canMutate:n,detachingKey:l,entityLabel:o,group:a,labels:s,onDetach:u}){let r=j$1();return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1",children:[jsx("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:o}),jsx("ul",{className:"fk:flex fk:flex-col fk:-mx-2",children:a.links.map(c=>{let p=p$2(c,s[c.recordId]),h=`${c.entity}:${c.recordId}`;return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1 fk:corner-squircle",children:[jsx("button",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-left fk:text-sm fk:hover:underline fk:underline-offset-2",title:c.recordId,type:"button",onClick:()=>r({type:"EditEntity",payload:{entityId:c.recordId,entityNamePlural:a.entityPlural}}),children:p}),n?jsx(fe,{disabled:l!==null,label:`Detach from ${p}`,onClick:()=>u(c)}):null]},h)})})]})}function vt({api:n,projectId:l,source:o}){let a=b$2(),[s,u$1]=useState(null),{data:r,error:c$1,isLoading:p,mutate:h}=H(c(l).links(o.id),b),m=useMemo(()=>r?.links??[],[r]),y=useMemo(()=>r?.entities??[],[r]),f=useMemo(()=>q$2(m),[m]);async function b$3(i){u$1(`${i.entity}:${i.recordId}`);try{await n.unlinkSource(o.id,{entity:i.entity,recordId:i.recordId}),ma.success("Detached."),await h({links:m.filter(d=>d.entity!==i.entity||d.recordId!==i.recordId),entities:y},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function v(i){u$1(`${i.entity}:*`);try{await n.unlinkSource(o.id,{entity:i.entity}),ma.success("Detached."),await h({links:m,entities:y.filter(d=>d.entity!==i.entity)},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function w(i){u$1(`${i.name}:+`);try{let d=await n.linkSource(o.id,{entity:i.name});ma.success(d.linked?`Applies to every ${u(i)} now.`:`Already applied to every ${u(i)}.`),await h({links:m,entities:y.some(g=>g.entity===i.name)?y:[...y,{entity:i.name,entityPlural:i.plural}]},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be attached."));}finally{u$1(null);}}let x;return c$1?x=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The linked records could not be loaded."}):p&&!r?x=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-6 fk:w-1/2"}),jsx(t$1,{className:"fk:h-6 fk:w-1/3"})]}):f.length===0?x=jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:'Not attached to any record. Open a record in the Desk and use "Attach document" so the agent searches this document before the rest of Knowledge when asked about that record.'}):x=jsx("div",{className:"fk:flex fk:flex-col fk:gap-4",children:f.map(i=>jsx(Ye,{canMutate:a,detachingKey:s,group:i,onDetach:d=>{b$3(d);}},i.entityPlural))}),jsxs(Fragment,{children:[jsx(tt,{busy:s!==null,canMutate:a,entities:y,isLoading:p&&!r,onAttach:i=>{w(i);},onDetach:i=>{v(i);}}),jsxs("div",{className:"fk:mt-2 fk:flex fk:items-center fk:gap-2",children:[jsx(PaperclipIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Linked records"}),m.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:m.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"When a question is about one of these records, the agent searches this document before the rest."}),x]})}function tt({busy:n,canMutate:l,entities:o,isLoading:a,onAttach:s,onDetach:u$1}){let{currentProject:r$1}=f(),c=useMemo(()=>r$1?.schema??[],[r$1]),[p,h$1]=useState(false),m=useMemo(()=>v(c,o),[o,c]),y=f=>{let b=t(c,f.entity);return b?u(b):f.entityPlural};return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3","data-knowledge-applies-to":true,children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(LayersIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Applies to"}),o.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:o.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Attach this document to a whole entity type and the agent searches it before the rest of Knowledge for every record of that type, and for questions about the type in general."}),a?jsx(t$1,{className:"fk:h-7 fk:w-1/3"}):jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[o.map(f=>{let b=y(f);return jsxs(b$1,{className:"fk:gap-1 fk:py-1 fk:pl-2.5 fk:pr-1 fk:corner-squircle",variant:"secondary",children:[jsx("span",{className:"fk:capitalize",children:b}),l?jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx("button",{"aria-label":`No longer apply to every ${b}`,className:"fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:hover:text-foreground fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring fk:disabled:opacity-50",disabled:n,type:"button",onClick:()=>u$1(f),children:jsx(XIcon,{className:"fk:size-3"})})}),jsxs(e$1,{children:["No longer apply to every ",b]})]}):null]},f.entity)}),jsxs(r,{open:p,onOpenChange:h$1,children:[jsx(ja,{disabled:!l,children:jsx(s$2,{asChild:true,children:jsxs(c$1,{className:"fk:h-7",disabled:!l||m.length===0,size:"sm",variant:"outline",children:[jsx(PlusIcon,{}),"Add entity type"]})})}),jsx(t$3,{align:"start",className:"fk:w-64 fk:p-0",children:jsxs(c$3,{children:[jsx(e$2,{placeholder:"Search entity types"}),jsxs(f$1,{children:[jsx(g$1,{children:"No entity type matches."}),jsx(h,{children:m.map(f=>jsx(j,{keywords:[u(f),f.name,f.plural],value:f.name,onSelect:()=>{h$1(false),s(f);},children:jsx("span",{className:"fk:capitalize",children:u(f)})},f.name))})]})]})})]})]})]})}export{yt as a,bt as b,vt as c};//# sourceMappingURL=chunk-Q4CWQHBJ.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {e,c,b,a,g,h as h$1,m,k as k$2,n}from'./chunk-VIBGMCLS.js';import {e as e$3}from'./chunk-FXUD4JRG.js';import {b as b$2}from'./chunk-DSLPTDZX.js';import {j as j$1}from'./chunk-474MQNDK.js';import {c as c$4}from'./chunk-2PBDHGRR.js';import {t,s,u,q as q$2,v,k as k$1,i,o as o$1,r as r$1,p as p$2}from'./chunk-7KLXWCDS.js';import {s as s$3,b as b$5}from'./chunk-FJS4SN3K.js';import {f}from'./chunk-TWA6OG5U.js';import {ja,o,p as p$1,q as q$1,r,s as s$2,t as t$3,ma}from'./chunk-RULCANNM.js';import {t as t$1}from'./chunk-A4DPLZZF.js';import {b as b$4}from'./chunk-G5N6HEPW.js';import {b as b$1,c as c$3,e as e$2,f as f$1,g as g$1,h,j}from'./chunk-5JUG4BEF.js';import {k,p,q,s as s$1,t as t$2}from'./chunk-S7Z6KKIN.js';import {a as a$1,b as b$3,c as c$2,e as e$1}from'./chunk-N33S7BSG.js';import {c as c$1}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useDeferredValue}from'react';import {BookOpenTextIcon,PaperclipIcon,ChevronRightIcon,LayersIcon,XIcon,PlusIcon,Unlink2Icon,LoaderCircle,SearchIcon}from'lucide-react';import {Link}from'react-router-dom';import H from'swr';import Qe from'swr/infinite';import {jsxs,Fragment,jsx}from'react/jsx-runtime';var Be=50;function fe({disabled:n,label:l,onClick:o}){return jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx(c$1,{"aria-label":l,className:"fk:size-7 fk:shrink-0",disabled:n,size:"icon",variant:"ghost",onClick:o,children:jsx(Unlink2Icon,{className:"fk:size-4"})})}),jsx(e$1,{children:l})]})}function Xe({api:n$1,attachedIds:l,onAttached:o,onOpenChange:a,open:s,projectId:u,target:r,targetLabel:c$1}){let[p$1,h]=useState(""),m$1=useDeferredValue(p$1.trim()),[y,f]=useState(null),b$1=(k,K)=>!s||K&&!K.hasMore?null:c(u).sources({limit:Be,offset:k*Be,search:m$1||void 0}),{data:v,error:w,isLoading:x,setSize:i$1,size:d}=Qe(b$1,b,{keepPreviousData:true}),g=useMemo(()=>r$1(v?.flatMap(k=>k.sources)??[],l),[l,v]),L=v?.[v.length-1]?.hasMore??false,C=v!==void 0&&d>v.length;async function A(k){f(k.id);try{let K=await n$1.linkSource(k.id,r);ma.success(K.linked?`Attached "${k.title}".`:`"${k.title}" was already attached.`),o(k),a(!1);}catch(K){ma.error(h$1(K,"The document could not be attached."));}finally{f(null);}}let R;return w?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):x&&!v?R=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-3 fk:py-2",children:[jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"}),jsx(t$1,{className:"fk:h-10 fk:w-full"})]}):g.length===0&&!L?R=jsx("p",{className:"fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground",children:m$1?"No documents match your search.":"Every document is attached already, or there are none yet. Add documents in Knowledge first."}):R=jsxs("ul",{className:"fk:flex fk:max-h-80 fk:flex-col fk:overflow-y-auto fk:-mx-2",children:[g.map(k=>{let K=k$1(k),B=y===k.id;return jsx("li",{children:jsxs("button",{className:"fk:flex fk:w-full fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-2 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:disabled:opacity-60 fk:corner-squircle",disabled:y!==null,type:"button",onClick:()=>{A(k);},children:[jsx(m,{source:k}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:k.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(k)," \xB7 ",K.detail]})]}),B?jsx(LoaderCircle,{className:"fk:size-4 fk:shrink-0 fk:animate-spin fk:text-muted-foreground"}):jsx(k$2,{label:K.label,tone:K.tone})]})},k.id)}),L&&!C?jsx("li",{"aria-hidden":true,children:jsx(n,{onVisible:()=>{i$1(k=>k+1);}})}):null,C?jsx("li",{className:"fk:flex fk:justify-center fk:py-2",children:jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin fk:text-muted-foreground"})}):null]}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg",children:[jsxs(q,{children:[jsx(s$1,{children:"Attach a document"}),jsx(t$2,{children:r.recordId===void 0?`Documents attached to every ${c$1} are searched before the rest of Knowledge when a question is about one of them, or about ${c$1} in general.`:`Documents attached to ${c$1} are searched before the rest of Knowledge when a question is about it.`})]}),jsxs("div",{className:"fk:relative",children:[jsx(SearchIcon,{className:"fk:pointer-events-none fk:absolute fk:left-2.5 fk:top-1/2 fk:size-4 fk:-translate-y-1/2 fk:text-muted-foreground"}),jsx(b$4,{"aria-label":"Search documents",autoFocus:true,className:"fk:pl-8",placeholder:"Search documents by title",value:p$1,onChange:k=>h(k.target.value)})]}),R]})})}function re({projectId:n,renderAction:l,sources:o}){return jsx("ul",{className:"fk:flex fk:flex-col fk:gap-1 fk:-mx-2",children:o.map(a=>{let s=k$1(a);return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1.5 fk:corner-squircle",children:[jsxs(Link,{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-3 fk:rounded-md fk:hover:underline fk:underline-offset-2",to:o$1(n,a.id),children:[jsx(m,{source:a}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:a.title}),jsxs("span",{className:"fk:block fk:truncate fk:text-xs fk:text-muted-foreground",children:[i(a)," \xB7 ",s.detail]})]})]}),jsx(k$2,{label:s.label,tone:s.tone}),l?.(a)]},a.id)})})}function yt({entityName:n}){let{api:l,projectId:o}=e(),{currentProject:a$1}=f(),[s$1,u$1]=useState(false),r=t(a$1?.schema??[],n),c$2=!!r&&s(n),{data:p,error:h}=H(o&&c$2?c(o).entitySources(n):null,b);if(!l||!o||!r||!c$2||h instanceof a&&h.status===404)return null;let m=p?.sources.length??0;return jsxs(Fragment,{children:[jsxs(c$1,{"aria-label":`Knowledge for every ${u(r)}`,className:"fk:mr-2 fk:h-8","data-knowledge-entity-button":true,size:"sm",variant:"outline",onClick:()=>u$1(true),children:[jsx(BookOpenTextIcon,{}),"Knowledge",m>0?jsx(b$1,{className:"fk:corner-squircle",variant:"secondary",children:m}):null]}),jsx(Ue,{api:l,entityLabel:u(r),entityName:n,open:s$1,projectId:o,onOpenChange:u$1})]})}function Ue({api:n,entityLabel:l,entityName:o,onOpenChange:a,open:s,projectId:u}){let r=b$2(),[c$2,p$1]=useState(false),[h,m]=useState(null),{data:y,error:f,isLoading:b$3,mutate:v}=H(c(u).entitySources(o),b),w=y?.sources??[],x=useMemo(()=>({entity:o}),[o]);async function i(g$1){m(g$1.id);try{await n.unlinkSource(g$1.id,x),ma.success(`"${g$1.title}" no longer applies to every ${l}.`),await v({sources:w.filter(L=>L.id!==g$1.id)},{revalidate:!1}),g();}catch(L){ma.error(h$1(L,"The document could not be detached."));}finally{m(null);}}let d;return f?d=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The documents could not be loaded."}):b$3&&!y?d=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):w.length===0?d=jsxs("p",{className:"fk:text-sm fk:text-muted-foreground",children:["No documents apply to every ",l," yet. Attach a guide, a policy or a spec that holds for all of them and the agent searches it first when asked about any ",l,", or about ",l," in general."]}):d=jsx(re,{projectId:u,sources:w,renderAction:g=>r?jsx(fe,{disabled:h!==null,label:`Detach ${g.title}`,onClick:()=>{i(g);}}):null}),jsx(k,{open:s,onOpenChange:a,children:jsxs(p,{className:"fk:sm:max-w-lg","data-knowledge-entity-dialog":true,children:[jsxs(q,{children:[jsxs(s$1,{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenTextIcon,{className:"fk:size-4 fk:text-muted-foreground"}),"Knowledge for every ",l,y?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:w.length}):null]}),jsxs(t$2,{children:["Documents attached here apply to every ",l,"; each record can hold its own on top."]})]}),jsx("div",{className:"fk:max-h-80 fk:overflow-y-auto",children:d}),jsx("div",{className:"fk:flex fk:justify-end",children:jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>p$1(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})})}),jsx(Xe,{api:n,attachedIds:w.map(g=>g.id),open:c$2,projectId:u,target:x,targetLabel:l,onAttached:g$1=>{v({sources:w.some(L=>L.id===g$1.id)?w:[...w,g$1]},{revalidate:false}),g();},onOpenChange:p$1})]})})}function bt({entityName:n,recordId:l,recordLabel:o$1}){let{api:a$2,projectId:s$1}=e(),{currentProject:u$1}=f(),r=b$2(),[c$2,p]=useState(false),[h,m]=useState(false),[y,f$1]=useState(null),b$3=useMemo(()=>({entity:n,recordId:l}),[n,l]),v=t(u$1?.schema??[],n),w=v?u(v):n,x=s(n),{data:i,error:d,isLoading:g$1,mutate:L}=H(s$1&&x?c(s$1).recordSources(b$3):null,b);if(!a$2||!s$1||!x||d instanceof a&&d.status===404)return null;let C=i?.sources??[],A=i?.inherited??[],R=C.map(N=>N.id),k=a$2;async function K(N){f$1(N.id);try{await k.unlinkSource(N.id,b$3),ma.success(`Detached "${N.title}".`),await L({sources:C.filter($=>$.id!==N.id),inherited:A},{revalidate:!1}),g();}catch($){ma.error(h$1($,"The document could not be detached."));}finally{f$1(null);}}let B;return d?B=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The attached documents could not be loaded."}):g$1&&!i?B=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-9 fk:w-full"}),jsx(t$1,{className:"fk:h-9 fk:w-2/3"})]}):B=jsxs("div",{className:"fk:flex fk:flex-col fk:gap-4",children:[C.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:A.length>0?"No documents attached to this record itself; the ones below apply to every record of its type.":"No documents attached. Attach a manual, spec or contract and the agent will use it alongside the record's data when asked about this record."}):jsx(re,{projectId:s$1,sources:C,renderAction:N=>r?jsx(fe,{disabled:y!==null,label:`Detach ${N.title}`,onClick:()=>{K(N);}}):null}),A.length>0?jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1","data-knowledge-inherited":true,children:[jsxs("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:["Applies to every ",w]}),jsx(re,{projectId:s$1,sources:A})]}):null]}),jsx(a$1,{children:jsxs(o,{className:`fk:z-10 fk:flex fk:shrink-0 fk:flex-col fk:border-t fk:bg-background ${c$2?"fk:h-1/2":""}`,"data-knowledge-record-panel":true,open:c$2,onOpenChange:p,children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pl-4 fk:pr-10 fk:py-2",children:[jsx(p$1,{asChild:true,children:jsxs("button",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2 fk:rounded-md fk:py-1 fk:text-left fk:text-sm fk:font-semibold fk:tracking-tight fk:hover:text-foreground/80 fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring",type:"button",children:[jsx(ChevronRightIcon,{className:`fk:size-4 fk:shrink-0 fk:text-muted-foreground fk:transition-transform ${c$2?"fk:rotate-90":""}`}),jsx(BookOpenTextIcon,{className:"fk:size-4 fk:shrink-0 fk:text-muted-foreground"}),"Knowledge",i?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:C.length+A.length}):null]})}),c$2?jsx(ja,{disabled:!r,children:jsxs(c$1,{disabled:!r,size:"sm",variant:"outline",onClick:()=>m(true),children:[jsx(PaperclipIcon,{}),"Attach document"]})}):null]}),jsx(q$1,{className:"fk:min-h-0 fk:flex-1 fk:overflow-y-auto fk:px-10 fk:pb-6",children:B}),jsx(Xe,{api:a$2,attachedIds:R,open:h,projectId:s$1,target:b$3,targetLabel:o$1||`this ${n}`,onAttached:N=>{L({sources:C.some($=>$.id===N.id)?C:[...C,N],inherited:A.filter($=>$.id!==N.id)},{revalidate:false}),g();},onOpenChange:m})]})})}function Ze(n,l,o){let{scope:a}=c$4(),s=n.links.map(r=>r.recordId),{data:u}=e$3({entityNamePlural:n.entityPlural,schema:l,scope:a,selection:"display",includeCount:false,variables:{where:{_id:{in:s}},limit:s.length}});return useMemo(()=>{let r={};for(let c of u??[]){let p=c[o.name];typeof p=="string"&&p.trim()&&(r[c._id]=p);}return r},[u,o])}function Ye(n){let{currentProject:l}=f(),o=useMemo(()=>l?.schema??[],[l]),a=s$3(o,n.group.entityPlural),s=b$5(a);return !a||!s?jsx(Je,{...n,entityLabel:a?u(a):n.group.entityPlural,labels:{}}):jsx(et,{...n,displayAttribute:s,schema:o,entityLabel:u(a)})}function et({displayAttribute:n,entityLabel:l,schema:o,...a}){let s=Ze(a.group,o,n);return jsx(Je,{...a,entityLabel:l,labels:s})}function Je({canMutate:n,detachingKey:l,entityLabel:o,group:a,labels:s,onDetach:u}){let r=j$1();return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1",children:[jsx("span",{className:"fk:text-xs fk:font-medium fk:uppercase fk:tracking-wide fk:text-muted-foreground",children:o}),jsx("ul",{className:"fk:flex fk:flex-col fk:-mx-2",children:a.links.map(c=>{let p=p$2(c,s[c.recordId]),h=`${c.entity}:${c.recordId}`;return jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2 fk:rounded-lg fk:px-2 fk:py-1 fk:corner-squircle",children:[jsx("button",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-left fk:text-sm fk:hover:underline fk:underline-offset-2",title:c.recordId,type:"button",onClick:()=>r({type:"EditEntity",payload:{entityId:c.recordId,entityNamePlural:a.entityPlural}}),children:p}),n?jsx(fe,{disabled:l!==null,label:`Detach from ${p}`,onClick:()=>u(c)}):null]},h)})})]})}function vt({api:n,projectId:l,source:o}){let a=b$2(),[s,u$1]=useState(null),{data:r,error:c$1,isLoading:p,mutate:h}=H(c(l).links(o.id),b),m=useMemo(()=>r?.links??[],[r]),y=useMemo(()=>r?.entities??[],[r]),f=useMemo(()=>q$2(m),[m]);async function b$3(i){u$1(`${i.entity}:${i.recordId}`);try{await n.unlinkSource(o.id,{entity:i.entity,recordId:i.recordId}),ma.success("Detached."),await h({links:m.filter(d=>d.entity!==i.entity||d.recordId!==i.recordId),entities:y},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function v(i){u$1(`${i.entity}:*`);try{await n.unlinkSource(o.id,{entity:i.entity}),ma.success("Detached."),await h({links:m,entities:y.filter(d=>d.entity!==i.entity)},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be detached."));}finally{u$1(null);}}async function w(i){u$1(`${i.name}:+`);try{let d=await n.linkSource(o.id,{entity:i.name});ma.success(d.linked?`Applies to every ${u(i)} now.`:`Already applied to every ${u(i)}.`),await h({links:m,entities:y.some(g=>g.entity===i.name)?y:[...y,{entity:i.name,entityPlural:i.plural}]},{revalidate:!1}),g();}catch(d){ma.error(h$1(d,"The document could not be attached."));}finally{u$1(null);}}let x;return c$1?x=jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The linked records could not be loaded."}):p&&!r?x=jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t$1,{className:"fk:h-6 fk:w-1/2"}),jsx(t$1,{className:"fk:h-6 fk:w-1/3"})]}):f.length===0?x=jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:'Not attached to any record. Open a record in the Desk and use "Attach document" so the agent searches this document before the rest of Knowledge when asked about that record.'}):x=jsx("div",{className:"fk:flex fk:flex-col fk:gap-4",children:f.map(i=>jsx(Ye,{canMutate:a,detachingKey:s,group:i,onDetach:d=>{b$3(d);}},i.entityPlural))}),jsxs(Fragment,{children:[jsx(tt,{busy:s!==null,canMutate:a,entities:y,isLoading:p&&!r,onAttach:i=>{w(i);},onDetach:i=>{v(i);}}),jsxs("div",{className:"fk:mt-2 fk:flex fk:items-center fk:gap-2",children:[jsx(PaperclipIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Linked records"}),m.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:m.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"When a question is about one of these records, the agent searches this document before the rest."}),x]})}function tt({busy:n,canMutate:l,entities:o,isLoading:a,onAttach:s,onDetach:u$1}){let{currentProject:r$1}=f(),c=useMemo(()=>r$1?.schema??[],[r$1]),[p,h$1]=useState(false),m=useMemo(()=>v(c,o),[o,c]),y=f=>{let b=t(c,f.entity);return b?u(b):f.entityPlural};return jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3","data-knowledge-applies-to":true,children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(LayersIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:"Applies to"}),o.length>0?jsx(b$1,{className:"fk:corner-squircle",variant:"outline",children:o.length}):null]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Attach this document to a whole entity type and the agent searches it before the rest of Knowledge for every record of that type, and for questions about the type in general."}),a?jsx(t$1,{className:"fk:h-7 fk:w-1/3"}):jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[o.map(f=>{let b=y(f);return jsxs(b$1,{className:"fk:gap-1 fk:py-1 fk:pl-2.5 fk:pr-1 fk:corner-squircle",variant:"secondary",children:[jsx("span",{className:"fk:capitalize",children:b}),l?jsxs(b$3,{children:[jsx(c$2,{asChild:true,children:jsx("button",{"aria-label":`No longer apply to every ${b}`,className:"fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:hover:text-foreground fk:focus-visible:outline-none fk:focus-visible:ring-2 fk:focus-visible:ring-ring fk:disabled:opacity-50",disabled:n,type:"button",onClick:()=>u$1(f),children:jsx(XIcon,{className:"fk:size-3"})})}),jsxs(e$1,{children:["No longer apply to every ",b]})]}):null]},f.entity)}),jsxs(r,{open:p,onOpenChange:h$1,children:[jsx(ja,{disabled:!l,children:jsx(s$2,{asChild:true,children:jsxs(c$1,{className:"fk:h-7",disabled:!l||m.length===0,size:"sm",variant:"outline",children:[jsx(PlusIcon,{}),"Add entity type"]})})}),jsx(t$3,{align:"start",className:"fk:w-64 fk:p-0",children:jsxs(c$3,{children:[jsx(e$2,{placeholder:"Search entity types"}),jsxs(f$1,{children:[jsx(g$1,{children:"No entity type matches."}),jsx(h,{children:m.map(f=>jsx(j,{keywords:[u(f),f.name,f.plural],value:f.name,onSelect:()=>{h$1(false),s(f);},children:jsx("span",{className:"fk:capitalize",children:u(f)})},f.name))})]})]})})]})]})]})}export{yt as a,bt as b,vt as c};//# sourceMappingURL=chunk-NKDQQHCL.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-NKDQQHCL.js.map
|